From 5a277479f8f835b8cb9b38e7ac934ebaa8be7590 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 10 Nov 2025 13:09:54 +0800 Subject: [PATCH 001/462] add env path From 45ea2843a0c9fe7192bc5a6874e8e187ca3280a4 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 10 Nov 2025 18:31:01 +0800 Subject: [PATCH 002/462] update readme --- README.md | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 5e940356..5b54f1e4 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,10 @@ AgentScope Tune, or **ASTune**, is an advanced agent training framework for tuni ## Installation -You can choose between `Trinity training backbone` and `Verl training backbone`. We recommend using `uv` to setup the dependencies and `conda` also works. +You can choose between `Trinity training backbone` and `Verl training backbone`. We recommend using `uv` to setup the dependencies, and `conda` can also do the job. -1. Trinity backbone (Option 1) +
+1. 🔧Trinity backbone: Click to read trinity backbone installation (Option 1) ```bash # Create virtual environment @@ -23,9 +24,11 @@ uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ -- # Install flash attention (must be installed last) uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation ``` +
+
+2. 🌟VERL Backbone: Click to read VERL backbone installation (Option 2) -2. VERL Backbone (Option 2) ```bash # Create virtual environment @@ -41,15 +44,23 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- # Install flash attention (must be installed last) uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation ``` +
+ + +
+3. 🔄Switch Verl/Trinity backbone: cannot install both backbone at the same time, run the following command to toggle. -注意:二者不能同时安装 ```bash # verl -> trinity cd external/verl && uv pip uninstall . && cd ../.. + # trinity -> verl uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no-deps ``` +
+
+
项目架构图
@@ -60,7 +71,7 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- 项目提供一个多功能launcher用于调试和训练,借助launcher,只需要修改一个`--backbone`参数,就选择任意训练框架启动训练 or 调试。 -1. 使用launcher进行全链路调试(--backbone='debug'):脱离trinity和verl,只与vllm(自动创建)连接,进行调试 +1. 使用launcher进行全链路调试(--backbone='debug'):脱离trinity和verl,只与vllm(自动创建)连接,进行调试: ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ @@ -70,10 +81,10 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- clear && \ python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --backbone='debug' --with-logview ``` -备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置见文档最后 + 备注:当`--backbone=debug`时,程序**不再使用ray**,这意味着您可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置见本文档最后。 -2. 使用launcher进行训练:使用trinity进行训练 +2. 使用launcher启动训练:使用trinity进行训练: ```bash # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ @@ -81,10 +92,10 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --with-ray --backbone='trinity' ``` -备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension) + 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension) -3. 使用launcher进行训练:使用verl进行训练 +3. 使用launcher启动训练:使用verl进行训练: ```bash # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ @@ -92,7 +103,7 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='verl' ``` -备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG4|TAG5|TAG6' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG4")` 即可。 + 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG4|TAG5|TAG6' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG4")` 即可。 # 简要架构 @@ -162,4 +173,18 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi }, ] } -``` \ No newline at end of file +``` + + +# Develop + +- [ ] 设计 Judge&Reward 系统 +- [ ] 小财场景 Demo +- [ ] 寻找更通用的 tool -> token 兼容方法 +- [ ] 设计 数据增广 系统 +- [ ] 设计 AgentScopeLearn Protocol V2.0 (以狼人杀为例) +- [ ] 集成 AgentScope Runtime +- [ ] Trinity Display Infer Progress, e.g. token per second +- [ ] Trinity: SFT support +- [ ] AgentScope Studio Intergration +- [ ] AgentScope \ No newline at end of file From 767d3559738ddffe853b31fd2a73ed3d2aa0aba5 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 11 Nov 2025 02:14:11 +0800 Subject: [PATCH 003/462] Merge branch 'fqx' --- README.md | 2 +- astune/backbone_trinity/register_flow.py | 2 +- astune/context_manager/cmt_agentscope.py | 107 +++++++++++++++++++---- astune/context_manager/cmt_base_attr.py | 9 +- astune/context_manager/cmt_linear.py | 6 +- astune/main_vllm.py | 35 ++++++-- astune/parallel_env.py | 57 ++++++++---- astune/schema/logprob.py | 11 ++- astune/utils/utils.py | 2 +- 9 files changed, 178 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 5b54f1e4..6c9e7679 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- clear && \ python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --with-ray --backbone='trinity' - python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --with-ray --backbone='trinity' + clear && python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --with-ray --backbone='trinity' ``` 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension) diff --git a/astune/backbone_trinity/register_flow.py b/astune/backbone_trinity/register_flow.py index 9900f8e7..c85339b7 100644 --- a/astune/backbone_trinity/register_flow.py +++ b/astune/backbone_trinity/register_flow.py @@ -23,7 +23,7 @@ from verl.utils.torch_functional import pad_sequence_to_length from beast_logger import register_logger, print_dict, print_listofdict from astune.schema.task import Task -from astune.utils.utils import run_async_coro__no_matter_what_the_fuck +from astune.utils.utils import run_async_coro__no_matter_what from astune.parallel_env import DynamicRollout from astune.schema.logprob import TokenAndProb from astune.schema.task import Task diff --git a/astune/context_manager/cmt_agentscope.py b/astune/context_manager/cmt_agentscope.py index 5bce7b1f..6b697ce9 100644 --- a/astune/context_manager/cmt_agentscope.py +++ b/astune/context_manager/cmt_agentscope.py @@ -5,9 +5,12 @@ from astune.schema.trajectory import Reward, Trajectory from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage from agentscope.model import DashScopeChatModel, ChatResponse +from agentscope.message import TextBlock, ToolUseBlock, ThinkingBlock +from typing import Dict, Tuple +from typing import Any, AsyncGenerator, Generator, Union, TYPE_CHECKING, List, Literal, Type +from pydantic import BaseModel from astune.context_manager.cmt_linear import replace_token_ids, CMTLinear from astune.schema.trajectory import Sample, Reward -from typing import Any, Dict, List, Union, Tuple from beast_logger import register_logger, print_dict, print_nested, NestedJsonItem, SeqItem from astune.utils.compute_madness import compute_string_madness from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model @@ -250,26 +253,36 @@ def check_context_token_num_safe(self, messages: List[dict]) -> Tuple[bool, str] class BeyondAgentLmProxy(BeyondAgentContextTemplate): - async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], tool_choice: str = "auto", **kwargs) -> dict: + async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: # load messages into `self.full_context` self.full_context = [] for i, msg in enumerate(messages): - if not isinstance(msg['content'], str): - continue - if msg['role'] not in ['user', 'assistant', 'system']: + if msg['role'] not in ['user', 'assistant', 'system', 'tool']: continue + if not isinstance(msg['content'], str): + author = 'env' + msg['content'] = str(msg['content']) # TODO: better handling for non-str content if msg['role'] == 'system': author = 'initialization' + if msg['role'] == 'tool': + author = 'env' else: - # mask everything author = 'env' + + is_last_message = (len(messages) == i+1) + if is_last_message: + _tools = tools + else: + _tools = [] + self.full_context += [ ExtendedMessage( author=author, role=msg['role'], content=msg['content'], tokenizer=self.tokenizer, + tools=_tools, token_generator="auto", ) ] @@ -286,8 +299,6 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], content = [{'type': 'text', 'text': 'beyondagent_proxy:[context_overflow]'}] ) - # from vsdb import bp - # bp("INF") llm_output = self.llm_chat_fn(messages, custom_sampling_params) # compute_string_madness @@ -297,17 +308,20 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], # dummy response for now token_generator = "manual" if 'tokens' in llm_output else "auto" + if llm_output.get("tool_calls", None) is not None: + tool_calls = llm_output["tool_calls"] + else: + tool_calls = [] + llm_ext_msg = ExtendedMessage( author="llm", role="assistant", content=llm_output['content'], token_generator=token_generator, + tool_calls=tool_calls, tokenizer=self.tokenizer, ) - from vsdb import bp - bp("LOG") - if token_generator == "manual": input_msg_ref = copy.deepcopy(messages) token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output) @@ -321,17 +335,79 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], self.full_context += [ llm_ext_msg ] - prompt_text = self.tokenizer.apply_chat_template(self.to_role_content(self.full_context), tokenize=False, add_generation_prompt=True) + prompt_text = self.tokenizer.apply_chat_template( + self.to_role_content(self.full_context), + tokenize=False, + add_generation_prompt=True + ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) if length >= self.config.astune.rollout.max_model_len: raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, before gen info {info}, generated token length {len(llm_ext_msg.token_arr)}") - self.grouped_steps += [copy.deepcopy(self.full_context)] # return response - return ChatResponse( - content = [{'type': 'text', 'text': llm_ext_msg.content_for_future}] + return await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) + + async def _parse_dashscope_generation_response( + self, + message, + structured_model: Type[BaseModel] | None = None, + ) -> ChatResponse: + + + content_blocks: List[TextBlock | ToolUseBlock] = [] + content = message.get("content") + metadata: dict | None = None + + if content not in [ + None, + "", + [], + ]: + if isinstance(content, list): + for item in content: + if isinstance(item, dict) and "text" in item: + content_blocks.append( + TextBlock( + type="text", + text=item["text"], + ), + ) + else: + content_blocks.append( + TextBlock( + type="text", + text=content, + ), + ) + + if message.get("tool_calls"): + for tool_call in message["tool_calls"]: + input_ = _json_loads_with_repair( + tool_call["function"].get( + "arguments", + "{}", + ) + or "{}", + ) + content_blocks.append( + ToolUseBlock( + type="tool_use", + name=tool_call["function"]["name"], + input=input_, + id=tool_call["id"], + ), + ) + + if structured_model: + metadata = input_ + + + parsed_response = ChatResponse( + content=content_blocks, + metadata=metadata, ) + return parsed_response class BeyondAgentProxy(BeyondAgentLmProxy): @@ -401,6 +477,7 @@ async def __call__( response = await self.execute_model_proxy( api_key=self.dscm_ref.api_key, + structured_model=structured_model, **kwargs, ) return response diff --git a/astune/context_manager/cmt_base_attr.py b/astune/context_manager/cmt_base_attr.py index 0ea8f3bd..4d8c7350 100644 --- a/astune/context_manager/cmt_base_attr.py +++ b/astune/context_manager/cmt_base_attr.py @@ -46,6 +46,8 @@ def __init__( tokenizer=None, token_generator="manual", build_from_uuid="", + tools=[], + tool_calls=[], token_logprob_arr=[], ): self.author = author @@ -60,6 +62,8 @@ def __init__( self._content_for_future = "" self._info = "" self.clip = clip + self.tools = tools + self.tool_calls = tool_calls self.uuid = uuid.uuid4().hex self.build_from_uuid = build_from_uuid @@ -82,7 +86,10 @@ def __init__( @property def content_for_future(self): - if self._content_for_future == "": raise ValueError("content_for_future is not set, or previous llm output is empty!") + if self._content_for_future == "": + if not self.tool_calls: + # from vsdb import bp; bp("H1") + raise ValueError("content_for_future is not set, or previous llm output is empty!") return self._content_for_future diff --git a/astune/context_manager/cmt_linear.py b/astune/context_manager/cmt_linear.py index 34d24c1e..c3899c58 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_manager/cmt_linear.py @@ -263,7 +263,11 @@ def save_env_output(self, env_output:dict, input_msg_ref:Optional[List[dict]]=No return def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List[dict]: - return [{"role": ext_msg.role, "content": ext_msg.content_for_future} for ext_msg in ext_msg_array] + return [ + {"role": ext_msg.role, "content": ext_msg.content_for_future} if not ext_msg.tools else + {"role": ext_msg.role, "content": ext_msg.content_for_future, "tools": ext_msg.tools} + for ext_msg in ext_msg_array + ] def prepare_world_interaction(self) -> str: """ diff --git a/astune/main_vllm.py b/astune/main_vllm.py index 085ef600..4ceb4111 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -47,17 +47,36 @@ def submit_chat_completions(self, messages, sampling_params, request_id): sampling_params["top_p"] = self.config.astune.rollout.val_kwargs.top_p sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) - completion = client.chat.completions.create( - model=self.config.astune.model.path, - messages=messages, - extra_body=sampling_params - ) + tools = messages[-1].get("tools", None) + for msg in messages: msg.pop("tools", None) + + if tools is not None: + completion = client.chat.completions.create( + model=self.config.astune.model.path, + messages=messages, + tools=tools, + tool_choice="required", + extra_body=sampling_params + ) + else: + completion = client.chat.completions.create( + model=self.config.astune.model.path, + messages=messages, + extra_body=sampling_params + ) message = completion.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) - if "content" not in message: message["content"] = "" - t = {"role": message["role"], "request_id":completion.id, "content": message['content'], "tokens": [TokenAndProb(t) for t in completion.choices[0].logprobs.content]} - messages.append(t) + if "content" not in message: + message["content"] = "" + + messages.append({ + "role": message["role"], + "request_id":completion.id, + "content": message['content'], + "tool_calls": message.get("tool_calls", None), + "tokens": [TokenAndProb(t) for t in completion.choices[0].logprobs.content] # type: ignore + }) return messages diff --git a/astune/parallel_env.py b/astune/parallel_env.py index f3648aee..aadd750a 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -4,6 +4,7 @@ import numpy as np import torch import uuid +import asyncio from concurrent.futures import ThreadPoolExecutor from typing import Dict, List, Literal, Callable, Any from loguru import logger @@ -21,7 +22,9 @@ from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr from beast_logger import register_logger, print_dict, print_listofdict from astune.agentscope_flow import AgentScopeWorkflow -from astune.utils.utils import run_async_coro__no_matter_what_the_fuck +from astune.utils.utils import run_async_coro__no_matter_what +from astune.schema.logprob import TokenAndProb + from pydantic import BaseModel, Field @@ -55,12 +58,10 @@ def __init__(self, config: DictConfig, async_rollout_manager, max_parallel: int, self.current_global_steps = "NA" - def get_llm_chat_fn(self, sampling_params: dict = None) -> Callable: - import asyncio, uuid - from astune.schema.logprob import TokenAndProb + def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: def llm_chat(messages: List[Dict[str, str]], - custom_sampling_params: dict = None, - request_id: str = None) -> dict: + custom_sampling_params: dict = {}, + request_id: str = "") -> dict: """ input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] output messages: [{"role": "assistant", "value": "..."}] @@ -72,12 +73,18 @@ def llm_chat(messages: List[Dict[str, str]], if custom_sampling_params: updated_sampling_params.update(custom_sampling_params) + tools = messages[-1].get("tools", None) + for msg in messages: msg.pop("tools", None) + # updated_sampling_params.update({"logprobs": 1, "prompt_logprobs": 1}) input_messages = copy.deepcopy(messages) request_id = uuid.uuid4().hex - prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True) + if tools is not None: + prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True, tools=tools) + else: + prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True) - final_res = run_async_coro__no_matter_what_the_fuck(self.async_rollout_manager.generate( + final_res = run_async_coro__no_matter_what(self.async_rollout_manager.generate( request_id=request_id, prompt_ids=prompt_ids, sampling_params=updated_sampling_params, @@ -89,7 +96,7 @@ def llm_chat(messages: List[Dict[str, str]], elif self.config.astune.rollout.name == 'sglang': token_array = final_res - decoded_text = self.tokenizer.decode(token_array) + decoded_text = self.tokenizer.decode(token_array) # type: ignore # decoded_text = "Let's start by finding which API we need to use to interact with Simple Note.\n\nCode: # ```python\nprint(apis.api_docs.show_api_descriptions(app_name='simple_note'))\n```<|im_end|>" if decoded_text.endswith('<|im_end|>'): @@ -111,13 +118,13 @@ def llm_chat(messages: List[Dict[str, str]], logprob=-1, decoded_string=self.tokenizer.decode(token) ) - for token in token_array + for token in token_array # type: ignore ] } def llm_chat_remote(messages: List[Dict[str, str]], - custom_sampling_params: dict = None, - request_id: str = None) -> dict: + custom_sampling_params: dict = {}, + request_id: str = "") -> dict: """ input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] output messages: [{"role": "assistant", "value": "..."}] @@ -138,8 +145,7 @@ def llm_chat_remote(messages: List[Dict[str, str]], except Exception as e: logger.bind(exception=True).exception(f"rollout_server.{i} error: {e.args}") time.sleep(i + 1) - - return output_message[-1] + return output_message[-1] # type: ignore def llm_chat_trinity(messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -155,30 +161,43 @@ async def main(model_client): if custom_sampling_params: updated_sampling_params.update(custom_sampling_params) updated_sampling_params.pop('min_tokens') + + tools = messages[-1].get("tools", None) + for msg in messages: msg.pop("tools", None) + response = await model_client.chat.completions.create( model=model_client.model_path, messages=messages, logprobs=True, + tools=tools, top_logprobs=0, **updated_sampling_params ) return response assert hasattr(self, 'trinity_llm_model_client'), "trinity_llm_model_client is not set in AsyncLlmBridge" - response = run_async_coro__no_matter_what_the_fuck(main(self.trinity_llm_model_client)) # type: ignore - from vsdb import bp - bp('INFER') + response = run_async_coro__no_matter_what(main(self.trinity_llm_model_client)) # type: ignore + + content = response.choices[0].message.content + message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) + if content is None: + # from vsdb import bp; bp("H2") + content = "" return { "role": "assistant", "request_id": response.id, - "content": response.choices[0].message.content, + "content": content, + "tool_calls": message.get("tool_calls", None), "tokens": [ TokenAndProb( token_id=token, logprob=tokenlogprob.logprob, decoded_string=tokenlogprob.token ) - for tokenlogprob, token in zip(response.choices[0].logprobs.content, response.choices[0].token_ids) + for tokenlogprob, token in zip( + response.choices[0].logprobs.content, + response.choices[0].token_ids + ) ] } diff --git a/astune/schema/logprob.py b/astune/schema/logprob.py index b425fc45..717c7dc5 100644 --- a/astune/schema/logprob.py +++ b/astune/schema/logprob.py @@ -1,9 +1,8 @@ -from typing import Any, Dict, List - -from loguru import logger -from omegaconf import DictConfig -from openai.types.chat.chat_completion import ChatCompletion -from verl import DataProto +# from typing import Any, Dict, List +# from loguru import logger +# from omegaconf import DictConfig +# from openai.types.chat.chat_completion import ChatCompletion +# from verl import DataProto class TokenAndProb: def __init__(self, token_id, logprob, decoded_string): diff --git a/astune/utils/utils.py b/astune/utils/utils.py index 1e67afbe..3a6a56af 100644 --- a/astune/utils/utils.py +++ b/astune/utils/utils.py @@ -15,7 +15,7 @@ def convert_tool_to_user_message(tool_message, tokenizer, format="qwen"): } -def run_async_coro__no_matter_what_the_fuck(coro): +def run_async_coro__no_matter_what(coro): try: asyncio.get_running_loop() in_loop = True From 05bd8f64fcb4c7202839b33f4cedb4d0f0f5b281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Tue, 11 Nov 2025 16:21:02 +0800 Subject: [PATCH 004/462] =?UTF-8?q?=E8=AE=AD=E7=BB=83=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E6=97=B6=E5=90=91=E6=89=8B=E6=9C=BA=E5=8F=91=E9=80=81=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 + astune/main_trinity.py | 12 +- astune/main_verl.py | 15 +-- astune/main_vllm.py | 4 +- astune/utils/sms_agent.py | 11 ++ boot_sms.py | 9 -- ...orld-qwen2-agentscope-bz32-tp4-linear.yaml | 1 + launcher/math_agent/git-math-agentscope.yaml | 1 + requirements_verl.txt | 109 +++++++++++------- 9 files changed, 101 insertions(+), 67 deletions(-) create mode 100644 astune/utils/sms_agent.py delete mode 100644 boot_sms.py diff --git a/README.md b/README.md index 5e940356..f3dbfb18 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,12 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- ``` 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG4|TAG5|TAG6' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG4")` 即可。 +## Feature + +- 当程序退出时,给自己发短信 + ```bash + PHONE_NUMBERS="18812341234" python launcher.py ... + ``` # 简要架构 diff --git a/astune/main_trinity.py b/astune/main_trinity.py index e3c63d93..4420c067 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -7,11 +7,11 @@ import os import sys import traceback +import ray +import atexit from pathlib import Path from pprint import pprint - -import ray - +from astune.utils.sms_agent import send_train_message from trinity.buffer.pipelines.task_pipeline import check_and_run_task_pipeline from trinity.common.config import Config, load_config from trinity.common.constants import DEBUG_NAMESPACE, PLUGIN_DIRS_ENV_VAR @@ -169,11 +169,17 @@ def run_stage(config: Config) -> None: def run(config_path: str, dlc: bool = False, plugin_dir: str = None): + if os.path.exists(".env"): from dotenv import load_dotenv load_dotenv(".env") + + atexit.register(lambda: send_train_message("Trinity Exit")) + if plugin_dir: os.environ[PLUGIN_DIRS_ENV_VAR] = plugin_dir + + load_plugins() config = load_config(config_path) diff --git a/astune/main_verl.py b/astune/main_verl.py index 5ef66a77..f8dbf5b2 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -15,19 +15,12 @@ Note that we don't combine the main with ray_trainer as ray_trainer is used by other main. """ - -def send_train_message(message: str): - import requests, os # 发送短信汇报训练进程 - assert len(message) < 64, f"Message too long: {(message)}" - if os.getenv("ALIYUN_SMS_SERVICE") and os.getenv("SMS"): - print("尝试发送短信:", message) - try: requests.post(json={"phone_numbers": "18810508767", "server_code": "DLC", "error": message, "error_level": "无"}, url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), headers={"Content-Type": "application/json"}) - except Exception as e: print(f"Failed to send sms: {e}") - import os import socket import hydra import ray +import atexit +from astune.utils.sms_agent import send_train_message from omegaconf import OmegaConf from verl.experimental.dataset.sampler import AbstractSampler from verl.trainer.constants_ppo import get_ppo_ray_runtime_env @@ -84,8 +77,8 @@ def run_ppo(config) -> None: runtime_env=runtime_env, num_cpus=config.ray_init.num_cpus, ) - import atexit - atexit.register(lambda: send_train_message("注意:训练结束")) # 如果环境变量存在,则在程序结束时发送短信 + + atexit.register(lambda: send_train_message("Verl Exit")) atexit.register(lambda: ray.shutdown()) # ray shutdown on exit # Create a remote instance of the TaskRunner class, and diff --git a/astune/main_vllm.py b/astune/main_vllm.py index 085ef600..f6472330 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -1,12 +1,13 @@ import os import sys import hydra - +import atexit from openai import OpenAI from types import SimpleNamespace from astune.schema.task import Task from beast_logger import register_logger from astune.parallel_env import ParallelEnvManager +from astune.utils.sms_agent import send_train_message class TokenAndProb: def __init__(self, t): @@ -135,4 +136,5 @@ def companion_launch(): run(config) if __name__ == "__main__": + atexit.register(lambda: send_train_message("Debug Exit")) main() \ No newline at end of file diff --git a/astune/utils/sms_agent.py b/astune/utils/sms_agent.py new file mode 100644 index 00000000..8189ceea --- /dev/null +++ b/astune/utils/sms_agent.py @@ -0,0 +1,11 @@ +def send_train_message(message: str): + import requests, os, dotenv + dotenv.load_dotenv() + phone_numbers = os.getenv("PHONE_NUMBERS", None) + print("trying to send sms to:", phone_numbers) + if phone_numbers: + try: + assert len(message) < 15, f"message is limit to 15 characters! Current length: {len(message)}." + requests.post(json={"phone_numbers": phone_numbers, "server_code": "DLC", "error": message, "error_level": "wbb1u1g0dte2n"}, url=os.getenv("ALIYUN_SMS_SERVICE", "http://cloud-6.agent-matrix.com:12337/send-sms/"), headers={"Content-Type": "application/json"}) + except Exception as e: + print(f"Failed to send sms: {e}") diff --git a/boot_sms.py b/boot_sms.py deleted file mode 100644 index d096c3bf..00000000 --- a/boot_sms.py +++ /dev/null @@ -1,9 +0,0 @@ -def send_train_message(message: str): - import requests, os # 发送短信汇报训练进程 - assert len(message) < 64, f"Message too long: {(message)}" - try: requests.post(json={"phone_numbers": "18810508767", "server_code": "DLC", "error": message, "error_level": "无"}, url=os.getenv("ALIYUN_SMS_SERVICE", "http://cloud-6.agent-matrix.com:12337/send-sms/"), headers={"Content-Type": "application/json"}) - except Exception as e: print(f"Failed to send sms: {e}") - print('sms send') - - -send_train_message("容器启动") \ No newline at end of file diff --git a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml b/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml index b34b8dc6..7b01250e 100644 --- a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml +++ b/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml @@ -59,6 +59,7 @@ astune: multi_turn: max_sample_per_task: 30 max_steps: 30 + enable: True step_skip_action: 0 # skip action generation every N steps, 0 means never skip submit_oversample_multiplier: 1.5 enable_oversample: True diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 052dea58..e40d2e63 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -69,6 +69,7 @@ astune: multi_turn: max_sample_per_task: 30 max_steps: 30 + enable: True step_skip_action: 0 # skip action generation every N steps, 0 means never skip submit_oversample_multiplier: 1.5 enable_oversample: True diff --git a/requirements_verl.txt b/requirements_verl.txt index d07fe4ed..c84a515f 100644 --- a/requirements_verl.txt +++ b/requirements_verl.txt @@ -1,42 +1,48 @@ absl-py==2.3.1 accelerate==1.10.0 +agentscope aiohappyeyeballs==2.6.1 -aiohttp==3.12.15 -agentscope==1.0.6 +aiohttp==3.13.2 aiohttp-cors==0.8.1 +aioitertools==0.13.0 aiosignal==1.4.0 airportsdata==20250706 annotated-types==0.7.0 -anthropic==0.62.0 +anthropic==0.72.0 antlr4-python3-runtime==4.9.3 -anyio==4.10.0 +anyio==4.11.0 astor==0.8.1 asttokens==3.0.0 async-timeout==5.0.1 -attrs==25.3.0 +attrs==25.4.0 av==15.0.0 beast-logger==0.0.15 +bidict==0.23.1 blake3==1.0.5 blobfile==3.0.0 boto3==1.40.6 botocore==1.40.6 build==1.3.0 +cached-property==2.0.1 cachetools==5.5.2 cbor2==5.6.5 -certifi==2025.8.3 -cffi==2.0.0b1 +certifi==2025.10.5 +cffi==2.0.0 cfgv==3.4.0 -charset-normalizer==3.4.3 -click==8.2.1 +charset-normalizer==3.4.4 +click==8.3.0 cloudpickle==3.1.1 codetiming==1.4.0 colorful==0.5.7 compressed-tensors==0.10.2 +cryptography==46.0.3 cuda-bindings==13.0.0 cuda-pathfinder==1.1.0 cuda-python==13.0.0 cupy-cuda12x==13.5.1 +dashscope==1.25.0 datasets==4.0.0 +debugpy==1.8.17 decorator==5.2.1 decord==0.6.0 deprecated==1.2.18 @@ -46,6 +52,7 @@ diskcache==5.6.3 distlib==0.4.0 distro==1.9.0 dnspython==2.7.0 +docstring-parser==0.17.0 einops==0.8.1 email-validator==2.2.0 exceptiongroup==1.3.0 @@ -57,25 +64,26 @@ fastrlock==0.8.3 filelock==3.18.0 flashinfer-python==0.2.9rc2 frozendict==2.4.6 -frozenlist==1.7.0 +frozenlist==1.8.0 fsspec==2025.3.0 gguf==0.17.1 gitdb==4.0.12 gitpython==3.1.45 google-api-core==2.25.1 google-auth==2.40.3 -googleapis-common-protos==1.70.0 -grpcio==1.74.0 +googleapis-common-protos==1.72.0 +grpcio==1.76.0 h11==0.16.0 hf-transfer==0.1.9 hf-xet==1.1.7 httpcore==1.0.9 httptools==0.6.4 httpx==0.28.1 +httpx-sse==0.4.3 huggingface-hub==0.35.0rc0 hydra-core==1.3.2 identify==2.6.13 -idna==3.10 +idna==3.11 importlib-metadata==8.7.0 iniconfig==2.1.0 interegular==0.3.3 @@ -83,10 +91,12 @@ ipython==8.37.0 jedi==0.19.2 jieba==0.42.1 jinja2==3.1.6 -jiter==0.10.0 +jiter==0.12.0 jmespath==1.0.1 -jsonschema==4.25.0 -jsonschema-specifications==2025.4.1 +json-repair==0.53.0 +json5==0.12.1 +jsonschema==4.25.1 +jsonschema-specifications==2025.9.1 lark==1.2.2 latex2sympy2-extended==1.10.2 liger-kernel==0.6.1 @@ -102,20 +112,21 @@ markupsafe==3.0.2 math-verify==0.8.0 mathruler==0.1.0 matplotlib-inline==0.1.7 +mcp==1.21.0 mdurl==0.1.2 mistral-common==1.8.3 modelscope==1.28.2 mpmath==1.3.0 msgpack==1.1.1 msgspec==0.19.0 -multidict==6.6.3 +multidict==6.7.0 multiprocess==0.70.16 nest-asyncio==1.6.0 networkx==3.4.2 ninja==1.11.1.4 nodeenv==1.9.1 numba==0.61.2 -numpy==1.26.4 +numpy==2.2.6 nvidia-cublas-cu12==12.6.4.1 nvidia-cuda-cupti-cu12==12.6.80 nvidia-cuda-nvrtc-cu12==12.6.77 @@ -134,19 +145,19 @@ nvidia-nvjitlink-cu12==12.6.85 nvidia-nvshmem-cu12==3.3.20 nvidia-nvtx-cu12==12.6.77 omegaconf==2.3.0 -openai==1.90.0 +openai==2.7.2 opencensus==0.11.4 opencensus-context==0.1.3 opencv-python-headless==4.11.0.86 -opentelemetry-api==1.36.0 -opentelemetry-exporter-otlp==1.26.0 -opentelemetry-exporter-otlp-proto-common==1.26.0 -opentelemetry-exporter-otlp-proto-grpc==1.26.0 -opentelemetry-exporter-otlp-proto-http==1.26.0 +opentelemetry-api==1.38.0 +opentelemetry-exporter-otlp==1.38.0 +opentelemetry-exporter-otlp-proto-common==1.38.0 +opentelemetry-exporter-otlp-proto-grpc==1.38.0 +opentelemetry-exporter-otlp-proto-http==1.38.0 opentelemetry-exporter-prometheus==0.57b0 -opentelemetry-proto==1.36.0 -opentelemetry-sdk==1.36.0 -opentelemetry-semantic-conventions==0.57b0 +opentelemetry-proto==1.38.0 +opentelemetry-sdk==1.38.0 +opentelemetry-semantic-conventions==0.59b0 opentelemetry-semantic-conventions-ai==0.4.12 orjson==3.11.1 outlines==0.1.11 @@ -166,9 +177,9 @@ prettytable==3.16.0 prometheus-client==0.22.1 prometheus-fastapi-instrumentator==7.1.0 prompt-toolkit==3.0.51 -propcache==0.3.2 +propcache==0.4.1 proto-plus==1.26.1 -protobuf==6.31.1 +protobuf==6.33.0 psutil==7.0.0 ptyprocess==0.7.0 pure-eval==0.2.3 @@ -180,35 +191,41 @@ pyasn1-modules==0.4.2 pybase64==1.4.2 pybind11==3.0.0 pycountry==24.6.1 -pycparser==2.22 +pycparser==2.23 pycryptodomex==3.23.0 -pydantic==2.12.0a1 -pydantic-core==2.37.2 +pydantic==2.12.4 +pydantic-core==2.41.5 pydantic-extra-types==2.10.5 +pydantic-settings==2.12.0 pyecharts==2.0.8 pyext==0.7 pygments==2.19.2 +pyjwt==2.10.1 pylatexenc==2.10 pynvml==12.0.0 pyproject-hooks==1.2.0 pytest==8.4.1 +python-datauri==3.0.2 python-dateutil==2.9.0.post0 -python-dotenv==1.1.1 +python-dotenv==1.2.1 +python-engineio==4.12.3 python-json-logger==3.3.0 python-multipart==0.0.20 +python-socketio==5.14.3 pytz==2025.2 pyvers==0.1.0 pyyaml==6.0.2 pyzmq==27.0.1 qwen-vl-utils==0.0.11 ray==2.48.0 -referencing==0.36.2 -regex==2025.7.33 -requests==2.32.4 +referencing==0.37.0 +regex==2025.11.3 +requests==2.32.5 rich==13.9.4 rich-toolkit==0.14.9 rignore==0.6.4 -rpds-py==0.27.0 +ring-flash-attn==0.1.8 +rpds-py==0.28.0 rsa==4.9.1 ruff==0.12.8 s3transfer==0.13.1 @@ -221,22 +238,26 @@ setuptools==80.9.0 sgl-kernel==0.2.4 sglang==0.4.9.post6 shellingham==1.5.4 +shortuuid==1.0.13 +simple-websocket==1.1.0 simplejson==3.20.1 six==1.17.0 smart-open==7.3.0.post1 smmap==5.0.2 sniffio==1.3.1 +sounddevice==0.5.3 soundfile==0.13.1 soxr==0.5.0.post1 +sse-starlette==3.0.3 stack-data==0.6.3 -starlette==0.47.2 +starlette==0.50.0 swankit==0.2.4 swanlab==0.6.8 sympy==1.14.0 tensorboard==2.20.0 tensorboard-data-server==0.7.2 tensordict==0.9.1 -tiktoken==0.11.0 +tiktoken==0.12.0 timm==1.0.16 tokenizers==0.21.4 tomli==2.2.1 @@ -251,23 +272,25 @@ traitlets==5.14.3 transformers==4.54.0 triton==3.3.1 typer==0.16.0 -typing-extensions==4.14.1 -typing-inspection==0.4.1 +typing-extensions==4.15.0 +typing-inspection==0.4.2 tzdata==2025.2 urllib3==2.5.0 -uvicorn==0.35.0 +uvicorn==0.38.0 uvloop==0.21.0 virtualenv==20.33.1 vllm==0.10.0 wandb==0.21.1 watchfiles==1.1.0 wcwidth==0.2.13 +websocket-client==1.9.0 websockets==15.0.1 werkzeug==3.1.3 wrapt==1.17.2 +wsproto==1.2.0 xformers==0.0.31 xgrammar==0.1.21 xxhash==3.5.0 -yarl==1.20.1 +yarl==1.22.0 zipp==3.23.0 debugpy>=1.8.0 \ No newline at end of file From 4205577abdc473b68fe87639c6580177554ae765 Mon Sep 17 00:00:00 2001 From: "fuqingxu.fqx" Date: Tue, 11 Nov 2025 16:23:31 +0800 Subject: [PATCH 005/462] =?UTF-8?q?refactor(astune/main=5Fvllm.py):=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9atexit=E6=B3=A8=E5=86=8C=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=96=B9=E5=BC=8F=E4=BB=A5=E6=8F=90=E9=AB=98?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astune/main_vllm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/astune/main_vllm.py b/astune/main_vllm.py index f6472330..bd984b85 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -136,5 +136,5 @@ def companion_launch(): run(config) if __name__ == "__main__": - atexit.register(lambda: send_train_message("Debug Exit")) - main() \ No newline at end of file + atexit.register(send_train_message, "Debug Exit") + main() From 608919f8205f508cf3c33a0e94415e67eb12424b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Tue, 11 Nov 2025 17:34:41 +0800 Subject: [PATCH 006/462] bug patch --- astune/context_manager/cmt_agentscope.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/context_manager/cmt_agentscope.py b/astune/context_manager/cmt_agentscope.py index 5bce7b1f..b3094bca 100644 --- a/astune/context_manager/cmt_agentscope.py +++ b/astune/context_manager/cmt_agentscope.py @@ -88,10 +88,9 @@ def process_reward(self, reward_structure: Reward): def generate_log(self, task_id = None, global_step="NA"): task_id = self.task_id nested_items_print_buffer = {} - for index, ext_steps in enumerate(self.grouped_steps): - from vsdb import bp - bp("LLL") + step_reward = 0.0 + for index, ext_steps in enumerate(self.grouped_steps): cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] @@ -142,6 +141,7 @@ def generate_log(self, task_id = None, global_step="NA"): color = buffer['loss_mask_color_arr'] # 颜色 ) ) + print_nested(nested_items_print_buffer, main_content="This is the main content of the nested JSON", header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", # type: ignore From fe173b6f22c6b9b706aa3bfb66c2dc2b32350cd5 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 11 Nov 2025 18:15:42 +0800 Subject: [PATCH 007/462] vllm add `enable-auto-tool-choice` --- astune/main_vllm.py | 2 ++ launcher.py | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/astune/main_vllm.py b/astune/main_vllm.py index 4ceb4111..26cbfa9c 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -141,6 +141,8 @@ def companion_launch(): f"--max-model-len", f"{max_model_len}", f"--load-format", "auto", f"--enable-chunked-prefill", + f"--enable-auto-tool-choice", + f"--tool-call-parser", "hermes", f"--enable-prefix-caching", f"--seed", f"{seed}", f"--port", f"{vllm_port}", diff --git a/launcher.py b/launcher.py index f6a90807..c9977841 100644 --- a/launcher.py +++ b/launcher.py @@ -139,11 +139,9 @@ def prepare_experiment_config(yaml_path, args): with open(yaml_path, 'r') as file: config = yaml.safe_load(file) exp_name = config.get('astune').get('experiment_name') - print('C1', exp_name) if exp_name is None or exp_name == 'read_yaml_name': if exp_name is not None: exp_name = exp_name.replace('|', '-') exp_name = os.path.basename(yaml_path).replace('.yaml', '') - print('C2', yaml_path, exp_name) else: exp_name = exp_name.replace('|', '-') From 0dd5ec6e82e8b1d6878d965c4eda48725c23ab01 Mon Sep 17 00:00:00 2001 From: "fuqingxu.fqx" Date: Tue, 11 Nov 2025 18:55:41 +0800 Subject: [PATCH 008/462] =?UTF-8?q?=E8=AE=AD=E7=BB=83=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E6=97=B6=E5=90=91=E6=89=8B=E6=9C=BA=E5=8F=91=E9=80=81=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=20Link:=20https://code.alibaba-inc.com/DAIL-LLM/astun?= =?UTF-8?q?e/codereview/24360998=20*=20=E8=AE=AD=E7=BB=83=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E6=97=B6=E5=90=91=E6=89=8B=E6=9C=BA=E5=8F=91=E9=80=81?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(astune/main_vllm.py): 修改atexit注册函数调用方式以提高可读性 * bug patch --- README.md | 6 + astune/context_manager/cmt_agentscope.py | 6 +- astune/main_trinity.py | 12 +- astune/main_verl.py | 15 +-- astune/main_vllm.py | 6 +- astune/utils/sms_agent.py | 11 ++ boot_sms.py | 9 -- ...orld-qwen2-agentscope-bz32-tp4-linear.yaml | 1 + launcher/math_agent/git-math-agentscope.yaml | 1 + requirements_verl.txt | 109 +++++++++++------- 10 files changed, 105 insertions(+), 71 deletions(-) create mode 100644 astune/utils/sms_agent.py delete mode 100644 boot_sms.py diff --git a/README.md b/README.md index 6c9e7679..73c84a4a 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,12 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- ``` 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG4|TAG5|TAG6' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG4")` 即可。 +## Feature + +- 当程序退出时,给自己发短信 + ```bash + PHONE_NUMBERS="18812341234" python launcher.py ... + ``` # 简要架构 diff --git a/astune/context_manager/cmt_agentscope.py b/astune/context_manager/cmt_agentscope.py index 6b697ce9..ca1b4a97 100644 --- a/astune/context_manager/cmt_agentscope.py +++ b/astune/context_manager/cmt_agentscope.py @@ -91,10 +91,9 @@ def process_reward(self, reward_structure: Reward): def generate_log(self, task_id = None, global_step="NA"): task_id = self.task_id nested_items_print_buffer = {} - for index, ext_steps in enumerate(self.grouped_steps): - from vsdb import bp - bp("LLL") + step_reward = 0.0 + for index, ext_steps in enumerate(self.grouped_steps): cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] @@ -145,6 +144,7 @@ def generate_log(self, task_id = None, global_step="NA"): color = buffer['loss_mask_color_arr'] # 颜色 ) ) + print_nested(nested_items_print_buffer, main_content="This is the main content of the nested JSON", header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", # type: ignore diff --git a/astune/main_trinity.py b/astune/main_trinity.py index e3c63d93..4420c067 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -7,11 +7,11 @@ import os import sys import traceback +import ray +import atexit from pathlib import Path from pprint import pprint - -import ray - +from astune.utils.sms_agent import send_train_message from trinity.buffer.pipelines.task_pipeline import check_and_run_task_pipeline from trinity.common.config import Config, load_config from trinity.common.constants import DEBUG_NAMESPACE, PLUGIN_DIRS_ENV_VAR @@ -169,11 +169,17 @@ def run_stage(config: Config) -> None: def run(config_path: str, dlc: bool = False, plugin_dir: str = None): + if os.path.exists(".env"): from dotenv import load_dotenv load_dotenv(".env") + + atexit.register(lambda: send_train_message("Trinity Exit")) + if plugin_dir: os.environ[PLUGIN_DIRS_ENV_VAR] = plugin_dir + + load_plugins() config = load_config(config_path) diff --git a/astune/main_verl.py b/astune/main_verl.py index 5ef66a77..f8dbf5b2 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -15,19 +15,12 @@ Note that we don't combine the main with ray_trainer as ray_trainer is used by other main. """ - -def send_train_message(message: str): - import requests, os # 发送短信汇报训练进程 - assert len(message) < 64, f"Message too long: {(message)}" - if os.getenv("ALIYUN_SMS_SERVICE") and os.getenv("SMS"): - print("尝试发送短信:", message) - try: requests.post(json={"phone_numbers": "18810508767", "server_code": "DLC", "error": message, "error_level": "无"}, url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), headers={"Content-Type": "application/json"}) - except Exception as e: print(f"Failed to send sms: {e}") - import os import socket import hydra import ray +import atexit +from astune.utils.sms_agent import send_train_message from omegaconf import OmegaConf from verl.experimental.dataset.sampler import AbstractSampler from verl.trainer.constants_ppo import get_ppo_ray_runtime_env @@ -84,8 +77,8 @@ def run_ppo(config) -> None: runtime_env=runtime_env, num_cpus=config.ray_init.num_cpus, ) - import atexit - atexit.register(lambda: send_train_message("注意:训练结束")) # 如果环境变量存在,则在程序结束时发送短信 + + atexit.register(lambda: send_train_message("Verl Exit")) atexit.register(lambda: ray.shutdown()) # ray shutdown on exit # Create a remote instance of the TaskRunner class, and diff --git a/astune/main_vllm.py b/astune/main_vllm.py index 26cbfa9c..ceca3660 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -1,12 +1,13 @@ import os import sys import hydra - +import atexit from openai import OpenAI from types import SimpleNamespace from astune.schema.task import Task from beast_logger import register_logger from astune.parallel_env import ParallelEnvManager +from astune.utils.sms_agent import send_train_message class TokenAndProb: def __init__(self, t): @@ -156,4 +157,5 @@ def companion_launch(): run(config) if __name__ == "__main__": - main() \ No newline at end of file + atexit.register(send_train_message, "Debug Exit") + main() diff --git a/astune/utils/sms_agent.py b/astune/utils/sms_agent.py new file mode 100644 index 00000000..8189ceea --- /dev/null +++ b/astune/utils/sms_agent.py @@ -0,0 +1,11 @@ +def send_train_message(message: str): + import requests, os, dotenv + dotenv.load_dotenv() + phone_numbers = os.getenv("PHONE_NUMBERS", None) + print("trying to send sms to:", phone_numbers) + if phone_numbers: + try: + assert len(message) < 15, f"message is limit to 15 characters! Current length: {len(message)}." + requests.post(json={"phone_numbers": phone_numbers, "server_code": "DLC", "error": message, "error_level": "wbb1u1g0dte2n"}, url=os.getenv("ALIYUN_SMS_SERVICE", "http://cloud-6.agent-matrix.com:12337/send-sms/"), headers={"Content-Type": "application/json"}) + except Exception as e: + print(f"Failed to send sms: {e}") diff --git a/boot_sms.py b/boot_sms.py deleted file mode 100644 index d096c3bf..00000000 --- a/boot_sms.py +++ /dev/null @@ -1,9 +0,0 @@ -def send_train_message(message: str): - import requests, os # 发送短信汇报训练进程 - assert len(message) < 64, f"Message too long: {(message)}" - try: requests.post(json={"phone_numbers": "18810508767", "server_code": "DLC", "error": message, "error_level": "无"}, url=os.getenv("ALIYUN_SMS_SERVICE", "http://cloud-6.agent-matrix.com:12337/send-sms/"), headers={"Content-Type": "application/json"}) - except Exception as e: print(f"Failed to send sms: {e}") - print('sms send') - - -send_train_message("容器启动") \ No newline at end of file diff --git a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml b/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml index b34b8dc6..7b01250e 100644 --- a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml +++ b/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml @@ -59,6 +59,7 @@ astune: multi_turn: max_sample_per_task: 30 max_steps: 30 + enable: True step_skip_action: 0 # skip action generation every N steps, 0 means never skip submit_oversample_multiplier: 1.5 enable_oversample: True diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 052dea58..e40d2e63 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -69,6 +69,7 @@ astune: multi_turn: max_sample_per_task: 30 max_steps: 30 + enable: True step_skip_action: 0 # skip action generation every N steps, 0 means never skip submit_oversample_multiplier: 1.5 enable_oversample: True diff --git a/requirements_verl.txt b/requirements_verl.txt index d07fe4ed..c84a515f 100644 --- a/requirements_verl.txt +++ b/requirements_verl.txt @@ -1,42 +1,48 @@ absl-py==2.3.1 accelerate==1.10.0 +agentscope aiohappyeyeballs==2.6.1 -aiohttp==3.12.15 -agentscope==1.0.6 +aiohttp==3.13.2 aiohttp-cors==0.8.1 +aioitertools==0.13.0 aiosignal==1.4.0 airportsdata==20250706 annotated-types==0.7.0 -anthropic==0.62.0 +anthropic==0.72.0 antlr4-python3-runtime==4.9.3 -anyio==4.10.0 +anyio==4.11.0 astor==0.8.1 asttokens==3.0.0 async-timeout==5.0.1 -attrs==25.3.0 +attrs==25.4.0 av==15.0.0 beast-logger==0.0.15 +bidict==0.23.1 blake3==1.0.5 blobfile==3.0.0 boto3==1.40.6 botocore==1.40.6 build==1.3.0 +cached-property==2.0.1 cachetools==5.5.2 cbor2==5.6.5 -certifi==2025.8.3 -cffi==2.0.0b1 +certifi==2025.10.5 +cffi==2.0.0 cfgv==3.4.0 -charset-normalizer==3.4.3 -click==8.2.1 +charset-normalizer==3.4.4 +click==8.3.0 cloudpickle==3.1.1 codetiming==1.4.0 colorful==0.5.7 compressed-tensors==0.10.2 +cryptography==46.0.3 cuda-bindings==13.0.0 cuda-pathfinder==1.1.0 cuda-python==13.0.0 cupy-cuda12x==13.5.1 +dashscope==1.25.0 datasets==4.0.0 +debugpy==1.8.17 decorator==5.2.1 decord==0.6.0 deprecated==1.2.18 @@ -46,6 +52,7 @@ diskcache==5.6.3 distlib==0.4.0 distro==1.9.0 dnspython==2.7.0 +docstring-parser==0.17.0 einops==0.8.1 email-validator==2.2.0 exceptiongroup==1.3.0 @@ -57,25 +64,26 @@ fastrlock==0.8.3 filelock==3.18.0 flashinfer-python==0.2.9rc2 frozendict==2.4.6 -frozenlist==1.7.0 +frozenlist==1.8.0 fsspec==2025.3.0 gguf==0.17.1 gitdb==4.0.12 gitpython==3.1.45 google-api-core==2.25.1 google-auth==2.40.3 -googleapis-common-protos==1.70.0 -grpcio==1.74.0 +googleapis-common-protos==1.72.0 +grpcio==1.76.0 h11==0.16.0 hf-transfer==0.1.9 hf-xet==1.1.7 httpcore==1.0.9 httptools==0.6.4 httpx==0.28.1 +httpx-sse==0.4.3 huggingface-hub==0.35.0rc0 hydra-core==1.3.2 identify==2.6.13 -idna==3.10 +idna==3.11 importlib-metadata==8.7.0 iniconfig==2.1.0 interegular==0.3.3 @@ -83,10 +91,12 @@ ipython==8.37.0 jedi==0.19.2 jieba==0.42.1 jinja2==3.1.6 -jiter==0.10.0 +jiter==0.12.0 jmespath==1.0.1 -jsonschema==4.25.0 -jsonschema-specifications==2025.4.1 +json-repair==0.53.0 +json5==0.12.1 +jsonschema==4.25.1 +jsonschema-specifications==2025.9.1 lark==1.2.2 latex2sympy2-extended==1.10.2 liger-kernel==0.6.1 @@ -102,20 +112,21 @@ markupsafe==3.0.2 math-verify==0.8.0 mathruler==0.1.0 matplotlib-inline==0.1.7 +mcp==1.21.0 mdurl==0.1.2 mistral-common==1.8.3 modelscope==1.28.2 mpmath==1.3.0 msgpack==1.1.1 msgspec==0.19.0 -multidict==6.6.3 +multidict==6.7.0 multiprocess==0.70.16 nest-asyncio==1.6.0 networkx==3.4.2 ninja==1.11.1.4 nodeenv==1.9.1 numba==0.61.2 -numpy==1.26.4 +numpy==2.2.6 nvidia-cublas-cu12==12.6.4.1 nvidia-cuda-cupti-cu12==12.6.80 nvidia-cuda-nvrtc-cu12==12.6.77 @@ -134,19 +145,19 @@ nvidia-nvjitlink-cu12==12.6.85 nvidia-nvshmem-cu12==3.3.20 nvidia-nvtx-cu12==12.6.77 omegaconf==2.3.0 -openai==1.90.0 +openai==2.7.2 opencensus==0.11.4 opencensus-context==0.1.3 opencv-python-headless==4.11.0.86 -opentelemetry-api==1.36.0 -opentelemetry-exporter-otlp==1.26.0 -opentelemetry-exporter-otlp-proto-common==1.26.0 -opentelemetry-exporter-otlp-proto-grpc==1.26.0 -opentelemetry-exporter-otlp-proto-http==1.26.0 +opentelemetry-api==1.38.0 +opentelemetry-exporter-otlp==1.38.0 +opentelemetry-exporter-otlp-proto-common==1.38.0 +opentelemetry-exporter-otlp-proto-grpc==1.38.0 +opentelemetry-exporter-otlp-proto-http==1.38.0 opentelemetry-exporter-prometheus==0.57b0 -opentelemetry-proto==1.36.0 -opentelemetry-sdk==1.36.0 -opentelemetry-semantic-conventions==0.57b0 +opentelemetry-proto==1.38.0 +opentelemetry-sdk==1.38.0 +opentelemetry-semantic-conventions==0.59b0 opentelemetry-semantic-conventions-ai==0.4.12 orjson==3.11.1 outlines==0.1.11 @@ -166,9 +177,9 @@ prettytable==3.16.0 prometheus-client==0.22.1 prometheus-fastapi-instrumentator==7.1.0 prompt-toolkit==3.0.51 -propcache==0.3.2 +propcache==0.4.1 proto-plus==1.26.1 -protobuf==6.31.1 +protobuf==6.33.0 psutil==7.0.0 ptyprocess==0.7.0 pure-eval==0.2.3 @@ -180,35 +191,41 @@ pyasn1-modules==0.4.2 pybase64==1.4.2 pybind11==3.0.0 pycountry==24.6.1 -pycparser==2.22 +pycparser==2.23 pycryptodomex==3.23.0 -pydantic==2.12.0a1 -pydantic-core==2.37.2 +pydantic==2.12.4 +pydantic-core==2.41.5 pydantic-extra-types==2.10.5 +pydantic-settings==2.12.0 pyecharts==2.0.8 pyext==0.7 pygments==2.19.2 +pyjwt==2.10.1 pylatexenc==2.10 pynvml==12.0.0 pyproject-hooks==1.2.0 pytest==8.4.1 +python-datauri==3.0.2 python-dateutil==2.9.0.post0 -python-dotenv==1.1.1 +python-dotenv==1.2.1 +python-engineio==4.12.3 python-json-logger==3.3.0 python-multipart==0.0.20 +python-socketio==5.14.3 pytz==2025.2 pyvers==0.1.0 pyyaml==6.0.2 pyzmq==27.0.1 qwen-vl-utils==0.0.11 ray==2.48.0 -referencing==0.36.2 -regex==2025.7.33 -requests==2.32.4 +referencing==0.37.0 +regex==2025.11.3 +requests==2.32.5 rich==13.9.4 rich-toolkit==0.14.9 rignore==0.6.4 -rpds-py==0.27.0 +ring-flash-attn==0.1.8 +rpds-py==0.28.0 rsa==4.9.1 ruff==0.12.8 s3transfer==0.13.1 @@ -221,22 +238,26 @@ setuptools==80.9.0 sgl-kernel==0.2.4 sglang==0.4.9.post6 shellingham==1.5.4 +shortuuid==1.0.13 +simple-websocket==1.1.0 simplejson==3.20.1 six==1.17.0 smart-open==7.3.0.post1 smmap==5.0.2 sniffio==1.3.1 +sounddevice==0.5.3 soundfile==0.13.1 soxr==0.5.0.post1 +sse-starlette==3.0.3 stack-data==0.6.3 -starlette==0.47.2 +starlette==0.50.0 swankit==0.2.4 swanlab==0.6.8 sympy==1.14.0 tensorboard==2.20.0 tensorboard-data-server==0.7.2 tensordict==0.9.1 -tiktoken==0.11.0 +tiktoken==0.12.0 timm==1.0.16 tokenizers==0.21.4 tomli==2.2.1 @@ -251,23 +272,25 @@ traitlets==5.14.3 transformers==4.54.0 triton==3.3.1 typer==0.16.0 -typing-extensions==4.14.1 -typing-inspection==0.4.1 +typing-extensions==4.15.0 +typing-inspection==0.4.2 tzdata==2025.2 urllib3==2.5.0 -uvicorn==0.35.0 +uvicorn==0.38.0 uvloop==0.21.0 virtualenv==20.33.1 vllm==0.10.0 wandb==0.21.1 watchfiles==1.1.0 wcwidth==0.2.13 +websocket-client==1.9.0 websockets==15.0.1 werkzeug==3.1.3 wrapt==1.17.2 +wsproto==1.2.0 xformers==0.0.31 xgrammar==0.1.21 xxhash==3.5.0 -yarl==1.20.1 +yarl==1.22.0 zipp==3.23.0 debugpy>=1.8.0 \ No newline at end of file From bb5d884a941a0760ec26ca8b50f9c31b9fcea29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Tue, 11 Nov 2025 19:01:20 +0800 Subject: [PATCH 009/462] fix sms sender --- astune/main_trinity.py | 2 +- astune/main_verl.py | 2 +- astune/main_vllm.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/main_trinity.py b/astune/main_trinity.py index 4420c067..bccc0ea9 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -174,7 +174,7 @@ def run(config_path: str, dlc: bool = False, plugin_dir: str = None): from dotenv import load_dotenv load_dotenv(".env") - atexit.register(lambda: send_train_message("Trinity Exit")) + atexit.register(lambda: send_train_message("0000")) if plugin_dir: os.environ[PLUGIN_DIRS_ENV_VAR] = plugin_dir diff --git a/astune/main_verl.py b/astune/main_verl.py index f8dbf5b2..6280e3e1 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -78,7 +78,7 @@ def run_ppo(config) -> None: num_cpus=config.ray_init.num_cpus, ) - atexit.register(lambda: send_train_message("Verl Exit")) + atexit.register(lambda: send_train_message("0000")) atexit.register(lambda: ray.shutdown()) # ray shutdown on exit # Create a remote instance of the TaskRunner class, and diff --git a/astune/main_vllm.py b/astune/main_vllm.py index bd984b85..aec0fd6f 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -136,5 +136,5 @@ def companion_launch(): run(config) if __name__ == "__main__": - atexit.register(send_train_message, "Debug Exit") + atexit.register(lambda: send_train_message("0000")) main() From 902fdfe65e3423e8c1c0f4cc5506b06aedaf0431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Tue, 11 Nov 2025 16:21:02 +0800 Subject: [PATCH 010/462] =?UTF-8?q?=E8=AE=AD=E7=BB=83=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E6=97=B6=E5=90=91=E6=89=8B=E6=9C=BA=E5=8F=91=E9=80=81=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astune/main_vllm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astune/main_vllm.py b/astune/main_vllm.py index ceca3660..8d0394cb 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -157,5 +157,5 @@ def companion_launch(): run(config) if __name__ == "__main__": - atexit.register(send_train_message, "Debug Exit") + atexit.register(lambda: send_train_message("0000")) main() From 59248c31a728fefea0c3b6d18a82b20538080068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Tue, 11 Nov 2025 19:05:54 +0800 Subject: [PATCH 011/462] global rename --- astune/agentscope_flow.py | 34 +++++++++++------------ astune/backbone_verl/trainer.py | 2 +- astune/context_manager/cmt_agentscope.py | 8 +++--- astune/default_config/default.yaml | 2 +- astune/main_verl.py | 4 +-- astune/protocol/agentscope_protocol.py | 4 +-- astune/task_judge/math_answer_as_judge.py | 2 +- scripts/tar_and_copy.sh | 6 ++-- scripts/untar.sh | 2 +- tutorial/appworld.py | 14 +++++----- tutorial/math_agent.md | 6 ++-- tutorial/math_agent.py | 10 +++---- 12 files changed, 47 insertions(+), 47 deletions(-) diff --git a/astune/agentscope_flow.py b/astune/agentscope_flow.py index 375a56e6..8d26195b 100644 --- a/astune/agentscope_flow.py +++ b/astune/agentscope_flow.py @@ -11,7 +11,7 @@ from astune.context_manager.cmt_linear import replace_token_ids, CMTLinear from astune.schema.trajectory import Sample, Reward from typing import Any, Dict, List, Union, Tuple -from astune.context_manager.cmt_agentscope import BeyondAgentProxy +from astune.context_manager.cmt_agentscope import ASTuneProxy from astune.schema.task import Task, TaskLaunchCoreArgument log_generate_lock = threading.Lock() @@ -57,11 +57,11 @@ def generated_token_callback_fn(token_array): with log_generate_lock: obs_window['token'][task_thread_index] += len(token_array) - beyondagent_proxy = BeyondAgentProxy( + astune_proxy = ASTuneProxy( llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, config=self.config, - model_name='beyondagent-proxy', + model_name='astune-proxy', api_key='dummy-api-key', task_batch_index=task_batch_index, task_tag=task_tag, @@ -71,14 +71,14 @@ def generated_token_callback_fn(token_array): generated_token_callback_fn=generated_token_callback_fn, ) - beyondagent_proxy.update_agentscope_input_dictionary(task_core_arg=task_core_arg) - beyondagent_proxy = asyncio.run(agentscope_protocol.agentscope_execute(init_messages, beyondagent_proxy, self.config)) - beyondagent_proxy.update_judge_input_dictionary(task_core_arg=task_core_arg) - beyondagent_proxy.update_judge_input_dictionary(env=env) - beyondagent_proxy.update_judge_input_dictionary(grouped_steps=beyondagent_proxy.grouped_steps) + astune_proxy.update_agentscope_input_dictionary(task_core_arg=task_core_arg) + astune_proxy = asyncio.run(agentscope_protocol.agentscope_execute(init_messages, astune_proxy, self.config)) + astune_proxy.update_judge_input_dictionary(task_core_arg=task_core_arg) + astune_proxy.update_judge_input_dictionary(env=env) + astune_proxy.update_judge_input_dictionary(grouped_steps=astune_proxy.grouped_steps) - raw_reward, is_success = beyondagent_proxy.get_judge().compute_reward( - beyondagent_proxy.get_judge_input_dictionary() + raw_reward, is_success = astune_proxy.get_judge().compute_reward( + astune_proxy.get_judge_input_dictionary() ) # evaluate @@ -89,14 +89,14 @@ def generated_token_callback_fn(token_array): madness=0, description="" ) - beyondagent_proxy.process_reward(reward) + astune_proxy.process_reward(reward) # generate token before merging - beyondagent_proxy.remove_last_context() - beyondagent_proxy.task_id = task_id - beyondagent_proxy.task_tag = task_tag - beyondagent_proxy.group_merge() - beyondagent_proxy.process_reward(reward) - return beyondagent_proxy + astune_proxy.remove_last_context() + astune_proxy.task_id = task_id + astune_proxy.task_tag = task_tag + astune_proxy.group_merge() + astune_proxy.process_reward(reward) + return astune_proxy diff --git a/astune/backbone_verl/trainer.py b/astune/backbone_verl/trainer.py index 5b4d6563..9684032f 100644 --- a/astune/backbone_verl/trainer.py +++ b/astune/backbone_verl/trainer.py @@ -458,7 +458,7 @@ def compute_advantage( return data -class BeyondAgentRayPPOTrainer: +class ASTuneRayPPOTrainer: """Distributed PPO trainer using Ray for scalable reinforcement learning. This trainer orchestrates distributed PPO training across multiple nodes and GPUs, diff --git a/astune/context_manager/cmt_agentscope.py b/astune/context_manager/cmt_agentscope.py index ca1b4a97..d977996f 100644 --- a/astune/context_manager/cmt_agentscope.py +++ b/astune/context_manager/cmt_agentscope.py @@ -54,7 +54,7 @@ def adjust_color_hsl(base_color, logprob): return f"#{int(r_adjusted*255):02x}{int(g_adjusted*255):02x}{int(b_adjusted*255):02x}" -class BeyondAgentContextTemplate(CMTLinear): +class ASTuneContextTemplate(CMTLinear): def __init__(self, llm_chat_fn, tokenizer, config, env_step_fn, should_interrupt_fn, generated_token_callback_fn, **kwargs): super().__init__(config, tokenizer) @@ -251,7 +251,7 @@ def check_context_token_num_safe(self, messages: List[dict]) -> Tuple[bool, str] return False, "token_overflow" -class BeyondAgentLmProxy(BeyondAgentContextTemplate): +class ASTuneLmProxy(ASTuneContextTemplate): async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: # load messages into `self.full_context` @@ -296,7 +296,7 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], logger.warning(f"[{info}] detected. Current token count exceeds the limit.") self.context_overflow = True return ChatResponse( - content = [{'type': 'text', 'text': 'beyondagent_proxy:[context_overflow]'}] + content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] ) llm_output = self.llm_chat_fn(messages, custom_sampling_params) @@ -410,7 +410,7 @@ async def _parse_dashscope_generation_response( return parsed_response -class BeyondAgentProxy(BeyondAgentLmProxy): +class ASTuneProxy(ASTuneLmProxy): """ A proxy class that bridge: - environment diff --git a/astune/default_config/default.yaml b/astune/default_config/default.yaml index ae62dad9..51789b86 100644 --- a/astune/default_config/default.yaml +++ b/astune/default_config/default.yaml @@ -125,7 +125,7 @@ actor_rollout_ref: enforce_eager: True log_prob_micro_batch_size_per_gpu: 4 multi_turn: - completion_callback: beyondagent.module.trainer.simple_completion_callback.SimpleCompletionCallback + completion_callback: astune.module.trainer.simple_completion_callback.SimpleCompletionCallback enable: True format: llama3_json max_steps: 30 diff --git a/astune/main_verl.py b/astune/main_verl.py index 6280e3e1..1443b1a3 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -247,9 +247,9 @@ def run(self, config): train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from astune.backbone_verl.trainer import BeyondAgentRayPPOTrainer + from astune.backbone_verl.trainer import ASTuneRayPPOTrainer # Initialize the PPO trainer. - trainer = BeyondAgentRayPPOTrainer( + trainer = ASTuneRayPPOTrainer( config=config, tokenizer=tokenizer, processor=processor, diff --git a/astune/protocol/agentscope_protocol.py b/astune/protocol/agentscope_protocol.py index dc38d0f8..b66d2ac3 100644 --- a/astune/protocol/agentscope_protocol.py +++ b/astune/protocol/agentscope_protocol.py @@ -1,7 +1,7 @@ from agentscope.message import Msg from pydantic import BaseModel, Field from typing import Callable, List -try: from astune.agentscope_flow import BeyondAgentProxy +try: from astune.agentscope_flow import ASTuneProxy except ImportError: pass class AgentScopeLearnProtocol(BaseModel): @@ -21,6 +21,6 @@ class AgentScopeLearnProtocol(BaseModel): # Other settings multiturn_token_consolidation: bool = Field(default=True) - async def agentscope_execute(self, init_messages, beyondagent_proxy: "BeyondAgentProxy", config)->"BeyondAgentProxy": + async def agentscope_execute(self, init_messages, astune_proxy: "ASTuneProxy", config)->"ASTuneProxy": raise NotImplementedError diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index 4d6ee9da..65d22d13 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -12,7 +12,7 @@ def compute_reward(self, judge_input_dictionary) -> tuple: # judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) raw_reward = 0 - final_answer = judge_input_dictionary['final_answer'] # 默认没有final_answer,需要在workflow中手动调用 beyondagent_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 + final_answer = judge_input_dictionary['final_answer'] # 默认没有final_answer,需要在workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 task_core_arg = judge_input_dictionary['task_core_arg'] reference_answer = task_core_arg.task.metadata['answer'] reference_answer = reference_answer.split('####')[-1].strip() diff --git a/scripts/tar_and_copy.sh b/scripts/tar_and_copy.sh index d898b57e..9cf1a591 100755 --- a/scripts/tar_and_copy.sh +++ b/scripts/tar_and_copy.sh @@ -1,4 +1,4 @@ cd ../ -gtar -cvzf BeyondAgent.tar.gz BeyondAgent -#scp BeyondAgent.tar.gz jinli.yl@11.160.132.45:/home/jinli.yl/jinli_mnt2/workspace/ -scp -P 1016 BeyondAgent.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ \ No newline at end of file +gtar -cvzf ASTune.tar.gz ASTune +#scp ASTune.tar.gz jinli.yl@11.160.132.45:/home/jinli.yl/jinli_mnt2/workspace/ +scp -P 1016 ASTune.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ \ No newline at end of file diff --git a/scripts/untar.sh b/scripts/untar.sh index 4007e209..c8a7c8af 100644 --- a/scripts/untar.sh +++ b/scripts/untar.sh @@ -1 +1 @@ -rm -rf BeyondAgent && tar -xzvf BeyondAgent.tar.gz \ No newline at end of file +rm -rf ASTune && tar -xzvf ASTune.tar.gz \ No newline at end of file diff --git a/tutorial/appworld.py b/tutorial/appworld.py index b5a91807..c570f2aa 100644 --- a/tutorial/appworld.py +++ b/tutorial/appworld.py @@ -1,4 +1,4 @@ -from astune.agentscope_flow import BeyondAgentProxy +from astune.agentscope_flow import ASTuneProxy from agentscope.message import Msg from pydantic import BaseModel, Field from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol @@ -7,7 +7,7 @@ class ExampleAgentScopeLearnProtocol(AgentScopeLearnProtocol): trainer: str = Field(default="agentscorpion-trinity") - async def agentscope_execute(self, init_messages, beyondagent_proxy: BeyondAgentProxy, config): + async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config): from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -21,8 +21,8 @@ async def agentscope_execute(self, init_messages, beyondagent_proxy: BeyondAgent agent = ReActAgent( name="Qwen", sys_prompt=first_msg['content'], - model=beyondagent_proxy, # type: ignore - # model=beyondagent_proxy: use beyondagent_proxy as model + model=astune_proxy, # type: ignore + # model=astune_proxy: use astune_proxy as model formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), toolkit=None, @@ -34,12 +34,12 @@ async def agentscope_execute(self, init_messages, beyondagent_proxy: BeyondAgent # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol - obs, _, terminate, _ = beyondagent_proxy.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) + obs, _, terminate, _ = astune_proxy.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? if terminate: break - if beyondagent_proxy.context_overflow: break + if astune_proxy.context_overflow: break - return beyondagent_proxy + return astune_proxy diff --git a/tutorial/math_agent.md b/tutorial/math_agent.md index 5649622f..3c1d5903 100644 --- a/tutorial/math_agent.md +++ b/tutorial/math_agent.md @@ -45,7 +45,7 @@ self.toolkit.register_tool_function(execute_python_code) self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=beyondagent_proxy, # type: ignore + model=astune_proxy, # type: ignore formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -57,7 +57,7 @@ result = await self.agent.reply(msg, structured_model=FinalResult) - 在 AgentScope Workflow 中,注册评价函数需要的任意关键数据 ```python -beyondagent_proxy.update_judge_input_dictionary(final_answer=final_answer) +astune_proxy.update_judge_input_dictionary(final_answer=final_answer) ``` @@ -71,7 +71,7 @@ Judge的输入参数包含: judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) judge_input_dictionary['task_core_arg']: 任务信息(如果里面包含了参考答案,可以从中取出) judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) -judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 beyondagent_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 +judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 ``` Judge的返回值: raw_reward, is_success diff --git a/tutorial/math_agent.py b/tutorial/math_agent.py index 084601b1..bb481285 100644 --- a/tutorial/math_agent.py +++ b/tutorial/math_agent.py @@ -1,4 +1,4 @@ -from astune.agentscope_flow import BeyondAgentProxy +from astune.agentscope_flow import ASTuneProxy from agentscope.message import Msg from pydantic import BaseModel, Field from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol @@ -36,7 +36,7 @@ class ExampleMathLearn(AgentScopeLearnProtocol): trainer: str = Field(default="agentscorpion-trinity") - async def agentscope_execute(self, init_messages, beyondagent_proxy: BeyondAgentProxy, config): + async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config): from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -55,7 +55,7 @@ async def agentscope_execute(self, init_messages, beyondagent_proxy: BeyondAgent self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=beyondagent_proxy, # type: ignore + model=astune_proxy, # type: ignore formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -63,7 +63,7 @@ async def agentscope_execute(self, init_messages, beyondagent_proxy: BeyondAgent msg = Msg("user", init_messages[0]['content'], role="user") result = await self.agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) - beyondagent_proxy.update_judge_input_dictionary(final_answer=final_answer) + astune_proxy.update_judge_input_dictionary(final_answer=final_answer) - return beyondagent_proxy + return astune_proxy From f83622fc0f545f9f669f3673ca7a1e36a813e661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Tue, 11 Nov 2025 19:31:59 +0800 Subject: [PATCH 012/462] move modules to better places --- astune/parallel_env.py | 179 +---------------- astune/protocol/agentscope_protocol.py | 3 +- astune/task_rollout/async_llm_bridge.py | 181 ++++++++++++++++++ astune/{env.py => task_rollout/env_worker.py} | 95 +++++---- .../agentscope_flow.py | 2 +- astune/workflow_controller/basic_agentflow.py | 22 +++ .../classic_agentflow.py} | 20 +- tutorial/appworld.py | 2 +- tutorial/math_agent.py | 2 +- 9 files changed, 274 insertions(+), 232 deletions(-) create mode 100644 astune/task_rollout/async_llm_bridge.py rename astune/{env.py => task_rollout/env_worker.py} (74%) rename astune/{ => workflow_controller}/agentscope_flow.py (98%) create mode 100644 astune/workflow_controller/basic_agentflow.py rename astune/{agent_flow.py => workflow_controller/classic_agentflow.py} (89%) diff --git a/astune/parallel_env.py b/astune/parallel_env.py index aadd750a..085ac49e 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -14,22 +14,20 @@ from tqdm import tqdm from verl import DataProto from verl.utils.torch_functional import pad_sequence_to_length -from astune.agent_flow import AgentFlow -from astune.agent_flow import BaseAgentFlow -from astune.env import EnvWorker +from astune.workflow_controller.classic_agentflow import AgentFlow +from astune.workflow_controller.classic_agentflow import BaseAgentFlow +from astune.task_rollout.env_worker import EnvWorker from astune.schema.task import Task, TaskLaunchCoreArgument from astune.schema.trajectory import Sample from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr -from beast_logger import register_logger, print_dict, print_listofdict -from astune.agentscope_flow import AgentScopeWorkflow +from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow from astune.utils.utils import run_async_coro__no_matter_what from astune.schema.logprob import TokenAndProb - -from pydantic import BaseModel, Field - +from astune.task_rollout.async_llm_bridge import AsyncLlmBridge def init_logger(experiment_name): """Initialize the logger with the given configuration.""" + from beast_logger import register_logger if 'BEST_LOGGER_INIT' in os.environ: return # prevent re-initialization in ray environment os.environ['BEST_LOGGER_INIT'] = '1' from datetime import datetime @@ -38,7 +36,8 @@ def init_logger(experiment_name): non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] register_logger(mods=["evaluation", "exception"], non_console_mods=non_console_mods, auto_clean_mods=[], base_log_path=final_log_path, debug=False) -class AsyncLlmBridge(object): + +class StepPrinter(AsyncLlmBridge): def __init__(self, config: DictConfig, async_rollout_manager, max_parallel: int, max_llm_retries: int = 3, tokenizer: "AutoTokenizer"=None, llm_mode= "local", **kwargs): @@ -49,182 +48,25 @@ def __init__(self, config: DictConfig, async_rollout_manager, max_parallel: int, self.async_rollout_manager = async_rollout_manager self.max_parallel: int = max_parallel self.max_llm_retries: int = max_llm_retries - self.rollout_n = config.astune.rollout.num_repeat - # self.model_name = self.async_rollout_manager.chat_scheduler.model_name self.tokenizer = tokenizer self.pad_token_id = self.tokenizer.pad_token_id self.current_token = 0 self.current_global_steps = "NA" - def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: - def llm_chat(messages: List[Dict[str, str]], - custom_sampling_params: dict = {}, - request_id: str = "") -> dict: - """ - input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] - output messages: [{"role": "assistant", "value": "..."}] - """ - # TODO: sending sampling_params to rollout server - updated_sampling_params = {} - if sampling_params: - updated_sampling_params.update(sampling_params) - if custom_sampling_params: - updated_sampling_params.update(custom_sampling_params) - - tools = messages[-1].get("tools", None) - for msg in messages: msg.pop("tools", None) - - # updated_sampling_params.update({"logprobs": 1, "prompt_logprobs": 1}) - input_messages = copy.deepcopy(messages) - request_id = uuid.uuid4().hex - if tools is not None: - prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True, tools=tools) - else: - prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True) - - final_res = run_async_coro__no_matter_what(self.async_rollout_manager.generate( - request_id=request_id, - prompt_ids=prompt_ids, - sampling_params=updated_sampling_params, - ) - ) - - if self.config.astune.rollout.name == 'vllm': - token_array = final_res.outputs[0].token_ids - elif self.config.astune.rollout.name == 'sglang': - token_array = final_res - - decoded_text = self.tokenizer.decode(token_array) # type: ignore - # decoded_text = "Let's start by finding which API we need to use to interact with Simple Note.\n\nCode: - # ```python\nprint(apis.api_docs.show_api_descriptions(app_name='simple_note'))\n```<|im_end|>" - if decoded_text.endswith('<|im_end|>'): - decoded_text = decoded_text[:-len('<|im_end|>')] - # assert prompt_ids == final_res.prompt_token_ids - # assert final_res.outputs[0].text == decoded_text - # a = self.tokenizer.apply_chat_template( - # input_messages + [{"role": "assistant", "content": decoded_text}], - # add_generation_prompt=False, tokenize=True) - # b = prompt_ids + token_array - # assert all([aa==bb for aa,bb in zip(a,b)]) - return { - "role": "assistant", - "request_id": request_id, - "content": decoded_text, - "tokens": [ - TokenAndProb( - token_id=token, - logprob=-1, - decoded_string=self.tokenizer.decode(token) - ) - for token in token_array # type: ignore - ] - } - - def llm_chat_remote(messages: List[Dict[str, str]], - custom_sampling_params: dict = {}, - request_id: str = "") -> dict: - """ - input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] - output messages: [{"role": "assistant", "value": "..."}] - """ - updated_sampling_params = {} - if sampling_params: - updated_sampling_params.update(sampling_params) - if custom_sampling_params: - updated_sampling_params.update(custom_sampling_params) - updated_sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) - input_messages = copy.deepcopy(messages) - for i in range(self.max_llm_retries): - try: - output_message = self.async_rollout_manager.submit_chat_completions(messages=input_messages, - sampling_params=updated_sampling_params, - request_id=request_id) - break - except Exception as e: - logger.bind(exception=True).exception(f"rollout_server.{i} error: {e.args}") - time.sleep(i + 1) - return output_message[-1] # type: ignore - - def llm_chat_trinity(messages: List[Dict[str, str]], - custom_sampling_params: dict = {}, - request_id: str = "") -> dict: - """ - input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] - output messages: [{"role": "assistant", "value": "..."}] - """ - async def main(model_client): - updated_sampling_params = {} - if sampling_params: - updated_sampling_params.update(sampling_params) - if custom_sampling_params: - updated_sampling_params.update(custom_sampling_params) - updated_sampling_params.pop('min_tokens') - - tools = messages[-1].get("tools", None) - for msg in messages: msg.pop("tools", None) - - response = await model_client.chat.completions.create( - model=model_client.model_path, - messages=messages, - logprobs=True, - tools=tools, - top_logprobs=0, - **updated_sampling_params - ) - return response - - assert hasattr(self, 'trinity_llm_model_client'), "trinity_llm_model_client is not set in AsyncLlmBridge" - response = run_async_coro__no_matter_what(main(self.trinity_llm_model_client)) # type: ignore - - content = response.choices[0].message.content - message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) - if content is None: - # from vsdb import bp; bp("H2") - content = "" - return { - "role": "assistant", - "request_id": response.id, - "content": content, - "tool_calls": message.get("tool_calls", None), - "tokens": [ - TokenAndProb( - token_id=token, - logprob=tokenlogprob.logprob, - decoded_string=tokenlogprob.token - ) - for tokenlogprob, token in zip( - response.choices[0].logprobs.content, - response.choices[0].token_ids - ) - ] - } - - if self.llm_mode == "remote": - return llm_chat_remote - if self.llm_mode == "trinity": - return llm_chat_trinity - else: - return llm_chat - - -class StepPrinter(AsyncLlmBridge): - def step_status_printer(self, obs_window): - # 直方数据,tmux 0~10 数量 10~20 数量 20~30 数量 30~40 数量 …… + # histgram: obs_window['step'] 0~10 / 10~20 / 20~30 / 30~40 / ...... step_counter = {} - current_token = sum(obs_window['token']) current_time = time.time() delta_token = current_token - self.current_token - if delta_token < 0: delta_token = current_token # 下一次rollout开始了,tmux['token']会清零,简单处理一下就好 + if delta_token < 0: delta_token = current_token # when next rollout begins, obs_window['token'] should reset delta_time = current_time - self.current_token_count_time self.current_token = current_token self.current_token_count_time = current_time token_gen_per_sec_str = f"{delta_token/delta_time:.2f} tokens/s" if delta_time > 0 else "N/A" - for step in obs_window['step']: if step == -1: step_counter[(-1, 'terminated')] = step_counter.get((-1, 'terminated'), 0) + 1 @@ -234,7 +76,6 @@ def step_status_printer(self, obs_window): end = start + 5 step_counter[(start, end)] = step_counter.get((start, end), 0) + 1 - # sort by start value (small to large) step_counter = dict(sorted(step_counter.items(), key=lambda x: x[0][0])) print_buf = [] diff --git a/astune/protocol/agentscope_protocol.py b/astune/protocol/agentscope_protocol.py index b66d2ac3..abcb46a1 100644 --- a/astune/protocol/agentscope_protocol.py +++ b/astune/protocol/agentscope_protocol.py @@ -1,8 +1,7 @@ from agentscope.message import Msg from pydantic import BaseModel, Field from typing import Callable, List -try: from astune.agentscope_flow import ASTuneProxy -except ImportError: pass +from astune.workflow_controller.agentscope_flow import ASTuneProxy class AgentScopeLearnProtocol(BaseModel): model_config = {"extra": "allow"} diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py new file mode 100644 index 00000000..2c58201d --- /dev/null +++ b/astune/task_rollout/async_llm_bridge.py @@ -0,0 +1,181 @@ +import os +import copy +import time +import numpy as np +import torch +import uuid +import asyncio +from concurrent.futures import ThreadPoolExecutor +from typing import Dict, List, Literal, Callable, Any +from loguru import logger +from omegaconf import DictConfig +from tensordict import TensorDict +from torch.nn.utils.rnn import pad_sequence +from tqdm import tqdm +from verl import DataProto +from verl.utils.torch_functional import pad_sequence_to_length +from astune.workflow_controller.classic_agentflow import AgentFlow +from astune.workflow_controller.classic_agentflow import BaseAgentFlow +from astune.task_rollout.env_worker import EnvWorker +from astune.schema.task import Task, TaskLaunchCoreArgument +from astune.schema.trajectory import Sample +from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr +from beast_logger import register_logger, print_dict, print_listofdict +from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow +from astune.utils.utils import run_async_coro__no_matter_what +from astune.schema.logprob import TokenAndProb + +class AsyncLlmBridge(object): + + + def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: + def llm_chat(messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + request_id: str = "") -> dict: + """ + input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] + output messages: [{"role": "assistant", "value": "..."}] + """ + # TODO: sending sampling_params to rollout server + updated_sampling_params = {} + if sampling_params: + updated_sampling_params.update(sampling_params) + if custom_sampling_params: + updated_sampling_params.update(custom_sampling_params) + + tools = messages[-1].get("tools", None) + for msg in messages: msg.pop("tools", None) + + # updated_sampling_params.update({"logprobs": 1, "prompt_logprobs": 1}) + input_messages = copy.deepcopy(messages) + request_id = uuid.uuid4().hex + if tools is not None: + prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True, tools=tools) + else: + prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True) + + final_res = run_async_coro__no_matter_what(self.async_rollout_manager.generate( + request_id=request_id, + prompt_ids=prompt_ids, + sampling_params=updated_sampling_params, + ) + ) + + if self.config.astune.rollout.name == 'vllm': + token_array = final_res.outputs[0].token_ids + elif self.config.astune.rollout.name == 'sglang': + token_array = final_res + + decoded_text = self.tokenizer.decode(token_array) # type: ignore + # decoded_text = "Let's start by finding which API we need to use to interact with Simple Note.\n\nCode: + # ```python\nprint(apis.api_docs.show_api_descriptions(app_name='simple_note'))\n```<|im_end|>" + if decoded_text.endswith('<|im_end|>'): + decoded_text = decoded_text[:-len('<|im_end|>')] + # assert prompt_ids == final_res.prompt_token_ids + # assert final_res.outputs[0].text == decoded_text + # a = self.tokenizer.apply_chat_template( + # input_messages + [{"role": "assistant", "content": decoded_text}], + # add_generation_prompt=False, tokenize=True) + # b = prompt_ids + token_array + # assert all([aa==bb for aa,bb in zip(a,b)]) + return { + "role": "assistant", + "request_id": request_id, + "content": decoded_text, + "tokens": [ + TokenAndProb( + token_id=token, + logprob=-1, + decoded_string=self.tokenizer.decode(token) + ) + for token in token_array # type: ignore + ] + } + + def llm_chat_remote(messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + request_id: str = "") -> dict: + """ + input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] + output messages: [{"role": "assistant", "value": "..."}] + """ + updated_sampling_params = {} + if sampling_params: + updated_sampling_params.update(sampling_params) + if custom_sampling_params: + updated_sampling_params.update(custom_sampling_params) + updated_sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) + input_messages = copy.deepcopy(messages) + for i in range(self.max_llm_retries): + try: + output_message = self.async_rollout_manager.submit_chat_completions(messages=input_messages, + sampling_params=updated_sampling_params, + request_id=request_id) + break + except Exception as e: + logger.bind(exception=True).exception(f"rollout_server.{i} error: {e.args}") + time.sleep(i + 1) + return output_message[-1] # type: ignore + + def llm_chat_trinity(messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + request_id: str = "") -> dict: + """ + input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] + output messages: [{"role": "assistant", "value": "..."}] + """ + async def main(model_client): + updated_sampling_params = {} + if sampling_params: + updated_sampling_params.update(sampling_params) + if custom_sampling_params: + updated_sampling_params.update(custom_sampling_params) + updated_sampling_params.pop('min_tokens') + + tools = messages[-1].get("tools", None) + for msg in messages: msg.pop("tools", None) + + response = await model_client.chat.completions.create( + model=model_client.model_path, + messages=messages, + logprobs=True, + tools=tools, + top_logprobs=0, + **updated_sampling_params + ) + return response + + assert hasattr(self, 'trinity_llm_model_client'), "trinity_llm_model_client is not set in AsyncLlmBridge" + response = run_async_coro__no_matter_what(main(self.trinity_llm_model_client)) # type: ignore + + content = response.choices[0].message.content + message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) + if content is None: + # from vsdb import bp; bp("H2") + content = "" + return { + "role": "assistant", + "request_id": response.id, + "content": content, + "tool_calls": message.get("tool_calls", None), + "tokens": [ + TokenAndProb( + token_id=token, + logprob=tokenlogprob.logprob, + decoded_string=tokenlogprob.token + ) + for tokenlogprob, token in zip( + response.choices[0].logprobs.content, + response.choices[0].token_ids + ) + ] + } + + if self.llm_mode == "remote": + return llm_chat_remote + if self.llm_mode == "trinity": + return llm_chat_trinity + else: + return llm_chat + + diff --git a/astune/env.py b/astune/task_rollout/env_worker.py similarity index 74% rename from astune/env.py rename to astune/task_rollout/env_worker.py index 68fb07ae..3b6c498e 100644 --- a/astune/env.py +++ b/astune/task_rollout/env_worker.py @@ -1,15 +1,11 @@ -import uuid -import random - -from omegaconf import DictConfig -from astune.env_service_client.env_client_ng import EnvClient as EnvClientNg -from astune.agent_flow import AgentFlow -from astune.context_manager.cmt_linear import CMTLinear from loguru import logger from typing import List, Union -from astune.agentscope_flow import AgentScopeWorkflow -from astune.agent_flow import AgentFlow -from astune.agent_flow import BaseAgentFlow +from omegaconf import DictConfig +from astune.workflow_controller.classic_agentflow import AgentFlow +from astune.workflow_controller.classic_agentflow import BaseAgentFlow +from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow +from astune.context_manager.cmt_linear import CMTLinear +from astune.env_service_client.env_client_ng import EnvClient as EnvClientNg class EnvWorker(object): @@ -31,54 +27,35 @@ def __init__(self, task_core_arg, config: DictConfig): self.llm_chat_fn = task_core_arg.llm_chat_fn self.obs_window = task_core_arg.obs_window + def execute(self) -> CMTLinear: + """Choose between classic `AgentFlow` controller and `AgentScopeWorkflow` controller + """ # >>>>>>>>>>>>>> create - if self.config.astune.task_reader.type == 'env_service': - try: - init_response = self.env.create_instance( - env_type=self.env_type, - task_id=self.task_id, - instance_id=self.task_core_arg.task_env_uuid, - params=self.env_params - ) - state_message: dict = init_response["state"] - _, init_messages = self.get_init_messages(state_message) - except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.create_instance~ error={e.args}") - self.env.release_instance(self.task_core_arg.task_env_uuid) - raise e - else: - task = self.task_core_arg.task - if task.init_messages: - init_messages = task.init_messages - else: - assert task.main_query, "You must provide init_messages or main_query in task." - init_messages = [{"role": "user", "content": task.main_query}] + init_messages = self._initialize_environment_and_messages() - # =============== simulate + # >>>>>>>>>>>>>> simulate try: - if not self.config.astune.rollout.use_agentscope_protocol: agent_flow: BaseAgentFlow = AgentFlow(llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, config=self.config) else: agent_flow: BaseAgentFlow = AgentScopeWorkflow(llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, config=self.config) - cmt = agent_flow.execute( init_messages=init_messages, env=self.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] task_core_arg=self.task_core_arg ) - cmt.task_batch_index = self.task_core_arg.task_batch_index - cmt.task_tag = self.task_core_arg.task_tag - cmt.task_id = self.task_id - except Exception as e: logger.bind(exception=True).exception(f"encounter exception in env_worker.agent_flow~ error={e.args}") if self.env: self.env.release_instance(self.task_core_arg.task_env_uuid) raise e - # <<<<<<<<<<<<<< destory + cmt.task_batch_index = self.task_core_arg.task_batch_index + cmt.task_tag = self.task_core_arg.task_tag + cmt.task_id = self.task_id + + # >>>>>>>>>>>>>> destory try: if self.env: self.env.release_instance(self.task_core_arg.task_env_uuid) except Exception as e: @@ -88,7 +65,45 @@ def execute(self) -> CMTLinear: return cmt - def get_init_messages(self, state_message) -> tuple: + def _initialize_environment_and_messages(self) -> List[dict]: + """ + Initialize environment instance and setup initial messages. + + Returns: + List[dict]: Initial messages for the agent flow + + Raises: + Exception: If environment creation fails or required task data is missing + """ + if self.config.astune.task_reader.type == 'env_service': + if self.env is None: + raise ValueError("Environment client is None but env_service type is specified") + try: + init_response = self.env.create_instance( + env_type=self.env_type, + task_id=self.task_id, + instance_id=self.task_core_arg.task_env_uuid, + params=self.env_params + ) + state_message: dict = init_response["state"] + _, init_messages = self._get_init_messages(state_message) + except Exception as e: + logger.bind(exception=True).exception(f"encounter exception in env_worker.create_instance~ error={e.args}") + if self.env is not None: + self.env.release_instance(self.task_core_arg.task_env_uuid) + raise e + else: + task = self.task_core_arg.task + if task.init_messages: + init_messages = task.init_messages + else: + assert task.main_query, "You must provide init_messages or main_query in task." + init_messages = [{"role": "user", "content": task.main_query}] + + return init_messages + + + def _get_init_messages(self, state_message) -> tuple: """ Process state_message to extract query and init_messages. diff --git a/astune/agentscope_flow.py b/astune/workflow_controller/agentscope_flow.py similarity index 98% rename from astune/agentscope_flow.py rename to astune/workflow_controller/agentscope_flow.py index 8d26195b..d30cfb05 100644 --- a/astune/agentscope_flow.py +++ b/astune/workflow_controller/agentscope_flow.py @@ -4,7 +4,7 @@ import copy import asyncio from astune.env_service_client.env_client import EnvClient -from astune.agent_flow import BaseAgentFlow +from astune.workflow_controller.basic_agentflow import BaseAgentFlow from astune.schema.trajectory import Reward, Trajectory from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol diff --git a/astune/workflow_controller/basic_agentflow.py b/astune/workflow_controller/basic_agentflow.py new file mode 100644 index 00000000..75fbb691 --- /dev/null +++ b/astune/workflow_controller/basic_agentflow.py @@ -0,0 +1,22 @@ +from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage +from astune.context_manager.cmt_linear_think import LinearThinkCMT +from typing import Any, Dict, List, Union, Callable + +class BaseAgentFlow(object): + + def __init__(self, + llm_chat_fn: Callable, + tokenizer: Any, + config, + **kwargs): + self.tokenizer = tokenizer + self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") + self.response_template_ids = self.tokenizer.encode("<|im_start|>assistant\n") + self.cmt: Union[CMTLinear, LinearThinkCMT, Any, None] = None + self.alien_llm_chat_fn: Union[Callable, None] = None + self.llm_chat_fn: Callable = llm_chat_fn + self.config = config + # self.console_debug_mode: bool = False + self.max_steps: int = self.config.astune.rollout.multi_turn.max_steps + self.max_model_len: int = self.config.astune.rollout.max_model_len + self.max_env_len: int = self.config.astune.rollout.max_env_len \ No newline at end of file diff --git a/astune/agent_flow.py b/astune/workflow_controller/classic_agentflow.py similarity index 89% rename from astune/agent_flow.py rename to astune/workflow_controller/classic_agentflow.py index 8f48957e..28b263d2 100644 --- a/astune/agent_flow.py +++ b/astune/workflow_controller/classic_agentflow.py @@ -9,30 +9,14 @@ from astune.context_manager.cmt_linear_think import LinearThinkCMT from astune.context_manager.cmt_context_clip import SelfContextClipCMT from astune.context_manager.cmt_sliding_window import SlidingWindowCMT +from astune.workflow_controller.basic_agentflow import BaseAgentFlow from typing import Any, Dict, List, Union, Callable from beast_logger import print_listofdict import threading log_generate_lock = threading.Lock() -class BaseAgentFlow(object): - - def __init__(self, - llm_chat_fn: Callable, - tokenizer: Any, - config, - **kwargs): - self.tokenizer = tokenizer - self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") - self.response_template_ids = self.tokenizer.encode("<|im_start|>assistant\n") - self.cmt: Union[CMTLinear, LinearThinkCMT, Any, None] = None - self.alien_llm_chat_fn: Union[Callable, None] = None - self.llm_chat_fn: Callable = llm_chat_fn - self.config = config - # self.console_debug_mode: bool = False - self.max_steps: int = self.config.astune.rollout.multi_turn.max_steps - self.max_model_len: int = self.config.astune.rollout.max_model_len - self.max_env_len: int = self.config.astune.rollout.max_env_len + class AgentFlow(BaseAgentFlow): diff --git a/tutorial/appworld.py b/tutorial/appworld.py index c570f2aa..071ed425 100644 --- a/tutorial/appworld.py +++ b/tutorial/appworld.py @@ -1,4 +1,4 @@ -from astune.agentscope_flow import ASTuneProxy +from astune.workflow_controller.agentscope_flow import ASTuneProxy from agentscope.message import Msg from pydantic import BaseModel, Field from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol diff --git a/tutorial/math_agent.py b/tutorial/math_agent.py index bb481285..33d8dd5b 100644 --- a/tutorial/math_agent.py +++ b/tutorial/math_agent.py @@ -1,4 +1,4 @@ -from astune.agentscope_flow import ASTuneProxy +from astune.workflow_controller.agentscope_flow import ASTuneProxy from agentscope.message import Msg from pydantic import BaseModel, Field from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol From 0bcaa8a590e97221c458ab6d1ca28d47cd788170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Wed, 12 Nov 2025 15:41:53 +0800 Subject: [PATCH 013/462] config system refactor #1 --- astune/backbone_trinity/register_flow.py | 16 +- astune/backbone_verl/trainer.py | 51 +----- astune/default_config/astune_default.yaml | 112 ++++++++++++ .../config_auto_convertion_verl.json | 5 - astune/default_config/default.yaml | 151 ---------------- astune/default_config/trinity/README.md | 22 +++ .../config_auto_convertion_trinity.json | 0 .../trinity/trinity_default.yaml | 66 +++++++ .../trinity_launch.yaml} | 32 ++++ astune/default_config/verl/README.md | 0 .../verl/config_auto_convertion_verl.json | 34 ++++ astune/default_config/verl/verl_default.yaml | 78 ++++++++ astune/protocol/agentscope_protocol.py | 9 +- astune/utils/config_utils.py | 21 +++ launcher.py | 112 +++++++----- ...orld-qwen2-agentscope-bz32-tp4-linear.yaml | 168 ++---------------- launcher/math_agent/git-math-agentscope.yaml | 160 +---------------- 17 files changed, 469 insertions(+), 568 deletions(-) create mode 100644 astune/default_config/astune_default.yaml delete mode 100644 astune/default_config/config_auto_convertion_verl.json delete mode 100644 astune/default_config/default.yaml create mode 100644 astune/default_config/trinity/README.md rename astune/default_config/{ => trinity}/config_auto_convertion_trinity.json (100%) create mode 100644 astune/default_config/trinity/trinity_default.yaml rename astune/default_config/{trinity_default.yaml => trinity/trinity_launch.yaml} (57%) create mode 100644 astune/default_config/verl/README.md create mode 100644 astune/default_config/verl/config_auto_convertion_verl.json create mode 100644 astune/default_config/verl/verl_default.yaml create mode 100644 astune/utils/config_utils.py diff --git a/astune/backbone_trinity/register_flow.py b/astune/backbone_trinity/register_flow.py index c85339b7..a32da476 100644 --- a/astune/backbone_trinity/register_flow.py +++ b/astune/backbone_trinity/register_flow.py @@ -28,6 +28,7 @@ from astune.schema.logprob import TokenAndProb from astune.schema.task import Task from astune.schema.trajectory import Sample +from astune.utils.config_utils import read_astune_config from omegaconf import OmegaConf class TrinityCompatWorkflow(DynamicRollout): @@ -104,19 +105,6 @@ def _target(): return result_holder.get("result", None) -def read_astune_config(yaml_fp): - from hydra import initialize, compose - from omegaconf import DictConfig - - def load_hydra_config(config_path: str, config_name: str) -> DictConfig: - with initialize(config_path=config_path, version_base=None): - cfg = compose(config_name=config_name, overrides=[]) - return cfg - - dir_path = os.path.dirname(yaml_fp) - file_name = os.path.basename(yaml_fp) - return load_hydra_config(config_path=dir_path, config_name=file_name) - @WORKFLOWS.register_module("astune_workflow") class astunetWorkflowWrap(Workflow): @@ -158,7 +146,7 @@ async def run_async(self): task=self.task, llm_handle=self.model_client, tokenizer=AutoTokenizer.from_pretrained(self.model_client.model_path), - config=read_astune_config(os.path.relpath(yaml_path, os.path.dirname(__file__))), + config=read_astune_config(yaml_path), ).run_in_new_thread() sample_final = [] diff --git a/astune/backbone_verl/trainer.py b/astune/backbone_verl/trainer.py index 9684032f..fc66d5f8 100644 --- a/astune/backbone_verl/trainer.py +++ b/astune/backbone_verl/trainer.py @@ -782,35 +782,24 @@ def _validate(self): # Lists to collect samples for the table sample_inputs = [] sample_outputs = [] - sample_gts = [] sample_scores = [] sample_turns = [] for test_data in self.val_dataloader: + test_data['index'] = torch.tensor([i for i in range(len(test_data['task_id']))], dtype=torch.long) test_batch = DataProto.from_single_dict(test_data) # repeat test batch test_batch = test_batch.repeat( - repeat_times=self.config.astune.rollout.val_kwargs.n, interleave=True + repeat_times=self.config.astune.rollout.val_kwargs.num_repeat, interleave=True ) # we only do validation on rule-based rm if self.config.reward_model.enable and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model": return {} - # Store original inputs - input_ids = test_batch.batch["input_ids"] - # TODO: Can we keep special tokens except for padding tokens? - input_texts = [self.tokenizer.decode(ids, skip_special_tokens=True) for ids in input_ids] - # sample_inputs.extend(input_texts) - - ground_truths = [ - item.non_tensor_batch.get("reward_model", {}).get("ground_truth", None) for item in test_batch - ] - sample_gts.extend(ground_truths) - - batch_keys_to_pop = ["input_ids", "attention_mask", "position_ids"] - non_tensor_batch_keys_to_pop = ["raw_prompt_ids"] + batch_keys_to_pop = ['index'] + non_tensor_batch_keys_to_pop = ['task_id', 'main_query', 'env_type', 'metadata', 'init_messages'] if "multi_modal_data" in test_batch.non_tensor_batch: non_tensor_batch_keys_to_pop.append("multi_modal_data") if "raw_prompt" in test_batch.non_tensor_batch: @@ -1226,8 +1215,7 @@ def fit(self): else curr_step_profile ) - # from vsdb import bp - # bp("YYY") + batch_dict['index'] = torch.tensor([i for i in range(len(batch_dict['task_id']))], dtype=torch.long) batch: DataProto = DataProto.from_single_dict(batch_dict) @@ -1414,33 +1402,6 @@ def fit(self): actor_output_metrics = reduce_metrics(actor_output.meta_info["metrics"]) metrics.update(actor_output_metrics) - # Log rollout generations if enabled - rollout_data_dir = self.config.trainer.get("rollout_data_dir", None) - if rollout_data_dir: - with marked_timer("dump_rollout_generations", timing_raw, color="green"): - inputs = self.tokenizer.batch_decode(batch.batch["prompts"], skip_special_tokens=True) - outputs = self.tokenizer.batch_decode(batch.batch["responses"], skip_special_tokens=True) - scores = batch.batch["token_level_scores"].sum(-1).cpu().tolist() - sample_gts = [ - item.non_tensor_batch.get("reward_model", {}).get("ground_truth", None) - for item in batch - ] - - if "request_id" in batch.non_tensor_batch: - reward_extra_infos_dict.setdefault( - "request_id", - batch.non_tensor_batch["request_id"].tolist(), - ) - - self._dump_generations( - inputs=inputs, - outputs=outputs, - gts=sample_gts, - scores=scores, - reward_extra_infos_dict=reward_extra_infos_dict, - dump_path=rollout_data_dir, - ) - # validate if ( self.val_reward_fn is not None @@ -1540,7 +1501,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): Returns: Tuple of (cmts, tasks) containing trajectory results and task definitions """ - pass_n = self.config.trainer.eval_pass_n + pass_n = self.config.astune.trainer_common.val_pass_n # if pass_n == 1: # return self.eval_dataset_legacy(target_dataset, target_dataset_name, mode, epoch) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml new file mode 100644 index 00000000..ba3b9377 --- /dev/null +++ b/astune/default_config/astune_default.yaml @@ -0,0 +1,112 @@ +# ------------------ 主要配置 ------------------ +astune: + project_name: appworld_astune + experiment_name: "read_yaml_name" + + task_reader: + type: env_service # `env_service` or `dataset_file` or `huggingface_dat_repo` + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code # code, text, box + training_split: train + validation_split: dev + dataset_file: + training: + file_path: "xxxx.jsonl" + validation: + file_path: "xxxx.jsonl" + huggingface_dat_repo: + dataset_path: "gsm8k" + training_split: "train" + validation_split: "validation" + + task_judge: + judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + + model: + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + data: + max_prompt_length: 3000 + max_response_length: 15000 + train_batch_size: 32 + + rollout: + use_agentscope_protocol: True + agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + max_env_worker: 128 + use_step_reward_from_env: False + binary_reward: False + force_no_think: False + force_think: False + mode: async + compute_madness_checklist: + - "nonsense" + gamma: 1.0 + agent_madness_termination: True # terminate_after_gone_mad + agent_madness_reward: -1.0 # customize the reward when agent is detected as gone mad + add_special_success_reward: False + temperature: 0.9 + top_p: 1.0 + max_env_len: 4096 + max_response_length_in_one_turn: 4096 + max_model_len: 18000 + multi_turn: + max_sample_per_task: 30 + max_steps: 30 + enable: True + step_skip_action: 0 # skip action generation every N steps, 0 means never skip + submit_oversample_multiplier: 1.5 + enable_oversample: True + num_repeat: 4 + name: vllm + val_kwargs: + temperature: 0.0 + top_k: -1 + top_p: 1.0 + do_sample: False + num_repeat: 1 + + context_manager: # context manager protocol is used ONLY when `use_agentscope_protocol=False` + context_manager_type: "linear" + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + auto_context_cm: + train_sp_action: False + token_num_trigger_clip: 8000 + sliding_window_cm: + enable_llm_memory_extraction: False + linear_think_cm: + remove_think_before_submit_as_action: False + extract_box_before_submit_as_action: False + train_history_infer_token: True + + debug: + debug_max_parallel: 16 + debug_first_n_tasks: 2 + debug_vllm_port: 18000 + debug_vllm_seed: 12345 + debug_tensor_parallel_size: 4 + + trainer_common: + val_before_train: True + val_pass_n: 4 + nnodes: 1 + n_gpus_per_node: 8 + logger: + - console + - swanlab + algorithm: + task_norm_patch: False + adv_estimator: grpo + use_kl_in_reward: False + mini_batch_num: 1 + fsdp_config: + param_offload: True + optimizer_offload: True + optim: + lr: 1e-6 + use_kl_loss: True + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl \ No newline at end of file diff --git a/astune/default_config/config_auto_convertion_verl.json b/astune/default_config/config_auto_convertion_verl.json deleted file mode 100644 index 7a2db5c6..00000000 --- a/astune/default_config/config_auto_convertion_verl.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "astune.model.path": "actor_rollout_ref.model.path", - "astune.project_name": "trainer.project_name", - "astune.experiment_name": "trainer.experiment_name" -} \ No newline at end of file diff --git a/astune/default_config/default.yaml b/astune/default_config/default.yaml deleted file mode 100644 index 51789b86..00000000 --- a/astune/default_config/default.yaml +++ /dev/null @@ -1,151 +0,0 @@ -astune: - model: - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 32 - rollout: - use_agentscope_protocol: True - agentscope_learn_protocol: null - use_step_reward_from_env: False - binary_reward: False - force_no_think: False - force_think: False - compute_madness_checklist: - - "nonsense" - gamma: 1.0 - agent_madness_termination: True # terminate_after_gone_mad - agent_madness_reward: -1.0 # customize the reward when agent is detected as gone mad - add_special_success_reward: False - temperature: 0.9 - top_p: 1.0 - max_env_len: 4096 - max_response_length_in_one_turn: 4096 - max_model_len: 18000 - multi_turn: - max_sample_per_task: 30 - max_steps: 30 - step_skip_action: 0 # skip action generation every N steps, 0 means never skip - submit_oversample_multiplier: 1.5 - enable_oversample: True - num_repeat: 4 - val_kwargs: - temperature: 0.0 - top_k: -1 - top_p: 1.0 - context_manager: # context manager protocol is used ONLY when `use_agentscope_protocol=False` - context_manager_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - auto_context_cm: - train_sp_action: False - token_num_trigger_clip: 8000 - sliding_window_cm: - enable_llm_memory_extraction: False - linear_think_cm: - remove_think_before_submit_as_action: False - extract_box_before_submit_as_action: False - train_history_infer_token: True - - - -########################## verl config below ########################## -trainer: - val_before_train: False - hfmodelpath: "" - experiment_name: "read_yaml_name" - n_gpus_per_node: 8 - nnodes: 1 - save_freq: 20 - test_freq: 20 - total_epochs: 50 - project_name: appworldnew - validation_data_dir: "experiments/exp_default/validation_log" - rollout_data_dir: "experiments/exp_default/rollout_log" - critic_warmup: 0 - eval_pass_n: 4 - logger: - - console - - swanlab - - -data: - val_batch_size: 100000000000 - return_raw_chat: True - filter_overlong_prompts: True - truncation: error - fast_eval: True - train_batch_size: 32 - max_prompt_length: 3000 - max_response_length: 15000 - -algorithm: - task_norm_patch: False - adv_estimator: grpo - use_kl_in_reward: False - -actor_rollout_ref: - hybrid_engine: True - actor: - entropy_coeff: 0 - loss_agg_mode: seq-mean-token-mean - override_ppo_mini_batch_num: 1 - ppo_epochs: 1 - ppo_mini_batch_size: 16 - optim: - lr: 1e-6 - use_kl_loss: True - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - ppo_micro_batch_size_per_gpu: 1 - ppo_max_token_len_per_gpu: 18000 - use_dynamic_bsz: True - fsdp_config: - param_offload: True - optimizer_offload: True - - rollout: - name: vllm - mode: async - max_env_len: 3000 - response_length: 3000 - prompt_length: 15000 - max_model_len: 18000 - use_agentscope_protocol: False - ppo_micro_batch_size_per_gpu: 1 - tensor_model_parallel_size: 1 - max_num_seqs: 10 - gpu_memory_utilization: 0.9 - max_env_worker: 64 - log_prob_max_token_len_per_gpu: 18000 - temperature: 0.9 - top_p: 1.0 - gamma: 1.0 - enforce_eager: True - log_prob_micro_batch_size_per_gpu: 4 - multi_turn: - completion_callback: astune.module.trainer.simple_completion_callback.SimpleCompletionCallback - enable: True - format: llama3_json - max_steps: 30 - tool_config_path: null - custom_dataflow_cls: - path: "" - name: "" - val_kwargs: - top_k: -1 - top_p: 1.0 - temperature: 0 - do_sample: False - ref: - use_dynamic_bsz: True - log_prob_micro_batch_size_per_gpu: 4 - log_prob_max_token_len_per_gpu: 18000 - fsdp_config: - param_offload: True - - model: - use_remove_padding: True - enable_gradient_checkpointing: True - diff --git a/astune/default_config/trinity/README.md b/astune/default_config/trinity/README.md new file mode 100644 index 00000000..9a119385 --- /dev/null +++ b/astune/default_config/trinity/README.md @@ -0,0 +1,22 @@ +# Trinity Config + +## To change trinity config + +- please edit `astune/default_config/trinity/trinity_default.yaml` + +- or, you can write in your experiment config: + +```yaml +trinity: + algorithm: + algorithm_type: multi_step_grpo +``` + +- never edit `astune/default_config/trinity/trinity_default.yaml` + + + +## change config mapping + +Some astune config has several configuration that is overlaps with trinity, +map them with `astune/default_config/trinity/config_auto_convertion_trinity.json` \ No newline at end of file diff --git a/astune/default_config/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json similarity index 100% rename from astune/default_config/config_auto_convertion_trinity.json rename to astune/default_config/trinity/config_auto_convertion_trinity.json diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml new file mode 100644 index 00000000..ea4fb41c --- /dev/null +++ b/astune/default_config/trinity/trinity_default.yaml @@ -0,0 +1,66 @@ +trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 + algorithm: + algorithm_type: multi_step_grpo + optimizer: + lr: 1e-6 + repeat_times: 6 + buffer: + batch_size: 8 + explorer_input: + eval_tasksets: [] + taskset: + default_workflow_type: astune_workflow + format: + prompt_key: question + response_key: answer + name: gsm8k + path: http://localhost:8080 + rollout_args: + temperature: 1.0 + split: train + storage_type: astune + subset_name: appworld + total_epochs: 1000 + train_batch_size: 36 + trainer_input: + experience_buffer: + max_read_timeout: 18000 + name: agentscope_gsm8k_buffer + storage_type: queue + checkpoint_root_dir: ./trinity_checkpoints + cluster: + gpu_per_node: 8 + node_num: 1 + explorer: + eval_interval: 999999 + max_repeat_times_per_runner: 1 + max_timeout: 7200 + rollout_model: + dtype: bfloat16 + enable_auto_tool_choice: true + enable_history: true + enable_openai_api: true + enable_prefix_caching: false + enable_thinking: false + enforce_eager: true + engine_num: 2 + seed: 42 + tensor_parallel_size: 1 + tool_call_parser: hermes + runner_per_model: 12 + model: + max_model_len: 21000 + max_response_tokens: 16000 + monitor: + monitor_type: swanlab + synchronizer: + sync_interval: 2 + sync_method: nccl + sync_style: dynamic_by_explorer + sync_timeout: 1200 + trainer: + grad_clip: 1.0 + max_token_len_per_gpu: 24576 + save_interval: 100 + ulysses_sequence_parallel_size: 2 + use_dynamic_bsz: true \ No newline at end of file diff --git a/astune/default_config/trinity_default.yaml b/astune/default_config/trinity/trinity_launch.yaml similarity index 57% rename from astune/default_config/trinity_default.yaml rename to astune/default_config/trinity/trinity_launch.yaml index ab524b8e..2ae8ae40 100644 --- a/astune/default_config/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_launch.yaml @@ -1,3 +1,35 @@ +# --- +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# NEVER EDIT THIS FILE, THIS IS READ ONLY +# --- + + algorithm: algorithm_type: multi_step_grpo optimizer: diff --git a/astune/default_config/verl/README.md b/astune/default_config/verl/README.md new file mode 100644 index 00000000..e69de29b diff --git a/astune/default_config/verl/config_auto_convertion_verl.json b/astune/default_config/verl/config_auto_convertion_verl.json new file mode 100644 index 00000000..52f75be5 --- /dev/null +++ b/astune/default_config/verl/config_auto_convertion_verl.json @@ -0,0 +1,34 @@ +{ + "astune.trainer_common.val_before_train": "trainer.val_before_train", + "astune.trainer_common.n_gpus_per_node": "trainer.n_gpus_per_node", + "astune.trainer_common.nnodes": "trainer.nnodes", + "astune.trainer_common.logger": "trainer.logger", + "astune.trainer_common.algorithm.task_norm_patch": "algorithm.task_norm_patch", + "astune.trainer_common.algorithm.adv_estimator": "algorithm.adv_estimator", + "astune.trainer_common.algorithm.use_kl_in_reward": "algorithm.use_kl_in_reward", + "astune.trainer_common.mini_batch_num": "actor_rollout_ref.actor.override_ppo_mini_batch_num", + "astune.trainer_common.fsdp_config": "actor_rollout_ref.actor.fsdp_config", + "astune.trainer_common.optim": "actor_rollout_ref.actor.optim", + "astune.trainer_common.use_kl_loss": "actor_rollout_ref.actor.use_kl_loss", + "astune.trainer_common.kl_loss_coef": "actor_rollout_ref.actor.kl_loss_coef", + "astune.trainer_common.kl_loss_type": "actor_rollout_ref.actor.kl_loss_type", + + "astune.data.max_prompt_length": "data.max_prompt_length", + "astune.data.max_response_length": "data.max_response_length", + "astune.data.train_batch_size": "data.train_batch_size", + + "astune.rollout.max_model_len": [ + "actor_rollout_ref.rollout.max_model_len", + "actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu", + "actor_rollout_ref.actor.ppo_max_token_len_per_gpu", + "actor_rollout_ref.ref.log_prob_max_token_len_per_gpu" + ], + + "astune.rollout.mode": "actor_rollout_ref.rollout.mode", + "astune.rollout.multi_turn": "actor_rollout_ref.rollout.multi_turn", + "astune.rollout.val_kwargs": "actor_rollout_ref.rollout.val_kwargs", + + "astune.model.path": "actor_rollout_ref.model.path", + "astune.project_name": "trainer.project_name", + "astune.experiment_name": "trainer.experiment_name" +} \ No newline at end of file diff --git a/astune/default_config/verl/verl_default.yaml b/astune/default_config/verl/verl_default.yaml new file mode 100644 index 00000000..546ea7ad --- /dev/null +++ b/astune/default_config/verl/verl_default.yaml @@ -0,0 +1,78 @@ +trainer: + val_before_train: False + hfmodelpath: "" + experiment_name: "read_yaml_name" + n_gpus_per_node: 8 + nnodes: 1 + save_freq: 20 + test_freq: 20 + total_epochs: 50 + project_name: appworldnew + critic_warmup: 0 + val_pass_n: 4 + logger: + - console + - swanlab + +data: + val_batch_size: 100000000000 + return_raw_chat: True + filter_overlong_prompts: True + truncation: error + fast_eval: True + +algorithm: + task_norm_patch: False + adv_estimator: grpo + use_kl_in_reward: False + +actor_rollout_ref: + hybrid_engine: True + actor: + entropy_coeff: 0 + loss_agg_mode: seq-mean-token-mean + override_ppo_mini_batch_num: 1 + ppo_epochs: 1 + ppo_mini_batch_size: 16 + optim: + lr: 1e-6 + use_kl_loss: True + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + ppo_micro_batch_size_per_gpu: 1 + ppo_max_token_len_per_gpu: 18000 + use_dynamic_bsz: True + fsdp_config: + param_offload: True + optimizer_offload: True + + rollout: + name: vllm + mode: async + max_env_len: 3000 + ppo_micro_batch_size_per_gpu: 1 + tensor_model_parallel_size: 1 + max_num_seqs: 10 + gpu_memory_utilization: 0.9 + max_env_worker: 64 + log_prob_max_token_len_per_gpu: 18000 + temperature: 0.9 + top_p: 1.0 + gamma: 1.0 + enforce_eager: True + log_prob_micro_batch_size_per_gpu: 4 + custom_dataflow_cls: + path: "" + name: "" + + ref: + use_dynamic_bsz: True + log_prob_micro_batch_size_per_gpu: 4 + log_prob_max_token_len_per_gpu: 18000 + fsdp_config: + param_offload: True + + model: + use_remove_padding: True + enable_gradient_checkpointing: True + diff --git a/astune/protocol/agentscope_protocol.py b/astune/protocol/agentscope_protocol.py index abcb46a1..5461075d 100644 --- a/astune/protocol/agentscope_protocol.py +++ b/astune/protocol/agentscope_protocol.py @@ -1,7 +1,9 @@ -from agentscope.message import Msg from pydantic import BaseModel, Field -from typing import Callable, List -from astune.workflow_controller.agentscope_flow import ASTuneProxy +from typing import Callable, List, TYPE_CHECKING + +if TYPE_CHECKING: + from agentscope.message import Msg + from astune.workflow_controller.agentscope_flow import ASTuneProxy class AgentScopeLearnProtocol(BaseModel): model_config = {"extra": "allow"} @@ -22,4 +24,3 @@ class AgentScopeLearnProtocol(BaseModel): async def agentscope_execute(self, init_messages, astune_proxy: "ASTuneProxy", config)->"ASTuneProxy": raise NotImplementedError - diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py new file mode 100644 index 00000000..b204f7dd --- /dev/null +++ b/astune/utils/config_utils.py @@ -0,0 +1,21 @@ +import os +from hydra import initialize, compose +from omegaconf import DictConfig + +def read_astune_config(yaml_fp): + yaml_fp = os.path.relpath(yaml_fp, os.path.dirname(__file__)) # do not try to understand this line, hydra is too weird + + def load_hydra_config(config_path: str, config_name: str) -> DictConfig: + with initialize(config_path=config_path, version_base=None): + cfg = compose(config_name=config_name, overrides=[]) + return cfg + + dir_path = os.path.dirname(yaml_fp) + file_name = os.path.basename(yaml_fp) + return load_hydra_config(config_path=dir_path, config_name=file_name) + +def dump_yaml_config(cfg: DictConfig, yaml_fp: str): + from omegaconf import OmegaConf + with open(yaml_fp, 'w') as f: + OmegaConf.save(cfg, f) + return yaml_fp \ No newline at end of file diff --git a/launcher.py b/launcher.py index c9977841..34894b5e 100644 --- a/launcher.py +++ b/launcher.py @@ -1,13 +1,15 @@ import subprocess import argparse import shutil +import yaml import time import sys import os from loguru import logger from dotenv import load_dotenv; load_dotenv() -from astune.utils.smart_daemon import LaunchCommandWhenAbsent from astune.utils.cleaner import _fast_kill_by_keyword_bash +from astune.utils.smart_daemon import LaunchCommandWhenAbsent +from astune.utils.config_utils import read_astune_config, dump_yaml_config def parse_args(): @@ -97,7 +99,7 @@ def check_debugpy_version(): "Ray Debugpy Debugger requires 'debugpy>=1.8.0'. " "Upgrade using 'pip install debugpy>=1.8.0'" ) - print(f"✓ debugpy version {version} meets requirement (>=1.8.0)") + logger.info(f"✓ debugpy version {version} meets requirement (>=1.8.0)") def pty_launch(service_name: str, success_std_string="Starting server on"): @@ -135,7 +137,6 @@ def prepare_experiment_config(yaml_path, args): raise FileNotFoundError(f"Configuration file not found: {exp_base}") ## 0. read yaml (get astune.experiment_name) - import yaml with open(yaml_path, 'r') as file: config = yaml.safe_load(file) exp_name = config.get('astune').get('experiment_name') @@ -145,15 +146,15 @@ def prepare_experiment_config(yaml_path, args): else: exp_name = exp_name.replace('|', '-') - print('----------------------------------------') + logger.info('----------------------------------------') backup_dir = os.path.join('launcher_record', exp_name, 'backup') yaml_backup_dst = os.path.join('launcher_record', exp_name, 'yaml_backup.yaml') exe_yaml_path = yaml_backup_dst exe_exp_base = os.path.dirname(yaml_backup_dst) - print('Experiment Name:', exp_name) - print('Experiment Backup Dir:', backup_dir) - print('Experiment Yaml Dir:', yaml_backup_dst) - print('----------------------------------------') + logger.info(f'Experiment Name: {exp_name}') + logger.info(f'Experiment Backup Dir: {backup_dir}') + logger.info(f'Experiment Yaml Dir: {yaml_backup_dst}') + logger.info('----------------------------------------') time.sleep(2) ## 1. check exp_base/backup exist @@ -162,7 +163,7 @@ def prepare_experiment_config(yaml_path, args): else: total_seconds = 5 for i in range(total_seconds): - print(f"\rWarning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds...", end="", flush=True) + logger.warning(f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds...") time.sleep(1) ## 2. copy files to backup @@ -170,7 +171,7 @@ def prepare_experiment_config(yaml_path, args): BACK_TARGETS = [p for p in BACK_TARGETS if os.path.exists(p)] for backup_target in BACK_TARGETS: - print(f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}") + logger.info(f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}") shutil.copytree(backup_target, os.path.join(backup_dir, os.path.basename(backup_target)), dirs_exist_ok=True) ## 3. copy yaml to backup @@ -182,14 +183,43 @@ def prepare_experiment_config(yaml_path, args): with open(yaml_path, 'r') as file: config = yaml.safe_load(file) config['astune']['experiment_name'] = exp_name - # remove extra config - if args.backbone != "verl": + + # remove extra config of verl for trinity + if args.backbone == "debug": config['defaults'].remove('ppo_trainer') + config['defaults'].remove('trinity_default') + config['hydra']['searchpath'].remove('file://astune/default_config/trinity') config['hydra']['searchpath'].remove('file://external/verl/verl/trainer/config') + # remove extra config of verl for trinity + if args.backbone == "trinity": + config['defaults'].remove('ppo_trainer') + config['defaults'].remove('verl_default') + config['hydra']['searchpath'].remove('file://external/verl/verl/trainer/config') + config['hydra']['searchpath'].remove('file://astune/default_config/verl') + # remove extra config of trinity for verl + if args.backbone == "verl": # or args.backbone == "debug" + config['defaults'].remove('trinity_default') + config['hydra']['searchpath'].remove('file://astune/default_config/trinity') + # yaml dump with open(yaml_path, 'w') as file: yaml.dump(config, file) - return yaml_backup_dst, exe_exp_base, exe_yaml_path, exp_name, config + # read everything + full_config = read_astune_config(yaml_path) + yaml_path = full_config_path = dump_yaml_config(full_config, yaml_fp=yaml_path) + + + # put inherit info back + with open(yaml_path, 'r') as file: + config_final = yaml.safe_load(file) + config_final['defaults'] = config['defaults'] + config_final['hydra'] = config['hydra'] + + # write inherit info back + with open(yaml_path, 'w') as file: + yaml.dump(config_final, file) + + return yaml_path, exe_exp_base, exe_yaml_path, exp_name, config def launch_logview(exp_name=None): """ @@ -215,7 +245,7 @@ def launch_logview(exp_name=None): # Use default experiment name if not set webbrowser.open("http://127.0.0.1:8181/") except Exception as e: - print(f"Error opening web browser: {e}") + logger.error(f"Error opening web browser: {e}") pass def start_ray_service(args, env): @@ -251,8 +281,10 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg): import json with open(convertion_json_fg, 'r') as file: convertion_json = json.load(file) + logger.success("----------------------------------------------------") - for from_key, to_key in convertion_json.items(): + + for from_key, to_keys in convertion_json.items(): # get value from from_config keys = from_key.split('.') value = from_config @@ -261,23 +293,23 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg): if value is None: break if value is None: - logger.warning(f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_key}") + logger.warning(f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_keys}") continue - # set value to to_config - keys = to_key.split('.') - sub_config = to_config - for key in keys[:-1]: - if key not in sub_config: - sub_config[key] = {} - sub_config = sub_config[key] - sub_config[keys[-1]] = value - logger.success(f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]") - time.sleep(1) + + to_keys = to_keys if isinstance(to_keys, list) else [to_keys] + for to_key in to_keys: + keys = to_key.split('.') + sub_config = to_config + for key in keys[:-1]: + if key not in sub_config: + sub_config[key] = {} + sub_config = sub_config[key] + sub_config[keys[-1]] = value + logger.success(f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]") + time.sleep(0.33) + logger.success("----------------------------------------------------") - # read from_config_fp's trinity section and copy to to_config_fp - # for example: - # (from_config_fp) trinity.algorithm.algorithm_type ---> (to_config_fp) algorithm.algorithm_type - # do this recursively for all keys under trinity, one config key at a time + if 'trinity' in from_config: trinity_config = from_config['trinity'] def recursive_copy(src_dict, dst_dict, parent_key=""): @@ -318,15 +350,15 @@ def execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_bas # let's begin the training process if args.backbone == "trinity": # replace boot yaml - trinity_boot_yaml = exp_config['backbone']['backbone_config']['trinity'] - align_parameters(yaml_backup_dst, trinity_boot_yaml, 'astune/default_config/config_auto_convertion_trinity.json') + trinity_boot_yaml = "astune/default_config/trinity_launch.yaml" # THIS ONE IS READ ONLY, and ALWAYS FIXED + align_parameters(yaml_backup_dst, trinity_boot_yaml, 'astune/default_config/trinity/config_auto_convertion_trinity.json') cmd = [ sys.executable, '-m', backbone_target, 'run', '--config', trinity_boot_yaml ] else: - align_parameters(yaml_backup_dst, yaml_backup_dst, 'astune/default_config/config_auto_convertion_verl.json') + align_parameters(yaml_backup_dst, yaml_backup_dst, 'astune/default_config/verl/config_auto_convertion_verl.json') cmd = [ sys.executable, '-m', backbone_target, @@ -341,13 +373,13 @@ def execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_bas }) try: - print(f"Running command: {' '.join(cmd)}") + logger.info(f"Running command: {' '.join(cmd)}") subprocess.run(cmd, check=True, cwd=os.path.abspath('./'), env=env) except subprocess.CalledProcessError as e: - print(f"Error running subprocess: {e}") + logger.error(f"Error running subprocess: {e}") sys.exit(1) except Exception as e: - print(f"Unexpected error: {e}") + logger.error(f"Unexpected error: {e}") sys.exit(1) @@ -356,14 +388,14 @@ def main(): # Handle kill-keywords argument if provided if args.kill: - print(f"Killing processes matching keywords: {args.kill}") + logger.info(f"Killing processes matching keywords: {args.kill}") for keyword in args.kill.split('|'): - print(f"Killing processes matching keyword: {keyword}") + logger.info(f"Killing processes matching keyword: {keyword}") killed_pids = _fast_kill_by_keyword_bash(keyword) if killed_pids: - print(f"Successfully killed processes with PIDs: {killed_pids}") + logger.success(f"Successfully killed processes with PIDs: {killed_pids}") else: - print(f"No processes found matching keyword: {keyword}") + logger.warning(f"No processes found matching keyword: {keyword}") return # Exit after killing processes # Initialize variables with default values to avoid "possibly unbound" errors diff --git a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml b/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml index 7b01250e..9904c971 100644 --- a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml +++ b/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml @@ -1,173 +1,29 @@ -# ------------------ 选择backbone ------------------ -backbone: - type: trinity - backbone_config: - trinity: astune/default_config/trinity_default.yaml - verl: astune/default_config/astune_default.yaml - # ------------------ 主要配置 ------------------ astune: project_name: appworld_astune - task_reader: - type: env_service # `env_service` or `dataset_file` or `huggingface_dat_repo` - env_service: - env_type: "appworld" - env_url: "http://127.0.0.1:8080" - env_action_preference: code # code, text, box - training_split: train - validation_split: dev - dataset_file: - training: - file_path: "xxxx.jsonl" - validation: - file_path: "xxxx.jsonl" - huggingface_dat_repo: - dataset_path: "gsm8k" - training_split: "train" - validation_split: "validation" - + experiment_name: "read_yaml_name" task_judge: + # ✨✨✨✨ 编写并选择评价函数 judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge - - experiment_name: "read_yaml_name" model: - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 32 + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - use_agentscope_protocol: True + # ✨✨✨✨ 编写并选择Agent agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol - max_env_worker: 128 - use_step_reward_from_env: False - binary_reward: False - force_no_think: False - force_think: False - mode: async - compute_madness_checklist: - - "nonsense" - gamma: 1.0 - agent_madness_termination: True # terminate_after_gone_mad - agent_madness_reward: -1.0 # customize the reward when agent is detected as gone mad - add_special_success_reward: False - temperature: 0.9 - top_p: 1.0 - max_env_len: 4096 - max_response_length_in_one_turn: 4096 - max_model_len: 18000 - multi_turn: - max_sample_per_task: 30 - max_steps: 30 - enable: True - step_skip_action: 0 # skip action generation every N steps, 0 means never skip - submit_oversample_multiplier: 1.5 - enable_oversample: True - num_repeat: 4 - name: vllm - val_kwargs: - temperature: 0.0 - top_k: -1 - top_p: 1.0 - do_sample: False - context_manager: # context manager protocol is used ONLY when `use_agentscope_protocol=False` - context_manager_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - auto_context_cm: - train_sp_action: False - token_num_trigger_clip: 8000 - sliding_window_cm: - enable_llm_memory_extraction: False - linear_think_cm: - remove_think_before_submit_as_action: False - extract_box_before_submit_as_action: False - train_history_infer_token: True - debug: - debug_max_parallel: 16 - debug_first_n_tasks: 2 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - debug_tensor_parallel_size: 4 - - -# ------------------ 修改trinity训练参数,如果使用verl则忽略该部分 ------------------ -trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 - algorithm: - algorithm_type: multi_step_grpo - optimizer: - lr: 1e-6 - repeat_times: 6 - buffer: - batch_size: 8 - explorer_input: - eval_tasksets: [] - taskset: - default_workflow_type: astune_workflow - format: - prompt_key: question - response_key: answer - name: gsm8k - path: http://localhost:8080 - rollout_args: - temperature: 1.0 - split: train - storage_type: astune - subset_name: appworld - total_epochs: 1000 - train_batch_size: 36 - trainer_input: - experience_buffer: - max_read_timeout: 18000 - name: agentscope_gsm8k_buffer - storage_type: queue - checkpoint_root_dir: ./trinity_checkpoints - cluster: - gpu_per_node: 8 - node_num: 1 - explorer: - eval_interval: 999999 - max_repeat_times_per_runner: 1 - max_timeout: 7200 - rollout_model: - dtype: bfloat16 - enable_auto_tool_choice: true - enable_history: true - enable_openai_api: true - enable_prefix_caching: false - enable_thinking: false - enforce_eager: true - engine_num: 2 - seed: 42 - tensor_parallel_size: 1 - tool_call_parser: hermes - runner_per_model: 12 - model: - max_model_len: 21000 - max_response_tokens: 16000 - monitor: - monitor_type: swanlab - synchronizer: - sync_interval: 2 - sync_method: nccl - sync_style: dynamic_by_explorer - sync_timeout: 1200 - trainer: - grad_clip: 1.0 - max_token_len_per_gpu: 24576 - save_interval: 100 - ulysses_sequence_parallel_size: 2 - use_dynamic_bsz: true - # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://external/verl/verl/trainer/config # verl only - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: - - ppo_trainer - - default + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default - _self_ diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index e40d2e63..998aa69d 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -1,29 +1,7 @@ -# ------------------ 选择backbone ------------------ -backbone: - type: trinity - backbone_config: - trinity: astune/default_config/trinity_default.yaml - verl: astune/default_config/astune_default.yaml - # ------------------ 主要配置 ------------------ astune: - project_name: appworld_astune - task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` - # 如果选择 `env_service` 以下配置生效 - env_service: - env_type: "appworld" - env_url: "http://127.0.0.1:8080" - env_action_preference: code # code, text, box - training_split: train - validation_split: dev - # 如果选择 `dataset_file` 以下配置生效 - dataset_file: - training: - file_path: "xxxx.jsonl" - validation: - file_path: "xxxx.jsonl" # 如果选择 `huggingface_dat_repo` 以下配置生效 huggingface_dat_repo: dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' @@ -34,153 +12,29 @@ astune: # ✨✨✨✨ 编写并选择评价函数 judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge - # 实验名称:建议不修改,直接读取yaml文件名称 - experiment_name: "read_yaml_name" - model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 32 - rollout: - use_agentscope_protocol: True agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent - max_env_worker: 128 - use_step_reward_from_env: False - binary_reward: False - force_no_think: False - force_think: False - mode: async - compute_madness_checklist: - - "nonsense" - gamma: 1.0 - agent_madness_termination: True # terminate_after_gone_mad - agent_madness_reward: -1.0 # customize the reward when agent is detected as gone mad - add_special_success_reward: False - temperature: 0.9 - top_p: 1.0 - max_env_len: 4096 - max_response_length_in_one_turn: 4096 - max_model_len: 18000 - multi_turn: - max_sample_per_task: 30 - max_steps: 30 - enable: True - step_skip_action: 0 # skip action generation every N steps, 0 means never skip - submit_oversample_multiplier: 1.5 - enable_oversample: True - num_repeat: 4 - name: vllm - val_kwargs: - temperature: 0.0 - top_k: -1 - top_p: 1.0 - do_sample: False - - context_manager: # context manager protocol is used ONLY when `use_agentscope_protocol=False` - context_manager_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - auto_context_cm: - train_sp_action: False - token_num_trigger_clip: 8000 - sliding_window_cm: - enable_llm_memory_extraction: False - linear_think_cm: - remove_think_before_submit_as_action: False - extract_box_before_submit_as_action: False - train_history_infer_token: True debug: debug_max_parallel: 1 debug_first_n_tasks: 1 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - debug_tensor_parallel_size: 4 - - -# ------------------ 修改trinity训练参数,如果使用verl则忽略该部分 ------------------ -trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 - algorithm: - algorithm_type: multi_step_grpo - optimizer: - lr: 1e-6 - repeat_times: 6 - buffer: - batch_size: 8 - explorer_input: - eval_tasksets: [] - taskset: - default_workflow_type: astune_workflow - format: - prompt_key: question - response_key: answer - name: gsm8k - path: http://localhost:8080 - rollout_args: - temperature: 1.0 - split: train - storage_type: astune - subset_name: appworld - total_epochs: 1000 - train_batch_size: 36 - trainer_input: - experience_buffer: - max_read_timeout: 18000 - name: agentscope_gsm8k_buffer - storage_type: queue - checkpoint_root_dir: ./trinity_checkpoints - cluster: - gpu_per_node: 8 - node_num: 1 - explorer: - eval_interval: 999999 - max_repeat_times_per_runner: 1 - max_timeout: 7200 - rollout_model: - dtype: bfloat16 - enable_auto_tool_choice: true - enable_history: true - enable_openai_api: true - enable_prefix_caching: false - enable_thinking: false - enforce_eager: true - engine_num: 2 - seed: 42 - tensor_parallel_size: 1 - tool_call_parser: hermes - runner_per_model: 12 - model: - max_model_len: 21000 - max_response_tokens: 16000 - monitor: - monitor_type: swanlab - synchronizer: - sync_interval: 2 - sync_method: nccl - sync_style: dynamic_by_explorer - sync_timeout: 1200 - trainer: - grad_clip: 1.0 - max_token_len_per_gpu: 24576 - save_interval: 100 - ulysses_sequence_parallel_size: 2 - use_dynamic_bsz: true - # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://external/verl/verl/trainer/config # verl only - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: - - ppo_trainer - - default + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default - _self_ - From eff282936ed8783e3cac77578f2d280242327f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Wed, 12 Nov 2025 23:50:54 +0800 Subject: [PATCH 014/462] replace module --- README.md | 90 +- .../trainer.py | 2 +- .../{ => agentflow_cm}/cmt_base_attr.py | 0 .../{ => agentflow_cm}/cmt_context_aware.py | 2 +- .../{ => agentflow_cm}/cmt_context_clip.py | 4 +- .../{ => agentflow_cm}/cmt_foreign_llm.py | 0 .../{ => agentflow_cm}/cmt_linear.py | 6 +- .../{ => agentflow_cm}/cmt_linear_think.py | 2 +- .../{ => agentflow_cm}/cmt_memory.py | 0 .../{ => agentflow_cm}/cmt_phantom_hint.py | 2 +- .../{ => agentflow_cm}/cmt_sliding_window.py | 4 +- .../{ => agentscope_cm}/cmt_agentscope.py | 60 +- astune/default_config/astune_default.yaml | 1 + astune/main_verl.py | 4 +- astune/parallel_env.py | 2 +- astune/task_judge/math_answer_as_judge.py | 2 +- astune/task_rollout/async_llm_bridge.py | 2 +- astune/task_rollout/env_worker.py | 2 +- astune/utils/color_hsl.py | 35 + astune/workflow_controller/agentscope_flow.py | 6 +- astune/workflow_controller/basic_agentflow.py | 4 +- .../workflow_controller/classic_agentflow.py | 8 +- documents/backbones.md | 47 + documents/tokenizer_nodes.md | 132 + documents/vllm_tokenizer.py | 2278 +++++++++++++++++ ...orld-qwen2-agentscope-bz32-tp4-linear.yaml | 5 + launcher/math_agent/git-math-agentscope.yaml | 2 +- pyrightconfig.json | 33 +- scripts/download_dataset.py | 2 +- .../requirements_trinity.txt | 0 .../requirements_verl.txt | 0 31 files changed, 2590 insertions(+), 147 deletions(-) rename astune/{backbone_verl => backbone_others}/trainer.py (99%) rename astune/context_manager/{ => agentflow_cm}/cmt_base_attr.py (100%) rename astune/context_manager/{ => agentflow_cm}/cmt_context_aware.py (98%) rename astune/context_manager/{ => agentflow_cm}/cmt_context_clip.py (98%) rename astune/context_manager/{ => agentflow_cm}/cmt_foreign_llm.py (100%) rename astune/context_manager/{ => agentflow_cm}/cmt_linear.py (99%) rename astune/context_manager/{ => agentflow_cm}/cmt_linear_think.py (99%) rename astune/context_manager/{ => agentflow_cm}/cmt_memory.py (100%) rename astune/context_manager/{ => agentflow_cm}/cmt_phantom_hint.py (94%) rename astune/context_manager/{ => agentflow_cm}/cmt_sliding_window.py (97%) rename astune/context_manager/{ => agentscope_cm}/cmt_agentscope.py (93%) create mode 100644 astune/utils/color_hsl.py create mode 100644 documents/backbones.md create mode 100644 documents/tokenizer_nodes.md create mode 100644 documents/vllm_tokenizer.py rename requirements_trinity.txt => scripts/requirements_trinity.txt (100%) rename requirements_verl.txt => scripts/requirements_verl.txt (100%) diff --git a/README.md b/README.md index 73c84a4a..cf389085 100644 --- a/README.md +++ b/README.md @@ -5,59 +5,43 @@ AgentScope Tune, or **ASTune**, is an advanced agent training framework for tuni ## Installation -You can choose between `Trinity training backbone` and `Verl training backbone`. We recommend using `uv` to setup the dependencies, and `conda` can also do the job. - -
-1. 🔧Trinity backbone: Click to read trinity backbone installation (Option 1) - -```bash -# Create virtual environment -uv venv --python=3.10.16 -source .venv/bin/activate -git clone https://github.com/binary-husky/Trinity-RFT external/trinity - -# Install dependencies -uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ -uv pip install -r requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow -uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps - -# Install flash attention (must be installed last) -uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation -``` -
- -
-2. 🌟VERL Backbone: Click to read VERL backbone installation (Option 2) +We recommend using `uv` to setup the dependencies, and `conda` can also do the job. +1. clone the repo and trinity module: + ```bash + git clone https://github.com/..../agentscope-tune.git astune + git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity + cd astune + ``` -```bash -# Create virtual environment -uv venv --python=3.10.16 -source .venv/bin/activate -git clone https://github.com/binary-husky/verl.git external/verl +2. Install trinity training backbone +
-# Install dependencies -uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ -uv pip install -r requirements_verl.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow -uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no-deps + Click to read trinity backbone installation -# Install flash attention (must be installed last) -uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation -``` -
+ ```bash + # Create virtual environment + uv venv --python=3.10.16 + source .venv/bin/activate + git clone https://github.com/binary-husky/Trinity-RFT external/trinity + + # Install dependencies + uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ + uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow + uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps + + # Install flash attention (must be installed last) + uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation + ``` +
+ Click to read other backbone installation + Please refer to documents/backbone.md. +
+
-
-3. 🔄Switch Verl/Trinity backbone: cannot install both backbone at the same time, run the following command to toggle. -```bash -# verl -> trinity -cd external/verl && uv pip uninstall . && cd ../.. -# trinity -> verl -uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no-deps -``` -


@@ -71,7 +55,7 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- 项目提供一个多功能launcher用于调试和训练,借助launcher,只需要修改一个`--backbone`参数,就选择任意训练框架启动训练 or 调试。 -1. 使用launcher进行全链路调试(--backbone='debug'):脱离trinity和verl,只与vllm(自动创建)连接,进行调试: +1. 使用launcher进行全链路调试(--backbone='debug'):脱离Trinity和Verl,只与Vllm(自动创建)连接,进行调试: ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ @@ -84,7 +68,7 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- 备注:当`--backbone=debug`时,程序**不再使用ray**,这意味着您可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置见本文档最后。 -2. 使用launcher启动训练:使用trinity进行训练: +2. 使用launcher启动训练: ```bash # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ @@ -92,19 +76,9 @@ uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no- clear && python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --with-ray --backbone='trinity' ``` - 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension) + 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension)。此外,也可以使用BeyondAgent后端训练(--backbone='verl') -3. 使用launcher启动训练:使用verl进行训练: - ```bash - # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) - clear && \ - python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --backbone='verl' - - python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='verl' - ``` - 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG4|TAG5|TAG6' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG4")` 即可。 - ## Feature - 当程序退出时,给自己发短信 diff --git a/astune/backbone_verl/trainer.py b/astune/backbone_others/trainer.py similarity index 99% rename from astune/backbone_verl/trainer.py rename to astune/backbone_others/trainer.py index fc66d5f8..a56e7023 100644 --- a/astune/backbone_verl/trainer.py +++ b/astune/backbone_others/trainer.py @@ -68,7 +68,7 @@ from astune.schema.trajectory import Trajectory from astune.utils.message import send_train_message from beast_logger import register_logger, print_dict -from astune.context_manager.cmt_linear import CMTLinear +from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear import os import json from typing import List, Dict, Union, Type diff --git a/astune/context_manager/cmt_base_attr.py b/astune/context_manager/agentflow_cm/cmt_base_attr.py similarity index 100% rename from astune/context_manager/cmt_base_attr.py rename to astune/context_manager/agentflow_cm/cmt_base_attr.py diff --git a/astune/context_manager/cmt_context_aware.py b/astune/context_manager/agentflow_cm/cmt_context_aware.py similarity index 98% rename from astune/context_manager/cmt_context_aware.py rename to astune/context_manager/agentflow_cm/cmt_context_aware.py index a2da0825..dd10a69d 100644 --- a/astune/context_manager/cmt_context_aware.py +++ b/astune/context_manager/agentflow_cm/cmt_context_aware.py @@ -1,7 +1,7 @@ import copy from typing import List from beast_logger import print_listofdict -from astune.context_manager.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT +from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT from beast_logger import print_dict, print_nested, NestedJsonItem, SeqItem diff --git a/astune/context_manager/cmt_context_clip.py b/astune/context_manager/agentflow_cm/cmt_context_clip.py similarity index 98% rename from astune/context_manager/cmt_context_clip.py rename to astune/context_manager/agentflow_cm/cmt_context_clip.py index 4b01d427..0b4c1095 100644 --- a/astune/context_manager/cmt_context_clip.py +++ b/astune/context_manager/agentflow_cm/cmt_context_clip.py @@ -5,8 +5,8 @@ import time from typing import List, Callable from beast_logger import print_dict, print_listofdict -from astune.context_manager.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT -from astune.context_manager.cmt_foreign_llm import construct_alien_llm_chat_fn +from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT +from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn from textwrap import dedent from openai import OpenAI from loguru import logger diff --git a/astune/context_manager/cmt_foreign_llm.py b/astune/context_manager/agentflow_cm/cmt_foreign_llm.py similarity index 100% rename from astune/context_manager/cmt_foreign_llm.py rename to astune/context_manager/agentflow_cm/cmt_foreign_llm.py diff --git a/astune/context_manager/cmt_linear.py b/astune/context_manager/agentflow_cm/cmt_linear.py similarity index 99% rename from astune/context_manager/cmt_linear.py rename to astune/context_manager/agentflow_cm/cmt_linear.py index c3899c58..244ec431 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_manager/agentflow_cm/cmt_linear.py @@ -5,9 +5,9 @@ from typing import List, Union, Tuple, Optional from astune.schema.trajectory import Sample, Reward from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.cmt_base_attr import CMTBaseAttr -from astune.context_manager.cmt_base_attr import ExtendedMessage -from astune.context_manager.cmt_base_attr import replace_token_ids +from astune.context_manager.agentflow_cm.cmt_base_attr import CMTBaseAttr +from astune.context_manager.agentflow_cm.cmt_base_attr import ExtendedMessage +from astune.context_manager.agentflow_cm.cmt_base_attr import replace_token_ids from beast_logger import register_logger, print_dict, print_listofdict, print_nested, NestedJsonItem, SeqItem diff --git a/astune/context_manager/cmt_linear_think.py b/astune/context_manager/agentflow_cm/cmt_linear_think.py similarity index 99% rename from astune/context_manager/cmt_linear_think.py rename to astune/context_manager/agentflow_cm/cmt_linear_think.py index 8ea83592..aec6bae2 100644 --- a/astune/context_manager/cmt_linear_think.py +++ b/astune/context_manager/agentflow_cm/cmt_linear_think.py @@ -2,7 +2,7 @@ from textwrap import dedent from typing import List, Tuple from astune.schema.trajectory import Sample, Reward -from astune.context_manager.cmt_linear import ExtendedMessage, CMTLinear +from astune.context_manager.agentflow_cm.cmt_linear import ExtendedMessage, CMTLinear from beast_logger import register_logger, print_dict, print_nested, NestedJsonItem, SeqItem class MultiSampleCMT(CMTLinear): diff --git a/astune/context_manager/cmt_memory.py b/astune/context_manager/agentflow_cm/cmt_memory.py similarity index 100% rename from astune/context_manager/cmt_memory.py rename to astune/context_manager/agentflow_cm/cmt_memory.py diff --git a/astune/context_manager/cmt_phantom_hint.py b/astune/context_manager/agentflow_cm/cmt_phantom_hint.py similarity index 94% rename from astune/context_manager/cmt_phantom_hint.py rename to astune/context_manager/agentflow_cm/cmt_phantom_hint.py index c10f7a14..2ff5b3d4 100644 --- a/astune/context_manager/cmt_phantom_hint.py +++ b/astune/context_manager/agentflow_cm/cmt_phantom_hint.py @@ -1,5 +1,5 @@ from typing import List -from astune.context_manager.cmt_linear import ExtendedMessage, CMTLinear +from astune.context_manager.agentflow_cm.cmt_linear import ExtendedMessage, CMTLinear class LinearThinkCMT(CMTLinear): diff --git a/astune/context_manager/cmt_sliding_window.py b/astune/context_manager/agentflow_cm/cmt_sliding_window.py similarity index 97% rename from astune/context_manager/cmt_sliding_window.py rename to astune/context_manager/agentflow_cm/cmt_sliding_window.py index b24fc813..53904e2f 100644 --- a/astune/context_manager/cmt_sliding_window.py +++ b/astune/context_manager/agentflow_cm/cmt_sliding_window.py @@ -1,6 +1,6 @@ from typing import List, Callable, Tuple from beast_logger import print_listofdict -from astune.context_manager.cmt_linear_think import ExtendedMessage, MultiSampleCMT +from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, MultiSampleCMT from loguru import logger """ @@ -181,7 +181,7 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= def llm_memory_extraction(self, msg_list: List[ExtendedMessage]) -> str: """Use LLM to extract memory from previous messages. """ - from astune.context_manager.cmt_foreign_llm import construct_alien_llm_chat_fn + from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn from textwrap import dedent self.alien_llm_chat_fn: Callable = construct_alien_llm_chat_fn(self.config, self.config.actor_rollout_ref.rollout) messages = self.to_role_content(msg_list) diff --git a/astune/context_manager/cmt_agentscope.py b/astune/context_manager/agentscope_cm/cmt_agentscope.py similarity index 93% rename from astune/context_manager/cmt_agentscope.py rename to astune/context_manager/agentscope_cm/cmt_agentscope.py index d977996f..daecaa4d 100644 --- a/astune/context_manager/cmt_agentscope.py +++ b/astune/context_manager/agentscope_cm/cmt_agentscope.py @@ -3,55 +3,19 @@ from loguru import logger from datetime import datetime from astune.schema.trajectory import Reward, Trajectory -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage +from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, ExtendedMessage from agentscope.model import DashScopeChatModel, ChatResponse from agentscope.message import TextBlock, ToolUseBlock, ThinkingBlock from typing import Dict, Tuple from typing import Any, AsyncGenerator, Generator, Union, TYPE_CHECKING, List, Literal, Type from pydantic import BaseModel -from astune.context_manager.cmt_linear import replace_token_ids, CMTLinear +from astune.context_manager.agentflow_cm.cmt_linear import replace_token_ids, CMTLinear from astune.schema.trajectory import Sample, Reward from beast_logger import register_logger, print_dict, print_nested, NestedJsonItem, SeqItem from astune.utils.compute_madness import compute_string_madness from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model -from astune.context_manager.cmt_base_attr import INVALID_LOG_PROB_VALUE - - -import colorsys - -def adjust_color_hsl(base_color, logprob): - """ - 使用HSL颜色空间根据logprob调整颜色饱和度 - """ - # 将logprob映射到[sat_min, sat_max]的饱和度调整因子 - sat_min = 0.333 - sat_max = 1.0 - lp_min = -7 - lp_max = 0 - - if logprob <= lp_min: - saturation_factor = sat_min - elif logprob >= 0: - saturation_factor = sat_max - else: - saturation_factor = sat_min + (logprob - lp_min) / (lp_max - lp_min) * (sat_max - sat_min) - - # 将十六进制颜色转换为RGB - r = int(base_color[1:3], 16) / 255.0 - g = int(base_color[3:5], 16) / 255.0 - b = int(base_color[5:7], 16) / 255.0 - - # 转换为HSL - h, l, s = colorsys.rgb_to_hls(r, g, b) - - # 调整饱和度 - s_adjusted = s * saturation_factor - - # 转换回RGB - r_adjusted, g_adjusted, b_adjusted = colorsys.hls_to_rgb(h, l, s_adjusted) - - # 转换回十六进制 - return f"#{int(r_adjusted*255):02x}{int(g_adjusted*255):02x}{int(b_adjusted*255):02x}" +from astune.context_manager.agentflow_cm.cmt_base_attr import INVALID_LOG_PROB_VALUE +from astune.utils.color_hsl import adjust_color_hsl class ASTuneContextTemplate(CMTLinear): @@ -257,8 +221,15 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], # load messages into `self.full_context` self.full_context = [] + consider_roles = ['user', 'assistant', 'system', 'tool'] + disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls + if disable_toolcalls: + consider_roles.remove('tool') + for i, msg in enumerate(messages): - if msg['role'] not in ['user', 'assistant', 'system', 'tool']: + if (disable_toolcalls) and (not isinstance(msg['content'], str)): + continue + if msg['role'] not in consider_roles: continue if not isinstance(msg['content'], str): author = 'env' @@ -271,7 +242,7 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], author = 'env' is_last_message = (len(messages) == i+1) - if is_last_message: + if is_last_message and (not disable_toolcalls): _tools = tools else: _tools = [] @@ -307,7 +278,7 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], self.already_mad_flag = True # dummy response for now - token_generator = "manual" if 'tokens' in llm_output else "auto" + token_generator = "manual" if llm_output.get("tool_calls", None) is not None: tool_calls = llm_output["tool_calls"] else: @@ -336,7 +307,7 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], llm_ext_msg ] prompt_text = self.tokenizer.apply_chat_template( - self.to_role_content(self.full_context), + self.to_role_content(self.full_context), # todo tokenize=False, add_generation_prompt=True ) @@ -427,7 +398,6 @@ async def __call__( structured_model = None, **kwargs: Any, ): - import dashscope # For qvq and qwen-vl models, the content field cannot be `None` or # `[{"text": None}]`, so we need to convert it to an empty list. diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index ba3b9377..44224073 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -35,6 +35,7 @@ astune: rollout: use_agentscope_protocol: True agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_disable_toolcalls: False max_env_worker: 128 use_step_reward_from_env: False binary_reward: False diff --git a/astune/main_verl.py b/astune/main_verl.py index 1443b1a3..14e5c53f 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -188,7 +188,7 @@ def run(self, config): else: raise NotImplementedError - from astune.backbone_verl.trainer import ResourcePoolManager, Role + from astune.backbone_others.trainer import ResourcePoolManager, Role # Map roles to their corresponding remote worker classes. role_worker_mapping = { @@ -247,7 +247,7 @@ def run(self, config): train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from astune.backbone_verl.trainer import ASTuneRayPPOTrainer + from astune.backbone_others.trainer import ASTuneRayPPOTrainer # Initialize the PPO trainer. trainer = ASTuneRayPPOTrainer( config=config, diff --git a/astune/parallel_env.py b/astune/parallel_env.py index 085ac49e..d00e058f 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -19,7 +19,7 @@ from astune.task_rollout.env_worker import EnvWorker from astune.schema.task import Task, TaskLaunchCoreArgument from astune.schema.trajectory import Sample -from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr +from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, CMTBaseAttr from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow from astune.utils.utils import run_async_coro__no_matter_what from astune.schema.logprob import TokenAndProb diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index 65d22d13..b022c9dc 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -41,7 +41,7 @@ def compute_reward(self, judge_input_dictionary) -> tuple: task_core_arg = judge_input_dictionary['task_core_arg'] reference_answer = task_core_arg.task.metadata['answer'] - from astune.context_manager.cmt_foreign_llm import construct_alien_llm_chat_fn + from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn alien_llm_chat_fn = construct_alien_llm_chat_fn(self.config) messages = [ { diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 2c58201d..06ab4eca 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -19,7 +19,7 @@ from astune.task_rollout.env_worker import EnvWorker from astune.schema.task import Task, TaskLaunchCoreArgument from astune.schema.trajectory import Sample -from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr +from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, CMTBaseAttr from beast_logger import register_logger, print_dict, print_listofdict from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow from astune.utils.utils import run_async_coro__no_matter_what diff --git a/astune/task_rollout/env_worker.py b/astune/task_rollout/env_worker.py index 3b6c498e..5a72685f 100644 --- a/astune/task_rollout/env_worker.py +++ b/astune/task_rollout/env_worker.py @@ -4,7 +4,7 @@ from astune.workflow_controller.classic_agentflow import AgentFlow from astune.workflow_controller.classic_agentflow import BaseAgentFlow from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow -from astune.context_manager.cmt_linear import CMTLinear +from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear from astune.env_service_client.env_client_ng import EnvClient as EnvClientNg class EnvWorker(object): diff --git a/astune/utils/color_hsl.py b/astune/utils/color_hsl.py new file mode 100644 index 00000000..0e1f20d7 --- /dev/null +++ b/astune/utils/color_hsl.py @@ -0,0 +1,35 @@ +import colorsys + +def adjust_color_hsl(base_color, logprob): + """ + 使用HSL颜色空间根据logprob调整颜色饱和度 + """ + # 将logprob映射到[sat_min, sat_max]的饱和度调整因子 + sat_min = 0.333 + sat_max = 1.0 + lp_min = -7 + lp_max = 0 + + if logprob <= lp_min: + saturation_factor = sat_min + elif logprob >= 0: + saturation_factor = sat_max + else: + saturation_factor = sat_min + (logprob - lp_min) / (lp_max - lp_min) * (sat_max - sat_min) + + # 将十六进制颜色转换为RGB + r = int(base_color[1:3], 16) / 255.0 + g = int(base_color[3:5], 16) / 255.0 + b = int(base_color[5:7], 16) / 255.0 + + # 转换为HSL + h, l, s = colorsys.rgb_to_hls(r, g, b) + + # 调整饱和度 + s_adjusted = s * saturation_factor + + # 转换回RGB + r_adjusted, g_adjusted, b_adjusted = colorsys.hls_to_rgb(h, l, s_adjusted) + + # 转换回十六进制 + return f"#{int(r_adjusted*255):02x}{int(g_adjusted*255):02x}{int(b_adjusted*255):02x}" diff --git a/astune/workflow_controller/agentscope_flow.py b/astune/workflow_controller/agentscope_flow.py index d30cfb05..9696a803 100644 --- a/astune/workflow_controller/agentscope_flow.py +++ b/astune/workflow_controller/agentscope_flow.py @@ -6,12 +6,12 @@ from astune.env_service_client.env_client import EnvClient from astune.workflow_controller.basic_agentflow import BaseAgentFlow from astune.schema.trajectory import Reward, Trajectory -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol -from astune.context_manager.cmt_linear import replace_token_ids, CMTLinear +from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, ExtendedMessage +from astune.context_manager.agentflow_cm.cmt_linear import replace_token_ids, CMTLinear from astune.schema.trajectory import Sample, Reward from typing import Any, Dict, List, Union, Tuple -from astune.context_manager.cmt_agentscope import ASTuneProxy +from astune.context_manager.agentscope_cm.cmt_agentscope import ASTuneProxy from astune.schema.task import Task, TaskLaunchCoreArgument log_generate_lock = threading.Lock() diff --git a/astune/workflow_controller/basic_agentflow.py b/astune/workflow_controller/basic_agentflow.py index 75fbb691..42b86701 100644 --- a/astune/workflow_controller/basic_agentflow.py +++ b/astune/workflow_controller/basic_agentflow.py @@ -1,5 +1,5 @@ -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.context_manager.cmt_linear_think import LinearThinkCMT +from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, ExtendedMessage +from astune.context_manager.agentflow_cm.cmt_linear_think import LinearThinkCMT from typing import Any, Dict, List, Union, Callable class BaseAgentFlow(object): diff --git a/astune/workflow_controller/classic_agentflow.py b/astune/workflow_controller/classic_agentflow.py index 28b263d2..a6706e76 100644 --- a/astune/workflow_controller/classic_agentflow.py +++ b/astune/workflow_controller/classic_agentflow.py @@ -5,10 +5,10 @@ from astune.env_service_client.env_client import EnvClient from astune.utils.utils import convert_tool_to_user_message from astune.schema.trajectory import Reward -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.context_manager.cmt_linear_think import LinearThinkCMT -from astune.context_manager.cmt_context_clip import SelfContextClipCMT -from astune.context_manager.cmt_sliding_window import SlidingWindowCMT +from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, ExtendedMessage +from astune.context_manager.agentflow_cm.cmt_linear_think import LinearThinkCMT +from astune.context_manager.agentflow_cm.cmt_context_clip import SelfContextClipCMT +from astune.context_manager.agentflow_cm.cmt_sliding_window import SlidingWindowCMT from astune.workflow_controller.basic_agentflow import BaseAgentFlow from typing import Any, Dict, List, Union, Callable from beast_logger import print_listofdict diff --git a/documents/backbones.md b/documents/backbones.md new file mode 100644 index 00000000..414c783c --- /dev/null +++ b/documents/backbones.md @@ -0,0 +1,47 @@ +### Other Backbones + +1. Trinity backbone: Click to read trinity backbone installation (Option 1) + +```bash +# Create virtual environment +uv venv --python=3.10.16 +source .venv/bin/activate +git clone https://github.com/binary-husky/Trinity-RFT external/trinity + +# Install dependencies +uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ +uv pip install -r requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow +uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps + +# Install flash attention (must be installed last) +uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation +``` + +2. VERL Backbone: Click to read VERL backbone installation (Option 2) + + +```bash +# Create virtual environment +uv venv --python=3.10.16 +source .venv/bin/activate +git clone https://github.com/binary-husky/verl.git external/verl + +# Install dependencies +uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ +uv pip install -r requirements_verl.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow +uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no-deps + +# Install flash attention (must be installed last) +uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation +``` + + +3. 🔄Switch Verl/Trinity backbone: cannot install both backbone at the same time, run the following command to toggle. + +```bash +# verl -> trinity +cd external/verl && uv pip uninstall . && cd ../.. + +# trinity -> verl +uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no-deps +``` diff --git a/documents/tokenizer_nodes.md b/documents/tokenizer_nodes.md new file mode 100644 index 00000000..798e7170 --- /dev/null +++ b/documents/tokenizer_nodes.md @@ -0,0 +1,132 @@ + +### case 1 + +```python +pprint(messages) +[{'role': 'assistant', + 'tool_calls': [{'function': {'arguments': {'location': 'Paris, France', + 'unit': 'celsius'}, + 'name': 'get_current_temperature'}, + 'type': 'function'}]}] +``` + +--------------------------------------------------------------------------------------------------- +print(self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)) +```python +<|im_start|>system +You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|> +<|im_start|>assistant + +{"name": "get_current_temperature", "arguments": {"location": "Paris, France", "unit": "celsius"}} +<|im_end|> +``` + + +### case 2 + +```python +pprint(messages) +[{'content': 'THIS IS CONTENT', + 'role': 'assistant', + 'tool_calls': [{'function': {'arguments': {'location': 'Paris, France', + 'unit': 'celsius'}, + 'name': 'get_current_temperature'}, + 'type': 'function'}]}] +``` + +--------------------------------------------------------------------------------------------------- +print(self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)) +```python +<|im_start|>system +You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|> +<|im_start|>assistant +THIS IS CONTENT + +{"name": "get_current_temperature", "arguments": {"location": "Paris, France", "unit": "celsius"}} +<|im_end|> +``` + +### case 3 + +```python +pprint(messages) +[{'content': 'THIS IS CONTENT', + 'role': 'assistant', + 'tool_calls': [{'function': {'arguments': {'location': 'Paris, France', + 'unit': 'celsius'}, + 'name': 'get_current_temperature'}, + 'type': 'function'}]}] +``` + +```python +print(tools) +[ + {'type': 'function', 'function': {'name': 'execute_python_code', 'parameters': {'properties': {'code': {'description': 'The Python code to be executed.', 'type': 'string'}, 'timeout': {'default': 300, 'description': 'The maximum time (in seconds) allowed for the code to run.', 'type': 'number'}}, 'required': ['code'], 'type': 'object'}, 'description': 'Execute the given python code in a temp file and capture the return\n\ncode, standard output and error. Note you must `print` the output to get\nthe result, and the tmp file will be removed right after the execution.'}}, + {'type': 'function', 'function': {'name': 'generate_response', 'parameters': {'properties': {'response': {'description': 'Your response to the user.', 'type': 'string'}, 'result': {'description': 'Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}', 'type': 'string'}}, 'required': ['response', 'result'], 'type': 'object'}, 'description': 'Generate a response. Note only the input argument `response` is\n\nvisible to the others, you should include all the necessary\ninformation in the `response` argument.'}} +] +``` +--------------------------------------------------------------------------------------------------- + +```python +<|im_start|>system +You are Qwen, created by Alibaba Cloud. You are a helpful assistant. + +# Tools + +You may call one or more functions to assist with the user query. + +You are provided with function signatures within XML tags: + +{"type": "function", "function": {"name": "execute_python_code", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}, "description": "Execute the given python code in a temp file and capture the return\n\ncode, standard output and error. Note you must `print` the output to get\nthe result, and the tmp file will be removed right after the execution."}} +{"type": "function", "function": {"name": "generate_response", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}, "description": "Generate a response. Note only the input argument `response` is\n\nvisible to the others, you should include all the necessary\ninformation in the `response` argument."}} + + +For each function call, return a json object with function name and arguments within XML tags: + +{"name": , "arguments": } +<|im_end|> +<|im_start|>assistant +THIS IS CONTENT + +{"name": "get_current_temperature", "arguments": {"location": "Paris, France", "unit": "celsius"}} +<|im_end|> +``` + +### + +/mnt/data_cpfs/fuqingxu/astune/.venv/bin/python -m vllm.entrypoints.cli.main serve /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct --tensor-parallel-size 4 --dtype auto --enforce-eager --gpu-memory-utilization 0.9 --disable-custom-all-reduce --max-num-seqs 10 --max-model-len 18000 --load-format auto --enable-chunked-prefill --enable-auto-tool-choice --tool-call-parser hermes --enable-prefix-caching --seed 12345 --port 18000 + +``` +<|im_start|>system + +You are an agent specialized in solving math problems with tools. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. You should return your final answer within \\boxed{{}}. + + +# Tools + +You may call one or more functions to assist with the user query. + +You are provided with function signatures within XML tags: + +{"type": "function", "function": {"name": "execute_python_code", "description": "Execute the given python code in a temp file and capture the return\ +\ +code, standard output and error. Note you must `print` the output to get\ +the result, and the tmp file will be removed right after the execution.", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}}} +{"type": "function", "function": {"name": "generate_response", "description": "Generate a response. Note only the input argument `response` is\ +\ +visible to the others, you should include all the necessary\ +information in the `response` argument.", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\\\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}}} + + +For each function call, return a json object with function name and arguments within XML tags: + +{"name": , "arguments": } +<|im_end|> +<|im_start|>user + +Natalia sold clips to 48 of her friends in April, and then she +sold half as many clips in May. How many clips did Natalia sell +altogether in April and May? +<|im_end|> +<|im_start|>assistant +``` \ No newline at end of file diff --git a/documents/vllm_tokenizer.py b/documents/vllm_tokenizer.py new file mode 100644 index 00000000..73ffc906 --- /dev/null +++ b/documents/vllm_tokenizer.py @@ -0,0 +1,2278 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project + +import warnings +from collections.abc import Mapping +from typing import Literal + +import pytest +from mistral_common.tokens.tokenizers.base import SpecialTokenPolicy + +from vllm.assets.audio import AudioAsset +from vllm.assets.image import ImageAsset +from vllm.assets.video import VideoAsset +from vllm.config import ModelConfig +from vllm.entrypoints.chat_utils import ( + _try_extract_ast, + apply_mistral_chat_template, + load_chat_template, + parse_chat_messages, + parse_chat_messages_futures, + resolve_chat_template_content_format, + resolve_chat_template_kwargs, + resolve_hf_chat_template, +) +from vllm.multimodal import MultiModalDataDict, MultiModalUUIDDict +from vllm.multimodal.utils import ( + encode_audio_base64, + encode_image_base64, + encode_video_base64, +) +from vllm.transformers_utils.tokenizer import get_tokenizer +from vllm.transformers_utils.tokenizers.mistral import MistralTokenizer + +from ..models.registry import HF_EXAMPLE_MODELS +from ..utils import VLLM_PATH + +EXAMPLES_DIR = VLLM_PATH / "examples" + +PHI3V_MODEL_ID = "microsoft/Phi-3.5-vision-instruct" +ULTRAVOX_MODEL_ID = "fixie-ai/ultravox-v0_5-llama-3_2-1b" +QWEN2AUDIO_MODEL_ID = "Qwen/Qwen2-Audio-7B-Instruct" +QWEN2VL_MODEL_ID = "Qwen/Qwen2-VL-2B-Instruct" +QWEN25VL_MODEL_ID = "Qwen/Qwen2.5-VL-3B-Instruct" +QWEN25OMNI_MODEL_ID = "Qwen/Qwen2.5-Omni-7B" +QWEN3_MODEL_ID = "Qwen/Qwen3-8B" +LLAMA_GUARD_MODEL_ID = "meta-llama/Llama-Guard-3-1B" +HERMES_MODEL_ID = "NousResearch/Hermes-3-Llama-3.1-8B" +MISTRAL_MODEL_ID = "mistralai/Mistral-Small-3.1-24B-Instruct-2503" + + +@pytest.fixture(scope="function") +def phi3v_model_config(): + return ModelConfig( + PHI3V_MODEL_ID, + runner="generate", + trust_remote_code=True, + limit_mm_per_prompt={ + "image": 2, + }, + ) + + +@pytest.fixture(scope="function") +def phi3v_model_config_mm_interleaved(): + return ModelConfig( + PHI3V_MODEL_ID, + runner="generate", + trust_remote_code=True, + interleave_mm_strings=True, + limit_mm_per_prompt={ + "image": 2, + }, + ) + + +@pytest.fixture(scope="function") +def phi3v_model_config_image_embeds(): + return ModelConfig( + PHI3V_MODEL_ID, + runner="generate", + trust_remote_code=True, + limit_mm_per_prompt={ + "image": 2, + }, + enable_mm_embeds=True, + ) + + +@pytest.fixture(scope="module") +def phi3v_tokenizer(): + return get_tokenizer(PHI3V_MODEL_ID) + + +@pytest.fixture(scope="function") +def qwen2_audio_model_config(): + return ModelConfig( + QWEN2AUDIO_MODEL_ID, + runner="generate", + trust_remote_code=True, + limit_mm_per_prompt={ + "audio": 1, + }, + ) + + +@pytest.fixture(scope="module") +def qwen2_audio_tokenizer(): + return get_tokenizer(QWEN2AUDIO_MODEL_ID) + + +@pytest.fixture(scope="function") +def qwen25omni_model_config_mm_interleaved(): + return ModelConfig( + QWEN25OMNI_MODEL_ID, + runner="generate", + interleave_mm_strings=True, + limit_mm_per_prompt={ + "image": 2, + "audio": 1, + "video": 1, + }, + ) + + +@pytest.fixture(scope="module") +def qwen25omni_tokenizer(): + return get_tokenizer(QWEN25OMNI_MODEL_ID) + + +@pytest.fixture(scope="function") +def mistral_model_config(): + return ModelConfig( + MISTRAL_MODEL_ID, + runner="generate", + limit_mm_per_prompt={ + "image": 2, + }, + ) + + +@pytest.fixture(scope="module") +def mistral_tokenizer(): + return get_tokenizer(MISTRAL_MODEL_ID) + + +@pytest.fixture(scope="module") +def image_url(): + image = ImageAsset("cherry_blossom") + base64 = encode_image_base64(image.pil_image) + return f"data:image/jpeg;base64,{base64}" + + +@pytest.fixture(scope="module") +def video_url(): + video = VideoAsset("baby_reading", 1) + base64 = encode_video_base64(video.np_ndarrays) + return f"data:video/jpeg;base64,{base64}" + + +@pytest.fixture(scope="module") +def audio_url(): + audio = AudioAsset("mary_had_lamb") + base64 = encode_audio_base64(*audio.audio_and_sample_rate) + return f"data:audio/ogg;base64,{base64}" + + +def _assert_mm_data_is_image_input( + mm_data: MultiModalDataDict | None, + image_count: int, + skipped_image_indices: list | None = None, +) -> None: + assert mm_data is not None + assert set(mm_data.keys()) == {"image"} + + image_data = mm_data.get("image") + assert image_data is not None + + assert isinstance(image_data, list) and len(image_data) == image_count + if skipped_image_indices is not None: + for i in skipped_image_indices: + assert image_data[i] is None + + +def _assert_mm_uuids( + mm_uuids: MultiModalUUIDDict | None, + media_count: int, + expected_uuids: list[str | None], + modality: str = "image", +) -> None: + if len(expected_uuids) > 0: + assert mm_uuids is not None + assert modality in mm_uuids + + image_uuids = mm_uuids.get(modality) + assert image_uuids is not None + + assert isinstance(image_uuids, list) and len(image_uuids) == media_count + + assert image_uuids == expected_uuids + else: + assert mm_uuids is None + + +ModalityType = Literal["image", "video", "audio"] +MultiModalDataCounts = Mapping[ModalityType, int] + + +def _assert_mm_data_inputs( + mm_data: MultiModalDataDict | None, + data_count: MultiModalDataCounts, + skipped_media_indices: dict[str, list] | None = None, # modality -> list[int] +) -> None: + assert mm_data is not None + assert set(data_count.keys()) == (set(mm_data.keys())) + + for modality, n in data_count.items(): + modality_data = mm_data.get(modality) + assert modality_data is not None + assert isinstance(modality_data, list) and len(modality_data) == n + + if skipped_media_indices is not None: + skipped_media_indices_for_modality = skipped_media_indices.get(modality) + assert skipped_media_indices_for_modality is not None + for i in skipped_media_indices_for_modality: + assert modality_data[i] is None + + +def test_parse_chat_messages_single_image( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} + ] + _assert_mm_data_is_image_input(mm_data, 1) + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) + + +def test_parse_chat_messages_single_image_with_uuid( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid = str(hash(image_url)) + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": { + "url": image_url, + }, + "uuid": image_uuid, + }, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} + ] + _assert_mm_data_is_image_input(mm_data, 1) + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) + + +def test_parse_chat_messages_single_empty_image_with_uuid( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid = str(hash(image_url)) + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": None, + "uuid": image_uuid, + }, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} + ] + _assert_mm_data_is_image_input(mm_data, 1, skipped_image_indices=[0]) + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) + + +def test_parse_chat_messages_single_image_with_bad_uuid_format( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid = str(hash(image_url)) + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": { + "url": image_url, + "uuid": image_uuid, + }, + "bad_uuid_key": image_uuid, + }, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} + ] + _assert_mm_data_is_image_input(mm_data, 1) + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) + + +def test_parse_chat_messages_multiple_images_with_uuids( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid1 = "my_uuid_1" + image_uuid2 = "my_uuid_2" + + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": { + "url": image_url, + }, + "uuid": image_uuid1, + }, + { + "type": "image_url", + "image_url": { + "url": image_url, + }, + "uuid": image_uuid2, + }, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in the image?", + } + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) + + +def test_parse_chat_messages_multiple_empty_images_with_uuids( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid1 = "my_uuid_1" + image_uuid2 = "my_uuid_2" + + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": None, + "uuid": image_uuid1, + }, + { + "type": "image_url", + "image_url": None, + "uuid": image_uuid2, + }, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in the image?", + } + ] + _assert_mm_data_is_image_input(mm_data, 2, skipped_image_indices=[0, 1]) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) + + +def test_parse_chat_messages_mixed_empty_images_with_uuids( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid1 = "my_uuid_1" + image_uuid2 = "my_uuid_2" + + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": { + "url": image_url, + }, + "uuid": image_uuid1, + }, + { + "type": "image_url", + "image_url": None, + "uuid": image_uuid2, + }, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in the image?", + } + ] + _assert_mm_data_is_image_input(mm_data, 2, skipped_image_indices=[1]) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_single_image_with_uuid_async( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid = str(hash(image_url)) + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": image_uuid, + }, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} + ] + _assert_mm_data_is_image_input(await mm_future, 1) + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_empty_image_with_uuid_async( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid = str(hash(image_url)) + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": None, + "uuid": image_uuid, + }, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} + ] + _assert_mm_data_is_image_input(await mm_future, 1, skipped_image_indices=[0]) + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_multiple_images_with_uuids_async( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid1 = "my_uuid_1" + image_uuid2 = "my_uuid_2" + + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": image_uuid1, + }, + { + "type": "image_pil", + "image_pil": ImageAsset("cherry_blossom").pil_image, + "uuid": image_uuid2, + }, + {"type": "text", "text": "What's in these images?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", + } + ] + _assert_mm_data_is_image_input(await mm_future, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_multiple_empty_images_with_uuids_async( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid1 = "my_uuid_1" + image_uuid2 = "my_uuid_2" + + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": None, + "uuid": image_uuid1, + }, + { + "type": "image_pil", + "image_pil": None, + "uuid": image_uuid2, + }, + {"type": "text", "text": "What's in these images?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", + } + ] + _assert_mm_data_is_image_input(await mm_future, 2, skipped_image_indices=[0, 1]) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_multiple_images_with_partial_uuids_async( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid2 = "my_uuid_2" + + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": image_url}, + }, + { + "type": "image_pil", + "image_pil": ImageAsset("cherry_blossom").pil_image, + "uuid": image_uuid2, + }, + {"type": "text", "text": "What's in these images?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", + } + ] + _assert_mm_data_is_image_input(await mm_future, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, image_uuid2]) + + +def test_parse_chat_messages_empty_system( + mistral_model_config, + mistral_tokenizer, +): + # Test string format + conversation, _, _ = parse_chat_messages( + [ + {"role": "system", "content": ""}, + { + "role": "user", + "content": [{"type": "text", "text": "Who are you?"}], + }, + ], + mistral_model_config, + mistral_tokenizer, + content_format="string", + ) + assert conversation == [ + {"role": "system", "content": ""}, + {"role": "user", "content": "Who are you?"}, + ] + + # Test openai format + conversation, _, _ = parse_chat_messages( + [ + {"role": "system", "content": ""}, + { + "role": "user", + "content": [{"type": "text", "text": "Who are you?"}], + }, + ], + mistral_model_config, + mistral_tokenizer, + content_format="openai", + ) + assert conversation == [ + {"role": "system", "content": [{"type": "text", "text": ""}]}, + {"role": "user", "content": [{"type": "text", "text": "Who are you?"}]}, + ] + + +@pytest.mark.asyncio +async def test_parse_chat_messages_single_image_async( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "What's in the image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} + ] + _assert_mm_data_is_image_input(await mm_future, 1) + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) + + +def test_parse_chat_messages_multiple_images( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + { + "type": "image_pil", + "image_pil": ImageAsset("cherry_blossom").pil_image, + }, + {"type": "text", "text": "What's in these images?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", + } + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +def test_parse_chat_messages_empty_pil_image_with_uuid( + phi3v_model_config, + phi3v_tokenizer, +): + uuid = "abcd" + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "image_pil", "image_pil": None, "uuid": uuid}, + {"type": "text", "text": "What's in this image?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\nWhat's in this image?", + } + ] + _assert_mm_data_is_image_input(mm_data, 1, skipped_image_indices=[0]) + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[uuid]) + + +def test_parse_chat_messages_empty_image_embeds_with_uuid( + phi3v_model_config_image_embeds, + phi3v_tokenizer, +): + uuid = "abcd" + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "image_embeds", "image_embeds": None, "uuid": uuid}, + {"type": "text", "text": "What's in this image?"}, + ], + } + ], + phi3v_model_config_image_embeds, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\nWhat's in this image?", + } + ] + assert mm_data is not None + assert "image" in mm_data + assert mm_data["image"] is None + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[uuid]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_empty_image_embeds_with_uuid_async( + phi3v_model_config_image_embeds, + phi3v_tokenizer, +): + uuid = "abcd" + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + {"type": "image_embeds", "image_embeds": None, "uuid": uuid}, + {"type": "text", "text": "What's in this image?"}, + ], + } + ], + phi3v_model_config_image_embeds, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\nWhat's in this image?", + } + ] + mm_data = await mm_future + assert mm_data is not None + assert "image" in mm_data + assert mm_data["image"] is None + _assert_mm_uuids(mm_uuids, 1, expected_uuids=[uuid]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_multiple_images_async( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + { + "type": "image_pil", + "image_pil": ImageAsset("cherry_blossom").pil_image, + }, + {"type": "text", "text": "What's in these images?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", + } + ] + _assert_mm_data_is_image_input(await mm_future, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +def test_parse_chat_messages_placeholder_already_in_prompt( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "image_url", "image_url": {"url": image_url}}, + { + "type": "text", + "text": "What's in <|image_1|> and how does it compare to <|image_2|>?", # noqa: E501 + }, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + assert conversation == [ + { + "role": "user", + "content": "What's in <|image_1|> and how does it compare to <|image_2|>?", + } + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +def test_parse_chat_messages_placeholder_one_already_in_prompt( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "image_url", "image_url": {"url": image_url}}, + { + "type": "text", + "text": "What's in <|image_1|> and how does it compare to " + "the other one?", + }, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_2|>\nWhat's in <|image_1|> and how does it compare to " + "the other one?", + } + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +def test_parse_chat_messages_multiple_images_across_messages( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "What's in this image?"}, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "What about this one?"}, + ], + }, + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in this image?"}, + {"role": "assistant", "content": "Some stuff."}, + {"role": "user", "content": "<|image_2|>\nWhat about this one?"}, + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +def test_parse_chat_messages_multiple_images_with_uuids_across_messages( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + image_uuid = str(hash(image_url)) + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": image_uuid, + }, + {"type": "text", "text": "What's in this image?"}, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": image_uuid, + }, + {"type": "text", "text": "What about this one?"}, + ], + }, + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + {"role": "user", "content": "<|image_1|>\nWhat's in this image?"}, + {"role": "assistant", "content": "Some stuff."}, + {"role": "user", "content": "<|image_2|>\nWhat about this one?"}, + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid, image_uuid]) + + +def test_parse_chat_messages_context_text_format( + phi3v_model_config, + phi3v_tokenizer, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [{"type": "text", "text": "What's in this text?"}], + }, + {"role": "assistant", "content": "Some stuff."}, + {"role": "user", "content": "What about this one?"}, + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="openai", + ) + + assert conversation == [ + { + "role": "user", + "content": [{"type": "text", "text": "What's in this text?"}], + }, + { + "role": "assistant", + "content": [{"type": "text", "text": "Some stuff."}], + }, + { + "role": "user", + "content": [{"type": "text", "text": "What about this one?"}], + }, + ] + assert mm_data is None + assert mm_uuids is None + + +def test_parse_chat_messages_rejects_too_many_images_in_one_message( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + message="coroutine 'async_get_and_parse_image' was never awaited", + ) + with pytest.raises(ValueError, match="At most"): + parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": image_url}, + }, + { + "type": "image_url", + "image_url": {"url": image_url}, + }, + { + "type": "image_url", + "image_url": {"url": image_url}, + }, + {"type": "text", "text": "What's in these images?"}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + +def test_parse_chat_messages_rejects_too_many_images_across_messages( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + message="coroutine 'async_get_and_parse_image' was never awaited", + ) + with pytest.raises(ValueError, match="At most"): + parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": image_url}, + }, + {"type": "text", "text": "What's in this image?"}, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": image_url}, + }, + { + "type": "image_url", + "image_url": {"url": image_url}, + }, + {"type": "text", "text": "What about these two?"}, + ], + }, + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + +def test_parse_chat_messages_multiple_images_uncommon_input( + phi3v_model_config, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + "What's in these images?", + {"image_url": image_url}, + {"image_url": image_url}, + ], + } + ], + phi3v_model_config, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", + } + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +def test_parse_chat_messages_multiple_images_interleave( + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "I need you to compare this image", + }, + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "and this one"}, + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "Do they have differences?"}, + ], + } + ], + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "I need you to compare this image\n<|image_1|>\nand this one\n<|image_2|>\n" # noqa: E501 + "Do they have differences?", + } + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_multiple_images_interleave_async( + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "I need you to compare this image", + }, + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "and this one"}, + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "Do they have differences?"}, + ], + } + ], + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "I need you to compare this image\n<|image_1|>\nand this one\n<|image_2|>\n" # noqa: E501 + "Do they have differences?", + } + ] + _assert_mm_data_is_image_input(await mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_multiple_images_with_uuids_interleave_async( + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + image_url, +): + image_uuid = str(hash(image_url)) + conversation, mm_data, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "I need you to compare this image", + }, + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": image_uuid, + }, + {"type": "text", "text": "and this one"}, + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": image_uuid, + }, + {"type": "text", "text": "Do they have differences?"}, + ], + } + ], + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "I need you to compare this image\n<|image_1|>\nand this one\n<|image_2|>\n" # noqa: E501 + "Do they have differences?", + } + ] + _assert_mm_data_is_image_input(await mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid, image_uuid]) + + +def test_parse_chat_messages_multiple_images_multiple_messages_interleave( + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + image_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "Be accurate."}, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + {"type": "image_url", "image_url": {"url": image_url}}, + ], + }, + ], + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "What's on this image?\n<|image_1|>\nBe accurate.", + }, + {"role": "assistant", "content": "Some stuff."}, + {"role": "user", "content": "What's on this image?\n<|image_2|>"}, + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) + + +def test_parse_chat_messages_multiple_images_with_uuids_multiple_messages_interleave( + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + image_url, +): + image_uuid = str(hash(image_url)) + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": image_uuid, + }, + {"type": "text", "text": "Be accurate."}, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": image_uuid, + }, + ], + }, + ], + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "What's on this image?\n<|image_1|>\nBe accurate.", + }, + {"role": "assistant", "content": "Some stuff."}, + {"role": "user", "content": "What's on this image?\n<|image_2|>"}, + ] + _assert_mm_data_is_image_input(mm_data, 2) + _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid, image_uuid]) + + +def test_parse_chat_messages_multiple_modals_multiple_messages_interleave( + qwen25omni_model_config_mm_interleaved, + qwen25omni_tokenizer, + image_url, + video_url, + audio_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "Now listen to this audio"}, + {"type": "audio_url", "audio_url": {"url": audio_url}}, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "And what's in the video?"}, + {"type": "video_url", "video_url": {"url": video_url}}, + ], + }, + ], + qwen25omni_model_config_mm_interleaved, + qwen25omni_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" + "\nNow listen to this audio\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>", + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" + "\nAnd what's in the video?\n<|vision_start|><|VIDEO|><|vision_end|>", + }, + ] + + _assert_mm_data_inputs(mm_data, {"image": 2, "video": 1, "audio": 1}) + _assert_mm_uuids(mm_uuids, 2, modality="image", expected_uuids=[None, None]) + _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=[None]) + _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[None]) + + +def test_parse_chat_messages_multiple_modals_with_uuids_multiple_messages_interleave( + qwen25omni_model_config_mm_interleaved, + qwen25omni_tokenizer, + image_url, + video_url, + audio_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": "image_123", + }, + {"type": "text", "text": "Now listen to this audio"}, + { + "type": "audio_url", + "audio_url": {"url": audio_url}, + "uuid": "audio_123", + }, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": "image_123", + }, + {"type": "text", "text": "And what's in the video?"}, + { + "type": "video_url", + "video_url": {"url": video_url}, + "uuid": "video_123", + }, + ], + }, + ], + qwen25omni_model_config_mm_interleaved, + qwen25omni_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" + "\nNow listen to this audio\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>", + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" + "\nAnd what's in the video?\n<|vision_start|><|VIDEO|><|vision_end|>", + }, + ] + + _assert_mm_data_inputs(mm_data, {"image": 2, "video": 1, "audio": 1}) + _assert_mm_uuids( + mm_uuids, 2, modality="image", expected_uuids=["image_123", "image_123"] + ) + _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) + _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=["audio_123"]) + + +def test_parse_chat_messages_multiple_modals_with_uuids_multiple_empty_media_messages_interleave( # noqa: E501 + qwen25omni_model_config_mm_interleaved, + qwen25omni_tokenizer, + image_url, + video_url, + audio_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + { + "type": "image_url", + "image_url": None, + "uuid": "image_123", + }, + {"type": "text", "text": "Now listen to this audio"}, + { + "type": "audio_url", + "audio_url": None, + "uuid": "audio_123", + }, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + { + "type": "image_url", + "image_url": None, + "uuid": "image_123", + }, + {"type": "text", "text": "And what's in the video?"}, + { + "type": "video_url", + "video_url": None, + "uuid": "video_123", + }, + ], + }, + ], + qwen25omni_model_config_mm_interleaved, + qwen25omni_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" + "\nNow listen to this audio\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>", + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" + "\nAnd what's in the video?\n<|vision_start|><|VIDEO|><|vision_end|>", + }, + ] + + _assert_mm_data_inputs( + mm_data, + {"image": 2, "video": 1, "audio": 1}, + skipped_media_indices={"image": [0, 1], "video": [0], "audio": [0]}, + ) + _assert_mm_uuids( + mm_uuids, 2, modality="image", expected_uuids=["image_123", "image_123"] + ) + _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) + _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=["audio_123"]) + + +def test_parse_chat_messages_multiple_modals_with_partial_uuids_multiple_messages_interleave( # noqa: E501 + qwen25omni_model_config_mm_interleaved, + qwen25omni_tokenizer, + image_url, + video_url, + audio_url, +): + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + { + "type": "image_url", + "image_url": {"url": image_url}, + "uuid": "image_123", + }, + {"type": "text", "text": "Now listen to this audio"}, + {"type": "audio_url", "audio_url": {"url": audio_url}}, + ], + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": [ + {"type": "text", "text": "What's on this image?"}, + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "text", "text": "And what's in the video?"}, + { + "type": "video_url", + "video_url": {"url": video_url}, + "uuid": "video_123", + }, + ], + }, + ], + qwen25omni_model_config_mm_interleaved, + qwen25omni_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" + "\nNow listen to this audio\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>", + }, + {"role": "assistant", "content": "Some stuff."}, + { + "role": "user", + "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" + "\nAnd what's in the video?\n<|vision_start|><|VIDEO|><|vision_end|>", + }, + ] + + _assert_mm_data_inputs(mm_data, {"image": 2, "video": 1, "audio": 1}) + _assert_mm_uuids(mm_uuids, 2, modality="image", expected_uuids=["image_123", None]) + _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) + _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[None]) + + +def test_parse_chat_messages_multiple_images_interleave_with_placeholders( + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + image_url, +): + with pytest.raises( + ValueError, + match=r"Found more '<|image_1|>' placeholders in input prompt " + "than actual multimodal data items.", + ): + parse_chat_messages( + [ + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": image_url}}, + {"type": "image_url", "image_url": {"url": image_url}}, + { + "type": "text", + "text": "I need you to compare this image\n<|image_1|>\nand this one\n<|image_2|>\n" # noqa: E501 + "Do they have differences?", + }, + ], + } + ], + phi3v_model_config_mm_interleaved, + phi3v_tokenizer, + content_format="string", + ) + + +@pytest.mark.parametrize( + "model", + [ + QWEN2VL_MODEL_ID, # tokenizer.chat_template is of type str + HERMES_MODEL_ID, # tokenizer.chat_template is of type dict + ], +) +@pytest.mark.parametrize("use_tools", [True, False]) +def test_resolve_hf_chat_template(sample_json_schema, model, use_tools): + """checks that chat_template is a dict type for HF models.""" + model_info = HF_EXAMPLE_MODELS.find_hf_info(model) + model_info.check_available_online(on_fail="skip") + + model_config = ModelConfig( + model, + tokenizer=model_info.tokenizer or model, + tokenizer_mode=model_info.tokenizer_mode, + revision=model_info.revision, + trust_remote_code=model_info.trust_remote_code, + hf_overrides=model_info.hf_overrides, + skip_tokenizer_init=model_info.require_embed_inputs, + enable_prompt_embeds=model_info.require_embed_inputs, + enable_mm_embeds=model_info.require_embed_inputs, + enforce_eager=model_info.enforce_eager, + dtype=model_info.dtype, + ) + + # Build the tokenizer + tokenizer = get_tokenizer( + model, + trust_remote_code=model_config.trust_remote_code, + ) + + tools = ( + [ + { + "type": "function", + "function": { + "name": "dummy_function_name", + "description": "This is a dummy function", + "parameters": sample_json_schema, + }, + } + ] + if use_tools + else None + ) + + # Test detecting the tokenizer's chat_template + chat_template = resolve_hf_chat_template( + tokenizer, + chat_template=None, + tools=tools, + model_config=model_config, + ) + assert isinstance(chat_template, str) + + +@pytest.mark.parametrize( + "model, expected_kwargs", + [ + ( + QWEN2VL_MODEL_ID, + { + "add_vision_id", + "add_generation_prompt", + "continue_final_message", + "tools", + }, + ), + ( + QWEN3_MODEL_ID, + { + "enable_thinking", + "add_generation_prompt", + "continue_final_message", + "tools", + }, + ), + ], +) +def test_resolve_hf_chat_template_kwargs(sample_json_schema, model, expected_kwargs): + """checks that chat_template is a dict type for HF models.""" + model_info = HF_EXAMPLE_MODELS.find_hf_info(model) + model_info.check_available_online(on_fail="skip") + + tools = [ + { + "type": "function", + "function": { + "name": "dummy_function_name", + "description": "This is a dummy function", + "parameters": sample_json_schema, + }, + } + ] + + chat_template_kwargs = { + # both unused + "unsed_kwargs_1": 123, + "unsed_kwargs_2": "abc", + # should not appear + "chat_template": "{% Hello world! %}", + "tokenize": True, + # used by tokenizer + "continue_final_message": True, + "tools": tools, + # both used by Qwen2-VL and Qwen3 + "add_generation_prompt": True, + # only used by Qwen2-VL + "add_vision_id": True, + # only used by Qwen3 + "enable_thinking": True, + } + + model_config = ModelConfig( + model, + tokenizer=model_info.tokenizer or model, + tokenizer_mode=model_info.tokenizer_mode, + revision=model_info.revision, + trust_remote_code=model_info.trust_remote_code, + hf_overrides=model_info.hf_overrides, + skip_tokenizer_init=model_info.require_embed_inputs, + enable_prompt_embeds=model_info.require_embed_inputs, + enable_mm_embeds=model_info.require_embed_inputs, + enforce_eager=model_info.enforce_eager, + dtype=model_info.dtype, + ) + + # Build the tokenizer + tokenizer = get_tokenizer( + model, + trust_remote_code=model_config.trust_remote_code, + ) + + # Test detecting the tokenizer's chat_template + chat_template = resolve_hf_chat_template( + tokenizer, + chat_template=None, + tools=tools, + model_config=model_config, + ) + with pytest.raises( + ValueError, match="Found unexpected chat template kwargs from request" + ): + # should raise error if `chat_template_kwargs` contains + # `chat_template` or `tokenize` + resolve_chat_template_kwargs( + tokenizer, + chat_template=chat_template, + chat_template_kwargs=chat_template_kwargs, + ) + resolved_chat_template_kwargs = resolve_chat_template_kwargs( + tokenizer, + chat_template=chat_template, + chat_template_kwargs=chat_template_kwargs, + raise_on_unexpected=False, + ) + assert set(resolved_chat_template_kwargs.keys()) == expected_kwargs + + # Additional test: Verify HF base parameters work with **kwargs tokenizers + # This validates the fix for tokenizers like Kimi K2 that use **kwargs + # to receive standard HuggingFace parameters instead of declaring them explicitly + from vllm.entrypoints.chat_utils import _get_hf_base_chat_template_params + + hf_base_params = _get_hf_base_chat_template_params() + # Verify common HF parameters are in the base class + assert {"add_generation_prompt", "tools", "continue_final_message"}.issubset( + hf_base_params + ), f"Expected HF base params not found in {hf_base_params}" + + # Test with a mock tokenizer that uses **kwargs (like Kimi K2) + class MockTokenizerWithKwargs: + def apply_chat_template(self, conversation, **kwargs): + return "mocked_output" + + mock_tokenizer = MockTokenizerWithKwargs() + mock_kwargs = { + "add_generation_prompt": True, + "tools": tools, + "continue_final_message": False, + "unknown_param": "should_be_filtered", + } + resolved_mock = resolve_chat_template_kwargs( + mock_tokenizer, chat_template, mock_kwargs, raise_on_unexpected=False + ) + # HF base params should pass through even with **kwargs tokenizer + assert "add_generation_prompt" in resolved_mock + assert "tools" in resolved_mock + assert "continue_final_message" in resolved_mock + # Unknown params should be filtered out + assert "unknown_param" not in resolved_mock + + +# NOTE: Qwen2-Audio default chat template is specially defined inside +# processor class instead of using `tokenizer_config.json` +@pytest.mark.parametrize( + ("model", "expected_format"), + [ + (PHI3V_MODEL_ID, "string"), + (QWEN2VL_MODEL_ID, "openai"), + (QWEN25VL_MODEL_ID, "openai"), + (ULTRAVOX_MODEL_ID, "string"), + (QWEN2AUDIO_MODEL_ID, "openai"), + (LLAMA_GUARD_MODEL_ID, "openai"), + ], +) +def test_resolve_content_format_hf_defined(model, expected_format): + model_info = HF_EXAMPLE_MODELS.find_hf_info(model) + model_info.check_available_online(on_fail="skip") + + model_config = ModelConfig( + model, + tokenizer=model_info.tokenizer or model, + tokenizer_mode=model_info.tokenizer_mode, + revision=model_info.revision, + trust_remote_code=model_info.trust_remote_code, + hf_overrides=model_info.hf_overrides, + skip_tokenizer_init=model_info.require_embed_inputs, + enable_prompt_embeds=model_info.require_embed_inputs, + enable_mm_embeds=model_info.require_embed_inputs, + enforce_eager=model_info.enforce_eager, + dtype=model_info.dtype, + ) + + tokenizer = get_tokenizer( + model, + trust_remote_code=model_config.trust_remote_code, + ) + + # Test detecting the tokenizer's chat_template + chat_template = resolve_hf_chat_template( + tokenizer, + chat_template=None, + tools=None, + model_config=model_config, + ) + assert isinstance(chat_template, str) + + print("[TEXT]") + print(chat_template) + print("[AST]") + print(_try_extract_ast(chat_template)) + + resolved_format = resolve_chat_template_content_format( + None, # Test detecting the tokenizer's chat_template + None, + "auto", + tokenizer, + model_config=model_config, + ) + + assert resolved_format == expected_format + + +@pytest.mark.parametrize( + ("model", "expected_format"), + [ + ("Salesforce/blip2-opt-2.7b", "string"), + ("facebook/chameleon-7b", "string"), + ("deepseek-ai/deepseek-vl2-tiny", "string"), + ("adept/fuyu-8b", "string"), + ("google/paligemma-3b-mix-224", "string"), + ("Qwen/Qwen-VL", "string"), + ("Qwen/Qwen-VL-Chat", "string"), + ], +) +def test_resolve_content_format_fallbacks(model, expected_format): + model_info = HF_EXAMPLE_MODELS.find_hf_info(model) + model_info.check_available_online(on_fail="skip") + + model_config = ModelConfig( + model, + tokenizer=model_info.tokenizer or model, + tokenizer_mode=model_info.tokenizer_mode, + revision=model_info.revision, + trust_remote_code=model_info.trust_remote_code, + hf_overrides=model_info.hf_overrides, + skip_tokenizer_init=model_info.require_embed_inputs, + enable_prompt_embeds=model_info.require_embed_inputs, + enable_mm_embeds=model_info.require_embed_inputs, + enforce_eager=model_info.enforce_eager, + dtype=model_info.dtype, + ) + + tokenizer = get_tokenizer( + model_config.tokenizer, + trust_remote_code=model_config.trust_remote_code, + ) + + # Test detecting the tokenizer's chat_template + chat_template = resolve_hf_chat_template( + tokenizer, + chat_template=None, + tools=None, + model_config=model_config, + ) + assert isinstance(chat_template, str) + + print("[TEXT]") + print(chat_template) + print("[AST]") + print(_try_extract_ast(chat_template)) + + resolved_format = resolve_chat_template_content_format( + None, # Test detecting the tokenizer's chat_template + None, + "auto", + tokenizer, + model_config=model_config, + ) + + assert resolved_format == expected_format + + +@pytest.mark.parametrize( + ("template_path", "expected_format"), + [ + ("template_alpaca.jinja", "string"), + ("template_baichuan.jinja", "string"), + ("template_chatglm.jinja", "string"), + ("template_chatglm2.jinja", "string"), + ("template_chatml.jinja", "string"), + ("template_dse_qwen2_vl.jinja", "openai"), + ("template_falcon_180b.jinja", "string"), + ("template_falcon.jinja", "string"), + ("template_inkbot.jinja", "string"), + ("template_teleflm.jinja", "string"), + ("template_vlm2vec_phi3v.jinja", "openai"), + ("template_vlm2vec_qwen2vl.jinja", "openai"), + ("tool_chat_template_granite_20b_fc.jinja", "string"), + ("tool_chat_template_hermes.jinja", "string"), + ("tool_chat_template_internlm2_tool.jinja", "string"), + ("tool_chat_template_llama3.1_json.jinja", "openai"), + ("tool_chat_template_llama3.2_json.jinja", "openai"), + ("tool_chat_template_mistral_parallel.jinja", "string"), + ("tool_chat_template_mistral.jinja", "string"), + ], +) +def test_resolve_content_format_examples(template_path, expected_format): + model_config = ModelConfig( + PHI3V_MODEL_ID, # Dummy + tokenizer=PHI3V_MODEL_ID, # Dummy + trust_remote_code=True, + ) + + dummy_tokenizer = get_tokenizer( + PHI3V_MODEL_ID, # Dummy + trust_remote_code=model_config.trust_remote_code, + ) + dummy_tokenizer.chat_template = None + + chat_template = load_chat_template(EXAMPLES_DIR / template_path) + assert isinstance(chat_template, str) + + print("[TEXT]") + print(chat_template) + print("[AST]") + print(_try_extract_ast(chat_template)) + + resolved_format = resolve_chat_template_content_format( + chat_template, + None, + "auto", + dummy_tokenizer, + model_config=model_config, + ) + + assert resolved_format == expected_format + + +def test_parse_chat_messages_include_thinking_chunk( + mistral_model_config, mistral_tokenizer +): + messages = [ + { + "role": "system", + "content": [ + {"type": "text", "text": "You are a helpful assistant."}, + { + "type": "thinking", + "closed": True, + "thinking": "Only return the answer when you are confident.", + }, + ], + }, + {"role": "user", "content": "What is 2+2?"}, + { + "role": "assistant", + "content": [ + {"type": "text", "text": "Let me think about it."}, + {"type": "thinking", "closed": True, "thinking": "2+2 = 4"}, + { + "type": "text", + "text": "The answer is 4.", + }, + ], + }, + ] + + conversation_with_thinking, _, _ = parse_chat_messages( + messages, + mistral_model_config, + mistral_tokenizer, + content_format="openai", + ) + + expected_conversation = [ + { + "role": "system", + "content": [ + {"type": "text", "text": "You are a helpful assistant."}, + { + "type": "text", + "text": "Only return the answer when you are confident.", + }, + ], + }, + { + "role": "user", + "content": [{"type": "text", "text": "What is 2+2?"}], + }, + { + "role": "assistant", + "content": [ + {"type": "text", "text": "Let me think about it."}, + {"type": "text", "text": "2+2 = 4"}, + {"type": "text", "text": "The answer is 4."}, + ], + }, + ] + + assert conversation_with_thinking == expected_conversation + + +def test_apply_mistral_chat_template_thinking_chunk(): + messages = [ + { + "role": "system", + "content": [ + {"type": "text", "text": "You are a helpful assistant."}, + { + "type": "thinking", + "closed": True, + "thinking": "Only return the answer when you are confident.", + }, + ], + }, + {"role": "user", "content": "What is 2+2?"}, + { + "role": "assistant", + "content": [ + {"type": "text", "text": "Let me think about it."}, + {"type": "thinking", "closed": True, "thinking": "2+2 = 4"}, + { + "type": "text", + "text": "The answer is 4.", + }, + ], + }, + {"role": "user", "content": "Thanks, what is 3+3?"}, + ] + mistral_tokenizer = MistralTokenizer.from_pretrained( + "mistralai/Magistral-Small-2509" + ) + + tokens_ids = apply_mistral_chat_template( + mistral_tokenizer, messages, chat_template=None, tools=None + ) + + string_tokens = mistral_tokenizer.mistral.decode( + tokens_ids, special_token_policy=SpecialTokenPolicy.KEEP + ) + + expected_tokens = ( + r"[SYSTEM_PROMPT]You are a helpful assistant.[THINK]Only return the" + r" answer when you are confident.[/THINK][/SYSTEM_PROMPT]" + r"[INST]What is 2+2?[/INST]" + r"Let me think about it.[THINK]2+2 = 4[/THINK]The answer is 4." + r"[INST]Thanks, what is 3+3?[/INST]" + ) + + assert string_tokens == expected_tokens + + +def test_parse_chat_messages_single_empty_audio_with_uuid( + qwen2_audio_model_config, + qwen2_audio_tokenizer, +): + audio_uuid = "abcd" + conversation, mm_data, mm_uuids = parse_chat_messages( + [ + { + "role": "user", + "content": [ + { + "type": "input_audio", + "input_audio": {}, + "uuid": audio_uuid, + }, + {"type": "text", "text": "What does the audio say?"}, + ], + } + ], + qwen2_audio_model_config, + qwen2_audio_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " + "audio say?", + } + ] + _assert_mm_data_inputs(mm_data, {"audio": 1}) + _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[audio_uuid]) + + +@pytest.mark.asyncio +async def test_parse_chat_messages_single_empty_audio_with_uuid_async( + qwen2_audio_model_config, + qwen2_audio_tokenizer, +): + audio_uuid = "abcd" + conversation, mm_future, mm_uuids = parse_chat_messages_futures( + [ + { + "role": "user", + "content": [ + { + "type": "input_audio", + "input_audio": {}, + "uuid": audio_uuid, + }, + {"type": "text", "text": "What does the audio say?"}, + ], + } + ], + qwen2_audio_model_config, + qwen2_audio_tokenizer, + content_format="string", + ) + + assert conversation == [ + { + "role": "user", + "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " + "audio say?", + } + ] + _assert_mm_data_inputs(await mm_future, {"audio": 1}) + _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[audio_uuid]) \ No newline at end of file diff --git a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml b/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml index 9904c971..1d0a7083 100644 --- a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml +++ b/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml @@ -10,7 +10,12 @@ astune: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: # ✨✨✨✨ 编写并选择Agent + use_agentscope_protocol: True agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_disable_toolcalls: True + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 # ------------------ 不需要修改 ------------------ hydra: diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 998aa69d..0526a690 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -14,7 +14,7 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent diff --git a/pyrightconfig.json b/pyrightconfig.json index 7c18148a..62834e3a 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -3,23 +3,24 @@ "include": [ "astune/**/*.py", "external/trinity/**/*.py", - ".venv/lib/python3.10/site-packages" + ".venv/lib/python3.10/site-packages/**/*.py", + ".venv/lib/python3.10/site-packages/agentscope/**/*.py" ], "exclude": [ - "node_modules", - "build", - "checkpoints", - "experiments", - "launcher", - "logs", - "launcher", - "outputs", - "wanlog", - "wandb", - "dist", - "**/.vscode-server", - "**/__pycache__", - "**/*.log", - "**/*" + // "node_modules", + // "build", + // "checkpoints", + // "experiments", + // "launcher", + // "logs", + // "launcher", + // "outputs", + // "wanlog", + // "wandb", + // "dist", + // "**/.vscode-server", + // "**/__pycache__", + // "**/*.log", + // "**/*" ] } \ No newline at end of file diff --git a/scripts/download_dataset.py b/scripts/download_dataset.py index 052788ef..4ab8d45e 100644 --- a/scripts/download_dataset.py +++ b/scripts/download_dataset.py @@ -6,7 +6,7 @@ parser = argparse.ArgumentParser(description='download Hugging Face dataset') parser.add_argument('--target', default='openai/gsm8k', type=str, help='要下载的数据集仓库名称') -parser.add_argument('--path', default='/mnt/data/qingxu.fu/dataset/openai/gsm8k', type=str, help='路径到下载的本地目录') +parser.add_argument('--path', default='/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k', type=str, help='路径到下载的本地目录') args = parser.parse_args() snapshot_download(repo_id=args.target, repo_type="dataset", local_dir=args.path, resume_download=True) diff --git a/requirements_trinity.txt b/scripts/requirements_trinity.txt similarity index 100% rename from requirements_trinity.txt rename to scripts/requirements_trinity.txt diff --git a/requirements_verl.txt b/scripts/requirements_verl.txt similarity index 100% rename from requirements_verl.txt rename to scripts/requirements_verl.txt From d36c9c1d6b38059656aed078501d20dd650a0bbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 13 Nov 2025 00:38:30 +0800 Subject: [PATCH 015/462] replace modules --- astune/backbone_others/trainer.py | 2 +- .../agentflow_cm/cmt_linear_think.py | 2 +- .../agentflow_cm/cmt_phantom_hint.py | 2 +- .../agentscope_cm/cmt_agentscope.py | 380 +----------------- .../agentscope_cm/cmt_multi_sample.py | 207 ++++++++++ .../agentscope_cm/cmt_request_proxy.py | 191 +++++++++ .../{agentflow_cm => }/cmt_base_attr.py | 0 .../{agentflow_cm => }/cmt_linear.py | 6 +- astune/parallel_env.py | 2 +- astune/task_rollout/async_llm_bridge.py | 2 +- astune/task_rollout/env_worker.py | 2 +- astune/workflow_controller/agentscope_flow.py | 3 +- astune/workflow_controller/basic_agentflow.py | 2 +- .../workflow_controller/classic_agentflow.py | 2 +- pyrightconfig.json | 26 +- 15 files changed, 426 insertions(+), 403 deletions(-) create mode 100644 astune/context_manager/agentscope_cm/cmt_multi_sample.py create mode 100644 astune/context_manager/agentscope_cm/cmt_request_proxy.py rename astune/context_manager/{agentflow_cm => }/cmt_base_attr.py (100%) rename astune/context_manager/{agentflow_cm => }/cmt_linear.py (99%) diff --git a/astune/backbone_others/trainer.py b/astune/backbone_others/trainer.py index a56e7023..fc66d5f8 100644 --- a/astune/backbone_others/trainer.py +++ b/astune/backbone_others/trainer.py @@ -68,7 +68,7 @@ from astune.schema.trajectory import Trajectory from astune.utils.message import send_train_message from beast_logger import register_logger, print_dict -from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear +from astune.context_manager.cmt_linear import CMTLinear import os import json from typing import List, Dict, Union, Type diff --git a/astune/context_manager/agentflow_cm/cmt_linear_think.py b/astune/context_manager/agentflow_cm/cmt_linear_think.py index aec6bae2..8ea83592 100644 --- a/astune/context_manager/agentflow_cm/cmt_linear_think.py +++ b/astune/context_manager/agentflow_cm/cmt_linear_think.py @@ -2,7 +2,7 @@ from textwrap import dedent from typing import List, Tuple from astune.schema.trajectory import Sample, Reward -from astune.context_manager.agentflow_cm.cmt_linear import ExtendedMessage, CMTLinear +from astune.context_manager.cmt_linear import ExtendedMessage, CMTLinear from beast_logger import register_logger, print_dict, print_nested, NestedJsonItem, SeqItem class MultiSampleCMT(CMTLinear): diff --git a/astune/context_manager/agentflow_cm/cmt_phantom_hint.py b/astune/context_manager/agentflow_cm/cmt_phantom_hint.py index 2ff5b3d4..c10f7a14 100644 --- a/astune/context_manager/agentflow_cm/cmt_phantom_hint.py +++ b/astune/context_manager/agentflow_cm/cmt_phantom_hint.py @@ -1,5 +1,5 @@ from typing import List -from astune.context_manager.agentflow_cm.cmt_linear import ExtendedMessage, CMTLinear +from astune.context_manager.cmt_linear import ExtendedMessage, CMTLinear class LinearThinkCMT(CMTLinear): diff --git a/astune/context_manager/agentscope_cm/cmt_agentscope.py b/astune/context_manager/agentscope_cm/cmt_agentscope.py index daecaa4d..6b63820e 100644 --- a/astune/context_manager/agentscope_cm/cmt_agentscope.py +++ b/astune/context_manager/agentscope_cm/cmt_agentscope.py @@ -1,384 +1,10 @@ -import copy import importlib from loguru import logger -from datetime import datetime -from astune.schema.trajectory import Reward, Trajectory -from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, ExtendedMessage -from agentscope.model import DashScopeChatModel, ChatResponse -from agentscope.message import TextBlock, ToolUseBlock, ThinkingBlock -from typing import Dict, Tuple -from typing import Any, AsyncGenerator, Generator, Union, TYPE_CHECKING, List, Literal, Type -from pydantic import BaseModel -from astune.context_manager.agentflow_cm.cmt_linear import replace_token_ids, CMTLinear -from astune.schema.trajectory import Sample, Reward -from beast_logger import register_logger, print_dict, print_nested, NestedJsonItem, SeqItem -from astune.utils.compute_madness import compute_string_madness -from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model -from astune.context_manager.agentflow_cm.cmt_base_attr import INVALID_LOG_PROB_VALUE -from astune.utils.color_hsl import adjust_color_hsl - - -class ASTuneContextTemplate(CMTLinear): - - def __init__(self, llm_chat_fn, tokenizer, config, env_step_fn, should_interrupt_fn, generated_token_callback_fn, **kwargs): - super().__init__(config, tokenizer) - self.task_batch_index = kwargs.pop("task_batch_index") - self.task_tag = kwargs.pop("task_tag") - self.task_id = kwargs.pop("task_id") - self.dscm_ref = DashScopeChatModel(**kwargs) - self.full_context: List[ExtendedMessage] = [] - self.llm_chat_fn = llm_chat_fn - self.tokenizer = tokenizer - self.stream = False - self.config = config - self.env_step_fn = env_step_fn - self.should_interrupt_fn = should_interrupt_fn - self.generated_token_callback_fn = generated_token_callback_fn - self.context_overflow = False - self.model_name = kwargs['model_name'] - self.output_kwargs = {} - self.input_kwargs = {} - - def process_reward(self, reward_structure: Reward): - self.reward_structure = reward_structure - ext_steps = self.full_context - # # lienar 模式只有一条轨迹 - # self.reward_structure.step_reward = [ - # self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) - # ] - # print('warning: debugging') - self.reward_structure.step_reward = [ - self.compute_step_level_reward(ext_steps=ext_steps, index=i, total_steps=len(self.grouped_steps)) for i in range(len(self.grouped_steps)) - ] - - - def generate_log(self, task_id = None, global_step="NA"): - task_id = self.task_id - nested_items_print_buffer = {} - step_reward = 0.0 - - for index, ext_steps in enumerate(self.grouped_steps): - cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) - text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] - input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] - # loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] - logprobs = [INVALID_LOG_PROB_VALUE] * len(cmt_tokenized["prompt_ids"]) + cmt_tokenized["response_logprobs"] - # 创建调整后的颜色数组 - loss_mask_color_abl_arr = [ - adjust_color_hsl("#09ABCF", logprob) if mask == 1 - else adjust_color_hsl("#D98510", logprob) - for mask, logprob in zip(cmt_tokenized["loss_mask"], logprobs) - ] - logprob_text_arr = [f"{logprob:.4f}" if logprob != INVALID_LOG_PROB_VALUE else "N/A" for logprob in logprobs] - - buffer = { - "text_arr": text_arr, - "logprob_arr": logprob_text_arr, - "input_id_arr": input_id_arr, - "loss_mask_color_arr": loss_mask_color_abl_arr, - } - raw_reward = self.reward_structure.raw_reward - step_reward:float = self.reward_structure.step_reward[index] - try: - step_advantage = self.reward_structure.step_advantage[index] - step_advantage_simple = self.reward_structure.step_advantage_simple[index] - except: - step_advantage = 0.0 - step_advantage_simple = 0.0 - task_outcome = str(self.reward_structure.success_rate) - selectors = [task_id, task_outcome, str(index)] - len_prompt_ids = len(cmt_tokenized["prompt_ids"]) - len_response_ids = len(cmt_tokenized["response_ids"]) - len_input_ids = len(cmt_tokenized["input_ids"]) - assert len_prompt_ids + len_response_ids == len_input_ids, "len_prompt_ids + len_response_ids should equal to len_input_ids" - nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", # type: ignore - outcome=task_outcome, # type: ignore - len_prompt_ids=len_prompt_ids, # type: ignore - len_response_ids=len_response_ids, # type: ignore - len_input_ids=len_input_ids, # type: ignore - raw_reward=f"{float(raw_reward):.3f}", # type: ignore - step_reward=f"{float(step_reward):.3f}", # type: ignore - step_advantage=f"{float(step_advantage):.3f}", # type: ignore - step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore - content=SeqItem( - text = buffer['text_arr'], # 文本 - title = buffer['logprob_arr'], # 鼠标悬浮文本 - count = buffer['input_id_arr'], # 高亮文本 - color = buffer['loss_mask_color_arr'] # 颜色 - ) - ) - - print_nested(nested_items_print_buffer, - main_content="This is the main content of the nested JSON", - header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", # type: ignore - mod="rollout", - narrow=False, - attach="copy this" # type: ignore - ) - - def group_merge(self): - def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage]) -> bool: - # if `source_step` has more messages than `target_step` - # and if `source_step` and `target_step` share same token_arr in [0:len(target_step)] - # even if the authors are different, we can still merge them - can_merge = False - # compare_level = 'token' # 严格按照token对比 - compare_level = 'text' # 对比文本,这样子会导致有些token不一样但是文本一样的情况也能merge,更宽松一些,收益很大,代价未知 - if len(source_step) >= len(target_step): - all_msg_match = True - for i in range(len(target_step)): - if compare_level == 'text': - same = source_step[i].content_for_future == target_step[i].content_for_future - elif compare_level == 'token': - same = source_step[i].token_arr == target_step[i].token_arr - else: - raise NotImplementedError - if not same: - all_msg_match = False - break - if all_msg_match: - can_merge = True - return can_merge - - def toggle_author(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage]) -> List[ExtendedMessage]: - # if any message in `target_step` is author == 'llm', but same-index message in `source_step` is author != 'llm' - # change source_step's message author to 'llm' - for i in range(len(target_step)): - if target_step[i].author == 'llm' and source_step[i].author != 'llm': - source_step[i].author = target_step[i].author - source_step[i].token_arr = target_step[i].token_arr - source_step[i].token_logprob_arr = target_step[i].token_logprob_arr - assert source_step[i].need_training - return source_step - - absorbed_step_indices = [] - reversed_grouped_steps = list(reversed(self.grouped_steps)) - for i in range(len(reversed_grouped_steps)): - if i in absorbed_step_indices: - continue - # check whether [i, len(reversed_grouped_steps)-1] can be merged - for j in range(i+1, len(reversed_grouped_steps)): - if j in absorbed_step_indices: - continue - source_step = reversed_grouped_steps[i] - target_step = reversed_grouped_steps[j] - if can_merge_steps(source_step, target_step): - source_step = toggle_author(source_step, target_step) - reversed_grouped_steps[i] = source_step - absorbed_step_indices += [j] - - # reverse back and exclude absorbed steps - reversed_grouped_steps_clean = [] - for i in range(len(reversed_grouped_steps)): - if i not in absorbed_step_indices: - reversed_grouped_steps_clean.append(reversed_grouped_steps[i]) - self.grouped_steps = list(reversed(reversed_grouped_steps_clean)) - - return self.grouped_steps - - def group_tokenize(self): - return self.group_tokenize_multi_group() - - def get_inc(self, text_frag_from, text_frag_to): - """ - Get the incremental token array from text_frag_from to text_frag_to. - """ - tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) - tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() - token_ids_acc = tokenizer_input_ids - - tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) - input_ids = tokenizer_output["input_ids"][0].tolist() - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step - overlap_length = 0 - for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 - else: break - msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" - # print(msg) - return input_id_increment, msg - - def check_context_token_num_safe(self, messages: List[dict]) -> Tuple[bool, str]: - prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) - length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len - self.max_seq_length: int = max_model_len - max_response_length - if self.should_interrupt_fn(): - return False, "externally_interrupted" - if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - return False, "already_mad" - if length < self.max_seq_length: - return True, f"safe[{length} < {max_model_len} - {max_response_length}]" - else: - return False, "token_overflow" - - -class ASTuneLmProxy(ASTuneContextTemplate): - - async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: - # load messages into `self.full_context` - self.full_context = [] - - consider_roles = ['user', 'assistant', 'system', 'tool'] - disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls - if disable_toolcalls: - consider_roles.remove('tool') - - for i, msg in enumerate(messages): - if (disable_toolcalls) and (not isinstance(msg['content'], str)): - continue - if msg['role'] not in consider_roles: - continue - if not isinstance(msg['content'], str): - author = 'env' - msg['content'] = str(msg['content']) # TODO: better handling for non-str content - if msg['role'] == 'system': - author = 'initialization' - if msg['role'] == 'tool': - author = 'env' - else: - author = 'env' - is_last_message = (len(messages) == i+1) - if is_last_message and (not disable_toolcalls): - _tools = tools - else: - _tools = [] - - self.full_context += [ - ExtendedMessage( - author=author, - role=msg['role'], - content=msg['content'], - tokenizer=self.tokenizer, - tools=_tools, - token_generator="auto", - ) - ] - - # execute llm policy - messages = self.to_role_content(self.full_context) - # 4. ⚠️ check token overflow - is_safe, info = self.check_context_token_num_safe(messages) - custom_sampling_params = {} - if not is_safe: - logger.warning(f"[{info}] detected. Current token count exceeds the limit.") - self.context_overflow = True - return ChatResponse( - content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] - ) - - llm_output = self.llm_chat_fn(messages, custom_sampling_params) - - # compute_string_madness - if not self.already_mad_flag: - if compute_string_madness(completion=llm_output['content'], checklist=self.config.astune.rollout.compute_madness_checklist) < 0.0: - self.already_mad_flag = True - - # dummy response for now - token_generator = "manual" - if llm_output.get("tool_calls", None) is not None: - tool_calls = llm_output["tool_calls"] - else: - tool_calls = [] - - llm_ext_msg = ExtendedMessage( - author="llm", - role="assistant", - content=llm_output['content'], - token_generator=token_generator, - tool_calls=tool_calls, - tokenizer=self.tokenizer, - ) - - if token_generator == "manual": - input_msg_ref = copy.deepcopy(messages) - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output) - assert len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn, f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" - llm_ext_msg.token_arr = token_arr_method2 - llm_ext_msg.token_logprob_arr = token_logprob_arr - self.generated_token_callback_fn(llm_ext_msg.token_arr) - - # take snapshot of current timeline - if is_safe: - self.full_context += [ - llm_ext_msg - ] - prompt_text = self.tokenizer.apply_chat_template( - self.to_role_content(self.full_context), # todo - tokenize=False, - add_generation_prompt=True - ) - length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) - if length >= self.config.astune.rollout.max_model_len: - raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, before gen info {info}, generated token length {len(llm_ext_msg.token_arr)}") - self.grouped_steps += [copy.deepcopy(self.full_context)] - # return response - return await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) - - async def _parse_dashscope_generation_response( - self, - message, - structured_model: Type[BaseModel] | None = None, - ) -> ChatResponse: - - - content_blocks: List[TextBlock | ToolUseBlock] = [] - content = message.get("content") - metadata: dict | None = None - - if content not in [ - None, - "", - [], - ]: - if isinstance(content, list): - for item in content: - if isinstance(item, dict) and "text" in item: - content_blocks.append( - TextBlock( - type="text", - text=item["text"], - ), - ) - else: - content_blocks.append( - TextBlock( - type="text", - text=content, - ), - ) - - if message.get("tool_calls"): - for tool_call in message["tool_calls"]: - input_ = _json_loads_with_repair( - tool_call["function"].get( - "arguments", - "{}", - ) - or "{}", - ) - content_blocks.append( - ToolUseBlock( - type="tool_use", - name=tool_call["function"]["name"], - input=input_, - id=tool_call["id"], - ), - ) - - if structured_model: - metadata = input_ - - - parsed_response = ChatResponse( - content=content_blocks, - metadata=metadata, - ) +from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model +from astune.context_manager.agentscope_cm.cmt_request_proxy import ASTuneLmProxy - return parsed_response +from typing import Any, List, Dict class ASTuneProxy(ASTuneLmProxy): diff --git a/astune/context_manager/agentscope_cm/cmt_multi_sample.py b/astune/context_manager/agentscope_cm/cmt_multi_sample.py new file mode 100644 index 00000000..b992fccc --- /dev/null +++ b/astune/context_manager/agentscope_cm/cmt_multi_sample.py @@ -0,0 +1,207 @@ +from loguru import logger + +from agentscope.model import DashScopeChatModel +from astune.schema.trajectory import Reward +from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids +from astune.utils.color_hsl import adjust_color_hsl +from astune.utils.compute_madness import compute_string_madness +from astune.context_manager.cmt_base_attr import INVALID_LOG_PROB_VALUE + +from typing import Any, List, Tuple +from beast_logger import print_nested, NestedJsonItem, SeqItem + +class ASTuneContextTemplate(CMTLinear): + + def __init__(self, llm_chat_fn, tokenizer, config, env_step_fn, should_interrupt_fn, generated_token_callback_fn, **kwargs): + super().__init__(config, tokenizer) + self.task_batch_index = kwargs.pop("task_batch_index") + self.task_tag = kwargs.pop("task_tag") + self.task_id = kwargs.pop("task_id") + self.dscm_ref = DashScopeChatModel(**kwargs) + self.full_context: List[ExtendedMessage] = [] + self.llm_chat_fn = llm_chat_fn + self.tokenizer = tokenizer + self.stream = False + self.config = config + self.env_step_fn = env_step_fn + self.should_interrupt_fn = should_interrupt_fn + self.generated_token_callback_fn = generated_token_callback_fn + self.context_overflow = False + self.model_name = kwargs['model_name'] + self.output_kwargs = {} + self.input_kwargs = {} + + def process_reward(self, reward_structure: Reward): + self.reward_structure = reward_structure + ext_steps = self.full_context + # # lienar 模式只有一条轨迹 + # self.reward_structure.step_reward = [ + # self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) + # ] + # print('warning: debugging') + self.reward_structure.step_reward = [ + self.compute_step_level_reward(ext_steps=ext_steps, index=i, total_steps=len(self.grouped_steps)) for i in range(len(self.grouped_steps)) + ] + + + def generate_log(self, task_id = None, global_step="NA"): + task_id = self.task_id + nested_items_print_buffer = {} + step_reward = 0.0 + + for index, ext_steps in enumerate(self.grouped_steps): + cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) + text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] + input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] + # loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] + logprobs = [INVALID_LOG_PROB_VALUE] * len(cmt_tokenized["prompt_ids"]) + cmt_tokenized["response_logprobs"] + # 创建调整后的颜色数组 + loss_mask_color_abl_arr = [ + adjust_color_hsl("#09ABCF", logprob) if mask == 1 + else adjust_color_hsl("#D98510", logprob) + for mask, logprob in zip(cmt_tokenized["loss_mask"], logprobs) + ] + logprob_text_arr = [f"{logprob:.4f}" if logprob != INVALID_LOG_PROB_VALUE else "N/A" for logprob in logprobs] + + buffer = { + "text_arr": text_arr, + "logprob_arr": logprob_text_arr, + "input_id_arr": input_id_arr, + "loss_mask_color_arr": loss_mask_color_abl_arr, + } + raw_reward = self.reward_structure.raw_reward + step_reward:float = self.reward_structure.step_reward[index] + try: + step_advantage = self.reward_structure.step_advantage[index] + step_advantage_simple = self.reward_structure.step_advantage_simple[index] + except: + step_advantage = 0.0 + step_advantage_simple = 0.0 + task_outcome = str(self.reward_structure.success_rate) + selectors = [task_id, task_outcome, str(index)] + len_prompt_ids = len(cmt_tokenized["prompt_ids"]) + len_response_ids = len(cmt_tokenized["response_ids"]) + len_input_ids = len(cmt_tokenized["input_ids"]) + assert len_prompt_ids + len_response_ids == len_input_ids, "len_prompt_ids + len_response_ids should equal to len_input_ids" + nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( + item_id=f"item", # type: ignore + outcome=task_outcome, # type: ignore + len_prompt_ids=len_prompt_ids, # type: ignore + len_response_ids=len_response_ids, # type: ignore + len_input_ids=len_input_ids, # type: ignore + raw_reward=f"{float(raw_reward):.3f}", # type: ignore + step_reward=f"{float(step_reward):.3f}", # type: ignore + step_advantage=f"{float(step_advantage):.3f}", # type: ignore + step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore + content=SeqItem( + text = buffer['text_arr'], # 文本 + title = buffer['logprob_arr'], # 鼠标悬浮文本 + count = buffer['input_id_arr'], # 高亮文本 + color = buffer['loss_mask_color_arr'] # 颜色 + ) + ) + + print_nested(nested_items_print_buffer, + main_content="This is the main content of the nested JSON", + header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", # type: ignore + mod="rollout", + narrow=False, + attach="copy this" # type: ignore + ) + + def group_merge(self): + def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage]) -> bool: + # if `source_step` has more messages than `target_step` + # and if `source_step` and `target_step` share same token_arr in [0:len(target_step)] + # even if the authors are different, we can still merge them + can_merge = False + # compare_level = 'token' # 严格按照token对比 + compare_level = 'text' # 对比文本,这样子会导致有些token不一样但是文本一样的情况也能merge,更宽松一些,收益很大,代价未知 + if len(source_step) >= len(target_step): + all_msg_match = True + for i in range(len(target_step)): + if compare_level == 'text': + same = source_step[i].content_for_future == target_step[i].content_for_future + elif compare_level == 'token': + same = source_step[i].token_arr == target_step[i].token_arr + else: + raise NotImplementedError + if not same: + all_msg_match = False + break + if all_msg_match: + can_merge = True + return can_merge + + def toggle_author(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage]) -> List[ExtendedMessage]: + # if any message in `target_step` is author == 'llm', but same-index message in `source_step` is author != 'llm' + # change source_step's message author to 'llm' + for i in range(len(target_step)): + if target_step[i].author == 'llm' and source_step[i].author != 'llm': + source_step[i].author = target_step[i].author + source_step[i].token_arr = target_step[i].token_arr + source_step[i].token_logprob_arr = target_step[i].token_logprob_arr + assert source_step[i].need_training + return source_step + + absorbed_step_indices = [] + reversed_grouped_steps = list(reversed(self.grouped_steps)) + for i in range(len(reversed_grouped_steps)): + if i in absorbed_step_indices: + continue + # check whether [i, len(reversed_grouped_steps)-1] can be merged + for j in range(i+1, len(reversed_grouped_steps)): + if j in absorbed_step_indices: + continue + source_step = reversed_grouped_steps[i] + target_step = reversed_grouped_steps[j] + if can_merge_steps(source_step, target_step): + source_step = toggle_author(source_step, target_step) + reversed_grouped_steps[i] = source_step + absorbed_step_indices += [j] + + # reverse back and exclude absorbed steps + reversed_grouped_steps_clean = [] + for i in range(len(reversed_grouped_steps)): + if i not in absorbed_step_indices: + reversed_grouped_steps_clean.append(reversed_grouped_steps[i]) + self.grouped_steps = list(reversed(reversed_grouped_steps_clean)) + + return self.grouped_steps + + def group_tokenize(self): + return self.group_tokenize_multi_group() + + def get_inc(self, text_frag_from, text_frag_to): + """ + Get the incremental token array from text_frag_from to text_frag_to. + """ + tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) + tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() + token_ids_acc = tokenizer_input_ids + + tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) + input_ids = tokenizer_output["input_ids"][0].tolist() + input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + overlap_length = 0 + for i in range(len(token_ids_acc)): + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 + else: break + msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" + # print(msg) + return input_id_increment, msg + + def check_context_token_num_safe(self, messages: List[dict]) -> Tuple[bool, str]: + prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) + length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) + max_response_length = self.config.astune.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.astune.rollout.max_model_len + self.max_seq_length: int = max_model_len - max_response_length + if self.should_interrupt_fn(): + return False, "externally_interrupted" + if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: + return False, "already_mad" + if length < self.max_seq_length: + return True, f"safe[{length} < {max_model_len} - {max_response_length}]" + else: + return False, "token_overflow" diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py new file mode 100644 index 00000000..cc2c0df6 --- /dev/null +++ b/astune/context_manager/agentscope_cm/cmt_request_proxy.py @@ -0,0 +1,191 @@ +import copy +import importlib +from loguru import logger +from pydantic import BaseModel +from beast_logger import print_dict + +from agentscope.model import ChatResponse +from agentscope.message import TextBlock, ToolUseBlock +from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model +from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage +from astune.utils.compute_madness import compute_string_madness +from astune.context_manager.agentscope_cm.cmt_multi_sample import ASTuneContextTemplate + +from typing import Any, List, Type, Dict + + +class ASTuneLmProxy(ASTuneContextTemplate): + + async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: + # load messages into `self.full_context` + self.full_context = [] + + consider_roles = ['user', 'assistant', 'system', 'tool'] + disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls + if disable_toolcalls: + consider_roles.remove('tool') + + for i, msg in enumerate(messages): + if (disable_toolcalls) and (not isinstance(msg['content'], str)): + continue + if msg['role'] not in consider_roles: + continue + if not isinstance(msg['content'], str): + author = 'env' + ignore = False + str_content = "" + for item in msg['content']: + if item['type'] != 'text': + logger.warning(f"Non-text content in message content detected: {item['type']}. Ignoring.") + ignore = True + break + str_content += str(item['text']) + msg['content'] = str_content + if ignore: + continue + msg['content'] = str(msg['content']) # TODO: better handling mm data + if msg['role'] == 'system': + author = 'initialization' + if msg['role'] == 'tool': + author = 'env' + else: + author = 'env' + + is_last_message = (len(messages) == i+1) + if is_last_message and (not disable_toolcalls): + _tools = tools + else: + _tools = [] + + self.full_context += [ + ExtendedMessage( + author=author, + role=msg['role'], + content=msg['content'], + tokenizer=self.tokenizer, + tools=_tools, + token_generator="auto", + ) + ] + + # 4. ⚠️ check token overflow + is_safe, info = self.check_context_token_num_safe(messages) + custom_sampling_params = {} + if not is_safe: + logger.warning(f"[{info}] detected. Current token count exceeds the limit.") + self.context_overflow = True + return ChatResponse( + content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] + ) + + print_dict(messages, header='proxy messages') + llm_output = self.llm_chat_fn(messages, custom_sampling_params) + print_dict(llm_output, header='proxy response') + + # compute_string_madness + if not self.already_mad_flag: + if compute_string_madness(completion=llm_output['content'], checklist=self.config.astune.rollout.compute_madness_checklist) < 0.0: + self.already_mad_flag = True + + # dummy response for now + token_generator = "manual" + if llm_output.get("tool_calls", None) is not None: + tool_calls = llm_output["tool_calls"] + else: + tool_calls = [] + + llm_ext_msg = ExtendedMessage( + author="llm", + role="assistant", + content=llm_output['content'], + token_generator=token_generator, + tool_calls=tool_calls, + tokenizer=self.tokenizer, + ) + + if token_generator == "manual": + input_msg_ref = copy.deepcopy(messages) + token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output) + assert len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn, f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" + llm_ext_msg.token_arr = token_arr_method2 + llm_ext_msg.token_logprob_arr = token_logprob_arr + self.generated_token_callback_fn(llm_ext_msg.token_arr) + + # take snapshot of current timeline + if is_safe: + self.full_context += [ + llm_ext_msg + ] + prompt_text = self.tokenizer.apply_chat_template( + self.to_role_content(self.full_context), # todo + tokenize=False, + add_generation_prompt=True + ) + length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) + if length >= self.config.astune.rollout.max_model_len: + raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, before gen info {info}, generated token length {len(llm_ext_msg.token_arr)}") + self.grouped_steps += [copy.deepcopy(self.full_context)] + # return response + return await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) + + async def _parse_dashscope_generation_response( + self, + message, + structured_model: Type[BaseModel] | None = None, + ) -> ChatResponse: + + + content_blocks: List[TextBlock | ToolUseBlock] = [] + content = message.get("content") + metadata: dict | None = None + + if content not in [ + None, + "", + [], + ]: + if isinstance(content, list): + for item in content: + if isinstance(item, dict) and "text" in item: + content_blocks.append( + TextBlock( + type="text", + text=item["text"], + ), + ) + else: + content_blocks.append( + TextBlock( + type="text", + text=content, + ), + ) + + if message.get("tool_calls"): + for tool_call in message["tool_calls"]: + input_ = _json_loads_with_repair( + tool_call["function"].get( + "arguments", + "{}", + ) + or "{}", + ) + content_blocks.append( + ToolUseBlock( + type="tool_use", + name=tool_call["function"]["name"], + input=input_, # type: ignore + id=tool_call["id"], + ), + ) + + if structured_model: + metadata = input_ # type: ignore + + + parsed_response = ChatResponse( + content=content_blocks, + metadata=metadata, + ) + + return parsed_response diff --git a/astune/context_manager/agentflow_cm/cmt_base_attr.py b/astune/context_manager/cmt_base_attr.py similarity index 100% rename from astune/context_manager/agentflow_cm/cmt_base_attr.py rename to astune/context_manager/cmt_base_attr.py diff --git a/astune/context_manager/agentflow_cm/cmt_linear.py b/astune/context_manager/cmt_linear.py similarity index 99% rename from astune/context_manager/agentflow_cm/cmt_linear.py rename to astune/context_manager/cmt_linear.py index 244ec431..c3899c58 100644 --- a/astune/context_manager/agentflow_cm/cmt_linear.py +++ b/astune/context_manager/cmt_linear.py @@ -5,9 +5,9 @@ from typing import List, Union, Tuple, Optional from astune.schema.trajectory import Sample, Reward from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.agentflow_cm.cmt_base_attr import CMTBaseAttr -from astune.context_manager.agentflow_cm.cmt_base_attr import ExtendedMessage -from astune.context_manager.agentflow_cm.cmt_base_attr import replace_token_ids +from astune.context_manager.cmt_base_attr import CMTBaseAttr +from astune.context_manager.cmt_base_attr import ExtendedMessage +from astune.context_manager.cmt_base_attr import replace_token_ids from beast_logger import register_logger, print_dict, print_listofdict, print_nested, NestedJsonItem, SeqItem diff --git a/astune/parallel_env.py b/astune/parallel_env.py index d00e058f..085ac49e 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -19,7 +19,7 @@ from astune.task_rollout.env_worker import EnvWorker from astune.schema.task import Task, TaskLaunchCoreArgument from astune.schema.trajectory import Sample -from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, CMTBaseAttr +from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow from astune.utils.utils import run_async_coro__no_matter_what from astune.schema.logprob import TokenAndProb diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 06ab4eca..2c58201d 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -19,7 +19,7 @@ from astune.task_rollout.env_worker import EnvWorker from astune.schema.task import Task, TaskLaunchCoreArgument from astune.schema.trajectory import Sample -from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, CMTBaseAttr +from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr from beast_logger import register_logger, print_dict, print_listofdict from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow from astune.utils.utils import run_async_coro__no_matter_what diff --git a/astune/task_rollout/env_worker.py b/astune/task_rollout/env_worker.py index 5a72685f..3b6c498e 100644 --- a/astune/task_rollout/env_worker.py +++ b/astune/task_rollout/env_worker.py @@ -4,7 +4,7 @@ from astune.workflow_controller.classic_agentflow import AgentFlow from astune.workflow_controller.classic_agentflow import BaseAgentFlow from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow -from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear +from astune.context_manager.cmt_linear import CMTLinear from astune.env_service_client.env_client_ng import EnvClient as EnvClientNg class EnvWorker(object): diff --git a/astune/workflow_controller/agentscope_flow.py b/astune/workflow_controller/agentscope_flow.py index 9696a803..98f406fe 100644 --- a/astune/workflow_controller/agentscope_flow.py +++ b/astune/workflow_controller/agentscope_flow.py @@ -7,8 +7,7 @@ from astune.workflow_controller.basic_agentflow import BaseAgentFlow from astune.schema.trajectory import Reward, Trajectory from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol -from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, ExtendedMessage -from astune.context_manager.agentflow_cm.cmt_linear import replace_token_ids, CMTLinear +from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids, CMTLinear from astune.schema.trajectory import Sample, Reward from typing import Any, Dict, List, Union, Tuple from astune.context_manager.agentscope_cm.cmt_agentscope import ASTuneProxy diff --git a/astune/workflow_controller/basic_agentflow.py b/astune/workflow_controller/basic_agentflow.py index 42b86701..1185cf8e 100644 --- a/astune/workflow_controller/basic_agentflow.py +++ b/astune/workflow_controller/basic_agentflow.py @@ -1,4 +1,4 @@ -from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, ExtendedMessage +from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage from astune.context_manager.agentflow_cm.cmt_linear_think import LinearThinkCMT from typing import Any, Dict, List, Union, Callable diff --git a/astune/workflow_controller/classic_agentflow.py b/astune/workflow_controller/classic_agentflow.py index a6706e76..9b3a5989 100644 --- a/astune/workflow_controller/classic_agentflow.py +++ b/astune/workflow_controller/classic_agentflow.py @@ -5,7 +5,7 @@ from astune.env_service_client.env_client import EnvClient from astune.utils.utils import convert_tool_to_user_message from astune.schema.trajectory import Reward -from astune.context_manager.agentflow_cm.cmt_linear import CMTLinear, ExtendedMessage +from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage from astune.context_manager.agentflow_cm.cmt_linear_think import LinearThinkCMT from astune.context_manager.agentflow_cm.cmt_context_clip import SelfContextClipCMT from astune.context_manager.agentflow_cm.cmt_sliding_window import SlidingWindowCMT diff --git a/pyrightconfig.json b/pyrightconfig.json index 62834e3a..bfc3649e 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -3,24 +3,24 @@ "include": [ "astune/**/*.py", "external/trinity/**/*.py", - ".venv/lib/python3.10/site-packages/**/*.py", + // ".venv/lib/python3.10/site-packages/**/*.py", ".venv/lib/python3.10/site-packages/agentscope/**/*.py" ], "exclude": [ - // "node_modules", - // "build", - // "checkpoints", - // "experiments", - // "launcher", - // "logs", - // "launcher", - // "outputs", - // "wanlog", - // "wandb", - // "dist", + "node_modules", + "build", + "checkpoints", + "experiments", + "launcher", + "logs", + "launcher", + "outputs", + "wanlog", + "wandb", + "dist", // "**/.vscode-server", // "**/__pycache__", // "**/*.log", - // "**/*" + "**/*" ] } \ No newline at end of file From 8476b63f49b5d39c0cbaba7ee5317dc549fe876b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 13 Nov 2025 02:47:31 +0800 Subject: [PATCH 016/462] alias with direct vllm input --- .../agentflow_cm/cmt_linear_think.py | 8 +- .../agentflow_cm/cmt_sliding_window.py | 4 +- .../agentscope_cm/cmt_multi_sample.py | 73 ++++++++++++--- .../agentscope_cm/cmt_request_proxy.py | 62 ++++++------- astune/context_manager/cmt_base_attr.py | 17 +++- astune/context_manager/cmt_linear.py | 40 +++++---- astune/main_vllm.py | 11 +-- astune/parallel_env.py | 13 ++- astune/task_rollout/async_llm_bridge.py | 88 +++++++++++-------- launcher.py | 2 +- tutorial/math_agent.py | 8 +- 11 files changed, 200 insertions(+), 126 deletions(-) diff --git a/astune/context_manager/agentflow_cm/cmt_linear_think.py b/astune/context_manager/agentflow_cm/cmt_linear_think.py index 8ea83592..401021fa 100644 --- a/astune/context_manager/agentflow_cm/cmt_linear_think.py +++ b/astune/context_manager/agentflow_cm/cmt_linear_think.py @@ -60,14 +60,14 @@ def __init__(self, config, tokenizer): # think_hint_for_qwen2 = self.think_hint: str = force_think_prompt - def _get_seq_length(self, messages: List[dict]) -> int: - prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) + def _get_seq_length(self, messages: List[dict], tools=[]) -> int: + prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, tools=tools) return len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) - def check_context_token_num_safe(self, messages: List[dict]) -> Tuple[bool, str]: + def check_context_token_num_safe(self, messages: List[dict], tools: List[dict] = []) -> Tuple[bool, str]: if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: return False, "already_mad" - if self._get_seq_length(messages) < self.max_seq_length: # self.config.env_engine.max_seq_length = 20480 + if self._get_seq_length(messages, tools=tools) < self.max_seq_length: # self.config.env_engine.max_seq_length = 20480 return True, "safe" else: return False, "token_overflow" diff --git a/astune/context_manager/agentflow_cm/cmt_sliding_window.py b/astune/context_manager/agentflow_cm/cmt_sliding_window.py index 53904e2f..250cb1f5 100644 --- a/astune/context_manager/agentflow_cm/cmt_sliding_window.py +++ b/astune/context_manager/agentflow_cm/cmt_sliding_window.py @@ -80,13 +80,13 @@ def _prepare_next_llm_context_static(self): return dict_context, latest_llm_interaction_socket - def check_context_token_num_safe(self, messages: List[dict]) -> Tuple[bool, str]: + def check_context_token_num_safe(self, messages: List[dict], tools=[]) -> Tuple[bool, str]: """Always be safe because we already check in `prepare_next_llm_context` """ if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: return False, "already_mad" - assert self._get_seq_length(messages) < self.max_seq_length + assert self._get_seq_length(messages, tools) < self.max_seq_length if self.prompt_part_token_overflow: return False, "prompt_part_token_overflow" diff --git a/astune/context_manager/agentscope_cm/cmt_multi_sample.py b/astune/context_manager/agentscope_cm/cmt_multi_sample.py index b992fccc..f04e286d 100644 --- a/astune/context_manager/agentscope_cm/cmt_multi_sample.py +++ b/astune/context_manager/agentscope_cm/cmt_multi_sample.py @@ -2,17 +2,27 @@ from agentscope.model import DashScopeChatModel from astune.schema.trajectory import Reward +from transformers.tokenization_utils import PreTrainedTokenizer from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids from astune.utils.color_hsl import adjust_color_hsl from astune.utils.compute_madness import compute_string_madness from astune.context_manager.cmt_base_attr import INVALID_LOG_PROB_VALUE -from typing import Any, List, Tuple +from typing import Any, List, Tuple, Union from beast_logger import print_nested, NestedJsonItem, SeqItem class ASTuneContextTemplate(CMTLinear): - def __init__(self, llm_chat_fn, tokenizer, config, env_step_fn, should_interrupt_fn, generated_token_callback_fn, **kwargs): + def __init__( + self, + llm_chat_fn, + tokenizer:PreTrainedTokenizer, + config, + env_step_fn, + should_interrupt_fn, + generated_token_callback_fn, + **kwargs + ): super().__init__(config, tokenizer) self.task_batch_index = kwargs.pop("task_batch_index") self.task_tag = kwargs.pop("task_tag") @@ -96,7 +106,7 @@ def generate_log(self, task_id = None, global_step="NA"): content=SeqItem( text = buffer['text_arr'], # 文本 title = buffer['logprob_arr'], # 鼠标悬浮文本 - count = buffer['input_id_arr'], # 高亮文本 + count = buffer['input_id_arr'], # 高亮文本 # type: ignore color = buffer['loss_mask_color_arr'] # 颜色 ) ) @@ -177,11 +187,11 @@ def get_inc(self, text_frag_from, text_frag_to): Get the incremental token array from text_frag_from to text_frag_to. """ tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) - tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() + tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore token_ids_acc = tokenizer_input_ids tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) - input_ids = tokenizer_output["input_ids"][0].tolist() + input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): @@ -191,17 +201,52 @@ def get_inc(self, text_frag_from, text_frag_to): # print(msg) return input_id_increment, msg - def check_context_token_num_safe(self, messages: List[dict]) -> Tuple[bool, str]: - prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) - length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) + def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore + dict_messages = self.to_role_content(ext_messages) + + prompt_text = self.tokenizer.apply_chat_template(dict_messages, tokenize=False, add_generation_prompt=True, tools=tools) + length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore max_response_length = self.config.astune.rollout.max_response_length_in_one_turn max_model_len: int = self.config.astune.rollout.max_model_len - self.max_seq_length: int = max_model_len - max_response_length + max_seq_length: int = max_model_len - max_response_length + + if length < max_seq_length: + ret = [True, length] + else: + ret = [False, length] + return tuple(ret) + + def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, str]: + prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, tools=tools) + length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore + max_response_length = self.config.astune.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.astune.rollout.max_model_len + max_seq_length: int = max_model_len - max_response_length if self.should_interrupt_fn(): - return False, "externally_interrupted" + ret = [False, "externally_interrupted"] if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - return False, "already_mad" - if length < self.max_seq_length: - return True, f"safe[{length} < {max_model_len} - {max_response_length}]" + ret = [False, "already_mad"] + if length < max_seq_length: + ret = [True, f"safe[{length} < {max_model_len} - {max_response_length}]"] else: - return False, "token_overflow" + ret = [False, "token_overflow"] + return tuple(ret) + + def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: + result = [] + for ext_msg in ext_msg_array: + d = { + "role": ext_msg.role, + "content": ext_msg.content_for_future, + } + if ext_msg.tool_calls: + d.update({ + "tool_calls": ext_msg.tool_calls + }) + result.append(d) + return result + + def apply_chat_template_for_ext_messages(self, ext_messages: List[ExtendedMessage], tools: List = []) -> str: + dict_messages = self.to_role_content(ext_messages) + prompt_text = self.tokenizer.apply_chat_template(dict_messages, tokenize=False, add_generation_prompt=True, tools=tools) + return prompt_text # type: ignore \ No newline at end of file diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py index cc2c0df6..2a71ae1a 100644 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ b/astune/context_manager/agentscope_cm/cmt_request_proxy.py @@ -1,9 +1,10 @@ import copy -import importlib +import time from loguru import logger from pydantic import BaseModel -from beast_logger import print_dict +from beast_logger import print_dict, print_listofdict +from transformers.tokenization_utils import PreTrainedTokenizer from agentscope.model import ChatResponse from agentscope.message import TextBlock, ToolUseBlock from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model @@ -13,10 +14,15 @@ from typing import Any, List, Type, Dict +def remove_fields(d: Dict, fields: List[str]) -> Dict: + d = copy.deepcopy(d) + for field in fields: + d.pop(field.strip(), None) + return d class ASTuneLmProxy(ASTuneContextTemplate): - async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: + async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: # load messages into `self.full_context` self.full_context = [] @@ -35,8 +41,8 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], ignore = False str_content = "" for item in msg['content']: - if item['type'] != 'text': - logger.warning(f"Non-text content in message content detected: {item['type']}. Ignoring.") + if 'text' not in item: + logger.warning(f"Non-text content in message content detected: {item}. Ignoring.") ignore = True break str_content += str(item['text']) @@ -51,25 +57,21 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], else: author = 'env' - is_last_message = (len(messages) == i+1) - if is_last_message and (not disable_toolcalls): - _tools = tools - else: - _tools = [] - self.full_context += [ ExtendedMessage( author=author, role=msg['role'], content=msg['content'], tokenizer=self.tokenizer, - tools=_tools, + tools=tools, + tool_calls=msg['tool_calls'] if 'tool_calls' in msg else [], token_generator="auto", ) ] - # 4. ⚠️ check token overflow - is_safe, info = self.check_context_token_num_safe(messages) + # check token overflow + converted_message = self.to_role_content(self.full_context) + is_safe, info = self.check_context_token_num_safe(converted_message, tools) custom_sampling_params = {} if not is_safe: logger.warning(f"[{info}] detected. Current token count exceeds the limit.") @@ -77,11 +79,17 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], return ChatResponse( content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] ) - - print_dict(messages, header='proxy messages') - llm_output = self.llm_chat_fn(messages, custom_sampling_params) - print_dict(llm_output, header='proxy response') - + print_listofdict(converted_message, header='converted proxy messages') + # print_listofdict(messages, header='proxy messages') + assert self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools) + llm_output = self.llm_chat_fn(messages, custom_sampling_params, tools) + print_dict(remove_fields(llm_output, fields=['request_id', 'tokens', 'tool_call_id']), header='response') + + print('-----------------------------------------') + print('-----------------------------------------') + print('-----------------------------------------') + print('-----------------------------------------') + time.sleep(10) # compute_string_madness if not self.already_mad_flag: if compute_string_madness(completion=llm_output['content'], checklist=self.config.astune.rollout.compute_madness_checklist) < 0.0: @@ -105,7 +113,7 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], if token_generator == "manual": input_msg_ref = copy.deepcopy(messages) - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output) + token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output, tools=tools) assert len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn, f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" llm_ext_msg.token_arr = token_arr_method2 llm_ext_msg.token_logprob_arr = token_logprob_arr @@ -113,18 +121,12 @@ async def execute_model_proxy(self, messages: List[dict], tools: List[dict]=[], # take snapshot of current timeline if is_safe: - self.full_context += [ - llm_ext_msg - ] - prompt_text = self.tokenizer.apply_chat_template( - self.to_role_content(self.full_context), # todo - tokenize=False, - add_generation_prompt=True - ) - length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) - if length >= self.config.astune.rollout.max_model_len: + self.full_context += [ llm_ext_msg ] + is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) + if not is_safe: raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, before gen info {info}, generated token length {len(llm_ext_msg.token_arr)}") self.grouped_steps += [copy.deepcopy(self.full_context)] + # return response return await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) diff --git a/astune/context_manager/cmt_base_attr.py b/astune/context_manager/cmt_base_attr.py index 4d8c7350..9649cc96 100644 --- a/astune/context_manager/cmt_base_attr.py +++ b/astune/context_manager/cmt_base_attr.py @@ -1,7 +1,9 @@ from typing import List, Union, Tuple +from transformers.tokenization_utils import PreTrainedTokenizer from astune.schema.trajectory import Reward import uuid +INVALID_LOG_PROB_VALUE = 0.0 def find_sublist_indices(large_list, small_list, reverse=False): small_len = len(small_list) @@ -14,7 +16,6 @@ def find_sublist_indices(large_list, small_list, reverse=False): return i return -1 -INVALID_LOG_PROB_VALUE = 0.0 def replace_token_ids(place_holder, replace_with, begin, end, raw_logprob) -> Tuple[List[int], List[int]]: _begin_index = find_sublist_indices(place_holder, begin) + len(begin) @@ -43,7 +44,7 @@ def __init__( token_end_index=-1, clip=False, clip_token_limit=8192, - tokenizer=None, + tokenizer: PreTrainedTokenizer=None, # type: ignore token_generator="manual", build_from_uuid="", tools=[], @@ -75,11 +76,19 @@ def __init__( if token_generator == 'auto': dummy_msg = [ {"role": "assistant", "content": "dummy text"} ] try: - text_frag_to = tokenizer.apply_chat_template(dummy_msg + [ {"role": self.role, "content": self.content_for_future} ], tokenize=False) + text_frag_to = tokenizer.apply_chat_template( + dummy_msg + [ {"role": self.role, "content": self.content_for_future} ], + tokenize=False, + tools=tools + ) except Exception as e: raise ValueError(f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}") self.token_arr, _ = self.get_inc_simple( - text_frag_from=tokenizer.apply_chat_template(dummy_msg, tokenize=False), + text_frag_from=tokenizer.apply_chat_template( + dummy_msg, + tokenize=False, + tools=tools + ), text_frag_to=text_frag_to, tokenizer=tokenizer ) diff --git a/astune/context_manager/cmt_linear.py b/astune/context_manager/cmt_linear.py index c3899c58..9621624c 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_manager/cmt_linear.py @@ -66,9 +66,14 @@ def prepare_previous_context(self, mod='future'): raise ValueError(f"Unknown mod {mod} in prepare_previous_context, only support 'future' and 'raw'") - def check_context_token_num_safe(self, messages: List[dict]) -> Tuple[bool, str]: + def check_context_token_num_safe(self, messages: List[dict], tools: List[dict] = []) -> Tuple[bool, str]: def get_seq_length(messages): - prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) + prompt_text = self.tokenizer.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + tools=tools + ) return len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: return False, "already_mad" @@ -120,7 +125,7 @@ def prepare_next_llm_context(self): return self.prepare_previous_context(mod='future') - def save_init_input(self, init_input_arr:list, add_nothink: bool=False): + def save_init_input(self, init_input_arr:list, add_nothink: bool=False, tools: List[dict]=[]): """ Save and process the initial input messages to the context. @@ -150,7 +155,7 @@ def save_init_input(self, init_input_arr:list, add_nothink: bool=False): # compute token array for each message token_ids_acc = [] for llm_msg, ext_msg, index in zip(init_input_arr, self.full_context, range(len(init_input_arr))): - text_with_chat_template = self.tokenizer.apply_chat_template(init_input_arr[:(index+1)], tokenize=False) + text_with_chat_template = self.tokenizer.apply_chat_template(init_input_arr[:(index+1)], tokenize=False, tools=tools) tokenizer_output = self.tokenizer(text_with_chat_template, return_tensors="pt", padding=False) input_ids = tokenizer_output["input_ids"][0].tolist() # attention_mask = outputs["attention_mask"][0].tolist() @@ -202,17 +207,15 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= return ext_msg # generate token - def get_token_inc_from_vllm_response(self, input_msg_ref, llm_output) -> Tuple[List[int], List[int]]: + def get_token_inc_from_vllm_response(self, input_msg_ref, llm_output, tools: List[dict]=[]) -> Tuple[List[int], List[int]]: generation_prompt_token, msg = self.get_inc( - self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=False), - self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=True), + self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=False, tools=tools), + self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=True, tools=tools), ) # completion_token_arr will contain generation_prompt header completion_token_arr, msg2 = self.get_inc( - # ... <|im_end|> - self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False), - # ... <|im_end|><|im_start|>...<|im_end|> - self.tokenizer.apply_chat_template(input_msg_ref + [ {"role": llm_output['role'], "content": llm_output['content']} ], tokenize=False), + self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, tools=tools), + self.tokenizer.apply_chat_template(input_msg_ref + [ {"role": llm_output['role'], "content": llm_output['content']} ], tokenize=False, tools=tools), ) vllm_output_raw_token = [t.token_id for t in llm_output['tokens']] vllm_output_raw_logprob = [t.logprob for t in llm_output['tokens']] @@ -263,11 +266,16 @@ def save_env_output(self, env_output:dict, input_msg_ref:Optional[List[dict]]=No return def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List[dict]: - return [ - {"role": ext_msg.role, "content": ext_msg.content_for_future} if not ext_msg.tools else - {"role": ext_msg.role, "content": ext_msg.content_for_future, "tools": ext_msg.tools} - for ext_msg in ext_msg_array - ] + result = [] + for ext_msg in ext_msg_array: + d = { + "role": ext_msg.role, + "content": ext_msg.content_for_future, + } + if ext_msg.tool_calls: + raise RuntimeError("Not expected, contact developer") + result.append(d) + return result def prepare_world_interaction(self) -> str: """ diff --git a/astune/main_vllm.py b/astune/main_vllm.py index 8d0394cb..acde7038 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -32,7 +32,7 @@ def __init__(self, url, config): completion_callback=SimpleNamespace(tokenizer=self.tokenizer), ) - def submit_chat_completions(self, messages, sampling_params, request_id): + def submit_chat_completions(self, messages, sampling_params, request_id, tools=[]): client = OpenAI( base_url=self.url, api_key="token-abc123", @@ -40,23 +40,18 @@ def submit_chat_completions(self, messages, sampling_params, request_id): sampling_params = dict( n=1, max_completion_tokens=self.config.astune.rollout.max_response_length_in_one_turn, - temperature=self.config.astune.rollout.temperature, - top_p=self.config.astune.rollout.top_p ) sampling_params["temperature"] = self.config.astune.rollout.val_kwargs.temperature sampling_params["top_k"] = self.config.astune.rollout.val_kwargs.top_k sampling_params["top_p"] = self.config.astune.rollout.val_kwargs.top_p - sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) - tools = messages[-1].get("tools", None) - for msg in messages: msg.pop("tools", None) + sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) - if tools is not None: + if tools: completion = client.chat.completions.create( model=self.config.astune.model.path, messages=messages, tools=tools, - tool_choice="required", extra_body=sampling_params ) else: diff --git a/astune/parallel_env.py b/astune/parallel_env.py index 085ac49e..55cdfb86 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -23,6 +23,7 @@ from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow from astune.utils.utils import run_async_coro__no_matter_what from astune.schema.logprob import TokenAndProb +from transformers.tokenization_utils import PreTrainedTokenizer from astune.task_rollout.async_llm_bridge import AsyncLlmBridge def init_logger(experiment_name): @@ -39,8 +40,16 @@ def init_logger(experiment_name): class StepPrinter(AsyncLlmBridge): - def __init__(self, config: DictConfig, async_rollout_manager, max_parallel: int, - max_llm_retries: int = 3, tokenizer: "AutoTokenizer"=None, llm_mode= "local", **kwargs): + def __init__( + self, + config: DictConfig, + async_rollout_manager, + max_parallel: int, + max_llm_retries: int = 3, + tokenizer: PreTrainedTokenizer = None, # type: ignore + llm_mode="local", + **kwargs + ): init_logger(experiment_name=config.astune.experiment_name) self.llm_mode = llm_mode diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 2c58201d..c0b0148b 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -29,14 +29,13 @@ class AsyncLlmBridge(object): def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: - def llm_chat(messages: List[Dict[str, str]], - custom_sampling_params: dict = {}, - request_id: str = "") -> dict: - """ - input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] - output messages: [{"role": "assistant", "value": "..."}] - """ - # TODO: sending sampling_params to rollout server + def llm_chat( + messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + tools = [], + request_id: str = "" + ) -> dict: + updated_sampling_params = {} if sampling_params: updated_sampling_params.update(sampling_params) @@ -46,7 +45,6 @@ def llm_chat(messages: List[Dict[str, str]], tools = messages[-1].get("tools", None) for msg in messages: msg.pop("tools", None) - # updated_sampling_params.update({"logprobs": 1, "prompt_logprobs": 1}) input_messages = copy.deepcopy(messages) request_id = uuid.uuid4().hex if tools is not None: @@ -67,17 +65,10 @@ def llm_chat(messages: List[Dict[str, str]], token_array = final_res decoded_text = self.tokenizer.decode(token_array) # type: ignore - # decoded_text = "Let's start by finding which API we need to use to interact with Simple Note.\n\nCode: - # ```python\nprint(apis.api_docs.show_api_descriptions(app_name='simple_note'))\n```<|im_end|>" + if decoded_text.endswith('<|im_end|>'): decoded_text = decoded_text[:-len('<|im_end|>')] - # assert prompt_ids == final_res.prompt_token_ids - # assert final_res.outputs[0].text == decoded_text - # a = self.tokenizer.apply_chat_template( - # input_messages + [{"role": "assistant", "content": decoded_text}], - # add_generation_prompt=False, tokenize=True) - # b = prompt_ids + token_array - # assert all([aa==bb for aa,bb in zip(a,b)]) + return { "role": "assistant", "request_id": request_id, @@ -92,9 +83,12 @@ def llm_chat(messages: List[Dict[str, str]], ] } - def llm_chat_remote(messages: List[Dict[str, str]], - custom_sampling_params: dict = {}, - request_id: str = "") -> dict: + def llm_chat_remote( + messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + tools = [], + request_id: str = "" + ) -> dict: """ input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] output messages: [{"role": "assistant", "value": "..."}] @@ -108,18 +102,27 @@ def llm_chat_remote(messages: List[Dict[str, str]], input_messages = copy.deepcopy(messages) for i in range(self.max_llm_retries): try: - output_message = self.async_rollout_manager.submit_chat_completions(messages=input_messages, - sampling_params=updated_sampling_params, - request_id=request_id) + # this function is defined in `astune/main_vllm.py` + output_message = self.async_rollout_manager.submit_chat_completions( + messages=input_messages, + sampling_params=updated_sampling_params, + tools=tools, + request_id=request_id + ) break except Exception as e: logger.bind(exception=True).exception(f"rollout_server.{i} error: {e.args}") time.sleep(i + 1) return output_message[-1] # type: ignore - def llm_chat_trinity(messages: List[Dict[str, str]], - custom_sampling_params: dict = {}, - request_id: str = "") -> dict: + + + def llm_chat_trinity( + messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + tools = [], + request_id: str = "" + ) -> dict: """ input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] output messages: [{"role": "assistant", "value": "..."}] @@ -132,17 +135,23 @@ async def main(model_client): updated_sampling_params.update(custom_sampling_params) updated_sampling_params.pop('min_tokens') - tools = messages[-1].get("tools", None) - for msg in messages: msg.pop("tools", None) - - response = await model_client.chat.completions.create( - model=model_client.model_path, - messages=messages, - logprobs=True, - tools=tools, - top_logprobs=0, - **updated_sampling_params - ) + if tools: + response = await model_client.chat.completions.create( + model=model_client.model_path, + messages=messages, + logprobs=True, + tools=tools, + top_logprobs=0, + **updated_sampling_params + ) + else: + response = await model_client.chat.completions.create( + model=model_client.model_path, + messages=messages, + logprobs=True, + top_logprobs=0, + **updated_sampling_params + ) return response assert hasattr(self, 'trinity_llm_model_client'), "trinity_llm_model_client is not set in AsyncLlmBridge" @@ -150,9 +159,10 @@ async def main(model_client): content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) + if content is None: - # from vsdb import bp; bp("H2") content = "" + return { "role": "assistant", "request_id": response.id, diff --git a/launcher.py b/launcher.py index 34894b5e..fe9e58b0 100644 --- a/launcher.py +++ b/launcher.py @@ -306,7 +306,7 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg): sub_config = sub_config[key] sub_config[keys[-1]] = value logger.success(f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]") - time.sleep(0.33) + time.sleep(0.1) logger.success("----------------------------------------------------") diff --git a/tutorial/math_agent.py b/tutorial/math_agent.py index 33d8dd5b..bd403fc8 100644 --- a/tutorial/math_agent.py +++ b/tutorial/math_agent.py @@ -44,11 +44,7 @@ async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, con from agentscope.memory import InMemoryMemory from agentscope.tool import Toolkit, execute_python_code - if len(init_messages) >= 2: first_msg, init_messages = init_messages[0], init_messages[1:] - else: first_msg = {"content": "You're a helpful assistant."} - interaction_message = [] - for msg in init_messages: - interaction_message.append(Msg(name=msg.get("name", "user"), content=msg.get("content", ""), role=msg.get("role", "user"))) + query = init_messages[-1]['content'] self.toolkit = Toolkit() self.toolkit.register_tool_function(execute_python_code) @@ -60,7 +56,7 @@ async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, con toolkit=self.toolkit, memory=InMemoryMemory(), ) - msg = Msg("user", init_messages[0]['content'], role="user") + msg = Msg("user", query, role="user") result = await self.agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) astune_proxy.update_judge_input_dictionary(final_answer=final_answer) From 6d49cdaa3e6a0c1aa0ed1a6645e455afc2864abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 13 Nov 2025 03:15:53 +0800 Subject: [PATCH 017/462] fix deps --- .../agentscope_cm/cmt_request_proxy.py | 14 +++++++------- documents/backbones.md | 2 +- scripts/requirements_verl.txt | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py index 2a71ae1a..639b8304 100644 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ b/astune/context_manager/agentscope_cm/cmt_request_proxy.py @@ -79,17 +79,17 @@ async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_c return ChatResponse( content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] ) - print_listofdict(converted_message, header='converted proxy messages') + print_listofdict(converted_message, header='proxy messages') # print_listofdict(messages, header='proxy messages') assert self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools) llm_output = self.llm_chat_fn(messages, custom_sampling_params, tools) - print_dict(remove_fields(llm_output, fields=['request_id', 'tokens', 'tool_call_id']), header='response') + # print_dict(remove_fields(llm_output, fields=['request_id', 'tokens', 'tool_call_id']), header='response') - print('-----------------------------------------') - print('-----------------------------------------') - print('-----------------------------------------') - print('-----------------------------------------') - time.sleep(10) + # print('-----------------------------------------') + # print('-----------------------------------------') + # print('-----------------------------------------') + # print('-----------------------------------------') + # time.sleep(10) # compute_string_madness if not self.already_mad_flag: if compute_string_madness(completion=llm_output['content'], checklist=self.config.astune.rollout.compute_madness_checklist) < 0.0: diff --git a/documents/backbones.md b/documents/backbones.md index 414c783c..e02bc641 100644 --- a/documents/backbones.md +++ b/documents/backbones.md @@ -28,7 +28,7 @@ git clone https://github.com/binary-husky/verl.git external/verl # Install dependencies uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ -uv pip install -r requirements_verl.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow +uv pip install -r scripts/requirements_verl.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no-deps # Install flash attention (must be installed last) diff --git a/scripts/requirements_verl.txt b/scripts/requirements_verl.txt index c84a515f..8b1d2782 100644 --- a/scripts/requirements_verl.txt +++ b/scripts/requirements_verl.txt @@ -30,7 +30,7 @@ certifi==2025.10.5 cffi==2.0.0 cfgv==3.4.0 charset-normalizer==3.4.4 -click==8.3.0 +click==8.2.1 cloudpickle==3.1.1 codetiming==1.4.0 colorful==0.5.7 From 98f5e01c584a1d428ea020e61f9d3eca530b0422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 13 Nov 2025 03:56:13 +0800 Subject: [PATCH 018/462] add debug info --- .../agentscope_cm/cmt_request_proxy.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py index 639b8304..1f62b928 100644 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ b/astune/context_manager/agentscope_cm/cmt_request_proxy.py @@ -79,10 +79,19 @@ async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_c return ChatResponse( content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] ) - print_listofdict(converted_message, header='proxy messages') + # print_listofdict(converted_message, header='proxy messages') # print_listofdict(messages, header='proxy messages') - assert self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools) - llm_output = self.llm_chat_fn(messages, custom_sampling_params, tools) + try: + if self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools): + logger.warning("Tokenization between original messages and converted messages mismatch!") + print_listofdict(converted_message, mod='exception', header='[exception] proxy converted_message') + print_listofdict(messages, mod='exception', header='[exception] proxy messages') + except Exception as e: + print_listofdict(converted_message, mod='exception', header='proxy converted_message') + print_listofdict(messages, mod='exception', header='proxy messages') + logger.error(f"Tokenization check failed due to error: {e}") + from vsdb import bp;bp("OH") + llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) # print_dict(remove_fields(llm_output, fields=['request_id', 'tokens', 'tool_call_id']), header='response') # print('-----------------------------------------') @@ -112,7 +121,7 @@ async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_c ) if token_generator == "manual": - input_msg_ref = copy.deepcopy(messages) + input_msg_ref = copy.deepcopy(converted_message) token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output, tools=tools) assert len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn, f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" llm_ext_msg.token_arr = token_arr_method2 From 4ba39600686226e12a02fb387d77305debcab8b8 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 03:59:18 +0800 Subject: [PATCH 019/462] patch --- .../agentscope_cm/cmt_request_proxy.py | 2 +- .../trinity/trinity_launch.yaml | 36 ++----------------- astune/main_trinity.py | 10 ++++-- launcher.py | 2 +- 4 files changed, 12 insertions(+), 38 deletions(-) diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py index 2a71ae1a..2b7fae7a 100644 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ b/astune/context_manager/agentscope_cm/cmt_request_proxy.py @@ -79,7 +79,7 @@ async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_c return ChatResponse( content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] ) - print_listofdict(converted_message, header='converted proxy messages') + # print_listofdict(converted_message, header='converted proxy messages') # print_listofdict(messages, header='proxy messages') assert self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools) llm_output = self.llm_chat_fn(messages, custom_sampling_params, tools) diff --git a/astune/default_config/trinity/trinity_launch.yaml b/astune/default_config/trinity/trinity_launch.yaml index 2ae8ae40..7340446e 100644 --- a/astune/default_config/trinity/trinity_launch.yaml +++ b/astune/default_config/trinity/trinity_launch.yaml @@ -1,39 +1,7 @@ -# --- -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# NEVER EDIT THIS FILE, THIS IS READ ONLY -# --- - - algorithm: algorithm_type: multi_step_grpo optimizer: - lr: 1e-6 + lr: 1.0e-06 repeat_times: 6 buffer: batch_size: 8 @@ -82,7 +50,7 @@ explorer: model: max_model_len: 21000 max_response_tokens: 16000 - model_path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + model_path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct monitor: monitor_type: swanlab name: git-math-agentscope diff --git a/astune/main_trinity.py b/astune/main_trinity.py index bccc0ea9..6864c830 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -153,7 +153,10 @@ def run_stage(config: Config) -> None: address=config.cluster.ray_address, ignore_reinit_error=True, namespace=config.ray_namespace, - runtime_env={"env_vars": config.get_envs()}, + runtime_env={ + "env_vars": config.get_envs(), + "ASTUNE_CONFIG_REDIRECT": os.environ.get("ASTUNE_CONFIG_REDIRECT"), + }, ) pprint(config) try: @@ -265,7 +268,10 @@ def debug( config.ray_namespace = DEBUG_NAMESPACE ray.init( namespace=config.ray_namespace, - runtime_env={"env_vars": config.get_envs()}, + runtime_env={ + "env_vars": config.get_envs(), + "ASTUNE_CONFIG_REDIRECT": os.environ.get("ASTUNE_CONFIG_REDIRECT"), + }, ignore_reinit_error=True, ) from trinity.common.models import create_debug_inference_model diff --git a/launcher.py b/launcher.py index fe9e58b0..2ecd6edd 100644 --- a/launcher.py +++ b/launcher.py @@ -350,7 +350,7 @@ def execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_bas # let's begin the training process if args.backbone == "trinity": # replace boot yaml - trinity_boot_yaml = "astune/default_config/trinity_launch.yaml" # THIS ONE IS READ ONLY, and ALWAYS FIXED + trinity_boot_yaml = "astune/default_config/trinity/trinity_launch.yaml" # THIS ONE IS READ ONLY, and ALWAYS FIXED align_parameters(yaml_backup_dst, trinity_boot_yaml, 'astune/default_config/trinity/config_auto_convertion_trinity.json') cmd = [ sys.executable, From 39d573af50efb12267e6bc766c2020d0716b59c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 13 Nov 2025 04:02:49 +0800 Subject: [PATCH 020/462] incr bsz --- launcher/math_agent/git-math-agentscope.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 0526a690..1972475d 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -23,6 +23,9 @@ astune: debug_max_parallel: 1 debug_first_n_tasks: 1 +trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 + train_batch_size: 256 + # ------------------ 不需要修改 ------------------ hydra: searchpath: From 2f2338e40e5c448743df0677c8990728a7aaee16 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 04:23:24 +0800 Subject: [PATCH 021/462] patch yaml launch bug --- launcher.py | 6 ++++-- launcher/math_agent/git-math-agentscope.yaml | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/launcher.py b/launcher.py index 2ecd6edd..16ade833 100644 --- a/launcher.py +++ b/launcher.py @@ -351,11 +351,13 @@ def execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_bas if args.backbone == "trinity": # replace boot yaml trinity_boot_yaml = "astune/default_config/trinity/trinity_launch.yaml" # THIS ONE IS READ ONLY, and ALWAYS FIXED - align_parameters(yaml_backup_dst, trinity_boot_yaml, 'astune/default_config/trinity/config_auto_convertion_trinity.json') + redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + '/trinity_launch.yaml' + shutil.copyfile(trinity_boot_yaml, redirect_trinity_boot_yaml) + align_parameters(yaml_backup_dst, redirect_trinity_boot_yaml, 'astune/default_config/trinity/config_auto_convertion_trinity.json') cmd = [ sys.executable, '-m', backbone_target, - 'run', '--config', trinity_boot_yaml + 'run', '--config', redirect_trinity_boot_yaml ] else: align_parameters(yaml_backup_dst, yaml_backup_dst, 'astune/default_config/verl/config_auto_convertion_verl.json') diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 1972475d..c855f8d7 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -22,9 +22,11 @@ astune: debug: debug_max_parallel: 1 debug_first_n_tasks: 1 - -trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 - train_batch_size: 256 +trinity: + algorithm: + repeat_times: 6 + buffer: + train_batch_size: 180 # ------------------ 不需要修改 ------------------ hydra: From 9d3c57e069ae34e912bf8ea5add2d8229f537a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 13 Nov 2025 04:29:57 +0800 Subject: [PATCH 022/462] fix too sensitive report --- .../agentscope_cm/cmt_request_proxy.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py index 9663b7a6..ffb3763a 100644 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ b/astune/context_manager/agentscope_cm/cmt_request_proxy.py @@ -79,18 +79,18 @@ async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_c return ChatResponse( content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] ) - # print_listofdict(converted_message, header='converted proxy messages') - # print_listofdict(messages, header='proxy messages') - try: - if self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools): - logger.warning("Tokenization between original messages and converted messages mismatch!") - print_listofdict(converted_message, mod='exception', header='[exception] proxy converted_message') - print_listofdict(messages, mod='exception', header='[exception] proxy messages') - except Exception as e: - print_listofdict(converted_message, mod='exception', header='proxy converted_message') - print_listofdict(messages, mod='exception', header='proxy messages') - logger.error(f"Tokenization check failed due to error: {e}") - from vsdb import bp;bp("OH") + + # try: + # if self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools): + # logger.warning("Tokenization between original messages and converted messages mismatch!") + # # print_listofdict(converted_message, mod='exception', header='[exception] proxy converted_message') + # # print_listofdict(messages, mod='exception', header='[exception] proxy messages') + # except Exception as e: + # # print_listofdict(converted_message, mod='exception', header='proxy converted_message') + # # print_listofdict(messages, mod='exception', header='proxy messages') + # logger.error(f"Tokenization check failed due to error: {e}") + # from vsdb import bp;bp("OH") + llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) # print_dict(remove_fields(llm_output, fields=['request_id', 'tokens', 'tool_call_id']), header='response') @@ -132,7 +132,7 @@ async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_c if is_safe: self.full_context += [ llm_ext_msg ] is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) - if not is_safe: + if length > self.config.astune.rollout.max_model_len: raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, before gen info {info}, generated token length {len(llm_ext_msg.token_arr)}") self.grouped_steps += [copy.deepcopy(self.full_context)] From b5a7cfb06ad667a78ec367bec3e0b2a1d807521a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 13 Nov 2025 10:50:11 +0800 Subject: [PATCH 023/462] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf389085..51bab5b1 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps - # Install flash attention (must be installed last) + # Install flash attention (must be installed at last) uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation ```
From 4f392074c56111b5c6096d4fcb4dfd12caf8f847 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 11:37:05 +0800 Subject: [PATCH 024/462] add appworld.md as tutorial --- README.md | 2 +- launcher/math_agent/git-math-agentscope.yaml | 3 +- tutorial/appworld.md | 152 +++++++++++++++++++ tutorial/math_agent.md | 4 +- 4 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 tutorial/appworld.md diff --git a/README.md b/README.md index cf389085..36cd7a2f 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j clear && python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --with-ray --backbone='trinity' ``` - 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension)。此外,也可以使用BeyondAgent后端训练(--backbone='verl') + 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension)。此外,也可以使用BeyondAgent后端训练(--backbone='verl'),但目前verl训练后端正在维护中。 ## Feature diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index c855f8d7..0a7ab36f 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -10,7 +10,7 @@ astune: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -22,6 +22,7 @@ astune: debug: debug_max_parallel: 1 debug_first_n_tasks: 1 + trinity: algorithm: repeat_times: 6 diff --git a/tutorial/appworld.md b/tutorial/appworld.md new file mode 100644 index 00000000..7bb00145 --- /dev/null +++ b/tutorial/appworld.md @@ -0,0 +1,152 @@ +## 运行 Appworld AgentScope Agent + +### 1. 准备 dataset + +请下载 `env_service` 以及 `appworld`。具体步骤请参考 [EnvService文档](https://code.alibaba-inc.com/EconML/EnvService) + + +### 2. 准备 AgentScope Workflow + +详细请见 `tutorial/math_agent.py`。可以在项目任意地方新建新的 AgentScope Workflow 代码 + +- 定义 AgentScope 的工作流 (把agent的model修改为`astune_proxy`) + +```python + +agent = ReActAgent( + name="Qwen", + sys_prompt=first_msg['content'], + model=astune_proxy, # type: ignore + formatter=DashScopeChatFormatter(), + memory=InMemoryMemory(), + toolkit=None, + print_hint_msg=False, +) + +for _ in range(config.astune.rollout.multi_turn.max_steps): + # agentscope deal with interaction message + reply_message = await agent(interaction_message) + # env service protocol + obs, _, terminate, _ = astune_proxy.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) + # generate new message from env output + interaction_message = Msg(name="env", content=obs, role="user") + # is terminated? + if terminate: break + if astune_proxy.context_overflow: break + +``` + +- 其中,使用了 astune_proxy 与 agentscope runtime 环境交互的一些接口如下: + - `astune_proxy.env_step_fn` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 + - `astune_proxy.context_overflow` 查询当前的context窗口是否token溢出 + +- 在 AgentScope Workflow 中,注册评价函数需要的任意关键数据 +```python +astune_proxy.update_judge_input_dictionary(final_answer=final_answer) +``` + + +### 3. 准备Judge (奖励模块) + +在 `astune/task_judge/env_service_as_judge.py` 中,我们直接向 env_service 发送http请求,读取奖励。 + +Judge的返回值: raw_reward, is_success + + +### 4. 测试 + + +4.1 复制并修改 [launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml](../launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 + +1. 读取task(对应配置字段 astune.task_reader) +2. 定义 AgentScopeWorkflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) + - 举例如果 agentscope workflow 定义在 `tutorial/appworld.py` 的`ExampleAgentScopeLearnProtocol` 类 + - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.appworld->ExampleAgentScopeLearnProtocol` +3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) + - 填写 astune.task_judge.judge_protocol=`astune.task_judge.env_service_as_judge->EnvServiceJudge` +4. 指定模型(对应配置字段 astune.model.path ) + +```yaml +astune: + project_name: appworld_astune + experiment_name: "read_yaml_name" + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + rollout: + # ✨✨✨✨ 编写并选择Agent + use_agentscope_protocol: True + agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_disable_toolcalls: True + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 +``` + + +4.2 全链路调试(脱离ray快速调试:--backbone='debug') +```bash +# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) +clear && python launcher.py --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --backbone='debug' --with-logview + +``` +备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: +```json +{ + + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "program": "launcher.py", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--with-appworld", + "--conf", "xxxx/xxxx/xxxx.yaml" + ], + "env": { + } + }, + ] +} +``` + + +4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') +```bash +# 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) +python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' +``` + + +### 5. 读取Rollout日志 + +
+ 日志界面 +
+ +- 找到日志文件夹,默认在 `./launcher_record/exp_yaml_file_name/*` 下面 +- 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 +```bash +root@xxxx:/xxx/xxx/xxx# beast_logger_go +INFO: Started server process [74493] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) +``` +- 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 + - /mnt/data/qingxu.fu/astune/astune/launcher_record + - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name + - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + +- 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 + +- 蓝色 Token 代表参与loss计算的 Token,黄色反之 + +- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) \ No newline at end of file diff --git a/tutorial/math_agent.md b/tutorial/math_agent.md index 3c1d5903..06144bb7 100644 --- a/tutorial/math_agent.md +++ b/tutorial/math_agent.md @@ -137,10 +137,10 @@ python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbon ``` -4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='verl') +4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='verl' +python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' ``` From 85944ab2d014a405bf6f617bf9d41bb7fc5b65d2 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 11:58:35 +0800 Subject: [PATCH 025/462] link examples to readme --- README.md | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7e5f0e80..10dcf4ef 100644 --- a/README.md +++ b/README.md @@ -7,17 +7,17 @@ AgentScope Tune, or **ASTune**, is an advanced agent training framework for tuni We recommend using `uv` to setup the dependencies, and `conda` can also do the job. -1. clone the repo and trinity module: +1. Clone the repo and trinity module: ```bash git clone https://github.com/..../agentscope-tune.git astune git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity cd astune ``` -2. Install trinity training backbone -
+2. Install trinity training backbone: + ```bash # Create virtual environment @@ -33,23 +33,26 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j # Install flash attention (must be installed at last) uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation ``` -
+ +## Get Started (Public) + +We provide a rich library of examples and they are good guides to get started! +Let see: + +- How to build an Agent specialized at gsm8k math problems, and [how to train it 🚀](tutorial/math_agent.md). +- How to build an Appworld agent using AgentScope, and [how to train it 🪐](tutorial/appworld.md). -
-
-
- 项目架构图 -
-## Get Started + +## Get Started (Department) 本节仅内部沟通使用,后期重写。 @@ -158,6 +161,12 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi # Develop +
+
+
+ 项目架构图 +
+ - [ ] 设计 Judge&Reward 系统 - [ ] 小财场景 Demo - [ ] 寻找更通用的 tool -> token 兼容方法 From b51033924b62820034c48d3f2eb023eadd49cb5a Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 13:02:22 +0800 Subject: [PATCH 026/462] update training curlve of math agent --- tutorial/math_agent.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tutorial/math_agent.md b/tutorial/math_agent.md index 06144bb7..60d4fb9d 100644 --- a/tutorial/math_agent.md +++ b/tutorial/math_agent.md @@ -168,4 +168,9 @@ INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) - 蓝色 Token 代表参与loss计算的 Token,黄色反之 -- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) \ No newline at end of file +- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) + + +### 6. 参考训练曲线 + +https://swanlab.cn/@binaryhusky/public/runs/96arcunrxlezdmcvmcdob/chart \ No newline at end of file From 5d2a988368acaa05a5c3cfbb836522dfa10d0315 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 13:06:24 +0800 Subject: [PATCH 027/462] fix readme --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 10dcf4ef..fc4d4383 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,6 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j ``` 2. Install trinity training backbone: - - ```bash # Create virtual environment uv venv --python=3.10.16 @@ -33,12 +29,7 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j # Install flash attention (must be installed at last) uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation ``` - From 8f1f2ce5290c21d367f652a3c3cf60560b26b2f2 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 18:12:29 +0800 Subject: [PATCH 028/462] remove some comments --- astune/backbone_others/trainer.py | 9 +-- tutorial/appworld.md | 6 -- vsdb.py | 115 ++++++++++++++---------------- 3 files changed, 56 insertions(+), 74 deletions(-) diff --git a/astune/backbone_others/trainer.py b/astune/backbone_others/trainer.py index fc66d5f8..5ad29e15 100644 --- a/astune/backbone_others/trainer.py +++ b/astune/backbone_others/trainer.py @@ -1,6 +1,4 @@ -# Copyright 2024 Bytedance Ltd. and/or its affiliates -# Copyright 2023-2024 SGLang Team -# Copyright 2025 ModelBest Inc. and/or its affiliates +# Copyright 2025 Alibaba Ltd. and/or its affiliates # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,10 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -""" -PPO Trainer with Ray-based single controller. -This trainer supports model-agonistic model initialization with huggingface -""" + import json import os diff --git a/tutorial/appworld.md b/tutorial/appworld.md index 7bb00145..842553f2 100644 --- a/tutorial/appworld.md +++ b/tutorial/appworld.md @@ -40,12 +40,6 @@ for _ in range(config.astune.rollout.multi_turn.max_steps): - `astune_proxy.env_step_fn` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 - `astune_proxy.context_overflow` 查询当前的context窗口是否token溢出 -- 在 AgentScope Workflow 中,注册评价函数需要的任意关键数据 -```python -astune_proxy.update_judge_input_dictionary(final_answer=final_answer) -``` - - ### 3. 准备Judge (奖励模块) 在 `astune/task_judge/env_service_as_judge.py` 中,我们直接向 env_service 发送http请求,读取奖励。 diff --git a/vsdb.py b/vsdb.py index 28c11c37..17144a46 100644 --- a/vsdb.py +++ b/vsdb.py @@ -1,78 +1,70 @@ -import os - -""" -Ray Distributed Debugger VSCode Extension (Recommended) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -1. Starting with Ray 2.39, Anyscale has introduced the `Ray Distributed Debugger `_ VSCode extension. Follow the extension’s installation instructions, then add your cluster using the dashboard URL you obtained earlier. - - .. image:: https://github.com/eric-haibin-lin/verl-community/blob/main/docs/ray/debugger.png?raw=true - :alt: Ray Distributed Debugger VSCode extension screenshot - -2. Prerequisites. - - Ensure the following are installed (see the extension README for more detail): - - - Visual Studio Code - - `ray[default]` >= 2.9.1 - - `debugpy` >= 1.8.0 - - .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/c7098b755ff689859837773a916c857.png?raw=true - :alt: VSCode with Ray prerequisites - -3. Environment Variables. - - To enable post‑mortem debugging, set: - - .. code-block:: bash - - export RAY_DEBUG_POST_MORTEM=1 - - .. admonition:: Note - :class: important +# Copyright 2025 Ablibaba Ltd. and/or its affiliates - Be sure to remove any legacy flags before starting Ray: - - `RAY_DEBUG=legacy` - - `--ray-debugger-external` - -4. Configuring BreakpointsSet up breakpoint() in your code, and submit job to cluster. Then the extension will show the breakpoint information. - - - 1. Insert `breakpoint()` calls into your remote functions. - 2. Submit your job to the cluster. +import os +import pickle - The extension will detect active breakpoints and display them in VSCode. +""" +This debug util works together with the Ray Distributed Debugger VSCode Extension. +For more details, please refer to: + https://docs.ray.io/en/latest/ray-observability/ray-distributed-debugger.html +""" - .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/4ddad74395c79a1402331c0ce73316f.png?raw=true - :alt: Detected breakpoint in VSCode +def vscode_conditional_breakpoint(tag=None, once=True): + """ + Conditionally set a breakpoint for VSCode debugging with Ray distributed systems. - **Note:** Breakpoints are only supported inside functions decorated with `@ray.remote`. + This function provides a smart breakpoint mechanism that respects environment + variables and can be configured to trigger only once or multiple times based on + debug tags. It's designed to work with Ray's post-mortem debugging feature. -5. Launching the Debugger. + Args: + tag (str, optional): A debug tag to conditionally trigger the breakpoint. + If provided, the breakpoint will only trigger if this tag is present + in the DEBUG_TAGS environment variable (pipe-separated list). + If None, the breakpoint behavior depends only on the `once` parameter. + Defaults to None. - Run your job directly from the command line (do not use a `launch.json`): + once (bool, optional): Whether the breakpoint should only trigger once + per tag/session. If True, uses environment variables to track if + the breakpoint has already been hit. If False, the breakpoint will + trigger every time the function is called (subject to other conditions). + Defaults to True. - .. code-block:: bash + Returns: + None: This function doesn't return any value. It either triggers a + breakpoint or returns silently. - python job.py + Environment Variables: + RAY_DEBUG_POST_MORTEM: Must be set to enable any breakpoint functionality. + If not set, the function returns immediately without doing anything. -6. Attaching to a Breakpoint. + DEBUG_TAGS: Pipe-separated list of debug tags (e.g., "tag1|tag2|tag3"). + Only required when using the `tag` parameter. The breakpoint will + only trigger if the provided tag is found in this list. - Once the process hits the first `breakpoint()`, click the Ray Distributed Debugger icon in the VSCode sidebar to attach the debugger. + HIT_BREAKPOINT_REC_{tag}: Automatically created environment variables + to track whether a specific tagged breakpoint has already been hit + when `once=True`. These are internal tracking variables. - .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/4ddad74395c79a1402331c0ce73316f.png?raw=true - :alt: Attaching VSCode debugger to Ray process + Examples: + # Simple breakpoint that triggers once + vscode_conditional_breakpoint(tag="training") -7. Debugging With Multiple breakpoint(). + # Breakpoint that triggers every time + vscode_conditional_breakpoint(tag="training", once=False) - For each subsequent task, first disconnect the current debugger session, then click the extension icon again to attach to the next breakpoint. + # Tagged breakpoint (requires DEBUG_TAGS="training|validation") + vscode_conditional_breakpoint(tag="training") - .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/6e83c910a62c82fecb89c6619e001cd.png?raw=true - :alt: Disconnecting and reconnecting the debugger -""" + # Tagged breakpoint that can trigger multiple times + vscode_conditional_breakpoint(tag="validation", once=False) -def vscode_conditional_breakpoint(tag=None, once=True): + Note: + This function is designed to work with Ray's distributed debugging + capabilities and the VSCode Ray Distributed Debugger extension. + Make sure RAY_DEBUG_POST_MORTEM=1 is set in your environment. + """ env_tag = f'HIT_BREAKPOINT_REC_{tag}' if not os.getenv('RAY_DEBUG_POST_MORTEM'): return @@ -97,13 +89,13 @@ def vscode_conditional_breakpoint(tag=None, once=True): breakpoint() return -import pickle def objdump(obj, file="objdump.tmp"): with open(file, "wb+") as f: pickle.dump(obj, f) return + def objload(file="objdump.tmp"): import os if not os.path.exists(file): @@ -111,4 +103,5 @@ def objload(file="objdump.tmp"): with open(file, "rb") as f: return pickle.load(f) -bp = vscode_conditional_breakpoint \ No newline at end of file + +bp = vscode_conditional_breakpoint From f745e6bd2b8a56e34d3091b559683ea5a6cbe1e0 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 18:13:17 +0800 Subject: [PATCH 029/462] improve timeline merging algorithm --- .../agentscope_cm/cmt_multi_sample.py | 25 +--------- .../agentscope_cm/cmt_request_proxy.py | 10 +++- .../agentscope_cm/timeline_merging.py | 50 +++++++++++++++++++ astune/context_manager/cmt_linear.py | 6 ++- vllm | 1 + 5 files changed, 67 insertions(+), 25 deletions(-) create mode 100644 astune/context_manager/agentscope_cm/timeline_merging.py create mode 160000 vllm diff --git a/astune/context_manager/agentscope_cm/cmt_multi_sample.py b/astune/context_manager/agentscope_cm/cmt_multi_sample.py index f04e286d..9a504b58 100644 --- a/astune/context_manager/agentscope_cm/cmt_multi_sample.py +++ b/astune/context_manager/agentscope_cm/cmt_multi_sample.py @@ -7,9 +7,10 @@ from astune.utils.color_hsl import adjust_color_hsl from astune.utils.compute_madness import compute_string_madness from astune.context_manager.cmt_base_attr import INVALID_LOG_PROB_VALUE +from astune.context_manager.agentscope_cm.timeline_merging import can_merge_steps from typing import Any, List, Tuple, Union -from beast_logger import print_nested, NestedJsonItem, SeqItem +from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem class ASTuneContextTemplate(CMTLinear): @@ -120,28 +121,6 @@ def generate_log(self, task_id = None, global_step="NA"): ) def group_merge(self): - def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage]) -> bool: - # if `source_step` has more messages than `target_step` - # and if `source_step` and `target_step` share same token_arr in [0:len(target_step)] - # even if the authors are different, we can still merge them - can_merge = False - # compare_level = 'token' # 严格按照token对比 - compare_level = 'text' # 对比文本,这样子会导致有些token不一样但是文本一样的情况也能merge,更宽松一些,收益很大,代价未知 - if len(source_step) >= len(target_step): - all_msg_match = True - for i in range(len(target_step)): - if compare_level == 'text': - same = source_step[i].content_for_future == target_step[i].content_for_future - elif compare_level == 'token': - same = source_step[i].token_arr == target_step[i].token_arr - else: - raise NotImplementedError - if not same: - all_msg_match = False - break - if all_msg_match: - can_merge = True - return can_merge def toggle_author(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage]) -> List[ExtendedMessage]: # if any message in `target_step` is author == 'llm', but same-index message in `source_step` is author != 'llm' diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py index ffb3763a..ff9bde2f 100644 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ b/astune/context_manager/agentscope_cm/cmt_request_proxy.py @@ -11,6 +11,7 @@ from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage from astune.utils.compute_madness import compute_string_madness from astune.context_manager.agentscope_cm.cmt_multi_sample import ASTuneContextTemplate +from astune.context_manager.agentscope_cm.timeline_merging import can_merge_steps from typing import Any, List, Type, Dict @@ -45,7 +46,10 @@ async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_c logger.warning(f"Non-text content in message content detected: {item}. Ignoring.") ignore = True break - str_content += str(item['text']) + if isinstance(item['text'], str): + str_content += str(item['text']) + else: + str_content = "" msg['content'] = str_content if ignore: continue @@ -136,6 +140,10 @@ async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_c raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, before gen info {info}, generated token length {len(llm_ext_msg.token_arr)}") self.grouped_steps += [copy.deepcopy(self.full_context)] + DEBUG = True + if DEBUG and len(self.grouped_steps) >= 2 and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])): + print(f"General Warning: merge failure discovered.") + # return response return await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) diff --git a/astune/context_manager/agentscope_cm/timeline_merging.py b/astune/context_manager/agentscope_cm/timeline_merging.py new file mode 100644 index 00000000..0d67b5d8 --- /dev/null +++ b/astune/context_manager/agentscope_cm/timeline_merging.py @@ -0,0 +1,50 @@ +from typing import List, Type +from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids +from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem + + + +def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage], debug=False) -> bool: + # if `source_step` has more messages than `target_step` + # and if `source_step` and `target_step` share same token_arr in [0:len(target_step)] + # even if the authors are different, we can still merge them + can_merge = False + # compare_level = 'token' # strict compare with token ids + compare_level = 'text' # relaxed compare with text, more easier to match, at very little cost + if len(source_step) >= len(target_step): + all_msg_match = True + for i in range(len(target_step)): + if compare_level == 'text': + same = source_step[i].content_for_future == target_step[i].content_for_future + elif compare_level == 'token': + same = source_step[i].token_arr == target_step[i].token_arr + else: + raise NotImplementedError + if not same: + all_msg_match = False + break + if all_msg_match: + can_merge = True + + if debug: + debug_listofdict = [] + if len(source_step) >= len(target_step): + all_msg_match = False + for i in range(len(target_step)): + d = {} + d['source'] = source_step[i].content_for_future + d['target'] = target_step[i].content_for_future + if compare_level == 'text': + same = source_step[i].content_for_future == target_step[i].content_for_future + elif compare_level == 'token': + same = source_step[i].token_arr == target_step[i].token_arr + else: + raise NotImplementedError + if not same: + d['match'] = 'NO' + else: + d['match'] = 'YES' + debug_listofdict.append(d) + print_listofdict(debug_listofdict, header=f"can_merge_steps debug: {can_merge}") + + return can_merge \ No newline at end of file diff --git a/astune/context_manager/cmt_linear.py b/astune/context_manager/cmt_linear.py index 9621624c..2261cbc1 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_manager/cmt_linear.py @@ -213,9 +213,13 @@ def get_token_inc_from_vllm_response(self, input_msg_ref, llm_output, tools: Lis self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=True, tools=tools), ) # completion_token_arr will contain generation_prompt header + llm_output_role_content = { "role": llm_output['role'], "content": llm_output['content'] } + if not llm_output.get('tool_calls', None): + llm_output_role_content.update({ "tool_calls": llm_output.get('tool_calls', []) }) + completion_token_arr, msg2 = self.get_inc( self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, tools=tools), - self.tokenizer.apply_chat_template(input_msg_ref + [ {"role": llm_output['role'], "content": llm_output['content']} ], tokenize=False, tools=tools), + self.tokenizer.apply_chat_template(input_msg_ref + [ llm_output_role_content ], tokenize=False, tools=tools), ) vllm_output_raw_token = [t.token_id for t in llm_output['tokens']] vllm_output_raw_logprob = [t.logprob for t in llm_output['tokens']] diff --git a/vllm b/vllm new file mode 160000 index 00000000..c7991269 --- /dev/null +++ b/vllm @@ -0,0 +1 @@ +Subproject commit c7991269dd8fe86096a3eee5040e855801ae9665 From 8c8d8d37df44043f157704c65deebde0d4a0c35d Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 18:47:35 +0800 Subject: [PATCH 030/462] fix a mis-alignment --- astune/context_manager/cmt_base_attr.py | 6 +++++- astune/context_manager/cmt_linear.py | 13 +++++++------ astune/parallel_env.py | 5 +++-- astune/task_rollout/async_llm_bridge.py | 10 ++-------- scripts/requirements_verl.txt | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/astune/context_manager/cmt_base_attr.py b/astune/context_manager/cmt_base_attr.py index 9649cc96..f5a217ee 100644 --- a/astune/context_manager/cmt_base_attr.py +++ b/astune/context_manager/cmt_base_attr.py @@ -76,8 +76,12 @@ def __init__( if token_generator == 'auto': dummy_msg = [ {"role": "assistant", "content": "dummy text"} ] try: + # completion_token_arr will contain generation_prompt header + auto_tokenize_target = { "role": self.role, "content": self.content_for_future } + if self.tool_calls: + auto_tokenize_target.update({ "tool_calls": self.tool_calls }) text_frag_to = tokenizer.apply_chat_template( - dummy_msg + [ {"role": self.role, "content": self.content_for_future} ], + dummy_msg + [ auto_tokenize_target ], tokenize=False, tools=tools ) diff --git a/astune/context_manager/cmt_linear.py b/astune/context_manager/cmt_linear.py index 2261cbc1..9756a7fc 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_manager/cmt_linear.py @@ -50,21 +50,22 @@ def prepare_previous_context(self, mod='future'): """ if mod=='future': message_arr = [ - {"role": c.role, "content": c.content_for_future} + {"role": c.role, "content": c.content_for_future, "tool_calls": c.tool_calls} for c in self.full_context ] - return message_arr - elif mod=='raw': message_arr = [ - {"role": c.role, "content": c.content} + {"role": c.role, "content": c.content, "tool_calls": c.tool_calls} for c in self.full_context ] - return message_arr - else: raise ValueError(f"Unknown mod {mod} in prepare_previous_context, only support 'future' and 'raw'") + # remove tool_calls from messages if empty + for i in range(len(message_arr)): + if not message_arr[i]["tool_calls"]: + message_arr[i].pop("tool_calls") + return message_arr def check_context_token_num_safe(self, messages: List[dict], tools: List[dict] = []) -> Tuple[bool, str]: def get_seq_length(messages): diff --git a/astune/parallel_env.py b/astune/parallel_env.py index 55cdfb86..e116da03 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -7,6 +7,7 @@ import asyncio from concurrent.futures import ThreadPoolExecutor from typing import Dict, List, Literal, Callable, Any +from urllib.parse import quote from loguru import logger from omegaconf import DictConfig from tensordict import TensorDict @@ -469,7 +470,7 @@ def trajectories_to_samples(self, cmt_array: List[CMTLinear]) -> List[Sample]: finally: cmt.generate_log(global_step=self.current_global_steps) if os.environ.get('BEST_LOGGER_PATH', None) and os.environ.get('ASTUNE_DEBUG', None): - logger.success(f"View rollout details at [https://localhost:8181/?path={os.path.abspath(os.environ['BEST_LOGGER_PATH'])}]") + logger.success(f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]") sample_arr_final += sample_arr # Step 2: Calculate how many samples need to be removed @@ -589,4 +590,4 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: "messages": np.array(messages), "reward_scores": np.array(step_reward_scores), "reference_advantage": np.array(reference_advantage), - }) \ No newline at end of file + }) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index c0b0148b..8900bca4 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -89,10 +89,7 @@ def llm_chat_remote( tools = [], request_id: str = "" ) -> dict: - """ - input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] - output messages: [{"role": "assistant", "value": "..."}] - """ + updated_sampling_params = {} if sampling_params: updated_sampling_params.update(sampling_params) @@ -123,10 +120,7 @@ def llm_chat_trinity( tools = [], request_id: str = "" ) -> dict: - """ - input messages: [{"role": "system", "value": "..."}, {"role": "user", "value": "..."}] - output messages: [{"role": "assistant", "value": "..."}] - """ + async def main(model_client): updated_sampling_params = {} if sampling_params: diff --git a/scripts/requirements_verl.txt b/scripts/requirements_verl.txt index 8b1d2782..4df897ba 100644 --- a/scripts/requirements_verl.txt +++ b/scripts/requirements_verl.txt @@ -16,7 +16,7 @@ asttokens==3.0.0 async-timeout==5.0.1 attrs==25.4.0 av==15.0.0 -beast-logger==0.0.15 +beast-logger bidict==0.23.1 blake3==1.0.5 blobfile==3.0.0 From 54487393c36fbda8beeb3aad5020b2c156402f90 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 13 Nov 2025 19:04:29 +0800 Subject: [PATCH 031/462] enhance documentation and add English translations for comments in parallel_env.py --- astune/parallel_env.py | 208 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 186 insertions(+), 22 deletions(-) diff --git a/astune/parallel_env.py b/astune/parallel_env.py index e116da03..82b23cba 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -1,3 +1,19 @@ +"""Parallel environment rollout utilities. + +This module contains classes that manage parallel LLM-based environment rollouts +for tasks. Core responsibilities include: + +1. Submitting and monitoring multiple environment worker threads. +2. Dynamically oversampling rollouts and performing early termination when + sufficient statistical confidence is reached. +3. Aggregating and converting collected trajectories into sample objects and + finally into a `DataProto` batch ready for training. +4. Providing progress instrumentation (token generation rate, step buckets). + +None of the implementation logic is modified here; only documentation and +English translations for previously non‑English comments are added. +""" + import os import copy import time @@ -40,6 +56,12 @@ def init_logger(experiment_name): class StepPrinter(AsyncLlmBridge): + """Utility mixin providing periodic progress / throughput printing. + + Tracks token generation speed and thread step distribution. Intended to be + composed with rollout manager classes that maintain an observation window + (`obs_window`) containing per-thread step, token and stop flags. + """ def __init__( self, @@ -51,6 +73,25 @@ def __init__( llm_mode="local", **kwargs ): + """Initialize the step printer. + + Parameters + ---------- + config : DictConfig + Configuration object containing rollout and experiment settings. + async_rollout_manager : Any + Manager responsible for async LLM interactions. + max_parallel : int + Maximum number of parallel environment worker threads. + max_llm_retries : int, optional + Maximum retries for LLM calls, by default 3. + tokenizer : PreTrainedTokenizer, optional + Tokenizer used for padding and ID conversions. + llm_mode : str, optional + Indicates backend mode (e.g., 'local', 'remote'), default 'local'. + **kwargs : Any + Additional parameters passed through for future extensions. + """ init_logger(experiment_name=config.astune.experiment_name) self.llm_mode = llm_mode @@ -66,7 +107,19 @@ def __init__( def step_status_printer(self, obs_window): - # histgram: obs_window['step'] 0~10 / 10~20 / 20~30 / 30~40 / ...... + """Print aggregated rollout progress. + + Buckets thread steps into 5-step ranges and shows how many threads are + currently within each bucket plus finished threads. Also reports token + generation speed. + + Parameters + ---------- + obs_window : dict + Shared state tracking 'step', 'token', and 'stop' arrays for each + active (or finished) thread. + """ + # Histogram buckets: obs_window['step'] 0~5 / 5~10 / 10~15 / ... step_counter = {} current_token = sum(obs_window['token']) current_time = time.time() @@ -98,19 +151,49 @@ def step_status_printer(self, obs_window): print(f"Rollout progress ({token_gen_per_sec_str}): " + " // ".join(print_buf)) class StaticRollout(StepPrinter, AsyncLlmBridge): + """Static (non-dynamic) rollout manager. + + Submits a fixed number of rollout threads per task and waits for all to + finish before collecting results. Provides retry logic for environment + worker execution and aggregates success metrics. + """ def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, mode: Literal["sample", "validate"], task_thread_index: int, obs_window: dict, **kwargs) -> CMTLinear: - """ - Process a single prompt in a thread-safe way. + """Execute one environment rollout worker. + + Handles environment initialization, LLM sampling parameter construction + (with validation overrides), and robust retry on transient failures. + + Parameters + ---------- + task : Task + The task object to roll out. + task_batch_index : int + Index of the task within the provided batch. + task_tag : str + Human-readable tag identifying task and rollout repetition. + mode : Literal['sample','validate'] + Rollout mode selecting sampling hyperparameters. + task_thread_index : int + Global thread index for obs_window bookkeeping. + obs_window : dict + Shared progress structure updated by the worker. + **kwargs : Any + Forwarded for future extensibility. + + Returns + ------- + CMTLinear + Collected trajectory container for this rollout. """ def get_sample_params(): - response_length_eps = 6 # 减少几个token给lm_start等special token的后续处理留余地 + response_length_eps = 6 # Reserve a few tokens for later handling of special tokens like lm_start. if self.config.astune.rollout.name == 'vllm': sampling_params = dict( n=1, max_tokens=self.config.astune.rollout.max_response_length_in_one_turn - response_length_eps, - min_tokens=1, # 必须至少输出1个token + min_tokens=1, # Must output at least 1 token. temperature=self.config.astune.rollout.temperature, top_p=self.config.astune.rollout.top_p ) @@ -161,9 +244,25 @@ def get_sample_params(): def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[CMTLinear]: - # 1. if enable_oversample + """Run static rollout over a batch of tasks. + + Parameters + ---------- + tasks : List[Task] + Tasks to execute. + mode : Literal['sample','validate'] + Sampling mode; validation forces deterministic-ish params. + epoch : str + Epoch identifier for logging. + + Returns + ------- + List[CMTLinear] + List of collected trajectory containers. + """ + # Step 1: if enable_oversample (handled by DynamicRollout override) self.current_token_count_time = time.time() - # 2. otherwise, use legacy rollout method + # Step 2: otherwise, use legacy rollout method cmt_array: List[CMTLinear] = [] rollout_n = 1 if mode=="validate" else self.rollout_n obs_window = { @@ -201,14 +300,41 @@ def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: class DynamicRollout(StaticRollout): + """Dynamic rollout supporting oversampling and early termination. + + Extends the static rollout by launching an oversampled set of threads per + task, continuously monitoring reward variance and convergence conditions to + decide when to truncate further sampling. Implements greedy selection to + maximize reward dispersion (std) for training diversity. + """ def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[CMTLinear]: + """Dispatch to dynamic or static rollout depending on configuration.""" if mode=="sample" and (self.rollout_n!=1) and self.config.astune.rollout.enable_oversample: return self.rollout_dynamic(tasks, mode, epoch) else: return super().rollout(tasks, mode, epoch) def greedy_max_std_selection(self, samples: List[CMTLinear], n): + """Select samples promoting maximum reward spread. + + Strategy: Group by unique reward values in order, take extremes from + both ends when partial groups would exceed quota, optionally duplicate + selections if fewer unique samples than required, then return sorted by + absolute reward magnitude. + + Parameters + ---------- + samples : List[CMTLinear] + Candidate samples. + n : int + Number of samples to select. + + Returns + ------- + List[CMTLinear] + Selected subset with high reward variance. + """ if len(samples) < n: additional_n = n - len(samples) n = len(samples) @@ -233,7 +359,7 @@ def greedy_max_std_selection(self, samples: List[CMTLinear], n): elif len(selected_value) + len(macro_selected_value) > n: preserve_n = n - len(macro_selected_value) - # 从 selected_value 和 selected_index 两端选择 preserve_n 个样本 + # Select preserve_n samples from both ends of selected_value and selected_index. pick_left = preserve_n // 2 pick_right = preserve_n - pick_left macro_selected_value += selected_value[:pick_left] + selected_value[-pick_right:] @@ -250,8 +376,31 @@ def greedy_max_std_selection(self, samples: List[CMTLinear], n): def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str, allow_sample_num_change=True, allow_force_stop=True) -> List[CMTLinear]: - """ - Rollout more + """Perform dynamic oversampled rollout with adaptive early stopping. + + Launches an oversampled number of rollout threads per task, periodically + evaluates termination conditions (all finished, sufficient diversity, + or confirmation of homogeneity), and force-stops remaining threads by + setting shared stop flags when appropriate. + + Parameters + ---------- + tasks : List[Task] + Tasks to roll out. + mode : Literal['sample','validate'] + Must be 'sample'; 'validate' is delegated to static logic. + epoch : str + Epoch identifier used for logging scope. + allow_sample_num_change : bool, optional + Whether final sample count may change to fit hardware divisibility. + allow_force_stop : bool, optional + Whether unfinished threads can be signaled to halt once criteria + are met. + + Returns + ------- + List[CMTLinear] + Selected trajectories after variance-based filtering / amendment. """ cmt_array: List[CMTLinear] = [] assert mode != "validate" @@ -270,7 +419,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] } with ThreadPoolExecutor(max_workers=self.max_parallel) as executor: - # 提交线程 + # Submit threads futures = [] for task_batch_index, task in enumerate(tasks): task_future_array = [] @@ -287,7 +436,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] futures += [task_future_array] tic = -1 - # 记录已完成线程的结果 + # Record results of completed threads while True: tic += 1 can_terminate = [False for _ in futures] @@ -319,7 +468,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] # finish condition 3: if more than rollout_n_confirm tasks are finished, we can confirm this task is hopeless (or successful for certainty) can_terminate[j] = True terminate_status[j] = f'confirm_dummy({len(completed_results)}/{reward_std:.2f})' - # take actions to stop future rollout + # Take actions to stop future rollout if allow_force_stop: for k in range(j*rollout_n_oversample, j*rollout_n_oversample + rollout_n_oversample): obs_window['stop'][k] = True @@ -336,14 +485,14 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] self.step_status_printer(obs_window) # print status every 10*5=50 seconds logger.info(f"task complete {sum(can_terminate)}/{len(can_terminate)} tasks: {terminate_status}") time.sleep(5) - # 等待所有线程完成或者被迫中止 + # Wait until all threads finish or are forcibly terminated tic = -1 while any(f.running() for task_future_array in futures for f in task_future_array): tic += 1 if tic % 10 == 0: logger.info('waiting final sync, this will not take long') time.sleep(5) - # 检查到底有多少thread完成了预定任务 + # Check how many threads completed scheduled tasks task_ineffective_thread_cnt = [] task_completed_thread_cnt = [] task_extra_thread_cnt = [] @@ -355,7 +504,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] completed_results = [cmt for cmt in completed_results if not cmt.discarded] task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) - # 计数 + # Counting completed_task_cnt = len(completed_results) if all_equal: task_need_amend += 1 @@ -374,9 +523,9 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes total_sample = sum(task_completed_thread_cnt) if allow_sample_num_change and (total_sample > world_size*2): - # 允许样本数量变化,我们只需要返回的样本能够被 显卡数 整除即可 - # add_count = (world_size - total_sample % world_size) # 如果采用添加策略,需要添加的样本数 - add_count = 0 # 如果采用添加策略,需要添加的样本数 + # Allow sample count changes: we only require divisibility by GPU count. + # add_count = (world_size - total_sample % world_size) # If using an addition strategy, number of samples to add. + add_count = 0 # If using an addition strategy, number of samples to add. num_task_to_amend = len(futures) # num_task logger.info(f"allow_sample_num_change policy: world_size: {world_size}, total_sample {total_sample}, add_count: {add_count}, ") # 选择 extra 最少的task进行补偿 @@ -390,7 +539,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") else: - # 不允许样本数量变化,尝试补偿 + # Sample count change not allowed; attempt compensation. num_task_max_to_amend = sum(task_extra_thread_cnt) // rollout_n num_task_to_amend = min(num_task_max_to_amend, task_need_amend) extra_num_thread_required = num_task_to_amend * rollout_n @@ -446,10 +595,21 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] class ParallelEnvManager(DynamicRollout): + """High-level manager orchestrating parallel environment rollouts. + + Adds conversion helpers to transform collected trajectories into + `Sample` objects and finally a padded `DataProto` suitable for model + training. + """ # TODO: define an extra class for trajectory-dataproto converting. def to_dataproto(self, cmt_array) -> DataProto: - """Convert trajectories to DataProto""" + """Convert trajectories to a `DataProto` batch. + + Pipeline: + 1. Tokenize grouped trajectories into `Sample` objects. + 2. Pad and batch samples into tensors and auxiliary metadata. + """ # Step 1: Convert trajectories to samples: tokenizing samples = self.trajectories_to_samples(cmt_array) @@ -459,7 +619,11 @@ def to_dataproto(self, cmt_array) -> DataProto: return dataproto def trajectories_to_samples(self, cmt_array: List[CMTLinear]) -> List[Sample]: - """Convert trajectories to samples""" + """Convert a list of trajectory containers into flat `Sample` objects. + + Ensures divisibility of sample count by world size (removing random + excess) for downstream distributed training alignment. + """ sample_arr_final = [] CMTLinear.compute_reference_advantage(cmt_array) for cmt in cmt_array: From 2081f999e68a0194baed88d27a926d54bd322809 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 14 Nov 2025 01:36:58 +0800 Subject: [PATCH 032/462] add werewolf --- astune/backbone_others/trainer.py | 2 +- astune/main_verl.py | 2 +- astune/main_vllm.py | 2 +- astune/protocol/agentscope_protocol.py | 2 +- astune/task_reader/__init__.py | 96 +++++ astune/task_reader/env_service_reader.py | 39 ++ astune/task_reader/hf_dataset_reader.py | 77 ++++ astune/task_reader/jsonl_reader.py | 70 ++++ astune/task_reader/task_reader_base.py | 204 ---------- astune/workflow_controller/agentscope_flow.py | 10 +- tutorial/appworld.py | 2 +- tutorial/math_agent.py | 2 +- tutorial/werewolves/game.py | 351 ++++++++++++++++++ tutorial/werewolves/prompt.py | 191 ++++++++++ tutorial/werewolves/start.py | 138 +++++++ tutorial/werewolves/structured_model.py | 88 +++++ tutorial/werewolves/utils.py | 168 +++++++++ tutorial/werewolves/werewolves.md | 115 ++++++ vllm | 1 - 19 files changed, 1346 insertions(+), 214 deletions(-) create mode 100644 astune/task_reader/__init__.py create mode 100644 astune/task_reader/env_service_reader.py create mode 100644 astune/task_reader/hf_dataset_reader.py create mode 100644 astune/task_reader/jsonl_reader.py create mode 100644 tutorial/werewolves/game.py create mode 100644 tutorial/werewolves/prompt.py create mode 100644 tutorial/werewolves/start.py create mode 100644 tutorial/werewolves/structured_model.py create mode 100644 tutorial/werewolves/utils.py create mode 100644 tutorial/werewolves/werewolves.md delete mode 160000 vllm diff --git a/astune/backbone_others/trainer.py b/astune/backbone_others/trainer.py index 5ad29e15..b389f974 100644 --- a/astune/backbone_others/trainer.py +++ b/astune/backbone_others/trainer.py @@ -1605,7 +1605,7 @@ def get_eval_dataset(self): if hasattr(self, 'main_val_dataset'): return self.main_val_dataset, None, None else: - from astune.task_reader.task_reader_base import TaskReaderRouter + from astune.task_reader import TaskReaderRouter task_reader = TaskReaderRouter(self.config) tasks = task_reader.get_validation_tasks() self.main_val_dataset = tasks diff --git a/astune/main_verl.py b/astune/main_verl.py index 14e5c53f..8e618935 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -241,7 +241,7 @@ def run(self, config): from astune.utils.process_dataset import create_rl_sampler # Create training and validation datasets. - from astune.task_reader.task_reader_base import TaskReaderRouter, task_to_standard_dataset + from astune.task_reader import TaskReaderRouter, task_to_standard_dataset task_reader = TaskReaderRouter(config) val_dataset = task_to_standard_dataset(task_reader.get_validation_tasks()) train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) diff --git a/astune/main_vllm.py b/astune/main_vllm.py index acde7038..da813aad 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -93,7 +93,7 @@ def run(config): tokenizer=async_rollout_manager.tokenizer ) - from astune.task_reader.task_reader_base import TaskReaderRouter + from astune.task_reader import TaskReaderRouter task_reader = TaskReaderRouter(config) tasks = task_reader.get_validation_tasks() print(tasks[:2]) diff --git a/astune/protocol/agentscope_protocol.py b/astune/protocol/agentscope_protocol.py index 5461075d..d4b17974 100644 --- a/astune/protocol/agentscope_protocol.py +++ b/astune/protocol/agentscope_protocol.py @@ -7,7 +7,7 @@ class AgentScopeLearnProtocol(BaseModel): model_config = {"extra": "allow"} - # Trainer to use; default "trinity". Optional: "agentscorpion-trinity". + # Trainer to use; default "trinity". Optional: "astune-trinity". trainer: str = Field(default="trinity") # Experiment name agentflow_name: str = Field(default="agent-flow") diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py new file mode 100644 index 00000000..a0d036fb --- /dev/null +++ b/astune/task_reader/__init__.py @@ -0,0 +1,96 @@ +import json +import uuid +import torch +import datasets +import numpy as np +from typing import List, Dict, Optional +from astune.schema.task import Task +from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler +from astune.env_service_client.env_client_ng import EnvClient + +from astune.task_reader.env_service_reader import TaskReaderEnvService +from astune.task_reader.hf_dataset_reader import TaskReaderHuggingFace +from astune.task_reader.jsonl_reader import TaskReaderJsonl +from astune.task_reader.task_reader_base import TaskReaderBase + +class RandomDummyGenerator(TaskReaderBase): + + def __init__(self, config): + super().__init__(config) + + def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: + tasks = [] + # Save the current random state + original_state = np.random.get_state() + np.random.seed(42) + random_number = [ x for x in range(1000) ] + # shuffle + np.random.shuffle(random_number) + for idx in random_number: + task = Task( + main_query=f'[dummy task @ {idx}]', + init_messages=[], + task_id=str(idx), + env_type=f"no_env", + metadata={}, + ) + tasks.append(task) + # Restore the original random state + np.random.set_state(original_state) + return tasks + + def get_training_tasks(self) -> List[Task]: + return self._load_dataset_split('dataset_name', 'split') + + def get_validation_tasks(self) -> List[Task]: + return self._load_dataset_split('dataset_name', 'split') + + +class TaskReaderRouter(TaskReaderBase): + def __init__(self, config): + super().__init__(config) + self.task_reader_type = self.config.astune.task_reader.type + if self.task_reader_type == 'env_service': + self.task_reader = TaskReaderEnvService(config) + elif self.task_reader_type == 'dataset_file': + self.task_reader = TaskReaderJsonl(config) + elif self.task_reader_type == 'huggingface_dat_repo': + self.task_reader = TaskReaderHuggingFace(config) + elif self.task_reader_type == 'random_dummy': + self.task_reader = RandomDummyGenerator(config) + else: + raise ValueError(f"Unsupported task reader type: {self.task_reader_type}") + + def get_training_tasks(self) -> List[Task]: + return self.task_reader.get_training_tasks() + + def get_validation_tasks(self) -> List[Task]: + return self.task_reader.get_validation_tasks() + + +def task_to_standard_dataset(tasks: List[Task]) -> datasets.Dataset: + """ + Convert a list of Task objects to a standard Hugging Face Dataset. + + Args: + tasks (List[Task]): List of Task objects. + + Returns: + datasets.Dataset: Hugging Face Dataset containing the tasks. + """ + data = { + 'task_id': [], + 'main_query': [], + 'init_messages': [], + 'env_type': [], + 'metadata': [], + } + + for task in tasks: + data['task_id'].append(task.task_id) + data['main_query'].append(task.main_query) + data['init_messages'].append(task.init_messages) + data['env_type'].append(task.env_type) + data['metadata'].append(task.metadata) + + return datasets.Dataset.from_dict(data) diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py new file mode 100644 index 00000000..d9a0eb85 --- /dev/null +++ b/astune/task_reader/env_service_reader.py @@ -0,0 +1,39 @@ +import json +import uuid +import torch +import datasets +from typing import List, Dict, Optional +from astune.schema.task import Task +from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler +from astune.env_service_client.env_client_ng import EnvClient +from astune.task_reader.task_reader_base import TaskReaderBase + + +class TaskReaderEnvService(TaskReaderBase): + def __init__(self, config): + super().__init__(config) + + def get_tasks(self, split): + env_url = self.config.astune.task_reader.env_service.env_url + env_type = self.config.astune.task_reader.env_service.env_type + env_service_client = EnvClient(base_url=env_url) + task_id_array = env_service_client.get_env_profile(env_type, split=split) + if len(task_id_array) == 0: + raise ValueError(f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}") + tasks = [ + Task( + main_query='[not defined]', + init_messages=[], + task_id=str(task_id), + env_type=env_type, + metadata={}, + ) for task_id in task_id_array] + return tasks + + def get_validation_tasks(self): + split = self.config.astune.task_reader.env_service.validation_split + return self.get_tasks(split=split) + + def get_training_tasks(self): + split = self.config.astune.task_reader.env_service.training_split + return self.get_tasks(split=split) diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py new file mode 100644 index 00000000..a6634549 --- /dev/null +++ b/astune/task_reader/hf_dataset_reader.py @@ -0,0 +1,77 @@ +import json +import uuid +import torch +import datasets +from typing import List, Dict, Optional +from astune.schema.task import Task +from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler +from astune.env_service_client.env_client_ng import EnvClient +from astune.task_reader.task_reader_base import TaskReaderBase + + +class TaskReaderHuggingFace(TaskReaderBase): + """ + Task reader that reads tasks from Hugging Face datasets. + + This class allows loading tasks directly from Hugging Face dataset repositories. + It supports configuring the dataset name and split names for training and validation. + """ + + def __init__(self, config): + super().__init__(config) + + + def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: + """ + Load a dataset split from Hugging Face datasets. + + Args: + dataset_name: Name of the dataset in Hugging Face format (e.g., 'gsm8k') + split: Name of the split to load (e.g., 'train', 'validation') + + Returns: + List[Task]: List of Task objects created from the dataset. + """ + try: + dataset = datasets.load_dataset(dataset_name, split=split) + except Exception as e: + raise ValueError(f"Failed to load dataset '{dataset_name}' with split '{split}': {str(e)}") + + # if len(dataset) == 0: + # raise ValueError(f"No examples found in dataset '{dataset_name}' with split '{split}'") + + tasks = [] + for idx, example in enumerate(dataset): + # Create Task object + task = Task( + main_query=example['question'], + init_messages=[], # Dataset examples typically don't have init messages + task_id=str(idx), + env_type=f"no_env", + metadata=example, + ) + tasks.append(task) + + return tasks + + def get_training_tasks(self) -> List[Task]: + """ + Get training tasks from the Hugging Face dataset specified in the config. + + Returns: + List[Task]: List of training Task objects. + """ + dataset_name = self.config.astune.task_reader.huggingface_dat_repo.dataset_path + split = self.config.astune.task_reader.huggingface_dat_repo.training_split + return self._load_dataset_split(dataset_name, split) + + def get_validation_tasks(self) -> List[Task]: + """ + Get validation tasks from the Hugging Face dataset specified in the config. + + Returns: + List[Task]: List of validation Task objects. + """ + dataset_name = self.config.astune.task_reader.huggingface_dat_repo.dataset_path + split = self.config.astune.task_reader.huggingface_dat_repo.validation_split + return self._load_dataset_split(dataset_name, split) diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py new file mode 100644 index 00000000..149c5058 --- /dev/null +++ b/astune/task_reader/jsonl_reader.py @@ -0,0 +1,70 @@ +import json +import uuid +import torch +import datasets +from typing import List, Dict, Optional +from astune.schema.task import Task +from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler +from astune.env_service_client.env_client_ng import EnvClient +from astune.task_reader.task_reader_base import TaskReaderBase + + + +class TaskReaderJsonl(TaskReaderBase): + def __init__(self, config): + super().__init__(config) + + def _read_jsonl_file(self, file_path): + """ + Read tasks from a JSONL file. + + Args: + file_path (str): Path to the JSONL file. + + Returns: + List[Task]: List of Task objects. + """ + tasks = [] + try: + with open(file_path, 'r', encoding='utf-8') as f: + for line in f: + if line.strip(): # Skip empty lines + task_data = json.loads(line) + # Create a Task object from the JSON data + task = Task( + main_query=task_data.get('main_query', '[not defined]'), + init_messages=task_data.get('init_messages', []), + task_id=task_data.get('task_id', ''), + env_type=task_data.get('env_type', 'no_env'), + metadata=task_data.get('metadata', {}) + ) + tasks.append(task) + except FileNotFoundError: + raise ValueError(f"JSONL file not found: {file_path}") + except json.JSONDecodeError as e: + raise ValueError(f"Invalid JSON in file {file_path}: {str(e)}") + + if len(tasks) == 0: + raise ValueError(f"No tasks found in file: {file_path}") + + return tasks + + def get_training_tasks(self) -> List[Task]: + """ + Get training tasks from the JSONL file specified in the config. + + Returns: + List[Task]: List of training Task objects. + """ + file_path = self.config.astune.task_reader.dataset_file.training.file_path + return self._read_jsonl_file(file_path) + + def get_validation_tasks(self) -> List[Task]: + """ + Get validation tasks from the JSONL file specified in the config. + + Returns: + List[Task]: List of validation Task objects. + """ + file_path = self.config.astune.task_reader.dataset_file.validation.file_path + return self._read_jsonl_file(file_path) diff --git a/astune/task_reader/task_reader_base.py b/astune/task_reader/task_reader_base.py index b0ee6ad0..ecc49297 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astune/task_reader/task_reader_base.py @@ -18,207 +18,3 @@ def get_training_tasks(self)->List[Task]: def get_validation_tasks(self)->List[Task]: raise NotImplementedError - -class TaskReaderAppWorld(TaskReaderBase): - def __init__(self, config): - super().__init__(config) - - def get_tasks(self, split): - env_url = self.config.astune.task_reader.env_service.env_url - env_type = self.config.astune.task_reader.env_service.env_type - env_service_client = EnvClient(base_url=env_url) - task_id_array = env_service_client.get_env_profile(env_type, split=split) - if len(task_id_array) == 0: - raise ValueError(f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}") - tasks = [ - Task( - main_query='[not defined]', - init_messages=[], - task_id=str(task_id), - env_type=env_type, - metadata={}, - ) for task_id in task_id_array] - return tasks - - def get_validation_tasks(self): - split = self.config.astune.task_reader.env_service.validation_split - return self.get_tasks(split=split) - - def get_training_tasks(self): - split = self.config.astune.task_reader.env_service.training_split - return self.get_tasks(split=split) - - -class TaskReaderJsonl(TaskReaderBase): - def __init__(self, config): - super().__init__(config) - - def _read_jsonl_file(self, file_path): - """ - Read tasks from a JSONL file. - - Args: - file_path (str): Path to the JSONL file. - - Returns: - List[Task]: List of Task objects. - """ - tasks = [] - try: - with open(file_path, 'r', encoding='utf-8') as f: - for line in f: - if line.strip(): # Skip empty lines - task_data = json.loads(line) - # Create a Task object from the JSON data - task = Task( - main_query=task_data.get('main_query', '[not defined]'), - init_messages=task_data.get('init_messages', []), - task_id=task_data.get('task_id', ''), - env_type=task_data.get('env_type', 'no_env'), - metadata=task_data.get('metadata', {}) - ) - tasks.append(task) - except FileNotFoundError: - raise ValueError(f"JSONL file not found: {file_path}") - except json.JSONDecodeError as e: - raise ValueError(f"Invalid JSON in file {file_path}: {str(e)}") - - if len(tasks) == 0: - raise ValueError(f"No tasks found in file: {file_path}") - - return tasks - - def get_training_tasks(self) -> List[Task]: - """ - Get training tasks from the JSONL file specified in the config. - - Returns: - List[Task]: List of training Task objects. - """ - file_path = self.config.astune.task_reader.dataset_file.training.file_path - return self._read_jsonl_file(file_path) - - def get_validation_tasks(self) -> List[Task]: - """ - Get validation tasks from the JSONL file specified in the config. - - Returns: - List[Task]: List of validation Task objects. - """ - file_path = self.config.astune.task_reader.dataset_file.validation.file_path - return self._read_jsonl_file(file_path) - - -class TaskReaderHuggingFace(TaskReaderBase): - """ - Task reader that reads tasks from Hugging Face datasets. - - This class allows loading tasks directly from Hugging Face dataset repositories. - It supports configuring the dataset name and split names for training and validation. - """ - - def __init__(self, config): - super().__init__(config) - - - def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: - """ - Load a dataset split from Hugging Face datasets. - - Args: - dataset_name: Name of the dataset in Hugging Face format (e.g., 'gsm8k') - split: Name of the split to load (e.g., 'train', 'validation') - - Returns: - List[Task]: List of Task objects created from the dataset. - """ - try: - dataset = datasets.load_dataset(dataset_name, split=split) - except Exception as e: - raise ValueError(f"Failed to load dataset '{dataset_name}' with split '{split}': {str(e)}") - - # if len(dataset) == 0: - # raise ValueError(f"No examples found in dataset '{dataset_name}' with split '{split}'") - - tasks = [] - for idx, example in enumerate(dataset): - # Create Task object - task = Task( - main_query=example['question'], - init_messages=[], # Dataset examples typically don't have init messages - task_id=str(idx), - env_type=f"no_env", - metadata=example, - ) - tasks.append(task) - - return tasks - - def get_training_tasks(self) -> List[Task]: - """ - Get training tasks from the Hugging Face dataset specified in the config. - - Returns: - List[Task]: List of training Task objects. - """ - dataset_name = self.config.astune.task_reader.huggingface_dat_repo.dataset_path - split = self.config.astune.task_reader.huggingface_dat_repo.training_split - return self._load_dataset_split(dataset_name, split) - - def get_validation_tasks(self) -> List[Task]: - """ - Get validation tasks from the Hugging Face dataset specified in the config. - - Returns: - List[Task]: List of validation Task objects. - """ - dataset_name = self.config.astune.task_reader.huggingface_dat_repo.dataset_path - split = self.config.astune.task_reader.huggingface_dat_repo.validation_split - return self._load_dataset_split(dataset_name, split) - - -class TaskReaderRouter(TaskReaderBase): - def __init__(self, config): - super().__init__(config) - self.task_reader_type = self.config.astune.task_reader.type - if self.task_reader_type == 'env_service': - self.task_reader = TaskReaderAppWorld(config) - elif self.task_reader_type == 'dataset_file': - self.task_reader = TaskReaderJsonl(config) - elif self.task_reader_type == 'huggingface_dat_repo': - self.task_reader = TaskReaderHuggingFace(config) - else: - raise ValueError(f"Unsupported task reader type: {self.task_reader_type}") - - def get_training_tasks(self) -> List[Task]: - return self.task_reader.get_training_tasks() - - def get_validation_tasks(self) -> List[Task]: - return self.task_reader.get_validation_tasks() - -def task_to_standard_dataset(tasks: List[Task]) -> datasets.Dataset: - """ - Convert a list of Task objects to a standard Hugging Face Dataset. - - Args: - tasks (List[Task]): List of Task objects. - - Returns: - datasets.Dataset: Hugging Face Dataset containing the tasks. - """ - data = { - 'task_id': [], - 'main_query': [], - 'init_messages': [], - 'env_type': [], - 'metadata': [], - } - - for task in tasks: - data['task_id'].append(task.task_id) - data['main_query'].append(task.main_query) - data['init_messages'].append(task.init_messages) - data['env_type'].append(task.env_type) - data['metadata'].append(task.metadata) - - return datasets.Dataset.from_dict(data) \ No newline at end of file diff --git a/astune/workflow_controller/agentscope_flow.py b/astune/workflow_controller/agentscope_flow.py index 98f406fe..99467196 100644 --- a/astune/workflow_controller/agentscope_flow.py +++ b/astune/workflow_controller/agentscope_flow.py @@ -75,10 +75,14 @@ def generated_token_callback_fn(token_array): astune_proxy.update_judge_input_dictionary(task_core_arg=task_core_arg) astune_proxy.update_judge_input_dictionary(env=env) astune_proxy.update_judge_input_dictionary(grouped_steps=astune_proxy.grouped_steps) + judge_input_dictionary = astune_proxy.get_judge_input_dictionary() - raw_reward, is_success = astune_proxy.get_judge().compute_reward( - astune_proxy.get_judge_input_dictionary() - ) + # get reward + if 'raw_reward' in judge_input_dictionary and 'is_success' in judge_input_dictionary: + raw_reward = judge_input_dictionary['raw_reward'] + is_success = judge_input_dictionary['is_success'] + else: + raw_reward, is_success = astune_proxy.get_judge().compute_reward(judge_input_dictionary) # evaluate reward = Reward( diff --git a/tutorial/appworld.py b/tutorial/appworld.py index 071ed425..686a3091 100644 --- a/tutorial/appworld.py +++ b/tutorial/appworld.py @@ -5,7 +5,7 @@ class ExampleAgentScopeLearnProtocol(AgentScopeLearnProtocol): - trainer: str = Field(default="agentscorpion-trinity") + trainer: str = Field(default="astune-trinity") async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config): from agentscope.agent import ReActAgent diff --git a/tutorial/math_agent.py b/tutorial/math_agent.py index bd403fc8..b531e459 100644 --- a/tutorial/math_agent.py +++ b/tutorial/math_agent.py @@ -34,7 +34,7 @@ class FinalResult(BaseModel): class ExampleMathLearn(AgentScopeLearnProtocol): - trainer: str = Field(default="agentscorpion-trinity") + trainer: str = Field(default="astune-trinity") async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config): from agentscope.agent import ReActAgent diff --git a/tutorial/werewolves/game.py b/tutorial/werewolves/game.py new file mode 100644 index 00000000..5599b88b --- /dev/null +++ b/tutorial/werewolves/game.py @@ -0,0 +1,351 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-branches, too-many-statements, no-name-in-module +"""A werewolf game implemented by agentscope.""" +import numpy as np + +from tutorial.werewolves.utils import ( + majority_vote, + names_to_str, + EchoAgent, + MAX_GAME_ROUND, + MAX_DISCUSSION_ROUND, + Players, +) +from tutorial.werewolves.structured_model import ( + DiscussionModel, + get_vote_model, + get_poison_model, + WitchResurrectModel, + get_seer_model, + get_hunter_model, +) +# from tutorial.werewolves.prompt import EnglishPrompts as Prompts + +# Uncomment the following line to use Chinese prompts +from tutorial.werewolves.prompt import ChinesePrompts as Prompts + + +from agentscope.agent import ReActAgent +from agentscope.pipeline import ( + MsgHub, + sequential_pipeline, + fanout_pipeline, +) + + +moderator = EchoAgent() + + +async def hunter_stage( + hunter_agent: ReActAgent, + players: Players, +) -> str | None: + """Because the hunter's stage may happen in two places: killed at night + or voted during the day, we define a function here to avoid duplication.""" + global moderator + msg_hunter = await hunter_agent( + await moderator(Prompts.to_hunter.format(name=hunter_agent.name)), + structured_model=get_hunter_model(players.current_alive), + ) + if msg_hunter.metadata.get("shoot"): + return msg_hunter.metadata.get("name", None) + return None + + +async def werewolves_game(agents: list[ReActAgent], roles) -> bool: + """The main entry of the werewolf game + + Args: + agents (`list[ReActAgent]`): + A list of 9 agents. + """ + assert len(agents) == 9, "The werewolf game needs exactly 9 players." + + # Init the players' status + players = Players() + + # If the witch has healing and poison potion + healing, poison = True, True + + # If it's the first day, the dead can leave a message + first_day = True + + # Broadcast the game begin message + async with MsgHub(participants=agents) as greeting_hub: + await greeting_hub.broadcast( + await moderator( + Prompts.to_all_new_game.format(names_to_str(agents)), + ), + ) + + # Assign roles to the agents + np.random.shuffle(agents) + + for agent, role in zip(agents, roles): + # Tell the agent its role + await agent.observe( + await moderator( + f"[{agent.name} ONLY] {agent.name}, your role is {role}.", + ), + ) + players.add_player(agent, role) + + # Printing the roles + players.print_roles() + + # GAME BEGIN! + for _ in range(MAX_GAME_ROUND): + # Create a MsgHub for all players to broadcast messages + async with MsgHub( + participants=players.current_alive, + enable_auto_broadcast=False, # manual broadcast only + name="alive_players", + ) as alive_players_hub: + # Night phase + await alive_players_hub.broadcast( + await moderator(Prompts.to_all_night), + ) + killed_player, poisoned_player, shot_player = None, None, None + + # Werewolves discuss + async with MsgHub( + players.werewolves, + enable_auto_broadcast=True, + announcement=await moderator( + Prompts.to_wolves_discussion.format( + names_to_str(players.werewolves), + names_to_str(players.current_alive), + ), + ), + name="werewolves", + ) as werewolves_hub: + # Discussion + n_werewolves = len(players.werewolves) + for _ in range(1, MAX_DISCUSSION_ROUND * n_werewolves + 1): + res = await players.werewolves[_ % n_werewolves]( + structured_model=DiscussionModel, + ) + if _ % n_werewolves == 0 and res.metadata.get( + "reach_agreement", + ): + break + + # Werewolves vote + # Disable auto broadcast to avoid following other's votes + werewolves_hub.set_auto_broadcast(False) + msgs_vote = await fanout_pipeline( + players.werewolves, + msg=await moderator(content=Prompts.to_wolves_vote), + structured_model=get_vote_model(players.current_alive), + enable_gather=False, + ) + killed_player, votes = majority_vote( + [_.metadata.get("vote") for _ in msgs_vote], + ) + # Postpone the broadcast of voting + await werewolves_hub.broadcast( + [ + *msgs_vote, + await moderator( + Prompts.to_wolves_res.format(votes, killed_player), + ), + ], + ) + + # Witch's turn + await alive_players_hub.broadcast( + await moderator(Prompts.to_all_witch_turn), + ) + msg_witch_poison = None + for agent in players.witch: + # Cannot heal witch herself + msg_witch_resurrect = None + if healing and killed_player != agent.name: + msg_witch_resurrect = await agent( + await moderator( + Prompts.to_witch_resurrect.format( + witch_name=agent.name, + dead_name=killed_player, + ), + ), + structured_model=WitchResurrectModel, + ) + if msg_witch_resurrect.metadata.get("resurrect"): + killed_player = None + healing = False + + # Has poison potion and hasn't used the healing potion + if poison and not ( + msg_witch_resurrect + and msg_witch_resurrect.metadata["resurrect"] + ): + msg_witch_poison = await agent( + await moderator( + Prompts.to_witch_poison.format( + witch_name=agent.name, + ), + ), + structured_model=get_poison_model( + players.current_alive, + ), + ) + if msg_witch_poison.metadata.get("poison"): + poisoned_player = msg_witch_poison.metadata.get("name") + poison = False + + # Seer's turn + await alive_players_hub.broadcast( + await moderator(Prompts.to_all_seer_turn), + ) + for agent in players.seer: + msg_seer = await agent( + await moderator( + Prompts.to_seer.format( + agent.name, + names_to_str(players.current_alive), + ), + ), + structured_model=get_seer_model(players.current_alive), + ) + if msg_seer.metadata.get("name"): + player = msg_seer.metadata["name"] + await agent.observe( + await moderator( + Prompts.to_seer_result.format( + agent_name=player, + role=players.name_to_role[player], + ), + ), + ) + + # Hunter's turn + for agent in players.hunter: + # If killed and not by witch's poison + if ( + killed_player == agent.name + and poisoned_player != agent.name + ): + shot_player = await hunter_stage(agent, players) + + # Update alive players + dead_tonight = [killed_player, poisoned_player, shot_player] + players.update_players(dead_tonight) + + # Day phase + if len([_ for _ in dead_tonight if _]) > 0: + await alive_players_hub.broadcast( + await moderator( + Prompts.to_all_day.format( + names_to_str([_ for _ in dead_tonight if _]), + ), + ), + ) + + # The killed player leave a last message in first night + if killed_player and first_day: + msg_moderator = await moderator( + Prompts.to_dead_player.format(killed_player), + ) + await alive_players_hub.broadcast(msg_moderator) + # Leave a message + last_msg = await players.name_to_agent[killed_player]() + await alive_players_hub.broadcast(last_msg) + + else: + await alive_players_hub.broadcast( + await moderator(Prompts.to_all_peace), + ) + + # Check winning + res = players.check_winning() + if res: + await moderator(res) + break + + # Discussion + await alive_players_hub.broadcast( + await moderator( + Prompts.to_all_discuss.format( + names=names_to_str(players.current_alive), + ), + ), + ) + # Open the auto broadcast to enable discussion + alive_players_hub.set_auto_broadcast(True) + await sequential_pipeline(players.current_alive) + # Disable auto broadcast to avoid leaking info + alive_players_hub.set_auto_broadcast(False) + + # Voting + msgs_vote = await fanout_pipeline( + players.current_alive, + await moderator( + Prompts.to_all_vote.format( + names_to_str(players.current_alive), + ), + ), + structured_model=get_vote_model(players.current_alive), + enable_gather=False, + ) + voted_player, votes = majority_vote( + [_.metadata.get("vote") for _ in msgs_vote], + ) + # Broadcast the voting messages together to avoid influencing + # each other + voting_msgs = [ + *msgs_vote, + await moderator( + Prompts.to_all_res.format(votes, voted_player), + ), + ] + + # Leave a message if voted + if voted_player: + prompt_msg = await moderator( + Prompts.to_dead_player.format(voted_player), + ) + last_msg = await players.name_to_agent[voted_player]( + prompt_msg, + ) + voting_msgs.extend([prompt_msg, last_msg]) + + await alive_players_hub.broadcast(voting_msgs) + + # If the voted player is the hunter, he can shoot someone + shot_player = None + for agent in players.hunter: + if voted_player == agent.name: + shot_player = await hunter_stage(agent, players) + if shot_player: + await alive_players_hub.broadcast( + await moderator( + Prompts.to_all_hunter_shoot.format( + shot_player, + ), + ), + ) + + # Update alive players + dead_today = [voted_player, shot_player] + players.update_players(dead_today) + + # Check winning + res = players.check_winning() + if res: + async with MsgHub(players.all_players) as all_players_hub: + res_msg = await moderator(res) + await all_players_hub.broadcast(res_msg) + break + + # The day ends + first_day = False + + # Game over, each player reflects + await fanout_pipeline( + agents=agents, + msg=await moderator(Prompts.to_all_reflect), + ) + + alive_wolves = len( [p for p in players.current_alive if p.role == "werewolf"] ) + good_guy_win = (alive_wolves == 0) + return good_guy_win \ No newline at end of file diff --git a/tutorial/werewolves/prompt.py b/tutorial/werewolves/prompt.py new file mode 100644 index 00000000..f33986fc --- /dev/null +++ b/tutorial/werewolves/prompt.py @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- +"""Default prompts""" + + +class EnglishPrompts: + """English prompts used to guide the werewolf game.""" + + to_dead_player = ( + "{}, you're eliminated now. Now you can make a final statement to " + "all alive players before you leave the game." + ) + + to_all_new_game = ( + "A new game is starting, the players are: {}. Now we randomly " + "reassign the roles to each player and inform them of their roles " + "privately." + ) + + to_all_night = ( + "Night has fallen, everyone close your eyes. Werewolves open your " + "eyes and choose a player to eliminate tonight." + ) + + to_wolves_discussion = ( + "[WEREWOLVES ONLY] {}, you should discuss and " + "decide on a player to eliminate tonight. Current alive players " + "are {}. Remember to set `reach_agreement` to True if you reach an " + "agreement during the discussion." + ) + + to_wolves_vote = "[WEREWOLVES ONLY] Which player do you vote to kill?" + + to_wolves_res = ( + "[WEREWOLVES ONLY] The voting result is {}. So you have chosen to " + "eliminate {}." + ) + + to_all_witch_turn = ( + "Witch's turn, witch open your eyes and decide your action tonight..." + ) + to_witch_resurrect = ( + "[WITCH ONLY] {witch_name}, you're the witch, and tonight {dead_name} " + "is eliminated. You can resurrect him/her by using your healing " + "potion, " + "and note you can only use it once in the whole game. Do you want to " + "resurrect {dead_name}? Give me your reason and decision." + ) + + to_witch_resurrect_no = ( + "[WITCH ONLY] The witch has chosen not to resurrect the player." + ) + to_witch_resurrect_yes = ( + "[WITCH ONLY] The witch has chosen to resurrect the player." + ) + + to_witch_poison = ( + "[WITCH ONLY] {witch_name}, as a witch, you have a one-time-use " + "poison potion, do you want to use it tonight? Give me your reason " + "and decision." + ) + + to_all_seer_turn = ( + "Seer's turn, seer open your eyes and check one player's identity " + "tonight..." + ) + + to_seer = ( + "[SEER ONLY] {}, as the seer you can check one player's identity " + "tonight. Who do you want to check? Give me your reason and decision." + ) + + to_seer_result = ( + "[SEER ONLY] You've checked {agent_name}, and the result is: {role}." + ) + + to_hunter = ( + "[HUNTER ONLY] {name}, as the hunter you're eliminated tonight. You " + "can choose one player to take down with you. Also, you can choose " + "not to use this ability. Give me your reason and decision." + ) + + to_all_hunter_shoot = ( + "The hunter has chosen to shoot {} down with him/herself." + ) + + to_all_day = ( + "The day is coming, all players open your eyes. Last night, " + "the following player(s) has been eliminated: {}." + ) + + to_all_peace = ( + "The day is coming, all the players open your eyes. Last night is " + "peaceful, no player is eliminated." + ) + + to_all_discuss = ( + "Now the alive players are {names}. The game goes on, it's time to " + "discuss and vote a player to be eliminated. Now you each take turns " + "to speak once in the order of {names}." + ) + + to_all_vote = ( + "Now the discussion is over. Everyone, please vote to eliminate one " + "player from the alive players: {}." + ) + + to_all_res = "The voting result is {}. So {} has been voted out." + + to_all_wolf_win = ( + "There are {n_alive} players alive, and {n_werewolves} of them are " + "werewolves. " + "The game is over and werewolves win🐺🎉!" + "In this game, the true roles of all players are: {true_roles}" + ) + + to_all_village_win = ( + "All the werewolves have been eliminated." + "The game is over and villagers win🏘️🎉!" + "In this game, the true roles of all players are: {true_roles}" + ) + + to_all_continue = "The game goes on." + + to_all_reflect = ( + "The game is over. Now each player can reflect on their performance. " + "Note each player only has one chance to speak and the reflection is " + "only visible to themselves." + ) + + +class ChinesePrompts: + """Chinese prompts used to guide the werewolf game.""" + + to_dead_player = "{}, 你已被淘汰。现在你可以向所有存活玩家发表最后的遗言。" + + to_all_new_game = "新的一局游戏开始,参与玩家包括:{}。现在为每位玩家重新随机分配身份,并私下告知各自身份。" + + to_all_night = "天黑了,请所有人闭眼。狼人请睁眼,选择今晚要淘汰的一名玩家..." + + to_wolves_discussion = ( + "[仅狼人可见] {}, 你们可以讨论并决定今晚要淘汰的玩家。当前存活玩家有:{}。" + "如果达成一致,请将 `reach_agreement` 设为 True。" + ) + + to_wolves_vote = "[仅狼人可见] 你投票要杀死哪位玩家?" + + to_wolves_res = "[仅狼人可见] 投票结果为 {},你们选择淘汰 {}。" + + to_all_witch_turn = "轮到女巫行动,女巫请睁眼并决定今晚的操作..." + to_witch_resurrect = ( + "[仅女巫可见] {witch_name},你是女巫,今晚{dead_name}被淘汰。" + "你可以用解药救他/她,注意解药全局只能用一次。你要救{dead_name}吗?" + "请给出理由和决定。" + ) + + to_witch_resurrect_no = "[仅女巫可见] 女巫选择不救该玩家。" + to_witch_resurrect_yes = "[仅女巫可见] 女巫选择救活该玩家。" + + to_witch_poison = "[仅女巫可见] {witch_name},你有一瓶一次性毒药,今晚要使用吗?请给出理由和决定。" + + to_all_seer_turn = "轮到预言家行动,预言家请睁眼并查验一名玩家身份..." + + to_seer = "[仅预言家可见] {}, 你是预言家,今晚可以查验一名玩家身份。你要查谁?请给出理由和决定。" + + to_seer_result = "[仅预言家可见] 你查验了{agent_name},结果是:{role}。" + + to_hunter = "[仅猎人可见] {name},你是猎人,今晚被淘汰。你可以选择带走一名玩家,也可以选择不带走。请给出理由和决定。" + + to_all_hunter_shoot = "猎人选择带走 {} 一起出局。" + + to_all_day = "天亮了,请所有玩家睁眼。昨晚被淘汰的玩家有:{}。" + + to_all_peace = "天亮了,请所有玩家睁眼。昨晚平安夜,无人被淘汰。" + + to_all_discuss = "现在存活玩家有:{names}。游戏继续,大家开始讨论并投票淘汰一名玩家。请按顺序({names})依次发言。" + + to_all_vote = "讨论结束。请大家从存活玩家中投票淘汰一人:{}。" + + to_all_res = "投票结果为 {},{} 被淘汰。" + + to_all_wolf_win = ( + "当前存活玩家共{n_alive}人,其中{n_werewolves}人为狼人。" + "游戏结束,狼人获胜🐺🎉!" + "本局所有玩家真实身份为:{true_roles}" + ) + + to_all_village_win = "所有狼人已被淘汰。游戏结束,村民获胜🏘️🎉!本局所有玩家真实身份为:{true_roles}" + + to_all_continue = "游戏继续。" + + to_all_reflect = "游戏结束。现在每位玩家可以对自己的表现进行反思。注意每位玩家只有一次发言机会,且反思内容仅自己可见。" \ No newline at end of file diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py new file mode 100644 index 00000000..c28947ec --- /dev/null +++ b/tutorial/werewolves/start.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# flake8: noqa: E501 +"""The main entry point for the werewolf game.""" +import asyncio +import os +import numpy as np +import dotenv; dotenv.load_dotenv() +from tutorial.werewolves.game import werewolves_game +from agentscope.agent import ReActAgent +from agentscope.formatter import DashScopeMultiAgentFormatter +from agentscope.model import DashScopeChatModel +from agentscope.session import JSONSession +from astune.workflow_controller.agentscope_flow import ASTuneProxy +from agentscope.message import Msg +from pydantic import BaseModel, Field +from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol + +def get_official_agents(name: str, role: str, train_which_role: str, astune_proxy: ASTuneProxy) -> ReActAgent: + """Get the official werewolves game agents.""" + agent = ReActAgent( + name=name, + sys_prompt=f"""You're a werewolf game player named {name}. + +# YOUR TARGET +Your target is to win the game with your teammates as much as possible. + +# GAME RULES +- In werewolf game, players are divided into three werewolves, three villagers, one seer, one hunter and one witch. + - Werewolves: kill one player each night, and must hide identity during the day. + - Villagers: ordinary players without special abilities, try to identify and eliminate werewolves. + - Seer: A special villager who can check one player's identity each night. + - Witch: A special villager with two one-time-use potions: a healing potion to save a player from being killed at night, and a poison to eliminate one player at night. + - Hunter: A special villager who can take one player down with them when they are eliminated. +- The game alternates between night and day phases until one side wins: + - Night Phase + - Werewolves choose one victim + - Seer checks one player's identity + - Witch decides whether to use potions + - Moderator announces who died during the night + - Day Phase + - All players discuss and vote to eliminate one suspected player + +# GAME GUIDANCE +- Try your best to win the game with your teammates, tricks, lies, and deception are all allowed, e.g. pretending to be a different role. +- During discussion, don't be political, be direct and to the point. +- The day phase voting provides important clues. For example, the werewolves may vote together, attack the seer, etc. +## GAME GUIDANCE FOR WEREWOLF +- Seer is your greatest threat, who can check one player's identity each night. Analyze players' speeches, find out the seer and eliminate him/her will greatly increase your chances of winning. +- In the first night, making random choices is common for werewolves since no information is available. +- Pretending to be other roles (seer, witch or villager) is a common strategy to hide your identity and mislead other villagers in the day phase. +- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. +## GAME GUIDANCE FOR SEER +- Seer is very important to villagers, exposing yourself too early may lead to being targeted by werewolves. +- Your ability to check one player's identity is crucial. +- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. +## GAME GUIDANCE FOR WITCH +- Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected werewolves. +- The outcome of the night phase provides important clues. For example, if the dead player is hunter, etc. Use this information to adjust your strategy. +## GAME GUIDANCE FOR HUNTER +- Using your ability in day phase will expose your role (since only hunter can take one player down) +- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, etc. Use this information to adjust your strategy. +## GAME GUIDANCE FOR VILLAGER +- Protecting special villagers, especially the seer, is crucial for your team's success. +- Werewolves may pretend to be the seer. Be cautious and don't trust anyone easily. +- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + +# NOTE +- [IMPORTANT] DO NOT make up any information that is not provided by the moderator or other players. +- This is a TEXT-based game, so DO NOT use or make up any non-textual information. +- Always critically reflect on whether your evidence exist, and avoid making assumptions. +- Your response should be specific and concise, provide clear reason and avoid unnecessary elaboration. +- Generate your one-line response by using the `generate_response` function. +- Don't repeat the others' speeches.""", + model=DashScopeChatModel( + api_key=os.environ.get("DASHSCOPE_API_KEY"), + model_name="qwen3-max", + ) if role != train_which_role else astune_proxy, # type: ignore + formatter=DashScopeMultiAgentFormatter(), + ) + return agent + + +async def main() -> None: + """The main entry point for the werewolf game.""" + + # Uncomment the following lines if you want to use Agentscope Studio + # to visualize the game process. + # import agentscope + # agentscope.init( + # studio_url="http://localhost:3000", + # project="werewolf_game", + # ) + + # Prepare 9 players, you can change their names here + players = [get_official_agents(f"Player{_ + 1}") for _ in range(9)] + + # Note: You can replace your own agents here, or use all your own agents + + # Load states from a previous checkpoint + session = JSONSession(save_dir="./checkpoints") + await session.load_session_state( + session_id="players_checkpoint", + **{player.name: player for player in players}, + ) + + await werewolves_game(players) + + # Save the states to a checkpoint + await session.save_session_state( + session_id="players_checkpoint", + **{player.name: player for player in players}, + ) + + +class ExampleWerewolves(AgentScopeLearnProtocol): + + trainer: str = Field(default="astune-trinity") + + async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config) -> ASTuneProxy: + + train_which_role = "witch" + + roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] + + # Set random seed for reproducibility + task_core_arg = astune_proxy.get_agentscope_input_dictionary()[task_core_arg] + task_id = task_core_arg.task.task_id + + np.random.seed(int(task_id)) + np.random.shuffle(roles) + + players = [get_official_agents(f"Player{x + 1}", roles[x], train_which_role, astune_proxy) for x in range(9)] + + good_guy_win = await werewolves_game(players, roles) + raw_reward = 1 if (good_guy_win and train_which_role != "werewolf") or (not good_guy_win and train_which_role == "werewolf") else 0 + astune_proxy.update_judge_input_dictionary(raw_reward = raw_reward) + astune_proxy.update_judge_input_dictionary(is_success = (raw_reward == 1)) + return astune_proxy diff --git a/tutorial/werewolves/structured_model.py b/tutorial/werewolves/structured_model.py new file mode 100644 index 00000000..2e161cca --- /dev/null +++ b/tutorial/werewolves/structured_model.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +"""The structured output models used in the werewolf game.""" +from typing import Literal + +from pydantic import BaseModel, Field +from agentscope.agent import AgentBase + + +class DiscussionModel(BaseModel): + """The output format for discussion.""" + + reach_agreement: bool = Field( + description="Whether you have reached an agreement or not", + ) + + +def get_vote_model(agents: list[AgentBase]) -> type[BaseModel]: + """Get the vote model by player names.""" + + class VoteModel(BaseModel): + """The vote output format.""" + + vote: Literal[tuple(_.name for _ in agents)] = Field( # type: ignore + description="The name of the player you want to vote for", + ) + + return VoteModel + + +class WitchResurrectModel(BaseModel): + """The output format for witch resurrect action.""" + + resurrect: bool = Field( + description="Whether you want to resurrect the player", + ) + + +def get_poison_model(agents: list[AgentBase]) -> type[BaseModel]: + """Get the poison model by player names.""" + + class WitchPoisonModel(BaseModel): + """The output format for witch poison action.""" + + poison: bool = Field( + description="Do you want to use the poison potion", + ) + name: Literal[ # type: ignore + tuple(_.name for _ in agents) + ] | None = Field( + description="The name of the player you want to poison, if you " + "don't want to poison anyone, just leave it empty", + default=None, + ) + + return WitchPoisonModel + + +def get_seer_model(agents: list[AgentBase]) -> type[BaseModel]: + """Get the seer model by player names.""" + + class SeerModel(BaseModel): + """The output format for seer action.""" + + name: Literal[tuple(_.name for _ in agents)] = Field( # type: ignore + description="The name of the player you want to check", + ) + + return SeerModel + + +def get_hunter_model(agents: list[AgentBase]) -> type[BaseModel]: + """Get the hunter model by player agents.""" + + class HunterModel(BaseModel): + """The output format for hunter action.""" + + shoot: bool = Field( + description="Whether you want to use the shooting ability or not", + ) + name: Literal[ # type: ignore + tuple(_.name for _ in agents) + ] | None = Field( + description="The name of the player you want to shoot, if you " + "don't want to the ability, just leave it empty", + default=None, + ) + + return HunterModel \ No newline at end of file diff --git a/tutorial/werewolves/utils.py b/tutorial/werewolves/utils.py new file mode 100644 index 00000000..ed89ee7b --- /dev/null +++ b/tutorial/werewolves/utils.py @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- +"""Utility functions for the werewolf game.""" +from collections import defaultdict +from typing import Any + +import numpy as np + +from tutorial.werewolves.prompt import EnglishPrompts as Prompts + +from agentscope.message import Msg +from agentscope.agent import ReActAgent, AgentBase + +# MAX_GAME_ROUND = 30 +# MAX_DISCUSSION_ROUND = 3 +MAX_GAME_ROUND = 10 +MAX_DISCUSSION_ROUND = 2 + + +def majority_vote(votes: list[str]) -> tuple: + """Return the vote with the most counts.""" + result = max(set(votes), key=votes.count) + names, counts = np.unique(votes, return_counts=True) + conditions = ", ".join( + [f"{name}: {count}" for name, count in zip(names, counts)], + ) + return result, conditions + + +def names_to_str(agents: list[str] | list[ReActAgent]) -> str: + """Return a string of agent names.""" + if not agents: + return "" + + if len(agents) == 1: + if isinstance(agents[0], ReActAgent): + return agents[0].name + return agents[0] + + names = [] + for agent in agents: + if isinstance(agent, ReActAgent): + names.append(agent.name) + else: + names.append(agent) + return ", ".join([*names[:-1], "and " + names[-1]]) + + +class EchoAgent(AgentBase): + """Echo agent that repeats the input message.""" + + def __init__(self) -> None: + super().__init__() + self.name = "Moderator" + + async def reply(self, content: str) -> Msg: + """Repeat the input content with its name and role.""" + msg = Msg( + self.name, + content, + role="assistant", + ) + await self.print(msg) + return msg + + async def handle_interrupt( + self, + *args: Any, + **kwargs: Any, + ) -> Msg: + """Handle interrupt.""" + + async def observe(self, msg: Msg | list[Msg] | None) -> None: + """Observe the user's message.""" + + +class Players: + """Maintain the players' status.""" + + def __init__(self) -> None: + """Initialize the players.""" + # The mapping from player name to role + self.name_to_role = {} + self.role_to_names = defaultdict(list) + self.name_to_agent = {} + self.werewolves = [] + self.villagers = [] + self.seer = [] + self.hunter = [] + self.witch = [] + self.current_alive = [] + self.all_players = [] + + def add_player(self, player: ReActAgent, role: str) -> None: + """Add a player to the game. + + Args: + player (`ReActAgent`): + The player to be added. + role (`str`): + The role of the player. + """ + self.name_to_role[player.name] = role + self.name_to_agent[player.name] = player + self.role_to_names[role].append(player.name) + self.all_players.append(player) + if role == "werewolf": + self.werewolves.append(player) + elif role == "villager": + self.villagers.append(player) + elif role == "seer": + self.seer.append(player) + elif role == "hunter": + self.hunter.append(player) + elif role == "witch": + self.witch.append(player) + else: + raise ValueError(f"Unknown role: {role}") + self.current_alive.append(player) + + def update_players(self, dead_players: list[ReActAgent]) -> None: + """Update the current alive players. + + Args: + dead_players (`list[ReActAgent]`): + A list of dead players to be removed. + """ + self.werewolves = [ + _ for _ in self.werewolves if _.name not in dead_players + ] + self.villagers = [ + _ for _ in self.villagers if _.name not in dead_players + ] + self.seer = [_ for _ in self.seer if _.name not in dead_players] + self.hunter = [_ for _ in self.hunter if _.name not in dead_players] + self.witch = [_ for _ in self.witch if _.name not in dead_players] + self.current_alive = [ + _ for _ in self.current_alive if _.name not in dead_players + ] + + def print_roles(self) -> None: + """Print the roles of all players.""" + print("Roles:") + for name, role in self.name_to_role.items(): + print(f" - {name}: {role}") + + def check_winning(self) -> str | None: + """Check if the game is over and return the winning message.""" + + # Prepare true roles string + true_roles = ( + f'{names_to_str(self.role_to_names["werewolf"])} are werewolves, ' + f'{names_to_str(self.role_to_names["villager"])} are villagers, ' + f'{names_to_str(self.role_to_names["seer"])} is the seer, ' + f'{names_to_str(self.role_to_names["hunter"])} is the hunter, ' + f'and {names_to_str(self.role_to_names["witch"])} is the witch.' + ) + + if len(self.werewolves) * 2 >= len(self.current_alive): + return Prompts.to_all_wolf_win.format( + n_alive=len(self.current_alive), + n_werewolves=len(self.werewolves), + true_roles=true_roles, + ) + if self.current_alive and not self.werewolves: + return Prompts.to_all_village_win.format( + true_roles=true_roles, + ) + return None \ No newline at end of file diff --git a/tutorial/werewolves/werewolves.md b/tutorial/werewolves/werewolves.md new file mode 100644 index 00000000..f4b6af4c --- /dev/null +++ b/tutorial/werewolves/werewolves.md @@ -0,0 +1,115 @@ +## 运行 WereWolves AgentScope Agent + + +### 1. 准备 AgentScope Workflow + +详细请见 `tutorial/werewolves/start.py`。可以在项目任意地方新建新的 AgentScope Workflow 代码 + +- 定义 AgentScope 的工作流 (把agent的model修改为`astune_proxy`) + ```python + class ExampleWerewolves(AgentScopeLearnProtocol): + trainer: str = Field(default="astune-trinity") + async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config) -> ASTuneProxy: + + train_which_role = "witch" + roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] + + # Set random seed for reproducibility + task_core_arg = astune_proxy.get_agentscope_input_dictionary()[task_core_arg] + task_id = task_core_arg.task.task_id + + np.random.seed(int(task_id)) + np.random.shuffle(roles) + + players = [get_official_agents(f"Player{x + 1}", roles[x], train_which_role, astune_proxy) for x in range(9)] + + good_guy_win = await werewolves_game(players, roles) + raw_reward = 1 if (good_guy_win and train_which_role != "werewolf") or (not good_guy_win and train_which_role == "werewolf") else 0 + astune_proxy.update_judge_input_dictionary(raw_reward = raw_reward) + astune_proxy.update_judge_input_dictionary(is_success = (raw_reward == 1)) + return astune_proxy + + ``` + + +### 2. 测试 + + +- 复制并修改 [launcher/werewolves_agent/git-rpg-agentscope.yaml](../launcher/werewolves_agent/git-rpg-agentscope.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 + ```yaml + astune: + task_reader: + type: random_dummy # `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` + task_judge: + # 编写并选择评价函数 + judge_protocol: null + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + rollout: + agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolvesLearn # ✨✨✨✨ 编写并选择Agent + ``` + + +- 全链路调试(脱离ray快速调试:--backbone='debug') + ```bash + # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) + python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf launcher/werewolves_agent/git-rpg-agentscope.yaml --backbone='debug' --with-logview + + ``` + 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: + ```json + { + + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "program": "launcher.py", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "launcher/werewolves_agent/git-rpg-agentscope.yaml" + ], + "env": { + } + }, + ] + } + ``` + + +- 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') + ```bash + # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) + python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' + ``` + + +### 3. 读取Rollout日志 + +
+ 日志界面 +
+ +- 找到日志文件夹,默认在 `./launcher_record/exp_yaml_file_name/*` 下面 +- 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 +```bash +root@xxxx:/xxx/xxx/xxx# beast_logger_go +INFO: Started server process [74493] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) +``` +- 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 + - /mnt/data/qingxu.fu/astune/astune/launcher_record + - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name + - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + +- 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 + +- 蓝色 Token 代表参与loss计算的 Token,黄色反之 + +- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) \ No newline at end of file diff --git a/vllm b/vllm deleted file mode 160000 index c7991269..00000000 --- a/vllm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c7991269dd8fe86096a3eee5040e855801ae9665 From 29785f697fcc85445aeb37884de02ec390a0a7ca Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 14 Nov 2025 01:37:13 +0800 Subject: [PATCH 033/462] add werewolves --- tutorial/werewolves/game.py | 15 ++++++++------- tutorial/werewolves/start.py | 4 +++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/tutorial/werewolves/game.py b/tutorial/werewolves/game.py index 5599b88b..dfbf2d9b 100644 --- a/tutorial/werewolves/game.py +++ b/tutorial/werewolves/game.py @@ -23,7 +23,7 @@ # Uncomment the following line to use Chinese prompts from tutorial.werewolves.prompt import ChinesePrompts as Prompts - +from loguru import logger from agentscope.agent import ReActAgent from agentscope.pipeline import ( @@ -340,12 +340,13 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # The day ends first_day = False - # Game over, each player reflects - await fanout_pipeline( - agents=agents, - msg=await moderator(Prompts.to_all_reflect), - ) + # # Game over, each player reflects + # await fanout_pipeline( + # agents=agents, + # msg=await moderator(Prompts.to_all_reflect), + # ) - alive_wolves = len( [p for p in players.current_alive if p.role == "werewolf"] ) + alive_wolves = players.werewolves good_guy_win = (alive_wolves == 0) + logger.warning(f"Good guy win: {good_guy_win}") return good_guy_win \ No newline at end of file diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index c28947ec..ff5429d1 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -4,6 +4,7 @@ import asyncio import os import numpy as np +from loguru import logger import dotenv; dotenv.load_dotenv() from tutorial.werewolves.game import werewolves_game from agentscope.agent import ReActAgent @@ -123,7 +124,7 @@ async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, con roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] # Set random seed for reproducibility - task_core_arg = astune_proxy.get_agentscope_input_dictionary()[task_core_arg] + task_core_arg = astune_proxy.get_agentscope_input_dictionary()["task_core_arg"] task_id = task_core_arg.task.task_id np.random.seed(int(task_id)) @@ -133,6 +134,7 @@ async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, con good_guy_win = await werewolves_game(players, roles) raw_reward = 1 if (good_guy_win and train_which_role != "werewolf") or (not good_guy_win and train_which_role == "werewolf") else 0 + logger.warning(f"Raw reward: {raw_reward}") astune_proxy.update_judge_input_dictionary(raw_reward = raw_reward) astune_proxy.update_judge_input_dictionary(is_success = (raw_reward == 1)) return astune_proxy From b6b53bc19d2392ac5f5bae38b5dbead97479a3d9 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 14 Nov 2025 02:23:59 +0800 Subject: [PATCH 034/462] werewolves adjust config --- .../config_auto_convertion_trinity.json | 3 +- astune/parallel_env.py | 2 +- astune/utils/robust_dashscope.py | 102 ++++++++++++++++++ .../werewolves_agent/git-rpg-agentscope.yaml | 47 ++++++++ tutorial/werewolves/game.py | 5 +- tutorial/werewolves/start.py | 7 +- 6 files changed, 160 insertions(+), 6 deletions(-) create mode 100644 astune/utils/robust_dashscope.py create mode 100644 launcher/werewolves_agent/git-rpg-agentscope.yaml diff --git a/astune/default_config/trinity/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json index 231accd6..2cd00e2f 100644 --- a/astune/default_config/trinity/config_auto_convertion_trinity.json +++ b/astune/default_config/trinity/config_auto_convertion_trinity.json @@ -1,5 +1,6 @@ { "astune.model.path": "model.model_path", "astune.project_name": "project", - "astune.experiment_name": "name" + "astune.experiment_name": "name", + "astune.rollout.num_repeat": "algorithm,repeat_times" } \ No newline at end of file diff --git a/astune/parallel_env.py b/astune/parallel_env.py index 82b23cba..f6c98977 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -188,7 +188,7 @@ def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, m Collected trajectory container for this rollout. """ def get_sample_params(): - response_length_eps = 6 # Reserve a few tokens for later handling of special tokens like lm_start. + response_length_eps = 16 # Reserve a few tokens for later handling of special tokens like lm_start. if self.config.astune.rollout.name == 'vllm': sampling_params = dict( n=1, diff --git a/astune/utils/robust_dashscope.py b/astune/utils/robust_dashscope.py new file mode 100644 index 00000000..53d4bda6 --- /dev/null +++ b/astune/utils/robust_dashscope.py @@ -0,0 +1,102 @@ +import random +import time +import os +import asyncio +from textwrap import dedent +from loguru import logger +from agentscope.model import DashScopeChatModel + +class RobustDashScopeChatModel(DashScopeChatModel): + """ + A robust version of DashScopeChatModel that includes retry logic and multiple API key handling. + This class extends the DashScopeChatModel from agentscope and adds: + 1. Support for multiple API keys separated by '|' in environment variables + 2. Automatic retry logic with backup API keys + 3. Error handling with appropriate logging + """ + + def __init__( + self, + model_name="qwen3-max", + stream=False, + max_try=4, + **kwargs + ): + # Check for environment variables + self._check_env_variables() + + # Parse API keys from environment variables + self.regular_key_list = os.environ.get("DASHSCOPE_API_KEY", "").split("|") + self.backup_key_list = os.environ.get("DASHSCOPE_API_KEY_BACKUP", "").split("|") if os.environ.get("DASHSCOPE_API_KEY_BACKUP") else [] + + api_key = random.choice(self.regular_key_list) + + # Store retry parameters + self.max_try = max_try + + # Initialize the parent class + super().__init__( + api_key=api_key, + model_name=model_name, + stream=stream, + **kwargs + ) + + def _check_env_variables(self): + """Check if required environment variables are set.""" + if os.environ.get("DASHSCOPE_API_KEY") is None: + raise RuntimeError(dedent(""" + Please set the DASHSCOPE_API_KEY environment variable. + You can get the API keys from https://www.dashscope.com/. + Example: + export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' + export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' (optional) + """)) + + async def __call__(self, messages, tools=None, tool_choice=None, structured_model=None, **kwargs): + """ + Override the __call__ method to add retry logic and API key rotation. + + Args: + messages: The messages to send to the model + tools: Optional list of tools + tool_choice: Optional tool choice + structured_model: Optional structured model + **kwargs: Additional arguments to pass to the API + + Returns: + The response from the model + + Raises: + RuntimeError: If all retry attempts fail + """ + for n_try in range(self.max_try): + try: + # Select API key based on retry attempt + if n_try < self.max_try // 2: + # For first half of attempts, use regular keys + self.api_key = random.choice(self.regular_key_list) + elif n_try == self.max_try // 2 and self.backup_key_list: + # At middle attempt, try backup key if available + self.api_key = random.choice(self.backup_key_list) + else: + # For remaining attempts, use any available key + self.api_key = random.choice(self.regular_key_list + self.backup_key_list) + + # Call the parent class's __call__ method + response = await super().__call__( + messages=messages, + tools=tools, + tool_choice=tool_choice, + structured_model=structured_model, + **kwargs + ) + return response + + except Exception as e: + logger.bind(exception=True).exception(f"Error calling DashScope API: {e}") + time.sleep(5) # Wait before retrying + print(f"Error calling DashScope API: {e}, retrying ({n_try + 1}/{self.max_try})...") + + # If all attempts fail + raise RuntimeError(f"Failed to get response from DashScope API after {self.max_try} attempts") diff --git a/launcher/werewolves_agent/git-rpg-agentscope.yaml b/launcher/werewolves_agent/git-rpg-agentscope.yaml new file mode 100644 index 00000000..722f90dc --- /dev/null +++ b/launcher/werewolves_agent/git-rpg-agentscope.yaml @@ -0,0 +1,47 @@ +# ------------------ 主要配置 ------------------ +astune: + task_reader: + type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` + + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: null + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent + num_repeat: 1 + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + + data: + max_prompt_length: 15000 + max_response_length: 3000 + train_batch_size: 32 + +# trinity: +# algorithm: +# repeat_times: 6 +# buffer: +# train_batch_size: 42 + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ diff --git a/tutorial/werewolves/game.py b/tutorial/werewolves/game.py index dfbf2d9b..1a3d1519 100644 --- a/tutorial/werewolves/game.py +++ b/tutorial/werewolves/game.py @@ -347,6 +347,7 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # ) alive_wolves = players.werewolves - good_guy_win = (alive_wolves == 0) - logger.warning(f"Good guy win: {good_guy_win}") + good_guy_win = (len(alive_wolves) == 0) + logger.warning(f"**********************************") + logger.warning(f"Good guy win: {good_guy_win}, alive werewolves: {alive_wolves}") return good_guy_win \ No newline at end of file diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index ff5429d1..b006d257 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -15,6 +15,8 @@ from agentscope.message import Msg from pydantic import BaseModel, Field from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol +# astune/utils/robust_dashscope.py +from astune.utils.robust_dashscope import RobustDashScopeChatModel def get_official_agents(name: str, role: str, train_which_role: str, astune_proxy: ASTuneProxy) -> ReActAgent: """Get the official werewolves game agents.""" @@ -72,9 +74,10 @@ def get_official_agents(name: str, role: str, train_which_role: str, astune_prox - Your response should be specific and concise, provide clear reason and avoid unnecessary elaboration. - Generate your one-line response by using the `generate_response` function. - Don't repeat the others' speeches.""", - model=DashScopeChatModel( - api_key=os.environ.get("DASHSCOPE_API_KEY"), + model=RobustDashScopeChatModel( model_name="qwen3-max", + max_try=4, + stream=False ) if role != train_which_role else astune_proxy, # type: ignore formatter=DashScopeMultiAgentFormatter(), ) From bbcf61f37d1eea9c03ef7a5267790aae58cab1f8 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 14 Nov 2025 02:43:01 +0800 Subject: [PATCH 035/462] Refactor and enhance configuration for Werewolves agent, update experience handling, and improve sample removal logic in parallel environment. --- astune/backbone_trinity/register_flow.py | 6 +-- astune/default_config/astune_default.yaml | 1 + .../config_auto_convertion_trinity.json | 2 +- astune/parallel_env.py | 19 ++++---- astune/task_reader/__init__.py | 2 +- astune/task_reader/env_service_reader.py | 2 +- astune/task_reader/hf_dataset_reader.py | 2 +- astune/task_reader/jsonl_reader.py | 2 +- launcher.py | 11 +++-- .../werewolves_agent/git-rpg-agentscope.yaml | 14 +++--- tutorial/werewolves/werewolves.md | 3 +- tutorial/werewolves/werewolves.yaml | 47 +++++++++++++++++++ 12 files changed, 81 insertions(+), 30 deletions(-) create mode 100644 tutorial/werewolves/werewolves.yaml diff --git a/astune/backbone_trinity/register_flow.py b/astune/backbone_trinity/register_flow.py index a32da476..f220c2c7 100644 --- a/astune/backbone_trinity/register_flow.py +++ b/astune/backbone_trinity/register_flow.py @@ -186,7 +186,8 @@ async def run_async(self): if not isinstance(reward, (float, int)): # if reward is still not a float or int, set it to 0.0 reward = cmt.reward_structure.raw_reward - if len(response_ids) + len(prompt_ids) == len(input_ids) and len(logprobs) == len(response_ids) and len(logprobs) > 0: + if len(response_ids) + len(prompt_ids) == len(input_ids) and \ + len(logprobs) == len(response_ids) and len(logprobs) > 0: exp = Experience( # eid=uuid.uuid4().hex, tokens = input_ids, # [seq_length] prompt + response @@ -213,6 +214,5 @@ async def run_async(self): ) exps += [exp] else: - from vsdb import bp - bp("BUGX") + logger.exception(f"Data length mismatch when converting sample to experience.") return exps diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 44224073..9ce3ee7b 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -2,6 +2,7 @@ astune: project_name: appworld_astune experiment_name: "read_yaml_name" + backbone: debug # debug or trinity or verl task_reader: type: env_service # `env_service` or `dataset_file` or `huggingface_dat_repo` diff --git a/astune/default_config/trinity/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json index 2cd00e2f..934b58a4 100644 --- a/astune/default_config/trinity/config_auto_convertion_trinity.json +++ b/astune/default_config/trinity/config_auto_convertion_trinity.json @@ -2,5 +2,5 @@ "astune.model.path": "model.model_path", "astune.project_name": "project", "astune.experiment_name": "name", - "astune.rollout.num_repeat": "algorithm,repeat_times" + "astune.rollout.num_repeat": "algorithm.repeat_times" } \ No newline at end of file diff --git a/astune/parallel_env.py b/astune/parallel_env.py index f6c98977..fe431972 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -638,15 +638,16 @@ def trajectories_to_samples(self, cmt_array: List[CMTLinear]) -> List[Sample]: sample_arr_final += sample_arr # Step 2: Calculate how many samples need to be removed - world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes - remainder = len(sample_arr_final) % world_size - if remainder != 0: - import random - remove_indices = random.sample(range(len(sample_arr_final)), remainder) - # Sort in reverse order to avoid index shifting during removal - remove_indices.sort(reverse=True) - for idx in remove_indices: - sample_arr_final.pop(idx) + if self.config.astune.backbone in ['verl']: + world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes + remainder = len(sample_arr_final) % world_size + if remainder != 0: + import random + remove_indices = random.sample(range(len(sample_arr_final)), remainder) + # Sort in reverse order to avoid index shifting during removal + remove_indices.sort(reverse=True) + for idx in remove_indices: + sample_arr_final.pop(idx) # random remove some samples, so that the number of samples is divisible by 8 return sample_arr_final diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index a0d036fb..2f28d08a 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -11,7 +11,7 @@ from astune.task_reader.env_service_reader import TaskReaderEnvService from astune.task_reader.hf_dataset_reader import TaskReaderHuggingFace from astune.task_reader.jsonl_reader import TaskReaderJsonl -from astune.task_reader.task_reader_base import TaskReaderBase +from astune.task_reader import TaskReaderBase class RandomDummyGenerator(TaskReaderBase): diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index d9a0eb85..0f8cb49d 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -6,7 +6,7 @@ from astune.schema.task import Task from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient -from astune.task_reader.task_reader_base import TaskReaderBase +from astune.task_reader import TaskReaderBase class TaskReaderEnvService(TaskReaderBase): diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py index a6634549..5d9cbb57 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astune/task_reader/hf_dataset_reader.py @@ -6,7 +6,7 @@ from astune.schema.task import Task from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient -from astune.task_reader.task_reader_base import TaskReaderBase +from astune.task_reader import TaskReaderBase class TaskReaderHuggingFace(TaskReaderBase): diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index 149c5058..8bafaf44 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -6,7 +6,7 @@ from astune.schema.task import Task from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient -from astune.task_reader.task_reader_base import TaskReaderBase +from astune.task_reader import TaskReaderBase diff --git a/launcher.py b/launcher.py index 16ade833..85601a53 100644 --- a/launcher.py +++ b/launcher.py @@ -183,6 +183,7 @@ def prepare_experiment_config(yaml_path, args): with open(yaml_path, 'r') as file: config = yaml.safe_load(file) config['astune']['experiment_name'] = exp_name + config['astune']['backbone'] = args.backbone # remove extra config of verl for trinity if args.backbone == "debug": @@ -402,7 +403,7 @@ def main(): # Initialize variables with default values to avoid "possibly unbound" errors backbone_target = "astune.main_trinity" # Default to trinity - yaml_backup_dst = None + main_yaml_fp = None exe_exp_base = None exe_yaml_path = None exp_name = None @@ -418,7 +419,7 @@ def main(): exp_config = None if args.conf: yaml_path = args.conf - yaml_backup_dst, exe_exp_base, exe_yaml_path, exp_name, exp_config = prepare_experiment_config(yaml_path, args) + main_yaml_fp, exe_exp_base, exe_yaml_path, exp_name, exp_config = prepare_experiment_config(yaml_path, args) if args.db: env["RAY_DEBUG_POST_MORTEM"] = "1" @@ -429,7 +430,7 @@ def main(): logger.warning("Debug mode is OFF") if args.backbone == "trinity": - env['ASTUNE_CONFIG_REDIRECT'] = yaml_backup_dst # type: ignore + env['ASTUNE_CONFIG_REDIRECT'] = main_yaml_fp # type: ignore if args.backbone == "debug": env['ASTUNE_DEBUG'] = '1' # type: ignore @@ -454,8 +455,8 @@ def main(): if args.with_logview: launch_logview(exp_name) - if args.conf and yaml_backup_dst and exe_exp_base and exe_yaml_path: - execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_base, exe_yaml_path, env, exp_config) + if args.conf and main_yaml_fp and exe_exp_base and exe_yaml_path: + execute_training_process(args, backbone_target, main_yaml_fp, exe_exp_base, exe_yaml_path, env, exp_config) if __name__ == "__main__": check_debugpy_version() diff --git a/launcher/werewolves_agent/git-rpg-agentscope.yaml b/launcher/werewolves_agent/git-rpg-agentscope.yaml index 722f90dc..5787a9f3 100644 --- a/launcher/werewolves_agent/git-rpg-agentscope.yaml +++ b/launcher/werewolves_agent/git-rpg-agentscope.yaml @@ -13,22 +13,22 @@ astune: rollout: agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 1 + num_repeat: 6 + debug: debug_max_parallel: 1 debug_first_n_tasks: 1 - data: max_prompt_length: 15000 max_response_length: 3000 train_batch_size: 32 -# trinity: -# algorithm: -# repeat_times: 6 -# buffer: -# train_batch_size: 42 +trinity: + algorithm: + repeat_times: 6 + buffer: + train_batch_size: 42 # ------------------ 不需要修改 ------------------ hydra: diff --git a/tutorial/werewolves/werewolves.md b/tutorial/werewolves/werewolves.md index f4b6af4c..0cfc133e 100644 --- a/tutorial/werewolves/werewolves.md +++ b/tutorial/werewolves/werewolves.md @@ -84,7 +84,8 @@ - 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) - python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' + python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ + python launcher.py --conf launcher/werewolves_agent/git-rpg-agentscope.yaml --backbone='trinity' --with-ray ``` diff --git a/tutorial/werewolves/werewolves.yaml b/tutorial/werewolves/werewolves.yaml new file mode 100644 index 00000000..5787a9f3 --- /dev/null +++ b/tutorial/werewolves/werewolves.yaml @@ -0,0 +1,47 @@ +# ------------------ 主要配置 ------------------ +astune: + task_reader: + type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` + + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: null + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent + num_repeat: 6 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + data: + max_prompt_length: 15000 + max_response_length: 3000 + train_batch_size: 32 + +trinity: + algorithm: + repeat_times: 6 + buffer: + train_batch_size: 42 + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ From 821831cb15ac5de89f5a2c6e1a1c083102d9e838 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 14 Nov 2025 02:46:35 +0800 Subject: [PATCH 036/462] Refactor import statements to use task_reader_base module in task readers --- astune/task_reader/__init__.py | 2 +- astune/task_reader/env_service_reader.py | 2 +- astune/task_reader/hf_dataset_reader.py | 3 ++- astune/task_reader/jsonl_reader.py | 3 ++- tutorial/math_agent.md | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index 2f28d08a..a0d036fb 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -11,7 +11,7 @@ from astune.task_reader.env_service_reader import TaskReaderEnvService from astune.task_reader.hf_dataset_reader import TaskReaderHuggingFace from astune.task_reader.jsonl_reader import TaskReaderJsonl -from astune.task_reader import TaskReaderBase +from astune.task_reader.task_reader_base import TaskReaderBase class RandomDummyGenerator(TaskReaderBase): diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index 0f8cb49d..d9a0eb85 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -6,7 +6,7 @@ from astune.schema.task import Task from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient -from astune.task_reader import TaskReaderBase +from astune.task_reader.task_reader_base import TaskReaderBase class TaskReaderEnvService(TaskReaderBase): diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py index 5d9cbb57..00d716f9 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astune/task_reader/hf_dataset_reader.py @@ -6,7 +6,8 @@ from astune.schema.task import Task from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient -from astune.task_reader import TaskReaderBase +from astune.task_reader.task_reader_base import TaskReaderBase + class TaskReaderHuggingFace(TaskReaderBase): diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index 8bafaf44..777cd10b 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -6,7 +6,8 @@ from astune.schema.task import Task from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient -from astune.task_reader import TaskReaderBase +from astune.task_reader.task_reader_base import TaskReaderBase + diff --git a/tutorial/math_agent.md b/tutorial/math_agent.md index 60d4fb9d..f09f5b41 100644 --- a/tutorial/math_agent.md +++ b/tutorial/math_agent.md @@ -140,7 +140,7 @@ python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbon 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' +python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' --with-ray ``` From ae2c2aae3e730d311489c167de9e198446de7c59 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 14 Nov 2025 12:15:09 +0800 Subject: [PATCH 037/462] add werewolves --- astune/task_reader/__init__.py | 2 +- tutorial/appworld.md | 10 +++++++++- tutorial/appworld.py | 1 - tutorial/figure/appworld.png | Bin 0 -> 143112 bytes tutorial/math_agent.md | 1 + tutorial/werewolves/start.py | 3 ++- tutorial/werewolves/werewolves.md | 9 ++++++++- 7 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 tutorial/figure/appworld.png diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index a0d036fb..50a92775 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -32,7 +32,7 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: init_messages=[], task_id=str(idx), env_type=f"no_env", - metadata={}, + metadata={'random_number': idx}, ) tasks.append(task) # Restore the original random state diff --git a/tutorial/appworld.md b/tutorial/appworld.md index 842553f2..cf132446 100644 --- a/tutorial/appworld.md +++ b/tutorial/appworld.md @@ -143,4 +143,12 @@ INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) - 蓝色 Token 代表参与loss计算的 Token,黄色反之 -- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) \ No newline at end of file +- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) + + +### 6. 参考训练曲线 + + +
+ 训练曲线 +
diff --git a/tutorial/appworld.py b/tutorial/appworld.py index 686a3091..de536670 100644 --- a/tutorial/appworld.py +++ b/tutorial/appworld.py @@ -22,7 +22,6 @@ async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, con name="Qwen", sys_prompt=first_msg['content'], model=astune_proxy, # type: ignore - # model=astune_proxy: use astune_proxy as model formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), toolkit=None, diff --git a/tutorial/figure/appworld.png b/tutorial/figure/appworld.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ce5e86bddbc1bd6e6221a930f6280d48286584 GIT binary patch literal 143112 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�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%0A-}(&n*0fda%@a}&kW2xyDgIs3B%O~yX|ygVo3 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 + 日志界面 + From a649aeb552d6ac06a2f87b1966b56b1562be6bba Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 14 Nov 2025 12:25:05 +0800 Subject: [PATCH 038/462] stage readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fc4d4383..b3857459 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ Let see: - How to build an Agent specialized at gsm8k math problems, and [how to train it 🚀](tutorial/math_agent.md). - How to build an Appworld agent using AgentScope, and [how to train it 🪐](tutorial/appworld.md). +- How to build a Werewolves RPG agent using AgentScope, and [how to train it 🚀](tutorial/werewolves/werewolves.md) From 0fa609f9467a51d8f7ca3c3057f6f1260e3271fe Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 17 Nov 2025 14:48:35 +0800 Subject: [PATCH 039/462] Update README and YAML configurations; add deploy_model script and enhance werewolves game logic --- README.md | 2 + astune/context_manager/cmt_base_attr.py | 4 +- .../werewolves_agent/git-rpg-agentscope.yaml | 1 + scripts/deploy_model.py | 65 +++++++++ tutorial/werewolves/game.py | 4 +- tutorial/werewolves/start.py | 130 ++++++++++-------- 6 files changed, 143 insertions(+), 63 deletions(-) create mode 100644 scripts/deploy_model.py diff --git a/README.md b/README.md index b3857459..43f605dc 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,13 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j uv venv --python=3.10.16 source .venv/bin/activate git clone https://github.com/binary-husky/Trinity-RFT external/trinity + git clone https://github.com/binary-husky/agentscope external/agentscope # Install dependencies uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps + uv pip install -e external/agentscope -i https://mirrors.aliyun.com/pypi/simple/ # Install flash attention (must be installed at last) uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation diff --git a/astune/context_manager/cmt_base_attr.py b/astune/context_manager/cmt_base_attr.py index f5a217ee..ffecd5b7 100644 --- a/astune/context_manager/cmt_base_attr.py +++ b/astune/context_manager/cmt_base_attr.py @@ -1,6 +1,7 @@ from typing import List, Union, Tuple from transformers.tokenization_utils import PreTrainedTokenizer from astune.schema.trajectory import Reward +from loguru import logger import uuid INVALID_LOG_PROB_VALUE = 0.0 @@ -102,7 +103,8 @@ def content_for_future(self): if self._content_for_future == "": if not self.tool_calls: # from vsdb import bp; bp("H1") - raise ValueError("content_for_future is not set, or previous llm output is empty!") + logger.exception("content_for_future is not set, or previous llm output is empty!") + self._content_for_future return self._content_for_future diff --git a/launcher/werewolves_agent/git-rpg-agentscope.yaml b/launcher/werewolves_agent/git-rpg-agentscope.yaml index 5787a9f3..2d5e9a86 100644 --- a/launcher/werewolves_agent/git-rpg-agentscope.yaml +++ b/launcher/werewolves_agent/git-rpg-agentscope.yaml @@ -14,6 +14,7 @@ astune: rollout: agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent num_repeat: 6 + agent_madness_reward: 0.0 debug: debug_max_parallel: 1 diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py new file mode 100644 index 00000000..574caea2 --- /dev/null +++ b/scripts/deploy_model.py @@ -0,0 +1,65 @@ +import argparse +import torch +import os +import sys +sys.path.append(os.getcwd()) +from astune.utils.smart_daemon import LaunchCommandWhenAbsent + + + +parser = argparse.ArgumentParser(description='deploy Hugging Face model') +parser.add_argument( + '--target', + default='/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507', + type=str, + help='要下载的数据集仓库名称' +) +parser.add_argument( + '--port', + default='2888', + type=str, + help='端口' +) +args = parser.parse_args() + +def companion_launch(): + + print("Launching companion process for async LLM server...") + model_path = args.target + n_avail_gpus = torch.cuda.device_count() + tensor_parallel_size = n_avail_gpus + if tensor_parallel_size > n_avail_gpus: + print(f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}.") + tensor_parallel_size = n_avail_gpus + gpu_memory_utilization = 0.95 + # max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs + # max_model_len = config.astune.rollout.max_model_len + # seed = config.astune.debug.debug_vllm_seed + # vllm_port = config.astune.debug.debug_vllm_port + vllm_port = args.port + companion = LaunchCommandWhenAbsent( + full_argument_list=[ + sys.executable, "-m", + f"vllm.entrypoints.cli.main", + f"serve", f"{model_path}", + f"--tensor-parallel-size", f"{tensor_parallel_size}", + f"--dtype", f"auto", + f"--enforce-eager", + f"--gpu-memory-utilization", f"{gpu_memory_utilization}", + f"--disable-custom-all-reduce", + # f"--max-num-seqs", f"{max_num_seqs}", + # f"--max-model-len", f"{max_model_len}", + f"--load-format", "auto", + f"--enable-chunked-prefill", + f"--enable-auto-tool-choice", + f"--tool-call-parser", "hermes", + f"--enable-prefix-caching", + # f"--seed", f"{seed}", + f"--port", f"{vllm_port}", + ], + dir='./', + tag="api_vllm_server", + ) + companion.launch(launch_wait_time=1800, success_std_string="Application startup complete", env_dict={**os.environ}) + +companion_launch() diff --git a/tutorial/werewolves/game.py b/tutorial/werewolves/game.py index 1a3d1519..018acc9d 100644 --- a/tutorial/werewolves/game.py +++ b/tutorial/werewolves/game.py @@ -19,10 +19,10 @@ get_seer_model, get_hunter_model, ) -# from tutorial.werewolves.prompt import EnglishPrompts as Prompts +from tutorial.werewolves.prompt import EnglishPrompts as Prompts # Uncomment the following line to use Chinese prompts -from tutorial.werewolves.prompt import ChinesePrompts as Prompts +# from tutorial.werewolves.prompt import ChinesePrompts as Prompts from loguru import logger from agentscope.agent import ReActAgent diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index b179d551..8546a8a0 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -3,13 +3,14 @@ """The main entry point for the werewolf game.""" import asyncio import os +from textwrap import dedent import numpy as np from loguru import logger import dotenv; dotenv.load_dotenv() from tutorial.werewolves.game import werewolves_game from agentscope.agent import ReActAgent -from agentscope.formatter import DashScopeMultiAgentFormatter -from agentscope.model import DashScopeChatModel +from agentscope.formatter import DashScopeMultiAgentFormatter, OpenAIMultiAgentFormatter +from agentscope.model import DashScopeChatModel, OpenAIChatModel from agentscope.session import JSONSession from astune.workflow_controller.agentscope_flow import ASTuneProxy from agentscope.message import Msg @@ -20,67 +21,76 @@ def get_official_agents(name: str, role: str, train_which_role: str, astune_proxy: ASTuneProxy) -> ReActAgent: """Get the official werewolves game agents.""" + model = OpenAIChatModel( + model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", + api_key="1234", + stream=False, + client_args = { + "base_url": "http://22.16.118.255:2888/v1" + } + ) if role != train_which_role else astune_proxy + formatter = OpenAIMultiAgentFormatter() if role != train_which_role else DashScopeMultiAgentFormatter() agent = ReActAgent( name=name, - sys_prompt=f"""You're a werewolf game player named {name}. - -# YOUR TARGET -Your target is to win the game with your teammates as much as possible. - -# GAME RULES -- In werewolf game, players are divided into three werewolves, three villagers, one seer, one hunter and one witch. - - Werewolves: kill one player each night, and must hide identity during the day. - - Villagers: ordinary players without special abilities, try to identify and eliminate werewolves. - - Seer: A special villager who can check one player's identity each night. - - Witch: A special villager with two one-time-use potions: a healing potion to save a player from being killed at night, and a poison to eliminate one player at night. - - Hunter: A special villager who can take one player down with them when they are eliminated. -- The game alternates between night and day phases until one side wins: - - Night Phase - - Werewolves choose one victim - - Seer checks one player's identity - - Witch decides whether to use potions - - Moderator announces who died during the night - - Day Phase - - All players discuss and vote to eliminate one suspected player - -# GAME GUIDANCE -- Try your best to win the game with your teammates, tricks, lies, and deception are all allowed, e.g. pretending to be a different role. -- During discussion, don't be political, be direct and to the point. -- The day phase voting provides important clues. For example, the werewolves may vote together, attack the seer, etc. -## GAME GUIDANCE FOR WEREWOLF -- Seer is your greatest threat, who can check one player's identity each night. Analyze players' speeches, find out the seer and eliminate him/her will greatly increase your chances of winning. -- In the first night, making random choices is common for werewolves since no information is available. -- Pretending to be other roles (seer, witch or villager) is a common strategy to hide your identity and mislead other villagers in the day phase. -- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. -## GAME GUIDANCE FOR SEER -- Seer is very important to villagers, exposing yourself too early may lead to being targeted by werewolves. -- Your ability to check one player's identity is crucial. -- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. -## GAME GUIDANCE FOR WITCH -- Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected werewolves. -- The outcome of the night phase provides important clues. For example, if the dead player is hunter, etc. Use this information to adjust your strategy. -## GAME GUIDANCE FOR HUNTER -- Using your ability in day phase will expose your role (since only hunter can take one player down) -- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, etc. Use this information to adjust your strategy. -## GAME GUIDANCE FOR VILLAGER -- Protecting special villagers, especially the seer, is crucial for your team's success. -- Werewolves may pretend to be the seer. Be cautious and don't trust anyone easily. -- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. - -# NOTE -- [IMPORTANT] DO NOT make up any information that is not provided by the moderator or other players. -- This is a TEXT-based game, so DO NOT use or make up any non-textual information. -- Always critically reflect on whether your evidence exist, and avoid making assumptions. -- Your response should be specific and concise, provide clear reason and avoid unnecessary elaboration. -- Generate your one-line response by using the `generate_response` function. -- Don't repeat the others' speeches.""", - model=RobustDashScopeChatModel( - model_name="qwen3-max", - max_try=4, - stream=False - ) if role != train_which_role else astune_proxy, # type: ignore - formatter=DashScopeMultiAgentFormatter(), + sys_prompt=dedent(f""" + You're a werewolf game player named {name}. + + # YOUR TARGET + Your target is to win the game with your teammates as much as possible. + + # GAME RULES + - In werewolf game, players are divided into three werewolves, three villagers, one seer, one hunter and one witch. + - Werewolves: kill one player each night, and must hide identity during the day. + - Villagers: ordinary players without special abilities, try to identify and eliminate werewolves. + - Seer: A special villager who can check one player's identity each night. + - Witch: A special villager with two one-time-use potions: a healing potion to save a player from being killed at night, and a poison to eliminate one player at night. + - Hunter: A special villager who can take one player down with them when they are eliminated. + - The game alternates between night and day phases until one side wins: + - Night Phase + - Werewolves choose one victim + - Seer checks one player's identity + - Witch decides whether to use potions + - Moderator announces who died during the night + - Day Phase + - All players discuss and vote to eliminate one suspected player + + # GAME GUIDANCE + - Try your best to win the game with your teammates, tricks, lies, and deception are all allowed, e.g. pretending to be a different role. + - During discussion, don't be political, be direct and to the point. + - The day phase voting provides important clues. For example, the werewolves may vote together, attack the seer, etc. + ## GAME GUIDANCE FOR WEREWOLF + - Seer is your greatest threat, who can check one player's identity each night. Analyze players' speeches, find out the seer and eliminate him/her will greatly increase your chances of winning. + - In the first night, making random choices is common for werewolves since no information is available. + - Pretending to be other roles (seer, witch or villager) is a common strategy to hide your identity and mislead other villagers in the day phase. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR SEER + - Seer is very important to villagers, exposing yourself too early may lead to being targeted by werewolves. + - Your ability to check one player's identity is crucial. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR WITCH + - Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected werewolves. + - The outcome of the night phase provides important clues. For example, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR HUNTER + - Using your ability in day phase will expose your role (since only hunter can take one player down) + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR VILLAGER + - Protecting special villagers, especially the seer, is crucial for your team's success. + - Werewolves may pretend to be the seer. Be cautious and don't trust anyone easily. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + + # NOTE + - [IMPORTANT] DO NOT make up any information that is not provided by the moderator or other players. + - This is a TEXT-based game, so DO NOT use or make up any non-textual information. + - Always critically reflect on whether your evidence exist, and avoid making assumptions. + - Your response should be specific and concise, provide clear reason and avoid unnecessary elaboration. + - Generate your one-line response by using the `generate_response` function. + - Don't repeat the others' speeches."""), + model=model, # type: ignore + formatter=formatter, ) + + + agent.set_console_output_enabled(False) return agent From dd825c76d92d18e9df528131f18376f1bf279897 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 17 Nov 2025 15:23:42 +0800 Subject: [PATCH 040/462] remove warning --- astune/context_manager/cmt_base_attr.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/astune/context_manager/cmt_base_attr.py b/astune/context_manager/cmt_base_attr.py index f5a217ee..ffecd5b7 100644 --- a/astune/context_manager/cmt_base_attr.py +++ b/astune/context_manager/cmt_base_attr.py @@ -1,6 +1,7 @@ from typing import List, Union, Tuple from transformers.tokenization_utils import PreTrainedTokenizer from astune.schema.trajectory import Reward +from loguru import logger import uuid INVALID_LOG_PROB_VALUE = 0.0 @@ -102,7 +103,8 @@ def content_for_future(self): if self._content_for_future == "": if not self.tool_calls: # from vsdb import bp; bp("H1") - raise ValueError("content_for_future is not set, or previous llm output is empty!") + logger.exception("content_for_future is not set, or previous llm output is empty!") + self._content_for_future return self._content_for_future From 594e80bef56429de0de4edc2a8d8a6029850a813 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 17 Nov 2025 16:06:59 +0800 Subject: [PATCH 041/462] Refactor code for clarity and consistency; update comments to English and improve type hints across multiple files. --- astune/backbone_trinity/register_flow.py | 11 +- .../agentflow_cm/cmt_linear_think.py | 2 +- .../agentscope_cm/cmt_multi_sample.py | 6 +- astune/context_manager/cmt_base_attr.py | 156 +---------------- astune/context_manager/cmt_linear.py | 6 +- astune/env_service_client/env_client_ng.py | 14 +- astune/parallel_env.py | 6 +- astune/schema/extended_msg.py | 158 ++++++++++++++++++ astune/task_judge/math_answer_as_judge.py | 8 +- astune/utils/compute_madness.py | 26 +-- astune/utils/pty.py | 52 +++--- astune/utils/smart_daemon.py | 6 +- 12 files changed, 230 insertions(+), 221 deletions(-) create mode 100644 astune/schema/extended_msg.py diff --git a/astune/backbone_trinity/register_flow.py b/astune/backbone_trinity/register_flow.py index f220c2c7..a7a0c850 100644 --- a/astune/backbone_trinity/register_flow.py +++ b/astune/backbone_trinity/register_flow.py @@ -6,14 +6,13 @@ import asyncio, uuid, copy import threading -from typing import Dict, List, Optional, Union from trinity.common.experience import Experience from trinity.common.models.model import ModelWrapper from trinity.common.workflows.workflow import WORKFLOWS, Task, Workflow from trinity.common.workflows.agentscope.react.templates import TEMPLATE_MAP from transformers import AutoTokenizer from concurrent.futures import ThreadPoolExecutor -from typing import Dict, List, Literal, Callable, Union +from typing import Dict, List, Literal, Callable, Union, Optional from loguru import logger from omegaconf import DictConfig from tensordict import TensorDict @@ -30,6 +29,7 @@ from astune.schema.trajectory import Sample from astune.utils.config_utils import read_astune_config from omegaconf import OmegaConf +from astune.context_manager.cmt_base_attr import CMTBaseAttr class TrinityCompatWorkflow(DynamicRollout): @@ -82,7 +82,7 @@ def thread_worker(self): obs_window=obs_window ) - def run_in_new_thread(self): + def run_in_new_thread(self) -> CMTBaseAttr: # begin self.thread_worker in a new thread # then wait for it to finish, and get the result @@ -102,12 +102,13 @@ def _target(): if "exc" in exc_holder: raise exc_holder["exc"] - return result_holder.get("result", None) + thread_conclusion: CMTBaseAttr = result_holder.get("result", None) # type: ignore + return thread_conclusion @WORKFLOWS.register_module("astune_workflow") -class astunetWorkflowWrap(Workflow): +class ASTunetWorkflowWrap(Workflow): is_async: bool = True def __init__( self, diff --git a/astune/context_manager/agentflow_cm/cmt_linear_think.py b/astune/context_manager/agentflow_cm/cmt_linear_think.py index 401021fa..926bcde4 100644 --- a/astune/context_manager/agentflow_cm/cmt_linear_think.py +++ b/astune/context_manager/agentflow_cm/cmt_linear_think.py @@ -136,7 +136,7 @@ def group_tokenize(self): def process_reward(self, reward_structure: Reward): - # lienar 模式有多条轨迹 + # linear mode has multiple trajectories use_step_reward_from_env = self.config.astune.rollout.get("use_step_reward_from_env", False) if not use_step_reward_from_env: self.reward_structure = reward_structure diff --git a/astune/context_manager/agentscope_cm/cmt_multi_sample.py b/astune/context_manager/agentscope_cm/cmt_multi_sample.py index 9a504b58..1b9c4ff3 100644 --- a/astune/context_manager/agentscope_cm/cmt_multi_sample.py +++ b/astune/context_manager/agentscope_cm/cmt_multi_sample.py @@ -6,7 +6,7 @@ from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids from astune.utils.color_hsl import adjust_color_hsl from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.cmt_base_attr import INVALID_LOG_PROB_VALUE +from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE from astune.context_manager.agentscope_cm.timeline_merging import can_merge_steps from typing import Any, List, Tuple, Union @@ -45,7 +45,7 @@ def __init__( def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure ext_steps = self.full_context - # # lienar 模式只有一条轨迹 + # # linear mode has only one trajectory # self.reward_structure.step_reward = [ # self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) # ] @@ -66,7 +66,7 @@ def generate_log(self, task_id = None, global_step="NA"): input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] # loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] logprobs = [INVALID_LOG_PROB_VALUE] * len(cmt_tokenized["prompt_ids"]) + cmt_tokenized["response_logprobs"] - # 创建调整后的颜色数组 + # Create adjusted color array loss_mask_color_abl_arr = [ adjust_color_hsl("#09ABCF", logprob) if mask == 1 else adjust_color_hsl("#D98510", logprob) diff --git a/astune/context_manager/cmt_base_attr.py b/astune/context_manager/cmt_base_attr.py index ffecd5b7..a35a7d95 100644 --- a/astune/context_manager/cmt_base_attr.py +++ b/astune/context_manager/cmt_base_attr.py @@ -1,21 +1,10 @@ from typing import List, Union, Tuple from transformers.tokenization_utils import PreTrainedTokenizer +from astune.schema.extended_msg import ExtendedMessage +from astune.schema.extended_msg import find_sublist_indices +from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE from astune.schema.trajectory import Reward from loguru import logger -import uuid - -INVALID_LOG_PROB_VALUE = 0.0 - -def find_sublist_indices(large_list, small_list, reverse=False): - small_len = len(small_list) - if reverse: - for i in reversed(range(len(large_list) - small_len + 1)): - if large_list[i: i+small_len] == small_list: - return i - for i in range(len(large_list) - small_len + 1): - if large_list[i: i+small_len] == small_list: - return i - return -1 def replace_token_ids(place_holder, replace_with, begin, end, raw_logprob) -> Tuple[List[int], List[int]]: @@ -33,145 +22,6 @@ def replace_token_ids(place_holder, replace_with, begin, end, raw_logprob) -> Tu final_logprob = [INVALID_LOG_PROB_VALUE] * _begin_index + raw_logprob + [INVALID_LOG_PROB_VALUE] * (len(place_holder) - _end_index) return final, final_logprob -class ExtendedMessage: - - def __init__( - self, - author, - role="assistant", - content="", - token_arr=[], - token_begin_index=-1, - token_end_index=-1, - clip=False, - clip_token_limit=8192, - tokenizer: PreTrainedTokenizer=None, # type: ignore - token_generator="manual", - build_from_uuid="", - tools=[], - tool_calls=[], - token_logprob_arr=[], - ): - self.author = author - self.role = role - self.content = content - self.token_arr = token_arr - self.token_logprob_arr = token_logprob_arr - self.token_begin_index = token_begin_index - self.token_end_index = token_end_index - self.invalid_log_prob_value = INVALID_LOG_PROB_VALUE - # use property to ensure content is safe before use - self._content_for_future = "" - self._info = "" - self.clip = clip - self.tools = tools - self.tool_calls = tool_calls - self.uuid = uuid.uuid4().hex - self.build_from_uuid = build_from_uuid - - if not clip: - self.generate_content_for_future(tokenizer=None, clip=False) - else: - self.generate_content_for_future(tokenizer=tokenizer, clip=True, clip_token_limit=clip_token_limit) - self.eos_token_id = tokenizer.eos_token_id - if token_generator == 'auto': - dummy_msg = [ {"role": "assistant", "content": "dummy text"} ] - try: - # completion_token_arr will contain generation_prompt header - auto_tokenize_target = { "role": self.role, "content": self.content_for_future } - if self.tool_calls: - auto_tokenize_target.update({ "tool_calls": self.tool_calls }) - text_frag_to = tokenizer.apply_chat_template( - dummy_msg + [ auto_tokenize_target ], - tokenize=False, - tools=tools - ) - except Exception as e: - raise ValueError(f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}") - self.token_arr, _ = self.get_inc_simple( - text_frag_from=tokenizer.apply_chat_template( - dummy_msg, - tokenize=False, - tools=tools - ), - text_frag_to=text_frag_to, - tokenizer=tokenizer - ) - - @property - def content_for_future(self): - if self._content_for_future == "": - if not self.tool_calls: - # from vsdb import bp; bp("H1") - logger.exception("content_for_future is not set, or previous llm output is empty!") - self._content_for_future - return self._content_for_future - - - @property - def need_training(self): - NEED_TRAIN_AUTHORS = ["llm"] - NON_TRAIN_AUTHORS = ["env", "initialization", "user", "memory", "llm(do_not_train)"] - assert (self.author in NEED_TRAIN_AUTHORS) or (self.author in NON_TRAIN_AUTHORS) or (self.author.endswith('(discard)')), f"author {self.author} is not identified" - return (self.author in NEED_TRAIN_AUTHORS) - - - def generate_content_for_future(self, tokenizer, clip, clip_token_limit=-1): - _content: str = self.content - if clip: - assert clip_token_limit > 0, "clip_token_limit must be set when clip is True" - n_token = len(tokenizer(_content, return_tensors="pt", padding=False)["input_ids"][0]) - if n_token > clip_token_limit: - # 8000 > 4000 - n_char = len(_content) # 10,000 - eps = 100 # token - preserve_percent = (clip_token_limit - eps) / n_token # 3900 / 8000 - n_char_to_preserve = int(n_char * preserve_percent) - _content = _content[:n_char_to_preserve] + "... truncate ..." - self._content_for_future = _content - - - def get_loss_mask(self, blackout_token_combo): - def blackout_specific_token_ids_first_encounter(mask, arr, token_ids): - index = find_sublist_indices(arr, token_ids, reverse=False) - if index >= 0: - for i in range(index, index+len(token_ids)): mask[i] = 0 - return mask - - def blackout_everything_after_eos_but_keep_eos(mask, token_arr, eos_token_id): - eos_position = token_arr.index(eos_token_id) if eos_token_id in token_arr else -1 - if eos_position != -1: - for i in range(eos_position + 1, len(mask)): - mask[i] = 0 - return mask - - if self.need_training: - msg_token_mask = [1] * len(self.token_arr) - msg_token_mask = blackout_specific_token_ids_first_encounter(msg_token_mask, self.token_arr, blackout_token_combo) - msg_token_mask = blackout_everything_after_eos_but_keep_eos(mask=msg_token_mask, token_arr=self.token_arr, eos_token_id=self.eos_token_id) - return msg_token_mask - else: - msg_token_mask = [0] * len(self.token_arr) - return msg_token_mask - - def get_inc_simple(self, text_frag_from, text_frag_to, tokenizer): - """ - Get the incremental token array from text_frag_from to text_frag_to. - """ - tokenizer_output = tokenizer(text_frag_from, return_tensors="pt", padding=False) - tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() - token_ids_acc = tokenizer_input_ids - - tokenizer_output = tokenizer(text_frag_to, return_tensors="pt", padding=False) - input_ids = tokenizer_output["input_ids"][0].tolist() - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step - overlap_length = 0 - for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 - else: break - msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" - # print(msg) - return input_id_increment, msg class CMTBaseAttr(object): diff --git a/astune/context_manager/cmt_linear.py b/astune/context_manager/cmt_linear.py index 9756a7fc..d46e21b2 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_manager/cmt_linear.py @@ -406,8 +406,8 @@ def generate_log(self, task_id=None, global_step="NA"): raw_reward = self.reward_structure.raw_reward step_reward = self.reward_structure.step_reward[0] try: - step_advantage = self.reward_structure.step_advantage[index] - step_advantage_simple = self.reward_structure.step_advantage_simple[index] + step_advantage = self.reward_structure.step_advantage[0] + step_advantage_simple = self.reward_structure.step_advantage_simple[0] except: step_advantage = 0.0 step_advantage_simple = 0.0 @@ -441,7 +441,7 @@ def generate_log(self, task_id=None, global_step="NA"): def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure ext_steps = self.full_context - # lienar 模式只有一条轨迹 + # linear mode has only one trajectory self.reward_structure.step_reward = [ self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) ] diff --git a/astune/env_service_client/env_client_ng.py b/astune/env_service_client/env_client_ng.py index c4e456f8..54c434f4 100644 --- a/astune/env_service_client/env_client_ng.py +++ b/astune/env_service_client/env_client_ng.py @@ -237,19 +237,19 @@ def call(): action_name="release_instance" ) -# 使用示例 +# Usage example def main(): client = EnvClient() env_type = "appworld" - # 获取任务列表 + # Get the task list task_ids = client.get_env_profile(env_type) print(f"Available tasks: {task_ids}") - # 创建实例 + # Create an instance task_id = task_ids[0] if task_ids else None if not task_id: - print("任务列表为空,无法创建实例!") + print("Task list is empty; cannot create an instance!") return init_response = client.create_instance(env_type, task_id) print("init state", init_response) @@ -257,16 +257,16 @@ def main(): query = init_response.get("state", []) print(f"Created instance {instance_id} with query: {query}") - # 执行动作 + # Execute an action action = {"role": "assistant", "content": "print('hello appworld!!')"} result = client.step(instance_id, action) print(f"Step result: {result}") - # 评估 + # Evaluate score = client.evaluate(instance_id) print(f"Evaluation score: {score}") - # 释放实例 + # Release the instance success = client.release_instance(instance_id) print(f"Instance released: {success}") diff --git a/astune/parallel_env.py b/astune/parallel_env.py index fe431972..d8db5aed 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -528,7 +528,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] add_count = 0 # If using an addition strategy, number of samples to add. num_task_to_amend = len(futures) # num_task logger.info(f"allow_sample_num_change policy: world_size: {world_size}, total_sample {total_sample}, add_count: {add_count}, ") - # 选择 extra 最少的task进行补偿 + # Select the task with the fewest extras for compensation while add_count != 0: _task_completed_thread_cnt_find_nonzero_min = [float('inf') if x <=0 else x for x in task_completed_thread_cnt] min_extra_index = _task_completed_thread_cnt_find_nonzero_min.index(min(_task_completed_thread_cnt_find_nonzero_min)) @@ -546,7 +546,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] remove_count = sum(task_extra_thread_cnt) - extra_num_thread_required logger.info(f"forbid_sample_num_change policy: num_task_max_to_amend: {num_task_max_to_amend}, num_task_to_amend: {num_task_to_amend}, remove_count: {remove_count}, ") - # 选择 extra 最多的task进行约束 + # Select the task with the most extras to constrain while remove_count != 0: max_extra_index = task_extra_thread_cnt.index(max(task_extra_thread_cnt)) assert task_extra_thread_cnt[max_extra_index] > 0, "task_extra_thread_cnt should be greater than 0" @@ -556,7 +556,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") - # 筛选出方差最高的样本 + # Select samples with the highest variance cmt_array = [] print_buffer = "" task_success_rate = [] diff --git a/astune/schema/extended_msg.py b/astune/schema/extended_msg.py new file mode 100644 index 00000000..65325e74 --- /dev/null +++ b/astune/schema/extended_msg.py @@ -0,0 +1,158 @@ +from typing import List, Union, Tuple +from transformers.tokenization_utils import PreTrainedTokenizer +from astune.schema.trajectory import Reward +from loguru import logger +import uuid + +INVALID_LOG_PROB_VALUE = 0.0 + +def find_sublist_indices(large_list, small_list, reverse=False): + small_len = len(small_list) + if reverse: + for i in reversed(range(len(large_list) - small_len + 1)): + if large_list[i: i+small_len] == small_list: + return i + for i in range(len(large_list) - small_len + 1): + if large_list[i: i+small_len] == small_list: + return i + return -1 + + +class ExtendedMessage: + + def __init__( + self, + author, + role="assistant", + content="", + token_arr=[], + token_begin_index=-1, + token_end_index=-1, + clip=False, + clip_token_limit=8192, + tokenizer: PreTrainedTokenizer=None, # type: ignore + token_generator="manual", + build_from_uuid="", + tools=[], + tool_calls=[], + token_logprob_arr=[], + ): + self.author = author + self.role = role + self.content = content + self.token_arr = token_arr + self.token_logprob_arr = token_logprob_arr + self.token_begin_index = token_begin_index + self.token_end_index = token_end_index + self.invalid_log_prob_value = INVALID_LOG_PROB_VALUE + self._content_for_future = "" + self._info = "" + self.clip = clip + self.tools = tools + self.tool_calls = tool_calls + self.uuid = uuid.uuid4().hex + self.build_from_uuid = build_from_uuid + + if not clip: + self.generate_content_for_future(tokenizer=None, clip=False) + else: + self.generate_content_for_future(tokenizer=tokenizer, clip=True, clip_token_limit=clip_token_limit) + self.eos_token_id = tokenizer.eos_token_id + if token_generator == 'auto': + dummy_msg = [ {"role": "assistant", "content": "dummy text"} ] + try: + # completion_token_arr will contain generation_prompt header + auto_tokenize_target = { "role": self.role, "content": self.content_for_future } + if self.tool_calls: + auto_tokenize_target.update({ "tool_calls": self.tool_calls }) + text_frag_to = tokenizer.apply_chat_template( + dummy_msg + [ auto_tokenize_target ], + tokenize=False, + tools=tools + ) + except Exception as e: + raise ValueError(f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}") + self.token_arr, _ = self.get_inc_simple( + text_frag_from=tokenizer.apply_chat_template( + dummy_msg, + tokenize=False, + tools=tools + ), + text_frag_to=text_frag_to, + tokenizer=tokenizer + ) + + @property + def content_for_future(self): + if self._content_for_future == "": + if not self.tool_calls: + # from vsdb import bp; bp("H1") + logger.exception("content_for_future is not set, or previous llm output is empty!") + self._content_for_future + return self._content_for_future + + + @property + def need_training(self): + NEED_TRAIN_AUTHORS = ["llm"] + NON_TRAIN_AUTHORS = ["env", "initialization", "user", "memory", "llm(do_not_train)"] + assert (self.author in NEED_TRAIN_AUTHORS) or (self.author in NON_TRAIN_AUTHORS) or (self.author.endswith('(discard)')), f"author {self.author} is not identified" + return (self.author in NEED_TRAIN_AUTHORS) + + + def generate_content_for_future(self, tokenizer, clip, clip_token_limit=-1): + _content: str = self.content + if clip: + assert clip_token_limit > 0, "clip_token_limit must be set when clip is True" + n_token = len(tokenizer(_content, return_tensors="pt", padding=False)["input_ids"][0]) + if n_token > clip_token_limit: + # 8000 > 4000 + n_char = len(_content) # 10,000 + eps = 100 # token + preserve_percent = (clip_token_limit - eps) / n_token # 3900 / 8000 + n_char_to_preserve = int(n_char * preserve_percent) + _content = _content[:n_char_to_preserve] + "... truncate ..." + self._content_for_future = _content + + + def get_loss_mask(self, blackout_token_combo): + def blackout_specific_token_ids_first_encounter(mask, arr, token_ids): + index = find_sublist_indices(arr, token_ids, reverse=False) + if index >= 0: + for i in range(index, index+len(token_ids)): mask[i] = 0 + return mask + + def blackout_everything_after_eos_but_keep_eos(mask, token_arr, eos_token_id): + eos_position = token_arr.index(eos_token_id) if eos_token_id in token_arr else -1 + if eos_position != -1: + for i in range(eos_position + 1, len(mask)): + mask[i] = 0 + return mask + + if self.need_training: + msg_token_mask = [1] * len(self.token_arr) + msg_token_mask = blackout_specific_token_ids_first_encounter(msg_token_mask, self.token_arr, blackout_token_combo) + msg_token_mask = blackout_everything_after_eos_but_keep_eos(mask=msg_token_mask, token_arr=self.token_arr, eos_token_id=self.eos_token_id) + return msg_token_mask + else: + msg_token_mask = [0] * len(self.token_arr) + return msg_token_mask + + def get_inc_simple(self, text_frag_from, text_frag_to, tokenizer): + """ + Get the incremental token array from text_frag_from to text_frag_to. + """ + tokenizer_output = tokenizer(text_frag_from, return_tensors="pt", padding=False) + tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() + token_ids_acc = tokenizer_input_ids + + tokenizer_output = tokenizer(text_frag_to, return_tensors="pt", padding=False) + input_ids = tokenizer_output["input_ids"][0].tolist() + input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + overlap_length = 0 + for i in range(len(token_ids_acc)): + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 + else: break + msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" + # print(msg) + return input_id_increment, msg diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index b022c9dc..a944980f 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -7,12 +7,12 @@ def __init__(self, config): self.config = config def compute_reward(self, judge_input_dictionary) -> tuple: - # judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) - # judge_input_dictionary['task_core_arg']: 任务信息(如果里面包含了参考答案,可以从中取出) - # judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) + # judge_input_dictionary['env']: External env_service context (if env_service is used) + # judge_input_dictionary['task_core_arg']: Task information (extract reference answer here if provided) + # judge_input_dictionary['grouped_steps']: Each historical LLM dialogue turn (extract if intermediate reasoning matters) raw_reward = 0 - final_answer = judge_input_dictionary['final_answer'] # 默认没有final_answer,需要在workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 + final_answer = judge_input_dictionary['final_answer'] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow task_core_arg = judge_input_dictionary['task_core_arg'] reference_answer = task_core_arg.task.metadata['answer'] reference_answer = reference_answer.split('####')[-1].strip() diff --git a/astune/utils/compute_madness.py b/astune/utils/compute_madness.py index 9bc22681..8801f292 100644 --- a/astune/utils/compute_madness.py +++ b/astune/utils/compute_madness.py @@ -1,13 +1,13 @@ import re from functools import cache -# 各白名单类别对应正则片段 +# Regex fragments for each whitelist category WHITE_LIST_REGEX_PARTS = { - # 常见符号 + # Common symbols 'common_symbols': '‘’“”–—…•™©®°±µ′″℉℃·×', - # 中文标点 + # Chinese punctuation 'chinese_punct': ',。!?、;:“”‘’()【】《》()——……「」『』', - # emoji 范围 + # Emoji ranges 'emoji': ( '\U0001F300-\U0001F5FF' '\U0001F600-\U0001F64F' @@ -21,7 +21,7 @@ '\u2702-\u27B0' '\u24C2-\U0001F251' ), - # 中文字符 + # Chinese characters 'chinese': ( '\u4E00-\u9FFF' '\u3400-\u4DBF' @@ -37,14 +37,14 @@ @cache def build_pattern(white_list): - """根据白名单类别构造正则""" - allowed_parts = ['\x00-\x7F'] # 所有 ASCII + """Build a regex based on the provided whitelist categories.""" + allowed_parts = ['\x00-\x7F'] # All ASCII for name in white_list: if name in WHITE_LIST_REGEX_PARTS: allowed_parts.append(WHITE_LIST_REGEX_PARTS[name]) - # 把允许的范围合并为一个字符类,并用反向类匹配“不被允许的字符” + # Merge allowed ranges into one character class, then use a negated class to match disallowed characters allowed_class = ''.join(allowed_parts) - pattern = f'[^{allowed_class}]' # 匹配 不允许 的字符 + pattern = f'[^{{allowed_class}}]' # Match disallowed characters return re.compile(pattern) def has_non_ascii(text, white_list=('common_symbols', 'emoji', 'chinese', 'chinese_punct')): @@ -89,7 +89,7 @@ def compute_string_madness_format(completion, format_type)->float: ``` """ - # 检查 标签是否成对出现,且只出现一次 + # Check that and appear exactly once and in order if not completion.strip().startswith(r""): # print("not start with ") return -1.0 @@ -102,7 +102,7 @@ def compute_string_madness_format(completion, format_type)->float: # remove think part think_part = completion[completion.index(r""):completion.index(r"")+len(r"")] rest_part = completion.replace(think_part, "") - # 检查 ```python 和 ``` 是否成对出现,且只出现一次 + # Check that ```python and ``` appear exactly once and in order if not rest_part.strip().startswith(r"```python"): # print("not start with ```python") return -1.0 @@ -162,11 +162,11 @@ def repetition_penalty_reward_scalar_debug(completion): return "" if __name__ == "__main__": - # 测试示例 + # Test examples # print(compute_string_madness("Hello world!")) # 0 # print(compute_string_madness("Hello world! 😄")) # 0 # print(compute_string_madness("Hello world! Hello world!")) # -1.0 - # print(compute_string_madness("你好,世界!")) # -1.0 + # print(compute_string_madness("Chinese characters here")) # -1.0 # print(compute_string_madness("Hello <|im_start|> world!")) # -1.0 assert compute_string_madness(""" playlist_songs` API to get the list of songs in a playlist. diff --git a/astune/utils/pty.py b/astune/utils/pty.py index b6dbcbf2..c1366ee9 100644 --- a/astune/utils/pty.py +++ b/astune/utils/pty.py @@ -3,79 +3,79 @@ def run_command_with_pty(cmd, working_dir, env_dict): """ - 使用伪终端运行命令,并将输出写入日志文件。 + Run a command in a pseudo-terminal (PTY) and stream output to stdout. - 参数: - cmd (list): 要运行的命令(如 ["ls", "-l"])。 - working_dir (str): 工作目录。 - env_dict (dict): 环境变量字典。 + Args: + cmd (list): Command to run (e.g., ["ls", "-l"]). + working_dir (str): Working directory. + env_dict (dict): Environment variables dictionary. """ - # 保存原始环境变量 + # Save original environment and directory original_env = os.environ.copy() original_dir = os.getcwd() try: - # 切换到指定工作目录 + # Change to the target working directory os.chdir(working_dir) - # 更新环境变量 + # Update environment variables for key, value in env_dict.items(): os.environ[key] = value - # # 打开日志文件以追加模式写入 + # # Open a log file in append mode (optional) # with open(log_file, 'a') as log_f: - # 定义主设备读取回调函数 + # Define master device read callback def master_read(fd): try: - # 从主设备读取数据 + # Read data from PTY master data = os.read(fd, 1024) except OSError: return b"" if data: - # 将数据写入日志文件 + # Write data to log file # log_f.write(data.decode()) # log_f.flush() - # 同时打印到标准输出(可选) + # Also print to stdout (optional) print(data.decode(), end="") return data - # 定义标准输入读取回调函数 + # Define stdin read callback def stdin_read(fd): - # 如果不需要从标准输入读取数据,直接返回空字节 + # Return empty bytes if no stdin input is needed return b"" - # 使用 pty.spawn 分配伪终端并运行命令 + # Spawn a PTY and run the command pty.spawn(cmd, master_read, stdin_read) finally: - # 恢复原始工作目录 + # Restore original working directory os.chdir(original_dir) - # 恢复原始环境变量 + # Restore original environment variables os.environ.clear() os.environ.update(original_env) import base64 -# 将字符串转换为 Base64 +# Convert string to Base64 def string_to_base64(s): - # 首先将字符串编码为字节 + # First, encode the string to bytes s_bytes = s.encode('utf-8') - # 将字节转换为 base64 + # Convert bytes to base64 base64_bytes = base64.b64encode(s_bytes) - # 将 base64 字节转换回字符串 + # Convert base64 bytes back to string base64_string = base64_bytes.decode('utf-8') return base64_string -# 将 Base64 转换回字符串 +# Convert Base64 back to string def base64_to_string(b): - # 将 base64 字符串转换为字节 + # Convert base64 string to bytes base64_bytes = b.encode('utf-8') - # 解码 base64 字节 + # Decode base64 bytes message_bytes = base64.b64decode(base64_bytes) - # 将字节转换回字符串 + # Convert bytes back to string message = message_bytes.decode('utf-8') return message diff --git a/astune/utils/smart_daemon.py b/astune/utils/smart_daemon.py index 36b91bf7..a6e77c27 100644 --- a/astune/utils/smart_daemon.py +++ b/astune/utils/smart_daemon.py @@ -191,11 +191,11 @@ def launch(self, force_restart: bool = False, launch_wait_time: int = 30, succes import base64 def string_to_base64(s): - # 首先将字符串编码为字节 + # First, encode the string to bytes s_bytes = s.encode('utf-8') - # 将字节转换为 base64 + # Then convert bytes to base64 base64_bytes = base64.b64encode(s_bytes) - # 将 base64 字节转换回字符串 + # Finally, convert base64 bytes back to string base64_string = base64_bytes.decode('utf-8') return base64_string From 0c7c2d4c8c5ba18aacaaee6a68e402f4fdfa5b52 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 17 Nov 2025 17:42:39 +0800 Subject: [PATCH 042/462] feat: introduce tracing reader --- astune/task_reader/__init__.py | 2 - astune/task_reader/env_service_reader.py | 1 - astune/task_reader/hf_dataset_reader.py | 1 - astune/task_reader/jsonl_reader.py | 1 - astune/task_reader/task_reader_base.py | 1 - astune/task_reader/tracing_reader/__init__.py | 131 ++++++++ .../task_reader/tracing_reader/connector.py | 68 +++++ .../tracing_reader/filters/__init__.py | 0 .../tracing_reader/filters/base.py | 11 + .../tracing_reader/filters/factory.py | 42 +++ .../filters/llm_evaluate_filter.py | 73 +++++ astune/task_reader/tracing_reader/fn.py | 192 ++++++++++++ .../task_reader/tracing_reader/llm_client.py | 286 ++++++++++++++++++ launcher/math_agent/git-math-agentscope.yaml | 16 + tests/test_tracing_reader.py | 125 ++++++++ 15 files changed, 944 insertions(+), 6 deletions(-) create mode 100644 astune/task_reader/tracing_reader/__init__.py create mode 100644 astune/task_reader/tracing_reader/connector.py create mode 100644 astune/task_reader/tracing_reader/filters/__init__.py create mode 100644 astune/task_reader/tracing_reader/filters/base.py create mode 100644 astune/task_reader/tracing_reader/filters/factory.py create mode 100644 astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py create mode 100644 astune/task_reader/tracing_reader/fn.py create mode 100644 astune/task_reader/tracing_reader/llm_client.py create mode 100644 tests/test_tracing_reader.py diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index 50a92775..1155c987 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -5,8 +5,6 @@ import numpy as np from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler -from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.env_service_reader import TaskReaderEnvService from astune.task_reader.hf_dataset_reader import TaskReaderHuggingFace diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index d9a0eb85..c51aa94d 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -4,7 +4,6 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py index 00d716f9..da62cbdf 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astune/task_reader/hf_dataset_reader.py @@ -4,7 +4,6 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index 777cd10b..e06158b1 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -4,7 +4,6 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_reader/task_reader_base.py b/astune/task_reader/task_reader_base.py index ecc49297..f1e256ef 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astune/task_reader/task_reader_base.py @@ -4,7 +4,6 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py new file mode 100644 index 00000000..6829a209 --- /dev/null +++ b/astune/task_reader/tracing_reader/__init__.py @@ -0,0 +1,131 @@ + + +from typing import Any, List, Mapping, MutableMapping, Sequence, TypedDict + +import json +import os +import random + +from astune.schema.task import Task +from astune.task_reader.tracing_reader.filters.base import Filter +from astune.task_reader.tracing_reader.filters.factory import build_filters +from astune.task_reader.tracing_reader.filters.llm_evaluate_filter import ( + LlmEvaluateFilter, +) +from ..task_reader_base import TaskReaderBase +from .connector import PhoneixConnector + + + +class Config(TypedDict): + base_url: str + train_output_path: str + filters: List[Mapping[str, Any]] + + +class TracingReader(TaskReaderBase): + config: Config + + def __init__( + self, + config, + train_ratio: float = 0.7, + split_seed: int = 42, + ) -> None: + super().__init__(config) + # config patch + self.config = config.astune.tracing + + self._connector = PhoneixConnector(self.config.get("base_url")) + filters_config = self.config.get("filters") + built_filters = build_filters(filters_config) + self._filters: List[Filter] = built_filters + + self._train_ratio = train_ratio + self._split_seed = split_seed + + self._train_tasks: List[Task] = [] + self._val_tasks: List[Task] = [] + + self._init_tasks() + + def _load_existing_tasks(self, path: str) -> List[Task]: + if not os.path.exists(path): + return [] + tasks: List[Task] = [] + with open(path, "r") as f: + for line in f: + line = line.strip() + if not line: + continue + obj = json.loads(line) + tasks.append(Task(**obj)) + return tasks + + def _append_tasks(self, path: str, tasks: List[Task]) -> None: + if not tasks: + return + with open(path, "a") as f: + for task in tasks: + obj = task.model_dump() + f.write(json.dumps(obj, ensure_ascii=False) + "\n") + + def _apply_filters(self, tasks: List[Task]) -> List[Task]: + filtered = tasks + for flt in self._filters: + filtered = flt.filter(filtered) + return filtered + + def _init_tasks(self) -> None: + output_path = self.config.get("train_output_path") + + tasks = self._connector.load_tasks_from_conversation() + + existing_tasks = self._load_existing_tasks(output_path) + existing_hashes = { + t.metadata.get("qa_hash") + for t in existing_tasks + if t.metadata.get("qa_hash") is not None + } + + new_tasks = [ + t + for t in tasks + if t.metadata.get("qa_hash") is not None + and t.metadata["qa_hash"] not in existing_hashes + ] + + new_tasks_filtered = self._apply_filters(new_tasks) + + self._append_tasks(output_path, new_tasks_filtered) + + all_tasks: List[Task] = existing_tasks + new_tasks_filtered + + if not all_tasks: + self._train_tasks = [] + self._val_tasks = [] + return + + shuffled_tasks = list(all_tasks) + rnd = random.Random(self._split_seed) + rnd.shuffle(shuffled_tasks) + + total = len(shuffled_tasks) + train_size = int(total * self._train_ratio) + + if total == 1: + train_size = 1 + else: + if train_size <= 0: + train_size = 1 + if train_size >= total: + train_size = total - 1 + + self._train_tasks = shuffled_tasks[:train_size] + self._val_tasks = shuffled_tasks[train_size:] + + def get_training_tasks(self) -> List[Task]: + return self._train_tasks + + def get_validation_tasks(self) -> List[Task]: + return self._val_tasks \ No newline at end of file diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py new file mode 100644 index 00000000..53b524ba --- /dev/null +++ b/astune/task_reader/tracing_reader/connector.py @@ -0,0 +1,68 @@ +from typing import List + +import requests +import json +import hashlib +from datetime import datetime + +from astune.schema.task import Task + + +class PhoneixConnector: + def __init__(self, base_url: str) -> None: + self._base_url = base_url.rstrip("/") + + def _get(self, path: str, **params): + url = f"{self._base_url}{path}" + resp = requests.get(url, params=params) + resp.raise_for_status() + return resp.json()["data"] + + def load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: + projects = self._get( + "/v1/projects", + limit=projects_limit, + include_experiment_projects="false", + ) + + all_spans: list = [] + for project in projects: + pid = project["id"] + spans = self._get(f"/v1/projects/{pid}/spans", limit=spans_limit) + all_spans.extend(spans) + return all_spans + + def load_tasks_from_conversation( + self, projects_limit: int = 100, spans_limit: int = 100 + ) -> List[Task]: + all_spans = self.load_spans(projects_limit=projects_limit, spans_limit=spans_limit) + all_spans.sort(key=lambda x: datetime.fromisoformat(x["end_time"])) + all_spans = list(filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) + + qa: list = [] + for span in all_spans: + inp = json.loads(span["attributes"]["gen_ai.input.messages"]) + out = json.loads(span["attributes"]["gen_ai.output.messages"]) + if "parts" in inp and "parts" in out: + qa.append({ + "query": inp["parts"][0]["content"], + "answer": out["parts"][0]["content"], + }) + + tasks: List[Task] = [] + for item in qa: + raw = (item["query"] or "") + "\n" + (item["answer"] or "") + qa_hash = hashlib.sha256(raw.encode("utf-8")).hexdigest() + task = Task( + main_query=item["query"], + task_id="no_id", + env_type="no_env", + metadata={ + "answer": item["answer"], + "qa_hash": qa_hash, + }, + ) + tasks.append(task) + return tasks + + diff --git a/astune/task_reader/tracing_reader/filters/__init__.py b/astune/task_reader/tracing_reader/filters/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/astune/task_reader/tracing_reader/filters/base.py b/astune/task_reader/tracing_reader/filters/base.py new file mode 100644 index 00000000..d51b6824 --- /dev/null +++ b/astune/task_reader/tracing_reader/filters/base.py @@ -0,0 +1,11 @@ +from abc import ABC, abstractmethod +from typing import Iterable, List + +from astune.schema.task import Task + + +class Filter(ABC): + @abstractmethod + def filter(self, tasks: Iterable[Task]) -> List[Task]: + """Filter a collection of Task objects and return the kept ones.""" + raise NotImplementedError diff --git a/astune/task_reader/tracing_reader/filters/factory.py b/astune/task_reader/tracing_reader/filters/factory.py new file mode 100644 index 00000000..d6d8a39d --- /dev/null +++ b/astune/task_reader/tracing_reader/filters/factory.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Sequence + +from .base import Filter +from .llm_evaluate_filter import LlmEvaluateFilter + + +FILTER_REGISTRY: Dict[str, type[Filter]] = { + "llm_evaluate": LlmEvaluateFilter, +} + + +def _build_single_filter(spec: Mapping[str, Any]) -> Filter: + type_name = spec.get("type") + if not isinstance(type_name, str): + raise ValueError(f"Filter spec must contain string 'type', got: {type_name!r}") + + params = spec.get("params") or {} + if not isinstance(params, MutableMapping): + raise TypeError("Filter 'params' must be a mapping if present") + + cls = FILTER_REGISTRY.get(type_name) + if cls is None: + raise ValueError(f"Unknown filter type: {type_name!r}") + + return cls(**params) # type: ignore[arg-type] + + +def build_filters(specs: Sequence[Mapping[str, Any]] | None) -> List[Filter]: + """Setup filter chain according to config. + """ + if not specs: + return [] + + filters: List[Filter] = [] + for spec in specs: + enabled = spec.get("enabled", True) + if not enabled: + continue + filters.append(_build_single_filter(spec)) + return filters diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py new file mode 100644 index 00000000..5657a1b0 --- /dev/null +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -0,0 +1,73 @@ +from typing import Iterable, List + +from astune.schema.task import Task + +from ..fn import Fn +from ..llm_client import DashScopeClient +from .base import Filter + + +EVALUATE_PROMPT = """你现在扮演一个**严格的 QA 质量审查员**。给你一条数据样本,包含一个“query”(用户提问/任务)和一个“answer”(助手回复)。请只依据文本本身进行静态评估,不要编造事实或外部检索。 + +一、判定目标 +判定该「query–answer」是否为**高质量数据(GOOD)**,并给出分数与理由。若不满足标准,则标为**BAD**。 + +二、判断标准(任一命中即 BAD) +1. **缺失项**:query 为空、answer 为空、或两者皆空。 +2. **非答复**:answer 只有“收到/明白/请提供更多信息/占位寒暄”,没有实质回答或行动结果。 +3. **牛头不对马嘴**:answer 与 query 主题明显不相关。 +4. **流程借口**:answer 主要描述“无法搜索/被限流/遇到验证码/换设备”等流程困难,却**没有**给出替代性信息、总结、或可执行的下一步。 +5. **明显自相矛盾或逻辑不通**:同一回答内部互相打架(如先说能做又说不能做)。 +6. **安全/合规红线**:含违法、仇恨、个人隐私泄露等明显不当内容。 +7. **语言极不匹配**:query 的语言与 answer 完全不匹配,影响理解(如中文提问,answer 用不通顺的法语且与内容无关)。 + +三、特殊情况与其他标准 +{custom_rubrics} + +以上信息有任何一个命中,最终结果即为BAD,否则是GOOD。 +""" + + +class LlmEvaluateFilter(Filter): + def __init__( + self, + *, + custom_rubrics: str = "", + temperature: float = 0.7, + max_tokens: int = 2048, + print_reason: bool = True, + ) -> None: + """Filter that evaluates the quality of tasks using LLM. + """ + + self._print_reason = print_reason + self._llm = DashScopeClient() + self._fn = Fn( + name="evaluate_quality", + description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), + llm_client=self._llm, + input_schema={ + "query": "用户提问/任务", + "answer": "助手回复", + }, + output_schema={ + "reason": "判断理由,简明说明理由", + "result": "GOOD/BAD", + }, + sampling_params={"temperature": temperature, "max_tokens": max_tokens}, + ) + + def filter(self, tasks: Iterable[Task]) -> List[Task]: + kept: List[Task] = [] + for task in tasks: + payload = { + "query": task.main_query, + "answer": task.metadata.get("answer", ""), + } + res = self._fn(payload) + assert isinstance(res, dict) + if self._print_reason: + print(res["reason"]) + if res.get("result") == "GOOD": + kept.append(task) + return kept diff --git a/astune/task_reader/tracing_reader/fn.py b/astune/task_reader/tracing_reader/fn.py new file mode 100644 index 00000000..a4918cfa --- /dev/null +++ b/astune/task_reader/tracing_reader/fn.py @@ -0,0 +1,192 @@ +import re +from typing import Any, Dict, List, Union +from .llm_client import DashScopeClient + + +class Fn: + """ + A class that defines a task with specific requirements, input parameters, and output format. + It uses LlmClient to execute the task and parses the result using markdown-kv format. + """ + + def __init__(self, + name: str, + description: str, + llm_client: DashScopeClient, + input_schema: Dict[str, str], + output_schema: Dict[str, str], + sampling_params: Dict[str, Any] = {}): + """ + Initialize the Fn class. + + Args: + name: The name of the function/task + description: Description of what the task does + llm_client: The LLM client to use for execution + input_schema: Dictionary defining the input parameters format (name -> description) + output_schema: Dictionary defining the output format (name -> description) + sampling_params: Parameters for LLM sampling + """ + self.name = name + self.description = description + self.llm_client = llm_client + self.input_schema = input_schema + self.output_schema = output_schema + self.sampling_params = sampling_params or {} + + def _build_system_prompt(self) -> str: + """ + Build the system prompt that defines the task requirements, input format, and output format. + + Returns: + str: The system prompt for the LLM + """ + prompt_parts = [] + + # Task description + prompt_parts.append(f"## Task: {self.name}") + prompt_parts.append(f"Description: {self.description}") + prompt_parts.append("") + + # Input format + prompt_parts.append("## Input Parameters") + if self.input_schema: + prompt_parts.append("The input parameters should be provided in the following format:") + for param_name, param_desc in self.input_schema.items(): + prompt_parts.append(f"- {param_name}: {param_desc}") + prompt_parts.append("") + prompt_parts.append("Input can be either:") + prompt_parts.append("1. A single record (dict) with the above parameters") + prompt_parts.append("2. Multiple records (list of dicts) with the same parameters") + else: + prompt_parts.append("This task takes no input parameters.") + prompt_parts.append("") + + # Output format + prompt_parts.append("## Output Format") + prompt_parts.append("You must return the result in markdown-kv format as shown below:") + prompt_parts.append("```markdown") + if self.output_schema: + prompt_parts.append("## record 0") + for field_name, field_desc in self.output_schema.items(): + prompt_parts.append(f"{field_name}=value") + else: + prompt_parts.append("## record 0") + prompt_parts.append("result=success") + prompt_parts.append("```") + prompt_parts.append("") + + # Multiple records instruction + prompt_parts.append("If there are multiple results, use separate records with increasing indices:") + prompt_parts.append("```markdown") + prompt_parts.append("## record 0") + prompt_parts.append("name=first_result") + prompt_parts.append("value=some_value") + prompt_parts.append("") + prompt_parts.append("## record 1") + prompt_parts.append("name=second_result") + prompt_parts.append("value=another_value") + prompt_parts.append("```") + prompt_parts.append("") + + # Important instructions + prompt_parts.append("## Important Instructions") + prompt_parts.append("1. Always follow the exact markdown-kv format shown above") + prompt_parts.append("2. Do not include any other text or formatting in your response") + prompt_parts.append("3. Only return the markdown-kv formatted result") + + return "\n".join(prompt_parts) + + def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, str]]]: + """ + Parse markdown-kv formatted text into dictionary or list of dictionaries. + + Args: + text: The markdown-kv formatted text to parse + + Returns: + Union[Dict[str, str], List[Dict[str, str]]]: Parsed result as dict or list of dicts + """ + # Remove code block markers if present + text = re.sub(r'```.*?\n', '', text, flags=re.DOTALL) + text = re.sub(r'```', '', text) + + # Split by record headers + record_pattern = r'## record \d+' + record_sections = re.split(record_pattern, text) + + # Remove empty sections + record_sections = [section.strip() for section in record_sections if section.strip()] + + results = [] + for section in record_sections: + # Parse key-value pairs + kv_dict = {} + lines = section.strip().split('\n') + for line in lines: + if '=' in line: + key, value = line.split('=', 1) + kv_dict[key.strip()] = value.strip() + if kv_dict: # Only add non-empty dictionaries + results.append(kv_dict) + + # Return single dict if only one record, otherwise return list + if len(results) == 1: + return results[0] + return results + + def _format_input_parameters(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> str: + """ + Format input parameters for the user prompt. + + Args: + input_data: Input parameters as dict or list of dicts + + Returns: + str: Formatted string representation of input parameters + """ + if isinstance(input_data, list): + if not input_data: + return "No input parameters provided." + + formatted_parts = ["Input parameters (multiple records):"] + for i, record in enumerate(input_data): + formatted_parts.append(f"\nRecord {i}:") + for key, value in record.items(): + formatted_parts.append(f" - {key}: {value}") + return "\n".join(formatted_parts) + elif isinstance(input_data, dict): + if not input_data: + return "No input parameters provided." + + formatted_parts = ["Input parameters:"] + for key, value in input_data.items(): + formatted_parts.append(f" - {key}: {value}") + return "\n".join(formatted_parts) + else: + return f"Input parameters: {input_data}" + + def __call__(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> Union[Dict[str, str], List[Dict[str, str]]]: + """ + Execute the task with the given parameters. + + Args: + input_data: Input parameters for the task (dict or list of dicts) + + Returns: + Union[Dict[str, str], List[Dict[str, str]]]: The parsed result from the LLM + """ + # Build the user prompt with input parameters + user_prompt = self._format_input_parameters(input_data) + + # Build messages for LLM + messages = [ + {"role": "system", "content": self._build_system_prompt()}, + {"role": "user", "content": user_prompt} + ] + + # Call LLM + response = self.llm_client.chat(messages, self.sampling_params) + + # Parse and return result + return self._parse_markdown_kv(response) \ No newline at end of file diff --git a/astune/task_reader/tracing_reader/llm_client.py b/astune/task_reader/tracing_reader/llm_client.py new file mode 100644 index 00000000..fa253141 --- /dev/null +++ b/astune/task_reader/tracing_reader/llm_client.py @@ -0,0 +1,286 @@ +from abc import ABC, abstractmethod +import json +import os +import time +from typing import Any, Optional, Protocol, Iterator, Generator, cast + +from loguru import logger +import requests + +class LlmException(Exception): + def __init__(self,typ: str): + self._type=typ + + @property + def typ(self): + return self._type + + +class DashScopeClient: + """Aliyun DashScope API Client""" + + def __init__(self, api_key: Optional[str] = None, model_name: str = "qwen-plus", + temperature: float = 0.7, max_tokens: int = 2048): + self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY") + if not self.api_key: + raise ValueError("API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly.") + + self.model_name = model_name + self.temperature = temperature + self.max_tokens = max_tokens + self.base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1" + + self.headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json" + } + + def set_model(self, model_name: str): + """ + Sets the model name for the DashScopeClient instance. + + Args: + model_name (str): The name of the model to be used for API interactions. + """ + self.model_name = model_name # ⭐ Assigns the provided model name to the instance variable + + def chat(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> str: + """ + Sends a chat request to the LLM, aggregates the streaming responses, and returns the complete response. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. + sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the LLM. + + Returns: + str: The complete response from the LLM as a single string. + """ + res = "" + for x in self.chat_stream(messages, sampling_params): # ⭐ Aggregates the streaming responses into a single string + res += x + return res + + def chat_stream(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> Generator[str, None, None]: + """ + Initiates a streaming chat session and returns a generator that yields the response as it is being generated. + + Args: + messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. + sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the model. + + Returns: + Generator[str, None, None]: A generator that yields the response text as it is being generated. + """ + return self.chat_stream_with_retry(messages, **sampling_params) # ⭐ Calls the retry mechanism for streaming chat + + def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, **kwargs) -> str | Generator[str, None, None]: + """ + Sends a request to the chat completion API, supporting both non-streaming and streaming modes, and handles various exceptions. + + Args: + messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. + stream (bool, optional): If True, the response will be streamed. Defaults to False. + **kwargs: Additional parameters to be passed to the API. + + Returns: + str | Generator[str, None, None]: The full response text if not streaming, or a generator yielding the response text if streaming. + """ + url = f"{self.base_url}/chat/completions" + + # Merge parameters + params = { + "model": self.model_name, + "messages": messages, + "temperature": self.temperature, + "max_tokens": self.max_tokens, + "stream": stream, + **kwargs + } + + try: + if stream: + return self._handle_stream_response(url, params) # ⭐ Handles the streaming response + else: + return self._handle_normal_response(url, params) # ⭐ Handles the non-streaming response + + except requests.exceptions.RequestException as e: + logger.error(f"API request failed: {e}") + return "" if not stream else (x for x in []) + except json.JSONDecodeError as e: + logger.error(f"Failed to parse API response: {e}") + return "" if not stream else (x for x in []) + except Exception as e: + logger.error(f"Unexpected error in API call: {e}") + return "" if not stream else (x for x in []) + + def _handle_normal_response(self, url: str, params: dict) -> str: + """ + Handles the non-streaming (normal) response from the API. + + Args: + url (str): The URL to which the POST request is sent. + params (dict): The parameters to be included in the JSON body of the POST request. + + Returns: + str: The content of the first choice's message in the response, or an empty string if the response format is unexpected. + """ + response = requests.post(url, headers=self.headers, json=params, timeout=600) # ⭐ Sends the POST request to the API + if not response.ok: + # check inappropriate content + try: + error_json=response.json()['error'] + if "inappropriate content" in error_json['message']: + raise LlmException("inappropriate content") + if "limit" in error_json['message']: + raise LlmException("hit limit") + except LlmException as e: + raise + except: + logger.error(f"API request failed: {response.text}") + response.raise_for_status() + + result = response.json() + if "choices" in result and len(result["choices"]) > 0: + return result["choices"][0]["message"]["content"].strip() # ⭐ Extracts and returns the content of the first choice's message + else: + logger.error(f"Unexpected response format: {result}") + return "" + + def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None, None]: + """ + Handles the streaming response from a POST request to the specified URL. + + Args: + url (str): The URL to which the POST request is sent. + params (dict): The parameters to be sent with the POST request. + + Yields: + str: The content of the response, if it meets the specified conditions. + """ + response = requests.post(url, headers=self.headers, json=params, stream=True, timeout=600) # ⭐ Send the POST request and get the streaming response + if not response.ok: + # check inappropriate content + try: + error_json=response.json()['error'] + if "inappropriate content" in error_json['message']: + raise LlmException("inappropriate content") + if "limit" in error_json['message']: + raise LlmException("hit limit") + except LlmException as e: + raise + except: + logger.error(f"API request failed: {response.text}") + response.raise_for_status() + + for line in response.iter_lines(): + if line: + line = line.decode('utf-8') + if line.startswith('data: '): + data = line[6:] # remove the prefix 'data: ' + if data == '[DONE]': + break + + try: + chunk = json.loads(data) + if "choices" in chunk and len(chunk["choices"]) > 0: + choice = chunk["choices"][0] + if "delta" in choice and "content" in choice["delta"]: + content = choice["delta"]["content"] + if content: + yield content # ⭐ Yield the content if it meets the conditions + except json.JSONDecodeError: + continue # skip the bad line + + def chat_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, + retry_delay: float = 1.0, **kwargs) -> str: + """ + Sends a chat completion request to the LLM with a retry mechanism. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries for the chat. + max_retries (int, optional): Maximum number of retries. Defaults to 3. + retry_delay (float, optional): Initial delay between retries in seconds. Defaults to 1.0. + **kwargs: Additional keyword arguments to be passed to the `chat_completion` method. + + Returns: + str: The response from the LLM or a predefined message if all attempts fail. + """ + for attempt in range(max_retries): + try: + result = cast(str,self.chat_completion(messages, stream=False, **kwargs)) # ⭐ Attempt to get a chat completion + if result: # If a valid response is obtained + return result + + except LlmException as e: + if e.typ=='inappropriate content': + logger.warning(f"llm return inappropriate content, which is blocked by the remote") + return "[inappropriate content]" + except Exception as e: + logger.warning(f"Attempt {attempt + 1} failed: {e}") + + if attempt < max_retries - 1: # Not the last attempt + time.sleep(retry_delay * (2 ** attempt)) # Exponential backoff + + logger.error(f"All {max_retries} attempts failed") + return "" + + def chat_stream_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, + retry_delay: float = 10.0, **kwargs) -> Generator[str, None, None]: + """ + Attempts to establish a streaming chat completion with a retry mechanism. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. + max_retries (int, optional): The maximum number of retry attempts. Defaults to 3. + retry_delay (float, optional): The initial delay in seconds before the first retry. Defaults to 10.0. + **kwargs: Additional keyword arguments to pass to the chat_completion method. + + Yields: + str: Chunks of the streaming response. + """ + for attempt in range(max_retries): + try: + stream_generator = cast(Generator[str, None, None], self.chat_completion(messages, stream=True, **kwargs)) # ⭐ Cast the generator to the appropriate type + # try to fetch the first chunk to verify the connection + first_chunk = next(stream_generator, None) + if first_chunk is not None: + yield first_chunk + # yield the rest chunks + for chunk in stream_generator: + yield chunk + return # success + except LlmException as e: + if e.typ=='inappropriate content': + logger.warning(f"llm return inappropriate content, which is blocked by the remote") + yield "[inappropriate content]" + return + except Exception as e: + logger.warning(f"Stream attempt {attempt + 1} failed: {e}") + + if attempt < max_retries - 1: + time.sleep(retry_delay * (2 ** attempt)) + + logger.error(f"All {max_retries} stream attempts failed") + + return + + +# demo +if __name__ == "__main__": + client = DashScopeClient(model_name='qwq-32b') + + messages = [ + {"role": "user", "content": "Write a poem about Spring."} + ] + + # print("=== request ===") + # response = client.chat_completion(messages) + # print(response) + + print("\n=== streaming ===") + for chunk in client.chat_completion(messages, stream=True): + print(chunk, end='', flush=True) + + print("\n\n=== streaming with retry ===") + for chunk in client.chat_stream(messages, {}): + print(chunk, end='', flush=True) \ No newline at end of file diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 0a7ab36f..47de365d 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -7,6 +7,22 @@ astune: dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' training_split: "train" validation_split: "test" + + # example + tracing: + base_url: http://phoenix:port + train_output_path: /path/to/tasks.jsonl + filters: + - type: llm_evaluate + enabled: true + params: + custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" + temperature: 0.5 + max_tokens: 2048 + print_reason: false + + + task_judge: # ✨✨✨✨ 编写并选择评价函数 diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py new file mode 100644 index 00000000..879adb8a --- /dev/null +++ b/tests/test_tracing_reader.py @@ -0,0 +1,125 @@ +import json +from pathlib import Path +from typing import List + +import pytest + +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task + + +class DummyConnector: + def __init__(self, tasks: List[Task]): + self._tasks = tasks + self.called = 0 + + def load_tasks_from_conversation(self, projects_limit: int = 100, spans_limit: int = 100) -> List[Task]: + self.called += 1 + return self._tasks + + +class DummyFilter: + def __init__(self, kept: List[Task]): + self._kept = kept + self.last_input: List[Task] | None = None + + def filter(self, tasks: List[Task]) -> List[Task]: + self.last_input = list(tasks) + return self._kept + + +def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: + metadata = {"answer": answer} + if qa_hash is not None: + metadata["qa_hash"] = qa_hash + return Task( + main_query=query, + task_id="tid", + env_type="env", + metadata=metadata, + ) + + +@pytest.fixture +def config(tmp_path: Path) -> dict: + return { + "base_url": "http://example.com", + "train_output_path": str(tmp_path / "tasks.jsonl"), + } + + +def test_get_training_tasks_new_file(config: dict): + # prepare tasks returned from connector + t1 = _make_task("q1", "a1", "h1") + t2 = _make_task("q2", "a2", "h2") + tasks = [t1, t2] + + connector = DummyConnector(tasks) + flt = DummyFilter(kept=tasks) + + reader = TracingReader(config) # type: ignore + reader._connector = connector # type: ignore[attr-defined] + reader._filters = [flt] # type: ignore[attr-defined] + + result = reader.get_training_tasks() + + # connector should be called once + assert connector.called == 1 + + # filter should receive all new tasks + assert flt.last_input == tasks + + # returned tasks should be exactly the filtered ones + assert result == tasks + + # file should be created with one json per line + out_path = Path(config["train_output_path"]) + assert out_path.exists() + with out_path.open("r", encoding="utf-8") as f: + lines = [json.loads(line) for line in f if line.strip()] + assert len(lines) == 2 + assert {obj["metadata"]["qa_hash"] for obj in lines} == {"h1", "h2"} + + +def test_get_training_tasks_dedup_and_missing_hash_ignored(config: dict): + out_path = Path(config["train_output_path"]) + + # existing task with hash h1 + existing = _make_task("q_exist", "a_exist", "h1") + out_path.parent.mkdir(parents=True, exist_ok=True) + with out_path.open("w", encoding="utf-8") as f: + f.write(json.dumps(existing.model_dump(), ensure_ascii=False) + "\n") + + # connector returns: duplicate (h1), new (h2), and one without qa_hash + dup = _make_task("q_dup", "a_dup", "h1") + new = _make_task("q_new", "a_new", "h2") + no_hash = _make_task("q_nohash", "a_nohash", None) + connector_tasks = [dup, new, no_hash] + + # filter will keep everything it receives so we can test input to filter + flt = DummyFilter(kept=[new]) + connector = DummyConnector(connector_tasks) + + reader = TracingReader(config) # type: ignore + reader._connector = connector # type: ignore[attr-defined] + reader._filters = [flt] # type: ignore[attr-defined] + + result = reader.get_training_tasks() + + # existing task plus new filtered task should be returned + assert len(result) == 2 + assert existing in result + assert new in result + + # filter should see only new tasks with non-duplicate hashes => [new] + assert flt.last_input == [new] + + # output file should now contain existing + new filtered + with out_path.open("r", encoding="utf-8") as f: + objs = [json.loads(line) for line in f if line.strip()] + + hashes = [obj["metadata"].get("qa_hash") for obj in objs] + assert "h1" in hashes + assert "h2" in hashes + # no record without hash should be written + assert None not in hashes From e0310ddb2b61999302a1aae68feb11fabdab171f Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 17 Nov 2025 23:22:46 +0800 Subject: [PATCH 043/462] Enhance error handling in actor configuration and improve logger initialization; update align_parameters function to include backbone parameter. --- astune/backbone_others/trainer.py | 9 +++-- .../trinity/trinity_launch.yaml | 4 ++ astune/parallel_env.py | 37 ++++++++++++------- astune/task_rollout/async_llm_bridge.py | 16 ++++++++ launcher.py | 12 +++--- 5 files changed, 55 insertions(+), 23 deletions(-) diff --git a/astune/backbone_others/trainer.py b/astune/backbone_others/trainer.py index b389f974..649b7dbf 100644 --- a/astune/backbone_others/trainer.py +++ b/astune/backbone_others/trainer.py @@ -16,6 +16,7 @@ import json import os import uuid +import hydra import warnings from collections import defaultdict from copy import deepcopy @@ -597,9 +598,11 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): ) # Actor validation done in ActorConfig.__post_init__ and validate() - actor_config = omega_conf_to_dataclass(config.actor_rollout_ref.actor) - actor_config.validate(n_gpus, config.astune.data.train_batch_size, config.actor_rollout_ref.model) - + try: + actor_config = omega_conf_to_dataclass(config.actor_rollout_ref.actor) + actor_config.validate(n_gpus, config.astune.data.train_batch_size, config.actor_rollout_ref.model) + except hydra.errors.InstantiationException as e: + raise ValueError(f"You are using an unsupported VERL version. Please read `documents/backbones.md`") if not config.actor_rollout_ref.actor.use_dynamic_bsz: if self.use_reference_policy: # reference: log_prob_micro_batch_size vs. log_prob_micro_batch_size_per_gpu diff --git a/astune/default_config/trinity/trinity_launch.yaml b/astune/default_config/trinity/trinity_launch.yaml index 7340446e..363fb0f3 100644 --- a/astune/default_config/trinity/trinity_launch.yaml +++ b/astune/default_config/trinity/trinity_launch.yaml @@ -1,3 +1,7 @@ +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD + algorithm: algorithm_type: multi_step_grpo optimizer: diff --git a/astune/parallel_env.py b/astune/parallel_env.py index d8db5aed..f855fdce 100644 --- a/astune/parallel_env.py +++ b/astune/parallel_env.py @@ -43,7 +43,7 @@ from transformers.tokenization_utils import PreTrainedTokenizer from astune.task_rollout.async_llm_bridge import AsyncLlmBridge -def init_logger(experiment_name): +def init_parallel_rollout_logger(experiment_name): """Initialize the logger with the given configuration.""" from beast_logger import register_logger if 'BEST_LOGGER_INIT' in os.environ: return # prevent re-initialization in ray environment @@ -55,13 +55,7 @@ def init_logger(experiment_name): register_logger(mods=["evaluation", "exception"], non_console_mods=non_console_mods, auto_clean_mods=[], base_log_path=final_log_path, debug=False) -class StepPrinter(AsyncLlmBridge): - """Utility mixin providing periodic progress / throughput printing. - - Tracks token generation speed and thread step distribution. Intended to be - composed with rollout manager classes that maintain an observation window - (`obs_window`) containing per-thread step, token and stop flags. - """ +class BaseParallelEnv(object): def __init__( self, @@ -70,7 +64,7 @@ def __init__( max_parallel: int, max_llm_retries: int = 3, tokenizer: PreTrainedTokenizer = None, # type: ignore - llm_mode="local", + llm_mode: Literal["local", "remote", "trinity"] = "local", **kwargs ): """Initialize the step printer. @@ -87,14 +81,14 @@ def __init__( Maximum retries for LLM calls, by default 3. tokenizer : PreTrainedTokenizer, optional Tokenizer used for padding and ID conversions. - llm_mode : str, optional + llm_mode : Literal["local", "remote", "trinity"], optional Indicates backend mode (e.g., 'local', 'remote'), default 'local'. **kwargs : Any Additional parameters passed through for future extensions. """ - init_logger(experiment_name=config.astune.experiment_name) - self.llm_mode = llm_mode + init_parallel_rollout_logger(experiment_name=config.astune.experiment_name) + self.llm_mode: Literal["local", "remote", "trinity"] = llm_mode self.config: DictConfig = config self.async_rollout_manager = async_rollout_manager self.max_parallel: int = max_parallel @@ -104,8 +98,23 @@ def __init__( self.pad_token_id = self.tokenizer.pad_token_id self.current_token = 0 self.current_global_steps = "NA" + self.async_llm_bridge = AsyncLlmBridge( + config=config, + async_rollout_manager=async_rollout_manager, + tokenizer=tokenizer, + llm_mode=llm_mode, + max_llm_retries=max_llm_retries + ) +class StepPrinter(BaseParallelEnv): + """Utility mixin providing periodic progress / throughput printing. + + Tracks token generation speed and thread step distribution. Intended to be + composed with rollout manager classes that maintain an observation window + (`obs_window`) containing per-thread step, token and stop flags. + """ + def step_status_printer(self, obs_window): """Print aggregated rollout progress. @@ -150,7 +159,7 @@ def step_status_printer(self, obs_window): print_buf += [f"[finished]:{count} threads"] print(f"Rollout progress ({token_gen_per_sec_str}): " + " // ".join(print_buf)) -class StaticRollout(StepPrinter, AsyncLlmBridge): +class StaticRollout(StepPrinter): """Static (non-dynamic) rollout manager. Submits a fixed number of rollout threads per task and waits for all to @@ -215,7 +224,7 @@ def get_sample_params(): max_retry = 3 for retry in range(max_retry): try: - llm_chat_fn = self.get_llm_chat_fn(get_sample_params()) + llm_chat_fn = self.async_llm_bridge.get_llm_chat_fn(get_sample_params()) cmt: CMTBaseAttr = EnvWorker( task_core_arg=TaskLaunchCoreArgument( env_type=task.env_type, diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 8900bca4..026f2f5f 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -27,6 +27,19 @@ class AsyncLlmBridge(object): + def __init__( + self, + config: DictConfig, + async_rollout_manager: Any, + tokenizer: Any, + llm_mode: Literal["local", "remote", "trinity"] = "local", + max_llm_retries: int = 3 + ): + self.config = config + self.async_rollout_manager = async_rollout_manager + self.tokenizer = tokenizer + self.llm_mode = llm_mode + self.max_llm_retries = max_llm_retries def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: def llm_chat( @@ -52,6 +65,9 @@ def llm_chat( else: prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True) + from vsdb import bp + bp("TT") + final_res = run_async_coro__no_matter_what(self.async_rollout_manager.generate( request_id=request_id, prompt_ids=prompt_ids, diff --git a/launcher.py b/launcher.py index 85601a53..42ad8ed1 100644 --- a/launcher.py +++ b/launcher.py @@ -272,7 +272,7 @@ def start_ray_service(args, env): import yaml -def align_parameters(from_config_fp, to_config_fp, convertion_json_fg): +def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone): # read yaml files with open(from_config_fp, 'r') as file: from_config = yaml.safe_load(file) @@ -311,7 +311,7 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg): logger.success("----------------------------------------------------") - if 'trinity' in from_config: + if ('trinity' in from_config) and backbone == "trinity": trinity_config = from_config['trinity'] def recursive_copy(src_dict, dst_dict, parent_key=""): for key, value in src_dict.items(): @@ -351,17 +351,17 @@ def execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_bas # let's begin the training process if args.backbone == "trinity": # replace boot yaml - trinity_boot_yaml = "astune/default_config/trinity/trinity_launch.yaml" # THIS ONE IS READ ONLY, and ALWAYS FIXED + TRINITY_BOOT_YAML = "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + '/trinity_launch.yaml' - shutil.copyfile(trinity_boot_yaml, redirect_trinity_boot_yaml) - align_parameters(yaml_backup_dst, redirect_trinity_boot_yaml, 'astune/default_config/trinity/config_auto_convertion_trinity.json') + shutil.copyfile(TRINITY_BOOT_YAML, redirect_trinity_boot_yaml) + align_parameters(yaml_backup_dst, redirect_trinity_boot_yaml, 'astune/default_config/trinity/config_auto_convertion_trinity.json', args.backbone) cmd = [ sys.executable, '-m', backbone_target, 'run', '--config', redirect_trinity_boot_yaml ] else: - align_parameters(yaml_backup_dst, yaml_backup_dst, 'astune/default_config/verl/config_auto_convertion_verl.json') + align_parameters(yaml_backup_dst, yaml_backup_dst, 'astune/default_config/verl/config_auto_convertion_verl.json', args.backbone) cmd = [ sys.executable, '-m', backbone_target, From c794d0267fb54d65aa61119e58236e16a27eda86 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 17 Nov 2025 23:36:51 +0800 Subject: [PATCH 044/462] refactor --- astune/context_manager/agentflow_cm/cmt_context_clip.py | 2 +- astune/context_manager/agentflow_cm/cmt_sliding_window.py | 2 +- astune/context_manager/agentscope_cm/cmt_multi_sample.py | 2 +- astune/context_manager/agentscope_cm/cmt_request_proxy.py | 4 ++-- astune/task_judge/math_answer_as_judge.py | 4 ++-- .../dashscope_llm_bridge.py} | 0 6 files changed, 7 insertions(+), 7 deletions(-) rename astune/{context_manager/agentflow_cm/cmt_foreign_llm.py => task_rollout/dashscope_llm_bridge.py} (100%) diff --git a/astune/context_manager/agentflow_cm/cmt_context_clip.py b/astune/context_manager/agentflow_cm/cmt_context_clip.py index 0b4c1095..93bfdf1a 100644 --- a/astune/context_manager/agentflow_cm/cmt_context_clip.py +++ b/astune/context_manager/agentflow_cm/cmt_context_clip.py @@ -6,7 +6,7 @@ from typing import List, Callable from beast_logger import print_dict, print_listofdict from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT -from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn +from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn from textwrap import dedent from openai import OpenAI from loguru import logger diff --git a/astune/context_manager/agentflow_cm/cmt_sliding_window.py b/astune/context_manager/agentflow_cm/cmt_sliding_window.py index 250cb1f5..c49f78ff 100644 --- a/astune/context_manager/agentflow_cm/cmt_sliding_window.py +++ b/astune/context_manager/agentflow_cm/cmt_sliding_window.py @@ -181,7 +181,7 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= def llm_memory_extraction(self, msg_list: List[ExtendedMessage]) -> str: """Use LLM to extract memory from previous messages. """ - from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn + from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn from textwrap import dedent self.alien_llm_chat_fn: Callable = construct_alien_llm_chat_fn(self.config, self.config.actor_rollout_ref.rollout) messages = self.to_role_content(msg_list) diff --git a/astune/context_manager/agentscope_cm/cmt_multi_sample.py b/astune/context_manager/agentscope_cm/cmt_multi_sample.py index 1b9c4ff3..c3b81c07 100644 --- a/astune/context_manager/agentscope_cm/cmt_multi_sample.py +++ b/astune/context_manager/agentscope_cm/cmt_multi_sample.py @@ -12,7 +12,7 @@ from typing import Any, List, Tuple, Union from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem -class ASTuneContextTemplate(CMTLinear): +class ASTuneContextTracking(CMTLinear): def __init__( self, diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py index ff9bde2f..8cc6a482 100644 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ b/astune/context_manager/agentscope_cm/cmt_request_proxy.py @@ -10,7 +10,7 @@ from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.agentscope_cm.cmt_multi_sample import ASTuneContextTemplate +from astune.context_manager.agentscope_cm.cmt_multi_sample import ASTuneContextTracking from astune.context_manager.agentscope_cm.timeline_merging import can_merge_steps from typing import Any, List, Type, Dict @@ -21,7 +21,7 @@ def remove_fields(d: Dict, fields: List[str]) -> Dict: d.pop(field.strip(), None) return d -class ASTuneLmProxy(ASTuneContextTemplate): +class ASTuneLmProxy(ASTuneContextTracking): async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: # load messages into `self.full_context` diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index a944980f..c39651f9 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -1,5 +1,6 @@ -from astune.task_judge.judge_base import JudgeBase import re +from astune.task_judge.judge_base import JudgeBase +from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn class MathAnswerAsJudge(JudgeBase): @@ -41,7 +42,6 @@ def compute_reward(self, judge_input_dictionary) -> tuple: task_core_arg = judge_input_dictionary['task_core_arg'] reference_answer = task_core_arg.task.metadata['answer'] - from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn alien_llm_chat_fn = construct_alien_llm_chat_fn(self.config) messages = [ { diff --git a/astune/context_manager/agentflow_cm/cmt_foreign_llm.py b/astune/task_rollout/dashscope_llm_bridge.py similarity index 100% rename from astune/context_manager/agentflow_cm/cmt_foreign_llm.py rename to astune/task_rollout/dashscope_llm_bridge.py From f8af956de80960654547996bc7d73dc7b202ef7c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 17 Nov 2025 23:57:08 +0800 Subject: [PATCH 045/462] remove useless import --- astune/backbone_others/trainer.py | 26 ---- astune/backbone_trinity/register_flow.py | 37 ++---- astune/task_reader/__init__.py | 2 - astune/task_reader/env_service_reader.py | 1 - astune/task_reader/hf_dataset_reader.py | 2 - astune/task_reader/jsonl_reader.py | 2 - astune/task_reader/task_reader_base.py | 2 - astune/utils/process_dataset.py | 120 +----------------- .../workflow_controller/classic_agentflow.py | 4 +- 9 files changed, 15 insertions(+), 181 deletions(-) diff --git a/astune/backbone_others/trainer.py b/astune/backbone_others/trainer.py index 649b7dbf..2b503120 100644 --- a/astune/backbone_others/trainer.py +++ b/astune/backbone_others/trainer.py @@ -1602,7 +1602,6 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): def get_eval_dataset(self): - from astune.utils.process_dataset import create_rl_dataset if self.config.astune.task_reader.type == 'env_service': if self.config.astune.task_reader.env_service.env_type == "appworld": if hasattr(self, 'main_val_dataset'): @@ -1613,30 +1612,5 @@ def get_eval_dataset(self): tasks = task_reader.get_validation_tasks() self.main_val_dataset = tasks return self.main_val_dataset, None, None - - # elif self.config.env_service.env_type == "webshop": - # if hasattr(self, 'main_val_dataset'): - # return self.main_val_dataset, None, None - # else: - # config = self.config - # self.main_val_dataset = create_rl_dataset(config.data.val_files, config.data, self.tokenizer, processor=None, is_train=False, env_config=config.env_service) - # # self.test_normal_dataset = create_rl_dataset(config.data.val_files, config.data, self.tokenizer, processor=None, is_train=False, env_config=config.env_service) - # if config.data.fast_eval: # 使用一个小测试集 - # self.main_val_dataset.dataframe = self.main_val_dataset.dataframe.shuffle(seed=42).select(range(100)) # limit to 100 samples - # return self.main_val_dataset, None, None - # else: - # self.main_val_dataset.dataframe = self.main_val_dataset.dataframe.shuffle(seed=42).select(range(500)) # limit to 100 samples - # return self.main_val_dataset, None, None - - # elif self.config.env_service.env_type == "crafters": - # if hasattr(self, 'main_val_dataset'): - # return self.main_val_dataset, None, None - # else: - # config = self.config - # self.main_val_dataset = create_rl_dataset(config.data.val_files, config.data, self.tokenizer, processor=None, is_train=False, env_config=config.env_service) - # # self.test_normal_dataset = create_rl_dataset(config.data.val_files, config.data, self.tokenizer, processor=None, is_train=False, env_config=config.env_service) - # self.main_val_dataset.dataframe = self.main_val_dataset.dataframe.shuffle(seed=42).select(range(10)) # limit to 100 samples - # return self.main_val_dataset, None, None - else: raise NotImplementedError \ No newline at end of file diff --git a/astune/backbone_trinity/register_flow.py b/astune/backbone_trinity/register_flow.py index a7a0c850..f8699d3c 100644 --- a/astune/backbone_trinity/register_flow.py +++ b/astune/backbone_trinity/register_flow.py @@ -1,45 +1,37 @@ import os import uuid -import hydra import openai -import numpy as np -import asyncio, uuid, copy import threading from trinity.common.experience import Experience from trinity.common.models.model import ModelWrapper from trinity.common.workflows.workflow import WORKFLOWS, Task, Workflow -from trinity.common.workflows.agentscope.react.templates import TEMPLATE_MAP -from transformers import AutoTokenizer -from concurrent.futures import ThreadPoolExecutor -from typing import Dict, List, Literal, Callable, Union, Optional +from typing import List, Literal, Optional from loguru import logger -from omegaconf import DictConfig -from tensordict import TensorDict -from torch.nn.utils.rnn import pad_sequence -from tqdm import tqdm -from verl import DataProto -from verl.utils.torch_functional import pad_sequence_to_length -from beast_logger import register_logger, print_dict, print_listofdict from astune.schema.task import Task -from astune.utils.utils import run_async_coro__no_matter_what +from transformers import AutoTokenizer from astune.parallel_env import DynamicRollout -from astune.schema.logprob import TokenAndProb -from astune.schema.task import Task from astune.schema.trajectory import Sample from astune.utils.config_utils import read_astune_config -from omegaconf import OmegaConf from astune.context_manager.cmt_base_attr import CMTBaseAttr class TrinityCompatWorkflow(DynamicRollout): - def __init__(self, task, llm_handle, tokenizer, config, llm_mode="trinity", **kwargs): + def __init__( + self, + task, + llm_handle, + tokenizer, + config, + llm_mode: Literal['local', 'remote', 'trinity'] = "trinity", + **kwargs + ): self.task = task self.trinity_llm_model_client = llm_handle self.tokenizer = tokenizer self.config = config - self.llm_mode = "trinity" + self.llm_mode = llm_mode super().__init__( config=self.config, @@ -83,9 +75,6 @@ def thread_worker(self): ) def run_in_new_thread(self) -> CMTBaseAttr: - # begin self.thread_worker in a new thread - # then wait for it to finish, and get the result - result_holder = {} exc_holder = {} @@ -125,9 +114,7 @@ def __init__( self.config = config self.task = task - # 模拟openai的异步客户端 self.model_client = model.get_openai_async_client() - # task_type 用于获取奖励函数 # extract the query and the answer from the task self.query = task.raw_task.get(task.format_args.prompt_key) # type: ignore [index] self.answer = task.raw_task.get(task.format_args.response_key) # type: ignore [index] diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index 50a92775..1155c987 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -5,8 +5,6 @@ import numpy as np from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler -from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.env_service_reader import TaskReaderEnvService from astune.task_reader.hf_dataset_reader import TaskReaderHuggingFace diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index d9a0eb85..c51aa94d 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -4,7 +4,6 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py index 00d716f9..f5b7ae98 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astune/task_reader/hf_dataset_reader.py @@ -4,8 +4,6 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler -from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index 777cd10b..8902fb56 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -4,8 +4,6 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler -from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_reader/task_reader_base.py b/astune/task_reader/task_reader_base.py index ecc49297..69b6c972 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astune/task_reader/task_reader_base.py @@ -4,8 +4,6 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.utils.process_dataset import create_rl_dataset, create_rl_sampler -from astune.env_service_client.env_client_ng import EnvClient class TaskReaderBase: diff --git a/astune/utils/process_dataset.py b/astune/utils/process_dataset.py index 721d8cc6..27b2318e 100644 --- a/astune/utils/process_dataset.py +++ b/astune/utils/process_dataset.py @@ -16,130 +16,12 @@ import time import datasets from datasets import Dataset +from omegaconf import DictConfig from torch.utils.data import Dataset as TorchDataset from torch.utils.data import RandomSampler, SequentialSampler - -from verl.utils.dataset.rl_dataset import RLHFDataset from verl.utils.import_utils import load_extern_type from verl.experimental.dataset.sampler import AbstractSampler - - from typing import List, Optional, Union, Dict, Any -from transformers.processing_utils import ProcessorMixin -from omegaconf import DictConfig - - -class EnvServiceDataset(RLHFDataset): - """Dataset class that handles environment service data loading and processing.""" - - def __init__(self, - data_files: List[str], - tokenizer, - processor: Optional[ProcessorMixin], - config: DictConfig, - env_config: Optional[DictConfig] = None): - """Initialize the EnvServiceDataset. - - Args: - data_files: List of data file paths - tokenizer: The tokenizer to use - processor: The processor to use for multimodal data - config: Configuration for dataset - env_config: Configuration for environment service - """ - self.config = config - self.env_config = env_config or {} - super().__init__(data_files, tokenizer, config, processor) - - def _read_files_and_tokenize(self): - env_url = self.env_config.env_url - env_type = self.env_config.env_type - dataframes = [] - - from astune.env_service_client.env_client_ng import EnvClient - for parquet_file in self.data_files: - # read parquet files and cache - if 'train(read_from_env_service)' in parquet_file: - split = 'train' - elif 'val(read_from_env_service)' in parquet_file: - split = 'test' - split = 'dev' # or test_normal - else: - raise ValueError(f"Unsupported split: {parquet_file}") - env_service_client = EnvClient(base_url=env_url) - task_id_array = env_service_client.get_env_profile(env_type, split=split) - if len(task_id_array) == 0: - raise ValueError(f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}") - data = { - 'data_source': [env_type for task_id in task_id_array], - 'prompt': ['not available' for task_id in task_id_array], - 'reward_model': [{} for task_id in task_id_array], - 'extras': [{'task_id': task_id} for task_id in task_id_array], - } - dataframe = Dataset.from_dict(data) - dataframes.append(dataframe) - - self.dataframe: datasets.Dataset = datasets.concatenate_datasets(dataframes) - print(f"dataset len: {len(self.dataframe)}") - self.dataframe = self.maybe_filter_out_long_prompts(self.dataframe) - - -def create_rl_dataset( - data_paths: List[str], - data_config: DictConfig, - tokenizer, - processor: Optional[ProcessorMixin], - is_train: bool = True, - env_config: Optional[DictConfig] = None -) -> TorchDataset: - """Create a dataset. - - Arguments: - data_paths: List of paths to data files. - data_config: The data config. - tokenizer (Tokenizer): The tokenizer. - processor (Processor): The processor. - is_train (bool): Whether this is for training or validation. - env_config: Environment configuration. - - Returns: - dataset (Dataset): The dataset. - """ - - # Check if a custom dataset class is specified in the data configuration - # and if the path to the custom class is provided - if "custom_cls" in data_config and data_config.custom_cls.get("path", None) is not None: - # Dynamically load the custom dataset class - dataset_cls = load_extern_type(data_config.custom_cls.path, data_config.custom_cls.name) - # Verify that the custom dataset class inherits from torch.utils.data.Dataset - if not issubclass(dataset_cls, TorchDataset): - raise TypeError( - f"The custom dataset class '{data_config.custom_cls.name}' from " - f"'{data_config.custom_cls.path}' must inherit from torch.utils.data.Dataset" - ) - - elif "datagen" in data_config and data_config.datagen.get("path", None) is not None and is_train: - # If a data generation strategy is specified, use the DynamicGenDataset class - from verl.utils.dataset.dynamicgen_dataset import DynamicGenDataset - dataset_cls = DynamicGenDataset - print("Using DynamicGenDataset for data generation.") - - else: - # Use EnvServiceDataset - dataset_cls = EnvServiceDataset - print(f"Using dataset class: {dataset_cls.__name__}") - - # Instantiate the dataset using the determined dataset class - print('using', dataset_cls) - dataset = dataset_cls( - data_files=data_paths, - tokenizer=tokenizer, - processor=processor, - config=data_config, - env_config=env_config, - ) - - return dataset def create_rl_sampler( diff --git a/astune/workflow_controller/classic_agentflow.py b/astune/workflow_controller/classic_agentflow.py index 9b3a5989..848f45a7 100644 --- a/astune/workflow_controller/classic_agentflow.py +++ b/astune/workflow_controller/classic_agentflow.py @@ -1,5 +1,6 @@ -import time import os +import time +import threading from loguru import logger from astune.env_service_client.env_client import EnvClient @@ -12,7 +13,6 @@ from astune.workflow_controller.basic_agentflow import BaseAgentFlow from typing import Any, Dict, List, Union, Callable from beast_logger import print_listofdict -import threading log_generate_lock = threading.Lock() From 7a87cc109339c76f3918fbb201c9d0dd70434957 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 18 Nov 2025 00:05:57 +0800 Subject: [PATCH 046/462] re-locate --- astune/backbone/__init__.py | 1 + .../trainer.py => backbone/native_compat_trainer.py} | 0 .../register_flow.py => backbone/trinity_compat_workflow.py} | 0 astune/backbone_trinity/__init__.py | 1 - astune/main_trinity.py | 2 +- astune/main_verl.py | 4 ++-- 6 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 astune/backbone/__init__.py rename astune/{backbone_others/trainer.py => backbone/native_compat_trainer.py} (100%) rename astune/{backbone_trinity/register_flow.py => backbone/trinity_compat_workflow.py} (100%) delete mode 100644 astune/backbone_trinity/__init__.py diff --git a/astune/backbone/__init__.py b/astune/backbone/__init__.py new file mode 100644 index 00000000..e9692828 --- /dev/null +++ b/astune/backbone/__init__.py @@ -0,0 +1 @@ +from astune.backbone.trinity_compat_workflow import * \ No newline at end of file diff --git a/astune/backbone_others/trainer.py b/astune/backbone/native_compat_trainer.py similarity index 100% rename from astune/backbone_others/trainer.py rename to astune/backbone/native_compat_trainer.py diff --git a/astune/backbone_trinity/register_flow.py b/astune/backbone/trinity_compat_workflow.py similarity index 100% rename from astune/backbone_trinity/register_flow.py rename to astune/backbone/trinity_compat_workflow.py diff --git a/astune/backbone_trinity/__init__.py b/astune/backbone_trinity/__init__.py deleted file mode 100644 index 5ab258fe..00000000 --- a/astune/backbone_trinity/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from astune.backbone_trinity.register_flow import * \ No newline at end of file diff --git a/astune/main_trinity.py b/astune/main_trinity.py index 6864c830..ab55a6d6 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -23,7 +23,7 @@ from trinity.utils.plugin_loader import load_plugins # register trinity backbone modules -import astune.backbone_trinity.register_flow # noqa: F401 +import astune.backbone.trinity_compat_workflow # noqa: F401 logger = get_logger(__name__) diff --git a/astune/main_verl.py b/astune/main_verl.py index 8e618935..6f2b30b2 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -188,7 +188,7 @@ def run(self, config): else: raise NotImplementedError - from astune.backbone_others.trainer import ResourcePoolManager, Role + from astune.backbone.native_compat_trainer import ResourcePoolManager, Role # Map roles to their corresponding remote worker classes. role_worker_mapping = { @@ -247,7 +247,7 @@ def run(self, config): train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from astune.backbone_others.trainer import ASTuneRayPPOTrainer + from astune.backbone.native_compat_trainer import ASTuneRayPPOTrainer # Initialize the PPO trainer. trainer = ASTuneRayPPOTrainer( config=config, From 35f22f09ca4e76e0a6d5abd18c29087fd853c42d Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 18 Nov 2025 00:42:53 +0800 Subject: [PATCH 047/462] split parallel worker --- astune/backbone/native_compat_trainer.py | 2 +- astune/backbone/trinity_compat_workflow.py | 2 +- astune/main_vllm.py | 2 +- astune/task_rollout/__init__.py | 2 + .../native_parallel_worker.py} | 412 ++---------------- astune/task_rollout/single_worker.py | 162 +++++++ 6 files changed, 212 insertions(+), 370 deletions(-) create mode 100644 astune/task_rollout/__init__.py rename astune/{parallel_env.py => task_rollout/native_parallel_worker.py} (54%) create mode 100644 astune/task_rollout/single_worker.py diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index 2b503120..1c48884e 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -59,7 +59,7 @@ from verl.utils.tracking import ValidationGenerationsLogger -from astune.parallel_env import ParallelEnvManager +from astune.task_rollout.native_parallel_worker import ParallelEnvManager from astune.schema.task import Task from astune.schema.trajectory import Trajectory from astune.utils.message import send_train_message diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index f8699d3c..ca544057 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -10,7 +10,7 @@ from loguru import logger from astune.schema.task import Task from transformers import AutoTokenizer -from astune.parallel_env import DynamicRollout +from astune.task_rollout.native_parallel_worker import DynamicRollout from astune.schema.trajectory import Sample from astune.utils.config_utils import read_astune_config from astune.context_manager.cmt_base_attr import CMTBaseAttr diff --git a/astune/main_vllm.py b/astune/main_vllm.py index da813aad..af82b422 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -6,7 +6,7 @@ from types import SimpleNamespace from astune.schema.task import Task from beast_logger import register_logger -from astune.parallel_env import ParallelEnvManager +from astune.task_rollout.native_parallel_worker import ParallelEnvManager from astune.utils.sms_agent import send_train_message class TokenAndProb: diff --git a/astune/task_rollout/__init__.py b/astune/task_rollout/__init__.py new file mode 100644 index 00000000..b3183726 --- /dev/null +++ b/astune/task_rollout/__init__.py @@ -0,0 +1,2 @@ +"""Task rollout helper modules.""" + diff --git a/astune/parallel_env.py b/astune/task_rollout/native_parallel_worker.py similarity index 54% rename from astune/parallel_env.py rename to astune/task_rollout/native_parallel_worker.py index f855fdce..7a44bd0e 100644 --- a/astune/parallel_env.py +++ b/astune/task_rollout/native_parallel_worker.py @@ -1,139 +1,36 @@ -"""Parallel environment rollout utilities. - -This module contains classes that manage parallel LLM-based environment rollouts -for tasks. Core responsibilities include: - -1. Submitting and monitoring multiple environment worker threads. -2. Dynamically oversampling rollouts and performing early termination when - sufficient statistical confidence is reached. -3. Aggregating and converting collected trajectories into sample objects and - finally into a `DataProto` batch ready for training. -4. Providing progress instrumentation (token generation rate, step buckets). - -None of the implementation logic is modified here; only documentation and -English translations for previously non‑English comments are added. -""" +"""Parallel environment rollout orchestration utilities.""" import os -import copy import time -import numpy as np -import torch -import uuid -import asyncio from concurrent.futures import ThreadPoolExecutor -from typing import Dict, List, Literal, Callable, Any +from typing import List, Literal from urllib.parse import quote + +import numpy as np +import torch from loguru import logger -from omegaconf import DictConfig from tensordict import TensorDict from torch.nn.utils.rnn import pad_sequence from tqdm import tqdm from verl import DataProto from verl.utils.torch_functional import pad_sequence_to_length -from astune.workflow_controller.classic_agentflow import AgentFlow -from astune.workflow_controller.classic_agentflow import BaseAgentFlow -from astune.task_rollout.env_worker import EnvWorker -from astune.schema.task import Task, TaskLaunchCoreArgument + +from astune.context_manager.cmt_linear import CMTLinear +from astune.schema.task import Task from astune.schema.trajectory import Sample -from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr -from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow -from astune.utils.utils import run_async_coro__no_matter_what -from astune.schema.logprob import TokenAndProb -from transformers.tokenization_utils import PreTrainedTokenizer -from astune.task_rollout.async_llm_bridge import AsyncLlmBridge - -def init_parallel_rollout_logger(experiment_name): - """Initialize the logger with the given configuration.""" - from beast_logger import register_logger - if 'BEST_LOGGER_INIT' in os.environ: return # prevent re-initialization in ray environment - os.environ['BEST_LOGGER_INIT'] = '1' - from datetime import datetime - final_log_path = os.path.join( "launcher_record", experiment_name, datetime.now().strftime("%Y_%m_%d_%H_%M") ) - os.environ['BEST_LOGGER_PATH'] = final_log_path - non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] - register_logger(mods=["evaluation", "exception"], non_console_mods=non_console_mods, auto_clean_mods=[], base_log_path=final_log_path, debug=False) - - -class BaseParallelEnv(object): - - def __init__( - self, - config: DictConfig, - async_rollout_manager, - max_parallel: int, - max_llm_retries: int = 3, - tokenizer: PreTrainedTokenizer = None, # type: ignore - llm_mode: Literal["local", "remote", "trinity"] = "local", - **kwargs - ): - """Initialize the step printer. - - Parameters - ---------- - config : DictConfig - Configuration object containing rollout and experiment settings. - async_rollout_manager : Any - Manager responsible for async LLM interactions. - max_parallel : int - Maximum number of parallel environment worker threads. - max_llm_retries : int, optional - Maximum retries for LLM calls, by default 3. - tokenizer : PreTrainedTokenizer, optional - Tokenizer used for padding and ID conversions. - llm_mode : Literal["local", "remote", "trinity"], optional - Indicates backend mode (e.g., 'local', 'remote'), default 'local'. - **kwargs : Any - Additional parameters passed through for future extensions. - """ - - init_parallel_rollout_logger(experiment_name=config.astune.experiment_name) - self.llm_mode: Literal["local", "remote", "trinity"] = llm_mode - self.config: DictConfig = config - self.async_rollout_manager = async_rollout_manager - self.max_parallel: int = max_parallel - self.max_llm_retries: int = max_llm_retries - self.rollout_n = config.astune.rollout.num_repeat - self.tokenizer = tokenizer - self.pad_token_id = self.tokenizer.pad_token_id - self.current_token = 0 - self.current_global_steps = "NA" - self.async_llm_bridge = AsyncLlmBridge( - config=config, - async_rollout_manager=async_rollout_manager, - tokenizer=tokenizer, - llm_mode=llm_mode, - max_llm_retries=max_llm_retries - ) +from astune.task_rollout.single_worker import BaseParallelEnv class StepPrinter(BaseParallelEnv): - """Utility mixin providing periodic progress / throughput printing. - - Tracks token generation speed and thread step distribution. Intended to be - composed with rollout manager classes that maintain an observation window - (`obs_window`) containing per-thread step, token and stop flags. - """ + """Utility mixin providing periodic progress / throughput printing.""" def step_status_printer(self, obs_window): - """Print aggregated rollout progress. - - Buckets thread steps into 5-step ranges and shows how many threads are - currently within each bucket plus finished threads. Also reports token - generation speed. - - Parameters - ---------- - obs_window : dict - Shared state tracking 'step', 'token', and 'stop' arrays for each - active (or finished) thread. - """ # Histogram buckets: obs_window['step'] 0~5 / 5~10 / 10~15 / ... step_counter = {} current_token = sum(obs_window['token']) current_time = time.time() delta_token = current_token - self.current_token - if delta_token < 0: delta_token = current_token # when next rollout begins, obs_window['token'] should reset + if delta_token < 0: delta_token = current_token delta_time = current_time - self.current_token_count_time self.current_token = current_token self.current_token_count_time = current_time @@ -159,121 +56,14 @@ def step_status_printer(self, obs_window): print_buf += [f"[finished]:{count} threads"] print(f"Rollout progress ({token_gen_per_sec_str}): " + " // ".join(print_buf)) -class StaticRollout(StepPrinter): - """Static (non-dynamic) rollout manager. - - Submits a fixed number of rollout threads per task and waits for all to - finish before collecting results. Provides retry logic for environment - worker execution and aggregates success metrics. - """ - - def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, mode: Literal["sample", "validate"], - task_thread_index: int, obs_window: dict, **kwargs) -> CMTLinear: - """Execute one environment rollout worker. - - Handles environment initialization, LLM sampling parameter construction - (with validation overrides), and robust retry on transient failures. - - Parameters - ---------- - task : Task - The task object to roll out. - task_batch_index : int - Index of the task within the provided batch. - task_tag : str - Human-readable tag identifying task and rollout repetition. - mode : Literal['sample','validate'] - Rollout mode selecting sampling hyperparameters. - task_thread_index : int - Global thread index for obs_window bookkeeping. - obs_window : dict - Shared progress structure updated by the worker. - **kwargs : Any - Forwarded for future extensibility. - - Returns - ------- - CMTLinear - Collected trajectory container for this rollout. - """ - def get_sample_params(): - response_length_eps = 16 # Reserve a few tokens for later handling of special tokens like lm_start. - if self.config.astune.rollout.name == 'vllm': - sampling_params = dict( - n=1, - max_tokens=self.config.astune.rollout.max_response_length_in_one_turn - response_length_eps, - min_tokens=1, # Must output at least 1 token. - temperature=self.config.astune.rollout.temperature, - top_p=self.config.astune.rollout.top_p - ) - else: - sampling_params = dict( - n=1, - max_new_tokens=self.config.astune.rollout.max_response_length_in_one_turn, - temperature=self.config.astune.rollout.temperature, - top_p=self.config.astune.rollout.top_p - ) - - if mode == "validate": - sampling_params["temperature"] = self.config.astune.rollout.val_kwargs.temperature - sampling_params["top_k"] = self.config.astune.rollout.val_kwargs.top_k - sampling_params["top_p"] = self.config.astune.rollout.val_kwargs.top_p - return sampling_params - - - max_retry = 3 - for retry in range(max_retry): - try: - llm_chat_fn = self.async_llm_bridge.get_llm_chat_fn(get_sample_params()) - cmt: CMTBaseAttr = EnvWorker( - task_core_arg=TaskLaunchCoreArgument( - env_type=task.env_type, - task_id=task.task_id, - task_thread_index=task_thread_index, - task_batch_index=task_batch_index, - task_env_uuid=uuid.uuid4().hex, - task_tag=task_tag, - obs_window=obs_window, - llm_chat_fn=llm_chat_fn, - tokenizer=self.tokenizer, - task=task - ), - config=self.config - ).execute() - break - except Exception as e: - if retry < max_retry - 1: - logger.bind(exception=True).exception(f"rollout_env_worker error: {e.args}, retrying {retry + 1}/{max_retry}") - time.sleep(2 ** retry) - else: - logger.bind(exception=True).exception(f"rollout_env_worker failed after {max_retry} retries: {e.args}") - raise e - - return cmt # type: ignore +class StaticRollout(StepPrinter): + """Static (non-dynamic) rollout manager.""" def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[CMTLinear]: - """Run static rollout over a batch of tasks. - - Parameters - ---------- - tasks : List[Task] - Tasks to execute. - mode : Literal['sample','validate'] - Sampling mode; validation forces deterministic-ish params. - epoch : str - Epoch identifier for logging. - - Returns - ------- - List[CMTLinear] - List of collected trajectory containers. - """ - # Step 1: if enable_oversample (handled by DynamicRollout override) self.current_token_count_time = time.time() - # Step 2: otherwise, use legacy rollout method cmt_array: List[CMTLinear] = [] - rollout_n = 1 if mode=="validate" else self.rollout_n + rollout_n = 1 if mode == "validate" else self.rollout_n obs_window = { 'step': [0 for _ in range(len(tasks) * rollout_n)], 'token': [0 for _ in range(len(tasks) * rollout_n)], @@ -284,12 +74,15 @@ def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: for task_batch_index, task in enumerate(tasks): for task_rollout_index in range(rollout_n): task_thread_index = task_batch_index * rollout_n + task_rollout_index - future = executor.submit(self.rollout_env_worker, - task=task, task_batch_index=task_batch_index, - task_tag=f"T{task.task_id}#R{task_rollout_index}", - mode=mode, - task_thread_index=task_thread_index, - obs_window=obs_window) + future = executor.submit( + self.rollout_env_worker, + task=task, + task_batch_index=task_batch_index, + task_tag=f"T{task.task_id}#R{task_rollout_index}", + mode=mode, + task_thread_index=task_thread_index, + obs_window=obs_window, + ) futures.append(future) while any(future.running() for future in futures): @@ -297,7 +90,6 @@ def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: time.sleep(10) for future in tqdm(futures, desc=f"epoch{epoch}.collect_rollout"): - # do not fail silently result = future.result() cmt_array.append(result) @@ -309,41 +101,15 @@ def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: class DynamicRollout(StaticRollout): - """Dynamic rollout supporting oversampling and early termination. - - Extends the static rollout by launching an oversampled set of threads per - task, continuously monitoring reward variance and convergence conditions to - decide when to truncate further sampling. Implements greedy selection to - maximize reward dispersion (std) for training diversity. - """ + """Dynamic rollout supporting oversampling and early termination.""" def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[CMTLinear]: - """Dispatch to dynamic or static rollout depending on configuration.""" - if mode=="sample" and (self.rollout_n!=1) and self.config.astune.rollout.enable_oversample: + if mode == "sample" and (self.rollout_n != 1) and self.config.astune.rollout.enable_oversample: return self.rollout_dynamic(tasks, mode, epoch) else: return super().rollout(tasks, mode, epoch) def greedy_max_std_selection(self, samples: List[CMTLinear], n): - """Select samples promoting maximum reward spread. - - Strategy: Group by unique reward values in order, take extremes from - both ends when partial groups would exceed quota, optionally duplicate - selections if fewer unique samples than required, then return sorted by - absolute reward magnitude. - - Parameters - ---------- - samples : List[CMTLinear] - Candidate samples. - n : int - Number of samples to select. - - Returns - ------- - List[CMTLinear] - Selected subset with high reward variance. - """ if len(samples) < n: additional_n = n - len(samples) n = len(samples) @@ -368,14 +134,12 @@ def greedy_max_std_selection(self, samples: List[CMTLinear], n): elif len(selected_value) + len(macro_selected_value) > n: preserve_n = n - len(macro_selected_value) - # Select preserve_n samples from both ends of selected_value and selected_index. pick_left = preserve_n // 2 pick_right = preserve_n - pick_left macro_selected_value += selected_value[:pick_left] + selected_value[-pick_right:] macro_selected_index += selected_index[:pick_left] + selected_index[-pick_right:] if additional_n > 0: - # randomly select `additional_n` samples from `macro_selected_index`, then concat to `macro_selected_index` additional_indices = np.random.choice(macro_selected_index, additional_n, replace=True) macro_selected_index += additional_indices.tolist() @@ -383,34 +147,7 @@ def greedy_max_std_selection(self, samples: List[CMTLinear], n): sorted_selected_samples = sorted(selected_samples, key=lambda cmt: abs(cmt.reward_structure.performance_reward)) return sorted_selected_samples - def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str, allow_sample_num_change=True, allow_force_stop=True) -> List[CMTLinear]: - """Perform dynamic oversampled rollout with adaptive early stopping. - - Launches an oversampled number of rollout threads per task, periodically - evaluates termination conditions (all finished, sufficient diversity, - or confirmation of homogeneity), and force-stops remaining threads by - setting shared stop flags when appropriate. - - Parameters - ---------- - tasks : List[Task] - Tasks to roll out. - mode : Literal['sample','validate'] - Must be 'sample'; 'validate' is delegated to static logic. - epoch : str - Epoch identifier used for logging scope. - allow_sample_num_change : bool, optional - Whether final sample count may change to fit hardware divisibility. - allow_force_stop : bool, optional - Whether unfinished threads can be signaled to halt once criteria - are met. - - Returns - ------- - List[CMTLinear] - Selected trajectories after variance-based filtering / amendment. - """ cmt_array: List[CMTLinear] = [] assert mode != "validate" rollout_n = self.rollout_n @@ -428,7 +165,6 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] } with ThreadPoolExecutor(max_workers=self.max_parallel) as executor: - # Submit threads futures = [] for task_batch_index, task in enumerate(tasks): task_future_array = [] @@ -437,7 +173,7 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] future = executor.submit(self.rollout_env_worker, task=task, task_batch_index=task_batch_index, - task_tag=f"T{task.task_id}#R{task_rollout_index}", # task_rollout_index=str(task_rollout_index), + task_tag=f"T{task.task_id}#R{task_rollout_index}", mode=mode, task_thread_index=task_thread_index, obs_window=obs_window) @@ -445,7 +181,6 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] futures += [task_future_array] tic = -1 - # Record results of completed threads while True: tic += 1 can_terminate = [False for _ in futures] @@ -457,63 +192,53 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] reward = [cmt.reward_structure.performance_reward for cmt in completed_results] reward_std = np.std(reward) if reward else 0.0 all_finished = (len(completed_task_futures) == len(task_future_array)) - # finish condition 1: all oversample tasks are finished if all_finished: can_terminate[j] = True terminate_status[j] = f'all_fin({len(completed_results)}/{reward_std:.2f})' num_finished = len(completed_task_futures) task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) - # all_reward_greater_than_one = all(x >= 1 for x in task_cmd_reward_array) if not all_equal: if (num_finished >= rollout_n): - # finish condition 2: more than rollout_n tasks are finished, and, reward are not all equal can_terminate[j] = True terminate_status[j] = f'early_end({len(completed_results)}/{reward_std:.2f})' else: - pass # keep waiting + pass else: if num_finished >= rollout_n_confirm: - # finish condition 3: if more than rollout_n_confirm tasks are finished, we can confirm this task is hopeless (or successful for certainty) can_terminate[j] = True terminate_status[j] = f'confirm_dummy({len(completed_results)}/{reward_std:.2f})' - # Take actions to stop future rollout if allow_force_stop: for k in range(j*rollout_n_oversample, j*rollout_n_oversample + rollout_n_oversample): obs_window['stop'][k] = True else: - pass # keep waiting - # check global status + pass terminate_status = '/'.join(terminate_status) if all(can_terminate): logger.info(f"epoch{epoch}.collect_rollout: all tasks finished, exiting loop") - for i, stop_flag in enumerate(obs_window['stop']): obs_window['stop'][i] = True # all must stop now + for i, stop_flag in enumerate(obs_window['stop']): obs_window['stop'][i] = True break else: if tic % 10 == 0: - self.step_status_printer(obs_window) # print status every 10*5=50 seconds + self.step_status_printer(obs_window) logger.info(f"task complete {sum(can_terminate)}/{len(can_terminate)} tasks: {terminate_status}") time.sleep(5) - # Wait until all threads finish or are forcibly terminated tic = -1 while any(f.running() for task_future_array in futures for f in task_future_array): tic += 1 if tic % 10 == 0: logger.info('waiting final sync, this will not take long') time.sleep(5) - # Check how many threads completed scheduled tasks task_ineffective_thread_cnt = [] task_completed_thread_cnt = [] task_extra_thread_cnt = [] task_need_amend = 0 for j, task_future_array in enumerate(futures): - # get number of completed tasks completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] completed_results = [cmt for cmt in completed_results if not cmt.discarded] task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) - # Counting completed_task_cnt = len(completed_results) if all_equal: task_need_amend += 1 @@ -532,30 +257,24 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes total_sample = sum(task_completed_thread_cnt) if allow_sample_num_change and (total_sample > world_size*2): - # Allow sample count changes: we only require divisibility by GPU count. - # add_count = (world_size - total_sample % world_size) # If using an addition strategy, number of samples to add. - add_count = 0 # If using an addition strategy, number of samples to add. - num_task_to_amend = len(futures) # num_task + add_count = 0 + num_task_to_amend = len(futures) logger.info(f"allow_sample_num_change policy: world_size: {world_size}, total_sample {total_sample}, add_count: {add_count}, ") - # Select the task with the fewest extras for compensation while add_count != 0: _task_completed_thread_cnt_find_nonzero_min = [float('inf') if x <=0 else x for x in task_completed_thread_cnt] min_extra_index = _task_completed_thread_cnt_find_nonzero_min.index(min(_task_completed_thread_cnt_find_nonzero_min)) task_extra_thread_cnt[min_extra_index] += 1 task_completed_thread_cnt[min_extra_index] += 1 add_count -= 1 - # logger.info(f"_task_completed_thread_cnt_find_nonzero_min: {_task_completed_thread_cnt_find_nonzero_min}") logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") else: - # Sample count change not allowed; attempt compensation. num_task_max_to_amend = sum(task_extra_thread_cnt) // rollout_n num_task_to_amend = min(num_task_max_to_amend, task_need_amend) extra_num_thread_required = num_task_to_amend * rollout_n remove_count = sum(task_extra_thread_cnt) - extra_num_thread_required logger.info(f"forbid_sample_num_change policy: num_task_max_to_amend: {num_task_max_to_amend}, num_task_to_amend: {num_task_to_amend}, remove_count: {remove_count}, ") - # Select the task with the most extras to constrain while remove_count != 0: max_extra_index = task_extra_thread_cnt.index(max(task_extra_thread_cnt)) assert task_extra_thread_cnt[max_extra_index] > 0, "task_extra_thread_cnt should be greater than 0" @@ -565,15 +284,13 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") - # Select samples with the highest variance cmt_array = [] print_buffer = "" task_success_rate = [] for j, task_future_array, avail_extra_cnt in zip(range(len(futures)), futures, task_extra_thread_cnt): - # get number of completed tasks completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] - completed_results: List[CMTLinear] = [cmt for cmt in completed_results if not cmt.discarded] + completed_results = [cmt for cmt in completed_results if not cmt.discarded] task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] success_rate_array = [cmt.reward_structure.success_rate for cmt in completed_results] task_success_rate += [np.mean(success_rate_array)] @@ -589,7 +306,6 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] else: num_completed = len(completed_results) num_to_be_selected = rollout_n + avail_extra_cnt - # assert num_completed >= num_to_be_selected, f"num_completed={num_completed}, num_to_be_selected={num_to_be_selected}" selected_cmt_array = self.greedy_max_std_selection(completed_results, num_to_be_selected) cmt_array += selected_cmt_array print_buffer += f"/({len(selected_cmt_array)})" @@ -601,38 +317,15 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] return cmt_array - - class ParallelEnvManager(DynamicRollout): - """High-level manager orchestrating parallel environment rollouts. - - Adds conversion helpers to transform collected trajectories into - `Sample` objects and finally a padded `DataProto` suitable for model - training. - """ + """High-level manager orchestrating rollouts and batch conversion.""" - # TODO: define an extra class for trajectory-dataproto converting. def to_dataproto(self, cmt_array) -> DataProto: - """Convert trajectories to a `DataProto` batch. - - Pipeline: - 1. Tokenize grouped trajectories into `Sample` objects. - 2. Pad and batch samples into tensors and auxiliary metadata. - """ - # Step 1: Convert trajectories to samples: tokenizing samples = self.trajectories_to_samples(cmt_array) - - # Step 2: Convert samples to DataProto: padding dataproto = self.samples_to_dataproto(samples) - return dataproto def trajectories_to_samples(self, cmt_array: List[CMTLinear]) -> List[Sample]: - """Convert a list of trajectory containers into flat `Sample` objects. - - Ensures divisibility of sample count by world size (removing random - excess) for downstream distributed training alignment. - """ sample_arr_final = [] CMTLinear.compute_reference_advantage(cmt_array) for cmt in cmt_array: @@ -646,52 +339,41 @@ def trajectories_to_samples(self, cmt_array: List[CMTLinear]) -> List[Sample]: logger.success(f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]") sample_arr_final += sample_arr - # Step 2: Calculate how many samples need to be removed if self.config.astune.backbone in ['verl']: world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes remainder = len(sample_arr_final) % world_size if remainder != 0: import random remove_indices = random.sample(range(len(sample_arr_final)), remainder) - # Sort in reverse order to avoid index shifting during removal remove_indices.sort(reverse=True) for idx in remove_indices: sample_arr_final.pop(idx) - # random remove some samples, so that the number of samples is divisible by 8 return sample_arr_final def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: - # Initialize lists to store batched data prompt_ids, response_ids = [], [] prompt_attention_mask, response_attention_mask = [], [] prompt_position_ids, response_position_ids = [], [] prompt_loss_mask, response_loss_mask = [], [] messages = [] - # reward_scores = [] # replace with step_reward_scores step_reward_scores = [] task_ids = [] rollout_ids = [] reference_advantage = [] for sample in samples: - # Validate that all fields have the same length assert len(sample.input_ids) == len(sample.attention_mask) == len(sample.position_ids) == len( - sample.loss_mask), f"Sample {sample.request_id} has mismatched lengths: " \ - f"{len(sample.input_ids)=}, {len(sample.attention_mask)=}, " \ - f"{len(sample.position_ids)=}, {len(sample.loss_mask)=}" + sample.loss_mask), f"Sample {sample.request_id} has mismatched lengths: {len(sample.input_ids)=}, {len(sample.attention_mask)=}, {len(sample.position_ids)=}, {len(sample.loss_mask)=}" task_ids.append(sample.task_id) rollout_ids.append(sample.task_tag) - # Discard samples with prompt length exceeding limit if len(sample.prompt_ids) > self.config.astune.data.max_prompt_length: raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") - # Warn if response is longer than expected (but still include it) if len(sample.response_ids) > self.config.astune.data.max_response_length: raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") - # Append tensors to respective lists assert len(sample.prompt_ids) != 0 assert len(sample.response_ids) != 0 prompt_ids.append(torch.tensor(sample.prompt_ids, dtype=torch.int)) @@ -709,7 +391,6 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: reference_advantage.append(sample.reference_advantage) messages.append({"messages": sample.messages}) - # reward_scores.append(sample.global_reward) step_reward_scores.append(sample.step_reward) max_prompt_length_this_batch = max([p.shape[-1] for p in prompt_ids]) @@ -717,35 +398,32 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: max_response_length_this_batch = max([p.shape[-1] for p in response_ids]) assert max_response_length_this_batch <= self.config.astune.data.max_response_length - # Batch and pad sequences - prompt_ids = pad_sequence(prompt_ids, batch_first=True, padding_value=self.pad_token_id, padding_side="left") + prompt_ids = pad_sequence(prompt_ids, batch_first=True, padding_value=self.pad_token_id, padding_side="left") prompt_attention_mask = pad_sequence(prompt_attention_mask, batch_first=True, padding_value=0, padding_side="left") - prompt_position_ids = pad_sequence(prompt_position_ids, batch_first=True, padding_value=0, padding_side="left") - prompt_loss_mask = pad_sequence(prompt_loss_mask, batch_first=True, padding_value=0, padding_side="left") + prompt_position_ids = pad_sequence(prompt_position_ids, batch_first=True, padding_value=0, padding_side="left") + prompt_loss_mask = pad_sequence(prompt_loss_mask, batch_first=True, padding_value=0, padding_side="left") - prompt_ids = pad_sequence_to_length(prompt_ids, max_prompt_length_this_batch, self.pad_token_id, left_pad=True) + prompt_ids = pad_sequence_to_length(prompt_ids, max_prompt_length_this_batch, self.pad_token_id, left_pad=True) prompt_attention_mask = pad_sequence_to_length(prompt_attention_mask, max_prompt_length_this_batch, 0, left_pad=True) - prompt_position_ids = pad_sequence_to_length(prompt_position_ids, max_prompt_length_this_batch, 0, left_pad=True) - prompt_loss_mask = pad_sequence_to_length(prompt_loss_mask, max_prompt_length_this_batch, 0, left_pad=True) + prompt_position_ids = pad_sequence_to_length(prompt_position_ids, max_prompt_length_this_batch, 0, left_pad=True) + prompt_loss_mask = pad_sequence_to_length(prompt_loss_mask, max_prompt_length_this_batch, 0, left_pad=True) - response_ids = pad_sequence(response_ids, batch_first=True, padding_value=self.pad_token_id) + response_ids = pad_sequence(response_ids, batch_first=True, padding_value=self.pad_token_id) response_attention_mask = pad_sequence(response_attention_mask, batch_first=True, padding_value=0) - response_loss_mask = pad_sequence(response_loss_mask, batch_first=True, padding_value=0) + response_loss_mask = pad_sequence(response_loss_mask, batch_first=True, padding_value=0) - response_ids = pad_sequence_to_length(response_ids, max_response_length_this_batch, self.pad_token_id) + response_ids = pad_sequence_to_length(response_ids, max_response_length_this_batch, self.pad_token_id) response_attention_mask = pad_sequence_to_length(response_attention_mask, max_response_length_this_batch, 0) - response_loss_mask = pad_sequence_to_length(response_loss_mask, max_response_length_this_batch, 0) + response_loss_mask = pad_sequence_to_length(response_loss_mask, max_response_length_this_batch, 0) delta_position_id = torch.arange(1, response_ids.size(1) + 1, device=response_ids.device).unsqueeze(0).repeat(len(samples), 1) response_position_ids = prompt_position_ids[:, -1:] + delta_position_id - # Concatenate prompt and response tensors input_ids = torch.cat((prompt_ids, response_ids), dim=-1) attention_mask = torch.cat((prompt_attention_mask, response_attention_mask), dim=-1) position_ids = torch.cat((prompt_position_ids, response_position_ids), dim=-1) loss_mask = torch.cat((prompt_loss_mask, response_loss_mask), dim=-1) - # Construct the batch using TensorDict batch = TensorDict( { "prompts": prompt_ids, diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py new file mode 100644 index 00000000..6d28a318 --- /dev/null +++ b/astune/task_rollout/single_worker.py @@ -0,0 +1,162 @@ +"""Single worker primitives for environment rollouts.""" + +import os +import time +import uuid +from typing import Any, Literal + +from loguru import logger +from omegaconf import DictConfig +from transformers.tokenization_utils import PreTrainedTokenizer + +from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr +from astune.schema.task import Task, TaskLaunchCoreArgument +from astune.task_rollout.async_llm_bridge import AsyncLlmBridge +from astune.task_rollout.env_worker import EnvWorker + + +def init_parallel_rollout_logger(experiment_name): + """Initialize the logger with the given configuration.""" + from beast_logger import register_logger + if 'BEST_LOGGER_INIT' in os.environ: return # prevent re-initialization in ray environment + os.environ['BEST_LOGGER_INIT'] = '1' + from datetime import datetime + final_log_path = os.path.join("launcher_record", experiment_name, datetime.now().strftime("%Y_%m_%d_%H_%M")) + os.environ['BEST_LOGGER_PATH'] = final_log_path + non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] + register_logger(mods=["evaluation", "exception"], non_console_mods=non_console_mods, auto_clean_mods=[], base_log_path=final_log_path, debug=False) + + +class BaseParallelEnv: + + def __init__( + self, + config: DictConfig, + async_rollout_manager, + max_parallel: int, + max_llm_retries: int = 3, + tokenizer: PreTrainedTokenizer = None, # type: ignore + llm_mode: Literal["local", "remote", "trinity"] = "local", + **kwargs + ): + """Initialize common rollout state and helpers. + + Parameters + ---------- + config : DictConfig + Configuration object containing rollout and experiment settings. + async_rollout_manager : Any + Manager responsible for async LLM interactions. + max_parallel : int + Maximum number of parallel environment worker threads. + max_llm_retries : int, optional + Maximum retries for LLM calls, by default 3. + tokenizer : PreTrainedTokenizer, optional + Tokenizer used for padding and ID conversions. + llm_mode : Literal["local", "remote", "trinity"], optional + Indicates backend mode (e.g., 'local', 'remote'), default 'local'. + **kwargs : Any + Additional parameters passed through for future extensions. + """ + + init_parallel_rollout_logger(experiment_name=config.astune.experiment_name) + self.llm_mode: Literal["local", "remote", "trinity"] = llm_mode + self.config: DictConfig = config + self.async_rollout_manager = async_rollout_manager + self.max_parallel: int = max_parallel + self.max_llm_retries: int = max_llm_retries + self.rollout_n = config.astune.rollout.num_repeat + self.tokenizer = tokenizer + self.pad_token_id = self.tokenizer.pad_token_id + self.current_token = 0 + self.current_global_steps = "NA" + self.async_llm_bridge = AsyncLlmBridge( + config=config, + async_rollout_manager=async_rollout_manager, + tokenizer=tokenizer, + llm_mode=llm_mode, + max_llm_retries=max_llm_retries + ) + + def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, mode: Literal["sample", "validate"], + task_thread_index: int, obs_window: dict, **kwargs) -> CMTLinear: + """Execute one environment rollout worker. + + Handles environment initialization, LLM sampling parameter construction + (with validation overrides), and robust retry on transient failures. + + Parameters + ---------- + task : Task + The task object to roll out. + task_batch_index : int + Index of the task within the provided batch. + task_tag : str + Human-readable tag identifying task and rollout repetition. + mode : Literal['sample','validate'] + Rollout mode selecting sampling hyperparameters. + task_thread_index : int + Global thread index for obs_window bookkeeping. + obs_window : dict + Shared progress structure updated by the worker. + **kwargs : Any + Forwarded for future extensibility. + + Returns + ------- + CMTLinear + Collected trajectory container for this rollout. + """ + def get_sample_params(): + response_length_eps = 16 # Reserve a few tokens for later handling of special tokens like lm_start. + if self.config.astune.rollout.name == 'vllm': + sampling_params = dict( + n=1, + max_tokens=self.config.astune.rollout.max_response_length_in_one_turn - response_length_eps, + min_tokens=1, # Must output at least 1 token. + temperature=self.config.astune.rollout.temperature, + top_p=self.config.astune.rollout.top_p + ) + else: + sampling_params = dict( + n=1, + max_new_tokens=self.config.astune.rollout.max_response_length_in_one_turn, + temperature=self.config.astune.rollout.temperature, + top_p=self.config.astune.rollout.top_p + ) + + if mode == "validate": + sampling_params["temperature"] = self.config.astune.rollout.val_kwargs.temperature + sampling_params["top_k"] = self.config.astune.rollout.val_kwargs.top_k + sampling_params["top_p"] = self.config.astune.rollout.val_kwargs.top_p + return sampling_params + + max_retry = 3 + for retry in range(max_retry): + try: + llm_chat_fn = self.async_llm_bridge.get_llm_chat_fn(get_sample_params()) + cmt: CMTBaseAttr = EnvWorker( + task_core_arg=TaskLaunchCoreArgument( + env_type=task.env_type, + task_id=task.task_id, + task_thread_index=task_thread_index, + task_batch_index=task_batch_index, + task_env_uuid=uuid.uuid4().hex, + task_tag=task_tag, + obs_window=obs_window, + llm_chat_fn=llm_chat_fn, + tokenizer=self.tokenizer, + task=task + ), + config=self.config + ).execute() + break + except Exception as e: + if retry < max_retry - 1: + logger.bind(exception=True).exception(f"rollout_env_worker error: {e.args}, retrying {retry + 1}/{max_retry}") + time.sleep(2 ** retry) + else: + logger.bind(exception=True).exception(f"rollout_env_worker failed after {max_retry} retries: {e.args}") + raise e + + return cmt # type: ignore From 41b44654ee3fde49a6a805f2f782e294e4218796 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 18 Nov 2025 02:47:49 +0800 Subject: [PATCH 048/462] train werewolves update --- .gitignore | 1 + astune/backbone/trinity_compat_workflow.py | 3 +-- astune/task_rollout/async_llm_bridge.py | 13 ++++++------- launcher/werewolves_agent/git-rpg-agentscope.yaml | 2 +- tutorial/werewolves/start.py | 2 +- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 128696a9..1bd1fd5e 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,4 @@ launcher_record .trash trinity_checkpoints +astune_test \ No newline at end of file diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index ca544057..a6ff2f58 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -28,14 +28,13 @@ def __init__( ): self.task = task - self.trinity_llm_model_client = llm_handle self.tokenizer = tokenizer self.config = config self.llm_mode = llm_mode super().__init__( config=self.config, - async_rollout_manager=None, + async_rollout_manager=llm_handle, max_parallel=1, max_llm_retries = 1, tokenizer=tokenizer, diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 026f2f5f..952f1b5e 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -137,7 +137,7 @@ def llm_chat_trinity( request_id: str = "" ) -> dict: - async def main(model_client): + async def main(): updated_sampling_params = {} if sampling_params: updated_sampling_params.update(sampling_params) @@ -146,8 +146,8 @@ async def main(model_client): updated_sampling_params.pop('min_tokens') if tools: - response = await model_client.chat.completions.create( - model=model_client.model_path, + response = await self.async_rollout_manager.chat.completions.create( + model=self.async_rollout_manager.model_path, messages=messages, logprobs=True, tools=tools, @@ -155,8 +155,8 @@ async def main(model_client): **updated_sampling_params ) else: - response = await model_client.chat.completions.create( - model=model_client.model_path, + response = await self.async_rollout_manager.chat.completions.create( + model=self.async_rollout_manager.model_path, messages=messages, logprobs=True, top_logprobs=0, @@ -164,8 +164,7 @@ async def main(model_client): ) return response - assert hasattr(self, 'trinity_llm_model_client'), "trinity_llm_model_client is not set in AsyncLlmBridge" - response = run_async_coro__no_matter_what(main(self.trinity_llm_model_client)) # type: ignore + response = run_async_coro__no_matter_what(main()) # type: ignore content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) diff --git a/launcher/werewolves_agent/git-rpg-agentscope.yaml b/launcher/werewolves_agent/git-rpg-agentscope.yaml index 2d5e9a86..f9740b93 100644 --- a/launcher/werewolves_agent/git-rpg-agentscope.yaml +++ b/launcher/werewolves_agent/git-rpg-agentscope.yaml @@ -29,7 +29,7 @@ trinity: algorithm: repeat_times: 6 buffer: - train_batch_size: 42 + train_batch_size: 84 # ------------------ 不需要修改 ------------------ hydra: diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index 8546a8a0..dc2c1b72 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -132,7 +132,7 @@ class ExampleWerewolves(AgentScopeLearnProtocol): async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config) -> ASTuneProxy: - train_which_role = "witch" + train_which_role = "werewolf" roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] From c39a40e203bafd19b52785dc51a9ebb0896b61a0 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 18 Nov 2025 02:55:17 +0800 Subject: [PATCH 049/462] zh comments to en --- astune/backbone/trinity_compat_workflow.py | 2 +- .../agentscope_cm/cmt_multi_sample.py | 8 ++++---- astune/context_manager/cmt_linear.py | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index a6ff2f58..45d2f192 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -188,7 +188,7 @@ async def run_async(self): response_text = "", # optional prompt_text = "", # optional #### for multi-turn experiences - action_mask = response_loss_mask, # 1 是训练 + action_mask = response_loss_mask, # 1 stands for training, 0 stands for ignoring messages=sample.messages, # # tools, #### for dpo experiences diff --git a/astune/context_manager/agentscope_cm/cmt_multi_sample.py b/astune/context_manager/agentscope_cm/cmt_multi_sample.py index c3b81c07..a2f7acea 100644 --- a/astune/context_manager/agentscope_cm/cmt_multi_sample.py +++ b/astune/context_manager/agentscope_cm/cmt_multi_sample.py @@ -105,10 +105,10 @@ def generate_log(self, task_id = None, global_step="NA"): step_advantage=f"{float(step_advantage):.3f}", # type: ignore step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore content=SeqItem( - text = buffer['text_arr'], # 文本 - title = buffer['logprob_arr'], # 鼠标悬浮文本 - count = buffer['input_id_arr'], # 高亮文本 # type: ignore - color = buffer['loss_mask_color_arr'] # 颜色 + text = buffer['text_arr'], # text content + title = buffer['logprob_arr'], # mouse hover text + count = buffer['input_id_arr'], # highlight text # type: ignore + color = buffer['loss_mask_color_arr'] # color ) ) diff --git a/astune/context_manager/cmt_linear.py b/astune/context_manager/cmt_linear.py index d46e21b2..5abe0447 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_manager/cmt_linear.py @@ -383,7 +383,7 @@ def group_tokenize_multi_group(self): if len(sample_arr) > max_num_group: print(f"Warning: allow {max_num_group} groups, but got {len(sample_arr)} groups") import random - sample_arr = random.sample(sample_arr, max_num_group) # 随机保留 max_num_group 个组 + sample_arr = random.sample(sample_arr, max_num_group) # preserve max_num_group groups return sample_arr @@ -424,10 +424,10 @@ def generate_log(self, task_id=None, global_step="NA"): step_advantage=f"{float(step_advantage):.3f}", # type: ignore step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore content=SeqItem( - text = buffer['text_arr'], # 文本 - title = buffer['text_arr'], # 鼠标悬浮文本 - count = buffer['input_id_arr'], # 高亮文本 - color = buffer['loss_mask_color_arr'] # 颜色 + text = buffer['text_arr'], # text content + title = buffer['text_arr'], # mouse hover text + count = buffer['input_id_arr'], # h highlight text + color = buffer['loss_mask_color_arr'] # color ) ) print_nested(nested_items_print_buffer, @@ -620,7 +620,7 @@ def compute_reference_advantage(cmt_array: List): for task_id, cmt_list in task2cmt.items(): cmt_reward = [] - # 计算组内平均和标准差 + # compute in-group mean and std for cmt in cmt_list: cmt_reward += [np.mean(cmt.reward_structure.step_reward)] @@ -635,7 +635,7 @@ def compute_reference_advantage(cmt_array: List): # logger.bind(exception=True).info(f"task id {task_id}") # logger.bind(exception=True).info(f"reward_mean {reward_mean}, reward_std {reward_std}, cmt_reward {cmt_reward}") - # 计算 advantage + # compute advantage for cmt in cmt_list: cmt.reward_structure.step_advantage = [] for i in range(len(cmt.reward_structure.step_reward)): @@ -645,7 +645,7 @@ def compute_reference_advantage(cmt_array: List): # logger.bind(exception=True).info(f"step reward {cmt.reward_structure.step_reward}") # logger.bind(exception=True).info(f"step advantage {cmt.reward_structure.step_advantage}") - # 计算简单advantage (不均衡rollout sample数量) + # compute simple advantage (uneven rollout sample count) for task_id, cmt_list in task2cmt.items(): cmt_reward = [] for cmt in cmt_list: From 34c2c5a81616b55564392190c48b311751990135 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 18 Nov 2025 11:34:18 +0800 Subject: [PATCH 050/462] remove some modules --- .../agentflow_cm/cmt_context_aware.py | 171 -------- .../agentflow_cm/cmt_context_clip.py | 365 ------------------ .../agentflow_cm/cmt_linear_think.py | 311 --------------- .../agentflow_cm/cmt_memory.py | 0 .../agentflow_cm/cmt_phantom_hint.py | 41 -- .../agentflow_cm/cmt_sliding_window.py | 205 ---------- astune/workflow_controller/basic_agentflow.py | 3 +- .../workflow_controller/classic_agentflow.py | 15 +- 8 files changed, 7 insertions(+), 1104 deletions(-) delete mode 100644 astune/context_manager/agentflow_cm/cmt_context_aware.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_context_clip.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_linear_think.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_memory.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_phantom_hint.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_sliding_window.py diff --git a/astune/context_manager/agentflow_cm/cmt_context_aware.py b/astune/context_manager/agentflow_cm/cmt_context_aware.py deleted file mode 100644 index dd10a69d..00000000 --- a/astune/context_manager/agentflow_cm/cmt_context_aware.py +++ /dev/null @@ -1,171 +0,0 @@ -import copy -from typing import List -from beast_logger import print_listofdict -from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT -from beast_logger import print_dict, print_nested, NestedJsonItem, SeqItem - - -class SelfContextAwareCMT(LinearThinkCMT): - """ - A non-linear context manager template that handles the conversation flow between LLM and environment. - """ - - def __init__(self, config, tokenizer, llm_chat_fn): - self.llm_chat_fn = llm_chat_fn - self.latest_env_response_id = "" - self.latest_env_response_content = "" - self.console_debug_mode = False - self.force_think = config.astune.rollout.force_think - super().__init__(config, tokenizer) - - - def post_tag_env_message_context(self, content, turn, is_last) -> str: - from textwrap import dedent - assert 0 <= turn < 999, "turn 必须在 [0, 999) 范围内" - turn_id = f"{turn:03d}" # 等效:str(turn).zfill(3) - self.latest_env_response_id = f"ER{turn_id}" - self.latest_env_response_content = content.strip() - content = dedent(f""" - [Environment Response, id="ER{turn_id}"] - --- - """).strip() + content.strip() - if is_last and self.force_think: - content += "\n\nAdditional requirements: \n- You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce your answer with \\box{}. (Put \\box{} outside ...)." - - return content - - def post_tag_init_message_context(self, content, is_last) -> str: - if is_last: - content = content.strip() # + "\nSome additional requirements for last msg \n" - if is_last and self.force_think: - content += "\n\nAdditional requirements: \n- You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce your answer with \\box{}. (Put \\box{} outside ...)." - return content.strip() - - def prepare_next_llm_context(self): - self.latest_llm_interaction_socket = [] - - # first we get all previous context (non-deprecated context) - # get `init_message -> user -> llm -> user -> llm`` or `init_message -> llm -> user -> llm -> user`` - self.latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "env"]) - - - env_turn = 1 - for index, ext_msg in enumerate(list(self.latest_llm_interaction_socket)): - - is_last = (index == len(self.latest_llm_interaction_socket) - 1) - # 根据消息类型进行处理 - if ext_msg.author == "llm": - # 如果是以往的llm消息,去掉think标签 - import re - new_ext_msg_content = re.sub(r'.*?', '', ext_msg.content, flags=re.DOTALL).strip() - new_ext_msg_content = new_ext_msg_content.replace("", "") - new_ext_msg_content = new_ext_msg_content.replace("", "") - - assert ext_msg.author == "llm" - author_override = "llm(do_not_train)" - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=author_override, - role=ext_msg.role, - content=new_ext_msg_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - - # process env message - elif ext_msg.author == "env": - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.post_tag_env_message_context(content=ext_msg.content_for_future, turn=env_turn, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - ) - env_turn += 1 - - elif ext_msg.author in ["initialization"]: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.post_tag_init_message_context(content=ext_msg.content_for_future, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - ) - - else: - raise RuntimeError(f"Unknown author {ext_msg.author} in latest_llm_interaction_socket") - - dict_context = self.to_role_content(self.latest_llm_interaction_socket) - return dict_context - - - def save_init_input(self, init_input_arr:list, add_nothink): - super().save_init_input(init_input_arr, add_nothink) - return - - - def after_save_llm_output(self, llm_output, this_interaction): - if not self.latest_env_response_id: - return - self.latest_llm_interaction_socket_additional = copy.deepcopy(this_interaction) - self.latest_llm_interaction_socket_additional += [ExtendedMessage( - author='user', - role='user', - content=f"""Now your new task is to inspect `Environment Response` {self.latest_env_response_id} and then extract paragraphs that may be useful information in last action or in the future.""" - """For example, if the original Response contain paragraph ABCDEF and only paragraph ABCF maybe useful, you should answer me by copying paragraph ABCF (wrapped them between ```).""" - """Do not give up details easily, try your best to find useful information. When necessary, you can preserve everything.""", - token_generator='auto', - tokenizer=self.tokenizer, - )] - dict_context = self.to_role_content(self.latest_llm_interaction_socket_additional) - llm_output = self.llm_chat_fn(dict_context, request_id="") - self.latest_llm_interaction_socket_additional += [self.save_llm_output_do_not_register_full_context(llm_output, dict_context)] - this_interaction = copy.deepcopy(self.latest_llm_interaction_socket_additional) - self.grouped_steps += [this_interaction] - - - if self.console_debug_mode: - print_listofdict( - dict_context + - [{'role': 'llm_latest', 'content': llm_output['content']}] - , mod='c') - try: - llm_output_content = llm_output['content'] = llm_output['content'].strip() - if llm_output_content.count("```") == 2: - extracted_content: str = llm_output_content.split("```")[1].strip() - else: - raise RuntimeError(f"Cannot find ``` in llm_output content: {llm_output_content}") - - # override future full_context - assert self.latest_env_response_content != '' - replace_success = self.replace_full_context_item(match_content=self.latest_env_response_content, new_content=extracted_content) - if not replace_success: - raise RuntimeError(f"Cannot find {self.latest_env_response_id} in full_context") - - except Exception as e: - print(f"Error processing llm_output") - return - - def replace_full_context_item(self, match_content: str, new_content: str): - success = False - for index in range(len(self.full_context)): - ext_msg = self.full_context[index] - if match_content in ext_msg.content_for_future: - success = True - self.full_context[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=new_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - # print_dict({match_content: new_content}) - return success - return success - - def save_llm_output(self, llm_output, input_msg_ref): - ext_msg = CMTLinear.save_llm_output(self, llm_output, input_msg_ref) - this_interaction = copy.deepcopy(self.latest_llm_interaction_socket + [ext_msg]) - self.grouped_steps += [this_interaction] - self.after_save_llm_output(llm_output, this_interaction) - self.latest_llm_interaction_socket = [] - return diff --git a/astune/context_manager/agentflow_cm/cmt_context_clip.py b/astune/context_manager/agentflow_cm/cmt_context_clip.py deleted file mode 100644 index 93bfdf1a..00000000 --- a/astune/context_manager/agentflow_cm/cmt_context_clip.py +++ /dev/null @@ -1,365 +0,0 @@ -import copy -import re -import json -import random -import time -from typing import List, Callable -from beast_logger import print_dict, print_listofdict -from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT -from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn -from textwrap import dedent -from openai import OpenAI -from loguru import logger - - -class SelfContextClipCMT(LinearThinkCMT): - """ - A non-linear context manager template that handles the conversation flow between LLM and environment. - """ - - def __init__(self, config, tokenizer, llm_chat_fn): - self.llm_chat_fn = llm_chat_fn - self.alien_llm_chat_fn: Callable = construct_alien_llm_chat_fn(config, config.actor_rollout_ref.rollout) - self.latest_env_response_id = "" - self.latest_env_response_content = "" - self.console_debug_mode = False - self.force_think = config.astune.rollout.force_think - self.env_action_preference = config.astune.task_reader.env_service.env_action_preference - self.train_sp_action = config.astune.context_manager.auto_context_cm.train_sp_action - self.clipped_before = False - if self.env_action_preference == "box": - self.force_think_prompt = dedent(""" - Additional requirements: Think before action! You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce your answer with \\box{}. - Your thought (...) should be as short and concise as possible. - For example: - ...your thinking process... - \\box{...your final answer...} - """) - elif self.env_action_preference == "code": - self.force_think_prompt = dedent(""" - Additional requirements: Think before action! You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce the next-step action. - Your thought (...) should be as short and concise as possible. - For example: - ...your thinking process... - ```python - # your action here - ``` - """) - - super().__init__(config, tokenizer) - - def post_tag_init_message_context(self, content, is_last) -> str: - if is_last: - content = content.strip() # + "\nSome additional requirements for last msg \n" - if is_last and self.force_think: - content += self.force_think_prompt - return content.strip() - - def post_tag_env_message_context(self, content, turn, is_last) -> str: - from textwrap import dedent - assert 0 <= turn < 999, "turn 必须在 [0, 999) 范围内" - turn_id = f"{turn:03d}" - self.latest_env_response_id = f"ER{turn_id}" - self.latest_env_response_content = content.strip() - content = dedent(f""" - [Environment Response, id=ER{turn_id}] - --- - """).strip() + '\n' + content.strip() - if is_last and self.force_think: - content += self.force_think_prompt - return content - - def post_tag_llm_message_context(self, content, turn, is_last) -> str: - from textwrap import dedent - assert not is_last, "llm message should never be last" - assert 0 <= turn < 999, "turn 必须在 [0, 999) 范围内" - turn_id = f"{turn:03d}" - content = dedent(f""" - [Assistant Response, id=AR{turn_id}] - --- - """).strip() + '\n' + content.strip() - return content - - def strip_think_tags(self, text: str) -> str: - new_ext_msg_content = re.sub(r'.*?', '', text, flags=re.DOTALL).strip() - new_ext_msg_content = new_ext_msg_content.replace("", "") - new_ext_msg_content = new_ext_msg_content.replace("", "") - return new_ext_msg_content - - def prepare_next_llm_context(self): - self.latest_llm_interaction_socket = [] - - # first we get all previous context (non-deprecated context) - # get `init_message -> user -> llm -> user -> llm`` or `init_message -> llm -> user -> llm -> user`` - self.latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "env"]) - - env_turn = 1 - llm_turn = 1 - for index, ext_msg in enumerate(list(self.latest_llm_interaction_socket)): - is_last = (index == len(self.latest_llm_interaction_socket) - 1) - # 根据消息类型进行处理 - if ext_msg.author == "llm": - # 如果是以往的llm消息,去掉think标签 - new_ext_msg_content = self.strip_think_tags(ext_msg.content) - author_override = "llm(do_not_train)" - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=author_override, - role=ext_msg.role, - content=self.post_tag_llm_message_context(new_ext_msg_content, turn=llm_turn, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - build_from_uuid=ext_msg.uuid, - ) - llm_turn += 1 - - # process env message - elif ext_msg.author == "env": - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.post_tag_env_message_context(content=ext_msg.content_for_future, turn=env_turn, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - build_from_uuid=ext_msg.uuid, - ) - env_turn += 1 - - elif ext_msg.author in ["initialization"]: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.post_tag_init_message_context(content=ext_msg.content_for_future, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - build_from_uuid=ext_msg.uuid, - ) - - else: - raise RuntimeError(f"Unknown author {ext_msg.author} in latest_llm_interaction_socket") - - listofdict_context = self.to_role_content(self.latest_llm_interaction_socket) - return listofdict_context - - - def save_init_input(self, init_input_arr:list, add_nothink): - super().save_init_input(init_input_arr, add_nothink) - return - - - def impl_new_request_from_previous_interaction(self, new_message, this_interaction, strip_think=False): - latest_llm_interaction_socket_additional = copy.deepcopy(this_interaction) - if strip_think: - for index, ext_msg in enumerate(latest_llm_interaction_socket_additional): - if ext_msg.author == "llm(do_not_train)" or ext_msg.author == "llm": - latest_llm_interaction_socket_additional[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.strip_think_tags(ext_msg.content), - token_generator='auto', - tokenizer=self.tokenizer, - build_from_uuid=ext_msg.build_from_uuid if ext_msg.build_from_uuid else ext_msg.uuid, - ) - else: - continue - latest_llm_interaction_socket_additional += [new_message] - dict_context = self.to_role_content(latest_llm_interaction_socket_additional) - if self.train_sp_action: - llm_output = self.llm_chat_fn(dict_context, request_id="") - else: - llm_output = self.alien_llm_chat_fn(dict_context, request_id="") - latest_llm_interaction_socket_additional += [self.save_llm_output_do_not_register_full_context(llm_output, dict_context)] - if self.train_sp_action: - this_interaction = copy.deepcopy(latest_llm_interaction_socket_additional) - self.grouped_steps += [this_interaction] - if self.console_debug_mode: - print_listofdict( - dict_context + [{'role': 'llm_latest', 'content': llm_output['content']}], mod='c' - ) # print to console - else: - print_listofdict( - dict_context + [{'role': 'llm_latest', 'content': llm_output['content']}], mod='env_clip' - ) # log to file - output_llm_content = llm_output['content'].strip() - return latest_llm_interaction_socket_additional, output_llm_content - - - def after_save_llm_output(self, this_interaction): - """ - this_interaction = [ - init msg, - ..., - init msg, - ... - previous env msg, - latest llm msg, - ] - """ - from textwrap import dedent - if not self.latest_env_response_id: - return - - clip_token_cnt = self.config.astune.context_manager.auto_context_cm.token_num_trigger_clip - this_interaction = copy.deepcopy(this_interaction) - if self._get_seq_length(this_interaction) < clip_token_cnt: - return - - if self.clipped_before: - return - self.clipped_before = True - - _, generated_content = self.impl_new_request_from_previous_interaction( - new_message=ExtendedMessage( - author='user', - role='user', - content=dedent(""" - Your new task is to inspect each `Environment Response` and `Assistant Response` messages, - and determine whether each message is useful for the next-step decision-making. - Generate a json structure following the format below: - ```json - [ - {"id":"ARXXX or ERXXX", "useful":true or false, "action": "keep or remove or compress"}, - ..., - {"id":"ARXXX or ERXXX", "useful":true or false, "action": "keep or remove or compress"}, - ] - ``` - - For example: - ```json - [ - {"id":"ER001", "useful":true, "action": "keep"}, - {"id":"AR001", "useful":false, "action": "remove"}, - ... - ] - ``` - - Rules: - - If the message contains useful information for future decisions, set "useful":true and "action":"keep". - - If the message records important previous action or environment feedback, set "useful":true and "action":"keep". - - If the message is very long and very redundant, set "useful":true and "action":"compress". - - If the message is completely irrelevant, set "useful":false and "action":"remove". Note that important failures should be preserved, because learning from past is vital. - - Ignore messages without id=XXX tags, where XXX is a 3-digit number. - - Ensure the JSON is properly formatted and valid. - - Remove or compress at least one message, because token limit is already reached. - - At least remove (or compress) one message. - - There must be no more than 2 "compress" actions in total, because "compress" action will cost considerable amount of time. - - """), - token_generator='auto', - tokenizer=self.tokenizer, - ), - this_interaction=this_interaction, - strip_think=True, - ) - - try: - llm_output_content = generated_content = generated_content.strip() - if llm_output_content.count("```") == 2: - extracted_content: str = llm_output_content.split("```")[1].strip() - else: - raise RuntimeError(f"Cannot find ``` in llm_output content: {llm_output_content}") - if extracted_content.startswith('json'): - extracted_content = extracted_content[len('json'):].strip() - extracted_json = json.loads(extracted_content) - for item in extracted_json: - if 'id' not in item or 'useful' not in item or 'action' not in item: - raise RuntimeError(f"Each item must contain 'id', 'useful', and 'action' fields. Error in item: {item}") - message_id = item['id'] - message_action = item['action'] - # find message from self.full_context - ## match latest_llm_interaction_socket_additional and match self.full_context - from_uuid = None - for ext_msg in this_interaction: - if message_id in ext_msg.content_for_future: - from_uuid = ext_msg.build_from_uuid - break - if from_uuid is None: - raise ValueError(f"Cannot find message_id {message_id} in `this_interaction`") - target_msg = None - target_index = -1 - for index, msg in enumerate(self.full_context): - if msg.uuid == from_uuid: - target_msg = msg - target_index = index - break - if target_msg is None or target_index == -1: - raise ValueError(f"Cannot find message_id {message_id} in full_context") - - ## take actions - if message_action == 'remove': - self.full_context[target_index] = ExtendedMessage( - author=target_msg.author+"(discard)", - role=target_msg.role, - content=target_msg.content, # keep original content - token_generator='auto', - tokenizer=self.tokenizer, - ) - elif message_action == 'compress': - target_id = message_id - _, generated_compressed_content = self.impl_new_request_from_previous_interaction( - new_message=ExtendedMessage( - author='user', - role='user', - content=dedent(f""" - Your new task is to inspect {target_id}, and filter out all redundant information, and only keep the most important information that is useful for future decision-making. - For example, if the content is a long text with multiple paragraphs, you should only preseve the key paragraphs and use ... to replace the rest. - If the content is a long list of data / dict / json, you should only preseve the key items and use ... to replace the rest. - Be careful to preserve all information that might be useful in the future. You should at least reduce 50% of {target_id}. - Remember: wrap your answer with ``` - - Your response should be like: - ``` - ...content after filtering... - ``` - """), - token_generator='auto', - tokenizer=self.tokenizer, - ), - this_interaction=this_interaction[:-1], # exclude the latest llm message - strip_think=True, - ) - if generated_compressed_content.count("```") != 2: - raise RuntimeError(f"Cannot find ``` in llm_output content: {generated_compressed_content}") - compressed_content = generated_compressed_content.split("```")[1].strip() - self.full_context[target_index] = ExtendedMessage( - author=target_msg.author, - role=target_msg.role, - content=compressed_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - elif message_action == 'keep': - continue - else: - raise RuntimeError(f"Unknown action {message_action}, must be one of ['remove', 'keep', 'compress']") - - except Exception as e: - logger.bind(exception=True).exception(f"Error processing llm_output: {e}") - print(f"Error processing llm_output") - return - - - def replace_full_context_item(self, match_content: str, new_content: str): - success = False - for index in range(len(self.full_context)): - ext_msg = self.full_context[index] - if match_content in ext_msg.content_for_future: - success = True - self.full_context[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=new_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - # print_dict({match_content: new_content}) - return success - return success - - - def save_llm_output(self, llm_output, input_msg_ref): - ext_msg = CMTLinear.save_llm_output(self, llm_output, input_msg_ref) - this_interaction = copy.deepcopy(self.latest_llm_interaction_socket + [ext_msg]) - self.grouped_steps += [this_interaction] - self.after_save_llm_output(this_interaction) - self.latest_llm_interaction_socket = [] - return diff --git a/astune/context_manager/agentflow_cm/cmt_linear_think.py b/astune/context_manager/agentflow_cm/cmt_linear_think.py deleted file mode 100644 index 926bcde4..00000000 --- a/astune/context_manager/agentflow_cm/cmt_linear_think.py +++ /dev/null @@ -1,311 +0,0 @@ -import copy -from textwrap import dedent -from typing import List, Tuple -from astune.schema.trajectory import Sample, Reward -from astune.context_manager.cmt_linear import ExtendedMessage, CMTLinear -from beast_logger import register_logger, print_dict, print_nested, NestedJsonItem, SeqItem - -class MultiSampleCMT(CMTLinear): - def __init__(self, config, tokenizer): - super().__init__(config, tokenizer) - self.config = config - self.tokenizer = tokenizer - self.full_context: List[ExtendedMessage] = [] - self.current_context_status = "" - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len - - assert self.config.astune.data.max_response_length < self.config.astune.data.max_prompt_length, "think linear template requires a big max_prompt_length" - - self.max_seq_length: int = max_model_len - max_response_length - assert self.max_seq_length <= self.config.astune.data.max_prompt_length, "max_seq_length should be less than or equal to max_prompt_length" - - - self.max_env_output_length: int = self.config.astune.rollout.max_env_len - self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") - - self.terminal_rewards_dict = {} - self.latest_llm_interaction_socket: List[ExtendedMessage] = None - self.grouped_steps: List[List[ExtendedMessage]] = [] - - self.discarded = False - self.is_terminated = False - self.context_time_cost = 0 - self.already_mad_flag = False - - self.force_think = config.astune.rollout.force_think - self.env_action_preference = config.astune.task_reader.env_service.env_action_preference - if not self.force_think: - # think_hint_for_qwen3 = - self.think_hint: str = "\n\nThink about the next step before answering. Your thought (...) should be as short and concise as possible." - else: - if self.env_action_preference == "box": - force_think_prompt = dedent(""" - Additional requirements: Think before action! You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce your answer with \\box{}. - For example: - ...your thinking process... - \\box{...your final answer...} - """) - elif self.env_action_preference == "code": - force_think_prompt = dedent(""" - Additional requirements: Think before action! You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce the next-step action. - For example: - ...your thinking process... - ```python - # your action here - ``` - """) - else: - raise ValueError(f"Unsupported env_action_preference: {self.env_action_preference}") - # think_hint_for_qwen2 = - self.think_hint: str = force_think_prompt - - def _get_seq_length(self, messages: List[dict], tools=[]) -> int: - prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, tools=tools) - return len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) - - def check_context_token_num_safe(self, messages: List[dict], tools: List[dict] = []) -> Tuple[bool, str]: - if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - return False, "already_mad" - if self._get_seq_length(messages, tools=tools) < self.max_seq_length: # self.config.env_engine.max_seq_length = 20480 - return True, "safe" - else: - return False, "token_overflow" - - @property - def steps(self): - # TODO: need revise - return self.prepare_previous_context(mod='future') - - def generate_log(self, task_id = None, global_step="NA"): - task_id = self.task_id - nested_items_print_buffer = {} - for index, ext_steps in enumerate(self.grouped_steps): - cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) - text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] - input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] - loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] - buffer = { - "text_arr": text_arr, - "input_id_arr": input_id_arr, - "loss_mask_color_arr": loss_mask_color_arr, - } - raw_reward = self.reward_structure.raw_reward - step_reward:float = self.reward_structure.step_reward[index] - try: - step_advantage = self.reward_structure.step_advantage[index] - step_advantage_simple = self.reward_structure.step_advantage_simple[index] - except: - step_advantage = 0.0 - step_advantage_simple = 0.0 - task_outcome = str(self.reward_structure.success_rate) - selectors = [task_id, task_outcome, str(index)] - len_prompt_ids = len(cmt_tokenized["prompt_ids"]) - len_response_ids = len(cmt_tokenized["response_ids"]) - len_input_ids = len(cmt_tokenized["input_ids"]) - assert len_prompt_ids + len_response_ids == len_input_ids, "len_prompt_ids + len_response_ids should equal to len_input_ids" - # print(f"Task {task_id}, outcome {task_outcome}, group {index}, len_prompt_ids {len_prompt_ids}, len_response_ids {len_response_ids}, len_input_ids {len_input_ids}") - nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", - outcome=task_outcome, - len_prompt_ids=len_prompt_ids, - len_response_ids=len_response_ids, - len_input_ids=len_input_ids, - raw_reward=f"{float(raw_reward):.3f}", - step_reward=f"{float(step_reward):.3f}", - step_advantage=f"{float(step_advantage):.3f}", - step_advantage_simple=f"{float(step_advantage_simple):.3f}", - content=SeqItem( - text = buffer['text_arr'], # 文本 - title = buffer['text_arr'], # 鼠标悬浮文本 - count = buffer['input_id_arr'], # 高亮文本 - color = buffer['loss_mask_color_arr'] # 颜色 - ) - ) - print_nested(nested_items_print_buffer, - main_content="This is the main content of the nested JSON", - header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", - mod="rollout", - narrow=False, - attach="copy this" - ) - - - def group_tokenize(self): - return self.group_tokenize_multi_group() - - - def process_reward(self, reward_structure: Reward): - # linear mode has multiple trajectories - use_step_reward_from_env = self.config.astune.rollout.get("use_step_reward_from_env", False) - if not use_step_reward_from_env: - self.reward_structure = reward_structure - self.reward_structure.step_reward = [0.0 for _ in range(len(self.grouped_steps))] - for index, ext_steps in enumerate(self.grouped_steps): - self.reward_structure.step_reward[index] = self.compute_step_level_reward( - ext_steps=ext_steps, - index=index, - total_steps=len(self.grouped_steps) - ) - else: - step_reward = reward_structure.raw_step_reward - assert reward_structure.raw_step_reward - assert len(reward_structure.raw_step_reward) == len(self.grouped_steps), f"len(reward_structure.raw_step_reward) {len(reward_structure.raw_step_reward)} should equal to len(self.grouped_steps) {len(self.grouped_steps)}" - self.reward_structure = reward_structure - self.reward_structure.step_reward = reward_structure.raw_step_reward - - def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int, total_steps:int)->float: - assert self.reward_structure is not None - - # --------------- global level reward --------------- - global_reward = self.reward_structure.raw_reward - gamma = self.config.astune.rollout.gamma - step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) - - # --------------- compute step level reward --------------- - step_reward = step_reward_base - if self.already_mad_flag: - step_reward = self.config.astune.rollout.agent_madness_reward - self.reward_structure.madness = -1.0 - - return step_reward - - - -class LinearThinkCMT(MultiSampleCMT): - """ - A linear context manager template that handles the conversation flow between LLM and environment. - This class manages the context window, tokenization, and message history in a linear fashion. - - Attributes: - config: Configuration object containing environment and model settings - tokenizer: Tokenizer instance for processing text - full_context (List[ExtendedMessage]): List of all messages in the conversation - current_context_status (str): Current status of the context - max_seq_length (int): Maximum sequence length for the context window - max_env_output_length (int): Maximum length for environment outputs - terminal_rewards_dict (dict): Dictionary storing terminal rewards - - """ - - - - - - def prepare_next_llm_context(self): - self.latest_llm_interaction_socket = [] - # 筛选出 `初始message-user-llm-user-llm`` 或者 `初始message-llm-user-llm-user`` - self.latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "env"]) - - for index, ext_msg in enumerate(list(self.latest_llm_interaction_socket)): - # is_last 是最后一条信息 - # remove history llm author's think (and add /no_think tag to every but last message) - is_last = (index == len(self.latest_llm_interaction_socket) - 1) - # 根据消息类型进行处理 - if ext_msg.author == "llm": - # 如果是以往的llm消息,去掉think标签 - import re - new_ext_msg_content = re.sub(r'.*?', '', ext_msg.content, flags=re.DOTALL).strip() - new_ext_msg_content = new_ext_msg_content.replace("", "") - new_ext_msg_content = new_ext_msg_content.replace("", "") - # new_ext_msg_content = re.sub(r'.*?', '\n\n', ext_msg.content, flags=re.DOTALL) - - if self.config.astune.context_manager.linear_think_cm.train_history_infer_token: - assert ext_msg.author == "llm" - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=new_ext_msg_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - assert ext_msg.author == "llm" - author_override = "llm(do_not_train)" - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=author_override, - role=ext_msg.role, - content=new_ext_msg_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - elif ext_msg.author in ["env", "initialization"]: - if self.config.astune.context_manager.linear_think_cm.train_history_infer_token: - # 如果是初始化或者环境反馈,都加上 /no_think 标签 - if not is_last: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=ext_msg.content_for_future + "\n/no_think", - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=ext_msg.content_for_future + self.think_hint, - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - # 如果是初始化或者环境反馈 - if not is_last: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=ext_msg.content_for_future, - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=ext_msg.content_for_future + self.think_hint, - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - raise RuntimeError(f"Unknown author {ext_msg.author} in latest_llm_interaction_socket") - - dict_context = self.to_role_content(self.latest_llm_interaction_socket) - return dict_context - - - - def save_llm_output(self, llm_output, input_msg_ref): - ext_msg = super().save_llm_output(llm_output, input_msg_ref) - this_interaction = copy.deepcopy(self.latest_llm_interaction_socket + [ext_msg]) - self.grouped_steps += [this_interaction] - self.latest_llm_interaction_socket = [] - return ext_msg - - - def save_env_output(self, env_output:dict, input_msg_ref:List[dict]=None, add_nothink=False): - super().save_env_output(env_output, input_msg_ref, add_nothink) - return - - - def prepare_world_interaction(self) -> str: - latest_content = self.full_context[-1].content - if self.config.astune.context_manager.linear_think_cm.remove_think_before_submit_as_action: - import re - new_ext_msg_content = re.sub(r'.*?', '', latest_content, flags=re.DOTALL).strip() - new_ext_msg_content = new_ext_msg_content.replace("", "") - new_ext_msg_content = new_ext_msg_content.replace("", "") - latest_content = new_ext_msg_content.strip() - if self.config.astune.context_manager.linear_think_cm.extract_box_before_submit_as_action: - # take content within \box - # 提取 \box 中的内容 - import re - box_pattern = r'\\box\{(.*?)\}' - match = re.search(box_pattern, latest_content, re.DOTALL) - if match: - latest_content = match.group(1).strip() - else: - # 如果没有找到 \box,选择保留原内容 - pass - return latest_content - - diff --git a/astune/context_manager/agentflow_cm/cmt_memory.py b/astune/context_manager/agentflow_cm/cmt_memory.py deleted file mode 100644 index e69de29b..00000000 diff --git a/astune/context_manager/agentflow_cm/cmt_phantom_hint.py b/astune/context_manager/agentflow_cm/cmt_phantom_hint.py deleted file mode 100644 index c10f7a14..00000000 --- a/astune/context_manager/agentflow_cm/cmt_phantom_hint.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import List -from astune.context_manager.cmt_linear import ExtendedMessage, CMTLinear - - -class LinearThinkCMT(CMTLinear): - """ - A linear context manager template that handles the conversation flow between LLM and environment. - This class manages the context window, tokenization, and message history in a linear fashion. - - Attributes: - config: Configuration object containing environment and model settings - tokenizer: Tokenizer instance for processing text - full_context (List[ExtendedMessage]): List of all messages in the conversation - current_context_status (str): Current status of the context - max_seq_length (int): Maximum sequence length for the context window - max_env_output_length (int): Maximum length for environment outputs - terminal_rewards_dict (dict): Dictionary storing terminal rewards - - 1. prepare_next_llm_context - 2. check_context_token_num_safe - 3. prepare_world_interaction - 4. save_init_input - 5. save_llm_output - 6. save_env_output - 7. remove_last_context - 8. generate_log - 9. group_tokenize - """ - - def __init__(self, config, tokenizer, contain_phantom_hint=False, past_trajectory=None): - super().__init__(config, tokenizer) - self.contain_phantom_hint = contain_phantom_hint - self.past_trajectory = past_trajectory - self.helper_llm_handle = None - - def save_init_input(self, init_input_arr:list, add_nothink: bool=False): - if self.contain_phantom_hint: - ... - - return super().save_init_input(init_input_arr, add_nothink) - diff --git a/astune/context_manager/agentflow_cm/cmt_sliding_window.py b/astune/context_manager/agentflow_cm/cmt_sliding_window.py deleted file mode 100644 index c49f78ff..00000000 --- a/astune/context_manager/agentflow_cm/cmt_sliding_window.py +++ /dev/null @@ -1,205 +0,0 @@ -from typing import List, Callable, Tuple -from beast_logger import print_listofdict -from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, MultiSampleCMT -from loguru import logger - -""" -滑窗context管理器 -- 当context超出最大长度时,开始新的滑窗 -- 新的滑窗保留初始化信息、最新的env和llm信息 -- 其他信息忽略,生成一条“[Previous {x} conversation has been omitted for brevity.]”信息 -""" - - -class SlidingWindowCMT(MultiSampleCMT): - """ - A non-linear context manager template that handles the conversation flow between LLM and environment. - """ - - def __init__(self, config, tokenizer, llm_chat_fn): - self.llm_chat_fn = llm_chat_fn - self.latest_env_response_id = "" - self.latest_env_response_content = "" - self.console_debug_mode = False - self.force_think = config.astune.rollout.force_think - self.env_cnt = 0 - self.llm_cnt = 0 - self.config = config - self.tokenizer = tokenizer - self.full_context: List[ExtendedMessage] = [] - self.current_context_status = "" - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len - self.max_seq_length: int = max_model_len - max_response_length - self.max_env_output_length: int = self.config.astune.rollout.max_env_len - self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") - self.terminal_rewards_dict = {} - self.latest_llm_interaction_socket: List[ExtendedMessage] = None - self.grouped_steps: List[List[ExtendedMessage]] = [] - self.discarded = False - self.is_terminated = False - self.context_time_cost = 0 - self.generated_token_cnt = 0 - self.omitted_msg_so_far = 0 - self.prompt_part_token_overflow = False - self.already_mad_flag = False - self.round_cnt = 0 - - def prepare_next_llm_context(self): - """Prepare the next LLM context with sliding window logic. When the token length exceeds the maximum limit, start a new sliding window. - """ - self.latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "llm(do_not_train)", "env", "memory"]) - dict_context = self.to_role_content(self.latest_llm_interaction_socket) - - # if token overflow, begin new sliding window - cur_seq_len = self._get_seq_length(dict_context) - # print(f"cur_seq_len {cur_seq_len}, self.max_seq_length {self.max_seq_length}") - - is_safe: bool = cur_seq_len < self.max_seq_length - if not is_safe: - _, previous_interaction = self._prepare_next_llm_context_static() - self.begin_new_sliding_window(previous_interaction=previous_interaction) - - dict_context, self.latest_llm_interaction_socket = self._prepare_next_llm_context_static() - cur_seq_len = self._get_seq_length(dict_context) - if cur_seq_len > self.config.astune.data.max_prompt_length: - print(f"Warning! cur_seq_len={cur_seq_len} immediately after new sliding window is created") - print_listofdict( - dict_context, mod='env_clip' - ) - self.prompt_part_token_overflow = True - - return dict_context - - - def _prepare_next_llm_context_static(self): - """Fetch from context and convert to dict format. - """ - latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "llm(do_not_train)", "env", "memory"]) - dict_context = self.to_role_content(latest_llm_interaction_socket) - return dict_context, latest_llm_interaction_socket - - - def check_context_token_num_safe(self, messages: List[dict], tools=[]) -> Tuple[bool, str]: - """Always be safe because we already check in `prepare_next_llm_context` - """ - if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - return False, "already_mad" - - assert self._get_seq_length(messages, tools) < self.max_seq_length - - if self.prompt_part_token_overflow: - return False, "prompt_part_token_overflow" - else: - return True, "safe" - - - def begin_new_sliding_window(self, previous_interaction): - """Begin a new sliding window by preserving initialization, latest env and llm messages, and summarizing the rest into a memory message. - """ - self.grouped_steps += [previous_interaction] - recall_x_action = 2 - # delete most `llm` and `env` messages, keep only the last 2 of each - preserve_messages = self.filter_context_via_authors_with_limit( - authors = ["initialization", "llm", "env", "memory"], - limit={ - "llm": f"keep_last@{recall_x_action}", - "env": f"keep_last@{recall_x_action+1}", - "memory": "keep_last@1", - } - ) - other_messages = [ext_msg for ext_msg in self.filter_context_via_authors(authors = ["initialization", "llm", "env", "memory"]) if ext_msg not in preserve_messages] - # TODO: find a way to summarize previous messages - self.omitted_msg_so_far += len(other_messages) - # init message in `preserve_messages` - init_message_in_preserve_messages = [msg for msg in preserve_messages if msg.author == "initialization"] - # create memory message - other_messages = init_message_in_preserve_messages + other_messages # include init when create memory - memory_msg = self.create_memory_message(other_messages) - # inseart `preserve_messages` after initialization - new_context_beginning = init_message_in_preserve_messages + [memory_msg] + [msg for msg in preserve_messages if msg.author != "initialization"] - # disable llm training for all message in `new_context_beginning` - for i in range(len(new_context_beginning)): - ext_msg = new_context_beginning[i] - if ext_msg.author == 'llm': - author_override = "llm(do_not_train)" - new_context_beginning[i] = ExtendedMessage( - author=author_override, - role=ext_msg.role, - content=ext_msg.content_for_future, - token_generator='auto', - tokenizer=self.tokenizer, - ) - self.full_context = new_context_beginning - # delete old memory message - self.full_context = self.filter_context_via_authors_with_limit( - authors = ["initialization", "llm", "llm(do_not_train)", "env", "memory"], - limit={ - "memory": "keep_last@1", - } - ) - - def create_memory_message(self, msg_list: List[ExtendedMessage]) -> ExtendedMessage: - """TODO: create a better summary message - """ - x = self.omitted_msg_so_far // 2 - enable_llm_memory_extraction = self.config.astune.context_manager.sliding_window_cm - if not enable_llm_memory_extraction: - return ExtendedMessage( - author="memory", - role="user", - content=f"[Previous {x} round of conversations have been omitted for brevity.]", - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - return ExtendedMessage( - author="memory", - role="user", - content=self.llm_memory_extraction(msg_list), - token_generator='auto', - tokenizer=self.tokenizer, - ) - - def ensure_terminate_rollout_stage(self): - previous_interaction_dict_context, previous_interaction = self._prepare_next_llm_context_static() - if any([ext_msg.need_training for ext_msg in previous_interaction]): - self.grouped_steps += [previous_interaction] - - - def save_env_output(self, env_output, input_msg_ref = None, add_nothink=False): - self.env_cnt += 1 - env_output['content'] = f"[Current Env Step {self.env_cnt}]\n\n" + env_output['content'] - return super().save_env_output(env_output, input_msg_ref, add_nothink) - - - def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context=True): - self.llm_cnt += 1 - return super().save_llm_output(llm_output, input_msg_ref) - - - def llm_memory_extraction(self, msg_list: List[ExtendedMessage]) -> str: - """Use LLM to extract memory from previous messages. - """ - from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn - from textwrap import dedent - self.alien_llm_chat_fn: Callable = construct_alien_llm_chat_fn(self.config, self.config.actor_rollout_ref.rollout) - messages = self.to_role_content(msg_list) - messages.append({ - "role": "user", - "content": dedent(""" - New task: Summarize the previous attempts into a concise memory statement that captures the key points and context. - - Start with: Previously, X attempts have been made, in these attempts, ... - - Focus on the main events, actions, and outcomes. - - If there are big or repeated failures, try to find reason and provide some future advice. - """) - }) - - try: - llm_output = self.alien_llm_chat_fn(messages, request_id="") - except Exception as e: - logger.bind(exception=True).exception(f"call alien_llm_chat_fn error with {e}") - x = self.omitted_msg_so_far // 2 - llm_output_content = f"[Previous {x} round of conversations have been omitted for brevity.]" - return llm_output_content - return llm_output['content'] diff --git a/astune/workflow_controller/basic_agentflow.py b/astune/workflow_controller/basic_agentflow.py index 1185cf8e..87b4a5f7 100644 --- a/astune/workflow_controller/basic_agentflow.py +++ b/astune/workflow_controller/basic_agentflow.py @@ -1,5 +1,4 @@ from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.context_manager.agentflow_cm.cmt_linear_think import LinearThinkCMT from typing import Any, Dict, List, Union, Callable class BaseAgentFlow(object): @@ -12,7 +11,7 @@ def __init__(self, self.tokenizer = tokenizer self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") self.response_template_ids = self.tokenizer.encode("<|im_start|>assistant\n") - self.cmt: Union[CMTLinear, LinearThinkCMT, Any, None] = None + self.cmt: Union[CMTLinear, Any, None] = None self.alien_llm_chat_fn: Union[Callable, None] = None self.llm_chat_fn: Callable = llm_chat_fn self.config = config diff --git a/astune/workflow_controller/classic_agentflow.py b/astune/workflow_controller/classic_agentflow.py index 848f45a7..1c8cf227 100644 --- a/astune/workflow_controller/classic_agentflow.py +++ b/astune/workflow_controller/classic_agentflow.py @@ -7,9 +7,6 @@ from astune.utils.utils import convert_tool_to_user_message from astune.schema.trajectory import Reward from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.context_manager.agentflow_cm.cmt_linear_think import LinearThinkCMT -from astune.context_manager.agentflow_cm.cmt_context_clip import SelfContextClipCMT -from astune.context_manager.agentflow_cm.cmt_sliding_window import SlidingWindowCMT from astune.workflow_controller.basic_agentflow import BaseAgentFlow from typing import Any, Dict, List, Union, Callable from beast_logger import print_listofdict @@ -33,12 +30,12 @@ def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> C # 1. 🚀 Initialize messages if self.config.astune.context_manager.context_manager_type == "linear": self.cmt = CMTLinear(self.config, self.tokenizer) - elif self.config.astune.context_manager.context_manager_type == "linear_think": - self.cmt = LinearThinkCMT(self.config, self.tokenizer) - elif self.config.astune.context_manager.context_manager_type == "context_selfclip": - self.cmt = SelfContextClipCMT(self.config, self.tokenizer, self.llm_chat_fn) - elif self.config.astune.context_manager.context_manager_type == "sliding_window": - self.cmt = SlidingWindowCMT(self.config, self.tokenizer, self.llm_chat_fn) + # elif self.config.astune.context_manager.context_manager_type == "linear_think": + # self.cmt = LinearThinkCMT(self.config, self.tokenizer) + # elif self.config.astune.context_manager.context_manager_type == "context_selfclip": + # self.cmt = SelfContextClipCMT(self.config, self.tokenizer, self.llm_chat_fn) + # elif self.config.astune.context_manager.context_manager_type == "sliding_window": + # self.cmt = SlidingWindowCMT(self.config, self.tokenizer, self.llm_chat_fn) else: raise ValueError(f"Unsupported context template: {self.config.astune.context_manager.context_manager_type}") From 9e3836a6e3f5bc4bd456ce6257be06aafbeb65d4 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 18 Nov 2025 11:35:29 +0800 Subject: [PATCH 051/462] remove lock --- astune/workflow_controller/agentscope_flow.py | 5 +---- astune/workflow_controller/classic_agentflow.py | 2 -- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/astune/workflow_controller/agentscope_flow.py b/astune/workflow_controller/agentscope_flow.py index 99467196..026ab4bd 100644 --- a/astune/workflow_controller/agentscope_flow.py +++ b/astune/workflow_controller/agentscope_flow.py @@ -13,8 +13,6 @@ from astune.context_manager.agentscope_cm.cmt_agentscope import ASTuneProxy from astune.schema.task import Task, TaskLaunchCoreArgument -log_generate_lock = threading.Lock() - class AgentScopeWorkflow(BaseAgentFlow): def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg: TaskLaunchCoreArgument) -> CMTLinear: @@ -53,8 +51,7 @@ def should_interrupt_fn() -> bool: return True return False def generated_token_callback_fn(token_array): - with log_generate_lock: - obs_window['token'][task_thread_index] += len(token_array) + obs_window['token'][task_thread_index] += len(token_array) astune_proxy = ASTuneProxy( llm_chat_fn=self.llm_chat_fn, diff --git a/astune/workflow_controller/classic_agentflow.py b/astune/workflow_controller/classic_agentflow.py index 1c8cf227..988e88eb 100644 --- a/astune/workflow_controller/classic_agentflow.py +++ b/astune/workflow_controller/classic_agentflow.py @@ -11,8 +11,6 @@ from typing import Any, Dict, List, Union, Callable from beast_logger import print_listofdict -log_generate_lock = threading.Lock() - class AgentFlow(BaseAgentFlow): From 9aa509af44093c1eff59fccb378e398918125815 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Tue, 18 Nov 2025 11:39:16 +0800 Subject: [PATCH 052/462] add interface --- astune/context_manager/tuner.py | 79 +++++++++++++++++++++++++++++++++ astune/protocol/workflow.py | 28 ++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 astune/context_manager/tuner.py create mode 100644 astune/protocol/workflow.py diff --git a/astune/context_manager/tuner.py b/astune/context_manager/tuner.py new file mode 100644 index 00000000..d08942e7 --- /dev/null +++ b/astune/context_manager/tuner.py @@ -0,0 +1,79 @@ +"""Model Used by AgentScope""" + +from typing import Optional + +from agentscope.model import ChatModelBase, OpenAIChatModel +from agentscope.types import JSONSerializableObject +from openai import AsyncOpenAI + + +class ModelTuner(OpenAIChatModel): + """A model class used by AgentScope-tune for RL training.""" + + def __init__( + self, + openai_async_client: AsyncOpenAI, + generate_kwargs: dict[str, JSONSerializableObject] | None = None, + enable_thinking: Optional[bool] = None, + ) -> None: + """Initialize the Trinity model class. + + Args: + openai_async_client (`AsyncOpenAI`): + The OpenAI async client instance provided by Trinity-RFT. + generate_kwargs (`dict[str, JSONSerializableObject] | None`, \ + optional): + Additional keyword arguments to pass to the model's generate + method. Defaults to None. + enable_thinking (`bool`, optional): + Whether to enable the model's thinking capability. Only + applicable for Qwen3 series models. Defaults to None. + """ + model_name = getattr(openai_async_client, "model_path", None) + if model_name is None: + raise ValueError( + "The provided openai_async_client does not have a " + "`model_path` attribute. Please ensure you are using " + "the instance provided by Trinity-RFT.", + ) + super().__init__( + model_name=model_name, + api_key="EMPTY", + generate_kwargs=generate_kwargs, + stream=False, # RL training does not support streaming + ) + if enable_thinking is not None: + if "chat_template_kwargs" not in self.generate_kwargs: + self.generate_kwargs["chat_template_kwargs"] = {} + assert isinstance( + self.generate_kwargs["chat_template_kwargs"], + dict, + ), "chat_template_kwargs must be a dictionary." + self.generate_kwargs["chat_template_kwargs"]["enable_thinking"] = enable_thinking + # change the client instance to the provided one + self.client = openai_async_client + self.model_registry: dict[str, ChatModelBase] = {} + + def register_model(self, name: str, model: ChatModelBase) -> None: + """Register a model instance with a given name. + + Args: + name (`str`): + The name to register the model under. + model (`ChatModelBase`): + The model instance to register. + """ + self.model_registry[name] = model + + def get_model(self, name: str) -> ChatModelBase: + """Get the model instance by name. + + Args: + name (`str`): + The name of the model to retrieve. + + Returns: + ChatModelBase: + The model instance corresponding to the provided name. + """ + return self.model_registry.get(name, self) diff --git a/astune/protocol/workflow.py b/astune/protocol/workflow.py new file mode 100644 index 00000000..59fab900 --- /dev/null +++ b/astune/protocol/workflow.py @@ -0,0 +1,28 @@ +"""Define workflow related interfaces.""" + +from typing import Dict + +from pydantic import BaseModel, Field + +from astune.context_manager.tuner import ModelTuner + + +class WorkflowOutput(BaseModel): + """Workflow Output Structure.""" + + reward: float + metadata: Dict + + +class Workflow(BaseModel): + """Workflow Protocol. + + A workflow defines how to use a model to complete a task. + """ + + name: str = "my_workflow" + config: Dict = Field(default_factory=dict) + + def run(self, task: Dict, tuner: ModelTuner) -> WorkflowOutput: + """Run the workflow on a given task.""" + raise NotImplementedError From 8d05d89abdfbd2de78eee4fd87f84881037480e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Wed, 19 Nov 2025 02:41:37 +0800 Subject: [PATCH 053/462] re-locate modules --- README.md | 11 +- astune/__init__.py | 4 + astune/backbone/native_compat_trainer.py | 4 +- astune/backbone/trinity_compat_workflow.py | 6 +- .../agentscope_cm/cmt_agentscope.py | 97 -------- .../agentscope_cm/cmt_request_proxy.py | 210 ------------------ astune/context_manager/tuner.py | 79 ------- astune/context_tracker/__init__.py | 1 + .../agentscope_tracker/agentscope_tuner.py} | 0 .../multiagent_tracking.py} | 123 +++++++++- .../agentscope_tracker/request_proxy.py | 128 +++++++++++ .../agentscope_tracker}/timeline_merging.py | 7 +- .../basic_tracker.py} | 44 +--- .../tracker_base_attr.py} | 10 +- astune/default_config/astune_default.yaml | 4 +- astune/protocol/agentscope_protocol.py | 26 --- astune/protocol/workflow.py | 28 --- astune/schema/task.py | 9 +- astune/task_reader/env_service_reader.py | 2 +- astune/task_rollout/async_llm_bridge.py | 10 +- astune/task_rollout/dashscope_llm_bridge.py | 4 +- astune/task_rollout/env_worker.py | 129 ----------- astune/task_rollout/native_parallel_worker.py | 18 +- astune/task_rollout/resource_keeper.py | 37 +++ astune/task_rollout/single_worker.py | 130 ++++------- .../__init__.py} | 7 +- astune/task_runner/agentscope_runner.py | 121 ++++++++++ .../classic_runner.py} | 27 +-- astune/tuner.py | 154 +++++++++++++ astune/utils/dynamic_import.py | 7 + astune/utils/env_service_client/__init__.py | 0 .../env_service_client/em_client.py | 0 .../env_service_client/env_client.py | 0 .../env_service_client/env_client_ng.py | 0 astune/utils/logger.py | 12 + astune/utils/retry.py | 45 ++++ astune/utils/sample.py | 26 +++ astune/workflow.py | 22 ++ astune/workflow_controller/agentscope_flow.py | 102 --------- pyrightconfig.json | 9 +- tutorial/appworld.md | 2 +- tutorial/appworld.py | 20 +- tutorial/math_agent.md | 2 +- tutorial/math_agent.py | 29 +-- tutorial/werewolves/start.py | 6 +- tutorial/werewolves/werewolves.md | 2 +- 46 files changed, 815 insertions(+), 899 deletions(-) delete mode 100644 astune/context_manager/agentscope_cm/cmt_agentscope.py delete mode 100644 astune/context_manager/agentscope_cm/cmt_request_proxy.py delete mode 100644 astune/context_manager/tuner.py create mode 100644 astune/context_tracker/__init__.py rename astune/{env_service_client/__init__.py => context_tracker/agentscope_tracker/agentscope_tuner.py} (100%) rename astune/{context_manager/agentscope_cm/cmt_multi_sample.py => context_tracker/agentscope_tracker/multiagent_tracking.py} (68%) create mode 100644 astune/context_tracker/agentscope_tracker/request_proxy.py rename astune/{context_manager/agentscope_cm => context_tracker/agentscope_tracker}/timeline_merging.py (83%) rename astune/{context_manager/cmt_linear.py => context_tracker/basic_tracker.py} (92%) rename astune/{context_manager/cmt_base_attr.py => context_tracker/tracker_base_attr.py} (89%) delete mode 100644 astune/protocol/agentscope_protocol.py delete mode 100644 astune/protocol/workflow.py delete mode 100644 astune/task_rollout/env_worker.py create mode 100644 astune/task_rollout/resource_keeper.py rename astune/{workflow_controller/basic_agentflow.py => task_runner/__init__.py} (79%) create mode 100644 astune/task_runner/agentscope_runner.py rename astune/{workflow_controller/classic_agentflow.py => task_runner/classic_runner.py} (88%) create mode 100644 astune/tuner.py create mode 100644 astune/utils/dynamic_import.py create mode 100644 astune/utils/env_service_client/__init__.py rename astune/{ => utils}/env_service_client/em_client.py (100%) rename astune/{ => utils}/env_service_client/env_client.py (100%) rename astune/{ => utils}/env_service_client/env_client_ng.py (100%) create mode 100644 astune/utils/logger.py create mode 100644 astune/utils/retry.py create mode 100644 astune/utils/sample.py create mode 100644 astune/workflow.py delete mode 100644 astune/workflow_controller/agentscope_flow.py diff --git a/README.md b/README.md index 43f605dc..8803013d 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ Let see: - class::TaskReaderJsonl - class::TaskReaderHuggingFace -2. 定义 AgentScopeWorkflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - tutorial/appworld.py - tutorial/math_agent.py @@ -114,7 +114,7 @@ Let see: - astune/default_config/config_auto_convertion_trinity.json 6. ASTune 和 AgentScope 交互系统 V0.5 - - astune/context_manager/cmt_agentscope.py 负责 + - astune/context_tracker/agentscope.py 负责 - 处理AgentScope生成的Token - 缓存judge给出评分需要的各种数据(包括但不限于所有对话message,env_service句柄,从astune.task_reader读取的task metadata等) - 提供LLM的桥接 @@ -170,4 +170,9 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi - [ ] Trinity Display Infer Progress, e.g. token per second - [ ] Trinity: SFT support - [ ] AgentScope Studio Intergration -- [ ] AgentScope \ No newline at end of file +- [ ] AgentScope + + +# Future + +- [ ] Generative Adversarial Distillation: https://www.alphaxiv.org/abs/2511.10643 \ No newline at end of file diff --git a/astune/__init__.py b/astune/__init__.py index e69de29b..a2417b26 100644 --- a/astune/__init__.py +++ b/astune/__init__.py @@ -0,0 +1,4 @@ +from .tuner import ModelTuner +from .workflow import Workflow +from .workflow import WorkflowOutput +from astune.schema.task import WorkflowTask, WorkflowOutput diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index 1c48884e..59abbf61 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -64,7 +64,7 @@ from astune.schema.trajectory import Trajectory from astune.utils.message import send_train_message from beast_logger import register_logger, print_dict -from astune.context_manager.cmt_linear import CMTLinear +from astune.context_tracker.basic_tracker import BasicContextTracker import os import json from typing import List, Dict, Union, Type @@ -1257,7 +1257,7 @@ def fit(self): print([gen_batch.non_tensor_batch["task_id"][i] for i in range(len(gen_batch))]) print("=" * 10 + "start fit rollout" + "=" * 10) self.parallel_env.current_global_steps = self.global_steps - trajectories: List[CMTLinear] = self.parallel_env.rollout(tasks, mode="sample", epoch=f"train.{epoch}") + trajectories: List[BasicContextTracker] = self.parallel_env.rollout(tasks, mode="sample", epoch=f"train.{epoch}") print("=" * 10 + "end fit rollout" + "=" * 10) print("begin to convert trajectories to dataproto") gen_batch_output = self.parallel_env.to_dataproto(trajectories) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index 45d2f192..943e1b64 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -13,7 +13,7 @@ from astune.task_rollout.native_parallel_worker import DynamicRollout from astune.schema.trajectory import Sample from astune.utils.config_utils import read_astune_config -from astune.context_manager.cmt_base_attr import CMTBaseAttr +from astune.context_tracker.tracker_base_attr import TrackerAttr class TrinityCompatWorkflow(DynamicRollout): @@ -73,7 +73,7 @@ def thread_worker(self): obs_window=obs_window ) - def run_in_new_thread(self) -> CMTBaseAttr: + def run_in_new_thread(self) -> TrackerAttr: result_holder = {} exc_holder = {} @@ -90,7 +90,7 @@ def _target(): if "exc" in exc_holder: raise exc_holder["exc"] - thread_conclusion: CMTBaseAttr = result_holder.get("result", None) # type: ignore + thread_conclusion: TrackerAttr = result_holder.get("result", None) # type: ignore return thread_conclusion diff --git a/astune/context_manager/agentscope_cm/cmt_agentscope.py b/astune/context_manager/agentscope_cm/cmt_agentscope.py deleted file mode 100644 index 6b63820e..00000000 --- a/astune/context_manager/agentscope_cm/cmt_agentscope.py +++ /dev/null @@ -1,97 +0,0 @@ -import importlib -from loguru import logger - -from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model -from astune.context_manager.agentscope_cm.cmt_request_proxy import ASTuneLmProxy - -from typing import Any, List, Dict - - -class ASTuneProxy(ASTuneLmProxy): - """ - A proxy class that bridge: - - environment - - reward - - policy llm model - """ - - - async def __call__( - self, - messages: list[dict[str, Any]], - tools: list[dict] | None = None, - tool_choice = None, - structured_model = None, - **kwargs: Any, - ): - - # For qvq and qwen-vl models, the content field cannot be `None` or - # `[{"text": None}]`, so we need to convert it to an empty list. - if self.model_name.startswith("qvq") or "-vl" in self.model_name: - raise NotImplementedError("Not implemented for qvq and qwen-vl models yet.") - - kwargs = { - "messages": messages, - "model": self.model_name, - "stream": self.stream, - **self.dscm_ref.generate_kwargs, - **kwargs, - "result_format": "message", - # In agentscope, the `incremental_output` must be `True` when - # `self.stream` is True - "incremental_output": self.stream, - } - - if tools: - kwargs["tools"] = self.dscm_ref._format_tools_json_schemas(tools) - - if tool_choice: - self.dscm_ref._validate_tool_choice(tool_choice, tools) - kwargs["tool_choice"] = self.dscm_ref._format_tool_choice(tool_choice) - - if ( - self.dscm_ref.enable_thinking is not None - and "enable_thinking" not in kwargs - ): - kwargs["enable_thinking"] = self.dscm_ref.enable_thinking - - if structured_model: - if tools or tool_choice: - logger.warning( - "structured_model is provided. Both 'tools' and " - "'tool_choice' parameters will be overridden and " - "ignored. The model will only perform structured output " - "generation without calling any other tools.", - ) - format_tool = _create_tool_from_base_model(structured_model) - kwargs["tools"] = self.dscm_ref._format_tools_json_schemas( - [format_tool], - ) - kwargs["tool_choice"] = self.dscm_ref._format_tool_choice( - format_tool["function"]["name"], - ) - - response = await self.execute_model_proxy( - api_key=self.dscm_ref.api_key, - structured_model=structured_model, - **kwargs, - ) - return response - - def update_agentscope_input_dictionary(self, **kwargs): - self.input_kwargs.update(kwargs) - - def get_agentscope_input_dictionary(self): - return self.input_kwargs - - def update_judge_input_dictionary(self, **kwargs): - self.output_kwargs.update(kwargs) - - def get_judge_input_dictionary(self): - return self.output_kwargs - - def get_judge(self): - judge_protocol = self.config.astune.task_judge.judge_protocol - module_, class_ = judge_protocol.split('->') - protocol_cls = getattr(importlib.import_module(module_), class_) - return protocol_cls(self.config) # type: ignore diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py deleted file mode 100644 index 8cc6a482..00000000 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ /dev/null @@ -1,210 +0,0 @@ -import copy -import time -from loguru import logger -from pydantic import BaseModel -from beast_logger import print_dict, print_listofdict - -from transformers.tokenization_utils import PreTrainedTokenizer -from agentscope.model import ChatResponse -from agentscope.message import TextBlock, ToolUseBlock -from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.agentscope_cm.cmt_multi_sample import ASTuneContextTracking -from astune.context_manager.agentscope_cm.timeline_merging import can_merge_steps - -from typing import Any, List, Type, Dict - -def remove_fields(d: Dict, fields: List[str]) -> Dict: - d = copy.deepcopy(d) - for field in fields: - d.pop(field.strip(), None) - return d - -class ASTuneLmProxy(ASTuneContextTracking): - - async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: - # load messages into `self.full_context` - self.full_context = [] - - consider_roles = ['user', 'assistant', 'system', 'tool'] - disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls - if disable_toolcalls: - consider_roles.remove('tool') - - for i, msg in enumerate(messages): - if (disable_toolcalls) and (not isinstance(msg['content'], str)): - continue - if msg['role'] not in consider_roles: - continue - if not isinstance(msg['content'], str): - author = 'env' - ignore = False - str_content = "" - for item in msg['content']: - if 'text' not in item: - logger.warning(f"Non-text content in message content detected: {item}. Ignoring.") - ignore = True - break - if isinstance(item['text'], str): - str_content += str(item['text']) - else: - str_content = "" - msg['content'] = str_content - if ignore: - continue - msg['content'] = str(msg['content']) # TODO: better handling mm data - if msg['role'] == 'system': - author = 'initialization' - if msg['role'] == 'tool': - author = 'env' - else: - author = 'env' - - self.full_context += [ - ExtendedMessage( - author=author, - role=msg['role'], - content=msg['content'], - tokenizer=self.tokenizer, - tools=tools, - tool_calls=msg['tool_calls'] if 'tool_calls' in msg else [], - token_generator="auto", - ) - ] - - # check token overflow - converted_message = self.to_role_content(self.full_context) - is_safe, info = self.check_context_token_num_safe(converted_message, tools) - custom_sampling_params = {} - if not is_safe: - logger.warning(f"[{info}] detected. Current token count exceeds the limit.") - self.context_overflow = True - return ChatResponse( - content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] - ) - - # try: - # if self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools): - # logger.warning("Tokenization between original messages and converted messages mismatch!") - # # print_listofdict(converted_message, mod='exception', header='[exception] proxy converted_message') - # # print_listofdict(messages, mod='exception', header='[exception] proxy messages') - # except Exception as e: - # # print_listofdict(converted_message, mod='exception', header='proxy converted_message') - # # print_listofdict(messages, mod='exception', header='proxy messages') - # logger.error(f"Tokenization check failed due to error: {e}") - # from vsdb import bp;bp("OH") - - llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) - # print_dict(remove_fields(llm_output, fields=['request_id', 'tokens', 'tool_call_id']), header='response') - - # print('-----------------------------------------') - # print('-----------------------------------------') - # print('-----------------------------------------') - # print('-----------------------------------------') - # time.sleep(10) - # compute_string_madness - if not self.already_mad_flag: - if compute_string_madness(completion=llm_output['content'], checklist=self.config.astune.rollout.compute_madness_checklist) < 0.0: - self.already_mad_flag = True - - # dummy response for now - token_generator = "manual" - if llm_output.get("tool_calls", None) is not None: - tool_calls = llm_output["tool_calls"] - else: - tool_calls = [] - - llm_ext_msg = ExtendedMessage( - author="llm", - role="assistant", - content=llm_output['content'], - token_generator=token_generator, - tool_calls=tool_calls, - tokenizer=self.tokenizer, - ) - - if token_generator == "manual": - input_msg_ref = copy.deepcopy(converted_message) - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output, tools=tools) - assert len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn, f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" - llm_ext_msg.token_arr = token_arr_method2 - llm_ext_msg.token_logprob_arr = token_logprob_arr - self.generated_token_callback_fn(llm_ext_msg.token_arr) - - # take snapshot of current timeline - if is_safe: - self.full_context += [ llm_ext_msg ] - is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) - if length > self.config.astune.rollout.max_model_len: - raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, before gen info {info}, generated token length {len(llm_ext_msg.token_arr)}") - self.grouped_steps += [copy.deepcopy(self.full_context)] - - DEBUG = True - if DEBUG and len(self.grouped_steps) >= 2 and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])): - print(f"General Warning: merge failure discovered.") - - # return response - return await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) - - async def _parse_dashscope_generation_response( - self, - message, - structured_model: Type[BaseModel] | None = None, - ) -> ChatResponse: - - - content_blocks: List[TextBlock | ToolUseBlock] = [] - content = message.get("content") - metadata: dict | None = None - - if content not in [ - None, - "", - [], - ]: - if isinstance(content, list): - for item in content: - if isinstance(item, dict) and "text" in item: - content_blocks.append( - TextBlock( - type="text", - text=item["text"], - ), - ) - else: - content_blocks.append( - TextBlock( - type="text", - text=content, - ), - ) - - if message.get("tool_calls"): - for tool_call in message["tool_calls"]: - input_ = _json_loads_with_repair( - tool_call["function"].get( - "arguments", - "{}", - ) - or "{}", - ) - content_blocks.append( - ToolUseBlock( - type="tool_use", - name=tool_call["function"]["name"], - input=input_, # type: ignore - id=tool_call["id"], - ), - ) - - if structured_model: - metadata = input_ # type: ignore - - - parsed_response = ChatResponse( - content=content_blocks, - metadata=metadata, - ) - - return parsed_response diff --git a/astune/context_manager/tuner.py b/astune/context_manager/tuner.py deleted file mode 100644 index d08942e7..00000000 --- a/astune/context_manager/tuner.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Model Used by AgentScope""" - -from typing import Optional - -from agentscope.model import ChatModelBase, OpenAIChatModel -from agentscope.types import JSONSerializableObject -from openai import AsyncOpenAI - - -class ModelTuner(OpenAIChatModel): - """A model class used by AgentScope-tune for RL training.""" - - def __init__( - self, - openai_async_client: AsyncOpenAI, - generate_kwargs: dict[str, JSONSerializableObject] | None = None, - enable_thinking: Optional[bool] = None, - ) -> None: - """Initialize the Trinity model class. - - Args: - openai_async_client (`AsyncOpenAI`): - The OpenAI async client instance provided by Trinity-RFT. - generate_kwargs (`dict[str, JSONSerializableObject] | None`, \ - optional): - Additional keyword arguments to pass to the model's generate - method. Defaults to None. - enable_thinking (`bool`, optional): - Whether to enable the model's thinking capability. Only - applicable for Qwen3 series models. Defaults to None. - """ - model_name = getattr(openai_async_client, "model_path", None) - if model_name is None: - raise ValueError( - "The provided openai_async_client does not have a " - "`model_path` attribute. Please ensure you are using " - "the instance provided by Trinity-RFT.", - ) - super().__init__( - model_name=model_name, - api_key="EMPTY", - generate_kwargs=generate_kwargs, - stream=False, # RL training does not support streaming - ) - if enable_thinking is not None: - if "chat_template_kwargs" not in self.generate_kwargs: - self.generate_kwargs["chat_template_kwargs"] = {} - assert isinstance( - self.generate_kwargs["chat_template_kwargs"], - dict, - ), "chat_template_kwargs must be a dictionary." - self.generate_kwargs["chat_template_kwargs"]["enable_thinking"] = enable_thinking - # change the client instance to the provided one - self.client = openai_async_client - self.model_registry: dict[str, ChatModelBase] = {} - - def register_model(self, name: str, model: ChatModelBase) -> None: - """Register a model instance with a given name. - - Args: - name (`str`): - The name to register the model under. - model (`ChatModelBase`): - The model instance to register. - """ - self.model_registry[name] = model - - def get_model(self, name: str) -> ChatModelBase: - """Get the model instance by name. - - Args: - name (`str`): - The name of the model to retrieve. - - Returns: - ChatModelBase: - The model instance corresponding to the provided name. - """ - return self.model_registry.get(name, self) diff --git a/astune/context_tracker/__init__.py b/astune/context_tracker/__init__.py new file mode 100644 index 00000000..1b8a5dc8 --- /dev/null +++ b/astune/context_tracker/__init__.py @@ -0,0 +1 @@ +from astune.context_tracker.agentscope_tracker.agentscope_tuner import AgentScopeTuneProxy \ No newline at end of file diff --git a/astune/env_service_client/__init__.py b/astune/context_tracker/agentscope_tracker/agentscope_tuner.py similarity index 100% rename from astune/env_service_client/__init__.py rename to astune/context_tracker/agentscope_tracker/agentscope_tuner.py diff --git a/astune/context_manager/agentscope_cm/cmt_multi_sample.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py similarity index 68% rename from astune/context_manager/agentscope_cm/cmt_multi_sample.py rename to astune/context_tracker/agentscope_tracker/multiagent_tracking.py index a2f7acea..a2cf4763 100644 --- a/astune/context_manager/agentscope_cm/cmt_multi_sample.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -1,18 +1,19 @@ +import copy from loguru import logger from agentscope.model import DashScopeChatModel from astune.schema.trajectory import Reward from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids +from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage, replace_token_ids from astune.utils.color_hsl import adjust_color_hsl from astune.utils.compute_madness import compute_string_madness from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE -from astune.context_manager.agentscope_cm.timeline_merging import can_merge_steps +from astune.context_tracker.agentscope_tracker.timeline_merging import can_merge_steps from typing import Any, List, Tuple, Union from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem -class ASTuneContextTracking(CMTLinear): +class MultiAgentContextTracking(BasicContextTracker): def __init__( self, @@ -24,11 +25,10 @@ def __init__( generated_token_callback_fn, **kwargs ): - super().__init__(config, tokenizer) + super().__init__(config, tokenizer, **kwargs) self.task_batch_index = kwargs.pop("task_batch_index") self.task_tag = kwargs.pop("task_tag") self.task_id = kwargs.pop("task_id") - self.dscm_ref = DashScopeChatModel(**kwargs) self.full_context: List[ExtendedMessage] = [] self.llm_chat_fn = llm_chat_fn self.tokenizer = tokenizer @@ -42,16 +42,117 @@ def __init__( self.output_kwargs = {} self.input_kwargs = {} + + def step_prepare(self, messages: List[dict], tools: List=[]): + self.full_context = [] + consider_roles = ['user', 'assistant', 'system', 'tool'] + disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls + if disable_toolcalls: + consider_roles.remove('tool') + + for i, msg in enumerate(messages): + if (disable_toolcalls) and (not isinstance(msg['content'], str)): + continue + if msg['role'] not in consider_roles: + continue + if not isinstance(msg['content'], str): + author = 'env' + ignore = False + str_content = "" + for item in msg['content']: + if 'text' not in item: + logger.warning(f"Non-text content in message content detected: {item}. Ignoring.") + ignore = True + break + if isinstance(item['text'], str): + str_content += str(item['text']) + else: + str_content = "" + msg['content'] = str_content + if ignore: + continue + msg['content'] = str(msg['content']) # TODO: better handling mm data + if msg['role'] == 'system': + author = 'initialization' + if msg['role'] == 'tool': + author = 'env' + else: + author = 'env' + + self.full_context += [ + ExtendedMessage( + author=author, + role=msg['role'], + content=msg['content'], + tokenizer=self.tokenizer, + tools=tools, + tool_calls=msg['tool_calls'] if 'tool_calls' in msg else [], + token_generator="auto", + ) + ] + + # check token overflow + converted_message = self.to_role_content(self.full_context) + context_safe, info = self.check_context_token_num_safe(converted_message, tools) + custom_sampling_params = {} + if not context_safe: + self.context_overflow = True + + return context_safe, info, converted_message, custom_sampling_params + + def step_track(self, llm_output, context_safe, converted_message: List[dict], tools: List=[]): + if not self.already_mad_flag: + if compute_string_madness( + completion=llm_output['content'], + checklist=self.config.astune.rollout.compute_madness_checklist + ) < 0.0: + self.already_mad_flag = True + + # dummy response for now + token_generator = "manual" + if llm_output.get("tool_calls", None) is not None: + tool_calls = llm_output["tool_calls"] + else: + tool_calls = [] + + llm_ext_msg = ExtendedMessage( + author="llm", + role="assistant", + content=llm_output['content'], + token_generator=token_generator, + tool_calls=tool_calls, + tokenizer=self.tokenizer, + ) + + if token_generator == "manual": + input_msg_ref = copy.deepcopy(converted_message) + token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output, tools=tools) + assert len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn, \ + f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" + llm_ext_msg.token_arr = token_arr_method2 + llm_ext_msg.token_logprob_arr = token_logprob_arr + self.generated_token_callback_fn(llm_ext_msg.token_arr) + + # take snapshot of current timeline + if context_safe: + self.full_context += [ llm_ext_msg ] + is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) + if length > self.config.astune.rollout.max_model_len: + raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}") + self.grouped_steps += [copy.deepcopy(self.full_context)] + + DEBUG = True + if DEBUG and len(self.grouped_steps) >= 2 and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])): + print(f"General Warning: merge failure discovered.") + + return None + def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure ext_steps = self.full_context - # # linear mode has only one trajectory - # self.reward_structure.step_reward = [ - # self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) - # ] - # print('warning: debugging') self.reward_structure.step_reward = [ - self.compute_step_level_reward(ext_steps=ext_steps, index=i, total_steps=len(self.grouped_steps)) for i in range(len(self.grouped_steps)) + self.compute_step_level_reward(ext_steps=ext_steps, index=i, total_steps=len(self.grouped_steps)) + for i in range(len(self.grouped_steps)) ] diff --git a/astune/context_tracker/agentscope_tracker/request_proxy.py b/astune/context_tracker/agentscope_tracker/request_proxy.py new file mode 100644 index 00000000..21e982dc --- /dev/null +++ b/astune/context_tracker/agentscope_tracker/request_proxy.py @@ -0,0 +1,128 @@ +import copy +import time +from loguru import logger +from pydantic import BaseModel + +from typing import Any, AsyncGenerator, List, Type, Dict +from agentscope.model import ChatResponse +from agentscope.message import TextBlock, ToolUseBlock +from astune.utils.compute_madness import compute_string_madness +from transformers.tokenization_utils import PreTrainedTokenizer +from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model +from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage +from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking +from astune.context_tracker.agentscope_tracker.timeline_merging import can_merge_steps +from agentscope.model import ChatResponse + +def remove_fields(d: Dict, fields: List[str]) -> Dict: + d = copy.deepcopy(d) + for field in fields: + d.pop(field.strip(), None) + return d + +class ASTuneLlmProxy(object): + + def __init__( + self, + llm_chat_fn, + tokenizer:PreTrainedTokenizer, + context_tracker:MultiAgentContextTracking, + config, + ) -> None: + self.context_tracker = context_tracker + self.llm_chat_fn = llm_chat_fn + self.tokenizer = tokenizer + self.config = config + + + async def execute_model_proxy( + self, + messages: List[dict], + tools: List=[], + tool_choice: str = "auto", + structured_model=None, + **kwargs + ) -> ChatResponse: + + + # prepare context tracker, check context safety + context_safe, info, converted_message, custom_sampling_params = \ + self.context_tracker.step_prepare(messages, tools) + if not context_safe: + logger.warning(f"[{info}] detected. Current token count exceeds the limit.") + self.context_overflow = True + return ChatResponse( + content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] + ) + + # run llm inference + llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) + + # begin context tracking + self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) + + # parse response + response = await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) + return response + + + async def _parse_dashscope_generation_response( + self, + message, + structured_model: Type[BaseModel] | None = None, + ) -> ChatResponse: + + content_blocks: List[TextBlock | ToolUseBlock] = [] + content = message.get("content") + metadata: dict | None = None + + if content not in [ + None, + "", + [], + ]: + if isinstance(content, list): + for item in content: + if isinstance(item, dict) and "text" in item: + content_blocks.append( + TextBlock( + type="text", + text=item["text"], + ), + ) + else: + content_blocks.append( + TextBlock( + type="text", + text=content, + ), + ) + + if message.get("tool_calls"): + for tool_call in message["tool_calls"]: + input_ = _json_loads_with_repair( + tool_call["function"].get( + "arguments", + "{}", + ) + or "{}", + ) + content_blocks.append( + ToolUseBlock( + type="tool_use", + name=tool_call["function"]["name"], + input=input_, # type: ignore + id=tool_call["id"], + ), + ) + + if structured_model: + metadata = input_ # type: ignore + + + parsed_response = ChatResponse( + content=content_blocks, + metadata=metadata, + ) + + return parsed_response diff --git a/astune/context_manager/agentscope_cm/timeline_merging.py b/astune/context_tracker/agentscope_tracker/timeline_merging.py similarity index 83% rename from astune/context_manager/agentscope_cm/timeline_merging.py rename to astune/context_tracker/agentscope_tracker/timeline_merging.py index 0d67b5d8..efb4b4e2 100644 --- a/astune/context_manager/agentscope_cm/timeline_merging.py +++ b/astune/context_tracker/agentscope_tracker/timeline_merging.py @@ -1,15 +1,12 @@ from typing import List, Type -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids +from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage, replace_token_ids from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage], debug=False) -> bool: - # if `source_step` has more messages than `target_step` - # and if `source_step` and `target_step` share same token_arr in [0:len(target_step)] - # even if the authors are different, we can still merge them + can_merge = False - # compare_level = 'token' # strict compare with token ids compare_level = 'text' # relaxed compare with text, more easier to match, at very little cost if len(source_step) >= len(target_step): all_msg_match = True diff --git a/astune/context_manager/cmt_linear.py b/astune/context_tracker/basic_tracker.py similarity index 92% rename from astune/context_manager/cmt_linear.py rename to astune/context_tracker/basic_tracker.py index 5abe0447..b07d8bb1 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_tracker/basic_tracker.py @@ -5,13 +5,13 @@ from typing import List, Union, Tuple, Optional from astune.schema.trajectory import Sample, Reward from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.cmt_base_attr import CMTBaseAttr -from astune.context_manager.cmt_base_attr import ExtendedMessage -from astune.context_manager.cmt_base_attr import replace_token_ids +from astune.context_tracker.tracker_base_attr import TrackerAttr +from astune.context_tracker.tracker_base_attr import ExtendedMessage +from astune.context_tracker.tracker_base_attr import replace_token_ids from beast_logger import register_logger, print_dict, print_listofdict, print_nested, NestedJsonItem, SeqItem -class CMTLinear(CMTBaseAttr): +class BasicContextTracker(TrackerAttr): """ A linear context manager template that handles the conversation flow between LLM and environment. This class manages the context window, tokenization, and message history in a linear fashion. @@ -235,7 +235,7 @@ def get_token_inc_from_vllm_response(self, input_msg_ref, llm_output, tools: Lis return final_token_arr, token_logprob_arr def save_llm_output_do_not_register_full_context(self, llm_output, input_msg_ref): - return CMTLinear.save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context=False) + return BasicContextTracker.save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context=False) def save_env_output(self, env_output:dict, input_msg_ref:Optional[List[dict]]=None, add_nothink=False): @@ -469,40 +469,6 @@ def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int return step_reward - # def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int, total_steps:int)->float: - # assert self.reward_structure is not None - # # --------------- global level reward --------------- - # global_reward = self.reward_structure.raw_reward - # # here we assume global reward is given at the end of the trajectory - # gamma = self.config.astune.rollout.gamma - # step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) - # # when index=0, total_steps=1, step_reward = global_reward * (gamma ** 0) = global_reward - # # when index=0, total_steps=2, step_reward = global_reward * (gamma ** 1) = global_reward * 0.95 - # # when index=0, total_steps=3, step_reward = global_reward * (gamma ** 2) = global_reward * 0.9025 - - # # --------------- compute step level reward --------------- - # step_reward = step_reward_base - # # # get all ext_step that need to be trained - # # trainable_ext_steps = [ ext_msg for ext_msg in ext_steps if ext_msg.need_training ] - - # # # --------------- compute step level reward: response madness --------------- - # # # in some cases, a step may contain multiple messages that need training, therefore we define mini_step - # # mini_step_reward = [] - # # for ext_msg in trainable_ext_steps: - # # assert ext_msg.need_training, "trainable_ext_steps should only contain messages that need training" - # # mini_step_reward += [compute_string_madness(completion=ext_msg.content_for_future)] - - # # if any([r < 0 for r in mini_step_reward]): - # # self.reward_structure.madness = -1.0 - # # step_reward = self.config.astune.rollout.agent_madness_reward - # # else: - # # pass - # if self.already_mad_flag: - # step_reward = self.config.astune.rollout.agent_madness_reward - # self.reward_structure.madness = -1.0 - - # return step_reward - def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_steps:int) -> dict: """ diff --git a/astune/context_manager/cmt_base_attr.py b/astune/context_tracker/tracker_base_attr.py similarity index 89% rename from astune/context_manager/cmt_base_attr.py rename to astune/context_tracker/tracker_base_attr.py index a35a7d95..a360b9e3 100644 --- a/astune/context_manager/cmt_base_attr.py +++ b/astune/context_tracker/tracker_base_attr.py @@ -23,12 +23,12 @@ def replace_token_ids(place_holder, replace_with, begin, end, raw_logprob) -> Tu return final, final_logprob -class CMTBaseAttr(object): +class TrackerAttr(object): - def __init__(self, config, tokenizer): - self.task_batch_index = 'undefined' - self.task_tag = 'undefined' - self.task_id = 'undefined' + def __init__(self, config, tokenizer, **kwargs): + self.task_batch_index = kwargs.get("task_batch_index", "undefined") + self.task_tag = kwargs.get("task_tag", "undefined") + self.task_id = kwargs.get("task_id", "undefined") self.config = config self.tokenizer = tokenizer self.full_context: List[ExtendedMessage] = [] diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 9ce3ee7b..82f70d88 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -70,8 +70,8 @@ astune: do_sample: False num_repeat: 1 - context_manager: # context manager protocol is used ONLY when `use_agentscope_protocol=False` - context_manager_type: "linear" + context_tracker: # context manager protocol is used ONLY when `use_agentscope_protocol=False` + context_tracker_type: "linear" alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 auto_context_cm: diff --git a/astune/protocol/agentscope_protocol.py b/astune/protocol/agentscope_protocol.py deleted file mode 100644 index d4b17974..00000000 --- a/astune/protocol/agentscope_protocol.py +++ /dev/null @@ -1,26 +0,0 @@ -from pydantic import BaseModel, Field -from typing import Callable, List, TYPE_CHECKING - -if TYPE_CHECKING: - from agentscope.message import Msg - from astune.workflow_controller.agentscope_flow import ASTuneProxy - -class AgentScopeLearnProtocol(BaseModel): - model_config = {"extra": "allow"} - # Trainer to use; default "trinity". Optional: "astune-trinity". - trainer: str = Field(default="trinity") - # Experiment name - agentflow_name: str = Field(default="agent-flow") - # In multi-agent settings, specify the list of trainable agent target names - trainable_agent_targets: List[str] = Field(default=[]) - # Use dataset provided by the trainer (True: read each query from workflow input; False: AgentScope handles each query) - external_dataset: bool = Field(default=True) - # Use external environment provided by the trainer (True: read environment handle from input; False: AgentScope runs environment and tools) - external_environment: bool = Field(default=True) - # Use external reward provided by the trainer (True: compute reward outside AgentScope after workflow; False: AgentScope computes reward) - external_reward: bool = Field(default=True) - # Other settings - multiturn_token_consolidation: bool = Field(default=True) - - async def agentscope_execute(self, init_messages, astune_proxy: "ASTuneProxy", config)->"ASTuneProxy": - raise NotImplementedError diff --git a/astune/protocol/workflow.py b/astune/protocol/workflow.py deleted file mode 100644 index 59fab900..00000000 --- a/astune/protocol/workflow.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Define workflow related interfaces.""" - -from typing import Dict - -from pydantic import BaseModel, Field - -from astune.context_manager.tuner import ModelTuner - - -class WorkflowOutput(BaseModel): - """Workflow Output Structure.""" - - reward: float - metadata: Dict - - -class Workflow(BaseModel): - """Workflow Protocol. - - A workflow defines how to use a model to complete a task. - """ - - name: str = "my_workflow" - config: Dict = Field(default_factory=dict) - - def run(self, task: Dict, tuner: ModelTuner) -> WorkflowOutput: - """Run the workflow on a given task.""" - raise NotImplementedError diff --git a/astune/schema/task.py b/astune/schema/task.py index a45abf6d..3b674c80 100644 --- a/astune/schema/task.py +++ b/astune/schema/task.py @@ -1,5 +1,5 @@ from pydantic import BaseModel, Field -from typing import List, Dict, Any +from typing import List, Dict, Any, Union class Task(BaseModel): @@ -10,7 +10,7 @@ class Task(BaseModel): metadata: dict = Field(default_factory=dict) -class TaskLaunchCoreArgument(BaseModel): +class WorkflowTask(BaseModel): env_type: str = Field(default="") task_id: str = Field(default="") task_thread_index: int = Field(default=0) @@ -22,3 +22,8 @@ class TaskLaunchCoreArgument(BaseModel): tokenizer: Any = Field(default=None) task: Task = Field(default=None) # type: ignore + +class WorkflowOutput(BaseModel): + reward: Union[float, List[float], None] = Field(default=None) + is_success: Union[bool, None] = Field(default=None) + metadata: Dict[str, Any] = Field(default_factory=dict) \ No newline at end of file diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index c51aa94d..71bb21e0 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -4,7 +4,7 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.env_service_client.env_client_ng import EnvClient +from astune.utils.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 952f1b5e..78372bd6 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -14,14 +14,12 @@ from tqdm import tqdm from verl import DataProto from verl.utils.torch_functional import pad_sequence_to_length -from astune.workflow_controller.classic_agentflow import AgentFlow -from astune.workflow_controller.classic_agentflow import BaseAgentFlow -from astune.task_rollout.env_worker import EnvWorker -from astune.schema.task import Task, TaskLaunchCoreArgument +from astune.task_runner.classic_runner import AgentRunner +from astune.task_runner.classic_runner import BaseAgentRunner +from astune.schema.task import Task, WorkflowTask from astune.schema.trajectory import Sample -from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr +from astune.context_tracker.basic_tracker import BasicContextTracker, TrackerAttr from beast_logger import register_logger, print_dict, print_listofdict -from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow from astune.utils.utils import run_async_coro__no_matter_what from astune.schema.logprob import TokenAndProb diff --git a/astune/task_rollout/dashscope_llm_bridge.py b/astune/task_rollout/dashscope_llm_bridge.py index aa4cc24b..38681f4e 100644 --- a/astune/task_rollout/dashscope_llm_bridge.py +++ b/astune/task_rollout/dashscope_llm_bridge.py @@ -8,8 +8,8 @@ def construct_alien_llm_chat_fn(config, *args): def alien_llm_chat_fn(messages, request_id=""): max_try = 4 - alien_model_name = config.astune.context_manager.alien_llm_model - alien_model_response_length = config.astune.context_manager.alien_llm_response_length + alien_model_name = config.astune.context_tracker.alien_llm_model + alien_model_response_length = config.astune.context_tracker.alien_llm_response_length if os.environ.get("DASHSCOPE_API_KEY") is None or os.environ.get("DASHSCOPE_API_KEY_BACKUP") is None: raise RuntimeError(dedent(""" diff --git a/astune/task_rollout/env_worker.py b/astune/task_rollout/env_worker.py deleted file mode 100644 index 3b6c498e..00000000 --- a/astune/task_rollout/env_worker.py +++ /dev/null @@ -1,129 +0,0 @@ -from loguru import logger -from typing import List, Union -from omegaconf import DictConfig -from astune.workflow_controller.classic_agentflow import AgentFlow -from astune.workflow_controller.classic_agentflow import BaseAgentFlow -from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow -from astune.context_manager.cmt_linear import CMTLinear -from astune.env_service_client.env_client_ng import EnvClient as EnvClientNg - -class EnvWorker(object): - - def __init__(self, task_core_arg, config: DictConfig): - self.config = config - - if config.astune.task_reader.type == 'env_service': - url = config.astune.task_reader.env_service.env_url - env_type = config.astune.task_reader.env_service.env_type - self.env = EnvClientNg(base_url=url) - self.env_params = {} - self.env_type: str = env_type - else: - self.env = None - - self.task_core_arg = task_core_arg - self.task_id: str = task_core_arg.task_id - self.tokenizer = task_core_arg.tokenizer - self.llm_chat_fn = task_core_arg.llm_chat_fn - self.obs_window = task_core_arg.obs_window - - - def execute(self) -> CMTLinear: - """Choose between classic `AgentFlow` controller and `AgentScopeWorkflow` controller - """ - - # >>>>>>>>>>>>>> create - init_messages = self._initialize_environment_and_messages() - - # >>>>>>>>>>>>>> simulate - try: - if not self.config.astune.rollout.use_agentscope_protocol: - agent_flow: BaseAgentFlow = AgentFlow(llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, config=self.config) - else: - agent_flow: BaseAgentFlow = AgentScopeWorkflow(llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, config=self.config) - cmt = agent_flow.execute( - init_messages=init_messages, - env=self.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] - task_core_arg=self.task_core_arg - ) - except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.agent_flow~ error={e.args}") - if self.env: self.env.release_instance(self.task_core_arg.task_env_uuid) - raise e - - cmt.task_batch_index = self.task_core_arg.task_batch_index - cmt.task_tag = self.task_core_arg.task_tag - cmt.task_id = self.task_id - - # >>>>>>>>>>>>>> destory - try: - if self.env: self.env.release_instance(self.task_core_arg.task_env_uuid) - except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.release_instance~ error={e.args}") - raise e - - return cmt - - - def _initialize_environment_and_messages(self) -> List[dict]: - """ - Initialize environment instance and setup initial messages. - - Returns: - List[dict]: Initial messages for the agent flow - - Raises: - Exception: If environment creation fails or required task data is missing - """ - if self.config.astune.task_reader.type == 'env_service': - if self.env is None: - raise ValueError("Environment client is None but env_service type is specified") - try: - init_response = self.env.create_instance( - env_type=self.env_type, - task_id=self.task_id, - instance_id=self.task_core_arg.task_env_uuid, - params=self.env_params - ) - state_message: dict = init_response["state"] - _, init_messages = self._get_init_messages(state_message) - except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.create_instance~ error={e.args}") - if self.env is not None: - self.env.release_instance(self.task_core_arg.task_env_uuid) - raise e - else: - task = self.task_core_arg.task - if task.init_messages: - init_messages = task.init_messages - else: - assert task.main_query, "You must provide init_messages or main_query in task." - init_messages = [{"role": "user", "content": task.main_query}] - - return init_messages - - - def _get_init_messages(self, state_message) -> tuple: - """ - Process state_message to extract query and init_messages. - - Args: - state_message (Union[dict, list]): The state message to process - - Returns: - tuple: (query, init_messages) where query is a string and init_messages is a list - - Raises: - ValueError: If state_message is neither dict nor list - """ - if isinstance(state_message, dict): - query = state_message["content"] - init_messages = [state_message] - elif isinstance(state_message, list): - assert isinstance(state_message[0], dict) - query = state_message[-1]["content"] - init_messages = state_message - else: - raise ValueError(f"state_message should be dict or list, but got {type(state_message)}") - - return query, init_messages diff --git a/astune/task_rollout/native_parallel_worker.py b/astune/task_rollout/native_parallel_worker.py index 7a44bd0e..b83256cf 100644 --- a/astune/task_rollout/native_parallel_worker.py +++ b/astune/task_rollout/native_parallel_worker.py @@ -15,7 +15,7 @@ from verl import DataProto from verl.utils.torch_functional import pad_sequence_to_length -from astune.context_manager.cmt_linear import CMTLinear +from astune.context_tracker.basic_tracker import BasicContextTracker from astune.schema.task import Task from astune.schema.trajectory import Sample from astune.task_rollout.single_worker import BaseParallelEnv @@ -60,9 +60,9 @@ def step_status_printer(self, obs_window): class StaticRollout(StepPrinter): """Static (non-dynamic) rollout manager.""" - def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[CMTLinear]: + def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[BasicContextTracker]: self.current_token_count_time = time.time() - cmt_array: List[CMTLinear] = [] + cmt_array: List[BasicContextTracker] = [] rollout_n = 1 if mode == "validate" else self.rollout_n obs_window = { 'step': [0 for _ in range(len(tasks) * rollout_n)], @@ -103,13 +103,13 @@ def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: class DynamicRollout(StaticRollout): """Dynamic rollout supporting oversampling and early termination.""" - def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[CMTLinear]: + def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[BasicContextTracker]: if mode == "sample" and (self.rollout_n != 1) and self.config.astune.rollout.enable_oversample: return self.rollout_dynamic(tasks, mode, epoch) else: return super().rollout(tasks, mode, epoch) - def greedy_max_std_selection(self, samples: List[CMTLinear], n): + def greedy_max_std_selection(self, samples: List[BasicContextTracker], n): if len(samples) < n: additional_n = n - len(samples) n = len(samples) @@ -147,8 +147,8 @@ def greedy_max_std_selection(self, samples: List[CMTLinear], n): sorted_selected_samples = sorted(selected_samples, key=lambda cmt: abs(cmt.reward_structure.performance_reward)) return sorted_selected_samples - def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str, allow_sample_num_change=True, allow_force_stop=True) -> List[CMTLinear]: - cmt_array: List[CMTLinear] = [] + def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str, allow_sample_num_change=True, allow_force_stop=True) -> List[BasicContextTracker]: + cmt_array: List[BasicContextTracker] = [] assert mode != "validate" rollout_n = self.rollout_n self.current_token_count_time = time.time() @@ -325,9 +325,9 @@ def to_dataproto(self, cmt_array) -> DataProto: dataproto = self.samples_to_dataproto(samples) return dataproto - def trajectories_to_samples(self, cmt_array: List[CMTLinear]) -> List[Sample]: + def trajectories_to_samples(self, cmt_array: List[BasicContextTracker]) -> List[Sample]: sample_arr_final = [] - CMTLinear.compute_reference_advantage(cmt_array) + BasicContextTracker.compute_reference_advantage(cmt_array) for cmt in cmt_array: try: sample_arr = cmt.group_tokenize() diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py new file mode 100644 index 00000000..5698cefe --- /dev/null +++ b/astune/task_rollout/resource_keeper.py @@ -0,0 +1,37 @@ +from loguru import logger +from typing import List, Union +from omegaconf import DictConfig +from recipe.sppo import config +from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner +from astune.task_runner.agentscope_runner import AgentScopeRunner +from astune.context_tracker.basic_tracker import BasicContextTracker +from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg + +class ResourceKeeper(object): + + def __init__(self, task_core_arg, config: DictConfig): + self.task_core_arg = task_core_arg + self.config = config + + def __enter__(self): + self.config = self.config + self.task_core_arg = self.task_core_arg + self.task_id: str = self.task_core_arg.task_id + self.tokenizer = self.task_core_arg.tokenizer + self.llm_chat_fn = self.task_core_arg.llm_chat_fn + self.obs_window = self.task_core_arg.obs_window + if self.config.astune.task_reader.type == 'env_service': + url = self.config.astune.task_reader.env_service.env_url + env_type = self.config.astune.task_reader.env_service.env_type + self.env = EnvClientNg(base_url=url) + self.env_params = {} + self.env_type: str = env_type + else: + self.env = None + + def __exit__(self, exc_type, exc_value, traceback): + try: + if self.env: self.env.release_instance(self.task_core_arg.task_env_uuid) + except Exception as e: + logger.bind(exception=True).exception(f"encounter exception in env_worker.release_instance~ error={e.args}") + raise e diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index 6d28a318..4dededf0 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -3,28 +3,26 @@ import os import time import uuid -from typing import Any, Literal +from functools import wraps +from typing import Any, Callable, Literal, Optional, TypeVar, List, Union from loguru import logger from omegaconf import DictConfig from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr -from astune.schema.task import Task, TaskLaunchCoreArgument +from astune.context_tracker.basic_tracker import BasicContextTracker, TrackerAttr +from astune.schema.task import Task, WorkflowTask from astune.task_rollout.async_llm_bridge import AsyncLlmBridge -from astune.task_rollout.env_worker import EnvWorker - - -def init_parallel_rollout_logger(experiment_name): - """Initialize the logger with the given configuration.""" - from beast_logger import register_logger - if 'BEST_LOGGER_INIT' in os.environ: return # prevent re-initialization in ray environment - os.environ['BEST_LOGGER_INIT'] = '1' - from datetime import datetime - final_log_path = os.path.join("launcher_record", experiment_name, datetime.now().strftime("%Y_%m_%d_%H_%M")) - os.environ['BEST_LOGGER_PATH'] = final_log_path - non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] - register_logger(mods=["evaluation", "exception"], non_console_mods=non_console_mods, auto_clean_mods=[], base_log_path=final_log_path, debug=False) +from astune.task_rollout.resource_keeper import ResourceKeeper +from astune.utils.logger import init_parallel_rollout_logger +from astune.utils.sample import get_sample_params +from loguru import logger +from omegaconf import DictConfig +from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner +from astune.task_runner.agentscope_runner import AgentScopeRunner +from astune.context_tracker.basic_tracker import BasicContextTracker +from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astune.utils.retry import retry_with_backoff class BaseParallelEnv: @@ -78,85 +76,41 @@ def __init__( max_llm_retries=max_llm_retries ) + + @retry_with_backoff(max_retry_attr="max_llm_retries") def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, mode: Literal["sample", "validate"], - task_thread_index: int, obs_window: dict, **kwargs) -> CMTLinear: + task_thread_index: int, obs_window: dict, **kwargs) -> BasicContextTracker: """Execute one environment rollout worker. Handles environment initialization, LLM sampling parameter construction (with validation overrides), and robust retry on transient failures. - - Parameters - ---------- - task : Task - The task object to roll out. - task_batch_index : int - Index of the task within the provided batch. - task_tag : str - Human-readable tag identifying task and rollout repetition. - mode : Literal['sample','validate'] - Rollout mode selecting sampling hyperparameters. - task_thread_index : int - Global thread index for obs_window bookkeeping. - obs_window : dict - Shared progress structure updated by the worker. - **kwargs : Any - Forwarded for future extensibility. - - Returns - ------- - CMTLinear - Collected trajectory container for this rollout. """ - def get_sample_params(): - response_length_eps = 16 # Reserve a few tokens for later handling of special tokens like lm_start. - if self.config.astune.rollout.name == 'vllm': - sampling_params = dict( - n=1, - max_tokens=self.config.astune.rollout.max_response_length_in_one_turn - response_length_eps, - min_tokens=1, # Must output at least 1 token. - temperature=self.config.astune.rollout.temperature, - top_p=self.config.astune.rollout.top_p - ) - else: - sampling_params = dict( - n=1, - max_new_tokens=self.config.astune.rollout.max_response_length_in_one_turn, - temperature=self.config.astune.rollout.temperature, - top_p=self.config.astune.rollout.top_p - ) - - if mode == "validate": - sampling_params["temperature"] = self.config.astune.rollout.val_kwargs.temperature - sampling_params["top_k"] = self.config.astune.rollout.val_kwargs.top_k - sampling_params["top_p"] = self.config.astune.rollout.val_kwargs.top_p - return sampling_params + sampling_params = get_sample_params(mode, self.config) + llm_chat_fn = self.async_llm_bridge.get_llm_chat_fn(sampling_params=sampling_params) + + task_core_arg=WorkflowTask( + env_type=task.env_type, + task_id=task.task_id, + task_thread_index=task_thread_index, + task_batch_index=task_batch_index, + task_env_uuid=uuid.uuid4().hex, + task_tag=task_tag, + obs_window=obs_window, + llm_chat_fn=llm_chat_fn, + tokenizer=self.tokenizer, + task=task + ) - max_retry = 3 - for retry in range(max_retry): + with ResourceKeeper(task_core_arg, config=self.config) as resource_keeper: try: - llm_chat_fn = self.async_llm_bridge.get_llm_chat_fn(get_sample_params()) - cmt: CMTBaseAttr = EnvWorker( - task_core_arg=TaskLaunchCoreArgument( - env_type=task.env_type, - task_id=task.task_id, - task_thread_index=task_thread_index, - task_batch_index=task_batch_index, - task_env_uuid=uuid.uuid4().hex, - task_tag=task_tag, - obs_window=obs_window, - llm_chat_fn=llm_chat_fn, - tokenizer=self.tokenizer, - task=task - ), - config=self.config - ).execute() - break + Runner = AgentScopeRunner if self.config.astune.rollout.use_agentscope_protocol else AgentRunner + agent_runner: BaseAgentRunner = Runner(llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, config=self.config) + cmt = agent_runner.execute( + env=resource_keeper.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] + task_core_arg=task_core_arg + ) except Exception as e: - if retry < max_retry - 1: - logger.bind(exception=True).exception(f"rollout_env_worker error: {e.args}, retrying {retry + 1}/{max_retry}") - time.sleep(2 ** retry) - else: - logger.bind(exception=True).exception(f"rollout_env_worker failed after {max_retry} retries: {e.args}") - raise e + logger.bind(exception=True).exception(f"encounter exception in env_worker.agent_flow error={e.args}") + raise e - return cmt # type: ignore + return cmt diff --git a/astune/workflow_controller/basic_agentflow.py b/astune/task_runner/__init__.py similarity index 79% rename from astune/workflow_controller/basic_agentflow.py rename to astune/task_runner/__init__.py index 87b4a5f7..e776a65c 100644 --- a/astune/workflow_controller/basic_agentflow.py +++ b/astune/task_runner/__init__.py @@ -1,7 +1,7 @@ -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage +from astune.context_tracker.basic_tracker import BasicContextTracker from typing import Any, Dict, List, Union, Callable -class BaseAgentFlow(object): +class BaseAgentRunner(object): def __init__(self, llm_chat_fn: Callable, @@ -11,11 +11,10 @@ def __init__(self, self.tokenizer = tokenizer self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") self.response_template_ids = self.tokenizer.encode("<|im_start|>assistant\n") - self.cmt: Union[CMTLinear, Any, None] = None + self.cmt: Union[BasicContextTracker, Any, None] = None self.alien_llm_chat_fn: Union[Callable, None] = None self.llm_chat_fn: Callable = llm_chat_fn self.config = config - # self.console_debug_mode: bool = False self.max_steps: int = self.config.astune.rollout.multi_turn.max_steps self.max_model_len: int = self.config.astune.rollout.max_model_len self.max_env_len: int = self.config.astune.rollout.max_env_len \ No newline at end of file diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py new file mode 100644 index 00000000..00a3e632 --- /dev/null +++ b/astune/task_runner/agentscope_runner.py @@ -0,0 +1,121 @@ +import threading +import importlib +import torch +import copy +import asyncio +from astune import ModelTuner, Workflow, WorkflowOutput +from astune.utils.env_service_client.env_client import EnvClient +from astune.task_runner import BaseAgentRunner +from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage, replace_token_ids, BasicContextTracker +from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking +from astune.schema.trajectory import Reward, Trajectory +from astune.schema.trajectory import Sample, Reward +from astune.schema.task import Task, WorkflowTask +from astune.utils.dynamic_import import dynamic_import +from typing import Any, Dict, List, Union, Tuple + + +class RunnerWithHooks(BaseAgentRunner): + + def agentscope_runner_hooks(self, obs_window, task_thread_index, task_core_arg, env): + + def env_step_fn(action: dict) -> Tuple[str, float, bool, dict]: + obs_window['step'][task_thread_index] += 1 + env_output = env.step( + instance_id=task_core_arg.task_env_uuid, + action=action, + ) + obs = "" + assert isinstance(env_output, dict) + if ('content' not in env_output["state"]) and ('error' in env_output["state"]): + obs = f"[Error from environment: {env_output['error']}]" + elif (env_output["state"]['content']==""): + obs = 'Warning: the environment does not provide any feedback, please provide valid inpu and try again.' + else: + obs = env_output["state"]['content'] + reward = 0 + info = {} + terminate = env_output["is_terminated"] + return obs, reward, terminate, info + + def should_interrupt_fn() -> bool: + if (obs_window['stop'] is not None) and obs_window['stop'][task_thread_index]: # Check if the thread should stop (because other threads have completed, making this thread useless) + return True + return False + + def generated_token_callback_fn(token_array): + obs_window['token'][task_thread_index] += len(token_array) + + return { + "env_step_fn":env_step_fn, + "should_interrupt_fn":should_interrupt_fn, + "generated_token_callback_fn":generated_token_callback_fn + } + + + def get_judge(self): + judge_protocol = self.config.astune.task_judge.judge_protocol + return dynamic_import(judge_protocol)(self.config) # type: ignore + + +class AgentScopeRunner(RunnerWithHooks): + + def execute(self, env: EnvClient, task_core_arg: WorkflowTask) -> BasicContextTracker: + obs_window = task_core_arg.obs_window + task_thread_index = task_core_arg.task_thread_index + task_batch_index = task_core_arg.task_batch_index + task_tag = task_core_arg.task_tag + task_id = task_core_arg.task_id + + workflow_import = self.config.astune.rollout.agentscope_learn_protocol + workflow_cls = dynamic_import(workflow_import)() + agentscope_protocol: Workflow = workflow_cls(trainer='astune-trinity', AgentRunner_name='appworld') + + context_tracker = MultiAgentContextTracking( + llm_chat_fn=self.llm_chat_fn, + tokenizer=self.tokenizer, + config=self.config, + task_batch_index=task_batch_index, + task_tag=task_tag, + task_id=task_id, + **self.agentscope_runner_hooks( + obs_window=obs_window, + task_thread_index=task_thread_index, + task_core_arg=task_core_arg, + env=env + ) + ) + astune_proxy = ModelTuner( + context_tracker=context_tracker, + llm_chat_fn=self.llm_chat_fn, + tokenizer=self.tokenizer, + config=self.config, + ) + + workflow_output: WorkflowOutput = asyncio.run(agentscope_protocol.agentscope_execute(task_core_arg, astune_proxy)) + if workflow_output.reward is not None: + raw_reward, is_success = workflow_output.reward, workflow_output.is_success + else: + raw_reward, is_success = self.get_judge().compute_reward(workflow_output.metadata) + + assert not isinstance(raw_reward, list), "ASTune will support step reward in future versions." + + # register reward + reward = Reward( + raw_reward=raw_reward, + raw_step_reward=None, + success_rate=1.0 if is_success else 0.0, + madness=0, + description="" + ) + context_tracker.process_reward(reward) + # generate token before merging + context_tracker.remove_last_context() + context_tracker.task_id = task_id + context_tracker.task_tag = task_tag + context_tracker.group_merge() + # after merging, process and align reward again + context_tracker.process_reward(reward) + return context_tracker + + diff --git a/astune/workflow_controller/classic_agentflow.py b/astune/task_runner/classic_runner.py similarity index 88% rename from astune/workflow_controller/classic_agentflow.py rename to astune/task_runner/classic_runner.py index 988e88eb..638584ed 100644 --- a/astune/workflow_controller/classic_agentflow.py +++ b/astune/task_runner/classic_runner.py @@ -3,17 +3,17 @@ import threading from loguru import logger -from astune.env_service_client.env_client import EnvClient +from astune.utils.env_service_client.env_client import EnvClient from astune.utils.utils import convert_tool_to_user_message from astune.schema.trajectory import Reward -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.workflow_controller.basic_agentflow import BaseAgentFlow +from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage +from astune.task_runner import BaseAgentRunner from typing import Any, Dict, List, Union, Callable from beast_logger import print_listofdict -class AgentFlow(BaseAgentFlow): +class AgentRunner(BaseAgentRunner): def __init__(self, **kwargs): super().__init__(**kwargs) @@ -21,21 +21,22 @@ def __init__(self, **kwargs): self.step_reward = [] - def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> CMTLinear: + def execute(self, env: EnvClient, task_core_arg) -> BasicContextTracker: obs_window = task_core_arg.obs_window task_thread_index = task_core_arg.task_thread_index + init_messages = task_core_arg.init_messages # 1. 🚀 Initialize messages - if self.config.astune.context_manager.context_manager_type == "linear": - self.cmt = CMTLinear(self.config, self.tokenizer) - # elif self.config.astune.context_manager.context_manager_type == "linear_think": + if self.config.astune.context_tracker.context_tracker_type == "linear": + self.cmt = BasicContextTracker(self.config, self.tokenizer) + # elif self.config.astune.context_tracker.context_tracker_type == "linear_think": # self.cmt = LinearThinkCMT(self.config, self.tokenizer) - # elif self.config.astune.context_manager.context_manager_type == "context_selfclip": + # elif self.config.astune.context_tracker.context_tracker_type == "context_selfclip": # self.cmt = SelfContextClipCMT(self.config, self.tokenizer, self.llm_chat_fn) - # elif self.config.astune.context_manager.context_manager_type == "sliding_window": + # elif self.config.astune.context_tracker.context_tracker_type == "sliding_window": # self.cmt = SlidingWindowCMT(self.config, self.tokenizer, self.llm_chat_fn) else: - raise ValueError(f"Unsupported context template: {self.config.astune.context_manager.context_manager_type}") + raise ValueError(f"Unsupported context template: {self.config.astune.context_tracker.context_tracker_type}") assert not (self.config.astune.rollout.force_think and self.config.astune.rollout.force_no_think), "Cannot force both think and no_think" add_nothink = self.config.astune.rollout.force_no_think @@ -102,8 +103,8 @@ def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> C # 8. 📥 save environment output state = env_output["state"] - state.pop('tool_calls', None) - self.cmt.save_env_output(state, input_msg_ref=step_input_message_arr, add_nothink=add_nothink) + state.pop('tool_calls', None) # type: ignore + self.cmt.save_env_output(state, input_msg_ref=step_input_message_arr, add_nothink=add_nothink) # type: ignore self.cmt.round_cnt += 1 if self.use_step_reward_from_env: self.step_reward += [env_output["reward"]] diff --git a/astune/tuner.py b/astune/tuner.py new file mode 100644 index 00000000..dbeba092 --- /dev/null +++ b/astune/tuner.py @@ -0,0 +1,154 @@ +from litellm import Type +from loguru import logger +from openai import AsyncOpenAI +from pydantic import BaseModel, Field +from astune.utils.dynamic_import import dynamic_import +from astune.context_tracker.agentscope_tracker.request_proxy import ASTuneLlmProxy +from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking +from typing import AsyncGenerator, Literal, Optional, Any, List, Dict +from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel +from agentscope.types import JSONSerializableObject +from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model + + +class Agent2Proxy(BaseModel): + def __init__(self, name: str, proxy, default_model: ChatModelBase): + self.name = name + self.default_model = default_model + self.proxy = proxy + + def __call__(self, *args, **kwargs): + if self.name not in self.proxy.get_trainable_targets(): + # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, and self.name is not in it, use default model + return self.default_model(*args, **kwargs) + else: + # [TRAIN] + return self.proxy(*args, **kwargs) + + +class ModelTuner(DashScopeChatModel): + + def __init__(self, config, context_tracker, **kwargs) -> None: + self.config = config + self.context_tracker = context_tracker + self.agent2proxy_registry: dict[str, Agent2Proxy] = {} + self.astuner_proxy = ASTuneLlmProxy(context_tracker=context_tracker, **kwargs) + super().__init__( + model_name='astune', + api_key='dummy-api-key' + ) + + def get_astune_proxy(self) -> ASTuneLlmProxy: + """Get the ASTuneLlmProxy instance. + Returns: + ASTuneLlmProxy: + The ASTuneLlmProxy instance used by the ModelTuner. + """ + return self.astuner_proxy + + + def get_context_tracker(self) -> MultiAgentContextTracking: + """Get the context tracker instance. + Returns: + ASTuneLlmProxy: + The context tracker instance used by the ModelTuner. + """ + return self.context_tracker + + + def register_model(self, name: str, model: ChatModelBase) -> Agent2Proxy: + """Register an agent type. + Args: + name (`str`): + The name to register the agent type under. + model (`Agent2Proxy`): + The agent type instance to register. + Returns: + Agent2Proxy: + The agent type instance corresponding to the provided name. + """ + self.agent2proxy_registry[name] = Agent2Proxy(name, self, model) + return self.get_model(name) + + + def get_model(self, name: str) -> Agent2Proxy: + """Get the proxy instance by name. + Args: + name (`str`): + The name of the agent proxy to retrieve. + Returns: + Agent2Proxy: + The agent proxy corresponding to the provided name. + """ + if name not in self.agent2proxy_registry: + raise ValueError(f"Agent proxy '{name}' is not registered.") + else: + return self.agent2proxy_registry[name] + + + async def __call__( + self, + messages: list[dict[str, Any]], + tools: list[dict] | None = None, + tool_choice: Literal["auto", "none", "any", "required"] + | str + | None = None, + structured_model: Type[BaseModel] | None = None, + **kwargs: Any, + ) -> ChatResponse: + + # For qvq and qwen-vl models, the content field cannot be `None` or + # `[{"text": None}]`, so we need to convert it to an empty list. + if self.model_name.startswith("qvq") or "-vl" in self.model_name: + raise NotImplementedError("Not implemented for qvq and qwen-vl models yet.") + + kwargs = { + "messages": messages, + "model": self.model_name, + "stream": self.stream, + **self.generate_kwargs, + **kwargs, + "result_format": "message", + # In agentscope, the `incremental_output` must be `True` when + # `self.stream` is True + "incremental_output": self.stream, + } + + if tools: + kwargs["tools"] = self._format_tools_json_schemas(tools) + + if tool_choice: + self._validate_tool_choice(tool_choice, tools) + kwargs["tool_choice"] = self._format_tool_choice(tool_choice) + + if ( + self.enable_thinking is not None + and "enable_thinking" not in kwargs + ): + kwargs["enable_thinking"] = self.enable_thinking + + if structured_model: + if tools or tool_choice: + logger.warning( + "structured_model is provided. Both 'tools' and " + "'tool_choice' parameters will be overridden and " + "ignored. The model will only perform structured output " + "generation without calling any other tools.", + ) + format_tool = _create_tool_from_base_model(structured_model) + kwargs["tools"] = self._format_tools_json_schemas( + [format_tool], + ) + kwargs["tool_choice"] = self._format_tool_choice( + format_tool["function"]["name"], + ) + + # Get the AsyncGenerator from execute_model_proxy + response_gen = await self.astuner_proxy.execute_model_proxy( + api_key=self.api_key, + structured_model=structured_model, + **kwargs, + ) + + # Return the AsyncGenerator directly + return response_gen diff --git a/astune/utils/dynamic_import.py b/astune/utils/dynamic_import.py new file mode 100644 index 00000000..6c3748d6 --- /dev/null +++ b/astune/utils/dynamic_import.py @@ -0,0 +1,7 @@ + +import importlib + +def dynamic_import(module_class_str: str): + module_, class_ = module_class_str.split('->') + protocol_cls = getattr(importlib.import_module(module_), class_) + return protocol_cls \ No newline at end of file diff --git a/astune/utils/env_service_client/__init__.py b/astune/utils/env_service_client/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/astune/env_service_client/em_client.py b/astune/utils/env_service_client/em_client.py similarity index 100% rename from astune/env_service_client/em_client.py rename to astune/utils/env_service_client/em_client.py diff --git a/astune/env_service_client/env_client.py b/astune/utils/env_service_client/env_client.py similarity index 100% rename from astune/env_service_client/env_client.py rename to astune/utils/env_service_client/env_client.py diff --git a/astune/env_service_client/env_client_ng.py b/astune/utils/env_service_client/env_client_ng.py similarity index 100% rename from astune/env_service_client/env_client_ng.py rename to astune/utils/env_service_client/env_client_ng.py diff --git a/astune/utils/logger.py b/astune/utils/logger.py new file mode 100644 index 00000000..d972b098 --- /dev/null +++ b/astune/utils/logger.py @@ -0,0 +1,12 @@ +import os + +def init_parallel_rollout_logger(experiment_name): + """Initialize the logger with the given configuration.""" + from beast_logger import register_logger + if 'BEST_LOGGER_INIT' in os.environ: return # prevent re-initialization in ray environment + os.environ['BEST_LOGGER_INIT'] = '1' + from datetime import datetime + final_log_path = os.path.join("launcher_record", experiment_name, datetime.now().strftime("%Y_%m_%d_%H_%M")) + os.environ['BEST_LOGGER_PATH'] = final_log_path + non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] + register_logger(mods=["evaluation", "exception"], non_console_mods=non_console_mods, auto_clean_mods=[], base_log_path=final_log_path, debug=False) diff --git a/astune/utils/retry.py b/astune/utils/retry.py new file mode 100644 index 00000000..b0c2aef3 --- /dev/null +++ b/astune/utils/retry.py @@ -0,0 +1,45 @@ +import time +from functools import wraps +from typing import Any, Callable, Literal, Optional, TypeVar +from loguru import logger + +T = TypeVar("T") + +def retry_with_backoff(max_retry: int = 3, backoff_fn: Optional[Callable[[int], float]] = None, + max_retry_attr: Optional[str] = None) -> Callable[[Callable[..., T]], Callable[..., T]]: + """Retry decorator with exponential backoff and structured logging.""" + + def decorator(func: Callable[..., T]) -> Callable[..., T]: + @wraps(func) + def wrapper(*args: Any, **kwargs: Any) -> T: + target_max_retry = max_retry + if max_retry_attr and args: + candidate = getattr(args[0], max_retry_attr, None) + if isinstance(candidate, int) and candidate > 0: + target_max_retry = candidate + if target_max_retry < 1: + target_max_retry = 1 + + for attempt in range(target_max_retry): + try: + return func(*args, **kwargs) + except Exception as exc: # noqa: BLE001 + if attempt < target_max_retry - 1: + logger.bind(exception=True).exception( + f"{func.__name__} error: {exc.args}, retrying {attempt + 1}/{target_max_retry}" + ) + sleep_seconds = backoff_fn(attempt) if backoff_fn else 2 ** attempt + time.sleep(sleep_seconds) + else: + logger.bind(exception=True).exception( + f"{func.__name__} failed after {target_max_retry} retries: {exc.args}" + ) + raise + + raise RuntimeError("retry_with_backoff exhausted attempts") + + return wrapper + + return decorator + + diff --git a/astune/utils/sample.py b/astune/utils/sample.py new file mode 100644 index 00000000..ec1ed337 --- /dev/null +++ b/astune/utils/sample.py @@ -0,0 +1,26 @@ + + + +def get_sample_params(mode, config): + response_length_eps = 16 # Reserve a few tokens for later handling of special tokens like lm_start. + if config.astune.rollout.name == 'vllm': + sampling_params = dict( + n=1, + max_tokens=config.astune.rollout.max_response_length_in_one_turn - response_length_eps, + min_tokens=1, # Must output at least 1 token. + temperature=config.astune.rollout.temperature, + top_p=config.astune.rollout.top_p + ) + else: + sampling_params = dict( + n=1, + max_new_tokens=config.astune.rollout.max_response_length_in_one_turn, + temperature=config.astune.rollout.temperature, + top_p=config.astune.rollout.top_p + ) + + if mode == "validate": + sampling_params["temperature"] = config.astune.rollout.val_kwargs.temperature + sampling_params["top_k"] = config.astune.rollout.val_kwargs.top_k + sampling_params["top_p"] = config.astune.rollout.val_kwargs.top_p + return sampling_params diff --git a/astune/workflow.py b/astune/workflow.py new file mode 100644 index 00000000..eb7316f1 --- /dev/null +++ b/astune/workflow.py @@ -0,0 +1,22 @@ +from typing import Dict, List +from pydantic import BaseModel, Field +from astune import ModelTuner +from astune.schema.task import WorkflowTask, WorkflowOutput + + +class Workflow(BaseModel): + + model_config = {"extra": "allow"} + # Workflow + name: str = "default_workflow" + # which agents to train, empty means all agents are trainable + trainable_targets: List[str] = Field(default=[]) + # Use external environment provided by the trainer (True: read environment handle from input; False: AgentScope runs environment and tools) + require_gym_env: bool = Field(default=True) + + + async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + """Run the workflow on a given task.""" + raise NotImplementedError + + diff --git a/astune/workflow_controller/agentscope_flow.py b/astune/workflow_controller/agentscope_flow.py deleted file mode 100644 index 026ab4bd..00000000 --- a/astune/workflow_controller/agentscope_flow.py +++ /dev/null @@ -1,102 +0,0 @@ -import threading -import importlib -import torch -import copy -import asyncio -from astune.env_service_client.env_client import EnvClient -from astune.workflow_controller.basic_agentflow import BaseAgentFlow -from astune.schema.trajectory import Reward, Trajectory -from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids, CMTLinear -from astune.schema.trajectory import Sample, Reward -from typing import Any, Dict, List, Union, Tuple -from astune.context_manager.agentscope_cm.cmt_agentscope import ASTuneProxy -from astune.schema.task import Task, TaskLaunchCoreArgument - -class AgentScopeWorkflow(BaseAgentFlow): - - def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg: TaskLaunchCoreArgument) -> CMTLinear: - obs_window = task_core_arg.obs_window - task_thread_index = task_core_arg.task_thread_index - task_batch_index = task_core_arg.task_batch_index - task_tag = task_core_arg.task_tag - task_id = task_core_arg.task_id - - # fetch learn protocol - protocol = self.config.astune.rollout.agentscope_learn_protocol - module_, class_ = protocol.split('->') - protocol_cls: AgentScopeLearnProtocol = getattr(importlib.import_module(module_), class_) - agentscope_protocol = protocol_cls(trainer='astune-trinity', agentflow_name='appworld') # type: ignore - - def env_step_fn(action: dict) -> Tuple[str, float, bool, dict]: - obs_window['step'][task_thread_index] += 1 - env_output = env.step( - instance_id=task_core_arg.task_env_uuid, - action=action, - ) - obs = "" - assert isinstance(env_output, dict) - if ('content' not in env_output["state"]) and ('error' in env_output["state"]): - obs = f"[Error from environment: {env_output['error']}]" - elif (env_output["state"]['content']==""): - obs = 'Warning: the environment does not provide any feedback, please provide valid inpu and try again.' - else: - obs = env_output["state"]['content'] - reward = 0 - info = {} - terminate = env_output["is_terminated"] - return obs, reward, terminate, info - def should_interrupt_fn() -> bool: - if (obs_window['stop'] is not None) and obs_window['stop'][task_thread_index]: # Check if the thread should stop (because other threads have completed, making this thread useless) - return True - return False - def generated_token_callback_fn(token_array): - obs_window['token'][task_thread_index] += len(token_array) - - astune_proxy = ASTuneProxy( - llm_chat_fn=self.llm_chat_fn, - tokenizer=self.tokenizer, - config=self.config, - model_name='astune-proxy', - api_key='dummy-api-key', - task_batch_index=task_batch_index, - task_tag=task_tag, - task_id=task_id, - env_step_fn=env_step_fn, - should_interrupt_fn=should_interrupt_fn, - generated_token_callback_fn=generated_token_callback_fn, - ) - - astune_proxy.update_agentscope_input_dictionary(task_core_arg=task_core_arg) - astune_proxy = asyncio.run(agentscope_protocol.agentscope_execute(init_messages, astune_proxy, self.config)) - astune_proxy.update_judge_input_dictionary(task_core_arg=task_core_arg) - astune_proxy.update_judge_input_dictionary(env=env) - astune_proxy.update_judge_input_dictionary(grouped_steps=astune_proxy.grouped_steps) - judge_input_dictionary = astune_proxy.get_judge_input_dictionary() - - # get reward - if 'raw_reward' in judge_input_dictionary and 'is_success' in judge_input_dictionary: - raw_reward = judge_input_dictionary['raw_reward'] - is_success = judge_input_dictionary['is_success'] - else: - raw_reward, is_success = astune_proxy.get_judge().compute_reward(judge_input_dictionary) - - # evaluate - reward = Reward( - raw_reward=raw_reward, - raw_step_reward=None, - success_rate=1.0 if is_success else 0.0, - madness=0, - description="" - ) - astune_proxy.process_reward(reward) - - # generate token before merging - astune_proxy.remove_last_context() - astune_proxy.task_id = task_id - astune_proxy.task_tag = task_tag - astune_proxy.group_merge() - astune_proxy.process_reward(reward) - return astune_proxy - - diff --git a/pyrightconfig.json b/pyrightconfig.json index bfc3649e..8668e93e 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -1,10 +1,11 @@ { - "logLevel": "Trace", + "logLevel": "Debug", "include": [ "astune/**/*.py", "external/trinity/**/*.py", + "external/verl/**/*.py", // ".venv/lib/python3.10/site-packages/**/*.py", - ".venv/lib/python3.10/site-packages/agentscope/**/*.py" + // ".venv/lib/python3.10/site-packages/agentscope/**/*.py" ], "exclude": [ "node_modules", @@ -17,10 +18,10 @@ "outputs", "wanlog", "wandb", - "dist", + "dist" // "**/.vscode-server", // "**/__pycache__", // "**/*.log", - "**/*" + // "**/*" ] } \ No newline at end of file diff --git a/tutorial/appworld.md b/tutorial/appworld.md index cf132446..91a57c0c 100644 --- a/tutorial/appworld.md +++ b/tutorial/appworld.md @@ -53,7 +53,7 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml](../launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 astune.task_reader) -2. 定义 AgentScopeWorkflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/appworld.py` 的`ExampleAgentScopeLearnProtocol` 类 - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.appworld->ExampleAgentScopeLearnProtocol` 3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) diff --git a/tutorial/appworld.py b/tutorial/appworld.py index de536670..fa1e234a 100644 --- a/tutorial/appworld.py +++ b/tutorial/appworld.py @@ -1,17 +1,17 @@ -from astune.workflow_controller.agentscope_flow import ASTuneProxy +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from pydantic import BaseModel, Field -from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol -class ExampleAgentScopeLearnProtocol(AgentScopeLearnProtocol): +class ExampleAgentScopeLearnProtocol(Workflow): trainer: str = Field(default="astune-trinity") - async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config): + async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory + init_messages = task.task.init_messages if len(init_messages) >= 2: first_msg, init_messages = init_messages[0], init_messages[1:] else: first_msg = {"content": "You're a helpful assistant."} interaction_message = [] @@ -21,7 +21,7 @@ async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, con agent = ReActAgent( name="Qwen", sys_prompt=first_msg['content'], - model=astune_proxy, # type: ignore + model=model_tuner, formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), toolkit=None, @@ -29,16 +29,18 @@ async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, con ) agent.set_console_output_enabled(False) - for _ in range(config.astune.rollout.multi_turn.max_steps): + + step = 0 + for step in range(model_tuner.config.astune.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol - obs, _, terminate, _ = astune_proxy.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) + obs, _, terminate, _ = env.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? if terminate: break - if astune_proxy.context_overflow: break + if model_tuner.get_context_tracker().context_overflow: break - return astune_proxy + return WorkflowOutput(reward=None, metadata={"total_step": step}) diff --git a/tutorial/math_agent.md b/tutorial/math_agent.md index 3da07e0c..92dc5904 100644 --- a/tutorial/math_agent.md +++ b/tutorial/math_agent.md @@ -83,7 +83,7 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [launcher/math_agent/git-math-agentscope.yaml](../launcher/math_agent/git-math-agentscope.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 astune.task_reader) -2. 定义 AgentScopeWorkflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.math_agent->ExampleMathLearn` 3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) diff --git a/tutorial/math_agent.py b/tutorial/math_agent.py index b531e459..38244b69 100644 --- a/tutorial/math_agent.py +++ b/tutorial/math_agent.py @@ -1,7 +1,6 @@ -from astune.workflow_controller.agentscope_flow import ASTuneProxy +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from pydantic import BaseModel, Field -from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol from loguru import logger def extract_final_answer(result) -> str: @@ -23,35 +22,39 @@ def extract_final_answer(result) -> str: return str(result) + class FinalResult(BaseModel): result: str = Field( description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" ) + system_prompt = """ -You are an agent specialized in solving math problems with tools. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. You should return your final answer within \\boxed{{}}. +You are an agent specialized in solving math problems with tools. +Please solve the math problem given to you. +You can write and execute Python code to perform calculation or verify your answer. +You should return your final answer within \\boxed{{}}. """ -class ExampleMathLearn(AgentScopeLearnProtocol): - trainer: str = Field(default="astune-trinity") - async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config): +class ExampleMathLearn(Workflow): + + name: str = "math_agent_workflow" + + async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory - from agentscope.agent import ReActAgent - from agentscope.memory import InMemoryMemory from agentscope.tool import Toolkit, execute_python_code - query = init_messages[-1]['content'] - + query = task.task.main_query self.toolkit = Toolkit() self.toolkit.register_tool_function(execute_python_code) self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=astune_proxy, # type: ignore + model=model_tuner, formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -59,7 +62,5 @@ async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, con msg = Msg("user", query, role="user") result = await self.agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) - astune_proxy.update_judge_input_dictionary(final_answer=final_answer) - - return astune_proxy + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index dc2c1b72..94e0b69f 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -12,14 +12,14 @@ from agentscope.formatter import DashScopeMultiAgentFormatter, OpenAIMultiAgentFormatter from agentscope.model import DashScopeChatModel, OpenAIChatModel from agentscope.session import JSONSession -from astune.workflow_controller.agentscope_flow import ASTuneProxy +from astune.task_runner.agentscope_runner import AgentScopeTuneProxy from agentscope.message import Msg from pydantic import BaseModel, Field from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol # astune/utils/robust_dashscope.py from astune.utils.robust_dashscope import RobustDashScopeChatModel -def get_official_agents(name: str, role: str, train_which_role: str, astune_proxy: ASTuneProxy) -> ReActAgent: +def get_official_agents(name: str, role: str, train_which_role: str, astune_proxy: AgentScopeTuneProxy) -> ReActAgent: """Get the official werewolves game agents.""" model = OpenAIChatModel( model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", @@ -130,7 +130,7 @@ class ExampleWerewolves(AgentScopeLearnProtocol): trainer: str = Field(default="astune-trinity") - async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config) -> ASTuneProxy: + async def agentscope_execute(self, init_messages, astune_proxy: AgentScopeTuneProxy, config) -> AgentScopeTuneProxy: train_which_role = "werewolf" diff --git a/tutorial/werewolves/werewolves.md b/tutorial/werewolves/werewolves.md index 6395defe..e239bda8 100644 --- a/tutorial/werewolves/werewolves.md +++ b/tutorial/werewolves/werewolves.md @@ -9,7 +9,7 @@ ```python class ExampleWerewolves(AgentScopeLearnProtocol): trainer: str = Field(default="astune-trinity") - async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config) -> ASTuneProxy: + async def agentscope_execute(self, init_messages, astune_proxy: AgentScopeTuneProxy, config) -> AgentScopeTuneProxy: train_which_role = "witch" roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] From 311581f3dc32569c1681a619ff3595e51e9986f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Wed, 19 Nov 2025 03:31:06 +0800 Subject: [PATCH 054/462] stage werewolf example --- astune/tuner.py | 32 ++--- astune/workflow.py | 98 +++++++++++++-- tutorial/werewolves/start.py | 223 +++++++++++++++-------------------- 3 files changed, 204 insertions(+), 149 deletions(-) diff --git a/astune/tuner.py b/astune/tuner.py index dbeba092..c1ae793f 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -11,7 +11,7 @@ from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model -class Agent2Proxy(BaseModel): +class Agent2Proxy(DashScopeChatModel): def __init__(self, name: str, proxy, default_model: ChatModelBase): self.name = name self.default_model = default_model @@ -31,7 +31,7 @@ class ModelTuner(DashScopeChatModel): def __init__(self, config, context_tracker, **kwargs) -> None: self.config = config self.context_tracker = context_tracker - self.agent2proxy_registry: dict[str, Agent2Proxy] = {} + self.target2proxy_registry: dict[str, Agent2Proxy] = {} self.astuner_proxy = ASTuneLlmProxy(context_tracker=context_tracker, **kwargs) super().__init__( model_name='astune', @@ -56,34 +56,36 @@ def get_context_tracker(self) -> MultiAgentContextTracking: return self.context_tracker - def register_model(self, name: str, model: ChatModelBase) -> Agent2Proxy: + def register_model(self, target_name: str, default_model: ChatModelBase) -> Agent2Proxy: """Register an agent type. Args: - name (`str`): + target_name (`str`): The name to register the agent type under. - model (`Agent2Proxy`): - The agent type instance to register. + default_model (`ChatModelBase`): + The model to use when you are NOT training this agent type. Returns: Agent2Proxy: The agent type instance corresponding to the provided name. """ - self.agent2proxy_registry[name] = Agent2Proxy(name, self, model) - return self.get_model(name) + if target_name in self.target2proxy_registry: + logger.warning(f"Agent proxy `{target_name}` is already registered. Overwriting `default_model`.") + self.target2proxy_registry[target_name] = Agent2Proxy(target_name, self, default_model) + return self.get_model(target_name) - def get_model(self, name: str) -> Agent2Proxy: - """Get the proxy instance by name. + def get_model(self, target_name: str) -> Agent2Proxy: + """Get the proxy instance by target_name. Args: - name (`str`): + target_name (`str`): The name of the agent proxy to retrieve. Returns: Agent2Proxy: - The agent proxy corresponding to the provided name. + The agent proxy corresponding to the provided target_name. """ - if name not in self.agent2proxy_registry: - raise ValueError(f"Agent proxy '{name}' is not registered.") + if target_name not in self.target2proxy_registry: + raise ValueError(f"Agent proxy '{target_name}' is not registered.") else: - return self.agent2proxy_registry[name] + return self.target2proxy_registry[target_name] async def __call__( diff --git a/astune/workflow.py b/astune/workflow.py index eb7316f1..80419d10 100644 --- a/astune/workflow.py +++ b/astune/workflow.py @@ -7,16 +7,100 @@ class Workflow(BaseModel): model_config = {"extra": "allow"} - # Workflow - name: str = "default_workflow" - # which agents to train, empty means all agents are trainable - trainable_targets: List[str] = Field(default=[]) - # Use external environment provided by the trainer (True: read environment handle from input; False: AgentScope runs environment and tools) - require_gym_env: bool = Field(default=True) - + name: str = Field(default="default_workflow", description="Name of the workflow.") + trainable_targets: List[str] = Field(default=[], description="List of agents to be fine-tuned.") async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: """Run the workflow on a given task.""" raise NotImplementedError + +""" +How to define a trainable workflow 🚀: + +1. Single agent scenario 🤖: + + Simply set `model` argument to `model_tuner` when initializing your agent. + This is a helpful example when you: + - 🌟 Know exactly which agents should be trained, or the number of agents are small; + - ✨ Already finished basic debugging of your workflow using a fixed model such as qwen-max; + - 🎇 Do not requires changing which agents to be trained on the fly. + + ----- EXAMPLE ----- + + - Suppose you have a react agent that looks like this: + + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=DashScopeChatModel(model='qwen-max'), + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), + ) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg, structured_model=FinalResult) + final_answer = extract_final_answer(result) + + + - Then all you have to do is to wrap it in a workflow class: + + [+] class ExampleMathLearn(Workflow): + [+] name: str = "math_agent_workflow" + [+] async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + [ ] from agentscope.agent import ReActAgent + [ ] from agentscope.formatter import DashScopeChatFormatter + [ ] from agentscope.memory import InMemoryMemory + [ ] from agentscope.tool import Toolkit, execute_python_code + [ ] self.toolkit = Toolkit() + [ ] self.toolkit.register_tool_function(execute_python_code) + [ ] self.agent = ReActAgent( + [ ] name="math_react_agent", + [ ] sys_prompt=system_prompt, + [-] model=DashScopeChatModel(model='qwen-max'), + [+] model=model_tuner, + [ ] formatter=DashScopeChatFormatter(), + [ ] toolkit=self.toolkit, + [ ] memory=InMemoryMemory(), + [ ] ) + [+] query = task.task.main_query + [ ] msg = Msg("user", query, role="user") + [ ] result = await self.agent.reply(msg, structured_model=FinalResult) + [ ] final_answer = extract_final_answer(result) + [+] return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + + +2. Multi-agent scenario 🤝: + + Use `register_model` method of `ModelTuner` to register different agent targets. + This is extremely helpful when you want to + - 🌟 Achieve fine-grained control over which agents to be fine-tuned; + - ✨ Define what model agents should use when they are NOT being tuned; + - ⚡ Change which trainable agent targets on the fly without modifying the workflow code. + + ----- EXAMPLE ----- + + [ ] roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] + [ ] players = [] + [ ] for i, role in enumerate(roles): + [ ] default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) + [ ] default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) + [ ] chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys # 🌟 + [ ] players += [ReActAgent( + [ ] name=f"Player{i + 1}", + [ ] sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), + [-] model=chosen_model, + [+] model=model_tuner.register_model(role, default_model=chosen_model), + [ ] formatter=OpenAIMultiAgentFormatter(), + [ ] )] + + + +""" \ No newline at end of file diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index 94e0b69f..7300c899 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- # flake8: noqa: E501 """The main entry point for the werewolf game.""" -import asyncio -import os from textwrap import dedent import numpy as np from loguru import logger @@ -11,144 +9,115 @@ from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeMultiAgentFormatter, OpenAIMultiAgentFormatter from agentscope.model import DashScopeChatModel, OpenAIChatModel -from agentscope.session import JSONSession -from astune.task_runner.agentscope_runner import AgentScopeTuneProxy -from agentscope.message import Msg from pydantic import BaseModel, Field -from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol -# astune/utils/robust_dashscope.py -from astune.utils.robust_dashscope import RobustDashScopeChatModel - -def get_official_agents(name: str, role: str, train_which_role: str, astune_proxy: AgentScopeTuneProxy) -> ReActAgent: - """Get the official werewolves game agents.""" - model = OpenAIChatModel( - model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", - api_key="1234", - stream=False, - client_args = { - "base_url": "http://22.16.118.255:2888/v1" - } - ) if role != train_which_role else astune_proxy - formatter = OpenAIMultiAgentFormatter() if role != train_which_role else DashScopeMultiAgentFormatter() - agent = ReActAgent( - name=name, - sys_prompt=dedent(f""" - You're a werewolf game player named {name}. - - # YOUR TARGET - Your target is to win the game with your teammates as much as possible. - - # GAME RULES - - In werewolf game, players are divided into three werewolves, three villagers, one seer, one hunter and one witch. - - Werewolves: kill one player each night, and must hide identity during the day. - - Villagers: ordinary players without special abilities, try to identify and eliminate werewolves. - - Seer: A special villager who can check one player's identity each night. - - Witch: A special villager with two one-time-use potions: a healing potion to save a player from being killed at night, and a poison to eliminate one player at night. - - Hunter: A special villager who can take one player down with them when they are eliminated. - - The game alternates between night and day phases until one side wins: - - Night Phase - - Werewolves choose one victim - - Seer checks one player's identity - - Witch decides whether to use potions - - Moderator announces who died during the night - - Day Phase - - All players discuss and vote to eliminate one suspected player - - # GAME GUIDANCE - - Try your best to win the game with your teammates, tricks, lies, and deception are all allowed, e.g. pretending to be a different role. - - During discussion, don't be political, be direct and to the point. - - The day phase voting provides important clues. For example, the werewolves may vote together, attack the seer, etc. - ## GAME GUIDANCE FOR WEREWOLF - - Seer is your greatest threat, who can check one player's identity each night. Analyze players' speeches, find out the seer and eliminate him/her will greatly increase your chances of winning. - - In the first night, making random choices is common for werewolves since no information is available. - - Pretending to be other roles (seer, witch or villager) is a common strategy to hide your identity and mislead other villagers in the day phase. - - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. - ## GAME GUIDANCE FOR SEER - - Seer is very important to villagers, exposing yourself too early may lead to being targeted by werewolves. - - Your ability to check one player's identity is crucial. - - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. - ## GAME GUIDANCE FOR WITCH - - Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected werewolves. - - The outcome of the night phase provides important clues. For example, if the dead player is hunter, etc. Use this information to adjust your strategy. - ## GAME GUIDANCE FOR HUNTER - - Using your ability in day phase will expose your role (since only hunter can take one player down) - - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, etc. Use this information to adjust your strategy. - ## GAME GUIDANCE FOR VILLAGER - - Protecting special villagers, especially the seer, is crucial for your team's success. - - Werewolves may pretend to be the seer. Be cautious and don't trust anyone easily. - - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. - - # NOTE - - [IMPORTANT] DO NOT make up any information that is not provided by the moderator or other players. - - This is a TEXT-based game, so DO NOT use or make up any non-textual information. - - Always critically reflect on whether your evidence exist, and avoid making assumptions. - - Your response should be specific and concise, provide clear reason and avoid unnecessary elaboration. - - Generate your one-line response by using the `generate_response` function. - - Don't repeat the others' speeches."""), - model=model, # type: ignore - formatter=formatter, +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput + + +def get_official_agent_prompt(name) -> str: + system_prompt = dedent(f""" + You're a werewolf game player named {name}. + + # YOUR TARGET + Your target is to win the game with your teammates as much as possible. + + # GAME RULES + - In werewolf game, players are divided into three werewolves, three villagers, one seer, one hunter and one witch. + - Werewolves: kill one player each night, and must hide identity during the day. + - Villagers: ordinary players without special abilities, try to identify and eliminate werewolves. + - Seer: A special villager who can check one player's identity each night. + - Witch: A special villager with two one-time-use potions: a healing potion to save a player from being killed at night, and a poison to eliminate one player at night. + - Hunter: A special villager who can take one player down with them when they are eliminated. + - The game alternates between night and day phases until one side wins: + - Night Phase + - Werewolves choose one victim + - Seer checks one player's identity + - Witch decides whether to use potions + - Moderator announces who died during the night + - Day Phase + - All players discuss and vote to eliminate one suspected player + + # GAME GUIDANCE + - Try your best to win the game with your teammates, tricks, lies, and deception are all allowed, e.g. pretending to be a different role. + - During discussion, don't be political, be direct and to the point. + - The day phase voting provides important clues. For example, the werewolves may vote together, attack the seer, etc. + ## GAME GUIDANCE FOR WEREWOLF + - Seer is your greatest threat, who can check one player's identity each night. Analyze players' speeches, find out the seer and eliminate him/her will greatly increase your chances of winning. + - In the first night, making random choices is common for werewolves since no information is available. + - Pretending to be other roles (seer, witch or villager) is a common strategy to hide your identity and mislead other villagers in the day phase. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR SEER + - Seer is very important to villagers, exposing yourself too early may lead to being targeted by werewolves. + - Your ability to check one player's identity is crucial. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR WITCH + - Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected werewolves. + - The outcome of the night phase provides important clues. For example, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR HUNTER + - Using your ability in day phase will expose your role (since only hunter can take one player down) + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR VILLAGER + - Protecting special villagers, especially the seer, is crucial for your team's success. + - Werewolves may pretend to be the seer. Be cautious and don't trust anyone easily. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + + # NOTE + - [IMPORTANT] DO NOT make up any information that is not provided by the moderator or other players. + - This is a TEXT-based game, so DO NOT use or make up any non-textual information. + - Always critically reflect on whether your evidence exist, and avoid making assumptions. + - Your response should be specific and concise, provide clear reason and avoid unnecessary elaboration. + - Generate your one-line response by using the `generate_response` function. + - Don't repeat the others' speeches.""" ) + return system_prompt - agent.set_console_output_enabled(False) - return agent - - -async def main() -> None: - """The main entry point for the werewolf game.""" - - # Uncomment the following lines if you want to use Agentscope Studio - # to visualize the game process. - # import agentscope - # agentscope.init( - # studio_url="http://localhost:3000", - # project="werewolf_game", - # ) - - # Prepare 9 players, you can change their names here - players = [get_official_agents(f"Player{_ + 1}") for _ in range(9)] - - # Note: You can replace your own agents here, or use all your own agents - - # Load states from a previous checkpoint - session = JSONSession(save_dir="./checkpoints") - await session.load_session_state( - session_id="players_checkpoint", - **{player.name: player for player in players}, - ) - - await werewolves_game(players) - - # Save the states to a checkpoint - await session.save_session_state( - session_id="players_checkpoint", - **{player.name: player for player in players}, - ) - - -class ExampleWerewolves(AgentScopeLearnProtocol): +class ExampleWerewolves(Workflow): trainer: str = Field(default="astune-trinity") + trainable_targets: list = Field(default=["werewolf"], description="List of agents to be fine-tuned.") - async def agentscope_execute(self, init_messages, astune_proxy: AgentScopeTuneProxy, config) -> AgentScopeTuneProxy: + async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: - train_which_role = "werewolf" + # ensure trainable targets is legal + if "werewolf" in self.trainable_targets: + assert len(self.trainable_targets) == 1, "Cannot train hostile roles simultaneously." + else: + assert len(self.trainable_targets) != 0, "No trainable targets specified." + # make and shuffle roles (fix random seed for reproducibility) roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] - - # Set random seed for reproducibility - task_core_arg = astune_proxy.get_agentscope_input_dictionary()["task_core_arg"] - task_id = task_core_arg.task.metadata['random_number'] - + task_id = task.task.metadata['random_number'] np.random.seed(int(task_id)) np.random.shuffle(roles) - players = [get_official_agents(f"Player{x + 1}", roles[x], train_which_role, astune_proxy) for x in range(9)] - + # initialize agents + players = [] + for i, role in enumerate(roles): + default_model = OpenAIChatModel( + model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", + stream=False, client_args = { "base_url": "http://22.16.118.255:2888/v1" }, api_key="1234", + ) + agent = ReActAgent( + name=f"Player{i + 1}", + sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), + model=model_tuner.register_model(role, default_model=default_model), + formatter=OpenAIMultiAgentFormatter(), + ) + agent.set_console_output_enabled(False) + players += [agent] + + # reward condition good_guy_win = await werewolves_game(players, roles) - raw_reward = 1 if (good_guy_win and train_which_role != "werewolf") or (not good_guy_win and train_which_role == "werewolf") else 0 + raw_reward = 0 + is_success = False + if (good_guy_win and self.trainable_targets[0] != "werewolf") or \ + (not good_guy_win and self.trainable_targets[0] == "werewolf"): + raw_reward = 1 + is_success = True + + # check logger.warning(f"Raw reward: {raw_reward}") - astune_proxy.update_judge_input_dictionary(raw_reward = raw_reward) - astune_proxy.update_judge_input_dictionary(is_success = (raw_reward == 1)) - return astune_proxy + logger.warning(f"Is success: {is_success}") + + return WorkflowOutput(reward=raw_reward, is_success=is_success) From ac908b6d23d3b8dd8bc245335a2b18ddb9d6d225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Wed, 19 Nov 2025 11:17:57 +0800 Subject: [PATCH 055/462] change order --- astune/tuner.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/astune/tuner.py b/astune/tuner.py index c1ae793f..c9027389 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -38,23 +38,6 @@ def __init__(self, config, context_tracker, **kwargs) -> None: api_key='dummy-api-key' ) - def get_astune_proxy(self) -> ASTuneLlmProxy: - """Get the ASTuneLlmProxy instance. - Returns: - ASTuneLlmProxy: - The ASTuneLlmProxy instance used by the ModelTuner. - """ - return self.astuner_proxy - - - def get_context_tracker(self) -> MultiAgentContextTracking: - """Get the context tracker instance. - Returns: - ASTuneLlmProxy: - The context tracker instance used by the ModelTuner. - """ - return self.context_tracker - def register_model(self, target_name: str, default_model: ChatModelBase) -> Agent2Proxy: """Register an agent type. @@ -88,6 +71,24 @@ def get_model(self, target_name: str) -> Agent2Proxy: return self.target2proxy_registry[target_name] + def get_astune_proxy(self) -> ASTuneLlmProxy: + """Get the ASTuneLlmProxy instance. + Returns: + ASTuneLlmProxy: + The ASTuneLlmProxy instance used by the ModelTuner. + """ + return self.astuner_proxy + + + def get_context_tracker(self) -> MultiAgentContextTracking: + """Get the context tracker instance. + Returns: + ASTuneLlmProxy: + The context tracker instance used by the ModelTuner. + """ + return self.context_tracker + + async def __call__( self, messages: list[dict[str, Any]], From a0d4a8c2b63a99556e50e3046b8a3656f9be3226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Wed, 19 Nov 2025 12:08:31 +0800 Subject: [PATCH 056/462] move tracing config to astune-default --- astune/default_config/astune_default.yaml | 18 +++++++++++++++++- launcher/math_agent/git-math-agentscope.yaml | 16 ---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 9ce3ee7b..c0fb2dd0 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -111,4 +111,20 @@ astune: lr: 1e-6 use_kl_loss: True kl_loss_coef: 0.002 - kl_loss_type: low_var_kl \ No newline at end of file + kl_loss_type: low_var_kl + + # the tracing config + tracing: + base_url: http://phoenix:port + train_output_path: /path/to/tasks.jsonl + filters: + - type: llm_evaluate + enabled: true + params: + custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" + temperature: 0.5 + max_tokens: 2048 + print_reason: false + + + diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 47de365d..0a7ab36f 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -7,22 +7,6 @@ astune: dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' training_split: "train" validation_split: "test" - - # example - tracing: - base_url: http://phoenix:port - train_output_path: /path/to/tasks.jsonl - filters: - - type: llm_evaluate - enabled: true - params: - custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" - temperature: 0.5 - max_tokens: 2048 - print_reason: false - - - task_judge: # ✨✨✨✨ 编写并选择评价函数 From d0f52267a2583cb5e7d9a908a61822e3736b6d01 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 19 Nov 2025 12:16:15 +0800 Subject: [PATCH 057/462] refactor: translate prompt into English --- .../filters/llm_evaluate_filter.py | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 5657a1b0..4c35cbe2 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -7,24 +7,33 @@ from .base import Filter -EVALUATE_PROMPT = """你现在扮演一个**严格的 QA 质量审查员**。给你一条数据样本,包含一个“query”(用户提问/任务)和一个“answer”(助手回复)。请只依据文本本身进行静态评估,不要编造事实或外部检索。 +EVALUATE_PROMPT = """You are now acting as a **strict QA quality reviewer**. You will be given a data sample containing a “query” (user question/task) and an “answer” (assistant reply). Evaluate it **only based on the text itself**, without inventing facts or performing external retrieval. -一、判定目标 -判定该「query–answer」是否为**高质量数据(GOOD)**,并给出分数与理由。若不满足标准,则标为**BAD**。 +--- -二、判断标准(任一命中即 BAD) -1. **缺失项**:query 为空、answer 为空、或两者皆空。 -2. **非答复**:answer 只有“收到/明白/请提供更多信息/占位寒暄”,没有实质回答或行动结果。 -3. **牛头不对马嘴**:answer 与 query 主题明显不相关。 -4. **流程借口**:answer 主要描述“无法搜索/被限流/遇到验证码/换设备”等流程困难,却**没有**给出替代性信息、总结、或可执行的下一步。 -5. **明显自相矛盾或逻辑不通**:同一回答内部互相打架(如先说能做又说不能做)。 -6. **安全/合规红线**:含违法、仇恨、个人隐私泄露等明显不当内容。 -7. **语言极不匹配**:query 的语言与 answer 完全不匹配,影响理解(如中文提问,answer 用不通顺的法语且与内容无关)。 +## 1. Evaluation Goal +Determine whether the given “query-answer” pair is **high-quality data (GOOD)** and provide a score and justification. +If it does not meet the criteria, label it as **BAD**. -三、特殊情况与其他标准 +--- + +## 2. BAD Criteria (if any are met → BAD) +1. **Missing elements**: The query is empty, the answer is empty, or both are empty. +2. **Non-answer**: The answer contains only acknowledgments such as “Received / OK / Please provide more information,” without substantive content or actionable results. +3. **Irrelevant**: The answer is clearly unrelated to the query. +4. **Process excuses**: The answer mainly describes process issues (“cannot search / rate-limited / captcha / try another device”), **without** providing alternative information, summaries, or next steps. +5. **Self-contradiction or illogical**: The answer contradicts itself or contains major logical inconsistencies. +6. **Safety or compliance violations**: Includes illegal content, hate speech, personal privacy leaks, or other clearly inappropriate material. +7. **Severe language mismatch**: The answer is in a completely different language from the query in a way that breaks comprehension (e.g., Chinese query but irrelevant and incoherent French reply). + +--- + +## 3. Special Cases & Additional Rules {custom_rubrics} -以上信息有任何一个命中,最终结果即为BAD,否则是GOOD。 +--- + +If **any** of the above conditions are triggered, the final result must be **BAD**. Otherwise, it is **GOOD**. """ From 0c638ee1a7a40670f52d59251151a32a2d73efbc Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 19 Nov 2025 13:30:47 +0800 Subject: [PATCH 058/462] fix: translate rest LLM evaluate filter schema into English --- .../tracing_reader/filters/llm_evaluate_filter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 4c35cbe2..02f05f07 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -56,11 +56,11 @@ def __init__( description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), llm_client=self._llm, input_schema={ - "query": "用户提问/任务", - "answer": "助手回复", + "query": "user query/task", + "answer": "assistant answer", }, output_schema={ - "reason": "判断理由,简明说明理由", + "reason": "judgment reason, briefly explain the reason", "result": "GOOD/BAD", }, sampling_params={"temperature": temperature, "max_tokens": max_tokens}, From 5053559743a96215e1e839b2ef403d1568986823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 11:56:36 +0800 Subject: [PATCH 059/462] revise model proxy module --- .../agentscope_tracker/agentscope_tuner.py | 0 .../agentscope_tracker/multiagent_tracking.py | 47 +----- .../agentscope_tracker/request_proxy.py | 128 ---------------- .../agentscope_tracker/timeline_merging.py | 65 ++++++-- astune/context_tracker/tracker_base_attr.py | 1 - astune/task_rollout/async_llm_bridge.py | 140 +++++++++++++++--- astune/tuner.py | 11 +- astune/utils/utils.py | 10 +- astune/workflow.py | 2 +- 9 files changed, 189 insertions(+), 215 deletions(-) delete mode 100644 astune/context_tracker/agentscope_tracker/agentscope_tuner.py delete mode 100644 astune/context_tracker/agentscope_tracker/request_proxy.py diff --git a/astune/context_tracker/agentscope_tracker/agentscope_tuner.py b/astune/context_tracker/agentscope_tracker/agentscope_tuner.py deleted file mode 100644 index e69de29b..00000000 diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index a2cf4763..19854f17 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -8,7 +8,7 @@ from astune.utils.color_hsl import adjust_color_hsl from astune.utils.compute_madness import compute_string_madness from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE -from astune.context_tracker.agentscope_tracker.timeline_merging import can_merge_steps +from astune.context_tracker.agentscope_tracker.timeline_merging import merge_tracker_timelines, can_merge_steps from typing import Any, List, Tuple, Union from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem @@ -26,14 +26,8 @@ def __init__( **kwargs ): super().__init__(config, tokenizer, **kwargs) - self.task_batch_index = kwargs.pop("task_batch_index") - self.task_tag = kwargs.pop("task_tag") - self.task_id = kwargs.pop("task_id") - self.full_context: List[ExtendedMessage] = [] self.llm_chat_fn = llm_chat_fn self.tokenizer = tokenizer - self.stream = False - self.config = config self.env_step_fn = env_step_fn self.should_interrupt_fn = should_interrupt_fn self.generated_token_callback_fn = generated_token_callback_fn @@ -221,43 +215,8 @@ def generate_log(self, task_id = None, global_step="NA"): attach="copy this" # type: ignore ) - def group_merge(self): - - def toggle_author(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage]) -> List[ExtendedMessage]: - # if any message in `target_step` is author == 'llm', but same-index message in `source_step` is author != 'llm' - # change source_step's message author to 'llm' - for i in range(len(target_step)): - if target_step[i].author == 'llm' and source_step[i].author != 'llm': - source_step[i].author = target_step[i].author - source_step[i].token_arr = target_step[i].token_arr - source_step[i].token_logprob_arr = target_step[i].token_logprob_arr - assert source_step[i].need_training - return source_step - - absorbed_step_indices = [] - reversed_grouped_steps = list(reversed(self.grouped_steps)) - for i in range(len(reversed_grouped_steps)): - if i in absorbed_step_indices: - continue - # check whether [i, len(reversed_grouped_steps)-1] can be merged - for j in range(i+1, len(reversed_grouped_steps)): - if j in absorbed_step_indices: - continue - source_step = reversed_grouped_steps[i] - target_step = reversed_grouped_steps[j] - if can_merge_steps(source_step, target_step): - source_step = toggle_author(source_step, target_step) - reversed_grouped_steps[i] = source_step - absorbed_step_indices += [j] - - # reverse back and exclude absorbed steps - reversed_grouped_steps_clean = [] - for i in range(len(reversed_grouped_steps)): - if i not in absorbed_step_indices: - reversed_grouped_steps_clean.append(reversed_grouped_steps[i]) - self.grouped_steps = list(reversed(reversed_grouped_steps_clean)) - - return self.grouped_steps + def group_merge(self) -> List[List[ExtendedMessage]]: + return self.grouped_steps = merge_tracker_timelines(self.grouped_steps) def group_tokenize(self): return self.group_tokenize_multi_group() diff --git a/astune/context_tracker/agentscope_tracker/request_proxy.py b/astune/context_tracker/agentscope_tracker/request_proxy.py deleted file mode 100644 index 21e982dc..00000000 --- a/astune/context_tracker/agentscope_tracker/request_proxy.py +++ /dev/null @@ -1,128 +0,0 @@ -import copy -import time -from loguru import logger -from pydantic import BaseModel - -from typing import Any, AsyncGenerator, List, Type, Dict -from agentscope.model import ChatResponse -from agentscope.message import TextBlock, ToolUseBlock -from astune.utils.compute_madness import compute_string_madness -from transformers.tokenization_utils import PreTrainedTokenizer -from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model -from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage -from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking -from astune.context_tracker.agentscope_tracker.timeline_merging import can_merge_steps -from agentscope.model import ChatResponse - -def remove_fields(d: Dict, fields: List[str]) -> Dict: - d = copy.deepcopy(d) - for field in fields: - d.pop(field.strip(), None) - return d - -class ASTuneLlmProxy(object): - - def __init__( - self, - llm_chat_fn, - tokenizer:PreTrainedTokenizer, - context_tracker:MultiAgentContextTracking, - config, - ) -> None: - self.context_tracker = context_tracker - self.llm_chat_fn = llm_chat_fn - self.tokenizer = tokenizer - self.config = config - - - async def execute_model_proxy( - self, - messages: List[dict], - tools: List=[], - tool_choice: str = "auto", - structured_model=None, - **kwargs - ) -> ChatResponse: - - - # prepare context tracker, check context safety - context_safe, info, converted_message, custom_sampling_params = \ - self.context_tracker.step_prepare(messages, tools) - if not context_safe: - logger.warning(f"[{info}] detected. Current token count exceeds the limit.") - self.context_overflow = True - return ChatResponse( - content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] - ) - - # run llm inference - llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) - - # begin context tracking - self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) - - # parse response - response = await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) - return response - - - async def _parse_dashscope_generation_response( - self, - message, - structured_model: Type[BaseModel] | None = None, - ) -> ChatResponse: - - content_blocks: List[TextBlock | ToolUseBlock] = [] - content = message.get("content") - metadata: dict | None = None - - if content not in [ - None, - "", - [], - ]: - if isinstance(content, list): - for item in content: - if isinstance(item, dict) and "text" in item: - content_blocks.append( - TextBlock( - type="text", - text=item["text"], - ), - ) - else: - content_blocks.append( - TextBlock( - type="text", - text=content, - ), - ) - - if message.get("tool_calls"): - for tool_call in message["tool_calls"]: - input_ = _json_loads_with_repair( - tool_call["function"].get( - "arguments", - "{}", - ) - or "{}", - ) - content_blocks.append( - ToolUseBlock( - type="tool_use", - name=tool_call["function"]["name"], - input=input_, # type: ignore - id=tool_call["id"], - ), - ) - - if structured_model: - metadata = input_ # type: ignore - - - parsed_response = ChatResponse( - content=content_blocks, - metadata=metadata, - ) - - return parsed_response diff --git a/astune/context_tracker/agentscope_tracker/timeline_merging.py b/astune/context_tracker/agentscope_tracker/timeline_merging.py index efb4b4e2..8e1488fe 100644 --- a/astune/context_tracker/agentscope_tracker/timeline_merging.py +++ b/astune/context_tracker/agentscope_tracker/timeline_merging.py @@ -3,18 +3,17 @@ from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem - -def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage], debug=False) -> bool: +def can_merge_steps(source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage], debug=False) -> bool: can_merge = False compare_level = 'text' # relaxed compare with text, more easier to match, at very little cost - if len(source_step) >= len(target_step): + if len(source_timeline) >= len(target_timeline): all_msg_match = True - for i in range(len(target_step)): + for i in range(len(target_timeline)): if compare_level == 'text': - same = source_step[i].content_for_future == target_step[i].content_for_future + same = source_timeline[i].content_for_future == target_timeline[i].content_for_future elif compare_level == 'token': - same = source_step[i].token_arr == target_step[i].token_arr + same = source_timeline[i].token_arr == target_timeline[i].token_arr else: raise NotImplementedError if not same: @@ -25,16 +24,16 @@ def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[Extend if debug: debug_listofdict = [] - if len(source_step) >= len(target_step): + if len(source_timeline) >= len(target_timeline): all_msg_match = False - for i in range(len(target_step)): + for i in range(len(target_timeline)): d = {} - d['source'] = source_step[i].content_for_future - d['target'] = target_step[i].content_for_future + d['source'] = source_timeline[i].content_for_future + d['target'] = target_timeline[i].content_for_future if compare_level == 'text': - same = source_step[i].content_for_future == target_step[i].content_for_future + same = source_timeline[i].content_for_future == target_timeline[i].content_for_future elif compare_level == 'token': - same = source_step[i].token_arr == target_step[i].token_arr + same = source_timeline[i].token_arr == target_timeline[i].token_arr else: raise NotImplementedError if not same: @@ -44,4 +43,44 @@ def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[Extend debug_listofdict.append(d) print_listofdict(debug_listofdict, header=f"can_merge_steps debug: {can_merge}") - return can_merge \ No newline at end of file + return can_merge + + + +def merge_tracker_timelines(timelines: List[List[ExtendedMessage]]) -> List[List[ExtendedMessage]]: + + def toggle_author(source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage]) -> List[ExtendedMessage]: + # if any message in `target_timeline` is author == 'llm', but same-index message in `source_timeline` is author != 'llm' + # change source_timeline's message author to 'llm' + for i in range(len(target_timeline)): + if target_timeline[i].author == 'llm' and source_timeline[i].author != 'llm': + source_timeline[i].author = target_timeline[i].author + source_timeline[i].token_arr = target_timeline[i].token_arr + source_timeline[i].token_logprob_arr = target_timeline[i].token_logprob_arr + assert source_timeline[i].need_training + return source_timeline + + absorbed_step_indices = [] + reversed_timelines = list(reversed(timelines)) + for i in range(len(reversed_timelines)): + if i in absorbed_step_indices: + continue + # check whether [i, len(reversed_timelines)-1] can be merged + for j in range(i+1, len(reversed_timelines)): + if j in absorbed_step_indices: + continue + source_timeline = reversed_timelines[i] + target_timeline = reversed_timelines[j] + if can_merge_steps(source_timeline, target_timeline): + source_timeline = toggle_author(source_timeline, target_timeline) + reversed_timelines[i] = source_timeline + absorbed_step_indices += [j] + + # reverse back and exclude absorbed steps + reversed_timelines_clean = [] + for i in range(len(reversed_timelines)): + if i not in absorbed_step_indices: + reversed_timelines_clean.append(reversed_timelines[i]) + timelines = list(reversed(reversed_timelines_clean)) + + return timelines \ No newline at end of file diff --git a/astune/context_tracker/tracker_base_attr.py b/astune/context_tracker/tracker_base_attr.py index a360b9e3..4149388e 100644 --- a/astune/context_tracker/tracker_base_attr.py +++ b/astune/context_tracker/tracker_base_attr.py @@ -40,7 +40,6 @@ def __init__(self, config, tokenizer, **kwargs): self.max_env_output_length: int = self.config.astune.rollout.max_env_len self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") self.generated_token_cnt = 0 - self.terminal_rewards_dict = {} self.discarded = False self.is_terminated = False diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 78372bd6..1e42d3f8 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -1,27 +1,19 @@ -import os import copy import time import numpy as np -import torch import uuid -import asyncio -from concurrent.futures import ThreadPoolExecutor -from typing import Dict, List, Literal, Callable, Any +from pydantic import BaseModel +from typing import Dict, List, Literal, Callable, Any, Type from loguru import logger from omegaconf import DictConfig -from tensordict import TensorDict -from torch.nn.utils.rnn import pad_sequence -from tqdm import tqdm -from verl import DataProto -from verl.utils.torch_functional import pad_sequence_to_length -from astune.task_runner.classic_runner import AgentRunner -from astune.task_runner.classic_runner import BaseAgentRunner -from astune.schema.task import Task, WorkflowTask -from astune.schema.trajectory import Sample -from astune.context_tracker.basic_tracker import BasicContextTracker, TrackerAttr -from beast_logger import register_logger, print_dict, print_listofdict -from astune.utils.utils import run_async_coro__no_matter_what +from astune.utils.utils import run_async_coro__no_matter_what, remove_fields from astune.schema.logprob import TokenAndProb +from agentscope.model import ChatResponse +from agentscope.message import TextBlock, ToolUseBlock +from agentscope._utils._common import _json_loads_with_repair +from transformers.tokenization_utils import PreTrainedTokenizer +from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking + class AsyncLlmBridge(object): @@ -40,6 +32,8 @@ def __init__( self.max_llm_retries = max_llm_retries def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: + + def llm_chat( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -63,9 +57,6 @@ def llm_chat( else: prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True) - from vsdb import bp - bp("TT") - final_res = run_async_coro__no_matter_what(self.async_rollout_manager.generate( request_id=request_id, prompt_ids=prompt_ids, @@ -97,6 +88,7 @@ def llm_chat( ] } + def llm_chat_remote( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -127,7 +119,6 @@ def llm_chat_remote( return output_message[-1] # type: ignore - def llm_chat_trinity( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -196,3 +187,110 @@ async def main(): return llm_chat + + +class ASTuneLlmProxy(object): + + def __init__( + self, + llm_chat_fn, + tokenizer:PreTrainedTokenizer, + context_tracker:MultiAgentContextTracking, + config, + ) -> None: + self.context_tracker = context_tracker + self.llm_chat_fn = llm_chat_fn + self.tokenizer = tokenizer + self.config = config + + + async def execute_model_proxy( + self, + messages: List[dict], + tools: List=[], + tool_choice: str = "auto", + structured_model=None, + **kwargs + ) -> ChatResponse: + + # prepare context tracker, check context safety + context_safe, info, converted_message, custom_sampling_params = \ + self.context_tracker.step_prepare(messages, tools) + if not context_safe: + logger.warning(f"[{info}] detected. Current token count exceeds the limit.") + self.context_overflow = True + return ChatResponse( + content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] + ) + + # run llm inference + llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) + + # begin context tracking + self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) + + # parse response + response = await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) + return response + + + async def _parse_dashscope_generation_response( + self, + message, + structured_model: Type[BaseModel] | None = None, + ) -> ChatResponse: + + content_blocks: List[TextBlock | ToolUseBlock] = [] + content = message.get("content") + metadata: dict | None = None + + if content not in [ + None, + "", + [], + ]: + if isinstance(content, list): + for item in content: + if isinstance(item, dict) and "text" in item: + content_blocks.append( + TextBlock( + type="text", + text=item["text"], + ), + ) + else: + content_blocks.append( + TextBlock( + type="text", + text=content, + ), + ) + + if message.get("tool_calls"): + for tool_call in message["tool_calls"]: + input_ = _json_loads_with_repair( + tool_call["function"].get( + "arguments", + "{}", + ) + or "{}", + ) + content_blocks.append( + ToolUseBlock( + type="tool_use", + name=tool_call["function"]["name"], + input=input_, # type: ignore + id=tool_call["id"], + ), + ) + + if structured_model: + metadata = input_ # type: ignore + + + parsed_response = ChatResponse( + content=content_blocks, + metadata=metadata, + ) + + return parsed_response diff --git a/astune/tuner.py b/astune/tuner.py index c9027389..670231d0 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -1,25 +1,24 @@ from litellm import Type from loguru import logger -from openai import AsyncOpenAI +from typing import Literal, Any from pydantic import BaseModel, Field from astune.utils.dynamic_import import dynamic_import -from astune.context_tracker.agentscope_tracker.request_proxy import ASTuneLlmProxy +from astune.task_rollout.async_llm_bridge import ASTuneLlmProxy from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking -from typing import AsyncGenerator, Literal, Optional, Any, List, Dict from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel -from agentscope.types import JSONSerializableObject from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model class Agent2Proxy(DashScopeChatModel): def __init__(self, name: str, proxy, default_model: ChatModelBase): self.name = name - self.default_model = default_model self.proxy = proxy + self.default_model = default_model def __call__(self, *args, **kwargs): if self.name not in self.proxy.get_trainable_targets(): - # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, and self.name is not in it, use default model + # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, + # and self.name is not in it, use default model return self.default_model(*args, **kwargs) else: # [TRAIN] diff --git a/astune/utils/utils.py b/astune/utils/utils.py index 3a6a56af..2495cc72 100644 --- a/astune/utils/utils.py +++ b/astune/utils/utils.py @@ -1,5 +1,6 @@ from typing import Any, List, Dict import asyncio +import copy # apply chat_template to a message, and then convert back to message def convert_tool_to_user_message(tool_message, tokenizer, format="qwen"): @@ -39,4 +40,11 @@ def _run(): if "exc" in _exc_holder: raise _exc_holder["exc"] final_res = _res_holder["res"] - return final_res \ No newline at end of file + return final_res + + +def remove_fields(d: Dict, fields: List[str]) -> Dict: + d = copy.deepcopy(d) + for field in fields: + d.pop(field.strip(), None) + return d \ No newline at end of file diff --git a/astune/workflow.py b/astune/workflow.py index 80419d10..e11ce57a 100644 --- a/astune/workflow.py +++ b/astune/workflow.py @@ -1,4 +1,4 @@ -from typing import Dict, List +from typing import List from pydantic import BaseModel, Field from astune import ModelTuner from astune.schema.task import WorkflowTask, WorkflowOutput From f8f57e5f4510b4c6cbeb7296dfa7aac19be46cde Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 19 Nov 2025 14:07:59 +0800 Subject: [PATCH 060/462] feat: add local sqlite connector in tracing reader --- astune/task_reader/tracing_reader/__init__.py | 4 +- .../task_reader/tracing_reader/connector.py | 133 +++++++++++++++++- 2 files changed, 128 insertions(+), 9 deletions(-) diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 6829a209..6cde3d3d 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -13,7 +13,7 @@ LlmEvaluateFilter, ) from ..task_reader_base import TaskReaderBase -from .connector import PhoneixConnector +from .connector import PhoenixConnector @@ -36,7 +36,7 @@ def __init__( # config patch self.config = config.astune.tracing - self._connector = PhoneixConnector(self.config.get("base_url")) + self._connector = PhoenixConnector(self.config.get("base_url")) filters_config = self.config.get("filters") built_filters = build_filters(filters_config) self._filters: List[Filter] = built_filters diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index 53b524ba..b0ff2ba6 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -1,16 +1,45 @@ -from typing import List - +import os +import sqlite3 +import ast +import re import requests import json import hashlib +from typing import List, Protocol from datetime import datetime from astune.schema.task import Task +class TracingConnector(Protocol): + def load_tasks_from_conversation(self) -> List[Task]: ... + + +class PhoenixConnector: + """ + PhoneixConnector is a class that connects to the Phoneix API. + + Args: + base_url (str): The base URL of the Phoneix API. + projects_limit (int): The maximum number of projects to load. + spans_limit (int): The maximum number of spans to load from each project. + + Methods: + load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: + Load all spans from all projects. -class PhoneixConnector: - def __init__(self, base_url: str) -> None: + load_tasks_from_conversation(self) -> List[Task]: + Load all tasks from the conversation spans. + + Attributes: + _base_url (str): The base URL of the Phoneix API. + _projects_limit (int): The maximum number of projects to load. + _spans_limit (int): The maximum number of spans to load from each project. + """ + + def __init__(self, base_url: str, projects_limit: int = 100, spans_limit: int = 100) -> None: self._base_url = base_url.rstrip("/") + self._projects_limit = projects_limit + self._spans_limit = spans_limit def _get(self, path: str, **params): url = f"{self._base_url}{path}" @@ -33,11 +62,13 @@ def load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: return all_spans def load_tasks_from_conversation( - self, projects_limit: int = 100, spans_limit: int = 100 + self ) -> List[Task]: - all_spans = self.load_spans(projects_limit=projects_limit, spans_limit=spans_limit) + all_spans = self.load_spans( + projects_limit=self._projects_limit, spans_limit=self._spans_limit) all_spans.sort(key=lambda x: datetime.fromisoformat(x["end_time"])) - all_spans = list(filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) + all_spans = list( + filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) qa: list = [] for span in all_spans: @@ -66,3 +97,91 @@ def load_tasks_from_conversation( return tasks +def parse_msg_line(line: str): + """ + Extract role and content from Msg(...). + """ + match = re.search(r"Msg\((.*)\)", line, re.DOTALL) + if not match: + return None + + inner = match.group(1) + + kv_pairs = [] + for item in re.findall(r"(\w+)=((?:'.*?'|None))", inner): + key, val = item + kv_pairs.append(f"'{key}': {val}") + dict_like = "{" + ", ".join(kv_pairs) + "}" + + try: + data = ast.literal_eval(dict_like) + except Exception as e: + print("解析失败:", e) + return None + + role = data.get("role") + content = data.get("content") + return {"role": role, "content": content} + + +class LocalSqliteConnector: + """ + A connector that loads tasks from a SQLite database file. + + Args: + db_path (str): Path to the SQLite database file. + + Attributes: + _db_path (str): Path to the SQLite database file. + + Methods: + load_tasks_from_conversation (self) -> List[Task]: + Load tasks from a conversation in the SQLite database file. + """ + + def __init__(self, db_path: str) -> None: + self._db_path = db_path + assert os.path.exists( + self._db_path), f"DB file {self._db_path} does not exist" + + def load_tasks_from_conversation(self) -> List[Task]: + conn = sqlite3.connect(self._db_path) + cursor = conn.cursor() + rows = cursor.execute( + "SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() + + qa = [] + for row in rows: + js = json.loads(row[0]) + query = js['input']['kwargs']['msg'] + output = js['output'] if 'output' in js else None + if query is not None and output is not None: + query = parse_msg_line(query) + output = parse_msg_line(output) + if query is not None and output is not None: + if query['role']=='user' and output['role']=='assistant': + if query['content'] is not None and output['content'] is not None: + qa.append( + {"query": query['content'], "answer": output['content']}) + + conn.close() + + tasks: List[Task] = [] + for item in qa: + raw = (item["query"] or "") + "\n" + (item["answer"] or "") + qa_hash = hashlib.sha256(raw.encode("utf-8")).hexdigest() + task = Task( + main_query=item["query"], + task_id="no_id", + env_type="no_env", + metadata={ + "answer": item["answer"], + "qa_hash": qa_hash, + }, + ) + tasks.append(task) + + return tasks + + +__all__ = ["LocalSqliteConnector", "PhoenixConnector"] \ No newline at end of file From 9603d6baa35c830e972913fe08d60c4d445e3b1f Mon Sep 17 00:00:00 2001 From: cc Date: Thu, 20 Nov 2025 10:27:18 +0800 Subject: [PATCH 061/462] feat: switch connector of tracing reader --- astune/task_reader/tracing_reader/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 6cde3d3d..7ee5375a 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -13,7 +13,7 @@ LlmEvaluateFilter, ) from ..task_reader_base import TaskReaderBase -from .connector import PhoenixConnector +from .connector import LocalSqliteConnector, PhoenixConnector @@ -36,7 +36,7 @@ def __init__( # config patch self.config = config.astune.tracing - self._connector = PhoenixConnector(self.config.get("base_url")) + self._connector = LocalSqliteConnector(self.config.get("base_url")) filters_config = self.config.get("filters") built_filters = build_filters(filters_config) self._filters: List[Filter] = built_filters From 9f6bdcf8ad9f7e93f922375255f00fd5bc19e983 Mon Sep 17 00:00:00 2001 From: cc Date: Thu, 20 Nov 2025 12:06:32 +0800 Subject: [PATCH 062/462] feat: add LocalSqliteConnectorV2 for new tracing database format --- astune/task_reader/tracing_reader/__init__.py | 4 +- .../task_reader/tracing_reader/connector.py | 63 ++++++++++++++++++- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 7ee5375a..e84ae7e7 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -13,7 +13,7 @@ LlmEvaluateFilter, ) from ..task_reader_base import TaskReaderBase -from .connector import LocalSqliteConnector, PhoenixConnector +from .connector import LocalSqliteConnectorV1, PhoenixConnector @@ -36,7 +36,7 @@ def __init__( # config patch self.config = config.astune.tracing - self._connector = LocalSqliteConnector(self.config.get("base_url")) + self._connector = LocalSqliteConnectorV1(self.config.get("base_url")) filters_config = self.config.get("filters") built_filters = build_filters(filters_config) self._filters: List[Filter] = built_filters diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index b0ff2ba6..a0a6b57e 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -124,7 +124,7 @@ def parse_msg_line(line: str): return {"role": role, "content": content} -class LocalSqliteConnector: +class LocalSqliteConnectorV1: """ A connector that loads tasks from a SQLite database file. @@ -182,6 +182,65 @@ def load_tasks_from_conversation(self) -> List[Task]: tasks.append(task) return tasks + + +class LocalSqliteConnectorV2: + """ + A connector that loads tasks from a SQLite database file in new format. + + https://github.com/agentscope-ai/agentscope-studio/pull/40/files#diff-12c7e27505a5171e080133021430d8cae2f4929ce2f4c93bd4ea5a389094224a + + Args: + db_path (str): Path to the SQLite database file. + + Attributes: + _db_path (str): Path to the SQLite database file. + + Methods: + load_tasks_from_conversation (self) -> List[Task]: + Load tasks from a conversation in the SQLite database file. + """ + + def __init__(self, db_path: str) -> None: + self._db_path = db_path + assert os.path.exists( + self._db_path), f"DB file {self._db_path} does not exist" + + def load_tasks_from_conversation(self) -> List[Task]: + conn = sqlite3.connect(self._db_path) + cursor = conn.cursor() + rows = cursor.execute( + "SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() + + qa = [] + for row in rows: + js = json.loads(row[0]) + inp = json.loads(js["gen_ai"]["input"]["messages"]) + out = json.loads(js["gen_ai"]["output"]["messages"]) + if "parts" in inp and "parts" in out: + qa.append({ + "query": inp["parts"][0]["content"], + "answer": out["parts"][0]["content"], + }) + + conn.close() + + tasks: List[Task] = [] + for item in qa: + raw = (item["query"] or "") + "\n" + (item["answer"] or "") + qa_hash = hashlib.sha256(raw.encode("utf-8")).hexdigest() + task = Task( + main_query=item["query"], + task_id="no_id", + env_type="no_env", + metadata={ + "answer": item["answer"], + "qa_hash": qa_hash, + }, + ) + tasks.append(task) + + return tasks -__all__ = ["LocalSqliteConnector", "PhoenixConnector"] \ No newline at end of file +__all__ = ["LocalSqliteConnectorV1", "LocalSqliteConnectorV2", "PhoenixConnector"] \ No newline at end of file From 1b597c3b8eb72f492298a7a3ad1afe8bc666a0b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 14:34:49 +0800 Subject: [PATCH 063/462] adjust name --- astune/__init__.py | 5 ++--- astune/task_rollout/async_llm_bridge.py | 11 ++++++++--- astune/tuner.py | 20 ++++++++++---------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/astune/__init__.py b/astune/__init__.py index a2417b26..bbbd9852 100644 --- a/astune/__init__.py +++ b/astune/__init__.py @@ -1,4 +1,3 @@ -from .tuner import ModelTuner -from .workflow import Workflow -from .workflow import WorkflowOutput +from astune.tuner import ModelTuner +from astune.workflow import Workflow from astune.schema.task import WorkflowTask, WorkflowOutput diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 1e42d3f8..976adf57 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -189,7 +189,12 @@ async def main(): -class ASTuneLlmProxy(object): +class LlmProxyForAgentScope(object): + """ + An essential wrapper to connect AsyncLlmBridge with AgentScope + + User_Agentscope_Workflow <-> AsyncLlmBridge <-> Context Tracker. + """ def __init__( self, @@ -204,7 +209,7 @@ def __init__( self.config = config - async def execute_model_proxy( + async def __call__( self, messages: List[dict], tools: List=[], @@ -233,7 +238,7 @@ async def execute_model_proxy( response = await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) return response - + # copied from AgentScope's DashScopeChatModule async def _parse_dashscope_generation_response( self, message, diff --git a/astune/tuner.py b/astune/tuner.py index 670231d0..f015e949 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -3,7 +3,7 @@ from typing import Literal, Any from pydantic import BaseModel, Field from astune.utils.dynamic_import import dynamic_import -from astune.task_rollout.async_llm_bridge import ASTuneLlmProxy +from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model @@ -31,7 +31,7 @@ def __init__(self, config, context_tracker, **kwargs) -> None: self.config = config self.context_tracker = context_tracker self.target2proxy_registry: dict[str, Agent2Proxy] = {} - self.astuner_proxy = ASTuneLlmProxy(context_tracker=context_tracker, **kwargs) + self.llm_proxy = LlmProxyForAgentScope(context_tracker=context_tracker, **kwargs) super().__init__( model_name='astune', api_key='dummy-api-key' @@ -70,19 +70,19 @@ def get_model(self, target_name: str) -> Agent2Proxy: return self.target2proxy_registry[target_name] - def get_astune_proxy(self) -> ASTuneLlmProxy: - """Get the ASTuneLlmProxy instance. + def get_llm_proxy(self) -> LlmProxyForAgentScope: + """Get the LlmProxyForAgentScope instance. Returns: - ASTuneLlmProxy: - The ASTuneLlmProxy instance used by the ModelTuner. + LlmProxyForAgentScope: + The LlmProxyForAgentScope instance used by the ModelTuner. """ - return self.astuner_proxy + return self.llm_proxy def get_context_tracker(self) -> MultiAgentContextTracking: """Get the context tracker instance. Returns: - ASTuneLlmProxy: + LlmProxyForAgentScope: The context tracker instance used by the ModelTuner. """ return self.context_tracker @@ -145,8 +145,8 @@ async def __call__( format_tool["function"]["name"], ) - # Get the AsyncGenerator from execute_model_proxy - response_gen = await self.astuner_proxy.execute_model_proxy( + # call llm model + response_gen = await self.llm_proxy( api_key=self.api_key, structured_model=structured_model, **kwargs, From dd577bf4ed0990f3279849e8f05eea5bf469ecf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 14:59:35 +0800 Subject: [PATCH 064/462] refactor: rename RunnerWithHooks to RunnerWithCallback and update related methods --- astune/context_tracker/basic_tracker.py | 1 - astune/task_runner/agentscope_runner.py | 12 ++-- astune/tuner.py | 79 +++++++++++++++++-------- 3 files changed, 61 insertions(+), 31 deletions(-) diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index b07d8bb1..34c4cb9d 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -116,7 +116,6 @@ def remove_last_non_llm_msg(self, ext_msg_list:List[ExtendedMessage]): return ext_msg_list - @property def steps(self): return self.prepare_previous_context(mod='future') diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index 00a3e632..bdd6b179 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -11,11 +11,12 @@ from astune.schema.trajectory import Reward, Trajectory from astune.schema.trajectory import Sample, Reward from astune.schema.task import Task, WorkflowTask +from astnue.task_judge.judge_base import JudgeBase from astune.utils.dynamic_import import dynamic_import from typing import Any, Dict, List, Union, Tuple -class RunnerWithHooks(BaseAgentRunner): +class RunnerWithCallback(BaseAgentRunner): def agentscope_runner_hooks(self, obs_window, task_thread_index, task_core_arg, env): @@ -53,12 +54,12 @@ def generated_token_callback_fn(token_array): } - def get_judge(self): + def get_judge(self) -> JudgeBase: judge_protocol = self.config.astune.task_judge.judge_protocol return dynamic_import(judge_protocol)(self.config) # type: ignore -class AgentScopeRunner(RunnerWithHooks): +class AgentScopeRunner(RunnerWithCallback): def execute(self, env: EnvClient, task_core_arg: WorkflowTask) -> BasicContextTracker: obs_window = task_core_arg.obs_window @@ -69,7 +70,7 @@ def execute(self, env: EnvClient, task_core_arg: WorkflowTask) -> BasicContextTr workflow_import = self.config.astune.rollout.agentscope_learn_protocol workflow_cls = dynamic_import(workflow_import)() - agentscope_protocol: Workflow = workflow_cls(trainer='astune-trinity', AgentRunner_name='appworld') + agentscope_workflow: Workflow = workflow_cls(trainer='astune-trinity', AgentRunner_name='appworld') context_tracker = MultiAgentContextTracking( llm_chat_fn=self.llm_chat_fn, @@ -89,10 +90,11 @@ def execute(self, env: EnvClient, task_core_arg: WorkflowTask) -> BasicContextTr context_tracker=context_tracker, llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, + agentscope_workflow=agentscope_workflow, config=self.config, ) - workflow_output: WorkflowOutput = asyncio.run(agentscope_protocol.agentscope_execute(task_core_arg, astune_proxy)) + workflow_output: WorkflowOutput = asyncio.run(agentscope_workflow.agentscope_execute(task_core_arg, astune_proxy)) if workflow_output.reward is not None: raw_reward, is_success = workflow_output.reward, workflow_output.is_success else: diff --git a/astune/tuner.py b/astune/tuner.py index f015e949..9c57052c 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -1,35 +1,54 @@ from litellm import Type from loguru import logger -from typing import Literal, Any +from typing import Literal, Any, TYPE_CHECKING from pydantic import BaseModel, Field from astune.utils.dynamic_import import dynamic_import from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model +if TYPE_CHECKING: + from astune import Workflow class Agent2Proxy(DashScopeChatModel): - def __init__(self, name: str, proxy, default_model: ChatModelBase): + """ + Handler for **NAMED** agent trainning targets. + It stores the target name, and a reference to the ModelTuner. + When request comes, it switches between default model (dashscope or openai models) and ModelTuner + """ + + def __init__(self, name: str, tuner:"ModelTuner", default_model: ChatModelBase): self.name = name - self.proxy = proxy + self.tuner = tuner self.default_model = default_model def __call__(self, *args, **kwargs): - if self.name not in self.proxy.get_trainable_targets(): + if self.tuner.is_trainable(self.name): # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, # and self.name is not in it, use default model return self.default_model(*args, **kwargs) else: # [TRAIN] - return self.proxy(*args, **kwargs) + return self.tuner(*args, **kwargs) class ModelTuner(DashScopeChatModel): - - def __init__(self, config, context_tracker, **kwargs) -> None: + """ + ModelTuner for Agentscope workflow. + It keeps record of all registered agent types (by their target names), + And when request comes, it calls `self.llm_proxy` to handle the request. + """ + def __init__( + self, + config, + context_tracker:MultiAgentContextTracking, + agentscope_workflow: Workflow, + **kwargs + ) -> None: self.config = config self.context_tracker = context_tracker + self.agentscope_workflow = agentscope_workflow self.target2proxy_registry: dict[str, Agent2Proxy] = {} self.llm_proxy = LlmProxyForAgentScope(context_tracker=context_tracker, **kwargs) super().__init__( @@ -70,24 +89,6 @@ def get_model(self, target_name: str) -> Agent2Proxy: return self.target2proxy_registry[target_name] - def get_llm_proxy(self) -> LlmProxyForAgentScope: - """Get the LlmProxyForAgentScope instance. - Returns: - LlmProxyForAgentScope: - The LlmProxyForAgentScope instance used by the ModelTuner. - """ - return self.llm_proxy - - - def get_context_tracker(self) -> MultiAgentContextTracking: - """Get the context tracker instance. - Returns: - LlmProxyForAgentScope: - The context tracker instance used by the ModelTuner. - """ - return self.context_tracker - - async def __call__( self, messages: list[dict[str, Any]], @@ -154,3 +155,31 @@ async def __call__( # Return the AsyncGenerator directly return response_gen + + def is_trainable(self, target_name) -> bool: + if not self.agentscope_workflow.trainable_targets: + # always assume trainable when user has never changed trainable_targets + return True + if target_name in self.agentscope_workflow.trainable_targets: + return True + else: + return False + + + + def get_llm_proxy(self) -> LlmProxyForAgentScope: + """Get the LlmProxyForAgentScope instance. + Returns: + LlmProxyForAgentScope: + The LlmProxyForAgentScope instance used by the ModelTuner. + """ + return self.llm_proxy + + + def get_context_tracker(self) -> MultiAgentContextTracking: + """Get the context tracker instance. + Returns: + LlmProxyForAgentScope: + The context tracker instance used by the ModelTuner. + """ + return self.context_tracker From 0b554402c9cba2ea7c6c6d8011882053632b0cfb Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 17 Nov 2025 17:42:39 +0800 Subject: [PATCH 065/462] feat: introduce tracing reader --- astune/task_reader/tracing_reader/__init__.py | 131 ++++++++ .../task_reader/tracing_reader/connector.py | 68 +++++ .../tracing_reader/filters/__init__.py | 0 .../tracing_reader/filters/base.py | 11 + .../tracing_reader/filters/factory.py | 42 +++ .../filters/llm_evaluate_filter.py | 73 +++++ astune/task_reader/tracing_reader/fn.py | 192 ++++++++++++ .../task_reader/tracing_reader/llm_client.py | 286 ++++++++++++++++++ launcher/math_agent/git-math-agentscope.yaml | 16 + tests/test_tracing_reader.py | 125 ++++++++ 10 files changed, 944 insertions(+) create mode 100644 astune/task_reader/tracing_reader/__init__.py create mode 100644 astune/task_reader/tracing_reader/connector.py create mode 100644 astune/task_reader/tracing_reader/filters/__init__.py create mode 100644 astune/task_reader/tracing_reader/filters/base.py create mode 100644 astune/task_reader/tracing_reader/filters/factory.py create mode 100644 astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py create mode 100644 astune/task_reader/tracing_reader/fn.py create mode 100644 astune/task_reader/tracing_reader/llm_client.py create mode 100644 tests/test_tracing_reader.py diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py new file mode 100644 index 00000000..6829a209 --- /dev/null +++ b/astune/task_reader/tracing_reader/__init__.py @@ -0,0 +1,131 @@ + + +from typing import Any, List, Mapping, MutableMapping, Sequence, TypedDict + +import json +import os +import random + +from astune.schema.task import Task +from astune.task_reader.tracing_reader.filters.base import Filter +from astune.task_reader.tracing_reader.filters.factory import build_filters +from astune.task_reader.tracing_reader.filters.llm_evaluate_filter import ( + LlmEvaluateFilter, +) +from ..task_reader_base import TaskReaderBase +from .connector import PhoneixConnector + + + +class Config(TypedDict): + base_url: str + train_output_path: str + filters: List[Mapping[str, Any]] + + +class TracingReader(TaskReaderBase): + config: Config + + def __init__( + self, + config, + train_ratio: float = 0.7, + split_seed: int = 42, + ) -> None: + super().__init__(config) + # config patch + self.config = config.astune.tracing + + self._connector = PhoneixConnector(self.config.get("base_url")) + filters_config = self.config.get("filters") + built_filters = build_filters(filters_config) + self._filters: List[Filter] = built_filters + + self._train_ratio = train_ratio + self._split_seed = split_seed + + self._train_tasks: List[Task] = [] + self._val_tasks: List[Task] = [] + + self._init_tasks() + + def _load_existing_tasks(self, path: str) -> List[Task]: + if not os.path.exists(path): + return [] + tasks: List[Task] = [] + with open(path, "r") as f: + for line in f: + line = line.strip() + if not line: + continue + obj = json.loads(line) + tasks.append(Task(**obj)) + return tasks + + def _append_tasks(self, path: str, tasks: List[Task]) -> None: + if not tasks: + return + with open(path, "a") as f: + for task in tasks: + obj = task.model_dump() + f.write(json.dumps(obj, ensure_ascii=False) + "\n") + + def _apply_filters(self, tasks: List[Task]) -> List[Task]: + filtered = tasks + for flt in self._filters: + filtered = flt.filter(filtered) + return filtered + + def _init_tasks(self) -> None: + output_path = self.config.get("train_output_path") + + tasks = self._connector.load_tasks_from_conversation() + + existing_tasks = self._load_existing_tasks(output_path) + existing_hashes = { + t.metadata.get("qa_hash") + for t in existing_tasks + if t.metadata.get("qa_hash") is not None + } + + new_tasks = [ + t + for t in tasks + if t.metadata.get("qa_hash") is not None + and t.metadata["qa_hash"] not in existing_hashes + ] + + new_tasks_filtered = self._apply_filters(new_tasks) + + self._append_tasks(output_path, new_tasks_filtered) + + all_tasks: List[Task] = existing_tasks + new_tasks_filtered + + if not all_tasks: + self._train_tasks = [] + self._val_tasks = [] + return + + shuffled_tasks = list(all_tasks) + rnd = random.Random(self._split_seed) + rnd.shuffle(shuffled_tasks) + + total = len(shuffled_tasks) + train_size = int(total * self._train_ratio) + + if total == 1: + train_size = 1 + else: + if train_size <= 0: + train_size = 1 + if train_size >= total: + train_size = total - 1 + + self._train_tasks = shuffled_tasks[:train_size] + self._val_tasks = shuffled_tasks[train_size:] + + def get_training_tasks(self) -> List[Task]: + return self._train_tasks + + def get_validation_tasks(self) -> List[Task]: + return self._val_tasks \ No newline at end of file diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py new file mode 100644 index 00000000..53b524ba --- /dev/null +++ b/astune/task_reader/tracing_reader/connector.py @@ -0,0 +1,68 @@ +from typing import List + +import requests +import json +import hashlib +from datetime import datetime + +from astune.schema.task import Task + + +class PhoneixConnector: + def __init__(self, base_url: str) -> None: + self._base_url = base_url.rstrip("/") + + def _get(self, path: str, **params): + url = f"{self._base_url}{path}" + resp = requests.get(url, params=params) + resp.raise_for_status() + return resp.json()["data"] + + def load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: + projects = self._get( + "/v1/projects", + limit=projects_limit, + include_experiment_projects="false", + ) + + all_spans: list = [] + for project in projects: + pid = project["id"] + spans = self._get(f"/v1/projects/{pid}/spans", limit=spans_limit) + all_spans.extend(spans) + return all_spans + + def load_tasks_from_conversation( + self, projects_limit: int = 100, spans_limit: int = 100 + ) -> List[Task]: + all_spans = self.load_spans(projects_limit=projects_limit, spans_limit=spans_limit) + all_spans.sort(key=lambda x: datetime.fromisoformat(x["end_time"])) + all_spans = list(filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) + + qa: list = [] + for span in all_spans: + inp = json.loads(span["attributes"]["gen_ai.input.messages"]) + out = json.loads(span["attributes"]["gen_ai.output.messages"]) + if "parts" in inp and "parts" in out: + qa.append({ + "query": inp["parts"][0]["content"], + "answer": out["parts"][0]["content"], + }) + + tasks: List[Task] = [] + for item in qa: + raw = (item["query"] or "") + "\n" + (item["answer"] or "") + qa_hash = hashlib.sha256(raw.encode("utf-8")).hexdigest() + task = Task( + main_query=item["query"], + task_id="no_id", + env_type="no_env", + metadata={ + "answer": item["answer"], + "qa_hash": qa_hash, + }, + ) + tasks.append(task) + return tasks + + diff --git a/astune/task_reader/tracing_reader/filters/__init__.py b/astune/task_reader/tracing_reader/filters/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/astune/task_reader/tracing_reader/filters/base.py b/astune/task_reader/tracing_reader/filters/base.py new file mode 100644 index 00000000..d51b6824 --- /dev/null +++ b/astune/task_reader/tracing_reader/filters/base.py @@ -0,0 +1,11 @@ +from abc import ABC, abstractmethod +from typing import Iterable, List + +from astune.schema.task import Task + + +class Filter(ABC): + @abstractmethod + def filter(self, tasks: Iterable[Task]) -> List[Task]: + """Filter a collection of Task objects and return the kept ones.""" + raise NotImplementedError diff --git a/astune/task_reader/tracing_reader/filters/factory.py b/astune/task_reader/tracing_reader/filters/factory.py new file mode 100644 index 00000000..d6d8a39d --- /dev/null +++ b/astune/task_reader/tracing_reader/filters/factory.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Sequence + +from .base import Filter +from .llm_evaluate_filter import LlmEvaluateFilter + + +FILTER_REGISTRY: Dict[str, type[Filter]] = { + "llm_evaluate": LlmEvaluateFilter, +} + + +def _build_single_filter(spec: Mapping[str, Any]) -> Filter: + type_name = spec.get("type") + if not isinstance(type_name, str): + raise ValueError(f"Filter spec must contain string 'type', got: {type_name!r}") + + params = spec.get("params") or {} + if not isinstance(params, MutableMapping): + raise TypeError("Filter 'params' must be a mapping if present") + + cls = FILTER_REGISTRY.get(type_name) + if cls is None: + raise ValueError(f"Unknown filter type: {type_name!r}") + + return cls(**params) # type: ignore[arg-type] + + +def build_filters(specs: Sequence[Mapping[str, Any]] | None) -> List[Filter]: + """Setup filter chain according to config. + """ + if not specs: + return [] + + filters: List[Filter] = [] + for spec in specs: + enabled = spec.get("enabled", True) + if not enabled: + continue + filters.append(_build_single_filter(spec)) + return filters diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py new file mode 100644 index 00000000..5657a1b0 --- /dev/null +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -0,0 +1,73 @@ +from typing import Iterable, List + +from astune.schema.task import Task + +from ..fn import Fn +from ..llm_client import DashScopeClient +from .base import Filter + + +EVALUATE_PROMPT = """你现在扮演一个**严格的 QA 质量审查员**。给你一条数据样本,包含一个“query”(用户提问/任务)和一个“answer”(助手回复)。请只依据文本本身进行静态评估,不要编造事实或外部检索。 + +一、判定目标 +判定该「query–answer」是否为**高质量数据(GOOD)**,并给出分数与理由。若不满足标准,则标为**BAD**。 + +二、判断标准(任一命中即 BAD) +1. **缺失项**:query 为空、answer 为空、或两者皆空。 +2. **非答复**:answer 只有“收到/明白/请提供更多信息/占位寒暄”,没有实质回答或行动结果。 +3. **牛头不对马嘴**:answer 与 query 主题明显不相关。 +4. **流程借口**:answer 主要描述“无法搜索/被限流/遇到验证码/换设备”等流程困难,却**没有**给出替代性信息、总结、或可执行的下一步。 +5. **明显自相矛盾或逻辑不通**:同一回答内部互相打架(如先说能做又说不能做)。 +6. **安全/合规红线**:含违法、仇恨、个人隐私泄露等明显不当内容。 +7. **语言极不匹配**:query 的语言与 answer 完全不匹配,影响理解(如中文提问,answer 用不通顺的法语且与内容无关)。 + +三、特殊情况与其他标准 +{custom_rubrics} + +以上信息有任何一个命中,最终结果即为BAD,否则是GOOD。 +""" + + +class LlmEvaluateFilter(Filter): + def __init__( + self, + *, + custom_rubrics: str = "", + temperature: float = 0.7, + max_tokens: int = 2048, + print_reason: bool = True, + ) -> None: + """Filter that evaluates the quality of tasks using LLM. + """ + + self._print_reason = print_reason + self._llm = DashScopeClient() + self._fn = Fn( + name="evaluate_quality", + description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), + llm_client=self._llm, + input_schema={ + "query": "用户提问/任务", + "answer": "助手回复", + }, + output_schema={ + "reason": "判断理由,简明说明理由", + "result": "GOOD/BAD", + }, + sampling_params={"temperature": temperature, "max_tokens": max_tokens}, + ) + + def filter(self, tasks: Iterable[Task]) -> List[Task]: + kept: List[Task] = [] + for task in tasks: + payload = { + "query": task.main_query, + "answer": task.metadata.get("answer", ""), + } + res = self._fn(payload) + assert isinstance(res, dict) + if self._print_reason: + print(res["reason"]) + if res.get("result") == "GOOD": + kept.append(task) + return kept diff --git a/astune/task_reader/tracing_reader/fn.py b/astune/task_reader/tracing_reader/fn.py new file mode 100644 index 00000000..a4918cfa --- /dev/null +++ b/astune/task_reader/tracing_reader/fn.py @@ -0,0 +1,192 @@ +import re +from typing import Any, Dict, List, Union +from .llm_client import DashScopeClient + + +class Fn: + """ + A class that defines a task with specific requirements, input parameters, and output format. + It uses LlmClient to execute the task and parses the result using markdown-kv format. + """ + + def __init__(self, + name: str, + description: str, + llm_client: DashScopeClient, + input_schema: Dict[str, str], + output_schema: Dict[str, str], + sampling_params: Dict[str, Any] = {}): + """ + Initialize the Fn class. + + Args: + name: The name of the function/task + description: Description of what the task does + llm_client: The LLM client to use for execution + input_schema: Dictionary defining the input parameters format (name -> description) + output_schema: Dictionary defining the output format (name -> description) + sampling_params: Parameters for LLM sampling + """ + self.name = name + self.description = description + self.llm_client = llm_client + self.input_schema = input_schema + self.output_schema = output_schema + self.sampling_params = sampling_params or {} + + def _build_system_prompt(self) -> str: + """ + Build the system prompt that defines the task requirements, input format, and output format. + + Returns: + str: The system prompt for the LLM + """ + prompt_parts = [] + + # Task description + prompt_parts.append(f"## Task: {self.name}") + prompt_parts.append(f"Description: {self.description}") + prompt_parts.append("") + + # Input format + prompt_parts.append("## Input Parameters") + if self.input_schema: + prompt_parts.append("The input parameters should be provided in the following format:") + for param_name, param_desc in self.input_schema.items(): + prompt_parts.append(f"- {param_name}: {param_desc}") + prompt_parts.append("") + prompt_parts.append("Input can be either:") + prompt_parts.append("1. A single record (dict) with the above parameters") + prompt_parts.append("2. Multiple records (list of dicts) with the same parameters") + else: + prompt_parts.append("This task takes no input parameters.") + prompt_parts.append("") + + # Output format + prompt_parts.append("## Output Format") + prompt_parts.append("You must return the result in markdown-kv format as shown below:") + prompt_parts.append("```markdown") + if self.output_schema: + prompt_parts.append("## record 0") + for field_name, field_desc in self.output_schema.items(): + prompt_parts.append(f"{field_name}=value") + else: + prompt_parts.append("## record 0") + prompt_parts.append("result=success") + prompt_parts.append("```") + prompt_parts.append("") + + # Multiple records instruction + prompt_parts.append("If there are multiple results, use separate records with increasing indices:") + prompt_parts.append("```markdown") + prompt_parts.append("## record 0") + prompt_parts.append("name=first_result") + prompt_parts.append("value=some_value") + prompt_parts.append("") + prompt_parts.append("## record 1") + prompt_parts.append("name=second_result") + prompt_parts.append("value=another_value") + prompt_parts.append("```") + prompt_parts.append("") + + # Important instructions + prompt_parts.append("## Important Instructions") + prompt_parts.append("1. Always follow the exact markdown-kv format shown above") + prompt_parts.append("2. Do not include any other text or formatting in your response") + prompt_parts.append("3. Only return the markdown-kv formatted result") + + return "\n".join(prompt_parts) + + def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, str]]]: + """ + Parse markdown-kv formatted text into dictionary or list of dictionaries. + + Args: + text: The markdown-kv formatted text to parse + + Returns: + Union[Dict[str, str], List[Dict[str, str]]]: Parsed result as dict or list of dicts + """ + # Remove code block markers if present + text = re.sub(r'```.*?\n', '', text, flags=re.DOTALL) + text = re.sub(r'```', '', text) + + # Split by record headers + record_pattern = r'## record \d+' + record_sections = re.split(record_pattern, text) + + # Remove empty sections + record_sections = [section.strip() for section in record_sections if section.strip()] + + results = [] + for section in record_sections: + # Parse key-value pairs + kv_dict = {} + lines = section.strip().split('\n') + for line in lines: + if '=' in line: + key, value = line.split('=', 1) + kv_dict[key.strip()] = value.strip() + if kv_dict: # Only add non-empty dictionaries + results.append(kv_dict) + + # Return single dict if only one record, otherwise return list + if len(results) == 1: + return results[0] + return results + + def _format_input_parameters(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> str: + """ + Format input parameters for the user prompt. + + Args: + input_data: Input parameters as dict or list of dicts + + Returns: + str: Formatted string representation of input parameters + """ + if isinstance(input_data, list): + if not input_data: + return "No input parameters provided." + + formatted_parts = ["Input parameters (multiple records):"] + for i, record in enumerate(input_data): + formatted_parts.append(f"\nRecord {i}:") + for key, value in record.items(): + formatted_parts.append(f" - {key}: {value}") + return "\n".join(formatted_parts) + elif isinstance(input_data, dict): + if not input_data: + return "No input parameters provided." + + formatted_parts = ["Input parameters:"] + for key, value in input_data.items(): + formatted_parts.append(f" - {key}: {value}") + return "\n".join(formatted_parts) + else: + return f"Input parameters: {input_data}" + + def __call__(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> Union[Dict[str, str], List[Dict[str, str]]]: + """ + Execute the task with the given parameters. + + Args: + input_data: Input parameters for the task (dict or list of dicts) + + Returns: + Union[Dict[str, str], List[Dict[str, str]]]: The parsed result from the LLM + """ + # Build the user prompt with input parameters + user_prompt = self._format_input_parameters(input_data) + + # Build messages for LLM + messages = [ + {"role": "system", "content": self._build_system_prompt()}, + {"role": "user", "content": user_prompt} + ] + + # Call LLM + response = self.llm_client.chat(messages, self.sampling_params) + + # Parse and return result + return self._parse_markdown_kv(response) \ No newline at end of file diff --git a/astune/task_reader/tracing_reader/llm_client.py b/astune/task_reader/tracing_reader/llm_client.py new file mode 100644 index 00000000..fa253141 --- /dev/null +++ b/astune/task_reader/tracing_reader/llm_client.py @@ -0,0 +1,286 @@ +from abc import ABC, abstractmethod +import json +import os +import time +from typing import Any, Optional, Protocol, Iterator, Generator, cast + +from loguru import logger +import requests + +class LlmException(Exception): + def __init__(self,typ: str): + self._type=typ + + @property + def typ(self): + return self._type + + +class DashScopeClient: + """Aliyun DashScope API Client""" + + def __init__(self, api_key: Optional[str] = None, model_name: str = "qwen-plus", + temperature: float = 0.7, max_tokens: int = 2048): + self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY") + if not self.api_key: + raise ValueError("API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly.") + + self.model_name = model_name + self.temperature = temperature + self.max_tokens = max_tokens + self.base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1" + + self.headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json" + } + + def set_model(self, model_name: str): + """ + Sets the model name for the DashScopeClient instance. + + Args: + model_name (str): The name of the model to be used for API interactions. + """ + self.model_name = model_name # ⭐ Assigns the provided model name to the instance variable + + def chat(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> str: + """ + Sends a chat request to the LLM, aggregates the streaming responses, and returns the complete response. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. + sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the LLM. + + Returns: + str: The complete response from the LLM as a single string. + """ + res = "" + for x in self.chat_stream(messages, sampling_params): # ⭐ Aggregates the streaming responses into a single string + res += x + return res + + def chat_stream(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> Generator[str, None, None]: + """ + Initiates a streaming chat session and returns a generator that yields the response as it is being generated. + + Args: + messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. + sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the model. + + Returns: + Generator[str, None, None]: A generator that yields the response text as it is being generated. + """ + return self.chat_stream_with_retry(messages, **sampling_params) # ⭐ Calls the retry mechanism for streaming chat + + def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, **kwargs) -> str | Generator[str, None, None]: + """ + Sends a request to the chat completion API, supporting both non-streaming and streaming modes, and handles various exceptions. + + Args: + messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. + stream (bool, optional): If True, the response will be streamed. Defaults to False. + **kwargs: Additional parameters to be passed to the API. + + Returns: + str | Generator[str, None, None]: The full response text if not streaming, or a generator yielding the response text if streaming. + """ + url = f"{self.base_url}/chat/completions" + + # Merge parameters + params = { + "model": self.model_name, + "messages": messages, + "temperature": self.temperature, + "max_tokens": self.max_tokens, + "stream": stream, + **kwargs + } + + try: + if stream: + return self._handle_stream_response(url, params) # ⭐ Handles the streaming response + else: + return self._handle_normal_response(url, params) # ⭐ Handles the non-streaming response + + except requests.exceptions.RequestException as e: + logger.error(f"API request failed: {e}") + return "" if not stream else (x for x in []) + except json.JSONDecodeError as e: + logger.error(f"Failed to parse API response: {e}") + return "" if not stream else (x for x in []) + except Exception as e: + logger.error(f"Unexpected error in API call: {e}") + return "" if not stream else (x for x in []) + + def _handle_normal_response(self, url: str, params: dict) -> str: + """ + Handles the non-streaming (normal) response from the API. + + Args: + url (str): The URL to which the POST request is sent. + params (dict): The parameters to be included in the JSON body of the POST request. + + Returns: + str: The content of the first choice's message in the response, or an empty string if the response format is unexpected. + """ + response = requests.post(url, headers=self.headers, json=params, timeout=600) # ⭐ Sends the POST request to the API + if not response.ok: + # check inappropriate content + try: + error_json=response.json()['error'] + if "inappropriate content" in error_json['message']: + raise LlmException("inappropriate content") + if "limit" in error_json['message']: + raise LlmException("hit limit") + except LlmException as e: + raise + except: + logger.error(f"API request failed: {response.text}") + response.raise_for_status() + + result = response.json() + if "choices" in result and len(result["choices"]) > 0: + return result["choices"][0]["message"]["content"].strip() # ⭐ Extracts and returns the content of the first choice's message + else: + logger.error(f"Unexpected response format: {result}") + return "" + + def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None, None]: + """ + Handles the streaming response from a POST request to the specified URL. + + Args: + url (str): The URL to which the POST request is sent. + params (dict): The parameters to be sent with the POST request. + + Yields: + str: The content of the response, if it meets the specified conditions. + """ + response = requests.post(url, headers=self.headers, json=params, stream=True, timeout=600) # ⭐ Send the POST request and get the streaming response + if not response.ok: + # check inappropriate content + try: + error_json=response.json()['error'] + if "inappropriate content" in error_json['message']: + raise LlmException("inappropriate content") + if "limit" in error_json['message']: + raise LlmException("hit limit") + except LlmException as e: + raise + except: + logger.error(f"API request failed: {response.text}") + response.raise_for_status() + + for line in response.iter_lines(): + if line: + line = line.decode('utf-8') + if line.startswith('data: '): + data = line[6:] # remove the prefix 'data: ' + if data == '[DONE]': + break + + try: + chunk = json.loads(data) + if "choices" in chunk and len(chunk["choices"]) > 0: + choice = chunk["choices"][0] + if "delta" in choice and "content" in choice["delta"]: + content = choice["delta"]["content"] + if content: + yield content # ⭐ Yield the content if it meets the conditions + except json.JSONDecodeError: + continue # skip the bad line + + def chat_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, + retry_delay: float = 1.0, **kwargs) -> str: + """ + Sends a chat completion request to the LLM with a retry mechanism. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries for the chat. + max_retries (int, optional): Maximum number of retries. Defaults to 3. + retry_delay (float, optional): Initial delay between retries in seconds. Defaults to 1.0. + **kwargs: Additional keyword arguments to be passed to the `chat_completion` method. + + Returns: + str: The response from the LLM or a predefined message if all attempts fail. + """ + for attempt in range(max_retries): + try: + result = cast(str,self.chat_completion(messages, stream=False, **kwargs)) # ⭐ Attempt to get a chat completion + if result: # If a valid response is obtained + return result + + except LlmException as e: + if e.typ=='inappropriate content': + logger.warning(f"llm return inappropriate content, which is blocked by the remote") + return "[inappropriate content]" + except Exception as e: + logger.warning(f"Attempt {attempt + 1} failed: {e}") + + if attempt < max_retries - 1: # Not the last attempt + time.sleep(retry_delay * (2 ** attempt)) # Exponential backoff + + logger.error(f"All {max_retries} attempts failed") + return "" + + def chat_stream_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, + retry_delay: float = 10.0, **kwargs) -> Generator[str, None, None]: + """ + Attempts to establish a streaming chat completion with a retry mechanism. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. + max_retries (int, optional): The maximum number of retry attempts. Defaults to 3. + retry_delay (float, optional): The initial delay in seconds before the first retry. Defaults to 10.0. + **kwargs: Additional keyword arguments to pass to the chat_completion method. + + Yields: + str: Chunks of the streaming response. + """ + for attempt in range(max_retries): + try: + stream_generator = cast(Generator[str, None, None], self.chat_completion(messages, stream=True, **kwargs)) # ⭐ Cast the generator to the appropriate type + # try to fetch the first chunk to verify the connection + first_chunk = next(stream_generator, None) + if first_chunk is not None: + yield first_chunk + # yield the rest chunks + for chunk in stream_generator: + yield chunk + return # success + except LlmException as e: + if e.typ=='inappropriate content': + logger.warning(f"llm return inappropriate content, which is blocked by the remote") + yield "[inappropriate content]" + return + except Exception as e: + logger.warning(f"Stream attempt {attempt + 1} failed: {e}") + + if attempt < max_retries - 1: + time.sleep(retry_delay * (2 ** attempt)) + + logger.error(f"All {max_retries} stream attempts failed") + + return + + +# demo +if __name__ == "__main__": + client = DashScopeClient(model_name='qwq-32b') + + messages = [ + {"role": "user", "content": "Write a poem about Spring."} + ] + + # print("=== request ===") + # response = client.chat_completion(messages) + # print(response) + + print("\n=== streaming ===") + for chunk in client.chat_completion(messages, stream=True): + print(chunk, end='', flush=True) + + print("\n\n=== streaming with retry ===") + for chunk in client.chat_stream(messages, {}): + print(chunk, end='', flush=True) \ No newline at end of file diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 0a7ab36f..47de365d 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -7,6 +7,22 @@ astune: dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' training_split: "train" validation_split: "test" + + # example + tracing: + base_url: http://phoenix:port + train_output_path: /path/to/tasks.jsonl + filters: + - type: llm_evaluate + enabled: true + params: + custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" + temperature: 0.5 + max_tokens: 2048 + print_reason: false + + + task_judge: # ✨✨✨✨ 编写并选择评价函数 diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py new file mode 100644 index 00000000..879adb8a --- /dev/null +++ b/tests/test_tracing_reader.py @@ -0,0 +1,125 @@ +import json +from pathlib import Path +from typing import List + +import pytest + +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task + + +class DummyConnector: + def __init__(self, tasks: List[Task]): + self._tasks = tasks + self.called = 0 + + def load_tasks_from_conversation(self, projects_limit: int = 100, spans_limit: int = 100) -> List[Task]: + self.called += 1 + return self._tasks + + +class DummyFilter: + def __init__(self, kept: List[Task]): + self._kept = kept + self.last_input: List[Task] | None = None + + def filter(self, tasks: List[Task]) -> List[Task]: + self.last_input = list(tasks) + return self._kept + + +def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: + metadata = {"answer": answer} + if qa_hash is not None: + metadata["qa_hash"] = qa_hash + return Task( + main_query=query, + task_id="tid", + env_type="env", + metadata=metadata, + ) + + +@pytest.fixture +def config(tmp_path: Path) -> dict: + return { + "base_url": "http://example.com", + "train_output_path": str(tmp_path / "tasks.jsonl"), + } + + +def test_get_training_tasks_new_file(config: dict): + # prepare tasks returned from connector + t1 = _make_task("q1", "a1", "h1") + t2 = _make_task("q2", "a2", "h2") + tasks = [t1, t2] + + connector = DummyConnector(tasks) + flt = DummyFilter(kept=tasks) + + reader = TracingReader(config) # type: ignore + reader._connector = connector # type: ignore[attr-defined] + reader._filters = [flt] # type: ignore[attr-defined] + + result = reader.get_training_tasks() + + # connector should be called once + assert connector.called == 1 + + # filter should receive all new tasks + assert flt.last_input == tasks + + # returned tasks should be exactly the filtered ones + assert result == tasks + + # file should be created with one json per line + out_path = Path(config["train_output_path"]) + assert out_path.exists() + with out_path.open("r", encoding="utf-8") as f: + lines = [json.loads(line) for line in f if line.strip()] + assert len(lines) == 2 + assert {obj["metadata"]["qa_hash"] for obj in lines} == {"h1", "h2"} + + +def test_get_training_tasks_dedup_and_missing_hash_ignored(config: dict): + out_path = Path(config["train_output_path"]) + + # existing task with hash h1 + existing = _make_task("q_exist", "a_exist", "h1") + out_path.parent.mkdir(parents=True, exist_ok=True) + with out_path.open("w", encoding="utf-8") as f: + f.write(json.dumps(existing.model_dump(), ensure_ascii=False) + "\n") + + # connector returns: duplicate (h1), new (h2), and one without qa_hash + dup = _make_task("q_dup", "a_dup", "h1") + new = _make_task("q_new", "a_new", "h2") + no_hash = _make_task("q_nohash", "a_nohash", None) + connector_tasks = [dup, new, no_hash] + + # filter will keep everything it receives so we can test input to filter + flt = DummyFilter(kept=[new]) + connector = DummyConnector(connector_tasks) + + reader = TracingReader(config) # type: ignore + reader._connector = connector # type: ignore[attr-defined] + reader._filters = [flt] # type: ignore[attr-defined] + + result = reader.get_training_tasks() + + # existing task plus new filtered task should be returned + assert len(result) == 2 + assert existing in result + assert new in result + + # filter should see only new tasks with non-duplicate hashes => [new] + assert flt.last_input == [new] + + # output file should now contain existing + new filtered + with out_path.open("r", encoding="utf-8") as f: + objs = [json.loads(line) for line in f if line.strip()] + + hashes = [obj["metadata"].get("qa_hash") for obj in objs] + assert "h1" in hashes + assert "h2" in hashes + # no record without hash should be written + assert None not in hashes From 2a05dbc4965d4d3aaaa1933c55c0738a56580caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Wed, 19 Nov 2025 12:08:31 +0800 Subject: [PATCH 066/462] move tracing config to astune-default --- astune/default_config/astune_default.yaml | 18 +++++++++++++++++- launcher/math_agent/git-math-agentscope.yaml | 16 ---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 82f70d88..ae8aaed3 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -111,4 +111,20 @@ astune: lr: 1e-6 use_kl_loss: True kl_loss_coef: 0.002 - kl_loss_type: low_var_kl \ No newline at end of file + kl_loss_type: low_var_kl + + # the tracing config + tracing: + base_url: http://phoenix:port + train_output_path: /path/to/tasks.jsonl + filters: + - type: llm_evaluate + enabled: true + params: + custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" + temperature: 0.5 + max_tokens: 2048 + print_reason: false + + + diff --git a/launcher/math_agent/git-math-agentscope.yaml b/launcher/math_agent/git-math-agentscope.yaml index 47de365d..0a7ab36f 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/launcher/math_agent/git-math-agentscope.yaml @@ -7,22 +7,6 @@ astune: dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' training_split: "train" validation_split: "test" - - # example - tracing: - base_url: http://phoenix:port - train_output_path: /path/to/tasks.jsonl - filters: - - type: llm_evaluate - enabled: true - params: - custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" - temperature: 0.5 - max_tokens: 2048 - print_reason: false - - - task_judge: # ✨✨✨✨ 编写并选择评价函数 From 8417a760541250b4c3d38593eaca6ccbd4e34044 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 19 Nov 2025 12:16:15 +0800 Subject: [PATCH 067/462] refactor: translate prompt into English --- .../filters/llm_evaluate_filter.py | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 5657a1b0..4c35cbe2 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -7,24 +7,33 @@ from .base import Filter -EVALUATE_PROMPT = """你现在扮演一个**严格的 QA 质量审查员**。给你一条数据样本,包含一个“query”(用户提问/任务)和一个“answer”(助手回复)。请只依据文本本身进行静态评估,不要编造事实或外部检索。 +EVALUATE_PROMPT = """You are now acting as a **strict QA quality reviewer**. You will be given a data sample containing a “query” (user question/task) and an “answer” (assistant reply). Evaluate it **only based on the text itself**, without inventing facts or performing external retrieval. -一、判定目标 -判定该「query–answer」是否为**高质量数据(GOOD)**,并给出分数与理由。若不满足标准,则标为**BAD**。 +--- -二、判断标准(任一命中即 BAD) -1. **缺失项**:query 为空、answer 为空、或两者皆空。 -2. **非答复**:answer 只有“收到/明白/请提供更多信息/占位寒暄”,没有实质回答或行动结果。 -3. **牛头不对马嘴**:answer 与 query 主题明显不相关。 -4. **流程借口**:answer 主要描述“无法搜索/被限流/遇到验证码/换设备”等流程困难,却**没有**给出替代性信息、总结、或可执行的下一步。 -5. **明显自相矛盾或逻辑不通**:同一回答内部互相打架(如先说能做又说不能做)。 -6. **安全/合规红线**:含违法、仇恨、个人隐私泄露等明显不当内容。 -7. **语言极不匹配**:query 的语言与 answer 完全不匹配,影响理解(如中文提问,answer 用不通顺的法语且与内容无关)。 +## 1. Evaluation Goal +Determine whether the given “query-answer” pair is **high-quality data (GOOD)** and provide a score and justification. +If it does not meet the criteria, label it as **BAD**. -三、特殊情况与其他标准 +--- + +## 2. BAD Criteria (if any are met → BAD) +1. **Missing elements**: The query is empty, the answer is empty, or both are empty. +2. **Non-answer**: The answer contains only acknowledgments such as “Received / OK / Please provide more information,” without substantive content or actionable results. +3. **Irrelevant**: The answer is clearly unrelated to the query. +4. **Process excuses**: The answer mainly describes process issues (“cannot search / rate-limited / captcha / try another device”), **without** providing alternative information, summaries, or next steps. +5. **Self-contradiction or illogical**: The answer contradicts itself or contains major logical inconsistencies. +6. **Safety or compliance violations**: Includes illegal content, hate speech, personal privacy leaks, or other clearly inappropriate material. +7. **Severe language mismatch**: The answer is in a completely different language from the query in a way that breaks comprehension (e.g., Chinese query but irrelevant and incoherent French reply). + +--- + +## 3. Special Cases & Additional Rules {custom_rubrics} -以上信息有任何一个命中,最终结果即为BAD,否则是GOOD。 +--- + +If **any** of the above conditions are triggered, the final result must be **BAD**. Otherwise, it is **GOOD**. """ From ffbc7c43f383ef16ed52d853c7a12c93a9cf6ae1 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 19 Nov 2025 13:30:47 +0800 Subject: [PATCH 068/462] fix: translate rest LLM evaluate filter schema into English --- .../tracing_reader/filters/llm_evaluate_filter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 4c35cbe2..02f05f07 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -56,11 +56,11 @@ def __init__( description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), llm_client=self._llm, input_schema={ - "query": "用户提问/任务", - "answer": "助手回复", + "query": "user query/task", + "answer": "assistant answer", }, output_schema={ - "reason": "判断理由,简明说明理由", + "reason": "judgment reason, briefly explain the reason", "result": "GOOD/BAD", }, sampling_params={"temperature": temperature, "max_tokens": max_tokens}, From 3d6b29c88f40952275d3138b38f8e54456acb4e2 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 19 Nov 2025 14:07:59 +0800 Subject: [PATCH 069/462] feat: add local sqlite connector in tracing reader --- astune/task_reader/tracing_reader/__init__.py | 4 +- .../task_reader/tracing_reader/connector.py | 133 +++++++++++++++++- 2 files changed, 128 insertions(+), 9 deletions(-) diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 6829a209..6cde3d3d 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -13,7 +13,7 @@ LlmEvaluateFilter, ) from ..task_reader_base import TaskReaderBase -from .connector import PhoneixConnector +from .connector import PhoenixConnector @@ -36,7 +36,7 @@ def __init__( # config patch self.config = config.astune.tracing - self._connector = PhoneixConnector(self.config.get("base_url")) + self._connector = PhoenixConnector(self.config.get("base_url")) filters_config = self.config.get("filters") built_filters = build_filters(filters_config) self._filters: List[Filter] = built_filters diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index 53b524ba..b0ff2ba6 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -1,16 +1,45 @@ -from typing import List - +import os +import sqlite3 +import ast +import re import requests import json import hashlib +from typing import List, Protocol from datetime import datetime from astune.schema.task import Task +class TracingConnector(Protocol): + def load_tasks_from_conversation(self) -> List[Task]: ... + + +class PhoenixConnector: + """ + PhoneixConnector is a class that connects to the Phoneix API. + + Args: + base_url (str): The base URL of the Phoneix API. + projects_limit (int): The maximum number of projects to load. + spans_limit (int): The maximum number of spans to load from each project. + + Methods: + load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: + Load all spans from all projects. -class PhoneixConnector: - def __init__(self, base_url: str) -> None: + load_tasks_from_conversation(self) -> List[Task]: + Load all tasks from the conversation spans. + + Attributes: + _base_url (str): The base URL of the Phoneix API. + _projects_limit (int): The maximum number of projects to load. + _spans_limit (int): The maximum number of spans to load from each project. + """ + + def __init__(self, base_url: str, projects_limit: int = 100, spans_limit: int = 100) -> None: self._base_url = base_url.rstrip("/") + self._projects_limit = projects_limit + self._spans_limit = spans_limit def _get(self, path: str, **params): url = f"{self._base_url}{path}" @@ -33,11 +62,13 @@ def load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: return all_spans def load_tasks_from_conversation( - self, projects_limit: int = 100, spans_limit: int = 100 + self ) -> List[Task]: - all_spans = self.load_spans(projects_limit=projects_limit, spans_limit=spans_limit) + all_spans = self.load_spans( + projects_limit=self._projects_limit, spans_limit=self._spans_limit) all_spans.sort(key=lambda x: datetime.fromisoformat(x["end_time"])) - all_spans = list(filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) + all_spans = list( + filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) qa: list = [] for span in all_spans: @@ -66,3 +97,91 @@ def load_tasks_from_conversation( return tasks +def parse_msg_line(line: str): + """ + Extract role and content from Msg(...). + """ + match = re.search(r"Msg\((.*)\)", line, re.DOTALL) + if not match: + return None + + inner = match.group(1) + + kv_pairs = [] + for item in re.findall(r"(\w+)=((?:'.*?'|None))", inner): + key, val = item + kv_pairs.append(f"'{key}': {val}") + dict_like = "{" + ", ".join(kv_pairs) + "}" + + try: + data = ast.literal_eval(dict_like) + except Exception as e: + print("解析失败:", e) + return None + + role = data.get("role") + content = data.get("content") + return {"role": role, "content": content} + + +class LocalSqliteConnector: + """ + A connector that loads tasks from a SQLite database file. + + Args: + db_path (str): Path to the SQLite database file. + + Attributes: + _db_path (str): Path to the SQLite database file. + + Methods: + load_tasks_from_conversation (self) -> List[Task]: + Load tasks from a conversation in the SQLite database file. + """ + + def __init__(self, db_path: str) -> None: + self._db_path = db_path + assert os.path.exists( + self._db_path), f"DB file {self._db_path} does not exist" + + def load_tasks_from_conversation(self) -> List[Task]: + conn = sqlite3.connect(self._db_path) + cursor = conn.cursor() + rows = cursor.execute( + "SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() + + qa = [] + for row in rows: + js = json.loads(row[0]) + query = js['input']['kwargs']['msg'] + output = js['output'] if 'output' in js else None + if query is not None and output is not None: + query = parse_msg_line(query) + output = parse_msg_line(output) + if query is not None and output is not None: + if query['role']=='user' and output['role']=='assistant': + if query['content'] is not None and output['content'] is not None: + qa.append( + {"query": query['content'], "answer": output['content']}) + + conn.close() + + tasks: List[Task] = [] + for item in qa: + raw = (item["query"] or "") + "\n" + (item["answer"] or "") + qa_hash = hashlib.sha256(raw.encode("utf-8")).hexdigest() + task = Task( + main_query=item["query"], + task_id="no_id", + env_type="no_env", + metadata={ + "answer": item["answer"], + "qa_hash": qa_hash, + }, + ) + tasks.append(task) + + return tasks + + +__all__ = ["LocalSqliteConnector", "PhoenixConnector"] \ No newline at end of file From f21dd3a1e55defdf2c00583f6a50478ffda46053 Mon Sep 17 00:00:00 2001 From: cc Date: Thu, 20 Nov 2025 10:27:18 +0800 Subject: [PATCH 070/462] feat: switch connector of tracing reader --- astune/task_reader/tracing_reader/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 6cde3d3d..7ee5375a 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -13,7 +13,7 @@ LlmEvaluateFilter, ) from ..task_reader_base import TaskReaderBase -from .connector import PhoenixConnector +from .connector import LocalSqliteConnector, PhoenixConnector @@ -36,7 +36,7 @@ def __init__( # config patch self.config = config.astune.tracing - self._connector = PhoenixConnector(self.config.get("base_url")) + self._connector = LocalSqliteConnector(self.config.get("base_url")) filters_config = self.config.get("filters") built_filters = build_filters(filters_config) self._filters: List[Filter] = built_filters From 1a3fd607b79a0225d074a972c6dc906d6da28807 Mon Sep 17 00:00:00 2001 From: cc Date: Thu, 20 Nov 2025 12:06:32 +0800 Subject: [PATCH 071/462] feat: add LocalSqliteConnectorV2 for new tracing database format --- astune/task_reader/tracing_reader/__init__.py | 4 +- .../task_reader/tracing_reader/connector.py | 63 ++++++++++++++++++- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 7ee5375a..e84ae7e7 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -13,7 +13,7 @@ LlmEvaluateFilter, ) from ..task_reader_base import TaskReaderBase -from .connector import LocalSqliteConnector, PhoenixConnector +from .connector import LocalSqliteConnectorV1, PhoenixConnector @@ -36,7 +36,7 @@ def __init__( # config patch self.config = config.astune.tracing - self._connector = LocalSqliteConnector(self.config.get("base_url")) + self._connector = LocalSqliteConnectorV1(self.config.get("base_url")) filters_config = self.config.get("filters") built_filters = build_filters(filters_config) self._filters: List[Filter] = built_filters diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index b0ff2ba6..a0a6b57e 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -124,7 +124,7 @@ def parse_msg_line(line: str): return {"role": role, "content": content} -class LocalSqliteConnector: +class LocalSqliteConnectorV1: """ A connector that loads tasks from a SQLite database file. @@ -182,6 +182,65 @@ def load_tasks_from_conversation(self) -> List[Task]: tasks.append(task) return tasks + + +class LocalSqliteConnectorV2: + """ + A connector that loads tasks from a SQLite database file in new format. + + https://github.com/agentscope-ai/agentscope-studio/pull/40/files#diff-12c7e27505a5171e080133021430d8cae2f4929ce2f4c93bd4ea5a389094224a + + Args: + db_path (str): Path to the SQLite database file. + + Attributes: + _db_path (str): Path to the SQLite database file. + + Methods: + load_tasks_from_conversation (self) -> List[Task]: + Load tasks from a conversation in the SQLite database file. + """ + + def __init__(self, db_path: str) -> None: + self._db_path = db_path + assert os.path.exists( + self._db_path), f"DB file {self._db_path} does not exist" + + def load_tasks_from_conversation(self) -> List[Task]: + conn = sqlite3.connect(self._db_path) + cursor = conn.cursor() + rows = cursor.execute( + "SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() + + qa = [] + for row in rows: + js = json.loads(row[0]) + inp = json.loads(js["gen_ai"]["input"]["messages"]) + out = json.loads(js["gen_ai"]["output"]["messages"]) + if "parts" in inp and "parts" in out: + qa.append({ + "query": inp["parts"][0]["content"], + "answer": out["parts"][0]["content"], + }) + + conn.close() + + tasks: List[Task] = [] + for item in qa: + raw = (item["query"] or "") + "\n" + (item["answer"] or "") + qa_hash = hashlib.sha256(raw.encode("utf-8")).hexdigest() + task = Task( + main_query=item["query"], + task_id="no_id", + env_type="no_env", + metadata={ + "answer": item["answer"], + "qa_hash": qa_hash, + }, + ) + tasks.append(task) + + return tasks -__all__ = ["LocalSqliteConnector", "PhoenixConnector"] \ No newline at end of file +__all__ = ["LocalSqliteConnectorV1", "LocalSqliteConnectorV2", "PhoenixConnector"] \ No newline at end of file From b07726a52f1484e626ee04260bbd167f1606fd6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 15:06:00 +0800 Subject: [PATCH 072/462] refactor: remove unused import and update group_merge method for clarity --- astune/context_tracker/__init__.py | 1 - .../context_tracker/agentscope_tracker/multiagent_tracking.py | 3 ++- tutorial/werewolves/werewolves.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/context_tracker/__init__.py b/astune/context_tracker/__init__.py index 1b8a5dc8..e69de29b 100644 --- a/astune/context_tracker/__init__.py +++ b/astune/context_tracker/__init__.py @@ -1 +0,0 @@ -from astune.context_tracker.agentscope_tracker.agentscope_tuner import AgentScopeTuneProxy \ No newline at end of file diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 19854f17..dda9eee2 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -216,7 +216,8 @@ def generate_log(self, task_id = None, global_step="NA"): ) def group_merge(self) -> List[List[ExtendedMessage]]: - return self.grouped_steps = merge_tracker_timelines(self.grouped_steps) + self.grouped_steps = merge_tracker_timelines(self.grouped_steps) + return self.grouped_steps def group_tokenize(self): return self.group_tokenize_multi_group() diff --git a/tutorial/werewolves/werewolves.md b/tutorial/werewolves/werewolves.md index e239bda8..5726a37c 100644 --- a/tutorial/werewolves/werewolves.md +++ b/tutorial/werewolves/werewolves.md @@ -9,7 +9,7 @@ ```python class ExampleWerewolves(AgentScopeLearnProtocol): trainer: str = Field(default="astune-trinity") - async def agentscope_execute(self, init_messages, astune_proxy: AgentScopeTuneProxy, config) -> AgentScopeTuneProxy: + async def agentscope_execute(self, init_messages, astune_proxy: ModelTuner, config) -> WorkflowOutput: train_which_role = "witch" roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] From 6226ddcec9d879a001bb08de897081ea63223f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 15:14:27 +0800 Subject: [PATCH 073/462] configure alien llm model --- astune/context_tracker/basic_tracker.py | 2 +- astune/default_config/astune_default.yaml | 22 +++++++++++---------- astune/task_judge/math_answer_as_judge.py | 5 ++++- astune/task_rollout/dashscope_llm_bridge.py | 6 +++--- astune/tuner.py | 4 ++-- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index 34c4cb9d..d1c54207 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -13,7 +13,7 @@ class BasicContextTracker(TrackerAttr): """ - A linear context manager template that handles the conversation flow between LLM and environment. + A linear context tracker template that handles the conversation flow between LLM and environment. This class manages the context window, tokenization, and message history in a linear fashion. Attributes: diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index ae8aaed3..f65e95a4 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -24,6 +24,8 @@ astune: task_judge: judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 model: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -70,19 +72,19 @@ astune: do_sample: False num_repeat: 1 - context_tracker: # context manager protocol is used ONLY when `use_agentscope_protocol=False` + context_tracker: # context tracker protocol is used ONLY when `use_agentscope_protocol=False` context_tracker_type: "linear" alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - auto_context_cm: - train_sp_action: False - token_num_trigger_clip: 8000 - sliding_window_cm: - enable_llm_memory_extraction: False - linear_think_cm: - remove_think_before_submit_as_action: False - extract_box_before_submit_as_action: False - train_history_infer_token: True + # auto_context_cm: + # train_sp_action: False + # token_num_trigger_clip: 8000 + # sliding_window_cm: + # enable_llm_memory_extraction: False + # linear_think_cm: + # remove_think_before_submit_as_action: False + # extract_box_before_submit_as_action: False + # train_history_infer_token: True debug: debug_max_parallel: 16 diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index c39651f9..21db44e3 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -42,7 +42,10 @@ def compute_reward(self, judge_input_dictionary) -> tuple: task_core_arg = judge_input_dictionary['task_core_arg'] reference_answer = task_core_arg.task.metadata['answer'] - alien_llm_chat_fn = construct_alien_llm_chat_fn(self.config) + alien_llm_chat_fn = construct_alien_llm_chat_fn( + alien_llm_model = self.config.astune.task_judge.alien_llm_model, + alien_llm_response_length = self.config.astune.task_judge.alien_llm_response_length, + ) messages = [ { 'role':'system', diff --git a/astune/task_rollout/dashscope_llm_bridge.py b/astune/task_rollout/dashscope_llm_bridge.py index 38681f4e..a53e92b2 100644 --- a/astune/task_rollout/dashscope_llm_bridge.py +++ b/astune/task_rollout/dashscope_llm_bridge.py @@ -5,11 +5,11 @@ from openai import OpenAI from loguru import logger -def construct_alien_llm_chat_fn(config, *args): +def construct_alien_llm_chat_fn(alien_llm_model, alien_llm_response_length): def alien_llm_chat_fn(messages, request_id=""): max_try = 4 - alien_model_name = config.astune.context_tracker.alien_llm_model - alien_model_response_length = config.astune.context_tracker.alien_llm_response_length + alien_model_name = alien_llm_model + alien_model_response_length = alien_llm_response_length if os.environ.get("DASHSCOPE_API_KEY") is None or os.environ.get("DASHSCOPE_API_KEY_BACKUP") is None: raise RuntimeError(dedent(""" diff --git a/astune/tuner.py b/astune/tuner.py index 9c57052c..3c428d77 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -42,8 +42,8 @@ class ModelTuner(DashScopeChatModel): def __init__( self, config, - context_tracker:MultiAgentContextTracking, - agentscope_workflow: Workflow, + context_tracker: MultiAgentContextTracking, + agentscope_workflow: "Workflow", **kwargs ) -> None: self.config = config From 87e8efb9feacb1ecc243943ad92c51d16b3119e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 15:26:49 +0800 Subject: [PATCH 074/462] feat: add alien LLM model configuration and response length to default config; refactor tracing reader and remove unused LLM client --- astune/default_config/astune_default.yaml | 2 + astune/task_reader/tracing_reader/fn.py | 4 +- .../task_reader/tracing_reader/llm_client.py | 286 ------------------ astune/task_rollout/resource_keeper.py | 1 + astune/task_runner/agentscope_runner.py | 2 +- tests/test_tracing.py | 39 +++ tests/test_tracing_reader.py | 2 +- 7 files changed, 46 insertions(+), 290 deletions(-) delete mode 100644 astune/task_reader/tracing_reader/llm_client.py create mode 100644 tests/test_tracing.py diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index f65e95a4..c91e2f71 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -119,6 +119,8 @@ astune: tracing: base_url: http://phoenix:port train_output_path: /path/to/tasks.jsonl + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 filters: - type: llm_evaluate enabled: true diff --git a/astune/task_reader/tracing_reader/fn.py b/astune/task_reader/tracing_reader/fn.py index a4918cfa..ec9ca815 100644 --- a/astune/task_reader/tracing_reader/fn.py +++ b/astune/task_reader/tracing_reader/fn.py @@ -1,6 +1,6 @@ import re from typing import Any, Dict, List, Union -from .llm_client import DashScopeClient +from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn class Fn: @@ -12,7 +12,7 @@ class Fn: def __init__(self, name: str, description: str, - llm_client: DashScopeClient, + llm_client: Any, input_schema: Dict[str, str], output_schema: Dict[str, str], sampling_params: Dict[str, Any] = {}): diff --git a/astune/task_reader/tracing_reader/llm_client.py b/astune/task_reader/tracing_reader/llm_client.py deleted file mode 100644 index fa253141..00000000 --- a/astune/task_reader/tracing_reader/llm_client.py +++ /dev/null @@ -1,286 +0,0 @@ -from abc import ABC, abstractmethod -import json -import os -import time -from typing import Any, Optional, Protocol, Iterator, Generator, cast - -from loguru import logger -import requests - -class LlmException(Exception): - def __init__(self,typ: str): - self._type=typ - - @property - def typ(self): - return self._type - - -class DashScopeClient: - """Aliyun DashScope API Client""" - - def __init__(self, api_key: Optional[str] = None, model_name: str = "qwen-plus", - temperature: float = 0.7, max_tokens: int = 2048): - self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY") - if not self.api_key: - raise ValueError("API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly.") - - self.model_name = model_name - self.temperature = temperature - self.max_tokens = max_tokens - self.base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1" - - self.headers = { - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json" - } - - def set_model(self, model_name: str): - """ - Sets the model name for the DashScopeClient instance. - - Args: - model_name (str): The name of the model to be used for API interactions. - """ - self.model_name = model_name # ⭐ Assigns the provided model name to the instance variable - - def chat(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> str: - """ - Sends a chat request to the LLM, aggregates the streaming responses, and returns the complete response. - - Args: - messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. - sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the LLM. - - Returns: - str: The complete response from the LLM as a single string. - """ - res = "" - for x in self.chat_stream(messages, sampling_params): # ⭐ Aggregates the streaming responses into a single string - res += x - return res - - def chat_stream(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> Generator[str, None, None]: - """ - Initiates a streaming chat session and returns a generator that yields the response as it is being generated. - - Args: - messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. - sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the model. - - Returns: - Generator[str, None, None]: A generator that yields the response text as it is being generated. - """ - return self.chat_stream_with_retry(messages, **sampling_params) # ⭐ Calls the retry mechanism for streaming chat - - def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, **kwargs) -> str | Generator[str, None, None]: - """ - Sends a request to the chat completion API, supporting both non-streaming and streaming modes, and handles various exceptions. - - Args: - messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. - stream (bool, optional): If True, the response will be streamed. Defaults to False. - **kwargs: Additional parameters to be passed to the API. - - Returns: - str | Generator[str, None, None]: The full response text if not streaming, or a generator yielding the response text if streaming. - """ - url = f"{self.base_url}/chat/completions" - - # Merge parameters - params = { - "model": self.model_name, - "messages": messages, - "temperature": self.temperature, - "max_tokens": self.max_tokens, - "stream": stream, - **kwargs - } - - try: - if stream: - return self._handle_stream_response(url, params) # ⭐ Handles the streaming response - else: - return self._handle_normal_response(url, params) # ⭐ Handles the non-streaming response - - except requests.exceptions.RequestException as e: - logger.error(f"API request failed: {e}") - return "" if not stream else (x for x in []) - except json.JSONDecodeError as e: - logger.error(f"Failed to parse API response: {e}") - return "" if not stream else (x for x in []) - except Exception as e: - logger.error(f"Unexpected error in API call: {e}") - return "" if not stream else (x for x in []) - - def _handle_normal_response(self, url: str, params: dict) -> str: - """ - Handles the non-streaming (normal) response from the API. - - Args: - url (str): The URL to which the POST request is sent. - params (dict): The parameters to be included in the JSON body of the POST request. - - Returns: - str: The content of the first choice's message in the response, or an empty string if the response format is unexpected. - """ - response = requests.post(url, headers=self.headers, json=params, timeout=600) # ⭐ Sends the POST request to the API - if not response.ok: - # check inappropriate content - try: - error_json=response.json()['error'] - if "inappropriate content" in error_json['message']: - raise LlmException("inappropriate content") - if "limit" in error_json['message']: - raise LlmException("hit limit") - except LlmException as e: - raise - except: - logger.error(f"API request failed: {response.text}") - response.raise_for_status() - - result = response.json() - if "choices" in result and len(result["choices"]) > 0: - return result["choices"][0]["message"]["content"].strip() # ⭐ Extracts and returns the content of the first choice's message - else: - logger.error(f"Unexpected response format: {result}") - return "" - - def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None, None]: - """ - Handles the streaming response from a POST request to the specified URL. - - Args: - url (str): The URL to which the POST request is sent. - params (dict): The parameters to be sent with the POST request. - - Yields: - str: The content of the response, if it meets the specified conditions. - """ - response = requests.post(url, headers=self.headers, json=params, stream=True, timeout=600) # ⭐ Send the POST request and get the streaming response - if not response.ok: - # check inappropriate content - try: - error_json=response.json()['error'] - if "inappropriate content" in error_json['message']: - raise LlmException("inappropriate content") - if "limit" in error_json['message']: - raise LlmException("hit limit") - except LlmException as e: - raise - except: - logger.error(f"API request failed: {response.text}") - response.raise_for_status() - - for line in response.iter_lines(): - if line: - line = line.decode('utf-8') - if line.startswith('data: '): - data = line[6:] # remove the prefix 'data: ' - if data == '[DONE]': - break - - try: - chunk = json.loads(data) - if "choices" in chunk and len(chunk["choices"]) > 0: - choice = chunk["choices"][0] - if "delta" in choice and "content" in choice["delta"]: - content = choice["delta"]["content"] - if content: - yield content # ⭐ Yield the content if it meets the conditions - except json.JSONDecodeError: - continue # skip the bad line - - def chat_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, - retry_delay: float = 1.0, **kwargs) -> str: - """ - Sends a chat completion request to the LLM with a retry mechanism. - - Args: - messages (list[dict[str, str]]): A list of message dictionaries for the chat. - max_retries (int, optional): Maximum number of retries. Defaults to 3. - retry_delay (float, optional): Initial delay between retries in seconds. Defaults to 1.0. - **kwargs: Additional keyword arguments to be passed to the `chat_completion` method. - - Returns: - str: The response from the LLM or a predefined message if all attempts fail. - """ - for attempt in range(max_retries): - try: - result = cast(str,self.chat_completion(messages, stream=False, **kwargs)) # ⭐ Attempt to get a chat completion - if result: # If a valid response is obtained - return result - - except LlmException as e: - if e.typ=='inappropriate content': - logger.warning(f"llm return inappropriate content, which is blocked by the remote") - return "[inappropriate content]" - except Exception as e: - logger.warning(f"Attempt {attempt + 1} failed: {e}") - - if attempt < max_retries - 1: # Not the last attempt - time.sleep(retry_delay * (2 ** attempt)) # Exponential backoff - - logger.error(f"All {max_retries} attempts failed") - return "" - - def chat_stream_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, - retry_delay: float = 10.0, **kwargs) -> Generator[str, None, None]: - """ - Attempts to establish a streaming chat completion with a retry mechanism. - - Args: - messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. - max_retries (int, optional): The maximum number of retry attempts. Defaults to 3. - retry_delay (float, optional): The initial delay in seconds before the first retry. Defaults to 10.0. - **kwargs: Additional keyword arguments to pass to the chat_completion method. - - Yields: - str: Chunks of the streaming response. - """ - for attempt in range(max_retries): - try: - stream_generator = cast(Generator[str, None, None], self.chat_completion(messages, stream=True, **kwargs)) # ⭐ Cast the generator to the appropriate type - # try to fetch the first chunk to verify the connection - first_chunk = next(stream_generator, None) - if first_chunk is not None: - yield first_chunk - # yield the rest chunks - for chunk in stream_generator: - yield chunk - return # success - except LlmException as e: - if e.typ=='inappropriate content': - logger.warning(f"llm return inappropriate content, which is blocked by the remote") - yield "[inappropriate content]" - return - except Exception as e: - logger.warning(f"Stream attempt {attempt + 1} failed: {e}") - - if attempt < max_retries - 1: - time.sleep(retry_delay * (2 ** attempt)) - - logger.error(f"All {max_retries} stream attempts failed") - - return - - -# demo -if __name__ == "__main__": - client = DashScopeClient(model_name='qwq-32b') - - messages = [ - {"role": "user", "content": "Write a poem about Spring."} - ] - - # print("=== request ===") - # response = client.chat_completion(messages) - # print(response) - - print("\n=== streaming ===") - for chunk in client.chat_completion(messages, stream=True): - print(chunk, end='', flush=True) - - print("\n\n=== streaming with retry ===") - for chunk in client.chat_stream(messages, {}): - print(chunk, end='', flush=True) \ No newline at end of file diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py index 5698cefe..f6c735bf 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astune/task_rollout/resource_keeper.py @@ -28,6 +28,7 @@ def __enter__(self): self.env_type: str = env_type else: self.env = None + return self def __exit__(self, exc_type, exc_value, traceback): try: diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index bdd6b179..c150d564 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -11,7 +11,7 @@ from astune.schema.trajectory import Reward, Trajectory from astune.schema.trajectory import Sample, Reward from astune.schema.task import Task, WorkflowTask -from astnue.task_judge.judge_base import JudgeBase +from astune.task_judge.judge_base import JudgeBase from astune.utils.dynamic_import import dynamic_import from typing import Any, Dict, List, Union, Tuple diff --git a/tests/test_tracing.py b/tests/test_tracing.py new file mode 100644 index 00000000..75178b42 --- /dev/null +++ b/tests/test_tracing.py @@ -0,0 +1,39 @@ +import json +from pathlib import Path +from typing import List + +import pytest + +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task + +@pytest.fixture +def config(tmp_path: Path) -> dict: + return { + "base_url": "http://example.com", + "train_output_path": str(tmp_path / "tasks.jsonl"), + } + + +reader = TracingReader(config) # type: ignore +reader._connector = connector # type: ignore[attr-defined] +reader._filters = [flt] # type: ignore[attr-defined] + +result = reader.get_training_tasks() + +# connector should be called once +assert connector.called == 1 + +# filter should receive all new tasks +assert flt.last_input == tasks + +# returned tasks should be exactly the filtered ones +assert result == tasks + +# file should be created with one json per line +out_path = Path(config["train_output_path"]) +assert out_path.exists() +with out_path.open("r", encoding="utf-8") as f: + lines = [json.loads(line) for line in f if line.strip()] +assert len(lines) == 2 +assert {obj["metadata"]["qa_hash"] for obj in lines} == {"h1", "h2"} \ No newline at end of file diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index 879adb8a..cdd2b000 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -43,7 +43,7 @@ def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: @pytest.fixture def config(tmp_path: Path) -> dict: return { - "base_url": "http://example.com", + "base_url": ".trash/database.sqlite", "train_output_path": str(tmp_path / "tasks.jsonl"), } From 252a3c59d3ce28a809e95e6d3cb2096aefbf1462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 16:04:43 +0800 Subject: [PATCH 075/462] pass tracing reader test --- astune/default_config/astune_default.yaml | 4 +- astune/task_reader/tracing_reader/__init__.py | 1 + .../filters/llm_evaluate_filter.py | 21 +++-- astune/task_reader/tracing_reader/fn.py | 9 +- astune/task_rollout/dashscope_llm_bridge.py | 5 +- astune/tuner.py | 3 +- tests/test_tracing.py | 6 +- tests/test_tracing_reader.py | 91 +++---------------- tests/test_utils/read_config_from_yaml.py | 8 ++ 9 files changed, 46 insertions(+), 102 deletions(-) create mode 100644 tests/test_utils/read_config_from_yaml.py diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index c91e2f71..b4ab7595 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -117,8 +117,8 @@ astune: # the tracing config tracing: - base_url: http://phoenix:port - train_output_path: /path/to/tasks.jsonl + base_url: ./.trash/database.sqlite + train_output_path: ./.trash/tasks.jsonl alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 filters: diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index e84ae7e7..d08cf229 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -34,6 +34,7 @@ def __init__( ) -> None: super().__init__(config) # config patch + print('*********', config, '**********') self.config = config.astune.tracing self._connector = LocalSqliteConnectorV1(self.config.get("base_url")) diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 02f05f07..1f458cff 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -1,9 +1,9 @@ from typing import Iterable, List from astune.schema.task import Task +from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn from ..fn import Fn -from ..llm_client import DashScopeClient from .base import Filter @@ -12,18 +12,18 @@ --- ## 1. Evaluation Goal -Determine whether the given “query-answer” pair is **high-quality data (GOOD)** and provide a score and justification. +Determine whether the given “query-answer” pair is **high-quality data (GOOD)** and provide a score and justification. If it does not meet the criteria, label it as **BAD**. --- ## 2. BAD Criteria (if any are met → BAD) -1. **Missing elements**: The query is empty, the answer is empty, or both are empty. -2. **Non-answer**: The answer contains only acknowledgments such as “Received / OK / Please provide more information,” without substantive content or actionable results. -3. **Irrelevant**: The answer is clearly unrelated to the query. -4. **Process excuses**: The answer mainly describes process issues (“cannot search / rate-limited / captcha / try another device”), **without** providing alternative information, summaries, or next steps. -5. **Self-contradiction or illogical**: The answer contradicts itself or contains major logical inconsistencies. -6. **Safety or compliance violations**: Includes illegal content, hate speech, personal privacy leaks, or other clearly inappropriate material. +1. **Missing elements**: The query is empty, the answer is empty, or both are empty. +2. **Non-answer**: The answer contains only acknowledgments such as “Received / OK / Please provide more information,” without substantive content or actionable results. +3. **Irrelevant**: The answer is clearly unrelated to the query. +4. **Process excuses**: The answer mainly describes process issues (“cannot search / rate-limited / captcha / try another device”), **without** providing alternative information, summaries, or next steps. +5. **Self-contradiction or illogical**: The answer contradicts itself or contains major logical inconsistencies. +6. **Safety or compliance violations**: Includes illegal content, hate speech, personal privacy leaks, or other clearly inappropriate material. 7. **Severe language mismatch**: The answer is in a completely different language from the query in a way that breaks comprehension (e.g., Chinese query but irrelevant and incoherent French reply). --- @@ -50,11 +50,12 @@ def __init__( """ self._print_reason = print_reason - self._llm = DashScopeClient() + self.alien_llm_chat_fn = construct_alien_llm_chat_fn(alien_llm_model="qwen3-235b-a22b-instruct-2507", + alien_llm_response_length=512) self._fn = Fn( name="evaluate_quality", description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), - llm_client=self._llm, + alien_llm_chat_fn=self.alien_llm_chat_fn, input_schema={ "query": "user query/task", "answer": "assistant answer", diff --git a/astune/task_reader/tracing_reader/fn.py b/astune/task_reader/tracing_reader/fn.py index ec9ca815..d9907aac 100644 --- a/astune/task_reader/tracing_reader/fn.py +++ b/astune/task_reader/tracing_reader/fn.py @@ -1,6 +1,5 @@ import re from typing import Any, Dict, List, Union -from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn class Fn: @@ -12,7 +11,7 @@ class Fn: def __init__(self, name: str, description: str, - llm_client: Any, + alien_llm_chat_fn: Any, input_schema: Dict[str, str], output_schema: Dict[str, str], sampling_params: Dict[str, Any] = {}): @@ -29,7 +28,7 @@ def __init__(self, """ self.name = name self.description = description - self.llm_client = llm_client + self.alien_llm_chat_fn = alien_llm_chat_fn self.input_schema = input_schema self.output_schema = output_schema self.sampling_params = sampling_params or {} @@ -186,7 +185,7 @@ def __call__(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> U ] # Call LLM - response = self.llm_client.chat(messages, self.sampling_params) + response = self.alien_llm_chat_fn(messages, self.sampling_params) # Parse and return result - return self._parse_markdown_kv(response) \ No newline at end of file + return self._parse_markdown_kv(response["content"]) \ No newline at end of file diff --git a/astune/task_rollout/dashscope_llm_bridge.py b/astune/task_rollout/dashscope_llm_bridge.py index a53e92b2..5d24035b 100644 --- a/astune/task_rollout/dashscope_llm_bridge.py +++ b/astune/task_rollout/dashscope_llm_bridge.py @@ -6,7 +6,7 @@ from loguru import logger def construct_alien_llm_chat_fn(alien_llm_model, alien_llm_response_length): - def alien_llm_chat_fn(messages, request_id=""): + def alien_llm_chat_fn(messages, sampling_params_override={}, request_id=""): max_try = 4 alien_model_name = alien_llm_model alien_model_response_length = alien_llm_response_length @@ -47,8 +47,9 @@ def alien_llm_chat_fn(messages, request_id=""): sampling_params = dict( n=1, max_completion_tokens=alien_model_response_length, + temperature=0.0, ) - sampling_params["temperature"] = 0 + sampling_params.update(sampling_params_override) completion = client.chat.completions.create( model=alien_model_name, messages=messages, diff --git a/astune/tuner.py b/astune/tuner.py index 3c428d77..e73762f6 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -1,6 +1,5 @@ -from litellm import Type from loguru import logger -from typing import Literal, Any, TYPE_CHECKING +from typing import Literal, Any, TYPE_CHECKING, Type from pydantic import BaseModel, Field from astune.utils.dynamic_import import dynamic_import from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope diff --git a/tests/test_tracing.py b/tests/test_tracing.py index 75178b42..a102559e 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -10,8 +10,10 @@ @pytest.fixture def config(tmp_path: Path) -> dict: return { - "base_url": "http://example.com", - "train_output_path": str(tmp_path / "tasks.jsonl"), + "astune":{ + "base_url": ".trash/database.sqlite", + "train_output_path": str(tmp_path / "tasks.jsonl"), + } } diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index cdd2b000..1eb586d1 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -1,9 +1,6 @@ -import json +import pytest from pathlib import Path from typing import List - -import pytest - from astune.task_reader.tracing_reader import TracingReader from astune.schema.task import Task @@ -42,84 +39,20 @@ def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: @pytest.fixture def config(tmp_path: Path) -> dict: - return { - "base_url": ".trash/database.sqlite", - "train_output_path": str(tmp_path / "tasks.jsonl"), - } - - -def test_get_training_tasks_new_file(config: dict): - # prepare tasks returned from connector - t1 = _make_task("q1", "a1", "h1") - t2 = _make_task("q2", "a2", "h2") - tasks = [t1, t2] - - connector = DummyConnector(tasks) - flt = DummyFilter(kept=tasks) - - reader = TracingReader(config) # type: ignore - reader._connector = connector # type: ignore[attr-defined] - reader._filters = [flt] # type: ignore[attr-defined] - - result = reader.get_training_tasks() + from astune.utils.config_utils import read_astune_config + return read_astune_config('launcher/math_agent/git-math-agentscope.yaml') # type: ignore - # connector should be called once - assert connector.called == 1 - # filter should receive all new tasks - assert flt.last_input == tasks - # returned tasks should be exactly the filtered ones - assert result == tasks - - # file should be created with one json per line - out_path = Path(config["train_output_path"]) - assert out_path.exists() - with out_path.open("r", encoding="utf-8") as f: - lines = [json.loads(line) for line in f if line.strip()] - assert len(lines) == 2 - assert {obj["metadata"]["qa_hash"] for obj in lines} == {"h1", "h2"} - - -def test_get_training_tasks_dedup_and_missing_hash_ignored(config: dict): - out_path = Path(config["train_output_path"]) - - # existing task with hash h1 - existing = _make_task("q_exist", "a_exist", "h1") - out_path.parent.mkdir(parents=True, exist_ok=True) - with out_path.open("w", encoding="utf-8") as f: - f.write(json.dumps(existing.model_dump(), ensure_ascii=False) + "\n") - - # connector returns: duplicate (h1), new (h2), and one without qa_hash - dup = _make_task("q_dup", "a_dup", "h1") - new = _make_task("q_new", "a_new", "h2") - no_hash = _make_task("q_nohash", "a_nohash", None) - connector_tasks = [dup, new, no_hash] - - # filter will keep everything it receives so we can test input to filter - flt = DummyFilter(kept=[new]) - connector = DummyConnector(connector_tasks) - - reader = TracingReader(config) # type: ignore - reader._connector = connector # type: ignore[attr-defined] - reader._filters = [flt] # type: ignore[attr-defined] - - result = reader.get_training_tasks() - - # existing task plus new filtered task should be returned - assert len(result) == 2 - assert existing in result - assert new in result +def test_get_training_tasks_new_file(config: dict): + from types import SimpleNamespace + from astune.task_reader.tracing_reader import TracingReader, Config + from astune.schema.task import Task + from dotenv import load_dotenv; load_dotenv() - # filter should see only new tasks with non-duplicate hashes => [new] - assert flt.last_input == [new] + # t=SimpleNamespace() + # t.astune=SimpleNamespace() - # output file should now contain existing + new filtered - with out_path.open("r", encoding="utf-8") as f: - objs = [json.loads(line) for line in f if line.strip()] + tr=TracingReader(config) + print(tr.get_training_tasks()) - hashes = [obj["metadata"].get("qa_hash") for obj in objs] - assert "h1" in hashes - assert "h2" in hashes - # no record without hash should be written - assert None not in hashes diff --git a/tests/test_utils/read_config_from_yaml.py b/tests/test_utils/read_config_from_yaml.py new file mode 100644 index 00000000..e3b6fd9d --- /dev/null +++ b/tests/test_utils/read_config_from_yaml.py @@ -0,0 +1,8 @@ + + + +def read_yaml_config(file_path: str) -> dict: + import yaml + with open(file_path, 'r') as file: + config = yaml.safe_load(file) + return config \ No newline at end of file From f7522416db1bcf664e6a3c9d6f4abc83894b785e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 16:09:01 +0800 Subject: [PATCH 076/462] refactor: remove unused model_name assignment and update workflow class instantiation --- .../context_tracker/agentscope_tracker/multiagent_tracking.py | 1 - astune/task_runner/agentscope_runner.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index dda9eee2..873f4ebc 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -32,7 +32,6 @@ def __init__( self.should_interrupt_fn = should_interrupt_fn self.generated_token_callback_fn = generated_token_callback_fn self.context_overflow = False - self.model_name = kwargs['model_name'] self.output_kwargs = {} self.input_kwargs = {} diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index c150d564..6542d929 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -69,8 +69,8 @@ def execute(self, env: EnvClient, task_core_arg: WorkflowTask) -> BasicContextTr task_id = task_core_arg.task_id workflow_import = self.config.astune.rollout.agentscope_learn_protocol - workflow_cls = dynamic_import(workflow_import)() - agentscope_workflow: Workflow = workflow_cls(trainer='astune-trinity', AgentRunner_name='appworld') + workflow_cls = dynamic_import(workflow_import) + agentscope_workflow: Workflow = workflow_cls(name='astune-trinity') context_tracker = MultiAgentContextTracking( llm_chat_fn=self.llm_chat_fn, From 8b735085d439ca49f4f0fd63809fcecfdf3d9442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 17:04:24 +0800 Subject: [PATCH 077/462] refactor: update task_core_arg to workflow_task across multiple files for consistency --- astune/default_config/astune_default.yaml | 5 +- astune/task_judge/env_service_as_judge.py | 4 +- astune/task_judge/judge_base.py | 7 +- astune/task_judge/math_answer_as_judge.py | 20 ++-- astune/task_rollout/resource_keeper.py | 16 ++-- astune/task_rollout/single_worker.py | 6 +- astune/task_runner/agentscope_runner.py | 24 ++--- astune/task_runner/classic_runner.py | 12 +-- astune/tuner.py | 11 ++- tests/test_tracing_reader.py | 110 +++++++++++++++++++--- tutorial/math_agent.md | 2 +- tutorial/werewolves/werewolves.md | 4 +- 12 files changed, 155 insertions(+), 66 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index b4ab7595..50c8653f 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -120,14 +120,13 @@ astune: base_url: ./.trash/database.sqlite train_output_path: ./.trash/tasks.jsonl alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 + alien_llm_response_length: 2048 filters: - type: llm_evaluate enabled: true params: - custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" + custom_rubrics: If the answer claims that it has written the output to a file, consider it an invalid response. temperature: 0.5 - max_tokens: 2048 print_reason: false diff --git a/astune/task_judge/env_service_as_judge.py b/astune/task_judge/env_service_as_judge.py index 770dd2e2..ebfea127 100644 --- a/astune/task_judge/env_service_as_judge.py +++ b/astune/task_judge/env_service_as_judge.py @@ -10,9 +10,9 @@ def compute_reward(self, judge_input_dictionary) -> tuple: raw_reward = 0 env = judge_input_dictionary['env'] - task_core_arg = judge_input_dictionary['task_core_arg'] + workflow_task = judge_input_dictionary['workflow_task'] - raw_reward = env.evaluate(task_core_arg.task_env_uuid, params={"sparse": False}) + raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) if raw_reward >= 1: is_success = True else: diff --git a/astune/task_judge/judge_base.py b/astune/task_judge/judge_base.py index 5d18d9db..8215fb6d 100644 --- a/astune/task_judge/judge_base.py +++ b/astune/task_judge/judge_base.py @@ -1,11 +1,10 @@ +from astune.workflow import WorkflowOutput, WorkflowTask + class JudgeBase(): def __init__(self, config): self.config = config - def compute_reward(self, judge_input_dictionary) -> tuple: - # judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) - # judge_input_dictionary['task_core_arg']: 任务信息(如果里面包含了参考答案,可以从中取出) - # judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) + def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: raise NotImplementedError \ No newline at end of file diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index 21db44e3..02eb22e7 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -1,4 +1,5 @@ import re +from astune.workflow import WorkflowOutput, WorkflowTask from astune.task_judge.judge_base import JudgeBase from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn @@ -7,15 +8,11 @@ class MathAnswerAsJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, judge_input_dictionary) -> tuple: - # judge_input_dictionary['env']: External env_service context (if env_service is used) - # judge_input_dictionary['task_core_arg']: Task information (extract reference answer here if provided) - # judge_input_dictionary['grouped_steps']: Each historical LLM dialogue turn (extract if intermediate reasoning matters) + def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: raw_reward = 0 - final_answer = judge_input_dictionary['final_answer'] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow - task_core_arg = judge_input_dictionary['task_core_arg'] - reference_answer = task_core_arg.task.metadata['answer'] + final_answer = workflow_output.metadata['final_answer'] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + reference_answer = workflow_task.task.metadata['answer'] reference_answer = reference_answer.split('####')[-1].strip() pattern = r'\\boxed\{([^}]*)\}' @@ -35,12 +32,11 @@ class MathAnswerAndLlmAsJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, judge_input_dictionary) -> tuple: + def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: raw_reward = 0 - - final_answer = judge_input_dictionary['final_answer'] - task_core_arg = judge_input_dictionary['task_core_arg'] - reference_answer = task_core_arg.task.metadata['answer'] + final_answer = workflow_output.metadata['final_answer'] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + reference_answer = workflow_task.task.metadata['answer'] + reference_answer = reference_answer.split('####')[-1].strip() alien_llm_chat_fn = construct_alien_llm_chat_fn( alien_llm_model = self.config.astune.task_judge.alien_llm_model, diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py index f6c735bf..954db9a2 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astune/task_rollout/resource_keeper.py @@ -9,17 +9,17 @@ class ResourceKeeper(object): - def __init__(self, task_core_arg, config: DictConfig): - self.task_core_arg = task_core_arg + def __init__(self, workflow_task, config: DictConfig): + self.workflow_task = workflow_task self.config = config def __enter__(self): self.config = self.config - self.task_core_arg = self.task_core_arg - self.task_id: str = self.task_core_arg.task_id - self.tokenizer = self.task_core_arg.tokenizer - self.llm_chat_fn = self.task_core_arg.llm_chat_fn - self.obs_window = self.task_core_arg.obs_window + self.workflow_task = self.workflow_task + self.task_id: str = self.workflow_task.task_id + self.tokenizer = self.workflow_task.tokenizer + self.llm_chat_fn = self.workflow_task.llm_chat_fn + self.obs_window = self.workflow_task.obs_window if self.config.astune.task_reader.type == 'env_service': url = self.config.astune.task_reader.env_service.env_url env_type = self.config.astune.task_reader.env_service.env_type @@ -32,7 +32,7 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): try: - if self.env: self.env.release_instance(self.task_core_arg.task_env_uuid) + if self.env: self.env.release_instance(self.workflow_task.task_env_uuid) except Exception as e: logger.bind(exception=True).exception(f"encounter exception in env_worker.release_instance~ error={e.args}") raise e diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index 4dededf0..26541a92 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -88,7 +88,7 @@ def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, m sampling_params = get_sample_params(mode, self.config) llm_chat_fn = self.async_llm_bridge.get_llm_chat_fn(sampling_params=sampling_params) - task_core_arg=WorkflowTask( + workflow_task=WorkflowTask( env_type=task.env_type, task_id=task.task_id, task_thread_index=task_thread_index, @@ -101,13 +101,13 @@ def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, m task=task ) - with ResourceKeeper(task_core_arg, config=self.config) as resource_keeper: + with ResourceKeeper(workflow_task, config=self.config) as resource_keeper: try: Runner = AgentScopeRunner if self.config.astune.rollout.use_agentscope_protocol else AgentRunner agent_runner: BaseAgentRunner = Runner(llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, config=self.config) cmt = agent_runner.execute( env=resource_keeper.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] - task_core_arg=task_core_arg + workflow_task=workflow_task ) except Exception as e: logger.bind(exception=True).exception(f"encounter exception in env_worker.agent_flow error={e.args}") diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index 6542d929..a4491fed 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -18,12 +18,12 @@ class RunnerWithCallback(BaseAgentRunner): - def agentscope_runner_hooks(self, obs_window, task_thread_index, task_core_arg, env): + def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task, env): def env_step_fn(action: dict) -> Tuple[str, float, bool, dict]: obs_window['step'][task_thread_index] += 1 env_output = env.step( - instance_id=task_core_arg.task_env_uuid, + instance_id=workflow_task.task_env_uuid, action=action, ) obs = "" @@ -61,12 +61,12 @@ def get_judge(self) -> JudgeBase: class AgentScopeRunner(RunnerWithCallback): - def execute(self, env: EnvClient, task_core_arg: WorkflowTask) -> BasicContextTracker: - obs_window = task_core_arg.obs_window - task_thread_index = task_core_arg.task_thread_index - task_batch_index = task_core_arg.task_batch_index - task_tag = task_core_arg.task_tag - task_id = task_core_arg.task_id + def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTracker: + obs_window = workflow_task.obs_window + task_thread_index = workflow_task.task_thread_index + task_batch_index = workflow_task.task_batch_index + task_tag = workflow_task.task_tag + task_id = workflow_task.task_id workflow_import = self.config.astune.rollout.agentscope_learn_protocol workflow_cls = dynamic_import(workflow_import) @@ -82,11 +82,11 @@ def execute(self, env: EnvClient, task_core_arg: WorkflowTask) -> BasicContextTr **self.agentscope_runner_hooks( obs_window=obs_window, task_thread_index=task_thread_index, - task_core_arg=task_core_arg, + workflow_task=workflow_task, env=env ) ) - astune_proxy = ModelTuner( + m_tuner = ModelTuner( context_tracker=context_tracker, llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, @@ -94,11 +94,11 @@ def execute(self, env: EnvClient, task_core_arg: WorkflowTask) -> BasicContextTr config=self.config, ) - workflow_output: WorkflowOutput = asyncio.run(agentscope_workflow.agentscope_execute(task_core_arg, astune_proxy)) + workflow_output: WorkflowOutput = asyncio.run(agentscope_workflow.agentscope_execute(workflow_task, m_tuner)) if workflow_output.reward is not None: raw_reward, is_success = workflow_output.reward, workflow_output.is_success else: - raw_reward, is_success = self.get_judge().compute_reward(workflow_output.metadata) + raw_reward, is_success = self.get_judge().compute_reward(workflow_task, workflow_output) assert not isinstance(raw_reward, list), "ASTune will support step reward in future versions." diff --git a/astune/task_runner/classic_runner.py b/astune/task_runner/classic_runner.py index 638584ed..1c65cf44 100644 --- a/astune/task_runner/classic_runner.py +++ b/astune/task_runner/classic_runner.py @@ -21,10 +21,10 @@ def __init__(self, **kwargs): self.step_reward = [] - def execute(self, env: EnvClient, task_core_arg) -> BasicContextTracker: - obs_window = task_core_arg.obs_window - task_thread_index = task_core_arg.task_thread_index - init_messages = task_core_arg.init_messages + def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: + obs_window = workflow_task.obs_window + task_thread_index = workflow_task.task_thread_index + init_messages = workflow_task.init_messages # 1. 🚀 Initialize messages if self.config.astune.context_tracker.context_tracker_type == "linear": @@ -78,7 +78,7 @@ def execute(self, env: EnvClient, task_core_arg) -> BasicContextTracker: # 7. 🌍 world interaction try: env_output = env.step( - instance_id=task_core_arg.task_env_uuid, + instance_id=workflow_task.task_env_uuid, action={"content": self.cmt.prepare_world_interaction(), "role": "assistant"}, params={"step_skip_action": self.config.astune.rollout.step_skip_action} ) @@ -117,7 +117,7 @@ def execute(self, env: EnvClient, task_core_arg) -> BasicContextTracker: self.cmt.ensure_terminate_rollout_stage() obs_window['step'][task_thread_index] = -1 raw_reward = 0 - raw_reward = env.evaluate(task_core_arg.task_env_uuid, params={"sparse": False}) + raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) if raw_reward >= 1: success_rate = 1.0 else: diff --git a/astune/tuner.py b/astune/tuner.py index e73762f6..087259d9 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -21,6 +21,12 @@ def __init__(self, name: str, tuner:"ModelTuner", default_model: ChatModelBase): self.name = name self.tuner = tuner self.default_model = default_model + super().__init__( + model_name='astune', + api_key='dummy-api-key', + stream=False, + ) + def __call__(self, *args, **kwargs): if self.tuner.is_trainable(self.name): @@ -49,10 +55,11 @@ def __init__( self.context_tracker = context_tracker self.agentscope_workflow = agentscope_workflow self.target2proxy_registry: dict[str, Agent2Proxy] = {} - self.llm_proxy = LlmProxyForAgentScope(context_tracker=context_tracker, **kwargs) + self.llm_proxy = LlmProxyForAgentScope(context_tracker=context_tracker, config=config, **kwargs) super().__init__( model_name='astune', - api_key='dummy-api-key' + api_key='dummy-api-key', + stream=False, ) diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index 1eb586d1..b3d357e1 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -37,22 +37,110 @@ def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: ) +# @pytest.fixture +# def config(tmp_path: Path) -> dict: +# from astune.utils.config_utils import read_astune_config +# return read_astune_config('launcher/math_agent/git-math-agentscope.yaml') # type: ignore + + + +# def test_get_training_tasks_new_file(config: dict): +# from types import SimpleNamespace +# from astune.task_reader.tracing_reader import TracingReader, Config +# from astune.schema.task import Task +# from dotenv import load_dotenv; load_dotenv() + +# # t=SimpleNamespace() +# # t.astune=SimpleNamespace() + +# tr=TracingReader(config) +# print(tr.get_training_tasks()) + + + + +# prepare tests/database.sqlite from agentscope first + +import json +from pathlib import Path +from types import SimpleNamespace +from typing import List + +import pytest + +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task + + + @pytest.fixture -def config(tmp_path: Path) -> dict: - from astune.utils.config_utils import read_astune_config - return read_astune_config('launcher/math_agent/git-math-agentscope.yaml') # type: ignore +def config(tmp_path: Path) -> SimpleNamespace: + a = SimpleNamespace() + a.astune = SimpleNamespace() + a.astune.tracing = { + "base_url": "./.trash/database.sqlite", + "train_output_path": str(tmp_path / "tasks.jsonl"), + "filters": [] + } + return a +@pytest.fixture +def config_with_filter(tmp_path: Path) -> SimpleNamespace: + a = SimpleNamespace() + a.astune = SimpleNamespace() + a.astune.tracing = { + "base_url": "./.trash/database.sqlite", + "train_output_path": str(tmp_path / "tasks.jsonl"), + "filters": [ + { + "type": "llm_evaluate", + "enabled": True, + "params": { + "custom_rubrics": "If the answer claims that it has written the output to a file, consider it an invalid response.", + "temperature": 0.5, + "max_tokens": 2048, + "print_reason": False + } + } + ] + } + return a + + +def test_get_training_tasks_new_file(config: SimpleNamespace): + from dotenv import load_dotenv; load_dotenv() + # prepare tasks returned from connector + reader = TracingReader(config, train_ratio=0.7) # type: ignore + + result = reader.get_training_tasks() + # the number of tasks in tests/database.sqlite + assert len(result) == int(7*0.7) + + # file should be created with one json per line + out_path = Path(config.astune.tracing['train_output_path']) + assert out_path.exists() + with out_path.open("r", encoding="utf-8") as f: + lines = [json.loads(line) for line in f if line.strip()] + assert len(lines) == 7 # the number of tasks in tests/database.sqlite -def test_get_training_tasks_new_file(config: dict): - from types import SimpleNamespace - from astune.task_reader.tracing_reader import TracingReader, Config - from astune.schema.task import Task + +def test_get_training_tasks_with_filter(config_with_filter: SimpleNamespace, config: SimpleNamespace): from dotenv import load_dotenv; load_dotenv() + reader = TracingReader(config_with_filter) # type: ignore + + result = reader.get_training_tasks() + assert len(result) < int(7*0.7) + + reader_full = TracingReader(config) + result_full = reader_full.get_training_tasks() - # t=SimpleNamespace() - # t.astune=SimpleNamespace() + # find the diff + delta = [] + for task in result_full: + if task not in result: + delta.append(task) - tr=TracingReader(config) - print(tr.get_training_tasks()) + assert len(delta) > 1 + print("these tasks are filtered:", delta) diff --git a/tutorial/math_agent.md b/tutorial/math_agent.md index 92dc5904..f2f3528b 100644 --- a/tutorial/math_agent.md +++ b/tutorial/math_agent.md @@ -69,7 +69,7 @@ Judge的输入参数包含: ```python judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) -judge_input_dictionary['task_core_arg']: 任务信息(如果里面包含了参考答案,可以从中取出) +judge_input_dictionary['workflow_task']: 任务信息(如果里面包含了参考答案,可以从中取出) judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 ``` diff --git a/tutorial/werewolves/werewolves.md b/tutorial/werewolves/werewolves.md index 5726a37c..f5c1ad40 100644 --- a/tutorial/werewolves/werewolves.md +++ b/tutorial/werewolves/werewolves.md @@ -15,8 +15,8 @@ roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] # Set random seed for reproducibility - task_core_arg = astune_proxy.get_agentscope_input_dictionary()[task_core_arg] - task_id = task_core_arg.task.task_id + workflow_task = astune_proxy.get_agentscope_input_dictionary()[workflow_task] + task_id = workflow_task.task.task_id np.random.seed(int(task_id)) np.random.shuffle(roles) From c77f05efb31690487235dd314056cb27e4cc3f00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 17:19:37 +0800 Subject: [PATCH 078/462] patch examples --- astune/schema/task.py | 14 +++++++++++++- astune/task_judge/env_service_as_judge.py | 7 +++---- astune/task_judge/math_answer_as_judge.py | 1 - astune/task_runner/agentscope_runner.py | 2 ++ astune/workflow.py | 2 +- tutorial/appworld.py | 11 +++++------ tutorial/werewolves/start.py | 14 ++++++++------ 7 files changed, 32 insertions(+), 19 deletions(-) diff --git a/astune/schema/task.py b/astune/schema/task.py index 3b674c80..6b789271 100644 --- a/astune/schema/task.py +++ b/astune/schema/task.py @@ -2,6 +2,9 @@ from typing import List, Dict, Any, Union +""" +The basic schema for task_reader module +""" class Task(BaseModel): main_query: str = Field(default="") init_messages: List[dict] = Field(default=[]) @@ -10,6 +13,10 @@ class Task(BaseModel): metadata: dict = Field(default_factory=dict) + +""" +For workflow execution, include task uuid and gym client if needed +""" class WorkflowTask(BaseModel): env_type: str = Field(default="") task_id: str = Field(default="") @@ -20,9 +27,14 @@ class WorkflowTask(BaseModel): obs_window: dict = Field(default={}) llm_chat_fn: Any = Field(default=None) tokenizer: Any = Field(default=None) - task: Task = Field(default=None) # type: ignore + task: Task = Field(default=Task()) + gym_env: Any = Field(default=None) # agentscope runtime handle or env service handle + +""" +workflow output, user should provide as workflow output +""" class WorkflowOutput(BaseModel): reward: Union[float, List[float], None] = Field(default=None) is_success: Union[bool, None] = Field(default=None) diff --git a/astune/task_judge/env_service_as_judge.py b/astune/task_judge/env_service_as_judge.py index ebfea127..012eb69e 100644 --- a/astune/task_judge/env_service_as_judge.py +++ b/astune/task_judge/env_service_as_judge.py @@ -1,4 +1,5 @@ from astune.task_judge.judge_base import JudgeBase +from astune.workflow import WorkflowOutput, WorkflowTask class EnvServiceJudge(JudgeBase): @@ -6,12 +7,10 @@ class EnvServiceJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, judge_input_dictionary) -> tuple: + def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: raw_reward = 0 - env = judge_input_dictionary['env'] - workflow_task = judge_input_dictionary['workflow_task'] - + env = workflow_task.gym_env raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) if raw_reward >= 1: is_success = True diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index 02eb22e7..3759fe26 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -9,7 +9,6 @@ def __init__(self, config): self.config = config def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: - raw_reward = 0 final_answer = workflow_output.metadata['final_answer'] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow reference_answer = workflow_task.task.metadata['answer'] diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index a4491fed..cd91745c 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -67,6 +67,7 @@ def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTr task_batch_index = workflow_task.task_batch_index task_tag = workflow_task.task_tag task_id = workflow_task.task_id + workflow_task.gym_env = env workflow_import = self.config.astune.rollout.agentscope_learn_protocol workflow_cls = dynamic_import(workflow_import) @@ -99,6 +100,7 @@ def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTr raw_reward, is_success = workflow_output.reward, workflow_output.is_success else: raw_reward, is_success = self.get_judge().compute_reward(workflow_task, workflow_output) + workflow_task.gym_env = None # clear gym env client reference to avoid serialization issue assert not isinstance(raw_reward, list), "ASTune will support step reward in future versions." diff --git a/astune/workflow.py b/astune/workflow.py index e11ce57a..65d95ff9 100644 --- a/astune/workflow.py +++ b/astune/workflow.py @@ -10,7 +10,7 @@ class Workflow(BaseModel): name: str = Field(default="default_workflow", description="Name of the workflow.") trainable_targets: List[str] = Field(default=[], description="List of agents to be fine-tuned.") - async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: """Run the workflow on a given task.""" raise NotImplementedError diff --git a/tutorial/appworld.py b/tutorial/appworld.py index fa1e234a..386362c5 100644 --- a/tutorial/appworld.py +++ b/tutorial/appworld.py @@ -1,17 +1,17 @@ from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg -from pydantic import BaseModel, Field +from pydantic import Field class ExampleAgentScopeLearnProtocol(Workflow): trainer: str = Field(default="astune-trinity") - async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory - init_messages = task.task.init_messages + init_messages = workflow_task.task.init_messages if len(init_messages) >= 2: first_msg, init_messages = init_messages[0], init_messages[1:] else: first_msg = {"content": "You're a helpful assistant."} interaction_message = [] @@ -28,14 +28,13 @@ async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) print_hint_msg=False, ) agent.set_console_output_enabled(False) - - + env = workflow_task.gym_env step = 0 for step in range(model_tuner.config.astune.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol - obs, _, terminate, _ = env.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) + obs, _, terminate, _ = env.step(action={"content": reply_message.content, "role": "assistant"}) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index 7300c899..625f8ffc 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -1,14 +1,16 @@ # -*- coding: utf-8 -*- # flake8: noqa: E501 + """The main entry point for the werewolf game.""" -from textwrap import dedent + import numpy as np -from loguru import logger import dotenv; dotenv.load_dotenv() +from textwrap import dedent +from loguru import logger from tutorial.werewolves.game import werewolves_game from agentscope.agent import ReActAgent -from agentscope.formatter import DashScopeMultiAgentFormatter, OpenAIMultiAgentFormatter -from agentscope.model import DashScopeChatModel, OpenAIChatModel +from agentscope.formatter import OpenAIMultiAgentFormatter +from agentscope.model import OpenAIChatModel from pydantic import BaseModel, Field from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput @@ -76,7 +78,7 @@ class ExampleWerewolves(Workflow): trainer: str = Field(default="astune-trinity") trainable_targets: list = Field(default=["werewolf"], description="List of agents to be fine-tuned.") - async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: # ensure trainable targets is legal if "werewolf" in self.trainable_targets: @@ -86,7 +88,7 @@ async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) # make and shuffle roles (fix random seed for reproducibility) roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] - task_id = task.task.metadata['random_number'] + task_id = workflow_task.task.metadata['random_number'] np.random.seed(int(task_id)) np.random.shuffle(roles) From 34f43fb4e24168f25e59ef042789eee14431758c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 17:21:13 +0800 Subject: [PATCH 079/462] refactor: rename parameter 'task' to 'workflow_task' for clarity in agentscope_execute method --- tutorial/math_agent.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorial/math_agent.py b/tutorial/math_agent.py index 38244b69..f7df18ef 100644 --- a/tutorial/math_agent.py +++ b/tutorial/math_agent.py @@ -42,13 +42,13 @@ class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory from agentscope.tool import Toolkit, execute_python_code - query = task.task.main_query + query = workflow_task.task.main_query self.toolkit = Toolkit() self.toolkit.register_tool_function(execute_python_code) self.agent = ReActAgent( From f514ff8f76af1a2b5be1187b34a80a3133e29580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 17:22:52 +0800 Subject: [PATCH 080/462] refactor: add logging for trinity import failure in backbone module --- astune/backbone/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/astune/backbone/__init__.py b/astune/backbone/__init__.py index e9692828..76e63115 100644 --- a/astune/backbone/__init__.py +++ b/astune/backbone/__init__.py @@ -1 +1,5 @@ -from astune.backbone.trinity_compat_workflow import * \ No newline at end of file +from loguru import logger +try: + from astune.backbone.trinity_compat_workflow import * +except ImportError: + logger.warning("trinity is not available.") \ No newline at end of file From 8bf65f5d2ab9df3fc93644f2d8ade0ac7781a043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 17:28:17 +0800 Subject: [PATCH 081/462] trailing-whitespace --- .gitignore | 2 +- .pre-commit-config.yaml | 11 +++++------ README.md | 2 +- astune/backbone/__init__.py | 2 +- astune/backbone/native_compat_trainer.py | 2 +- .../agentscope_tracker/multiagent_tracking.py | 2 +- .../agentscope_tracker/timeline_merging.py | 2 +- astune/context_tracker/basic_tracker.py | 2 -- astune/context_tracker/tracker_base_attr.py | 2 +- astune/default_config/astune_default.yaml | 3 --- astune/default_config/trinity/README.md | 2 +- .../trinity/config_auto_convertion_trinity.json | 2 +- astune/default_config/trinity/trinity_default.yaml | 2 +- .../verl/config_auto_convertion_verl.json | 2 +- astune/default_config/verl/verl_default.yaml | 1 - astune/schema/logprob.py | 1 - astune/schema/task.py | 2 +- astune/task_judge/env_service_as_judge.py | 2 +- astune/task_judge/judge_base.py | 2 +- astune/task_judge/math_answer_as_judge.py | 2 +- astune/task_reader/task_reader_base.py | 1 - astune/task_reader/tracing_reader/__init__.py | 2 +- astune/task_reader/tracing_reader/connector.py | 10 +++++----- astune/task_reader/tracing_reader/fn.py | 2 +- astune/task_rollout/__init__.py | 1 - astune/task_runner/__init__.py | 2 +- astune/task_runner/agentscope_runner.py | 2 -- astune/utils/cleaner.py | 2 +- astune/utils/config_utils.py | 2 +- astune/utils/dynamic_import.py | 2 +- astune/utils/message.py | 2 +- astune/utils/process_manager.py | 2 +- astune/utils/pty.py | 1 - astune/utils/retry.py | 2 -- astune/utils/utils.py | 2 +- astune/workflow.py | 2 +- documents/tokenizer_nodes.md | 2 +- documents/vllm_tokenizer.py | 2 +- pyrightconfig.json | 2 +- scripts/download_dataset.py | 2 +- scripts/download_model.py | 2 +- scripts/requirements_verl.txt | 2 +- scripts/tar_and_copy.sh | 2 +- scripts/untar.sh | 2 +- setup.py | 2 +- tests/test_tracing.py | 2 +- tests/test_tracing_reader.py | 1 - tests/test_utils/read_config_from_yaml.py | 2 +- tutorial/appworld.py | 1 - tutorial/math_agent.md | 2 +- tutorial/math_agent.py | 1 - tutorial/werewolves/game.py | 2 +- tutorial/werewolves/prompt.py | 2 +- tutorial/werewolves/start.py | 1 - tutorial/werewolves/structured_model.py | 2 +- tutorial/werewolves/utils.py | 2 +- 56 files changed, 51 insertions(+), 70 deletions(-) diff --git a/.gitignore b/.gitignore index 1bd1fd5e..0951f429 100644 --- a/.gitignore +++ b/.gitignore @@ -138,4 +138,4 @@ launcher_record .trash trinity_checkpoints -astune_test \ No newline at end of file +astune_test diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 72e099f2..40ab624c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,8 +1,7 @@ repos: - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.4" +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 hooks: - - id: ruff - args: ["--fix", "--show-fixes", "--output-format=full"] - exclude: ^.*\.(ipynb)$ - - id: ruff-format + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml diff --git a/README.md b/README.md index 8803013d..4e9b18d9 100644 --- a/README.md +++ b/README.md @@ -175,4 +175,4 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi # Future -- [ ] Generative Adversarial Distillation: https://www.alphaxiv.org/abs/2511.10643 \ No newline at end of file +- [ ] Generative Adversarial Distillation: https://www.alphaxiv.org/abs/2511.10643 diff --git a/astune/backbone/__init__.py b/astune/backbone/__init__.py index 76e63115..e1de92f8 100644 --- a/astune/backbone/__init__.py +++ b/astune/backbone/__init__.py @@ -2,4 +2,4 @@ try: from astune.backbone.trinity_compat_workflow import * except ImportError: - logger.warning("trinity is not available.") \ No newline at end of file + logger.warning("trinity is not available.") diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index 59abbf61..9a9e6202 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -1613,4 +1613,4 @@ def get_eval_dataset(self): self.main_val_dataset = tasks return self.main_val_dataset, None, None else: - raise NotImplementedError \ No newline at end of file + raise NotImplementedError diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 873f4ebc..b4d44ced 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -288,4 +288,4 @@ def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: def apply_chat_template_for_ext_messages(self, ext_messages: List[ExtendedMessage], tools: List = []) -> str: dict_messages = self.to_role_content(ext_messages) prompt_text = self.tokenizer.apply_chat_template(dict_messages, tokenize=False, add_generation_prompt=True, tools=tools) - return prompt_text # type: ignore \ No newline at end of file + return prompt_text # type: ignore diff --git a/astune/context_tracker/agentscope_tracker/timeline_merging.py b/astune/context_tracker/agentscope_tracker/timeline_merging.py index 8e1488fe..53c7eba4 100644 --- a/astune/context_tracker/agentscope_tracker/timeline_merging.py +++ b/astune/context_tracker/agentscope_tracker/timeline_merging.py @@ -83,4 +83,4 @@ def toggle_author(source_timeline: List[ExtendedMessage], target_timeline: List[ reversed_timelines_clean.append(reversed_timelines[i]) timelines = list(reversed(reversed_timelines_clean)) - return timelines \ No newline at end of file + return timelines diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index d1c54207..cb76ccdc 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -631,5 +631,3 @@ def compute_reference_advantage(cmt_array: List): ] return - - diff --git a/astune/context_tracker/tracker_base_attr.py b/astune/context_tracker/tracker_base_attr.py index 4149388e..0ce9b071 100644 --- a/astune/context_tracker/tracker_base_attr.py +++ b/astune/context_tracker/tracker_base_attr.py @@ -50,4 +50,4 @@ def __init__(self, config, tokenizer, **kwargs): self.already_mad_flag = False self.round_cnt = 0 - assert self.config.astune.data.max_prompt_length + self.config.astune.data.max_response_length <= max_model_len \ No newline at end of file + assert self.config.astune.data.max_prompt_length + self.config.astune.data.max_response_length <= max_model_len diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 50c8653f..7c001cc5 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -128,6 +128,3 @@ astune: custom_rubrics: If the answer claims that it has written the output to a file, consider it an invalid response. temperature: 0.5 print_reason: false - - - diff --git a/astune/default_config/trinity/README.md b/astune/default_config/trinity/README.md index 9a119385..5ffd2e27 100644 --- a/astune/default_config/trinity/README.md +++ b/astune/default_config/trinity/README.md @@ -19,4 +19,4 @@ trinity: ## change config mapping Some astune config has several configuration that is overlaps with trinity, -map them with `astune/default_config/trinity/config_auto_convertion_trinity.json` \ No newline at end of file +map them with `astune/default_config/trinity/config_auto_convertion_trinity.json` diff --git a/astune/default_config/trinity/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json index 934b58a4..28789ed5 100644 --- a/astune/default_config/trinity/config_auto_convertion_trinity.json +++ b/astune/default_config/trinity/config_auto_convertion_trinity.json @@ -3,4 +3,4 @@ "astune.project_name": "project", "astune.experiment_name": "name", "astune.rollout.num_repeat": "algorithm.repeat_times" -} \ No newline at end of file +} diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index ea4fb41c..67af1ecf 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -63,4 +63,4 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 max_token_len_per_gpu: 24576 save_interval: 100 ulysses_sequence_parallel_size: 2 - use_dynamic_bsz: true \ No newline at end of file + use_dynamic_bsz: true diff --git a/astune/default_config/verl/config_auto_convertion_verl.json b/astune/default_config/verl/config_auto_convertion_verl.json index 52f75be5..28ef4a2c 100644 --- a/astune/default_config/verl/config_auto_convertion_verl.json +++ b/astune/default_config/verl/config_auto_convertion_verl.json @@ -31,4 +31,4 @@ "astune.model.path": "actor_rollout_ref.model.path", "astune.project_name": "trainer.project_name", "astune.experiment_name": "trainer.experiment_name" -} \ No newline at end of file +} diff --git a/astune/default_config/verl/verl_default.yaml b/astune/default_config/verl/verl_default.yaml index 546ea7ad..9a203352 100644 --- a/astune/default_config/verl/verl_default.yaml +++ b/astune/default_config/verl/verl_default.yaml @@ -75,4 +75,3 @@ actor_rollout_ref: model: use_remove_padding: True enable_gradient_checkpointing: True - diff --git a/astune/schema/logprob.py b/astune/schema/logprob.py index 717c7dc5..631a57bd 100644 --- a/astune/schema/logprob.py +++ b/astune/schema/logprob.py @@ -9,4 +9,3 @@ def __init__(self, token_id, logprob, decoded_string): self.token_id = token_id self.logprob = logprob self.decoded_string = decoded_string - diff --git a/astune/schema/task.py b/astune/schema/task.py index 6b789271..8a62ba1e 100644 --- a/astune/schema/task.py +++ b/astune/schema/task.py @@ -38,4 +38,4 @@ class WorkflowTask(BaseModel): class WorkflowOutput(BaseModel): reward: Union[float, List[float], None] = Field(default=None) is_success: Union[bool, None] = Field(default=None) - metadata: Dict[str, Any] = Field(default_factory=dict) \ No newline at end of file + metadata: Dict[str, Any] = Field(default_factory=dict) diff --git a/astune/task_judge/env_service_as_judge.py b/astune/task_judge/env_service_as_judge.py index 012eb69e..0b11ef0f 100644 --- a/astune/task_judge/env_service_as_judge.py +++ b/astune/task_judge/env_service_as_judge.py @@ -26,4 +26,4 @@ def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOut if self.config.astune.rollout.binary_reward: raw_reward = 1.0 if is_success else 0.0 - return raw_reward, is_success \ No newline at end of file + return raw_reward, is_success diff --git a/astune/task_judge/judge_base.py b/astune/task_judge/judge_base.py index 8215fb6d..35a7b17b 100644 --- a/astune/task_judge/judge_base.py +++ b/astune/task_judge/judge_base.py @@ -7,4 +7,4 @@ def __init__(self, config): def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: - raise NotImplementedError \ No newline at end of file + raise NotImplementedError diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index 3759fe26..fae28af2 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -58,4 +58,4 @@ def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOut else: is_success = False raw_reward = 0.0 - return raw_reward, is_success \ No newline at end of file + return raw_reward, is_success diff --git a/astune/task_reader/task_reader_base.py b/astune/task_reader/task_reader_base.py index 69b6c972..4c79af56 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astune/task_reader/task_reader_base.py @@ -15,4 +15,3 @@ def get_training_tasks(self)->List[Task]: def get_validation_tasks(self)->List[Task]: raise NotImplementedError - diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index d08cf229..f9328509 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -129,4 +129,4 @@ def get_training_tasks(self) -> List[Task]: return self._train_tasks def get_validation_tasks(self) -> List[Task]: - return self._val_tasks \ No newline at end of file + return self._val_tasks diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index a0a6b57e..206378f7 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -163,7 +163,7 @@ def load_tasks_from_conversation(self) -> List[Task]: if query['content'] is not None and output['content'] is not None: qa.append( {"query": query['content'], "answer": output['content']}) - + conn.close() tasks: List[Task] = [] @@ -182,12 +182,12 @@ def load_tasks_from_conversation(self) -> List[Task]: tasks.append(task) return tasks - + class LocalSqliteConnectorV2: """ A connector that loads tasks from a SQLite database file in new format. - + https://github.com/agentscope-ai/agentscope-studio/pull/40/files#diff-12c7e27505a5171e080133021430d8cae2f4929ce2f4c93bd4ea5a389094224a Args: @@ -222,7 +222,7 @@ def load_tasks_from_conversation(self) -> List[Task]: "query": inp["parts"][0]["content"], "answer": out["parts"][0]["content"], }) - + conn.close() tasks: List[Task] = [] @@ -243,4 +243,4 @@ def load_tasks_from_conversation(self) -> List[Task]: return tasks -__all__ = ["LocalSqliteConnectorV1", "LocalSqliteConnectorV2", "PhoenixConnector"] \ No newline at end of file +__all__ = ["LocalSqliteConnectorV1", "LocalSqliteConnectorV2", "PhoenixConnector"] diff --git a/astune/task_reader/tracing_reader/fn.py b/astune/task_reader/tracing_reader/fn.py index d9907aac..126437cf 100644 --- a/astune/task_reader/tracing_reader/fn.py +++ b/astune/task_reader/tracing_reader/fn.py @@ -188,4 +188,4 @@ def __call__(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> U response = self.alien_llm_chat_fn(messages, self.sampling_params) # Parse and return result - return self._parse_markdown_kv(response["content"]) \ No newline at end of file + return self._parse_markdown_kv(response["content"]) diff --git a/astune/task_rollout/__init__.py b/astune/task_rollout/__init__.py index b3183726..b718083c 100644 --- a/astune/task_rollout/__init__.py +++ b/astune/task_rollout/__init__.py @@ -1,2 +1 @@ """Task rollout helper modules.""" - diff --git a/astune/task_runner/__init__.py b/astune/task_runner/__init__.py index e776a65c..b65be20d 100644 --- a/astune/task_runner/__init__.py +++ b/astune/task_runner/__init__.py @@ -17,4 +17,4 @@ def __init__(self, self.config = config self.max_steps: int = self.config.astune.rollout.multi_turn.max_steps self.max_model_len: int = self.config.astune.rollout.max_model_len - self.max_env_len: int = self.config.astune.rollout.max_env_len \ No newline at end of file + self.max_env_len: int = self.config.astune.rollout.max_env_len diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index cd91745c..b16ea058 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -121,5 +121,3 @@ def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTr # after merging, process and align reward again context_tracker.process_reward(reward) return context_tracker - - diff --git a/astune/utils/cleaner.py b/astune/utils/cleaner.py index 815f0977..ad6673ab 100644 --- a/astune/utils/cleaner.py +++ b/astune/utils/cleaner.py @@ -58,4 +58,4 @@ def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grac except Exception as e: print(f"Error issuing kill commands: {e}") - return [int(p) for p in pids] \ No newline at end of file + return [int(p) for p in pids] diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index b204f7dd..78f559a1 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -18,4 +18,4 @@ def dump_yaml_config(cfg: DictConfig, yaml_fp: str): from omegaconf import OmegaConf with open(yaml_fp, 'w') as f: OmegaConf.save(cfg, f) - return yaml_fp \ No newline at end of file + return yaml_fp diff --git a/astune/utils/dynamic_import.py b/astune/utils/dynamic_import.py index 6c3748d6..9d30de4a 100644 --- a/astune/utils/dynamic_import.py +++ b/astune/utils/dynamic_import.py @@ -4,4 +4,4 @@ def dynamic_import(module_class_str: str): module_, class_ = module_class_str.split('->') protocol_cls = getattr(importlib.import_module(module_), class_) - return protocol_cls \ No newline at end of file + return protocol_cls diff --git a/astune/utils/message.py b/astune/utils/message.py index a80ad546..a4a7449d 100644 --- a/astune/utils/message.py +++ b/astune/utils/message.py @@ -9,4 +9,4 @@ def send_train_message(message: str): url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), headers={"Content-Type": "application/json"} ) - except Exception as e: print(f"Failed to send sms: {e}") \ No newline at end of file + except Exception as e: print(f"Failed to send sms: {e}") diff --git a/astune/utils/process_manager.py b/astune/utils/process_manager.py index 3f619074..7dd92221 100644 --- a/astune/utils/process_manager.py +++ b/astune/utils/process_manager.py @@ -82,4 +82,4 @@ def kill_process_with_keyword(keyword: str, exclude_substrings=None, grace_secon except Exception as e: print(f"Error issuing kill commands: {e}") - return [int(p) for p in pids] \ No newline at end of file + return [int(p) for p in pids] diff --git a/astune/utils/pty.py b/astune/utils/pty.py index c1366ee9..d8fd49a0 100644 --- a/astune/utils/pty.py +++ b/astune/utils/pty.py @@ -111,4 +111,3 @@ def pty_wrapper_final(human_cmd, dir, env_dict): exit(1) pty_wrapper_final(base64_to_string(args.human_cmd), args.dir, env_dict) - diff --git a/astune/utils/retry.py b/astune/utils/retry.py index b0c2aef3..cde3c04a 100644 --- a/astune/utils/retry.py +++ b/astune/utils/retry.py @@ -41,5 +41,3 @@ def wrapper(*args: Any, **kwargs: Any) -> T: return wrapper return decorator - - diff --git a/astune/utils/utils.py b/astune/utils/utils.py index 2495cc72..050c71a0 100644 --- a/astune/utils/utils.py +++ b/astune/utils/utils.py @@ -47,4 +47,4 @@ def remove_fields(d: Dict, fields: List[str]) -> Dict: d = copy.deepcopy(d) for field in fields: d.pop(field.strip(), None) - return d \ No newline at end of file + return d diff --git a/astune/workflow.py b/astune/workflow.py index 65d95ff9..80f5aaf4 100644 --- a/astune/workflow.py +++ b/astune/workflow.py @@ -103,4 +103,4 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod -""" \ No newline at end of file +""" diff --git a/documents/tokenizer_nodes.md b/documents/tokenizer_nodes.md index 798e7170..287106ab 100644 --- a/documents/tokenizer_nodes.md +++ b/documents/tokenizer_nodes.md @@ -129,4 +129,4 @@ sold half as many clips in May. How many clips did Natalia sell altogether in April and May? <|im_end|> <|im_start|>assistant -``` \ No newline at end of file +``` diff --git a/documents/vllm_tokenizer.py b/documents/vllm_tokenizer.py index 73ffc906..ca87b3e7 100644 --- a/documents/vllm_tokenizer.py +++ b/documents/vllm_tokenizer.py @@ -2275,4 +2275,4 @@ async def test_parse_chat_messages_single_empty_audio_with_uuid_async( } ] _assert_mm_data_inputs(await mm_future, {"audio": 1}) - _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[audio_uuid]) \ No newline at end of file + _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[audio_uuid]) diff --git a/pyrightconfig.json b/pyrightconfig.json index 8668e93e..c22f6296 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -24,4 +24,4 @@ // "**/*.log", // "**/*" ] -} \ No newline at end of file +} diff --git a/scripts/download_dataset.py b/scripts/download_dataset.py index 4ab8d45e..0e786e7c 100644 --- a/scripts/download_dataset.py +++ b/scripts/download_dataset.py @@ -37,4 +37,4 @@ def display_dataset(dataset_name, dataset_iter, header): print(f"Error loading dataset {args.target}: {e}") -# python -m scripts.download_dataset --path='/root/data/gsm8k' --target='openai/gsm8k' \ No newline at end of file +# python -m scripts.download_dataset --path='/root/data/gsm8k' --target='openai/gsm8k' diff --git a/scripts/download_model.py b/scripts/download_model.py index 30dcdec7..87aa3333 100644 --- a/scripts/download_model.py +++ b/scripts/download_model.py @@ -25,4 +25,4 @@ print(f"下载 {repo_name} 失败") # python -m scripts.download_model -# Qwen/Qwen3-0.6B \ No newline at end of file +# Qwen/Qwen3-0.6B diff --git a/scripts/requirements_verl.txt b/scripts/requirements_verl.txt index 4df897ba..68fc0024 100644 --- a/scripts/requirements_verl.txt +++ b/scripts/requirements_verl.txt @@ -293,4 +293,4 @@ xgrammar==0.1.21 xxhash==3.5.0 yarl==1.22.0 zipp==3.23.0 -debugpy>=1.8.0 \ No newline at end of file +debugpy>=1.8.0 diff --git a/scripts/tar_and_copy.sh b/scripts/tar_and_copy.sh index 9cf1a591..7fb3231d 100755 --- a/scripts/tar_and_copy.sh +++ b/scripts/tar_and_copy.sh @@ -1,4 +1,4 @@ cd ../ gtar -cvzf ASTune.tar.gz ASTune #scp ASTune.tar.gz jinli.yl@11.160.132.45:/home/jinli.yl/jinli_mnt2/workspace/ -scp -P 1016 ASTune.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ \ No newline at end of file +scp -P 1016 ASTune.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ diff --git a/scripts/untar.sh b/scripts/untar.sh index c8a7c8af..9ca67474 100644 --- a/scripts/untar.sh +++ b/scripts/untar.sh @@ -1 +1 @@ -rm -rf ASTune && tar -xzvf ASTune.tar.gz \ No newline at end of file +rm -rf ASTune && tar -xzvf ASTune.tar.gz diff --git a/setup.py b/setup.py index 58f29f5a..87add39e 100644 --- a/setup.py +++ b/setup.py @@ -4,4 +4,4 @@ name="astune", # Change this to your package name version="0.1.0", packages=find_packages(), -) \ No newline at end of file +) diff --git a/tests/test_tracing.py b/tests/test_tracing.py index a102559e..a6a03782 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -38,4 +38,4 @@ def config(tmp_path: Path) -> dict: with out_path.open("r", encoding="utf-8") as f: lines = [json.loads(line) for line in f if line.strip()] assert len(lines) == 2 -assert {obj["metadata"]["qa_hash"] for obj in lines} == {"h1", "h2"} \ No newline at end of file +assert {obj["metadata"]["qa_hash"] for obj in lines} == {"h1", "h2"} diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index b3d357e1..ab3377a1 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -143,4 +143,3 @@ def test_get_training_tasks_with_filter(config_with_filter: SimpleNamespace, con assert len(delta) > 1 print("these tasks are filtered:", delta) - diff --git a/tests/test_utils/read_config_from_yaml.py b/tests/test_utils/read_config_from_yaml.py index e3b6fd9d..5deaf0f6 100644 --- a/tests/test_utils/read_config_from_yaml.py +++ b/tests/test_utils/read_config_from_yaml.py @@ -5,4 +5,4 @@ def read_yaml_config(file_path: str) -> dict: import yaml with open(file_path, 'r') as file: config = yaml.safe_load(file) - return config \ No newline at end of file + return config diff --git a/tutorial/appworld.py b/tutorial/appworld.py index 386362c5..8a4a5920 100644 --- a/tutorial/appworld.py +++ b/tutorial/appworld.py @@ -42,4 +42,3 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod if model_tuner.get_context_tracker().context_overflow: break return WorkflowOutput(reward=None, metadata={"total_step": step}) - diff --git a/tutorial/math_agent.md b/tutorial/math_agent.md index f2f3528b..bb83f3ea 100644 --- a/tutorial/math_agent.md +++ b/tutorial/math_agent.md @@ -174,4 +174,4 @@ INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ### 6. 参考训练曲线 点击链接打开训练曲线: -https://swanlab.cn/@binaryhusky/public/runs/96arcunrxlezdmcvmcdob/chart \ No newline at end of file +https://swanlab.cn/@binaryhusky/public/runs/96arcunrxlezdmcvmcdob/chart diff --git a/tutorial/math_agent.py b/tutorial/math_agent.py index f7df18ef..a1e161aa 100644 --- a/tutorial/math_agent.py +++ b/tutorial/math_agent.py @@ -63,4 +63,3 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod result = await self.agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) - diff --git a/tutorial/werewolves/game.py b/tutorial/werewolves/game.py index 018acc9d..06e4f4e6 100644 --- a/tutorial/werewolves/game.py +++ b/tutorial/werewolves/game.py @@ -350,4 +350,4 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: good_guy_win = (len(alive_wolves) == 0) logger.warning(f"**********************************") logger.warning(f"Good guy win: {good_guy_win}, alive werewolves: {alive_wolves}") - return good_guy_win \ No newline at end of file + return good_guy_win diff --git a/tutorial/werewolves/prompt.py b/tutorial/werewolves/prompt.py index f33986fc..38427fda 100644 --- a/tutorial/werewolves/prompt.py +++ b/tutorial/werewolves/prompt.py @@ -188,4 +188,4 @@ class ChinesePrompts: to_all_continue = "游戏继续。" - to_all_reflect = "游戏结束。现在每位玩家可以对自己的表现进行反思。注意每位玩家只有一次发言机会,且反思内容仅自己可见。" \ No newline at end of file + to_all_reflect = "游戏结束。现在每位玩家可以对自己的表现进行反思。注意每位玩家只有一次发言机会,且反思内容仅自己可见。" diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index 625f8ffc..6d0d5141 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -122,4 +122,3 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod logger.warning(f"Is success: {is_success}") return WorkflowOutput(reward=raw_reward, is_success=is_success) - diff --git a/tutorial/werewolves/structured_model.py b/tutorial/werewolves/structured_model.py index 2e161cca..a5f89e1c 100644 --- a/tutorial/werewolves/structured_model.py +++ b/tutorial/werewolves/structured_model.py @@ -85,4 +85,4 @@ class HunterModel(BaseModel): default=None, ) - return HunterModel \ No newline at end of file + return HunterModel diff --git a/tutorial/werewolves/utils.py b/tutorial/werewolves/utils.py index ed89ee7b..c436cbb5 100644 --- a/tutorial/werewolves/utils.py +++ b/tutorial/werewolves/utils.py @@ -165,4 +165,4 @@ def check_winning(self) -> str | None: return Prompts.to_all_village_win.format( true_roles=true_roles, ) - return None \ No newline at end of file + return None From dd4afb2f686044f7c693f9947f236b5fe3bb5683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 17:57:07 +0800 Subject: [PATCH 082/462] pre-commit black --- .pre-commit-config.yaml | 6 + astune/backbone/__init__.py | 1 + astune/backbone/native_compat_trainer.py | 493 +++++++++++++----- astune/backbone/trinity_compat_workflow.py | 65 +-- .../agentscope_tracker/multiagent_tracking.py | 241 +++++---- .../agentscope_tracker/timeline_merging.py | 60 ++- astune/context_tracker/basic_tracker.py | 361 ++++++++----- astune/context_tracker/tracker_base_attr.py | 29 +- astune/main_trinity.py | 12 +- astune/main_verl.py | 87 +++- astune/main_vllm.py | 101 ++-- astune/schema/extended_msg.py | 116 +++-- astune/schema/logprob.py | 1 + astune/schema/task.py | 8 +- astune/schema/trajectory.py | 77 ++- astune/task_judge/env_service_as_judge.py | 2 +- astune/task_judge/judge_base.py | 5 +- astune/task_judge/math_answer_as_judge.py | 43 +- astune/task_reader/__init__.py | 39 +- astune/task_reader/env_service_reader.py | 10 +- astune/task_reader/hf_dataset_reader.py | 8 +- astune/task_reader/jsonl_reader.py | 14 +- astune/task_reader/task_reader_base.py | 4 +- astune/task_reader/tracing_reader/__init__.py | 5 +- .../task_reader/tracing_reader/connector.py | 63 ++- .../tracing_reader/filters/factory.py | 3 +- .../filters/llm_evaluate_filter.py | 18 +- astune/task_reader/tracing_reader/fn.py | 42 +- astune/task_rollout/async_llm_bridge.py | 107 ++-- astune/task_rollout/dashscope_llm_bridge.py | 33 +- astune/task_rollout/native_parallel_worker.py | 297 ++++++++--- astune/task_rollout/resource_keeper.py | 14 +- astune/task_rollout/single_worker.py | 50 +- astune/task_runner/__init__.py | 68 ++- astune/task_runner/agentscope_runner.py | 93 ++-- astune/task_runner/classic_runner.py | 66 ++- astune/tuner.py | 57 +- astune/utils/analysis_time_cost.py | 22 +- astune/utils/async_http_client.py | 42 +- astune/utils/cleaner.py | 30 +- astune/utils/color_hsl.py | 1 + astune/utils/compute_madness.py | 235 ++++++--- astune/utils/config_utils.py | 9 +- astune/utils/dynamic_import.py | 4 +- astune/utils/env_service_client/em_client.py | 34 +- astune/utils/env_service_client/env_client.py | 19 +- .../utils/env_service_client/env_client_ng.py | 86 ++- astune/utils/http_client.py | 134 +++-- astune/utils/logger.py | 24 +- astune/utils/markdown_parser.py | 16 +- astune/utils/message.py | 16 +- astune/utils/model_merger.py | 307 ++++++++--- astune/utils/n_gram.py | 10 +- astune/utils/process_dataset.py | 3 +- astune/utils/process_manager.py | 24 +- astune/utils/pty.py | 30 +- astune/utils/retry.py | 10 +- astune/utils/robust_dashscope.py | 45 +- astune/utils/sample.py | 15 +- astune/utils/smart_daemon.py | 113 ++-- astune/utils/sms_agent.py | 19 +- astune/utils/utils.py | 9 +- astune/workflow.py | 5 +- documents/vllm_tokenizer.py | 86 +-- launcher.py | 315 ++++++----- scripts/converter_hf_to_mcore.py | 140 ++++- scripts/deploy_model.py | 55 +- scripts/diagnose.py | 57 +- scripts/download_dataset.py | 39 +- scripts/download_model.py | 11 +- scripts/model_merger.py | 280 ++++++++-- tests/test_tracing.py | 5 +- tests/test_tracing_reader.py | 34 +- tests/test_utils/read_config_from_yaml.py | 6 +- tutorial/appworld.md | 4 +- tutorial/appworld.py | 31 +- tutorial/math_agent.py | 7 +- tutorial/werewolves/game.py | 10 +- tutorial/werewolves/prompt.py | 42 +- tutorial/werewolves/start.py | 26 +- tutorial/werewolves/structured_model.py | 24 +- tutorial/werewolves/utils.py | 12 +- vsdb.py | 167 +++--- 83 files changed, 3528 insertions(+), 1784 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 40ab624c..777e91b4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,3 +5,9 @@ repos: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml +- repo: https://github.com/psf/black-pre-commit-mirror + rev: 24.1.1 + hooks: + - id: black + language_version: python3.10 + args: ["--line-length=100"] diff --git a/astune/backbone/__init__.py b/astune/backbone/__init__.py index e1de92f8..8fe60bf3 100644 --- a/astune/backbone/__init__.py +++ b/astune/backbone/__init__.py @@ -1,4 +1,5 @@ from loguru import logger + try: from astune.backbone.trinity_compat_workflow import * except ImportError: diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index 9a9e6202..b8bc2d84 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -38,7 +38,11 @@ from verl.experimental.dataset.sampler import AbstractCurriculumSampler from verl.protocol import pad_dataproto_to_divisor, unpad_dataproto from verl.single_controller.base import Worker -from verl.single_controller.ray import RayClassWithInitArgs, RayResourcePool, RayWorkerGroup +from verl.single_controller.ray import ( + RayClassWithInitArgs, + RayResourcePool, + RayWorkerGroup, +) from verl.single_controller.ray.base import create_colocated_worker_cls from verl.trainer.config import AlgoConfig from verl.trainer.ppo import core_algos @@ -50,11 +54,17 @@ process_validation_metrics, ) from verl.trainer.ppo.reward import compute_reward, compute_reward_async -from verl.utils.checkpoint.checkpoint_manager import find_latest_ckpt_path, should_save_ckpt_esi +from verl.utils.checkpoint.checkpoint_manager import ( + find_latest_ckpt_path, + should_save_ckpt_esi, +) from verl.utils.config import omega_conf_to_dataclass from verl.utils.debug import marked_timer from verl.utils.metric import reduce_metrics -from verl.utils.seqlen_balancing import get_seqlen_balanced_partitions, log_seqlen_unbalance +from verl.utils.seqlen_balancing import ( + get_seqlen_balanced_partitions, + log_seqlen_unbalance, +) from verl.utils.torch_functional import masked_mean from verl.utils.tracking import ValidationGenerationsLogger @@ -100,7 +110,9 @@ def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | to # Get reward scores reward_scores_list = [item for item in data.non_tensor_batch["reward_scores"]] - reward_scores = torch.tensor(reward_scores_list, device=reward_tensor.device, dtype=torch.float32) # (bs, ) + reward_scores = torch.tensor( + reward_scores_list, device=reward_tensor.device, dtype=torch.float32 + ) # (bs, ) # Use advanced indexing to assign rewards (把reward放到response的最后一个token位置) reward_tensor[torch.arange(len(data)), response_lengths - 1] = reward_scores @@ -113,12 +125,13 @@ def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | to else: return reward_tensor + def union_gen_batch_via_task_id(tasks, batch: DataProto, gen_batch_output: DataProto): """ Union the gen_batch_output with the batch based on task_id. """ - map_task_id_to_index = {t.task_id:i for i, t in enumerate(tasks)} - gen_task_task_ids = gen_batch_output.non_tensor_batch['task_ids'] + map_task_id_to_index = {t.task_id: i for i, t in enumerate(tasks)} + gen_task_task_ids = gen_batch_output.non_tensor_batch["task_ids"] indices = [map_task_id_to_index[tid] for tid in gen_task_task_ids] batch_extend = batch.select_idxs(indices) batch_final = batch_extend.union(gen_batch_output) @@ -157,13 +170,19 @@ def create_resource_pool(self): For FSDP backend, uses max_colocate_count=1 to merge WorkerGroups. For Megatron backend, uses max_colocate_count>1 for different models. """ - for resource_pool_name, process_on_nodes in self.resource_pool_spec.items(): + for ( + resource_pool_name, + process_on_nodes, + ) in self.resource_pool_spec.items(): # max_colocate_count means the number of WorkerGroups (i.e. processes) in each RayResourcePool # For FSDP backend, we recommend using max_colocate_count=1 that merge all WorkerGroups into one. # For Megatron backend, we recommend using max_colocate_count>1 # that can utilize different WorkerGroup for differnt models resource_pool = RayResourcePool( - process_on_nodes=process_on_nodes, use_gpu=True, max_colocate_count=1, name_prefix=resource_pool_name + process_on_nodes=process_on_nodes, + use_gpu=True, + max_colocate_count=1, + name_prefix=resource_pool_name, ) self.resource_pool_dict[resource_pool_name] = resource_pool @@ -175,20 +194,30 @@ def get_resource_pool(self, role: Role) -> RayResourcePool: def get_n_gpus(self) -> int: """Get the number of gpus in this cluster.""" - return sum([n_gpus for process_on_nodes in self.resource_pool_spec.values() for n_gpus in process_on_nodes]) + return sum( + [ + n_gpus + for process_on_nodes in self.resource_pool_spec.values() + for n_gpus in process_on_nodes + ] + ) def _check_resource_available(self): """Check if the resource pool can be satisfied in this ray cluster.""" node_available_resources = ray.state.available_resources_per_node() node_available_gpus = { - node: node_info.get("GPU", 0) if "GPU" in node_info else node_info.get("NPU", 0) + node: (node_info.get("GPU", 0) if "GPU" in node_info else node_info.get("NPU", 0)) for node, node_info in node_available_resources.items() } # check total required gpus can be satisfied total_available_gpus = sum(node_available_gpus.values()) total_required_gpus = sum( - [n_gpus for process_on_nodes in self.resource_pool_spec.values() for n_gpus in process_on_nodes] + [ + n_gpus + for process_on_nodes in self.resource_pool_spec.values() + for n_gpus in process_on_nodes + ] ) if total_available_gpus < total_required_gpus: raise ValueError( @@ -196,7 +225,10 @@ def _check_resource_available(self): ) # check each resource pool can be satisfied, O(#resource_pools * #nodes) - for resource_pool_name, process_on_nodes in self.resource_pool_spec.items(): + for ( + resource_pool_name, + process_on_nodes, + ) in self.resource_pool_spec.items(): num_gpus, num_nodes = process_on_nodes[0], len(process_on_nodes) for node, available_gpus in node_available_gpus.items(): if available_gpus >= num_gpus: @@ -234,7 +266,9 @@ def apply_kl_penalty(data: DataProto, kl_ctrl: core_algos.AdaptiveKLController, # compute kl between ref_policy and current policy # When apply_kl_penalty, algorithm.use_kl_in_reward=True, so the reference model has been enabled. kld = core_algos.kl_penalty( - data.batch["old_log_probs"], data.batch["ref_log_prob"], kl_penalty=kl_penalty + data.batch["old_log_probs"], + data.batch["ref_log_prob"], + kl_penalty=kl_penalty, ) # (batch_size, response_length) kld = kld * response_mask beta = kl_ctrl.value @@ -248,7 +282,10 @@ def apply_kl_penalty(data: DataProto, kl_ctrl: core_algos.AdaptiveKLController, kl_ctrl.update(current_kl=current_kl, n_steps=batch_size) data.batch["token_level_rewards"] = token_level_rewards - metrics = {"actor/reward_kl_penalty": current_kl, "actor/reward_kl_penalty_coeff": beta} + metrics = { + "actor/reward_kl_penalty": current_kl, + "actor/reward_kl_penalty_coeff": beta, + } return data, metrics @@ -308,7 +345,7 @@ def compute_grpo_outcome_advantage_new( Returns: `(torch.Tensor)` shape is (bs, response_length) """ - scores = token_level_rewards.sum(dim=-1) # 1d-list + scores = token_level_rewards.sum(dim=-1) # 1d-list id2score = defaultdict(list) id2pointer = defaultdict(list) @@ -333,7 +370,9 @@ def compute_grpo_outcome_advantage_new( for rolloutid, score in zip(this_task_all_rolloutid, this_task_all_score): rolloutid2score[rolloutid].append(score) for rolloutid in rolloutid2score: - rolloutid2meanscore[rolloutid] = torch.mean(torch.tensor(rolloutid2score[rolloutid])) + rolloutid2meanscore[rolloutid] = torch.mean( + torch.tensor(rolloutid2score[rolloutid]) + ) this_task_all_score = list(rolloutid2meanscore.values()) @@ -360,6 +399,7 @@ def compute_grpo_outcome_advantage_new( return scores, scores + def compute_advantage( data: DataProto, adv_estimator: AdvantageEstimator, @@ -554,7 +594,9 @@ def _validate_config(self): minimal_bsz = n_gpus # 1. Check total batch size for data correctness - real_train_batch_size = config.astune.data.train_batch_size * config.astune.rollout.num_repeat + real_train_batch_size = ( + config.astune.data.train_batch_size * config.astune.rollout.num_repeat + ) assert real_train_batch_size % minimal_bsz == 0, ( f"real_train_batch_size ({real_train_batch_size}) must be divisible by minimal possible batch size " f"({minimal_bsz})" @@ -600,9 +642,15 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # Actor validation done in ActorConfig.__post_init__ and validate() try: actor_config = omega_conf_to_dataclass(config.actor_rollout_ref.actor) - actor_config.validate(n_gpus, config.astune.data.train_batch_size, config.actor_rollout_ref.model) + actor_config.validate( + n_gpus, + config.astune.data.train_batch_size, + config.actor_rollout_ref.model, + ) except hydra.errors.InstantiationException as e: - raise ValueError(f"You are using an unsupported VERL version. Please read `documents/backbones.md`") + raise ValueError( + f"You are using an unsupported VERL version. Please read `documents/backbones.md`" + ) if not config.actor_rollout_ref.actor.use_dynamic_bsz: if self.use_reference_policy: # reference: log_prob_micro_batch_size vs. log_prob_micro_batch_size_per_gpu @@ -622,7 +670,9 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # Check for reward model micro-batch size conflicts if config.reward_model.enable and not config.reward_model.use_dynamic_bsz: check_mutually_exclusive( - config.reward_model.micro_batch_size, config.reward_model.micro_batch_size_per_gpu, "reward_model" + config.reward_model.micro_batch_size, + config.reward_model.micro_batch_size_per_gpu, + "reward_model", ) if self.config.algorithm.use_kl_in_reward and config.actor_rollout_ref.actor.use_kl_loss: @@ -642,13 +692,19 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # check eval config if config.astune.rollout.val_kwargs.do_sample: - assert config.astune.rollout.temperature > 0, ( - "validation gen temperature should be greater than 0 when enabling do_sample" - ) + assert ( + config.astune.rollout.temperature > 0 + ), "validation gen temperature should be greater than 0 when enabling do_sample" print("[validate_config] All configuration checks passed successfully!") - def _create_dataloader(self, train_dataset, val_dataset, collate_fn, train_sampler: Optional[Sampler]): + def _create_dataloader( + self, + train_dataset, + val_dataset, + collate_fn, + train_sampler: Optional[Sampler], + ): """ Creates the train and validation dataloaders. """ @@ -656,18 +712,26 @@ def _create_dataloader(self, train_dataset, val_dataset, collate_fn, train_sampl if train_dataset is None: train_dataset = create_rl_dataset( - self.config.data.train_files, self.config.data, self.tokenizer, self.processor + self.config.data.train_files, + self.config.data, + self.tokenizer, + self.processor, ) if val_dataset is None: val_dataset = create_rl_dataset( - self.config.data.val_files, self.config.data, self.tokenizer, self.processor + self.config.data.val_files, + self.config.data, + self.tokenizer, + self.processor, ) self.train_dataset, self.val_dataset = train_dataset, val_dataset if train_sampler is None: train_sampler = create_rl_sampler(self.config.data, self.train_dataset) if collate_fn is None: - from verl.utils.dataset.rl_dataset import collate_fn as default_collate_fn + from verl.utils.dataset.rl_dataset import ( + collate_fn as default_collate_fn, + ) collate_fn = default_collate_fn @@ -675,7 +739,9 @@ def _create_dataloader(self, train_dataset, val_dataset, collate_fn, train_sampl self.train_dataloader = StatefulDataLoader( dataset=self.train_dataset, - batch_size=self.config.data.get("gen_batch_size", self.config.astune.data.train_batch_size), + batch_size=self.config.data.get( + "gen_batch_size", self.config.astune.data.train_batch_size + ), num_workers=num_workers, drop_last=True, collate_fn=collate_fn, @@ -715,11 +781,15 @@ def _create_dataloader(self, train_dataset, val_dataset, collate_fn, train_sampl OmegaConf.set_struct(self.config, True) with open_dict(self.config): if OmegaConf.select(self.config, "actor_rollout_ref.actor.optim"): - self.config.actor_rollout_ref.actor.optim.total_training_steps = total_training_steps + self.config.actor_rollout_ref.actor.optim.total_training_steps = ( + total_training_steps + ) if OmegaConf.select(self.config, "critic.optim"): self.config.critic.optim.total_training_steps = total_training_steps except Exception as e: - print(f"Warning: Could not set total_training_steps in config. Structure missing? Error: {e}") + print( + f"Warning: Could not set total_training_steps in config. Structure missing? Error: {e}" + ) def _dump_generations(self, inputs, outputs, gts, scores, reward_extra_infos_dict, dump_path): """Dump rollout/validation samples as JSONL.""" @@ -771,7 +841,9 @@ def _maybe_log_val_generations(self, inputs, outputs, scores): samples = samples[:generations_to_log] # Log to each configured logger - self.validation_generations_logger.log(self.config.trainer.logger, samples, self.global_steps) + self.validation_generations_logger.log( + self.config.trainer.logger, samples, self.global_steps + ) def _validate(self): data_source_lst = [] @@ -784,20 +856,32 @@ def _validate(self): sample_turns = [] for test_data in self.val_dataloader: - test_data['index'] = torch.tensor([i for i in range(len(test_data['task_id']))], dtype=torch.long) + test_data["index"] = torch.tensor( + [i for i in range(len(test_data["task_id"]))], dtype=torch.long + ) test_batch = DataProto.from_single_dict(test_data) # repeat test batch test_batch = test_batch.repeat( - repeat_times=self.config.astune.rollout.val_kwargs.num_repeat, interleave=True + repeat_times=self.config.astune.rollout.val_kwargs.num_repeat, + interleave=True, ) # we only do validation on rule-based rm - if self.config.reward_model.enable and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model": + if ( + self.config.reward_model.enable + and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model" + ): return {} - batch_keys_to_pop = ['index'] - non_tensor_batch_keys_to_pop = ['task_id', 'main_query', 'env_type', 'metadata', 'init_messages'] + batch_keys_to_pop = ["index"] + non_tensor_batch_keys_to_pop = [ + "task_id", + "main_query", + "env_type", + "metadata", + "init_messages", + ] if "multi_modal_data" in test_batch.non_tensor_batch: non_tensor_batch_keys_to_pop.append("multi_modal_data") if "raw_prompt" in test_batch.non_tensor_batch: @@ -834,7 +918,7 @@ def _validate(self): target_dataset=main_val_dataset, target_dataset_name="main_val_dataset", mode="validate", - epoch=f"test.1" + epoch=f"test.1", ) print("=" * 10 + "end validate rollout" + "=" * 10) test_output_gen_batch = self.parallel_env.to_dataproto(trajectories) @@ -843,11 +927,16 @@ def _validate(self): # Store generated outputs output_ids = test_output_gen_batch.batch["responses"] - output_texts = [self.tokenizer.decode(ids, skip_special_tokens=True) for ids in output_ids] + output_texts = [ + self.tokenizer.decode(ids, skip_special_tokens=True) for ids in output_ids + ] sample_outputs.extend(output_texts) - test_batch.non_tensor_batch["uid"] = np.array([str(uuid.uuid4()) for _ in range(len(test_batch.batch))], dtype=object) - tasks = tasks[:len(main_val_dataset)] + test_batch.non_tensor_batch["uid"] = np.array( + [str(uuid.uuid4()) for _ in range(len(test_batch.batch))], + dtype=object, + ) + tasks = tasks[: len(main_val_dataset)] test_batch = union_gen_batch_via_task_id(tasks, test_batch, test_output_gen_batch) # test_batch = test_batch.union(test_output_gen_batch) test_batch.meta_info["validate"] = True @@ -861,21 +950,31 @@ def _validate(self): sample_scores.extend(scores) reward_extra_infos_dict["reward"].extend(scores) - print(f"len reward_extra_infos_dict['reward']: {len(reward_extra_infos_dict['reward'])}") + print( + f"len reward_extra_infos_dict['reward']: {len(reward_extra_infos_dict['reward'])}" + ) if "reward_extra_info" in result: for key, lst in result["reward_extra_info"].items(): reward_extra_infos_dict[key].extend(lst) - print(f"len reward_extra_infos_dict['{key}']: {len(reward_extra_infos_dict[key])}") + print( + f"len reward_extra_infos_dict['{key}']: {len(reward_extra_infos_dict[key])}" + ) # collect num_turns of each prompt if "__num_turns__" in test_batch.non_tensor_batch: sample_turns.append(test_batch.non_tensor_batch["__num_turns__"]) - data_source_lst.append(test_batch.non_tensor_batch.get("data_source", ["unknown"] * reward_tensor.shape[0])) - break # hack to escape the loop after one batch + data_source_lst.append( + test_batch.non_tensor_batch.get("data_source", ["unknown"] * reward_tensor.shape[0]) + ) + break # hack to escape the loop after one batch - sample_inputs = [m['messages'][0]['content'] for m in test_batch.non_tensor_batch['messages']] - self._maybe_log_val_generations(inputs=sample_inputs, outputs=sample_outputs, scores=sample_scores) + sample_inputs = [ + m["messages"][0]["content"] for m in test_batch.non_tensor_batch["messages"] + ] + self._maybe_log_val_generations( + inputs=sample_inputs, outputs=sample_outputs, scores=sample_scores + ) metric_dict = val_metrics @@ -890,7 +989,9 @@ def init_workers(self): """ self.resource_pool_manager.create_resource_pool() - self.resource_pool_to_cls = {pool: {} for pool in self.resource_pool_manager.resource_pool_dict.values()} + self.resource_pool_to_cls = { + pool: {} for pool in self.resource_pool_manager.resource_pool_dict.values() + } # create actor and rollout if self.hybrid_engine: @@ -909,7 +1010,9 @@ def init_workers(self): if self.use_critic: resource_pool = self.resource_pool_manager.get_resource_pool(Role.Critic) critic_cfg = omega_conf_to_dataclass(self.config.critic) - critic_cls = RayClassWithInitArgs(cls=self.role_worker_mapping[Role.Critic], config=critic_cfg) + critic_cls = RayClassWithInitArgs( + cls=self.role_worker_mapping[Role.Critic], config=critic_cfg + ) self.resource_pool_to_cls[resource_pool]["critic"] = critic_cls # create reference policy if needed @@ -927,7 +1030,10 @@ def init_workers(self): if self.use_rm: # we create a RM here resource_pool = self.resource_pool_manager.get_resource_pool(Role.RewardModel) - rm_cls = RayClassWithInitArgs(self.role_worker_mapping[Role.RewardModel], config=self.config.reward_model) + rm_cls = RayClassWithInitArgs( + self.role_worker_mapping[Role.RewardModel], + config=self.config.reward_model, + ) self.resource_pool_to_cls[resource_pool]["rm"] = rm_cls # initialize WorkerGroup @@ -938,12 +1044,14 @@ def init_workers(self): all_wg = {} wg_kwargs = {} # Setting up kwargs for RayWorkerGroup if OmegaConf.select(self.config.trainer, "ray_wait_register_center_timeout") is not None: - wg_kwargs["ray_wait_register_center_timeout"] = self.config.trainer.ray_wait_register_center_timeout + wg_kwargs["ray_wait_register_center_timeout"] = ( + self.config.trainer.ray_wait_register_center_timeout + ) if OmegaConf.select(self.config.trainer, "profile_steps") is not None: wg_kwargs["profile_steps"] = OmegaConf.select(self.config.trainer, "profile_steps") - assert OmegaConf.select(self.config.trainer, "worker_nsight_options") is not None, ( - "worker_nsight_options must be set when profile_steps is set" - ) + assert ( + OmegaConf.select(self.config.trainer, "worker_nsight_options") is not None + ), "worker_nsight_options must be set when profile_steps is set" wg_kwargs["worker_nsight_options"] = OmegaConf.to_container( OmegaConf.select(self.config.trainer, "worker_nsight_options") ) @@ -978,8 +1086,13 @@ def init_workers(self): # create async rollout manager and request scheduler self.async_rollout_mode = False if self.config.astune.rollout.mode == "async": - from verl.experimental.agent_loop.agent_loop import AsyncLLMServerManager - from verl.experimental.agent_loop.agent_loop import AgentLoopManager + from verl.experimental.agent_loop.agent_loop import ( + AsyncLLMServerManager, + ) + from verl.experimental.agent_loop.agent_loop import ( + AgentLoopManager, + ) + self.async_rollout_mode = True agent_loop_manager = AgentLoopManager( config=self.config, @@ -991,14 +1104,21 @@ def init_workers(self): self.reward_fn = parse_reward_from_dataproto self.val_reward_fn = parse_reward_from_dataproto from concurrent.futures import ThreadPoolExecutor - self.parallel_env = ParallelEnvManager(config=self.config, async_rollout_manager=self.async_rollout_manager, max_parallel=self.config.astune.rollout.max_env_worker, tokenizer=self.tokenizer) + + self.parallel_env = ParallelEnvManager( + config=self.config, + async_rollout_manager=self.async_rollout_manager, + max_parallel=self.config.astune.rollout.max_env_worker, + tokenizer=self.tokenizer, + ) def _save_checkpoint(self): from verl.utils.fs import local_mkdir_safe # path: given_path + `/global_step_{global_steps}` + `/actor` local_global_step_folder = os.path.join( - self.config.trainer.default_local_dir, f"global_step_{self.global_steps}" + self.config.trainer.default_local_dir, + f"global_step_{self.global_steps}", ) print(f"local_global_step_folder: {local_global_step_folder}") @@ -1007,24 +1127,37 @@ def _save_checkpoint(self): actor_remote_path = ( None if self.config.trainer.default_hdfs_dir is None - else os.path.join(self.config.trainer.default_hdfs_dir, f"global_step_{self.global_steps}", "actor") + else os.path.join( + self.config.trainer.default_hdfs_dir, + f"global_step_{self.global_steps}", + "actor", + ) ) - remove_previous_ckpt_in_save = self.config.trainer.get("remove_previous_ckpt_in_save", False) + remove_previous_ckpt_in_save = self.config.trainer.get( + "remove_previous_ckpt_in_save", False + ) if remove_previous_ckpt_in_save: print( "Warning: remove_previous_ckpt_in_save is deprecated," + " set max_actor_ckpt_to_keep=1 and max_critic_ckpt_to_keep=1 instead" ) max_actor_ckpt_to_keep = ( - self.config.trainer.get("max_actor_ckpt_to_keep", None) if not remove_previous_ckpt_in_save else 1 + self.config.trainer.get("max_actor_ckpt_to_keep", None) + if not remove_previous_ckpt_in_save + else 1 ) max_critic_ckpt_to_keep = ( - self.config.trainer.get("max_critic_ckpt_to_keep", None) if not remove_previous_ckpt_in_save else 1 + self.config.trainer.get("max_critic_ckpt_to_keep", None) + if not remove_previous_ckpt_in_save + else 1 ) self.actor_rollout_wg.save_checkpoint( - actor_local_path, actor_remote_path, self.global_steps, max_ckpt_to_keep=max_actor_ckpt_to_keep + actor_local_path, + actor_remote_path, + self.global_steps, + max_ckpt_to_keep=max_actor_ckpt_to_keep, ) if self.use_critic: @@ -1032,10 +1165,17 @@ def _save_checkpoint(self): critic_remote_path = ( None if self.config.trainer.default_hdfs_dir is None - else os.path.join(self.config.trainer.default_hdfs_dir, f"global_step_{self.global_steps}", "critic") + else os.path.join( + self.config.trainer.default_hdfs_dir, + f"global_step_{self.global_steps}", + "critic", + ) ) self.critic_wg.save_checkpoint( - critic_local_path, critic_remote_path, self.global_steps, max_ckpt_to_keep=max_critic_ckpt_to_keep + critic_local_path, + critic_remote_path, + self.global_steps, + max_ckpt_to_keep=max_critic_ckpt_to_keep, ) # save dataloader @@ -1046,7 +1186,8 @@ def _save_checkpoint(self): # latest checkpointed iteration tracker (for atomic usage) local_latest_checkpointed_iteration = os.path.join( - self.config.trainer.default_local_dir, "latest_checkpointed_iteration.txt" + self.config.trainer.default_local_dir, + "latest_checkpointed_iteration.txt", ) with open(local_latest_checkpointed_iteration, "w") as f: f.write(str(self.global_steps)) @@ -1072,10 +1213,12 @@ def _load_checkpoint(self): return 0 else: if self.config.trainer.resume_mode == "resume_path": - assert isinstance(self.config.trainer.resume_from_path, str), "resume ckpt must be str type" - assert "global_step_" in self.config.trainer.resume_from_path, ( - "resume ckpt must specify the global_steps" - ) + assert isinstance( + self.config.trainer.resume_from_path, str + ), "resume ckpt must be str type" + assert ( + "global_step_" in self.config.trainer.resume_from_path + ), "resume ckpt must specify the global_steps" global_step_folder = self.config.trainer.resume_from_path if not os.path.isabs(global_step_folder): working_dir = os.getcwd() @@ -1091,12 +1234,14 @@ def _load_checkpoint(self): critic_path = os.path.join(global_step_folder, "critic") # load actor self.actor_rollout_wg.load_checkpoint( - actor_path, del_local_after_load=self.config.trainer.del_local_ckpt_after_load + actor_path, + del_local_after_load=self.config.trainer.del_local_ckpt_after_load, ) # load critic if self.use_critic: self.critic_wg.load_checkpoint( - critic_path, del_local_after_load=self.config.trainer.del_local_ckpt_after_load + critic_path, + del_local_after_load=self.config.trainer.del_local_ckpt_after_load, ) # load dataloader, @@ -1106,7 +1251,9 @@ def _load_checkpoint(self): dataloader_state_dict = torch.load(dataloader_local_path, weights_only=False) self.train_dataloader.load_state_dict(dataloader_state_dict) else: - print(f"Warning: No dataloader state found at {dataloader_local_path}, will start from scratch") + print( + f"Warning: No dataloader state found at {dataloader_local_path}, will start from scratch" + ) def _start_profiling(self, do_profile: bool) -> None: """Start profiling for all worker groups if profiling is enabled.""" @@ -1134,7 +1281,9 @@ def _balance_batch(self, batch: DataProto, metrics, logging_prefix="global_seqle """Reorder the data on single controller such that each dp rank gets similar total tokens""" attention_mask = batch.batch["attention_mask"] batch_size = attention_mask.shape[0] - global_seqlen_lst = batch.batch["attention_mask"].view(batch_size, -1).sum(-1).tolist() # (train_batch_size,) + global_seqlen_lst = ( + batch.batch["attention_mask"].view(batch_size, -1).sum(-1).tolist() + ) # (train_batch_size,) world_size = self.actor_rollout_wg.world_size global_partition_lst = get_seqlen_balanced_partitions( global_seqlen_lst, k_partitions=world_size, equal_size=True @@ -1143,7 +1292,9 @@ def _balance_batch(self, batch: DataProto, metrics, logging_prefix="global_seqle global_idx = torch.tensor([j for partition in global_partition_lst for j in partition]) batch.reorder(global_idx) global_balance_stats = log_seqlen_unbalance( - seqlen_list=global_seqlen_lst, partitions=global_partition_lst, prefix=logging_prefix + seqlen_list=global_seqlen_lst, + partitions=global_partition_lst, + prefix=logging_prefix, ) metrics.update(global_balance_stats) @@ -1167,7 +1318,6 @@ def fit(self): self.tracking_logger = logger self.global_steps = 0 - # load checkpoint before doing anything self._load_checkpoint() @@ -1184,9 +1334,12 @@ def fit(self): if self.config.trainer.get("val_only", False): return - # add tqdm - progress_bar = tqdm(total=self.total_training_steps, initial=self.global_steps, desc="Training Progress") + progress_bar = tqdm( + total=self.total_training_steps, + initial=self.global_steps, + desc="Training Progress", + ) # we start from step 1 self.global_steps += 1 @@ -1213,19 +1366,28 @@ def fit(self): else curr_step_profile ) - - batch_dict['index'] = torch.tensor([i for i in range(len(batch_dict['task_id']))], dtype=torch.long) + batch_dict["index"] = torch.tensor( + [i for i in range(len(batch_dict["task_id"]))], + dtype=torch.long, + ) batch: DataProto = DataProto.from_single_dict(batch_dict) # add uid to batch batch.non_tensor_batch["uid"] = np.array( - [str(uuid.uuid4()) for _ in range(len(batch.batch))], dtype=object + [str(uuid.uuid4()) for _ in range(len(batch.batch))], + dtype=object, ) # # pop those keys for generation - batch_keys_to_pop = ['index'] - non_tensor_batch_keys_to_pop = ['task_id', 'main_query', 'env_type', 'metadata', 'init_messages'] + batch_keys_to_pop = ["index"] + non_tensor_batch_keys_to_pop = [ + "task_id", + "main_query", + "env_type", + "metadata", + "init_messages", + ] gen_batch = batch.pop( batch_keys=batch_keys_to_pop, non_tensor_batch_keys=non_tensor_batch_keys_to_pop, @@ -1251,13 +1413,21 @@ def fit(self): task_id=gen_batch.non_tensor_batch["task_id"][i], main_query=gen_batch.non_tensor_batch["main_query"][i], env_type=gen_batch.non_tensor_batch["env_type"][i], - metadata=gen_batch.non_tensor_batch["metadata"][i] - ) for i in range(len(gen_batch)) + metadata=gen_batch.non_tensor_batch["metadata"][i], + ) + for i in range(len(gen_batch)) ] - print([gen_batch.non_tensor_batch["task_id"][i] for i in range(len(gen_batch))]) + print( + [ + gen_batch.non_tensor_batch["task_id"][i] + for i in range(len(gen_batch)) + ] + ) print("=" * 10 + "start fit rollout" + "=" * 10) self.parallel_env.current_global_steps = self.global_steps - trajectories: List[BasicContextTracker] = self.parallel_env.rollout(tasks, mode="sample", epoch=f"train.{epoch}") + trajectories: List[BasicContextTracker] = self.parallel_env.rollout( + tasks, mode="sample", epoch=f"train.{epoch}" + ) print("=" * 10 + "end fit rollout" + "=" * 10) print("begin to convert trajectories to dataproto") gen_batch_output = self.parallel_env.to_dataproto(trajectories) @@ -1272,12 +1442,16 @@ def fit(self): success_rate = [traj.reward_structure.success_rate for traj in trajectories] madness_rate = [traj.reward_structure.madness for traj in trajectories] round_cnt = [traj.round_cnt for traj in trajectories] - metrics.update({ - "critic/round_cnt": np.mean(round_cnt), - "critic/madness_rate": np.mean(madness_rate), - "critic/success_rate": np.mean(success_rate), - "critic/real_success_rate": np.mean(trajectories[0].current_batch_success_rate), - }) + metrics.update( + { + "critic/round_cnt": np.mean(round_cnt), + "critic/madness_rate": np.mean(madness_rate), + "critic/success_rate": np.mean(success_rate), + "critic/real_success_rate": np.mean( + trajectories[0].current_batch_success_rate + ), + } + ) print(f"gen_batch_output.info batch.keys={gen_batch_output.batch.keys()}") self.async_rollout_manager.sleep() @@ -1286,7 +1460,10 @@ def fit(self): if self.config.algorithm.adv_estimator == AdvantageEstimator.REMAX: raise NotImplementedError("REMAX is not supported in GRPO yet.") - batch.non_tensor_batch["uid"] = np.array([str(uuid.uuid4()) for _ in range(len(batch.batch))], dtype=object) + batch.non_tensor_batch["uid"] = np.array( + [str(uuid.uuid4()) for _ in range(len(batch.batch))], + dtype=object, + ) batch = union_gen_batch_via_task_id(tasks, batch, gen_batch_output) batch.batch["response_mask"] = compute_response_mask(batch) @@ -1301,7 +1478,9 @@ def fit(self): self._balance_batch(batch, metrics=metrics) # compute global_valid tokens - batch.meta_info["global_token_num"] = torch.sum(batch.batch["attention_mask"], dim=-1).tolist() + batch.meta_info["global_token_num"] = torch.sum( + batch.batch["attention_mask"], dim=-1 + ).tolist() with marked_timer("reward", timing_raw, color="yellow"): # compute reward model score @@ -1310,9 +1489,13 @@ def fit(self): batch = batch.union(reward_tensor) if self.config.reward_model.launch_reward_fn_async: - raise NotImplementedError("launch_reward_fn_async is not supported in GRPO yet.") + raise NotImplementedError( + "launch_reward_fn_async is not supported in GRPO yet." + ) else: - reward_tensor, reward_extra_infos_dict = compute_reward(batch, self.reward_fn) + reward_tensor, reward_extra_infos_dict = compute_reward( + batch, self.reward_fn + ) # recompute old_log_probs print("=== + compute log_probs begin ===") @@ -1321,8 +1504,14 @@ def fit(self): entropys = old_log_prob.batch["entropys"] response_masks = batch.batch["response_mask"] loss_agg_mode = self.config.actor_rollout_ref.actor.loss_agg_mode - entropy_loss = agg_loss(loss_mat=entropys, loss_mask=response_masks, loss_agg_mode=loss_agg_mode) - assert not torch.isnan(entropy_loss).item(), "Entropy loss should not be NaN, something must have gone terribly wrong." + entropy_loss = agg_loss( + loss_mat=entropys, + loss_mask=response_masks, + loss_agg_mode=loss_agg_mode, + ) + assert not torch.isnan( + entropy_loss + ).item(), "Entropy loss should not be NaN, something must have gone terribly wrong." old_log_prob_metrics = {"actor/entropy": entropy_loss.detach().item()} metrics.update(old_log_prob_metrics) old_log_prob.batch.pop("entropys") @@ -1330,7 +1519,9 @@ def fit(self): if "rollout_log_probs" in batch.batch.keys(): # TODO: we may want to add diff of probs too. - from verl.utils.debug.metrics import calculate_debug_metrics + from verl.utils.debug.metrics import ( + calculate_debug_metrics, + ) metrics.update(calculate_debug_metrics(batch)) @@ -1357,12 +1548,16 @@ def fit(self): batch.batch["token_level_scores"] = reward_tensor if reward_extra_infos_dict: - batch.non_tensor_batch.update({k: np.array(v) for k, v in reward_extra_infos_dict.items()}) + batch.non_tensor_batch.update( + {k: np.array(v) for k, v in reward_extra_infos_dict.items()} + ) # compute rewards. apply_kl_penalty if available if self.config.algorithm.use_kl_in_reward: batch, kl_metrics = apply_kl_penalty( - batch, kl_ctrl=self.kl_ctrl_in_reward, kl_penalty=self.config.algorithm.kl_penalty + batch, + kl_ctrl=self.kl_ctrl_in_reward, + kl_penalty=self.config.algorithm.kl_penalty, ) metrics.update(kl_metrics) else: @@ -1395,7 +1590,9 @@ def fit(self): if self.config.trainer.critic_warmup <= self.global_steps: # update actor with marked_timer("update_actor", timing_raw, color="red"): - batch.meta_info["multi_turn"] = self.config.astune.rollout.multi_turn.enable + batch.meta_info["multi_turn"] = ( + self.config.astune.rollout.multi_turn.enable + ) actor_output = self.actor_rollout_wg.update_actor(batch) actor_output_metrics = reduce_metrics(actor_output.meta_info["metrics"]) metrics.update(actor_output_metrics) @@ -1463,7 +1660,9 @@ def fit(self): metrics.update(compute_timing_metrics(batch=batch, timing_raw=timing_raw)) # TODO: implement actual tflpo and theoretical tflpo n_gpus = self.resource_pool_manager.get_n_gpus() - metrics.update(compute_throughout_metrics(batch=batch, timing_raw=timing_raw, n_gpus=n_gpus)) + metrics.update( + compute_throughout_metrics(batch=batch, timing_raw=timing_raw, n_gpus=n_gpus) + ) # this is experimental and may be changed/removed in the future in favor of a general-purpose one if isinstance(self.train_dataloader.sampler, AbstractCurriculumSampler): @@ -1505,109 +1704,123 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): tasks = [] for _ in range(pass_n): - tasks += [ - task for task in target_dataset - ] + tasks += [task for task in target_dataset] - cmts = self.parallel_env.rollout(tasks=tasks, mode=mode, epoch=epoch) # "sample" or "validate" + cmts = self.parallel_env.rollout( + tasks=tasks, mode=mode, epoch=epoch + ) # "sample" or "validate" task_results = {} for _cmt in cmts: reward = _cmt.reward_structure.raw_reward task_id = _cmt.task_id if task_id not in task_results: task_results[task_id] = {} - task_results[task_id]['reward_arr'] = [] - task_results[task_id]['tag_arr'] = [] + task_results[task_id]["reward_arr"] = [] + task_results[task_id]["tag_arr"] = [] if reward >= 1: _cmt.tag = "success" elif reward == 0: _cmt.tag = "failure" else: _cmt.tag = "half_success" - task_results[task_id]['tag_arr'] += [_cmt.tag] - task_results[task_id]['reward_arr'] += [_cmt.reward_structure.raw_reward] - task_results[task_id]['scenario'] = task_id.split('_')[0] + task_results[task_id]["tag_arr"] += [_cmt.tag] + task_results[task_id]["reward_arr"] += [_cmt.reward_structure.raw_reward] + task_results[task_id]["scenario"] = task_id.split("_")[0] - task_scenario = [task_id.split('_')[0] for task_id in task_results.keys()] + task_scenario = [task_id.split("_")[0] for task_id in task_results.keys()] set_scenarios = set(task_scenario) num_scenarios = len(set_scenarios) repeated_success_tasks = 0 - num_all_success_tasks = 0 # n 次实验中全部success的任务数 - num_pass_n_tasks = 0 # n 次实验中至少有一次success的任务数 + num_all_success_tasks = 0 # n 次实验中全部success的任务数 + num_pass_n_tasks = 0 # n 次实验中至少有一次success的任务数 for task_id, task_outcomes in task_results.items(): # 计算 num_all_success_tasks # n 次实验中全部success的任务数 # 计算 num_pass_n_tasks # n 次实验中至少有一次success的任务数 - assert len(task_outcomes['tag_arr']) == pass_n - if all(tag == "success" for tag in task_outcomes['tag_arr']): + assert len(task_outcomes["tag_arr"]) == pass_n + if all(tag == "success" for tag in task_outcomes["tag_arr"]): num_all_success_tasks += 1 - if any(tag == "success" for tag in task_outcomes['tag_arr']): + if any(tag == "success" for tag in task_outcomes["tag_arr"]): num_pass_n_tasks += 1 - repeated_success_tasks += task_outcomes['tag_arr'].count("success") + repeated_success_tasks += task_outcomes["tag_arr"].count("success") num_all_success_scenarios = 0 # 如果一个 scenario 的所有 task 都在 n 次实验中全部 success,则 num_all_success_scenarios +1 num_pass_n_scenarios = 0 # 如果一个 scenario 的所有 task 都在 n 次实验中至少有一次 success,则 num_pass_n_scenarios +1 - repeated_num_pass_1_scenarios = 0 # 按顺序排列,如果一个 scenario 的所有 task 都在第 x 次实验中 success,则 repeated_num_pass_1_scenarios +1 + repeated_num_pass_1_scenarios = 0 # 按顺序排列,如果一个 scenario 的所有 task 都在第 x 次实验中 success,则 repeated_num_pass_1_scenarios +1 for scenario in set_scenarios: - scenario_task_results = {task_id: task_outcomes for task_id, task_outcomes in task_results.items() if task_outcomes['scenario'] == scenario} + scenario_task_results = { + task_id: task_outcomes + for task_id, task_outcomes in task_results.items() + if task_outcomes["scenario"] == scenario + } # num_all_success_scenarios - if all(all(tag == "success" for tag in task_outcomes['tag_arr']) for task_outcomes in scenario_task_results.values()): + if all( + all(tag == "success" for tag in task_outcomes["tag_arr"]) + for task_outcomes in scenario_task_results.values() + ): num_all_success_scenarios += 1 # num_pass_n_scenarios - if all(any(tag == "success" for tag in task_outcomes['tag_arr']) for task_outcomes in scenario_task_results.values()): + if all( + any(tag == "success" for tag in task_outcomes["tag_arr"]) + for task_outcomes in scenario_task_results.values() + ): num_pass_n_scenarios += 1 # num_pass_1_scenarios for x in range(pass_n): - if all(task_outcomes['tag_arr'][x]=='success' for task_outcomes in scenario_task_results.values()): + if all( + task_outcomes["tag_arr"][x] == "success" + for task_outcomes in scenario_task_results.values() + ): repeated_num_pass_1_scenarios += 1 # 记录日志 - task_scenario_for_cmts = [_cmt.task_id.split('_')[0] for _cmt in cmts] + task_scenario_for_cmts = [_cmt.task_id.split("_")[0] for _cmt in cmts] for _cmt, scenario in zip(cmts, task_scenario_for_cmts): task_outcome = _cmt.tag selectors = [scenario, _cmt.task_id, task_outcome] _cmt.generate_log() reward = _cmt.reward_structure.raw_reward - - rewards = [ _cmt.reward_structure.raw_reward for _cmt in cmts ] + rewards = [_cmt.reward_structure.raw_reward for _cmt in cmts] num_tasks = len(task_results) assert num_tasks == len(cmts) // pass_n val_metrics = { "target dataset name": target_dataset_name, "pass_n": pass_n, - "total_tasks": len(task_results), "num_all_success_tasks": num_all_success_tasks, f"num_pass_n_tasks(pass@{pass_n})": num_pass_n_tasks, - "num_scenarios": num_scenarios, "num_all_success_scenarios": num_all_success_scenarios, f"num_pass_n_scenarios(pass@{pass_n})": num_pass_n_scenarios, - - "TGC@1": repeated_success_tasks / (num_tasks * pass_n), - f"TGC@{pass_n}": num_pass_n_tasks / num_tasks, - f"TGC@{pass_n}-all-pass": num_all_success_tasks / num_tasks, - f"SGC@1": repeated_num_pass_1_scenarios / (num_scenarios * pass_n), - f"SGC@{pass_n}": num_pass_n_scenarios / num_scenarios, - f"SGC@{pass_n}-all-pass": num_all_success_scenarios / num_scenarios, + "TGC@1": repeated_success_tasks / (num_tasks * pass_n), + f"TGC@{pass_n}": num_pass_n_tasks / num_tasks, + f"TGC@{pass_n}-all-pass": num_all_success_tasks / num_tasks, + f"SGC@1": repeated_num_pass_1_scenarios / (num_scenarios * pass_n), + f"SGC@{pass_n}": num_pass_n_scenarios / num_scenarios, + f"SGC@{pass_n}-all-pass": num_all_success_scenarios / num_scenarios, "mean_reward": sum(rewards) / len(rewards) if rewards else 0, } - print_dict(val_metrics, narrow=True, header=target_dataset_name, mod="evaluation") + print_dict( + val_metrics, + narrow=True, + header=target_dataset_name, + mod="evaluation", + ) self.tracking_logger.log(data=val_metrics, step=self.global_steps) return cmts, tasks, val_metrics - def get_eval_dataset(self): - if self.config.astune.task_reader.type == 'env_service': + if self.config.astune.task_reader.type == "env_service": if self.config.astune.task_reader.env_service.env_type == "appworld": - if hasattr(self, 'main_val_dataset'): + if hasattr(self, "main_val_dataset"): return self.main_val_dataset, None, None else: from astune.task_reader import TaskReaderRouter + task_reader = TaskReaderRouter(self.config) tasks = task_reader.get_validation_tasks() self.main_val_dataset = tasks diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index 943e1b64..ad43d13b 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -15,6 +15,7 @@ from astune.utils.config_utils import read_astune_config from astune.context_tracker.tracker_base_attr import TrackerAttr + class TrinityCompatWorkflow(DynamicRollout): def __init__( @@ -23,8 +24,8 @@ def __init__( llm_handle, tokenizer, config, - llm_mode: Literal['local', 'remote', 'trinity'] = "trinity", - **kwargs + llm_mode: Literal["local", "remote", "trinity"] = "trinity", + **kwargs, ): self.task = task @@ -36,18 +37,18 @@ def __init__( config=self.config, async_rollout_manager=llm_handle, max_parallel=1, - max_llm_retries = 1, + max_llm_retries=1, tokenizer=tokenizer, llm_mode=llm_mode, - **kwargs + **kwargs, ) def convert_task(self, task): - main_query = task.raw_task.get('main_query', "[not defined]") - task_id = task.raw_task.get('task_selector', str(uuid.uuid4().hex)) - env_type = task.raw_task.get('env_type', "[not defined]") - metadata = task.raw_task.get('metadata', {}) - init_messages = task.raw_task.get('init_messages', []) + main_query = task.raw_task.get("main_query", "[not defined]") + task_id = task.raw_task.get("task_selector", str(uuid.uuid4().hex)) + env_type = task.raw_task.get("env_type", "[not defined]") + metadata = task.raw_task.get("metadata", {}) + init_messages = task.raw_task.get("init_messages", []) return Task( main_query=main_query, @@ -59,9 +60,9 @@ def convert_task(self, task): def thread_worker(self): obs_window = { - 'stop': [False], - 'step': [0], - 'token': [0], + "stop": [False], + "step": [0], + "token": [0], } astune_task = self.convert_task(self.task) return self.rollout_env_worker( @@ -70,7 +71,7 @@ def thread_worker(self): task_tag=f"T{astune_task.task_id}#R?", mode="sample", task_thread_index=0, - obs_window=obs_window + obs_window=obs_window, ) def run_in_new_thread(self) -> TrackerAttr: @@ -94,10 +95,10 @@ def _target(): return thread_conclusion - @WORKFLOWS.register_module("astune_workflow") class ASTunetWorkflowWrap(Workflow): is_async: bool = True + def __init__( self, config, @@ -125,7 +126,7 @@ def __init__( async def run_async(self): - yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) + yaml_path = os.environ.get("ASTUNE_CONFIG_REDIRECT", None) if yaml_path is None: raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") @@ -145,7 +146,6 @@ async def run_async(self): cmt.generate_log(global_step=-1) sample_final += sample_arr - exps = [] for index, sample in enumerate(sample_final): sample: Sample @@ -170,26 +170,33 @@ async def run_async(self): reward = reward[0] except Exception as e: reward = cmt.reward_structure.raw_reward - if not isinstance(reward, (float, int)): # if reward is still not a float or int, set it to 0.0 + if not isinstance( + reward, (float, int) + ): # if reward is still not a float or int, set it to 0.0 reward = cmt.reward_structure.raw_reward - if len(response_ids) + len(prompt_ids) == len(input_ids) and \ - len(logprobs) == len(response_ids) and len(logprobs) > 0: + if ( + len(response_ids) + len(prompt_ids) == len(input_ids) + and len(logprobs) == len(response_ids) + and len(logprobs) > 0 + ): exp = Experience( # eid=uuid.uuid4().hex, - tokens = input_ids, # [seq_length] prompt + response - prompt_length = len(prompt_ids), # Length of the prompt in tokens, used for generating attention masks - logprobs = logprobs, # [resp_length] - reward = reward, # + tokens=input_ids, # [seq_length] prompt + response + prompt_length=len( + prompt_ids + ), # Length of the prompt in tokens, used for generating attention masks + logprobs=logprobs, # [resp_length] + reward=reward, # # advantages=None, # returns=None, - info = {}, - metrics = {}, # for wandb logging (must be string:float) - response_text = "", # optional - prompt_text = "", # optional + info={}, + metrics={}, # for wandb logging (must be string:float) + response_text="", # optional + prompt_text="", # optional #### for multi-turn experiences - action_mask = response_loss_mask, # 1 stands for training, 0 stands for ignoring - messages=sample.messages, # + action_mask=response_loss_mask, # 1 stands for training, 0 stands for ignoring + messages=sample.messages, # # tools, #### for dpo experiences # chosen, diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index b4d44ced..66458640 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -4,82 +4,94 @@ from agentscope.model import DashScopeChatModel from astune.schema.trajectory import Reward from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage, replace_token_ids +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + ExtendedMessage, + replace_token_ids, +) from astune.utils.color_hsl import adjust_color_hsl from astune.utils.compute_madness import compute_string_madness from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE -from astune.context_tracker.agentscope_tracker.timeline_merging import merge_tracker_timelines, can_merge_steps +from astune.context_tracker.agentscope_tracker.timeline_merging import ( + merge_tracker_timelines, + can_merge_steps, +) from typing import Any, List, Tuple, Union -from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem +from beast_logger import ( + print_nested, + print_listofdict, + NestedJsonItem, + SeqItem, +) + class MultiAgentContextTracking(BasicContextTracker): def __init__( - self, - llm_chat_fn, - tokenizer:PreTrainedTokenizer, - config, - env_step_fn, - should_interrupt_fn, - generated_token_callback_fn, - **kwargs - ): + self, + llm_chat_fn, + tokenizer: PreTrainedTokenizer, + config, + should_interrupt_fn, + generated_token_callback_fn, + **kwargs, + ): super().__init__(config, tokenizer, **kwargs) self.llm_chat_fn = llm_chat_fn self.tokenizer = tokenizer - self.env_step_fn = env_step_fn self.should_interrupt_fn = should_interrupt_fn self.generated_token_callback_fn = generated_token_callback_fn self.context_overflow = False self.output_kwargs = {} self.input_kwargs = {} - - def step_prepare(self, messages: List[dict], tools: List=[]): + def step_prepare(self, messages: List[dict], tools: List = []): self.full_context = [] - consider_roles = ['user', 'assistant', 'system', 'tool'] + consider_roles = ["user", "assistant", "system", "tool"] disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls if disable_toolcalls: - consider_roles.remove('tool') + consider_roles.remove("tool") for i, msg in enumerate(messages): - if (disable_toolcalls) and (not isinstance(msg['content'], str)): + if (disable_toolcalls) and (not isinstance(msg["content"], str)): continue - if msg['role'] not in consider_roles: + if msg["role"] not in consider_roles: continue - if not isinstance(msg['content'], str): - author = 'env' + if not isinstance(msg["content"], str): + author = "env" ignore = False str_content = "" - for item in msg['content']: - if 'text' not in item: - logger.warning(f"Non-text content in message content detected: {item}. Ignoring.") + for item in msg["content"]: + if "text" not in item: + logger.warning( + f"Non-text content in message content detected: {item}. Ignoring." + ) ignore = True break - if isinstance(item['text'], str): - str_content += str(item['text']) + if isinstance(item["text"], str): + str_content += str(item["text"]) else: str_content = "" - msg['content'] = str_content + msg["content"] = str_content if ignore: continue - msg['content'] = str(msg['content']) # TODO: better handling mm data - if msg['role'] == 'system': - author = 'initialization' - if msg['role'] == 'tool': - author = 'env' + msg["content"] = str(msg["content"]) # TODO: better handling mm data + if msg["role"] == "system": + author = "initialization" + if msg["role"] == "tool": + author = "env" else: - author = 'env' + author = "env" self.full_context += [ ExtendedMessage( author=author, - role=msg['role'], - content=msg['content'], + role=msg["role"], + content=msg["content"], tokenizer=self.tokenizer, tools=tools, - tool_calls=msg['tool_calls'] if 'tool_calls' in msg else [], + tool_calls=(msg["tool_calls"] if "tool_calls" in msg else []), token_generator="auto", ) ] @@ -93,12 +105,21 @@ def step_prepare(self, messages: List[dict], tools: List=[]): return context_safe, info, converted_message, custom_sampling_params - def step_track(self, llm_output, context_safe, converted_message: List[dict], tools: List=[]): + def step_track( + self, + llm_output, + context_safe, + converted_message: List[dict], + tools: List = [], + ): if not self.already_mad_flag: - if compute_string_madness( - completion=llm_output['content'], - checklist=self.config.astune.rollout.compute_madness_checklist - ) < 0.0: + if ( + compute_string_madness( + completion=llm_output["content"], + checklist=self.config.astune.rollout.compute_madness_checklist, + ) + < 0.0 + ): self.already_mad_flag = True # dummy response for now @@ -111,7 +132,7 @@ def step_track(self, llm_output, context_safe, converted_message: List[dict], to llm_ext_msg = ExtendedMessage( author="llm", role="assistant", - content=llm_output['content'], + content=llm_output["content"], token_generator=token_generator, tool_calls=tool_calls, tokenizer=self.tokenizer, @@ -119,23 +140,32 @@ def step_track(self, llm_output, context_safe, converted_message: List[dict], to if token_generator == "manual": input_msg_ref = copy.deepcopy(converted_message) - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output, tools=tools) - assert len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn, \ - f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" + token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response( + input_msg_ref, llm_output, tools=tools + ) + assert ( + len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn + ), f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" llm_ext_msg.token_arr = token_arr_method2 llm_ext_msg.token_logprob_arr = token_logprob_arr self.generated_token_callback_fn(llm_ext_msg.token_arr) # take snapshot of current timeline if context_safe: - self.full_context += [ llm_ext_msg ] + self.full_context += [llm_ext_msg] is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) if length > self.config.astune.rollout.max_model_len: - raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}") + raise RuntimeError( + f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" + ) self.grouped_steps += [copy.deepcopy(self.full_context)] DEBUG = True - if DEBUG and len(self.grouped_steps) >= 2 and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])): + if ( + DEBUG + and len(self.grouped_steps) >= 2 + and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])) + ): print(f"General Warning: merge failure discovered.") return None @@ -144,29 +174,44 @@ def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure ext_steps = self.full_context self.reward_structure.step_reward = [ - self.compute_step_level_reward(ext_steps=ext_steps, index=i, total_steps=len(self.grouped_steps)) + self.compute_step_level_reward( + ext_steps=ext_steps, + index=i, + total_steps=len(self.grouped_steps), + ) for i in range(len(self.grouped_steps)) ] - - def generate_log(self, task_id = None, global_step="NA"): + def generate_log(self, task_id=None, global_step="NA"): task_id = self.task_id nested_items_print_buffer = {} step_reward = 0.0 for index, ext_steps in enumerate(self.grouped_steps): - cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) + cmt_tokenized = self.tokenize_steps( + ext_steps=ext_steps, + index=index, + total_steps=len(self.grouped_steps), + ) text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] # loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] - logprobs = [INVALID_LOG_PROB_VALUE] * len(cmt_tokenized["prompt_ids"]) + cmt_tokenized["response_logprobs"] + logprobs = [INVALID_LOG_PROB_VALUE] * len(cmt_tokenized["prompt_ids"]) + cmt_tokenized[ + "response_logprobs" + ] # Create adjusted color array loss_mask_color_abl_arr = [ - adjust_color_hsl("#09ABCF", logprob) if mask == 1 - else adjust_color_hsl("#D98510", logprob) + ( + adjust_color_hsl("#09ABCF", logprob) + if mask == 1 + else adjust_color_hsl("#D98510", logprob) + ) for mask, logprob in zip(cmt_tokenized["loss_mask"], logprobs) ] - logprob_text_arr = [f"{logprob:.4f}" if logprob != INVALID_LOG_PROB_VALUE else "N/A" for logprob in logprobs] + logprob_text_arr = [ + (f"{logprob:.4f}" if logprob != INVALID_LOG_PROB_VALUE else "N/A") + for logprob in logprobs + ] buffer = { "text_arr": text_arr, @@ -175,7 +220,7 @@ def generate_log(self, task_id = None, global_step="NA"): "loss_mask_color_arr": loss_mask_color_abl_arr, } raw_reward = self.reward_structure.raw_reward - step_reward:float = self.reward_structure.step_reward[index] + step_reward: float = self.reward_structure.step_reward[index] try: step_advantage = self.reward_structure.step_advantage[index] step_advantage_simple = self.reward_structure.step_advantage_simple[index] @@ -187,31 +232,34 @@ def generate_log(self, task_id = None, global_step="NA"): len_prompt_ids = len(cmt_tokenized["prompt_ids"]) len_response_ids = len(cmt_tokenized["response_ids"]) len_input_ids = len(cmt_tokenized["input_ids"]) - assert len_prompt_ids + len_response_ids == len_input_ids, "len_prompt_ids + len_response_ids should equal to len_input_ids" + assert ( + len_prompt_ids + len_response_ids == len_input_ids + ), "len_prompt_ids + len_response_ids should equal to len_input_ids" nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", # type: ignore - outcome=task_outcome, # type: ignore + item_id=f"item", # type: ignore + outcome=task_outcome, # type: ignore len_prompt_ids=len_prompt_ids, # type: ignore len_response_ids=len_response_ids, # type: ignore - len_input_ids=len_input_ids, # type: ignore + len_input_ids=len_input_ids, # type: ignore raw_reward=f"{float(raw_reward):.3f}", # type: ignore - step_reward=f"{float(step_reward):.3f}", # type: ignore + step_reward=f"{float(step_reward):.3f}", # type: ignore step_advantage=f"{float(step_advantage):.3f}", # type: ignore - step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore + step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore content=SeqItem( - text = buffer['text_arr'], # text content - title = buffer['logprob_arr'], # mouse hover text - count = buffer['input_id_arr'], # highlight text # type: ignore - color = buffer['loss_mask_color_arr'] # color - ) + text=buffer["text_arr"], # text content + title=buffer["logprob_arr"], # mouse hover text + count=buffer["input_id_arr"], # highlight text # type: ignore + color=buffer["loss_mask_color_arr"], # color + ), ) - print_nested(nested_items_print_buffer, + print_nested( + nested_items_print_buffer, main_content="This is the main content of the nested JSON", - header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", # type: ignore + header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", # type: ignore mod="rollout", narrow=False, - attach="copy this" # type: ignore + attach="copy this", # type: ignore ) def group_merge(self) -> List[List[ExtendedMessage]]: @@ -226,25 +274,34 @@ def get_inc(self, text_frag_from, text_frag_to): Get the incremental token array from text_frag_from to text_frag_to. """ tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) - tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore + tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore token_ids_acc = tokenizer_input_ids tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) - input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 - else: break + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: + overlap_length += 1 + else: + break msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" # print(msg) return input_id_increment, msg - def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore + def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore dict_messages = self.to_role_content(ext_messages) - prompt_text = self.tokenizer.apply_chat_template(dict_messages, tokenize=False, add_generation_prompt=True, tools=tools) - length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore + prompt_text = self.tokenizer.apply_chat_template( + dict_messages, + tokenize=False, + add_generation_prompt=True, + tools=tools, + ) + length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore max_response_length = self.config.astune.rollout.max_response_length_in_one_turn max_model_len: int = self.config.astune.rollout.max_model_len max_seq_length: int = max_model_len - max_response_length @@ -256,8 +313,10 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], return tuple(ret) def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, str]: - prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, tools=tools) - length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore + prompt_text = self.tokenizer.apply_chat_template( + messages, tokenize=False, add_generation_prompt=True, tools=tools + ) + length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore max_response_length = self.config.astune.rollout.max_response_length_in_one_turn max_model_len: int = self.config.astune.rollout.max_model_len max_seq_length: int = max_model_len - max_response_length @@ -266,7 +325,10 @@ def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tupl if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: ret = [False, "already_mad"] if length < max_seq_length: - ret = [True, f"safe[{length} < {max_model_len} - {max_response_length}]"] + ret = [ + True, + f"safe[{length} < {max_model_len} - {max_response_length}]", + ] else: ret = [False, "token_overflow"] return tuple(ret) @@ -279,13 +341,18 @@ def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: "content": ext_msg.content_for_future, } if ext_msg.tool_calls: - d.update({ - "tool_calls": ext_msg.tool_calls - }) + d.update({"tool_calls": ext_msg.tool_calls}) result.append(d) return result - def apply_chat_template_for_ext_messages(self, ext_messages: List[ExtendedMessage], tools: List = []) -> str: + def apply_chat_template_for_ext_messages( + self, ext_messages: List[ExtendedMessage], tools: List = [] + ) -> str: dict_messages = self.to_role_content(ext_messages) - prompt_text = self.tokenizer.apply_chat_template(dict_messages, tokenize=False, add_generation_prompt=True, tools=tools) + prompt_text = self.tokenizer.apply_chat_template( + dict_messages, + tokenize=False, + add_generation_prompt=True, + tools=tools, + ) return prompt_text # type: ignore diff --git a/astune/context_tracker/agentscope_tracker/timeline_merging.py b/astune/context_tracker/agentscope_tracker/timeline_merging.py index 53c7eba4..4f619405 100644 --- a/astune/context_tracker/agentscope_tracker/timeline_merging.py +++ b/astune/context_tracker/agentscope_tracker/timeline_merging.py @@ -1,18 +1,33 @@ from typing import List, Type -from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage, replace_token_ids -from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + ExtendedMessage, + replace_token_ids, +) +from beast_logger import ( + print_nested, + print_listofdict, + NestedJsonItem, + SeqItem, +) -def can_merge_steps(source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage], debug=False) -> bool: +def can_merge_steps( + source_timeline: List[ExtendedMessage], + target_timeline: List[ExtendedMessage], + debug=False, +) -> bool: can_merge = False - compare_level = 'text' # relaxed compare with text, more easier to match, at very little cost + compare_level = "text" # relaxed compare with text, more easier to match, at very little cost if len(source_timeline) >= len(target_timeline): all_msg_match = True for i in range(len(target_timeline)): - if compare_level == 'text': - same = source_timeline[i].content_for_future == target_timeline[i].content_for_future - elif compare_level == 'token': + if compare_level == "text": + same = ( + source_timeline[i].content_for_future == target_timeline[i].content_for_future + ) + elif compare_level == "token": same = source_timeline[i].token_arr == target_timeline[i].token_arr else: raise NotImplementedError @@ -28,32 +43,39 @@ def can_merge_steps(source_timeline: List[ExtendedMessage], target_timeline: Lis all_msg_match = False for i in range(len(target_timeline)): d = {} - d['source'] = source_timeline[i].content_for_future - d['target'] = target_timeline[i].content_for_future - if compare_level == 'text': - same = source_timeline[i].content_for_future == target_timeline[i].content_for_future - elif compare_level == 'token': + d["source"] = source_timeline[i].content_for_future + d["target"] = target_timeline[i].content_for_future + if compare_level == "text": + same = ( + source_timeline[i].content_for_future + == target_timeline[i].content_for_future + ) + elif compare_level == "token": same = source_timeline[i].token_arr == target_timeline[i].token_arr else: raise NotImplementedError if not same: - d['match'] = 'NO' + d["match"] = "NO" else: - d['match'] = 'YES' + d["match"] = "YES" debug_listofdict.append(d) print_listofdict(debug_listofdict, header=f"can_merge_steps debug: {can_merge}") return can_merge +def merge_tracker_timelines( + timelines: List[List[ExtendedMessage]], +) -> List[List[ExtendedMessage]]: -def merge_tracker_timelines(timelines: List[List[ExtendedMessage]]) -> List[List[ExtendedMessage]]: - - def toggle_author(source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage]) -> List[ExtendedMessage]: + def toggle_author( + source_timeline: List[ExtendedMessage], + target_timeline: List[ExtendedMessage], + ) -> List[ExtendedMessage]: # if any message in `target_timeline` is author == 'llm', but same-index message in `source_timeline` is author != 'llm' # change source_timeline's message author to 'llm' for i in range(len(target_timeline)): - if target_timeline[i].author == 'llm' and source_timeline[i].author != 'llm': + if target_timeline[i].author == "llm" and source_timeline[i].author != "llm": source_timeline[i].author = target_timeline[i].author source_timeline[i].token_arr = target_timeline[i].token_arr source_timeline[i].token_logprob_arr = target_timeline[i].token_logprob_arr @@ -66,7 +88,7 @@ def toggle_author(source_timeline: List[ExtendedMessage], target_timeline: List[ if i in absorbed_step_indices: continue # check whether [i, len(reversed_timelines)-1] can be merged - for j in range(i+1, len(reversed_timelines)): + for j in range(i + 1, len(reversed_timelines)): if j in absorbed_step_indices: continue source_timeline = reversed_timelines[i] diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index cb76ccdc..929fe9e2 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -8,7 +8,14 @@ from astune.context_tracker.tracker_base_attr import TrackerAttr from astune.context_tracker.tracker_base_attr import ExtendedMessage from astune.context_tracker.tracker_base_attr import replace_token_ids -from beast_logger import register_logger, print_dict, print_listofdict, print_nested, NestedJsonItem, SeqItem +from beast_logger import ( + register_logger, + print_dict, + print_listofdict, + print_nested, + NestedJsonItem, + SeqItem, +) class BasicContextTracker(TrackerAttr): @@ -38,9 +45,7 @@ class BasicContextTracker(TrackerAttr): 9. group_tokenize """ - - - def prepare_previous_context(self, mod='future'): + def prepare_previous_context(self, mod="future"): """ Prepare the input context for future LLM call. @@ -48,18 +53,28 @@ def prepare_previous_context(self, mod='future'): list: Array of message dictionaries containing role and content_for_future, formatted for LLM input. """ - if mod=='future': + if mod == "future": message_arr = [ - {"role": c.role, "content": c.content_for_future, "tool_calls": c.tool_calls} + { + "role": c.role, + "content": c.content_for_future, + "tool_calls": c.tool_calls, + } for c in self.full_context ] - elif mod=='raw': + elif mod == "raw": message_arr = [ - {"role": c.role, "content": c.content, "tool_calls": c.tool_calls} + { + "role": c.role, + "content": c.content, + "tool_calls": c.tool_calls, + } for c in self.full_context ] else: - raise ValueError(f"Unknown mod {mod} in prepare_previous_context, only support 'future' and 'raw'") + raise ValueError( + f"Unknown mod {mod} in prepare_previous_context, only support 'future' and 'raw'" + ) # remove tool_calls from messages if empty for i in range(len(message_arr)): @@ -67,24 +82,30 @@ def prepare_previous_context(self, mod='future'): message_arr[i].pop("tool_calls") return message_arr - def check_context_token_num_safe(self, messages: List[dict], tools: List[dict] = []) -> Tuple[bool, str]: + def check_context_token_num_safe( + self, messages: List[dict], tools: List[dict] = [] + ) -> Tuple[bool, str]: def get_seq_length(messages): prompt_text = self.tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, - tools=tools + tools=tools, ) - return len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) + return len( + self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0] + ) + if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: return False, "already_mad" messages = self.prepare_previous_context(mod="raw") - if get_seq_length(messages) < self.max_seq_length: # self.config.env_engine.max_seq_length = 20480 + if ( + get_seq_length(messages) < self.max_seq_length + ): # self.config.env_engine.max_seq_length = 20480 return True, "safe" else: return False, "token_overflow" - def get_inc(self, text_frag_from, text_frag_to): """ Get the incremental token array from text_frag_from to text_frag_to. @@ -95,11 +116,15 @@ def get_inc(self, text_frag_from, text_frag_to): tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) input_ids = tokenizer_output["input_ids"][0].tolist() - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 - else: break + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: + overlap_length += 1 + else: + break msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" # print(msg) return input_id_increment, msg @@ -109,23 +134,25 @@ def remove_last_context(self): if self.full_context[-1].author != "llm": self.full_context.pop(-1) - def remove_last_non_llm_msg(self, ext_msg_list:List[ExtendedMessage]): + def remove_last_non_llm_msg(self, ext_msg_list: List[ExtendedMessage]): if len(ext_msg_list) > 0: if ext_msg_list[-1].author != "llm": ext_msg_list.pop(-1) return ext_msg_list - @property def steps(self): - return self.prepare_previous_context(mod='future') - + return self.prepare_previous_context(mod="future") def prepare_next_llm_context(self): - return self.prepare_previous_context(mod='future') - - - def save_init_input(self, init_input_arr:list, add_nothink: bool=False, tools: List[dict]=[]): + return self.prepare_previous_context(mod="future") + + def save_init_input( + self, + init_input_arr: list, + add_nothink: bool = False, + tools: List[dict] = [], + ): """ Save and process the initial input messages to the context. @@ -142,11 +169,11 @@ def save_init_input(self, init_input_arr:list, add_nothink: bool=False, tools: L assert len(self.full_context) == 0, "full_context should be empty when saving init input" for index, llm_msg in enumerate(init_input_arr): if (index == len(init_input_arr) - 1) and add_nothink: - llm_msg['content'] += "\n/no_think" + llm_msg["content"] += "\n/no_think" ext_msg = ExtendedMessage( author="initialization", - role=llm_msg['role'], - content=llm_msg['content'], + role=llm_msg["role"], + content=llm_msg["content"], token_generator="manual", tokenizer=self.tokenizer, ) @@ -154,16 +181,26 @@ def save_init_input(self, init_input_arr:list, add_nothink: bool=False, tools: L # compute token array for each message token_ids_acc = [] - for llm_msg, ext_msg, index in zip(init_input_arr, self.full_context, range(len(init_input_arr))): - text_with_chat_template = self.tokenizer.apply_chat_template(init_input_arr[:(index+1)], tokenize=False, tools=tools) - tokenizer_output = self.tokenizer(text_with_chat_template, return_tensors="pt", padding=False) + for llm_msg, ext_msg, index in zip( + init_input_arr, self.full_context, range(len(init_input_arr)) + ): + text_with_chat_template = self.tokenizer.apply_chat_template( + init_input_arr[: (index + 1)], tokenize=False, tools=tools + ) + tokenizer_output = self.tokenizer( + text_with_chat_template, return_tensors="pt", padding=False + ) input_ids = tokenizer_output["input_ids"][0].tolist() # attention_mask = outputs["attention_mask"][0].tolist() - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): - if (i < len(token_ids_acc)) and (input_ids[i] == token_ids_acc[i]): overlap_length += 1 - else: break + if (i < len(token_ids_acc)) and (input_ids[i] == token_ids_acc[i]): + overlap_length += 1 + else: + break ext_msg._info = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" ext_msg.token_arr = input_id_increment token_ids_acc += input_ids @@ -185,44 +222,71 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= """ # save basic assert isinstance(llm_output, dict) - token_generator = "manual" if 'tokens' in llm_output else "auto" + token_generator = "manual" if "tokens" in llm_output else "auto" ext_msg = ExtendedMessage( author="llm", - role=llm_output['role'], - content=llm_output['content'], + role=llm_output["role"], + content=llm_output["content"], token_generator=token_generator, tokenizer=self.tokenizer, ) if auto_register_full_context: self.full_context += [ext_msg] if not self.already_mad_flag: - if compute_string_madness(completion=llm_output['content'], checklist=self.config.astune.rollout.compute_madness_checklist) < 0.0: + if ( + compute_string_madness( + completion=llm_output["content"], + checklist=self.config.astune.rollout.compute_madness_checklist, + ) + < 0.0 + ): self.already_mad_flag = True if token_generator == "manual": - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output) + token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response( + input_msg_ref, llm_output + ) ext_msg.token_arr = token_arr_method2 ext_msg.token_logprob_arr = token_logprob_arr return ext_msg # generate token - def get_token_inc_from_vllm_response(self, input_msg_ref, llm_output, tools: List[dict]=[]) -> Tuple[List[int], List[int]]: + def get_token_inc_from_vllm_response( + self, input_msg_ref, llm_output, tools: List[dict] = [] + ) -> Tuple[List[int], List[int]]: generation_prompt_token, msg = self.get_inc( - self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=False, tools=tools), - self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=True, tools=tools), + self.tokenizer.apply_chat_template( + input_msg_ref, + tokenize=False, + add_generation_prompt=False, + tools=tools, + ), + self.tokenizer.apply_chat_template( + input_msg_ref, + tokenize=False, + add_generation_prompt=True, + tools=tools, + ), ) # completion_token_arr will contain generation_prompt header - llm_output_role_content = { "role": llm_output['role'], "content": llm_output['content'] } - if not llm_output.get('tool_calls', None): - llm_output_role_content.update({ "tool_calls": llm_output.get('tool_calls', []) }) + llm_output_role_content = { + "role": llm_output["role"], + "content": llm_output["content"], + } + if not llm_output.get("tool_calls", None): + llm_output_role_content.update({"tool_calls": llm_output.get("tool_calls", [])}) completion_token_arr, msg2 = self.get_inc( self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, tools=tools), - self.tokenizer.apply_chat_template(input_msg_ref + [ llm_output_role_content ], tokenize=False, tools=tools), + self.tokenizer.apply_chat_template( + input_msg_ref + [llm_output_role_content], + tokenize=False, + tools=tools, + ), ) - vllm_output_raw_token = [t.token_id for t in llm_output['tokens']] - vllm_output_raw_logprob = [t.logprob for t in llm_output['tokens']] + vllm_output_raw_token = [t.token_id for t in llm_output["tokens"]] + vllm_output_raw_logprob = [t.logprob for t in llm_output["tokens"]] self.generated_token_cnt += len(vllm_output_raw_token) final_token_arr, token_logprob_arr = replace_token_ids( place_holder=completion_token_arr, @@ -234,10 +298,16 @@ def get_token_inc_from_vllm_response(self, input_msg_ref, llm_output, tools: Lis return final_token_arr, token_logprob_arr def save_llm_output_do_not_register_full_context(self, llm_output, input_msg_ref): - return BasicContextTracker.save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context=False) - + return BasicContextTracker.save_llm_output( + self, llm_output, input_msg_ref, auto_register_full_context=False + ) - def save_env_output(self, env_output:dict, input_msg_ref:Optional[List[dict]]=None, add_nothink=False): + def save_env_output( + self, + env_output: dict, + input_msg_ref: Optional[List[dict]] = None, + add_nothink=False, + ): """ Save and process environment output to the context. @@ -251,16 +321,18 @@ def save_env_output(self, env_output:dict, input_msg_ref:Optional[List[dict]]=No - Computes and stores token arrays for the environment response """ assert isinstance(env_output, dict) - if ('content' not in env_output) and ('error' in env_output): - env_output['content'] = f"[Error from environment: {env_output['error']}]" - elif ('content' not in env_output) or (not env_output['content']): - env_output['content'] = 'Warning: the environment does not provide any feedback, please provide valid inpu and try again.' + if ("content" not in env_output) and ("error" in env_output): + env_output["content"] = f"[Error from environment: {env_output['error']}]" + elif ("content" not in env_output) or (not env_output["content"]): + env_output["content"] = ( + "Warning: the environment does not provide any feedback, please provide valid inpu and try again." + ) if add_nothink: - env_output['content'] += " /no_think" + env_output["content"] += " /no_think" ext_msg = ExtendedMessage( author="env", role="user", - content=env_output['content'], + content=env_output["content"], clip=True, clip_token_limit=self.max_env_output_length, token_generator="auto", @@ -297,25 +369,30 @@ def prepare_world_interaction(self) -> str: return latest_content def filter_context_via_author(self, author: str) -> List[ExtendedMessage]: - return copy.deepcopy([ c for c in self.full_context if c.author == author ]) + return copy.deepcopy([c for c in self.full_context if c.author == author]) def filter_context_via_authors(self, authors: List[str]) -> List[ExtendedMessage]: - return copy.deepcopy([ c for c in self.full_context if c.author in authors ]) + return copy.deepcopy([c for c in self.full_context if c.author in authors]) - def filter_context_via_authors_with_limit(self, authors: List[str], limit: dict) -> List[ExtendedMessage]: + def filter_context_via_authors_with_limit( + self, authors: List[str], limit: dict + ) -> List[ExtendedMessage]: """ limit = { "llm": "keep_last@2" "env": "keep_first@2" } """ - filtered_via_authors = copy.deepcopy([ c for c in self.full_context if c.author in authors ]) + filtered_via_authors = copy.deepcopy([c for c in self.full_context if c.author in authors]) for limit_author, limit_item in limit.items(): - limit_item_command, limit_item_value = limit_item.split('@') + limit_item_command, limit_item_value = limit_item.split("@") if limit_item_command == "keep_last": limit_item_value = int(limit_item_value) # remove all message whose author is `llm_author` except the last `limit_item_value` messages - num_need_rm = len([ c for c in filtered_via_authors if c.author == limit_author ]) - limit_item_value + num_need_rm = ( + len([c for c in filtered_via_authors if c.author == limit_author]) + - limit_item_value + ) if num_need_rm > 0: num_already_rm = 0 filtered_via_authors_new = [] @@ -330,7 +407,10 @@ def filter_context_via_authors_with_limit(self, authors: List[str], limit: dict) elif limit_item_command == "keep_first": limit_item_value = int(limit_item_value) # remove all message whose author is `llm_author` except the first `limit_item_value` messages - num_need_keep = len([ c for c in filtered_via_authors if c.author == limit_author ]) - limit_item_value + num_need_keep = ( + len([c for c in filtered_via_authors if c.author == limit_author]) + - limit_item_value + ) if num_need_keep > 0: num_already_keep = 0 filtered_via_authors_new = [] @@ -343,7 +423,9 @@ def filter_context_via_authors_with_limit(self, authors: List[str], limit: dict) filtered_via_authors = filtered_via_authors_new else: - raise ValueError(f"Unknown limit_item_command {limit_item_command} in filter_context_via_authors_with_limit") + raise ValueError( + f"Unknown limit_item_command {limit_item_command} in filter_context_via_authors_with_limit" + ) return filtered_via_authors def group_tokenize(self): @@ -351,10 +433,9 @@ def group_tokenize(self): ext_steps = self.full_context cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=0, total_steps=1) sample = Sample( - cmt_tokenized = cmt_tokenized, + cmt_tokenized=cmt_tokenized, messages=self.to_role_content(ext_steps), config=self.config, - task_batch_index=self.task_batch_index, task_tag=self.task_tag, task_id=self.task_id, @@ -367,12 +448,15 @@ def group_tokenize_multi_group(self): sample_arr = [] max_num_group = self.config.astune.rollout.multi_turn.max_sample_per_task for index, ext_steps in enumerate(self.grouped_steps): - cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) + cmt_tokenized = self.tokenize_steps( + ext_steps=ext_steps, + index=index, + total_steps=len(self.grouped_steps), + ) sample = Sample( - cmt_tokenized = cmt_tokenized, + cmt_tokenized=cmt_tokenized, messages=self.to_role_content(ext_steps), config=self.config, - task_batch_index=self.task_batch_index, task_tag=self.task_tag, task_id=self.task_id, @@ -382,6 +466,7 @@ def group_tokenize_multi_group(self): if len(sample_arr) > max_num_group: print(f"Warning: allow {max_num_group} groups, but got {len(sample_arr)} groups") import random + sample_arr = random.sample(sample_arr, max_num_group) # preserve max_num_group groups return sample_arr @@ -389,11 +474,13 @@ def group_tokenize_multi_group(self): def generate_log(self, task_id=None, global_step="NA"): task_id = self.task_id nested_items_print_buffer = {} - ext_steps=self.full_context + ext_steps = self.full_context cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=0, total_steps=1) text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] - loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] + loss_mask_color_arr = [ + "#09ABCF" if mask == 1 else "#D98510" for mask in cmt_tokenized["loss_mask"] + ] buffer = { "text_arr": text_arr, "input_id_arr": input_id_arr, @@ -413,30 +500,30 @@ def generate_log(self, task_id=None, global_step="NA"): task_outcome = str(self.reward_structure.success_rate) selectors = [task_id, task_outcome] nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", # type: ignore - outcome=task_outcome, # type: ignore + item_id=f"item", # type: ignore + outcome=task_outcome, # type: ignore len_prompt_ids=len_prompt_ids, # type: ignore len_response_ids=len_response_ids, # type: ignore - len_input_ids=len_input_ids, # type: ignore + len_input_ids=len_input_ids, # type: ignore raw_reward=f"{float(raw_reward):.3f}", # type: ignore - step_reward=f"{float(step_reward):.3f}", # type: ignore + step_reward=f"{float(step_reward):.3f}", # type: ignore step_advantage=f"{float(step_advantage):.3f}", # type: ignore - step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore + step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore content=SeqItem( - text = buffer['text_arr'], # text content - title = buffer['text_arr'], # mouse hover text - count = buffer['input_id_arr'], # h highlight text - color = buffer['loss_mask_color_arr'] # color - ) + text=buffer["text_arr"], # text content + title=buffer["text_arr"], # mouse hover text + count=buffer["input_id_arr"], # h highlight text + color=buffer["loss_mask_color_arr"], # color + ), ) - print_nested(nested_items_print_buffer, + print_nested( + nested_items_print_buffer, main_content="This is the main content of the nested JSON", header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", mod="rollout", - narrow=False + narrow=False, ) - def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure ext_steps = self.full_context @@ -445,13 +532,13 @@ def process_reward(self, reward_structure: Reward): self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) ] - def ensure_terminate_rollout_stage(self): - """Nothing need to be done for basic linear cmt at `ensure_terminate_rollout_stage` - """ + """Nothing need to be done for basic linear cmt at `ensure_terminate_rollout_stage`""" pass - def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int, total_steps:int)->float: + def compute_step_level_reward( + self, ext_steps: List[ExtendedMessage], index: int, total_steps: int + ) -> float: assert self.reward_structure is not None # --------------- global level reward --------------- @@ -467,9 +554,9 @@ def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int return step_reward - - - def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_steps:int) -> dict: + def tokenize_steps( + self, ext_steps: List[ExtendedMessage], index: int, total_steps: int + ) -> dict: """ Create an Experience object from the current conversation context. @@ -484,11 +571,14 @@ def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_step - Truncates output IDs as needed """ from verl.utils.model import compute_position_id_with_mask + ext_steps = self.remove_last_non_llm_msg(ext_steps) # check reward structure - self.reward_structure: Reward # type: ignore - assert self.reward_structure.step_reward is not None, "must call `process_reward` before tokenize_steps" + self.reward_structure: Reward # type: ignore + assert ( + self.reward_structure.step_reward is not None + ), "must call `process_reward` before tokenize_steps" assert len(self.reward_structure.step_reward) == total_steps # mapping @@ -506,9 +596,13 @@ def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_step if (split_prompt_reponse_index == -1) and (ext_msg.need_training): split_prompt_reponse_index = len(input_ids) split_point_message_left_index = i - 1 - assert split_point_message_left_index >= 0, "There should be at least one message before the first training message" + assert ( + split_point_message_left_index >= 0 + ), "There should be at least one message before the first training message" assert split_prompt_reponse_index == input_ids_len[split_point_message_left_index] - assert ext_msg.author == 'llm', "The first message after initialization should be from LLM, not from env or user" + assert ( + ext_msg.author == "llm" + ), "The first message after initialization should be from LLM, not from env or user" # cat all tokens input_ids += ext_msg.token_arr @@ -524,49 +618,62 @@ def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_step # should we begin split point early? if input_ids_len[-1] > self.config.astune.data.max_prompt_length: message_dict = self.to_role_content(ext_steps) - logger.error(f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix...") - logger.bind(exception=True).exception(f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix...\n\n" + str(message_dict)) - assert i >= 1, "There should be at least one message before exceeding max_prompt_length" - assert input_ids_len[-2] <= self.config.astune.data.max_prompt_length, "The previous message should be within max_prompt_length, something is wrong" + logger.error( + f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix..." + ) + logger.bind(exception=True).exception( + f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix...\n\n" + + str(message_dict) + ) + assert ( + i >= 1 + ), "There should be at least one message before exceeding max_prompt_length" + assert ( + input_ids_len[-2] <= self.config.astune.data.max_prompt_length + ), "The previous message should be within max_prompt_length, something is wrong" split_point_message_left_index = i - 1 assert split_point_message_left_index == (len(input_ids_len) - 2), "what?" split_prompt_reponse_index = input_ids_len[split_point_message_left_index] # check - assert len(ext_steps) == len(input_ids_len), "length of ext_steps and input_ids_len should be equal" - assert split_prompt_reponse_index != -1, "split_prompt_reponse_index should not be -1, at least one message should be in the context" + assert len(ext_steps) == len( + input_ids_len + ), "length of ext_steps and input_ids_len should be equal" + assert ( + split_prompt_reponse_index != -1 + ), "split_prompt_reponse_index should not be -1, at least one message should be in the context" position_ids = compute_position_id_with_mask(torch.tensor(attention_mask)).tolist() # sperate prompt and response - prompt_ids = input_ids[:split_prompt_reponse_index] + prompt_ids = input_ids[:split_prompt_reponse_index] prompt_attention_mask = attention_mask[:split_prompt_reponse_index] - prompt_position_ids = position_ids[:split_prompt_reponse_index] - prompt_loss_mask = loss_mask[:split_prompt_reponse_index] - prompt_logprobs = input_logprobs[:split_prompt_reponse_index] + prompt_position_ids = position_ids[:split_prompt_reponse_index] + prompt_loss_mask = loss_mask[:split_prompt_reponse_index] + prompt_logprobs = input_logprobs[:split_prompt_reponse_index] - response_ids = input_ids[split_prompt_reponse_index:] - response_attention_mask = attention_mask[split_prompt_reponse_index:] - response_position_ids = position_ids[split_prompt_reponse_index:] - response_loss_mask = loss_mask[split_prompt_reponse_index:] - response_logprobs = input_logprobs[split_prompt_reponse_index:] + response_ids = input_ids[split_prompt_reponse_index:] + response_attention_mask = attention_mask[split_prompt_reponse_index:] + response_position_ids = position_ids[split_prompt_reponse_index:] + response_loss_mask = loss_mask[split_prompt_reponse_index:] + response_logprobs = input_logprobs[split_prompt_reponse_index:] cmt_tokenized = {} - cmt_tokenized["input_ids"] = input_ids - cmt_tokenized["prompt_ids"] = prompt_ids - cmt_tokenized["response_ids"] = response_ids - cmt_tokenized["attention_mask"] = attention_mask - cmt_tokenized["logprobs"] = input_logprobs - cmt_tokenized["prompt_attention_mask"] = prompt_attention_mask - cmt_tokenized["response_attention_mask"] = response_attention_mask - cmt_tokenized["loss_mask"] = loss_mask - cmt_tokenized["prompt_loss_mask"] = prompt_loss_mask - cmt_tokenized["response_loss_mask"] = response_loss_mask - cmt_tokenized["position_ids"] = position_ids - cmt_tokenized["prompt_position_ids"] = prompt_position_ids - cmt_tokenized["response_position_ids"] = response_position_ids - cmt_tokenized["step_reward"] = self.reward_structure.step_reward[index] - cmt_tokenized["response_logprobs"] = response_logprobs - cmt_tokenized["prompt_logprobs"] = prompt_logprobs + cmt_tokenized["input_ids"] = input_ids + cmt_tokenized["prompt_ids"] = prompt_ids + cmt_tokenized["response_ids"] = response_ids + cmt_tokenized["attention_mask"] = attention_mask + cmt_tokenized["logprobs"] = input_logprobs + cmt_tokenized["prompt_attention_mask"] = prompt_attention_mask + cmt_tokenized["response_attention_mask"] = response_attention_mask + cmt_tokenized["loss_mask"] = loss_mask + cmt_tokenized["prompt_loss_mask"] = prompt_loss_mask + cmt_tokenized["response_loss_mask"] = response_loss_mask + cmt_tokenized["position_ids"] = position_ids + cmt_tokenized["prompt_position_ids"] = prompt_position_ids + cmt_tokenized["response_position_ids"] = response_position_ids + cmt_tokenized["step_reward"] = self.reward_structure.step_reward[index] + cmt_tokenized["response_logprobs"] = response_logprobs + cmt_tokenized["prompt_logprobs"] = prompt_logprobs try: cmt_tokenized["reference_advantage"] = self.reward_structure.step_advantage[index] except: diff --git a/astune/context_tracker/tracker_base_attr.py b/astune/context_tracker/tracker_base_attr.py index 0ce9b071..ad7b8550 100644 --- a/astune/context_tracker/tracker_base_attr.py +++ b/astune/context_tracker/tracker_base_attr.py @@ -7,19 +7,25 @@ from loguru import logger -def replace_token_ids(place_holder, replace_with, begin, end, raw_logprob) -> Tuple[List[int], List[int]]: +def replace_token_ids( + place_holder, replace_with, begin, end, raw_logprob +) -> Tuple[List[int], List[int]]: _begin_index = find_sublist_indices(place_holder, begin) + len(begin) _end_index = find_sublist_indices(place_holder, end, reverse=True) - if replace_with[-len(end):] == end: # remove end token - replace_with = replace_with[:-len(end)] - raw_logprob = raw_logprob[:-len(end)] - if replace_with[:len(begin)] == begin: # remove begin token - replace_with = replace_with[len(begin):] - raw_logprob = raw_logprob[len(begin):] + if replace_with[-len(end) :] == end: # remove end token + replace_with = replace_with[: -len(end)] + raw_logprob = raw_logprob[: -len(end)] + if replace_with[: len(begin)] == begin: # remove begin token + replace_with = replace_with[len(begin) :] + raw_logprob = raw_logprob[len(begin) :] final = place_holder[:_begin_index] + replace_with + place_holder[_end_index:] - final_logprob = [INVALID_LOG_PROB_VALUE] * _begin_index + raw_logprob + [INVALID_LOG_PROB_VALUE] * (len(place_holder) - _end_index) + final_logprob = ( + [INVALID_LOG_PROB_VALUE] * _begin_index + + raw_logprob + + [INVALID_LOG_PROB_VALUE] * (len(place_holder) - _end_index) + ) return final, final_logprob @@ -46,8 +52,11 @@ def __init__(self, config, tokenizer, **kwargs): self.reward_structure: Union[Reward, None] = None self.context_time_cost = 0 self.tag = "" - self.current_batch_success_rate:float = -1.0 + self.current_batch_success_rate: float = -1.0 self.already_mad_flag = False self.round_cnt = 0 - assert self.config.astune.data.max_prompt_length + self.config.astune.data.max_response_length <= max_model_len + assert ( + self.config.astune.data.max_prompt_length + self.config.astune.data.max_response_length + <= max_model_len + ) diff --git a/astune/main_trinity.py b/astune/main_trinity.py index ab55a6d6..62e54e0c 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -18,7 +18,11 @@ from trinity.explorer.explorer import Explorer from trinity.manager.state_manager import StateManager from trinity.trainer.trainer import Trainer -from trinity.utils.dlc_utils import is_running, setup_ray_cluster, stop_ray_cluster +from trinity.utils.dlc_utils import ( + is_running, + setup_ray_cluster, + stop_ray_cluster, +) from trinity.utils.log import get_logger from trinity.utils.plugin_loader import load_plugins @@ -175,6 +179,7 @@ def run(config_path: str, dlc: bool = False, plugin_dir: str = None): if os.path.exists(".env"): from dotenv import load_dotenv + load_dotenv(".env") atexit.register(lambda: send_train_message("0000")) @@ -182,7 +187,6 @@ def run(config_path: str, dlc: bool = False, plugin_dir: str = None): if plugin_dir: os.environ[PLUGIN_DIRS_ENV_VAR] = plugin_dir - load_plugins() config = load_config(config_path) @@ -305,7 +309,9 @@ def main() -> None: help="Path to the directory containing plugin modules.", ) run_parser.add_argument( - "--dlc", action="store_true", help="Specify when running in Aliyun PAI DLC." + "--dlc", + action="store_true", + help="Specify when running in Aliyun PAI DLC.", ) # studio command diff --git a/astune/main_verl.py b/astune/main_verl.py index 6f2b30b2..93696002 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -30,6 +30,7 @@ from verl.utils.import_utils import load_extern_type from beast_logger import register_logger, print_dict + @hydra.main(config_path="config", config_name="ppo_trainer", version_base=None) def main(config): """Main entry point for PPO training with Hydra configuration management. @@ -52,26 +53,31 @@ def run_ppo(config) -> None: # Check if Ray is not initialized if not ray.is_initialized(): # this is for local ray cluster - runtime_env={ - "env_vars": - { - "TOKENIZERS_PARALLELISM": "true", - "NCCL_DEBUG": "WARN", - "VLLM_LOGGING_LEVEL": "WARN", - "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", - "VLLM_USE_V1": "1", - "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY"), - } + runtime_env = { + "env_vars": { + "TOKENIZERS_PARALLELISM": "true", + "NCCL_DEBUG": "WARN", + "VLLM_LOGGING_LEVEL": "WARN", + "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", + "VLLM_USE_V1": "1", + "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY"), + } } if os.getenv("RAY_record_task_actor_creation_sites"): - runtime_env["env_vars"].update({ - "RAY_record_task_actor_creation_sites": os.getenv("RAY_record_task_actor_creation_sites"), - }) + runtime_env["env_vars"].update( + { + "RAY_record_task_actor_creation_sites": os.getenv( + "RAY_record_task_actor_creation_sites" + ), + } + ) if os.getenv("BEST_LOGGER_WEB_SERVICE_URL"): - runtime_env["env_vars"].update({ - "BEST_LOGGER_WEB_SERVICE_URL": os.getenv("BEST_LOGGER_WEB_SERVICE_URL"), - }) + runtime_env["env_vars"].update( + { + "BEST_LOGGER_WEB_SERVICE_URL": os.getenv("BEST_LOGGER_WEB_SERVICE_URL"), + } + ) print_dict(runtime_env["env_vars"], "runtime_env") ray.init( runtime_env=runtime_env, @@ -90,7 +96,9 @@ def run_ppo(config) -> None: ): from verl.utils.import_utils import is_nvtx_available - assert is_nvtx_available(), "nvtx is not available in CUDA platform. Please 'pip3 install nvtx'" + assert ( + is_nvtx_available() + ), "nvtx is not available in CUDA platform. Please 'pip3 install nvtx'" nsight_options = OmegaConf.to_container(config.trainer.controller_nsight_options) runner = TaskRunner.options(runtime_env={"nsight": nsight_options}).remote() else: @@ -136,7 +144,8 @@ def run(self, config): # Download the checkpoint from HDFS to the local machine. # `use_shm` determines whether to use shared memory, which could lead to faster model loading if turned on local_path = copy_to_local( - config.astune.model.path, use_shm=config.actor_rollout_ref.model.get("use_shm", False) + config.astune.model.path, + use_shm=config.actor_rollout_ref.model.get("use_shm", False), ) # Instantiate the tokenizer and processor. @@ -151,7 +160,10 @@ def run(self, config): if config.actor_rollout_ref.actor.strategy in {"fsdp", "fsdp2"}: assert config.critic.strategy in {"fsdp", "fsdp2"} from verl.single_controller.ray import RayWorkerGroup - from verl.workers.fsdp_workers import ActorRolloutRefWorker, AsyncActorRolloutRefWorker + from verl.workers.fsdp_workers import ( + ActorRolloutRefWorker, + AsyncActorRolloutRefWorker, + ) use_legacy_worker_impl = config.trainer.get("use_legacy_worker_impl", "auto") if use_legacy_worker_impl in ["auto", "enable"]: @@ -175,8 +187,14 @@ def run(self, config): elif config.actor_rollout_ref.actor.strategy == "megatron": assert config.actor_rollout_ref.actor.strategy == config.critic.strategy - from verl.single_controller.ray.megatron import NVMegatronRayWorkerGroup - from verl.workers.megatron_workers import ActorRolloutRefWorker, AsyncActorRolloutRefWorker, CriticWorker + from verl.single_controller.ray.megatron import ( + NVMegatronRayWorkerGroup, + ) + from verl.workers.megatron_workers import ( + ActorRolloutRefWorker, + AsyncActorRolloutRefWorker, + CriticWorker, + ) actor_rollout_cls = ( AsyncActorRolloutRefWorker @@ -188,7 +206,10 @@ def run(self, config): else: raise NotImplementedError - from astune.backbone.native_compat_trainer import ResourcePoolManager, Role + from astune.backbone.native_compat_trainer import ( + ResourcePoolManager, + Role, + ) # Map roles to their corresponding remote worker classes. role_worker_mapping = { @@ -230,24 +251,37 @@ def run(self, config): # Load the reward manager for training and validation. reward_fn = load_reward_manager( - config, tokenizer, num_examine=0, **config.reward_model.get("reward_kwargs", {}) + config, + tokenizer, + num_examine=0, + **config.reward_model.get("reward_kwargs", {}), ) val_reward_fn = load_reward_manager( - config, tokenizer, num_examine=1, **config.reward_model.get("reward_kwargs", {}) + config, + tokenizer, + num_examine=1, + **config.reward_model.get("reward_kwargs", {}), + ) + resource_pool_manager = ResourcePoolManager( + resource_pool_spec=resource_pool_spec, mapping=mapping ) - resource_pool_manager = ResourcePoolManager(resource_pool_spec=resource_pool_spec, mapping=mapping) from verl.utils.dataset.rl_dataset import collate_fn from astune.utils.process_dataset import create_rl_sampler # Create training and validation datasets. - from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + from astune.task_reader import ( + TaskReaderRouter, + task_to_standard_dataset, + ) + task_reader = TaskReaderRouter(config) val_dataset = task_to_standard_dataset(task_reader.get_validation_tasks()) train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) from astune.backbone.native_compat_trainer import ASTuneRayPPOTrainer + # Initialize the PPO trainer. trainer = ASTuneRayPPOTrainer( config=config, @@ -270,6 +304,5 @@ def run(self, config): trainer.fit() - if __name__ == "__main__": main() diff --git a/astune/main_vllm.py b/astune/main_vllm.py index af82b422..ff595b1b 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -9,20 +9,23 @@ from astune.task_rollout.native_parallel_worker import ParallelEnvManager from astune.utils.sms_agent import send_train_message + class TokenAndProb: def __init__(self, t): # ChatCompletionTokenLogprob(token='token_id:73594', bytes=[96, 96, 96], logprob=-1.9073468138230965e-06, top_logprobs=[]) - self.token_id = int(t.token.split('token_id:')[-1]) + self.token_id = int(t.token.split("token_id:")[-1]) self.logprob = t.logprob try: - self.decoded_string = bytes(t.bytes).decode('utf-8') + self.decoded_string = bytes(t.bytes).decode("utf-8") except: - self.decoded_string = '' + str(t.bytes) + self.decoded_string = "" + str(t.bytes) + -class ChatCompletionScheduler(): +class ChatCompletionScheduler: def __init__(self, url, config): from transformers import AutoTokenizer + self.url = url self.config = config self.tokenizer = AutoTokenizer.from_pretrained(self.config.astune.model.path) @@ -52,13 +55,13 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ model=self.config.astune.model.path, messages=messages, tools=tools, - extra_body=sampling_params + extra_body=sampling_params, ) else: completion = client.chat.completions.create( model=self.config.astune.model.path, messages=messages, - extra_body=sampling_params + extra_body=sampling_params, ) message = completion.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) @@ -66,13 +69,15 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ if "content" not in message: message["content"] = "" - messages.append({ - "role": message["role"], - "request_id":completion.id, - "content": message['content'], - "tool_calls": message.get("tool_calls", None), - "tokens": [TokenAndProb(t) for t in completion.choices[0].logprobs.content] # type: ignore - }) + messages.append( + { + "role": message["role"], + "request_id": completion.id, + "content": message["content"], + "tool_calls": message.get("tool_calls", None), + "tokens": [TokenAndProb(t) for t in completion.choices[0].logprobs.content], # type: ignore + } + ) return messages @@ -83,40 +88,53 @@ def run(config): vllm_port = config.astune.debug.debug_vllm_port # --------- init --------- - async_rollout_manager = ChatCompletionScheduler(config=config, url=f"http://localhost:{vllm_port}/v1") + async_rollout_manager = ChatCompletionScheduler( + config=config, url=f"http://localhost:{vllm_port}/v1" + ) parallel_env = ParallelEnvManager( config=config, async_rollout_manager=async_rollout_manager, max_parallel=max_parallel, max_llm_retries=3, llm_mode="remote", - tokenizer=async_rollout_manager.tokenizer + tokenizer=async_rollout_manager.tokenizer, ) from astune.task_reader import TaskReaderRouter + task_reader = TaskReaderRouter(config) tasks = task_reader.get_validation_tasks() print(tasks[:2]) - cmt = parallel_env.rollout(tasks=tasks[:n_task], mode="sample", epoch='1') # "sample" or "validate" + cmt = parallel_env.rollout( + tasks=tasks[:n_task], mode="sample", epoch="1" + ) # "sample" or "validate" gen_batch_output = parallel_env.to_dataproto(cmt) print("Generated batch output") -@hydra.main(config_path="astune/default_config", config_name="astune_default", version_base=None) +@hydra.main( + config_path="astune/default_config", + config_name="astune_default", + version_base=None, +) def main(config): from omegaconf import OmegaConf + OmegaConf.resolve(config) - print('*' * 20) + print("*" * 20) def companion_launch(): from astune.utils.smart_daemon import LaunchCommandWhenAbsent import torch + print("Launching companion process for async LLM server...") model_path = config.astune.model.path tensor_parallel_size = config.astune.debug.debug_tensor_parallel_size n_avail_gpus = torch.cuda.device_count() if tensor_parallel_size > n_avail_gpus: - print(f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}.") + print( + f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." + ) tensor_parallel_size = n_avail_gpus gpu_memory_utilization = config.actor_rollout_ref.rollout.gpu_memory_utilization max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs @@ -125,32 +143,49 @@ def companion_launch(): vllm_port = config.astune.debug.debug_vllm_port companion = LaunchCommandWhenAbsent( full_argument_list=[ - sys.executable, "-m", + sys.executable, + "-m", f"vllm.entrypoints.cli.main", - f"serve", f"{model_path}", - f"--tensor-parallel-size", f"{tensor_parallel_size}", - f"--dtype", f"auto", + f"serve", + f"{model_path}", + f"--tensor-parallel-size", + f"{tensor_parallel_size}", + f"--dtype", + f"auto", f"--enforce-eager", - f"--gpu-memory-utilization", f"{gpu_memory_utilization}", + f"--gpu-memory-utilization", + f"{gpu_memory_utilization}", f"--disable-custom-all-reduce", - f"--max-num-seqs", f"{max_num_seqs}", - f"--max-model-len", f"{max_model_len}", - f"--load-format", "auto", + f"--max-num-seqs", + f"{max_num_seqs}", + f"--max-model-len", + f"{max_model_len}", + f"--load-format", + "auto", f"--enable-chunked-prefill", f"--enable-auto-tool-choice", - f"--tool-call-parser", "hermes", + f"--tool-call-parser", + "hermes", f"--enable-prefix-caching", - f"--seed", f"{seed}", - f"--port", f"{vllm_port}", + f"--seed", + f"{seed}", + f"--port", + f"{vllm_port}", ], - dir='./', - tag="external_vllm_server" + dir="./", + tag="external_vllm_server", ) - companion.launch(launch_wait_time=1800, success_std_string="Application startup complete", env_dict={**os.environ}) + companion.launch( + launch_wait_time=1800, + success_std_string="Application startup complete", + env_dict={**os.environ}, + ) + companion_launch() run(config) + if __name__ == "__main__": atexit.register(lambda: send_train_message("0000")) main() diff --git a/astune/schema/extended_msg.py b/astune/schema/extended_msg.py index 65325e74..6b854f95 100644 --- a/astune/schema/extended_msg.py +++ b/astune/schema/extended_msg.py @@ -6,14 +6,15 @@ INVALID_LOG_PROB_VALUE = 0.0 + def find_sublist_indices(large_list, small_list, reverse=False): small_len = len(small_list) if reverse: for i in reversed(range(len(large_list) - small_len + 1)): - if large_list[i: i+small_len] == small_list: + if large_list[i : i + small_len] == small_list: return i for i in range(len(large_list) - small_len + 1): - if large_list[i: i+small_len] == small_list: + if large_list[i : i + small_len] == small_list: return i return -1 @@ -21,22 +22,22 @@ def find_sublist_indices(large_list, small_list, reverse=False): class ExtendedMessage: def __init__( - self, - author, - role="assistant", - content="", - token_arr=[], - token_begin_index=-1, - token_end_index=-1, - clip=False, - clip_token_limit=8192, - tokenizer: PreTrainedTokenizer=None, # type: ignore - token_generator="manual", - build_from_uuid="", - tools=[], - tool_calls=[], - token_logprob_arr=[], - ): + self, + author, + role="assistant", + content="", + token_arr=[], + token_begin_index=-1, + token_end_index=-1, + clip=False, + clip_token_limit=8192, + tokenizer: PreTrainedTokenizer = None, # type: ignore + token_generator="manual", + build_from_uuid="", + tools=[], + tool_calls=[], + token_logprob_arr=[], + ): self.author = author self.role = role self.content = content @@ -56,30 +57,37 @@ def __init__( if not clip: self.generate_content_for_future(tokenizer=None, clip=False) else: - self.generate_content_for_future(tokenizer=tokenizer, clip=True, clip_token_limit=clip_token_limit) + self.generate_content_for_future( + tokenizer=tokenizer, + clip=True, + clip_token_limit=clip_token_limit, + ) self.eos_token_id = tokenizer.eos_token_id - if token_generator == 'auto': - dummy_msg = [ {"role": "assistant", "content": "dummy text"} ] + if token_generator == "auto": + dummy_msg = [{"role": "assistant", "content": "dummy text"}] try: # completion_token_arr will contain generation_prompt header - auto_tokenize_target = { "role": self.role, "content": self.content_for_future } + auto_tokenize_target = { + "role": self.role, + "content": self.content_for_future, + } if self.tool_calls: - auto_tokenize_target.update({ "tool_calls": self.tool_calls }) + auto_tokenize_target.update({"tool_calls": self.tool_calls}) text_frag_to = tokenizer.apply_chat_template( - dummy_msg + [ auto_tokenize_target ], + dummy_msg + [auto_tokenize_target], tokenize=False, - tools=tools + tools=tools, ) except Exception as e: - raise ValueError(f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}") + raise ValueError( + f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}" + ) self.token_arr, _ = self.get_inc_simple( - text_frag_from=tokenizer.apply_chat_template( - dummy_msg, - tokenize=False, - tools=tools + text_frag_from=tokenizer.apply_chat_template( + dummy_msg, tokenize=False, tools=tools ), - text_frag_to=text_frag_to, - tokenizer=tokenizer + text_frag_to=text_frag_to, + tokenizer=tokenizer, ) @property @@ -91,14 +99,22 @@ def content_for_future(self): self._content_for_future return self._content_for_future - @property def need_training(self): NEED_TRAIN_AUTHORS = ["llm"] - NON_TRAIN_AUTHORS = ["env", "initialization", "user", "memory", "llm(do_not_train)"] - assert (self.author in NEED_TRAIN_AUTHORS) or (self.author in NON_TRAIN_AUTHORS) or (self.author.endswith('(discard)')), f"author {self.author} is not identified" - return (self.author in NEED_TRAIN_AUTHORS) - + NON_TRAIN_AUTHORS = [ + "env", + "initialization", + "user", + "memory", + "llm(do_not_train)", + ] + assert ( + (self.author in NEED_TRAIN_AUTHORS) + or (self.author in NON_TRAIN_AUTHORS) + or (self.author.endswith("(discard)")) + ), f"author {self.author} is not identified" + return self.author in NEED_TRAIN_AUTHORS def generate_content_for_future(self, tokenizer, clip, clip_token_limit=-1): _content: str = self.content @@ -108,18 +124,18 @@ def generate_content_for_future(self, tokenizer, clip, clip_token_limit=-1): if n_token > clip_token_limit: # 8000 > 4000 n_char = len(_content) # 10,000 - eps = 100 # token + eps = 100 # token preserve_percent = (clip_token_limit - eps) / n_token # 3900 / 8000 n_char_to_preserve = int(n_char * preserve_percent) _content = _content[:n_char_to_preserve] + "... truncate ..." self._content_for_future = _content - def get_loss_mask(self, blackout_token_combo): def blackout_specific_token_ids_first_encounter(mask, arr, token_ids): index = find_sublist_indices(arr, token_ids, reverse=False) if index >= 0: - for i in range(index, index+len(token_ids)): mask[i] = 0 + for i in range(index, index + len(token_ids)): + mask[i] = 0 return mask def blackout_everything_after_eos_but_keep_eos(mask, token_arr, eos_token_id): @@ -131,8 +147,14 @@ def blackout_everything_after_eos_but_keep_eos(mask, token_arr, eos_token_id): if self.need_training: msg_token_mask = [1] * len(self.token_arr) - msg_token_mask = blackout_specific_token_ids_first_encounter(msg_token_mask, self.token_arr, blackout_token_combo) - msg_token_mask = blackout_everything_after_eos_but_keep_eos(mask=msg_token_mask, token_arr=self.token_arr, eos_token_id=self.eos_token_id) + msg_token_mask = blackout_specific_token_ids_first_encounter( + msg_token_mask, self.token_arr, blackout_token_combo + ) + msg_token_mask = blackout_everything_after_eos_but_keep_eos( + mask=msg_token_mask, + token_arr=self.token_arr, + eos_token_id=self.eos_token_id, + ) return msg_token_mask else: msg_token_mask = [0] * len(self.token_arr) @@ -148,11 +170,15 @@ def get_inc_simple(self, text_frag_from, text_frag_to, tokenizer): tokenizer_output = tokenizer(text_frag_to, return_tensors="pt", padding=False) input_ids = tokenizer_output["input_ids"][0].tolist() - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 - else: break + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: + overlap_length += 1 + else: + break msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" # print(msg) return input_id_increment, msg diff --git a/astune/schema/logprob.py b/astune/schema/logprob.py index 631a57bd..4552df23 100644 --- a/astune/schema/logprob.py +++ b/astune/schema/logprob.py @@ -4,6 +4,7 @@ # from openai.types.chat.chat_completion import ChatCompletion # from verl import DataProto + class TokenAndProb: def __init__(self, token_id, logprob, decoded_string): self.token_id = token_id diff --git a/astune/schema/task.py b/astune/schema/task.py index 8a62ba1e..3e6f85a5 100644 --- a/astune/schema/task.py +++ b/astune/schema/task.py @@ -5,6 +5,8 @@ """ The basic schema for task_reader module """ + + class Task(BaseModel): main_query: str = Field(default="") init_messages: List[dict] = Field(default=[]) @@ -13,10 +15,11 @@ class Task(BaseModel): metadata: dict = Field(default_factory=dict) - """ For workflow execution, include task uuid and gym client if needed """ + + class WorkflowTask(BaseModel): env_type: str = Field(default="") task_id: str = Field(default="") @@ -31,10 +34,11 @@ class WorkflowTask(BaseModel): gym_env: Any = Field(default=None) # agentscope runtime handle or env service handle - """ workflow output, user should provide as workflow output """ + + class WorkflowOutput(BaseModel): reward: Union[float, List[float], None] = Field(default=None) is_success: Union[bool, None] = Field(default=None) diff --git a/astune/schema/trajectory.py b/astune/schema/trajectory.py index 7e93091d..d5b0d7ef 100644 --- a/astune/schema/trajectory.py +++ b/astune/schema/trajectory.py @@ -23,6 +23,7 @@ def performance_reward(self): else: return self.raw_reward + class Trajectory(BaseModel): task_batch_index: int = Field(default=0) task_tag: str = Field(default="") @@ -69,12 +70,14 @@ class Sample(BaseModel): step_reward: float = 0.0 reference_advantage: float = 0.0 - def __init__(self, cmt_tokenized:dict, messages, config, **kwargs): + def __init__(self, cmt_tokenized: dict, messages, config, **kwargs): super().__init__(**kwargs) self.max_prompt_len = config.astune.data.max_prompt_length self.max_response_len = config.astune.data.max_response_length - self.max_model_len = config.astune.data.max_response_length + config.astune.data.max_prompt_length + self.max_model_len = ( + config.astune.data.max_response_length + config.astune.data.max_prompt_length + ) self.input_ids = cmt_tokenized["input_ids"] self.attention_mask = cmt_tokenized["attention_mask"] @@ -105,31 +108,65 @@ def __init__(self, cmt_tokenized:dict, messages, config, **kwargs): def truncate_output_ids(self) -> None: - assert len(self.input_ids) == len(self.attention_mask) == len(self.position_ids) == len(self.loss_mask) - assert len(self.prompt_ids) == len(self.prompt_attention_mask) == len(self.prompt_position_ids) == len(self.prompt_loss_mask) == len(self.prompt_logprobs) - assert len(self.response_ids) == len(self.response_attention_mask) == len(self.response_position_ids) == len(self.response_loss_mask) == len(self.response_logprobs) - assert isinstance(self.input_ids, list) and isinstance(self.prompt_ids, list) and isinstance(self.response_ids, list) + assert ( + len(self.input_ids) + == len(self.attention_mask) + == len(self.position_ids) + == len(self.loss_mask) + ) + assert ( + len(self.prompt_ids) + == len(self.prompt_attention_mask) + == len(self.prompt_position_ids) + == len(self.prompt_loss_mask) + == len(self.prompt_logprobs) + ) + assert ( + len(self.response_ids) + == len(self.response_attention_mask) + == len(self.response_position_ids) + == len(self.response_loss_mask) + == len(self.response_logprobs) + ) + assert ( + isinstance(self.input_ids, list) + and isinstance(self.prompt_ids, list) + and isinstance(self.response_ids, list) + ) truncate_any = False if len(self.prompt_ids) > self.max_prompt_len: truncate_any = True - print(f"-------------------------------------------------------------------------------------------------------") - print(f"Warning: prompt_ids length {len(self.prompt_ids)} exceeds max_prompt_len {self.max_prompt_len}, truncating.") - print(f"-------------------------------------------------------------------------------------------------------") - raise RuntimeError("Prompt length exceeds maximum allowed length. Please adjust the input data.") - self.prompt_ids = self.prompt_ids[-self.max_prompt_len:] - self.prompt_attention_mask = self.prompt_attention_mask[-self.max_prompt_len:] - self.prompt_position_ids = self.prompt_position_ids[-self.max_prompt_len:] - self.prompt_loss_mask = self.prompt_loss_mask[-self.max_prompt_len:] - self.prompt_logprobs = self.prompt_logprobs[-self.max_prompt_len:] - + print( + f"-------------------------------------------------------------------------------------------------------" + ) + print( + f"Warning: prompt_ids length {len(self.prompt_ids)} exceeds max_prompt_len {self.max_prompt_len}, truncating." + ) + print( + f"-------------------------------------------------------------------------------------------------------" + ) + raise RuntimeError( + "Prompt length exceeds maximum allowed length. Please adjust the input data." + ) + self.prompt_ids = self.prompt_ids[-self.max_prompt_len :] + self.prompt_attention_mask = self.prompt_attention_mask[-self.max_prompt_len :] + self.prompt_position_ids = self.prompt_position_ids[-self.max_prompt_len :] + self.prompt_loss_mask = self.prompt_loss_mask[-self.max_prompt_len :] + self.prompt_logprobs = self.prompt_logprobs[-self.max_prompt_len :] if len(self.response_ids) > self.max_response_len: truncate_any = True - print(f"-------------------------------------------------------------------------------------------------------") - print(f"Warning: response_ids length {len(self.response_ids)} exceeds max_response_len {self.max_response_len}, truncating.") - print(f"-------------------------------------------------------------------------------------------------------") + print( + f"-------------------------------------------------------------------------------------------------------" + ) + print( + f"Warning: response_ids length {len(self.response_ids)} exceeds max_response_len {self.max_response_len}, truncating." + ) + print( + f"-------------------------------------------------------------------------------------------------------" + ) self.response_ids = self.response_ids[: self.max_response_len] self.response_attention_mask = self.response_attention_mask[: self.max_response_len] self.response_position_ids = self.response_position_ids[: self.max_response_len] @@ -147,4 +184,4 @@ def discard(self) -> None: """ Discard the experience. """ - raise RuntimeError('Never use this method.') + raise RuntimeError("Never use this method.") diff --git a/astune/task_judge/env_service_as_judge.py b/astune/task_judge/env_service_as_judge.py index 0b11ef0f..e99b682f 100644 --- a/astune/task_judge/env_service_as_judge.py +++ b/astune/task_judge/env_service_as_judge.py @@ -7,7 +7,7 @@ class EnvServiceJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: + def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raw_reward = 0 env = workflow_task.gym_env diff --git a/astune/task_judge/judge_base.py b/astune/task_judge/judge_base.py index 35a7b17b..05114a48 100644 --- a/astune/task_judge/judge_base.py +++ b/astune/task_judge/judge_base.py @@ -1,10 +1,11 @@ from astune.workflow import WorkflowOutput, WorkflowTask -class JudgeBase(): + +class JudgeBase: def __init__(self, config): self.config = config - def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: + def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raise NotImplementedError diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index fae28af2..4f7327f4 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -1,20 +1,25 @@ import re from astune.workflow import WorkflowOutput, WorkflowTask from astune.task_judge.judge_base import JudgeBase -from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn +from astune.task_rollout.dashscope_llm_bridge import ( + construct_alien_llm_chat_fn, +) + class MathAnswerAsJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: + def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raw_reward = 0 - final_answer = workflow_output.metadata['final_answer'] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow - reference_answer = workflow_task.task.metadata['answer'] - reference_answer = reference_answer.split('####')[-1].strip() + final_answer = workflow_output.metadata[ + "final_answer" + ] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + reference_answer = workflow_task.task.metadata["answer"] + reference_answer = reference_answer.split("####")[-1].strip() - pattern = r'\\boxed\{([^}]*)\}' + pattern = r"\\boxed\{([^}]*)\}" match = re.search(pattern, final_answer) if match: result = match.group(1) @@ -31,28 +36,30 @@ class MathAnswerAndLlmAsJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, workflow_task:WorkflowTask, workflow_output:WorkflowOutput) -> tuple: + def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raw_reward = 0 - final_answer = workflow_output.metadata['final_answer'] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow - reference_answer = workflow_task.task.metadata['answer'] - reference_answer = reference_answer.split('####')[-1].strip() + final_answer = workflow_output.metadata[ + "final_answer" + ] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + reference_answer = workflow_task.task.metadata["answer"] + reference_answer = reference_answer.split("####")[-1].strip() alien_llm_chat_fn = construct_alien_llm_chat_fn( - alien_llm_model = self.config.astune.task_judge.alien_llm_model, - alien_llm_response_length = self.config.astune.task_judge.alien_llm_response_length, + alien_llm_model=self.config.astune.task_judge.alien_llm_model, + alien_llm_response_length=self.config.astune.task_judge.alien_llm_response_length, ) messages = [ { - 'role':'system', - 'content':f'Is my result correct? If correct, say , otherwise say .' + "role": "system", + "content": f"Is my result correct? If correct, say , otherwise say .", }, { - 'role':'user', - 'content':f'Is my result correct?\n\n\n----\nMy result: {final_answer}\n\n\n----\nReal result: {reference_answer}' - } + "role": "user", + "content": f"Is my result correct?\n\n\n----\nMy result: {final_answer}\n\n\n----\nReal result: {reference_answer}", + }, ] res = alien_llm_chat_fn(messages=messages) - if '' in res['content']: + if "" in res["content"]: is_success = True raw_reward = 1.0 else: diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index 1155c987..67af181f 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -11,6 +11,7 @@ from astune.task_reader.jsonl_reader import TaskReaderJsonl from astune.task_reader.task_reader_base import TaskReaderBase + class RandomDummyGenerator(TaskReaderBase): def __init__(self, config): @@ -21,16 +22,16 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: # Save the current random state original_state = np.random.get_state() np.random.seed(42) - random_number = [ x for x in range(1000) ] + random_number = [x for x in range(1000)] # shuffle np.random.shuffle(random_number) for idx in random_number: task = Task( - main_query=f'[dummy task @ {idx}]', + main_query=f"[dummy task @ {idx}]", init_messages=[], task_id=str(idx), env_type=f"no_env", - metadata={'random_number': idx}, + metadata={"random_number": idx}, ) tasks.append(task) # Restore the original random state @@ -38,23 +39,23 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: return tasks def get_training_tasks(self) -> List[Task]: - return self._load_dataset_split('dataset_name', 'split') + return self._load_dataset_split("dataset_name", "split") def get_validation_tasks(self) -> List[Task]: - return self._load_dataset_split('dataset_name', 'split') + return self._load_dataset_split("dataset_name", "split") class TaskReaderRouter(TaskReaderBase): def __init__(self, config): super().__init__(config) self.task_reader_type = self.config.astune.task_reader.type - if self.task_reader_type == 'env_service': + if self.task_reader_type == "env_service": self.task_reader = TaskReaderEnvService(config) - elif self.task_reader_type == 'dataset_file': + elif self.task_reader_type == "dataset_file": self.task_reader = TaskReaderJsonl(config) - elif self.task_reader_type == 'huggingface_dat_repo': + elif self.task_reader_type == "huggingface_dat_repo": self.task_reader = TaskReaderHuggingFace(config) - elif self.task_reader_type == 'random_dummy': + elif self.task_reader_type == "random_dummy": self.task_reader = RandomDummyGenerator(config) else: raise ValueError(f"Unsupported task reader type: {self.task_reader_type}") @@ -77,18 +78,18 @@ def task_to_standard_dataset(tasks: List[Task]) -> datasets.Dataset: datasets.Dataset: Hugging Face Dataset containing the tasks. """ data = { - 'task_id': [], - 'main_query': [], - 'init_messages': [], - 'env_type': [], - 'metadata': [], + "task_id": [], + "main_query": [], + "init_messages": [], + "env_type": [], + "metadata": [], } for task in tasks: - data['task_id'].append(task.task_id) - data['main_query'].append(task.main_query) - data['init_messages'].append(task.init_messages) - data['env_type'].append(task.env_type) - data['metadata'].append(task.metadata) + data["task_id"].append(task.task_id) + data["main_query"].append(task.main_query) + data["init_messages"].append(task.init_messages) + data["env_type"].append(task.env_type) + data["metadata"].append(task.metadata) return datasets.Dataset.from_dict(data) diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index 71bb21e0..f6ab2dfa 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -18,15 +18,19 @@ def get_tasks(self, split): env_service_client = EnvClient(base_url=env_url) task_id_array = env_service_client.get_env_profile(env_type, split=split) if len(task_id_array) == 0: - raise ValueError(f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}") + raise ValueError( + f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}" + ) tasks = [ Task( - main_query='[not defined]', + main_query="[not defined]", init_messages=[], task_id=str(task_id), env_type=env_type, metadata={}, - ) for task_id in task_id_array] + ) + for task_id in task_id_array + ] return tasks def get_validation_tasks(self): diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py index f5b7ae98..30917a20 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astune/task_reader/hf_dataset_reader.py @@ -7,7 +7,6 @@ from astune.task_reader.task_reader_base import TaskReaderBase - class TaskReaderHuggingFace(TaskReaderBase): """ Task reader that reads tasks from Hugging Face datasets. @@ -19,7 +18,6 @@ class TaskReaderHuggingFace(TaskReaderBase): def __init__(self, config): super().__init__(config) - def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: """ Load a dataset split from Hugging Face datasets. @@ -34,7 +32,9 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: try: dataset = datasets.load_dataset(dataset_name, split=split) except Exception as e: - raise ValueError(f"Failed to load dataset '{dataset_name}' with split '{split}': {str(e)}") + raise ValueError( + f"Failed to load dataset '{dataset_name}' with split '{split}': {str(e)}" + ) # if len(dataset) == 0: # raise ValueError(f"No examples found in dataset '{dataset_name}' with split '{split}'") @@ -43,7 +43,7 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: for idx, example in enumerate(dataset): # Create Task object task = Task( - main_query=example['question'], + main_query=example["question"], init_messages=[], # Dataset examples typically don't have init messages task_id=str(idx), env_type=f"no_env", diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index 8902fb56..35d16a3a 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -7,8 +7,6 @@ from astune.task_reader.task_reader_base import TaskReaderBase - - class TaskReaderJsonl(TaskReaderBase): def __init__(self, config): super().__init__(config) @@ -25,17 +23,17 @@ def _read_jsonl_file(self, file_path): """ tasks = [] try: - with open(file_path, 'r', encoding='utf-8') as f: + with open(file_path, "r", encoding="utf-8") as f: for line in f: if line.strip(): # Skip empty lines task_data = json.loads(line) # Create a Task object from the JSON data task = Task( - main_query=task_data.get('main_query', '[not defined]'), - init_messages=task_data.get('init_messages', []), - task_id=task_data.get('task_id', ''), - env_type=task_data.get('env_type', 'no_env'), - metadata=task_data.get('metadata', {}) + main_query=task_data.get("main_query", "[not defined]"), + init_messages=task_data.get("init_messages", []), + task_id=task_data.get("task_id", ""), + env_type=task_data.get("env_type", "no_env"), + metadata=task_data.get("metadata", {}), ) tasks.append(task) except FileNotFoundError: diff --git a/astune/task_reader/task_reader_base.py b/astune/task_reader/task_reader_base.py index 4c79af56..562e86d9 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astune/task_reader/task_reader_base.py @@ -10,8 +10,8 @@ class TaskReaderBase: def __init__(self, config): self.config = config - def get_training_tasks(self)->List[Task]: + def get_training_tasks(self) -> List[Task]: raise NotImplementedError - def get_validation_tasks(self)->List[Task]: + def get_validation_tasks(self) -> List[Task]: raise NotImplementedError diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index f9328509..37eb5b02 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -1,5 +1,3 @@ - - from typing import Any, List, Mapping, MutableMapping, Sequence, TypedDict import json @@ -16,7 +14,6 @@ from .connector import LocalSqliteConnectorV1, PhoenixConnector - class Config(TypedDict): base_url: str train_output_path: str @@ -34,7 +31,7 @@ def __init__( ) -> None: super().__init__(config) # config patch - print('*********', config, '**********') + # print("*********", config, "**********") self.config = config.astune.tracing self._connector = LocalSqliteConnectorV1(self.config.get("base_url")) diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index 206378f7..5d2cadfa 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -10,6 +10,7 @@ from astune.schema.task import Task + class TracingConnector(Protocol): def load_tasks_from_conversation(self) -> List[Task]: ... @@ -61,24 +62,24 @@ def load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: all_spans.extend(spans) return all_spans - def load_tasks_from_conversation( - self - ) -> List[Task]: + def load_tasks_from_conversation(self) -> List[Task]: all_spans = self.load_spans( - projects_limit=self._projects_limit, spans_limit=self._spans_limit) + projects_limit=self._projects_limit, spans_limit=self._spans_limit + ) all_spans.sort(key=lambda x: datetime.fromisoformat(x["end_time"])) - all_spans = list( - filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) + all_spans = list(filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) qa: list = [] for span in all_spans: inp = json.loads(span["attributes"]["gen_ai.input.messages"]) out = json.loads(span["attributes"]["gen_ai.output.messages"]) if "parts" in inp and "parts" in out: - qa.append({ - "query": inp["parts"][0]["content"], - "answer": out["parts"][0]["content"], - }) + qa.append( + { + "query": inp["parts"][0]["content"], + "answer": out["parts"][0]["content"], + } + ) tasks: List[Task] = [] for item in qa: @@ -141,28 +142,32 @@ class LocalSqliteConnectorV1: def __init__(self, db_path: str) -> None: self._db_path = db_path - assert os.path.exists( - self._db_path), f"DB file {self._db_path} does not exist" + assert os.path.exists(self._db_path), f"DB file {self._db_path} does not exist" def load_tasks_from_conversation(self) -> List[Task]: conn = sqlite3.connect(self._db_path) cursor = conn.cursor() rows = cursor.execute( - "SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() + "SELECT attributes FROM span_table where name='ReActAgent.reply'" + ).fetchall() qa = [] for row in rows: js = json.loads(row[0]) - query = js['input']['kwargs']['msg'] - output = js['output'] if 'output' in js else None + query = js["input"]["kwargs"]["msg"] + output = js["output"] if "output" in js else None if query is not None and output is not None: query = parse_msg_line(query) output = parse_msg_line(output) if query is not None and output is not None: - if query['role']=='user' and output['role']=='assistant': - if query['content'] is not None and output['content'] is not None: + if query["role"] == "user" and output["role"] == "assistant": + if query["content"] is not None and output["content"] is not None: qa.append( - {"query": query['content'], "answer": output['content']}) + { + "query": query["content"], + "answer": output["content"], + } + ) conn.close() @@ -203,14 +208,14 @@ class LocalSqliteConnectorV2: def __init__(self, db_path: str) -> None: self._db_path = db_path - assert os.path.exists( - self._db_path), f"DB file {self._db_path} does not exist" + assert os.path.exists(self._db_path), f"DB file {self._db_path} does not exist" def load_tasks_from_conversation(self) -> List[Task]: conn = sqlite3.connect(self._db_path) cursor = conn.cursor() rows = cursor.execute( - "SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() + "SELECT attributes FROM span_table where name='ReActAgent.reply'" + ).fetchall() qa = [] for row in rows: @@ -218,10 +223,12 @@ def load_tasks_from_conversation(self) -> List[Task]: inp = json.loads(js["gen_ai"]["input"]["messages"]) out = json.loads(js["gen_ai"]["output"]["messages"]) if "parts" in inp and "parts" in out: - qa.append({ - "query": inp["parts"][0]["content"], - "answer": out["parts"][0]["content"], - }) + qa.append( + { + "query": inp["parts"][0]["content"], + "answer": out["parts"][0]["content"], + } + ) conn.close() @@ -243,4 +250,8 @@ def load_tasks_from_conversation(self) -> List[Task]: return tasks -__all__ = ["LocalSqliteConnectorV1", "LocalSqliteConnectorV2", "PhoenixConnector"] +__all__ = [ + "LocalSqliteConnectorV1", + "LocalSqliteConnectorV2", + "PhoenixConnector", +] diff --git a/astune/task_reader/tracing_reader/filters/factory.py b/astune/task_reader/tracing_reader/filters/factory.py index d6d8a39d..3e7d422a 100644 --- a/astune/task_reader/tracing_reader/filters/factory.py +++ b/astune/task_reader/tracing_reader/filters/factory.py @@ -28,8 +28,7 @@ def _build_single_filter(spec: Mapping[str, Any]) -> Filter: def build_filters(specs: Sequence[Mapping[str, Any]] | None) -> List[Filter]: - """Setup filter chain according to config. - """ + """Setup filter chain according to config.""" if not specs: return [] diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 1f458cff..4482ed23 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -1,7 +1,9 @@ from typing import Iterable, List from astune.schema.task import Task -from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn +from astune.task_rollout.dashscope_llm_bridge import ( + construct_alien_llm_chat_fn, +) from ..fn import Fn from .base import Filter @@ -46,12 +48,13 @@ def __init__( max_tokens: int = 2048, print_reason: bool = True, ) -> None: - """Filter that evaluates the quality of tasks using LLM. - """ + """Filter that evaluates the quality of tasks using LLM.""" self._print_reason = print_reason - self.alien_llm_chat_fn = construct_alien_llm_chat_fn(alien_llm_model="qwen3-235b-a22b-instruct-2507", - alien_llm_response_length=512) + self.alien_llm_chat_fn = construct_alien_llm_chat_fn( + alien_llm_model="qwen3-235b-a22b-instruct-2507", + alien_llm_response_length=512, + ) self._fn = Fn( name="evaluate_quality", description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), @@ -64,7 +67,10 @@ def __init__( "reason": "judgment reason, briefly explain the reason", "result": "GOOD/BAD", }, - sampling_params={"temperature": temperature, "max_tokens": max_tokens}, + sampling_params={ + "temperature": temperature, + "max_tokens": max_tokens, + }, ) def filter(self, tasks: Iterable[Task]) -> List[Task]: diff --git a/astune/task_reader/tracing_reader/fn.py b/astune/task_reader/tracing_reader/fn.py index 126437cf..027fea18 100644 --- a/astune/task_reader/tracing_reader/fn.py +++ b/astune/task_reader/tracing_reader/fn.py @@ -8,13 +8,15 @@ class Fn: It uses LlmClient to execute the task and parses the result using markdown-kv format. """ - def __init__(self, - name: str, - description: str, - alien_llm_chat_fn: Any, - input_schema: Dict[str, str], - output_schema: Dict[str, str], - sampling_params: Dict[str, Any] = {}): + def __init__( + self, + name: str, + description: str, + alien_llm_chat_fn: Any, + input_schema: Dict[str, str], + output_schema: Dict[str, str], + sampling_params: Dict[str, Any] = {}, + ): """ Initialize the Fn class. @@ -76,7 +78,9 @@ def _build_system_prompt(self) -> str: prompt_parts.append("") # Multiple records instruction - prompt_parts.append("If there are multiple results, use separate records with increasing indices:") + prompt_parts.append( + "If there are multiple results, use separate records with increasing indices:" + ) prompt_parts.append("```markdown") prompt_parts.append("## record 0") prompt_parts.append("name=first_result") @@ -107,11 +111,11 @@ def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, Union[Dict[str, str], List[Dict[str, str]]]: Parsed result as dict or list of dicts """ # Remove code block markers if present - text = re.sub(r'```.*?\n', '', text, flags=re.DOTALL) - text = re.sub(r'```', '', text) + text = re.sub(r"```.*?\n", "", text, flags=re.DOTALL) + text = re.sub(r"```", "", text) # Split by record headers - record_pattern = r'## record \d+' + record_pattern = r"## record \d+" record_sections = re.split(record_pattern, text) # Remove empty sections @@ -121,10 +125,10 @@ def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, for section in record_sections: # Parse key-value pairs kv_dict = {} - lines = section.strip().split('\n') + lines = section.strip().split("\n") for line in lines: - if '=' in line: - key, value = line.split('=', 1) + if "=" in line: + key, value = line.split("=", 1) kv_dict[key.strip()] = value.strip() if kv_dict: # Only add non-empty dictionaries results.append(kv_dict) @@ -134,7 +138,9 @@ def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, return results[0] return results - def _format_input_parameters(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> str: + def _format_input_parameters( + self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]] + ) -> str: """ Format input parameters for the user prompt. @@ -165,7 +171,9 @@ def _format_input_parameters(self, input_data: Union[Dict[str, Any], List[Dict[s else: return f"Input parameters: {input_data}" - def __call__(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> Union[Dict[str, str], List[Dict[str, str]]]: + def __call__( + self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]] + ) -> Union[Dict[str, str], List[Dict[str, str]]]: """ Execute the task with the given parameters. @@ -181,7 +189,7 @@ def __call__(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> U # Build messages for LLM messages = [ {"role": "system", "content": self._build_system_prompt()}, - {"role": "user", "content": user_prompt} + {"role": "user", "content": user_prompt}, ] # Call LLM diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 976adf57..42dec22f 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -12,7 +12,9 @@ from agentscope.message import TextBlock, ToolUseBlock from agentscope._utils._common import _json_loads_with_repair from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking +from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracking, +) class AsyncLlmBridge(object): @@ -23,7 +25,7 @@ def __init__( async_rollout_manager: Any, tokenizer: Any, llm_mode: Literal["local", "remote", "trinity"] = "local", - max_llm_retries: int = 3 + max_llm_retries: int = 3, ): self.config = config self.async_rollout_manager = async_rollout_manager @@ -33,12 +35,11 @@ def __init__( def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: - def llm_chat( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, - tools = [], - request_id: str = "" + tools=[], + request_id: str = "", ) -> dict: updated_sampling_params = {} @@ -48,31 +49,40 @@ def llm_chat( updated_sampling_params.update(custom_sampling_params) tools = messages[-1].get("tools", None) - for msg in messages: msg.pop("tools", None) + for msg in messages: + msg.pop("tools", None) input_messages = copy.deepcopy(messages) request_id = uuid.uuid4().hex if tools is not None: - prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True, tools=tools) + prompt_ids = self.tokenizer.apply_chat_template( + input_messages, + add_generation_prompt=True, + tokenize=True, + tools=tools, + ) else: - prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True) + prompt_ids = self.tokenizer.apply_chat_template( + input_messages, add_generation_prompt=True, tokenize=True + ) - final_res = run_async_coro__no_matter_what(self.async_rollout_manager.generate( + final_res = run_async_coro__no_matter_what( + self.async_rollout_manager.generate( request_id=request_id, prompt_ids=prompt_ids, sampling_params=updated_sampling_params, ) ) - if self.config.astune.rollout.name == 'vllm': + if self.config.astune.rollout.name == "vllm": token_array = final_res.outputs[0].token_ids - elif self.config.astune.rollout.name == 'sglang': + elif self.config.astune.rollout.name == "sglang": token_array = final_res - decoded_text = self.tokenizer.decode(token_array) # type: ignore + decoded_text = self.tokenizer.decode(token_array) # type: ignore - if decoded_text.endswith('<|im_end|>'): - decoded_text = decoded_text[:-len('<|im_end|>')] + if decoded_text.endswith("<|im_end|>"): + decoded_text = decoded_text[: -len("<|im_end|>")] return { "role": "assistant", @@ -82,18 +92,17 @@ def llm_chat( TokenAndProb( token_id=token, logprob=-1, - decoded_string=self.tokenizer.decode(token) + decoded_string=self.tokenizer.decode(token), ) - for token in token_array # type: ignore - ] + for token in token_array # type: ignore + ], } - def llm_chat_remote( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, - tools = [], - request_id: str = "" + tools=[], + request_id: str = "", ) -> dict: updated_sampling_params = {} @@ -110,20 +119,19 @@ def llm_chat_remote( messages=input_messages, sampling_params=updated_sampling_params, tools=tools, - request_id=request_id + request_id=request_id, ) break except Exception as e: logger.bind(exception=True).exception(f"rollout_server.{i} error: {e.args}") time.sleep(i + 1) - return output_message[-1] # type: ignore - + return output_message[-1] # type: ignore def llm_chat_trinity( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, - tools = [], - request_id: str = "" + tools=[], + request_id: str = "", ) -> dict: async def main(): @@ -132,7 +140,7 @@ async def main(): updated_sampling_params.update(sampling_params) if custom_sampling_params: updated_sampling_params.update(custom_sampling_params) - updated_sampling_params.pop('min_tokens') + updated_sampling_params.pop("min_tokens") if tools: response = await self.async_rollout_manager.chat.completions.create( @@ -141,7 +149,7 @@ async def main(): logprobs=True, tools=tools, top_logprobs=0, - **updated_sampling_params + **updated_sampling_params, ) else: response = await self.async_rollout_manager.chat.completions.create( @@ -149,11 +157,11 @@ async def main(): messages=messages, logprobs=True, top_logprobs=0, - **updated_sampling_params + **updated_sampling_params, ) return response - response = run_async_coro__no_matter_what(main()) # type: ignore + response = run_async_coro__no_matter_what(main()) # type: ignore content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) @@ -170,13 +178,13 @@ async def main(): TokenAndProb( token_id=token, logprob=tokenlogprob.logprob, - decoded_string=tokenlogprob.token + decoded_string=tokenlogprob.token, ) for tokenlogprob, token in zip( response.choices[0].logprobs.content, - response.choices[0].token_ids + response.choices[0].token_ids, ) - ] + ], } if self.llm_mode == "remote": @@ -187,8 +195,6 @@ async def main(): return llm_chat - - class LlmProxyForAgentScope(object): """ An essential wrapper to connect AsyncLlmBridge with AgentScope @@ -199,8 +205,8 @@ class LlmProxyForAgentScope(object): def __init__( self, llm_chat_fn, - tokenizer:PreTrainedTokenizer, - context_tracker:MultiAgentContextTracking, + tokenizer: PreTrainedTokenizer, + context_tracker: MultiAgentContextTracking, config, ) -> None: self.context_tracker = context_tracker @@ -208,24 +214,24 @@ def __init__( self.tokenizer = tokenizer self.config = config - async def __call__( - self, - messages: List[dict], - tools: List=[], - tool_choice: str = "auto", - structured_model=None, - **kwargs - ) -> ChatResponse: + self, + messages: List[dict], + tools: List = [], + tool_choice: str = "auto", + structured_model=None, + **kwargs, + ) -> ChatResponse: # prepare context tracker, check context safety - context_safe, info, converted_message, custom_sampling_params = \ + context_safe, info, converted_message, custom_sampling_params = ( self.context_tracker.step_prepare(messages, tools) + ) if not context_safe: logger.warning(f"[{info}] detected. Current token count exceeds the limit.") self.context_overflow = True return ChatResponse( - content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] + content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] ) # run llm inference @@ -235,7 +241,9 @@ async def __call__( self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) # parse response - response = await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) + response = await self._parse_dashscope_generation_response( + llm_output, structured_model=structured_model + ) return response # copied from AgentScope's DashScopeChatModule @@ -284,14 +292,13 @@ async def _parse_dashscope_generation_response( ToolUseBlock( type="tool_use", name=tool_call["function"]["name"], - input=input_, # type: ignore + input=input_, # type: ignore id=tool_call["id"], ), ) if structured_model: - metadata = input_ # type: ignore - + metadata = input_ # type: ignore parsed_response = ChatResponse( content=content_blocks, diff --git a/astune/task_rollout/dashscope_llm_bridge.py b/astune/task_rollout/dashscope_llm_bridge.py index 5d24035b..b69859a2 100644 --- a/astune/task_rollout/dashscope_llm_bridge.py +++ b/astune/task_rollout/dashscope_llm_bridge.py @@ -5,20 +5,28 @@ from openai import OpenAI from loguru import logger + def construct_alien_llm_chat_fn(alien_llm_model, alien_llm_response_length): def alien_llm_chat_fn(messages, sampling_params_override={}, request_id=""): max_try = 4 alien_model_name = alien_llm_model alien_model_response_length = alien_llm_response_length - if os.environ.get("DASHSCOPE_API_KEY") is None or os.environ.get("DASHSCOPE_API_KEY_BACKUP") is None: - raise RuntimeError(dedent(""" + if ( + os.environ.get("DASHSCOPE_API_KEY") is None + or os.environ.get("DASHSCOPE_API_KEY_BACKUP") is None + ): + raise RuntimeError( + dedent( + """ Please set the DASHSCOPE_API_KEY and DASHSCOPE_API_KEY_BACKUP environment variables. You can get the API keys from https://www.dashscope.com/. Example: export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' - """)) + """ + ) + ) regular_key_list = os.environ.get("DASHSCOPE_API_KEY") backup_key_list = os.environ.get("DASHSCOPE_API_KEY_BACKUP") @@ -31,15 +39,14 @@ def alien_llm_chat_fn(messages, sampling_params_override={}, request_id=""): else: backup_key_list = [] - for n_try in range(max_try): try: if n_try < max_try // 2: - api_key=random.choice(regular_key_list) + api_key = random.choice(regular_key_list) elif n_try == max_try // 2: - api_key=random.choice(backup_key_list) + api_key = random.choice(backup_key_list) else: - api_key=random.choice(regular_key_list + backup_key_list) + api_key = random.choice(regular_key_list + backup_key_list) client = OpenAI( api_key=api_key, base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", @@ -53,14 +60,18 @@ def alien_llm_chat_fn(messages, sampling_params_override={}, request_id=""): completion = client.chat.completions.create( model=alien_model_name, messages=messages, - extra_body=sampling_params + extra_body=sampling_params, ) - message = completion.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) - if "content" not in message: message["content"] = "" - return {"role": message["role"], "content": message['content']} + message = completion.choices[0].message.model_dump( + exclude_unset=True, exclude_none=True + ) + if "content" not in message: + message["content"] = "" + return {"role": message["role"], "content": message["content"]} except Exception as e: logger.bind(exception=True).exception(f"Error calling alien llm: {e}") time.sleep(5) print(f"Error calling alien llm: {e}, retrying...") raise RuntimeError(f"Failed to get response from alien llm after {max_try} attempts") + return alien_llm_chat_fn diff --git a/astune/task_rollout/native_parallel_worker.py b/astune/task_rollout/native_parallel_worker.py index b83256cf..9d4977bf 100644 --- a/astune/task_rollout/native_parallel_worker.py +++ b/astune/task_rollout/native_parallel_worker.py @@ -27,18 +27,21 @@ class StepPrinter(BaseParallelEnv): def step_status_printer(self, obs_window): # Histogram buckets: obs_window['step'] 0~5 / 5~10 / 10~15 / ... step_counter = {} - current_token = sum(obs_window['token']) + current_token = sum(obs_window["token"]) current_time = time.time() delta_token = current_token - self.current_token - if delta_token < 0: delta_token = current_token + if delta_token < 0: + delta_token = current_token delta_time = current_time - self.current_token_count_time self.current_token = current_token self.current_token_count_time = current_time - token_gen_per_sec_str = f"{delta_token/delta_time:.2f} tokens/s" if delta_time > 0 else "N/A" + token_gen_per_sec_str = ( + f"{delta_token/delta_time:.2f} tokens/s" if delta_time > 0 else "N/A" + ) - for step in obs_window['step']: + for step in obs_window["step"]: if step == -1: - step_counter[(-1, 'terminated')] = step_counter.get((-1, 'terminated'), 0) + 1 + step_counter[(-1, "terminated")] = step_counter.get((-1, "terminated"), 0) + 1 continue else: start = (step // 5) * 5 @@ -60,14 +63,19 @@ def step_status_printer(self, obs_window): class StaticRollout(StepPrinter): """Static (non-dynamic) rollout manager.""" - def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[BasicContextTracker]: + def rollout( + self, + tasks: List[Task], + mode: Literal["sample", "validate"], + epoch: str, + ) -> List[BasicContextTracker]: self.current_token_count_time = time.time() cmt_array: List[BasicContextTracker] = [] rollout_n = 1 if mode == "validate" else self.rollout_n obs_window = { - 'step': [0 for _ in range(len(tasks) * rollout_n)], - 'token': [0 for _ in range(len(tasks) * rollout_n)], - 'stop': [False for _ in range(len(tasks) * rollout_n)], + "step": [0 for _ in range(len(tasks) * rollout_n)], + "token": [0 for _ in range(len(tasks) * rollout_n)], + "stop": [False for _ in range(len(tasks) * rollout_n)], } with ThreadPoolExecutor(max_workers=self.max_parallel) as executor: futures = [] @@ -103,8 +111,17 @@ def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: class DynamicRollout(StaticRollout): """Dynamic rollout supporting oversampling and early termination.""" - def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[BasicContextTracker]: - if mode == "sample" and (self.rollout_n != 1) and self.config.astune.rollout.enable_oversample: + def rollout( + self, + tasks: List[Task], + mode: Literal["sample", "validate"], + epoch: str, + ) -> List[BasicContextTracker]: + if ( + mode == "sample" + and (self.rollout_n != 1) + and self.config.astune.rollout.enable_oversample + ): return self.rollout_dynamic(tasks, mode, epoch) else: return super().rollout(tasks, mode, epoch) @@ -116,7 +133,10 @@ def greedy_max_std_selection(self, samples: List[BasicContextTracker], n): else: additional_n = 0 - sorted_samples = sorted(samples, key=lambda cmt: abs(cmt.reward_structure.performance_reward)) + sorted_samples = sorted( + samples, + key=lambda cmt: abs(cmt.reward_structure.performance_reward), + ) value_array = [cmt.reward_structure.performance_reward for cmt in sorted_samples] macro_selected_value = [] macro_selected_index = [] @@ -144,10 +164,20 @@ def greedy_max_std_selection(self, samples: List[BasicContextTracker], n): macro_selected_index += additional_indices.tolist() selected_samples = [sorted_samples[i] for i in macro_selected_index] - sorted_selected_samples = sorted(selected_samples, key=lambda cmt: abs(cmt.reward_structure.performance_reward)) + sorted_selected_samples = sorted( + selected_samples, + key=lambda cmt: abs(cmt.reward_structure.performance_reward), + ) return sorted_selected_samples - def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str, allow_sample_num_change=True, allow_force_stop=True) -> List[BasicContextTracker]: + def rollout_dynamic( + self, + tasks: List[Task], + mode: Literal["sample", "validate"], + epoch: str, + allow_sample_num_change=True, + allow_force_stop=True, + ) -> List[BasicContextTracker]: cmt_array: List[BasicContextTracker] = [] assert mode != "validate" rollout_n = self.rollout_n @@ -155,13 +185,14 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] submit_oversample_multiplier = self.config.astune.rollout.submit_oversample_multiplier rollout_n_oversample = int(rollout_n * submit_oversample_multiplier) rollout_n_confirm = int(rollout_n * (1 + submit_oversample_multiplier) / 2) - assert rollout_n < rollout_n_confirm < rollout_n_oversample, \ - f"submit_oversample_multiplier is too small, rollout_n={rollout_n}, rollout_n_confirm={rollout_n_confirm}, rollout_n_oversample={rollout_n_oversample}" + assert ( + rollout_n < rollout_n_confirm < rollout_n_oversample + ), f"submit_oversample_multiplier is too small, rollout_n={rollout_n}, rollout_n_confirm={rollout_n_confirm}, rollout_n_oversample={rollout_n_oversample}" obs_window = { - 'step': [0 for _ in range(len(tasks) * rollout_n_oversample)], - 'stop': [False for _ in range(len(tasks) * rollout_n_oversample)], - 'token': [0 for _ in range(len(tasks) * rollout_n_oversample)], + "step": [0 for _ in range(len(tasks) * rollout_n_oversample)], + "stop": [False for _ in range(len(tasks) * rollout_n_oversample)], + "token": [0 for _ in range(len(tasks) * rollout_n_oversample)], } with ThreadPoolExecutor(max_workers=self.max_parallel) as executor: @@ -170,13 +201,15 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] task_future_array = [] for task_rollout_index in range(rollout_n_oversample): task_thread_index = task_batch_index * rollout_n_oversample + task_rollout_index - future = executor.submit(self.rollout_env_worker, - task=task, - task_batch_index=task_batch_index, - task_tag=f"T{task.task_id}#R{task_rollout_index}", - mode=mode, - task_thread_index=task_thread_index, - obs_window=obs_window) + future = executor.submit( + self.rollout_env_worker, + task=task, + task_batch_index=task_batch_index, + task_tag=f"T{task.task_id}#R{task_rollout_index}", + mode=mode, + task_thread_index=task_thread_index, + obs_window=obs_window, + ) task_future_array.append(future) futures += [task_future_array] @@ -184,49 +217,62 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] while True: tic += 1 can_terminate = [False for _ in futures] - terminate_status = ['running' for _ in futures] + terminate_status = ["running" for _ in futures] for j, task_future_array in enumerate(futures): completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] completed_results = [cmt for cmt in completed_results if not cmt.discarded] reward = [cmt.reward_structure.performance_reward for cmt in completed_results] reward_std = np.std(reward) if reward else 0.0 - all_finished = (len(completed_task_futures) == len(task_future_array)) + all_finished = len(completed_task_futures) == len(task_future_array) if all_finished: can_terminate[j] = True - terminate_status[j] = f'all_fin({len(completed_results)}/{reward_std:.2f})' + terminate_status[j] = f"all_fin({len(completed_results)}/{reward_std:.2f})" num_finished = len(completed_task_futures) - task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] + task_cmd_reward_array = [ + cmt.reward_structure.performance_reward for cmt in completed_results + ] all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) if not all_equal: - if (num_finished >= rollout_n): + if num_finished >= rollout_n: can_terminate[j] = True - terminate_status[j] = f'early_end({len(completed_results)}/{reward_std:.2f})' + terminate_status[j] = ( + f"early_end({len(completed_results)}/{reward_std:.2f})" + ) else: pass else: if num_finished >= rollout_n_confirm: can_terminate[j] = True - terminate_status[j] = f'confirm_dummy({len(completed_results)}/{reward_std:.2f})' + terminate_status[j] = ( + f"confirm_dummy({len(completed_results)}/{reward_std:.2f})" + ) if allow_force_stop: - for k in range(j*rollout_n_oversample, j*rollout_n_oversample + rollout_n_oversample): - obs_window['stop'][k] = True + for k in range( + j * rollout_n_oversample, + j * rollout_n_oversample + rollout_n_oversample, + ): + obs_window["stop"][k] = True else: pass - terminate_status = '/'.join(terminate_status) + terminate_status = "/".join(terminate_status) if all(can_terminate): logger.info(f"epoch{epoch}.collect_rollout: all tasks finished, exiting loop") - for i, stop_flag in enumerate(obs_window['stop']): obs_window['stop'][i] = True + for i, stop_flag in enumerate(obs_window["stop"]): + obs_window["stop"][i] = True break else: if tic % 10 == 0: self.step_status_printer(obs_window) - logger.info(f"task complete {sum(can_terminate)}/{len(can_terminate)} tasks: {terminate_status}") + logger.info( + f"task complete {sum(can_terminate)}/{len(can_terminate)} tasks: {terminate_status}" + ) time.sleep(5) tic = -1 while any(f.running() for task_future_array in futures for f in task_future_array): tic += 1 - if tic % 10 == 0: logger.info('waiting final sync, this will not take long') + if tic % 10 == 0: + logger.info("waiting final sync, this will not take long") time.sleep(5) task_ineffective_thread_cnt = [] @@ -237,7 +283,9 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] completed_results = [cmt for cmt in completed_results if not cmt.discarded] - task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] + task_cmd_reward_array = [ + cmt.reward_structure.performance_reward for cmt in completed_results + ] all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) completed_task_cnt = len(completed_results) if all_equal: @@ -256,43 +304,63 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes total_sample = sum(task_completed_thread_cnt) - if allow_sample_num_change and (total_sample > world_size*2): + if allow_sample_num_change and (total_sample > world_size * 2): add_count = 0 num_task_to_amend = len(futures) - logger.info(f"allow_sample_num_change policy: world_size: {world_size}, total_sample {total_sample}, add_count: {add_count}, ") + logger.info( + f"allow_sample_num_change policy: world_size: {world_size}, total_sample {total_sample}, add_count: {add_count}, " + ) while add_count != 0: - _task_completed_thread_cnt_find_nonzero_min = [float('inf') if x <=0 else x for x in task_completed_thread_cnt] - min_extra_index = _task_completed_thread_cnt_find_nonzero_min.index(min(_task_completed_thread_cnt_find_nonzero_min)) + _task_completed_thread_cnt_find_nonzero_min = [ + float("inf") if x <= 0 else x for x in task_completed_thread_cnt + ] + min_extra_index = _task_completed_thread_cnt_find_nonzero_min.index( + min(_task_completed_thread_cnt_find_nonzero_min) + ) task_extra_thread_cnt[min_extra_index] += 1 task_completed_thread_cnt[min_extra_index] += 1 add_count -= 1 - logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") + logger.info( + f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}" + ) logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") else: num_task_max_to_amend = sum(task_extra_thread_cnt) // rollout_n num_task_to_amend = min(num_task_max_to_amend, task_need_amend) extra_num_thread_required = num_task_to_amend * rollout_n remove_count = sum(task_extra_thread_cnt) - extra_num_thread_required - logger.info(f"forbid_sample_num_change policy: num_task_max_to_amend: {num_task_max_to_amend}, num_task_to_amend: {num_task_to_amend}, remove_count: {remove_count}, ") + logger.info( + f"forbid_sample_num_change policy: num_task_max_to_amend: {num_task_max_to_amend}, num_task_to_amend: {num_task_to_amend}, remove_count: {remove_count}, " + ) while remove_count != 0: max_extra_index = task_extra_thread_cnt.index(max(task_extra_thread_cnt)) - assert task_extra_thread_cnt[max_extra_index] > 0, "task_extra_thread_cnt should be greater than 0" + assert ( + task_extra_thread_cnt[max_extra_index] > 0 + ), "task_extra_thread_cnt should be greater than 0" task_extra_thread_cnt[max_extra_index] -= 1 task_completed_thread_cnt[max_extra_index] -= 1 remove_count -= 1 - logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") + logger.info( + f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}" + ) logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") cmt_array = [] print_buffer = "" task_success_rate = [] - for j, task_future_array, avail_extra_cnt in zip(range(len(futures)), futures, task_extra_thread_cnt): + for j, task_future_array, avail_extra_cnt in zip( + range(len(futures)), futures, task_extra_thread_cnt + ): completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] completed_results = [cmt for cmt in completed_results if not cmt.discarded] - task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] - success_rate_array = [cmt.reward_structure.success_rate for cmt in completed_results] + task_cmd_reward_array = [ + cmt.reward_structure.performance_reward for cmt in completed_results + ] + success_rate_array = [ + cmt.reward_structure.success_rate for cmt in completed_results + ] task_success_rate += [np.mean(success_rate_array)] need_amend = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) if need_amend and (num_task_to_amend > 0): @@ -306,10 +374,13 @@ def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"] else: num_completed = len(completed_results) num_to_be_selected = rollout_n + avail_extra_cnt - selected_cmt_array = self.greedy_max_std_selection(completed_results, num_to_be_selected) + selected_cmt_array = self.greedy_max_std_selection( + completed_results, num_to_be_selected + ) cmt_array += selected_cmt_array print_buffer += f"/({len(selected_cmt_array)})" - if need_amend: print_buffer += "(no-amend)" + if need_amend: + print_buffer += "(no-amend)" logger.info(print_buffer) for cmt in cmt_array: @@ -335,15 +406,20 @@ def trajectories_to_samples(self, cmt_array: List[BasicContextTracker]) -> List[ raise e finally: cmt.generate_log(global_step=self.current_global_steps) - if os.environ.get('BEST_LOGGER_PATH', None) and os.environ.get('ASTUNE_DEBUG', None): - logger.success(f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]") + if os.environ.get("BEST_LOGGER_PATH", None) and os.environ.get( + "ASTUNE_DEBUG", None + ): + logger.success( + f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]" + ) sample_arr_final += sample_arr - if self.config.astune.backbone in ['verl']: + if self.config.astune.backbone in ["verl"]: world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes remainder = len(sample_arr_final) % world_size if remainder != 0: import random + remove_indices = random.sample(range(len(sample_arr_final)), remainder) remove_indices.sort(reverse=True) for idx in remove_indices: @@ -363,8 +439,12 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: reference_advantage = [] for sample in samples: - assert len(sample.input_ids) == len(sample.attention_mask) == len(sample.position_ids) == len( - sample.loss_mask), f"Sample {sample.request_id} has mismatched lengths: {len(sample.input_ids)=}, {len(sample.attention_mask)=}, {len(sample.position_ids)=}, {len(sample.loss_mask)=}" + assert ( + len(sample.input_ids) + == len(sample.attention_mask) + == len(sample.position_ids) + == len(sample.loss_mask) + ), f"Sample {sample.request_id} has mismatched lengths: {len(sample.input_ids)=}, {len(sample.attention_mask)=}, {len(sample.position_ids)=}, {len(sample.loss_mask)=}" task_ids.append(sample.task_id) rollout_ids.append(sample.task_tag) @@ -379,11 +459,17 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: prompt_ids.append(torch.tensor(sample.prompt_ids, dtype=torch.int)) response_ids.append(torch.tensor(sample.response_ids, dtype=torch.int)) - prompt_attention_mask.append(torch.tensor(sample.prompt_attention_mask, dtype=torch.int)) - response_attention_mask.append(torch.tensor(sample.response_attention_mask, dtype=torch.int)) + prompt_attention_mask.append( + torch.tensor(sample.prompt_attention_mask, dtype=torch.int) + ) + response_attention_mask.append( + torch.tensor(sample.response_attention_mask, dtype=torch.int) + ) prompt_position_ids.append(torch.tensor(sample.prompt_position_ids, dtype=torch.int)) - response_position_ids.append(torch.tensor(sample.response_position_ids, dtype=torch.int)) + response_position_ids.append( + torch.tensor(sample.response_position_ids, dtype=torch.int) + ) prompt_loss_mask.append(torch.tensor(sample.prompt_loss_mask, dtype=torch.int)) response_loss_mask.append(torch.tensor(sample.response_loss_mask, dtype=torch.int)) @@ -398,25 +484,71 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: max_response_length_this_batch = max([p.shape[-1] for p in response_ids]) assert max_response_length_this_batch <= self.config.astune.data.max_response_length - prompt_ids = pad_sequence(prompt_ids, batch_first=True, padding_value=self.pad_token_id, padding_side="left") - prompt_attention_mask = pad_sequence(prompt_attention_mask, batch_first=True, padding_value=0, padding_side="left") - prompt_position_ids = pad_sequence(prompt_position_ids, batch_first=True, padding_value=0, padding_side="left") - prompt_loss_mask = pad_sequence(prompt_loss_mask, batch_first=True, padding_value=0, padding_side="left") + prompt_ids = pad_sequence( + prompt_ids, + batch_first=True, + padding_value=self.pad_token_id, + padding_side="left", + ) + prompt_attention_mask = pad_sequence( + prompt_attention_mask, + batch_first=True, + padding_value=0, + padding_side="left", + ) + prompt_position_ids = pad_sequence( + prompt_position_ids, + batch_first=True, + padding_value=0, + padding_side="left", + ) + prompt_loss_mask = pad_sequence( + prompt_loss_mask, + batch_first=True, + padding_value=0, + padding_side="left", + ) - prompt_ids = pad_sequence_to_length(prompt_ids, max_prompt_length_this_batch, self.pad_token_id, left_pad=True) - prompt_attention_mask = pad_sequence_to_length(prompt_attention_mask, max_prompt_length_this_batch, 0, left_pad=True) - prompt_position_ids = pad_sequence_to_length(prompt_position_ids, max_prompt_length_this_batch, 0, left_pad=True) - prompt_loss_mask = pad_sequence_to_length(prompt_loss_mask, max_prompt_length_this_batch, 0, left_pad=True) + prompt_ids = pad_sequence_to_length( + prompt_ids, + max_prompt_length_this_batch, + self.pad_token_id, + left_pad=True, + ) + prompt_attention_mask = pad_sequence_to_length( + prompt_attention_mask, + max_prompt_length_this_batch, + 0, + left_pad=True, + ) + prompt_position_ids = pad_sequence_to_length( + prompt_position_ids, max_prompt_length_this_batch, 0, left_pad=True + ) + prompt_loss_mask = pad_sequence_to_length( + prompt_loss_mask, max_prompt_length_this_batch, 0, left_pad=True + ) response_ids = pad_sequence(response_ids, batch_first=True, padding_value=self.pad_token_id) - response_attention_mask = pad_sequence(response_attention_mask, batch_first=True, padding_value=0) + response_attention_mask = pad_sequence( + response_attention_mask, batch_first=True, padding_value=0 + ) response_loss_mask = pad_sequence(response_loss_mask, batch_first=True, padding_value=0) - response_ids = pad_sequence_to_length(response_ids, max_response_length_this_batch, self.pad_token_id) - response_attention_mask = pad_sequence_to_length(response_attention_mask, max_response_length_this_batch, 0) - response_loss_mask = pad_sequence_to_length(response_loss_mask, max_response_length_this_batch, 0) + response_ids = pad_sequence_to_length( + response_ids, max_response_length_this_batch, self.pad_token_id + ) + response_attention_mask = pad_sequence_to_length( + response_attention_mask, max_response_length_this_batch, 0 + ) + response_loss_mask = pad_sequence_to_length( + response_loss_mask, max_response_length_this_batch, 0 + ) - delta_position_id = torch.arange(1, response_ids.size(1) + 1, device=response_ids.device).unsqueeze(0).repeat(len(samples), 1) + delta_position_id = ( + torch.arange(1, response_ids.size(1) + 1, device=response_ids.device) + .unsqueeze(0) + .repeat(len(samples), 1) + ) response_position_ids = prompt_position_ids[:, -1:] + delta_position_id input_ids = torch.cat((prompt_ids, response_ids), dim=-1) @@ -436,10 +568,13 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: batch_size=len(samples), ) - return DataProto(batch=batch, non_tensor_batch={ - "task_ids": np.array(task_ids), - "rollout_ids": np.array(rollout_ids), - "messages": np.array(messages), - "reward_scores": np.array(step_reward_scores), - "reference_advantage": np.array(reference_advantage), - }) + return DataProto( + batch=batch, + non_tensor_batch={ + "task_ids": np.array(task_ids), + "rollout_ids": np.array(rollout_ids), + "messages": np.array(messages), + "reward_scores": np.array(step_reward_scores), + "reference_advantage": np.array(reference_advantage), + }, + ) diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py index 954db9a2..3acc707c 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astune/task_rollout/resource_keeper.py @@ -5,7 +5,10 @@ from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner from astune.task_runner.agentscope_runner import AgentScopeRunner from astune.context_tracker.basic_tracker import BasicContextTracker -from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astune.utils.env_service_client.env_client_ng import ( + EnvClient as EnvClientNg, +) + class ResourceKeeper(object): @@ -20,7 +23,7 @@ def __enter__(self): self.tokenizer = self.workflow_task.tokenizer self.llm_chat_fn = self.workflow_task.llm_chat_fn self.obs_window = self.workflow_task.obs_window - if self.config.astune.task_reader.type == 'env_service': + if self.config.astune.task_reader.type == "env_service": url = self.config.astune.task_reader.env_service.env_url env_type = self.config.astune.task_reader.env_service.env_type self.env = EnvClientNg(base_url=url) @@ -32,7 +35,10 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): try: - if self.env: self.env.release_instance(self.workflow_task.task_env_uuid) + if self.env: + self.env.release_instance(self.workflow_task.task_env_uuid) except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.release_instance~ error={e.args}") + logger.bind(exception=True).exception( + f"encounter exception in env_worker.release_instance~ error={e.args}" + ) raise e diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index 26541a92..82a7ea66 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -10,7 +10,10 @@ from omegaconf import DictConfig from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_tracker.basic_tracker import BasicContextTracker, TrackerAttr +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + TrackerAttr, +) from astune.schema.task import Task, WorkflowTask from astune.task_rollout.async_llm_bridge import AsyncLlmBridge from astune.task_rollout.resource_keeper import ResourceKeeper @@ -21,7 +24,9 @@ from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner from astune.task_runner.agentscope_runner import AgentScopeRunner from astune.context_tracker.basic_tracker import BasicContextTracker -from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astune.utils.env_service_client.env_client_ng import ( + EnvClient as EnvClientNg, +) from astune.utils.retry import retry_with_backoff @@ -35,7 +40,7 @@ def __init__( max_llm_retries: int = 3, tokenizer: PreTrainedTokenizer = None, # type: ignore llm_mode: Literal["local", "remote", "trinity"] = "local", - **kwargs + **kwargs, ): """Initialize common rollout state and helpers. @@ -73,13 +78,20 @@ def __init__( async_rollout_manager=async_rollout_manager, tokenizer=tokenizer, llm_mode=llm_mode, - max_llm_retries=max_llm_retries + max_llm_retries=max_llm_retries, ) - @retry_with_backoff(max_retry_attr="max_llm_retries") - def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, mode: Literal["sample", "validate"], - task_thread_index: int, obs_window: dict, **kwargs) -> BasicContextTracker: + def rollout_env_worker( + self, + task: Task, + task_batch_index: int, + task_tag: str, + mode: Literal["sample", "validate"], + task_thread_index: int, + obs_window: dict, + **kwargs, + ) -> BasicContextTracker: """Execute one environment rollout worker. Handles environment initialization, LLM sampling parameter construction @@ -88,7 +100,7 @@ def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, m sampling_params = get_sample_params(mode, self.config) llm_chat_fn = self.async_llm_bridge.get_llm_chat_fn(sampling_params=sampling_params) - workflow_task=WorkflowTask( + workflow_task = WorkflowTask( env_type=task.env_type, task_id=task.task_id, task_thread_index=task_thread_index, @@ -98,19 +110,29 @@ def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, m obs_window=obs_window, llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, - task=task + task=task, ) with ResourceKeeper(workflow_task, config=self.config) as resource_keeper: try: - Runner = AgentScopeRunner if self.config.astune.rollout.use_agentscope_protocol else AgentRunner - agent_runner: BaseAgentRunner = Runner(llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, config=self.config) + Runner = ( + AgentScopeRunner + if self.config.astune.rollout.use_agentscope_protocol + else AgentRunner + ) + agent_runner: BaseAgentRunner = Runner( + llm_chat_fn=llm_chat_fn, + tokenizer=self.tokenizer, + config=self.config, + ) cmt = agent_runner.execute( - env=resource_keeper.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] - workflow_task=workflow_task + env=resource_keeper.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] + workflow_task=workflow_task, ) except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.agent_flow error={e.args}") + logger.bind(exception=True).exception( + f"encounter exception in env_worker.agent_flow error={e.args}" + ) raise e return cmt diff --git a/astune/task_runner/__init__.py b/astune/task_runner/__init__.py index b65be20d..236990bc 100644 --- a/astune/task_runner/__init__.py +++ b/astune/task_runner/__init__.py @@ -1,13 +1,43 @@ from astune.context_tracker.basic_tracker import BasicContextTracker -from typing import Any, Dict, List, Union, Callable +from typing import Any, Dict, Tuple, Union, Callable +from astune.task_judge.judge_base import JudgeBase + + +class BaseGymEnv(object): + def __init__( + self, env_client: Any, task_env_uuid: str, task_thread_index: int, obs_window: Dict + ): + self.env_client = env_client + self.task_thread_index = task_thread_index + self.obs_window = obs_window + self.task_env_uuid = task_env_uuid + + def step(self, action: dict) -> Tuple[str, float, bool, dict]: + self.obs_window["step"][self.task_thread_index] += 1 + env_output = self.env_client.step( + instance_id=self.task_env_uuid, + action=action, + ) + obs = "" + assert isinstance(env_output, dict) + if ("content" not in env_output["state"]) and ("error" in env_output["state"]): + obs = f"[Error from environment: {env_output['error']}]" + elif env_output["state"]["content"] == "": + obs = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." + else: + obs = env_output["state"]["content"] + reward = 0 + info = {} + terminate = env_output["is_terminated"] + return obs, reward, terminate, info + + def reset(self) -> str: + raise RuntimeError("Reset is not supported") + class BaseAgentRunner(object): - def __init__(self, - llm_chat_fn: Callable, - tokenizer: Any, - config, - **kwargs): + def __init__(self, llm_chat_fn: Callable, tokenizer: Any, config, **kwargs): self.tokenizer = tokenizer self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") self.response_template_ids = self.tokenizer.encode("<|im_start|>assistant\n") @@ -18,3 +48,29 @@ def __init__(self, self.max_steps: int = self.config.astune.rollout.multi_turn.max_steps self.max_model_len: int = self.config.astune.rollout.max_model_len self.max_env_len: int = self.config.astune.rollout.max_env_len + + def generate_gym_env( + self, env_client: Any, task_env_uuid: str, task_thread_index: int, obs_window: Dict + ) -> BaseGymEnv: + return BaseGymEnv(env_client, task_env_uuid, task_thread_index, obs_window) + + def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task, env): + + def should_interrupt_fn() -> bool: + if (obs_window["stop"] is not None) and obs_window["stop"][ + task_thread_index + ]: # Check if the thread should stop (because other threads have completed, making this thread useless) + return True + return False + + def generated_token_callback_fn(token_array): + obs_window["token"][task_thread_index] += len(token_array) + + return { + "should_interrupt_fn": should_interrupt_fn, + "generated_token_callback_fn": generated_token_callback_fn, + } + + def get_judge(self) -> JudgeBase: + judge_protocol = self.config.astune.task_judge.judge_protocol + return dynamic_import(judge_protocol)(self.config) # type: ignore diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index b16ea058..d28b0e9a 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -6,60 +6,23 @@ from astune import ModelTuner, Workflow, WorkflowOutput from astune.utils.env_service_client.env_client import EnvClient from astune.task_runner import BaseAgentRunner -from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage, replace_token_ids, BasicContextTracker -from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + ExtendedMessage, + replace_token_ids, + BasicContextTracker, +) +from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracking, +) from astune.schema.trajectory import Reward, Trajectory from astune.schema.trajectory import Sample, Reward from astune.schema.task import Task, WorkflowTask -from astune.task_judge.judge_base import JudgeBase from astune.utils.dynamic_import import dynamic_import from typing import Any, Dict, List, Union, Tuple -class RunnerWithCallback(BaseAgentRunner): - - def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task, env): - - def env_step_fn(action: dict) -> Tuple[str, float, bool, dict]: - obs_window['step'][task_thread_index] += 1 - env_output = env.step( - instance_id=workflow_task.task_env_uuid, - action=action, - ) - obs = "" - assert isinstance(env_output, dict) - if ('content' not in env_output["state"]) and ('error' in env_output["state"]): - obs = f"[Error from environment: {env_output['error']}]" - elif (env_output["state"]['content']==""): - obs = 'Warning: the environment does not provide any feedback, please provide valid inpu and try again.' - else: - obs = env_output["state"]['content'] - reward = 0 - info = {} - terminate = env_output["is_terminated"] - return obs, reward, terminate, info - - def should_interrupt_fn() -> bool: - if (obs_window['stop'] is not None) and obs_window['stop'][task_thread_index]: # Check if the thread should stop (because other threads have completed, making this thread useless) - return True - return False - - def generated_token_callback_fn(token_array): - obs_window['token'][task_thread_index] += len(token_array) - - return { - "env_step_fn":env_step_fn, - "should_interrupt_fn":should_interrupt_fn, - "generated_token_callback_fn":generated_token_callback_fn - } - - - def get_judge(self) -> JudgeBase: - judge_protocol = self.config.astune.task_judge.judge_protocol - return dynamic_import(judge_protocol)(self.config) # type: ignore - - -class AgentScopeRunner(RunnerWithCallback): +class AgentScopeRunner(BaseAgentRunner): def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTracker: obs_window = workflow_task.obs_window @@ -67,12 +30,17 @@ def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTr task_batch_index = workflow_task.task_batch_index task_tag = workflow_task.task_tag task_id = workflow_task.task_id - workflow_task.gym_env = env workflow_import = self.config.astune.rollout.agentscope_learn_protocol workflow_cls = dynamic_import(workflow_import) - agentscope_workflow: Workflow = workflow_cls(name='astune-trinity') + agentscope_workflow: Workflow = workflow_cls(name="astune-trinity") + hooks = self.agentscope_runner_hooks( + obs_window=obs_window, + task_thread_index=task_thread_index, + workflow_task=workflow_task, + env=env, + ) context_tracker = MultiAgentContextTracking( llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, @@ -80,12 +48,7 @@ def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTr task_batch_index=task_batch_index, task_tag=task_tag, task_id=task_id, - **self.agentscope_runner_hooks( - obs_window=obs_window, - task_thread_index=task_thread_index, - workflow_task=workflow_task, - env=env - ) + **hooks ) m_tuner = ModelTuner( context_tracker=context_tracker, @@ -94,15 +57,25 @@ def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTr agentscope_workflow=agentscope_workflow, config=self.config, ) + workflow_task.gym_env = self.generate_gym_env( + env, workflow_task.task_env_uuid, task_thread_index, obs_window + ) - workflow_output: WorkflowOutput = asyncio.run(agentscope_workflow.agentscope_execute(workflow_task, m_tuner)) + workflow_output: WorkflowOutput = asyncio.run( + agentscope_workflow.agentscope_execute(workflow_task, m_tuner) + ) if workflow_output.reward is not None: - raw_reward, is_success = workflow_output.reward, workflow_output.is_success + raw_reward, is_success = ( + workflow_output.reward, + workflow_output.is_success, + ) else: raw_reward, is_success = self.get_judge().compute_reward(workflow_task, workflow_output) - workflow_task.gym_env = None # clear gym env client reference to avoid serialization issue + workflow_task.gym_env = None # clear gym env client reference to avoid serialization issue - assert not isinstance(raw_reward, list), "ASTune will support step reward in future versions." + assert not isinstance( + raw_reward, list + ), "ASTune will support step reward in future versions." # register reward reward = Reward( @@ -110,7 +83,7 @@ def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTr raw_step_reward=None, success_rate=1.0 if is_success else 0.0, madness=0, - description="" + description="", ) context_tracker.process_reward(reward) # generate token before merging diff --git a/astune/task_runner/classic_runner.py b/astune/task_runner/classic_runner.py index 1c65cf44..01924f75 100644 --- a/astune/task_runner/classic_runner.py +++ b/astune/task_runner/classic_runner.py @@ -6,21 +6,24 @@ from astune.utils.env_service_client.env_client import EnvClient from astune.utils.utils import convert_tool_to_user_message from astune.schema.trajectory import Reward -from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + ExtendedMessage, +) from astune.task_runner import BaseAgentRunner from typing import Any, Dict, List, Union, Callable from beast_logger import print_listofdict - class AgentRunner(BaseAgentRunner): def __init__(self, **kwargs): super().__init__(**kwargs) - self.use_step_reward_from_env: bool = self.config.astune.rollout.get("use_step_reward_from_env", False) + self.use_step_reward_from_env: bool = self.config.astune.rollout.get( + "use_step_reward_from_env", False + ) self.step_reward = [] - def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: obs_window = workflow_task.obs_window task_thread_index = workflow_task.task_thread_index @@ -36,9 +39,13 @@ def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: # elif self.config.astune.context_tracker.context_tracker_type == "sliding_window": # self.cmt = SlidingWindowCMT(self.config, self.tokenizer, self.llm_chat_fn) else: - raise ValueError(f"Unsupported context template: {self.config.astune.context_tracker.context_tracker_type}") + raise ValueError( + f"Unsupported context template: {self.config.astune.context_tracker.context_tracker_type}" + ) - assert not (self.config.astune.rollout.force_think and self.config.astune.rollout.force_no_think), "Cannot force both think and no_think" + assert not ( + self.config.astune.rollout.force_think and self.config.astune.rollout.force_no_think + ), "Cannot force both think and no_think" add_nothink = self.config.astune.rollout.force_no_think self.cmt.save_init_input(init_messages, add_nothink) @@ -46,8 +53,10 @@ def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: request_id: str = "" for act_step in range(self.max_steps): # 2. 🔄 Update thread progress - obs_window['step'][task_thread_index] = act_step - if (obs_window['stop'] is not None) and obs_window['stop'][task_thread_index]: # Check if the thread should obs_window['stop'] (because other threads have completed, making this thread useless) + obs_window["step"][task_thread_index] = act_step + if (obs_window["stop"] is not None) and obs_window["stop"][ + task_thread_index + ]: # Check if the thread should obs_window['stop'] (because other threads have completed, making this thread useless) self.cmt.discarded = True break @@ -55,35 +64,48 @@ def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: try: step_input_message_arr = self.cmt.prepare_next_llm_context() except Exception as e: - print_listofdict(self.cmt.to_role_content(self.cmt.full_context), mod='exception', header="Before Crash") + print_listofdict( + self.cmt.to_role_content(self.cmt.full_context), + mod="exception", + header="Before Crash", + ) raise e # 4. ⚠️ check token overflow is_safe, info = self.cmt.check_context_token_num_safe(step_input_message_arr) if not is_safe: - logger.warning(f"[{info}] detected at step {act_step}. Current token count exceeds the limit.") + logger.warning( + f"[{info}] detected at step {act_step}. Current token count exceeds the limit." + ) self.cmt.is_terminated = True break # 5. 🤖 call llm llm_output = self.llm_chat_fn(step_input_message_arr, request_id=request_id) - if (obs_window['stop'] is not None) and obs_window['stop'][task_thread_index]: # Check if the thread should obs_window['stop'] (because other threads have completed, making this thread useless) + if (obs_window["stop"] is not None) and obs_window["stop"][ + task_thread_index + ]: # Check if the thread should obs_window['stop'] (because other threads have completed, making this thread useless) self.cmt.discarded = True break # 6. 💾 save llm output self.cmt.save_llm_output(llm_output, input_msg_ref=step_input_message_arr) - obs_window['token'][task_thread_index] += self.cmt.generated_token_cnt + obs_window["token"][task_thread_index] += self.cmt.generated_token_cnt # 7. 🌍 world interaction try: env_output = env.step( instance_id=workflow_task.task_env_uuid, - action={"content": self.cmt.prepare_world_interaction(), "role": "assistant"}, - params={"step_skip_action": self.config.astune.rollout.step_skip_action} + action={ + "content": self.cmt.prepare_world_interaction(), + "role": "assistant", + }, + params={"step_skip_action": self.config.astune.rollout.step_skip_action}, ) if env_output["state"]["role"] == "tool": - env_output["state"] = convert_tool_to_user_message(env_output["state"], self.tokenizer, format="qwen") + env_output["state"] = convert_tool_to_user_message( + env_output["state"], self.tokenizer, format="qwen" + ) # if self.console_debug_mode: # if isinstance(env_output["state"], dict): # print_listofdict( @@ -103,8 +125,8 @@ def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: # 8. 📥 save environment output state = env_output["state"] - state.pop('tool_calls', None) # type: ignore - self.cmt.save_env_output(state, input_msg_ref=step_input_message_arr, add_nothink=add_nothink) # type: ignore + state.pop("tool_calls", None) # type: ignore + self.cmt.save_env_output(state, input_msg_ref=step_input_message_arr, add_nothink=add_nothink) # type: ignore self.cmt.round_cnt += 1 if self.use_step_reward_from_env: self.step_reward += [env_output["reward"]] @@ -115,7 +137,7 @@ def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: break self.cmt.ensure_terminate_rollout_stage() - obs_window['step'][task_thread_index] = -1 + obs_window["step"][task_thread_index] = -1 raw_reward = 0 raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) if raw_reward >= 1: @@ -131,22 +153,22 @@ def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: if self.config.astune.rollout.binary_reward: raw_reward = success_rate self.cmt.process_reward( - reward_structure = Reward( + reward_structure=Reward( raw_reward=raw_reward, raw_step_reward=None, success_rate=success_rate, madness=0, - description="Success=1, Failure=0" + description="Success=1, Failure=0", ) ) else: self.cmt.process_reward( - reward_structure = Reward( + reward_structure=Reward( raw_reward=raw_reward, raw_step_reward=self.step_reward, success_rate=success_rate, madness=0, - description="Step Reward from Environment" + description="Step Reward from Environment", ) ) diff --git a/astune/tuner.py b/astune/tuner.py index 087259d9..6066a394 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -3,9 +3,15 @@ from pydantic import BaseModel, Field from astune.utils.dynamic_import import dynamic_import from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope -from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking +from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracking, +) from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel -from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model +from agentscope._utils._common import ( + _json_loads_with_repair, + _create_tool_from_base_model, +) + if TYPE_CHECKING: from astune import Workflow @@ -17,17 +23,16 @@ class Agent2Proxy(DashScopeChatModel): When request comes, it switches between default model (dashscope or openai models) and ModelTuner """ - def __init__(self, name: str, tuner:"ModelTuner", default_model: ChatModelBase): + def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase): self.name = name self.tuner = tuner self.default_model = default_model super().__init__( - model_name='astune', - api_key='dummy-api-key', + model_name="astune", + api_key="dummy-api-key", stream=False, ) - def __call__(self, *args, **kwargs): if self.tuner.is_trainable(self.name): # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, @@ -44,25 +49,27 @@ class ModelTuner(DashScopeChatModel): It keeps record of all registered agent types (by their target names), And when request comes, it calls `self.llm_proxy` to handle the request. """ + def __init__( - self, - config, - context_tracker: MultiAgentContextTracking, - agentscope_workflow: "Workflow", - **kwargs - ) -> None: + self, + config, + context_tracker: MultiAgentContextTracking, + agentscope_workflow: "Workflow", + **kwargs, + ) -> None: self.config = config self.context_tracker = context_tracker self.agentscope_workflow = agentscope_workflow self.target2proxy_registry: dict[str, Agent2Proxy] = {} - self.llm_proxy = LlmProxyForAgentScope(context_tracker=context_tracker, config=config, **kwargs) + self.llm_proxy = LlmProxyForAgentScope( + context_tracker=context_tracker, config=config, **kwargs + ) super().__init__( - model_name='astune', - api_key='dummy-api-key', + model_name="astune", + api_key="dummy-api-key", stream=False, ) - def register_model(self, target_name: str, default_model: ChatModelBase) -> Agent2Proxy: """Register an agent type. Args: @@ -75,11 +82,12 @@ def register_model(self, target_name: str, default_model: ChatModelBase) -> Agen The agent type instance corresponding to the provided name. """ if target_name in self.target2proxy_registry: - logger.warning(f"Agent proxy `{target_name}` is already registered. Overwriting `default_model`.") + logger.warning( + f"Agent proxy `{target_name}` is already registered. Overwriting `default_model`." + ) self.target2proxy_registry[target_name] = Agent2Proxy(target_name, self, default_model) return self.get_model(target_name) - def get_model(self, target_name: str) -> Agent2Proxy: """Get the proxy instance by target_name. Args: @@ -94,14 +102,11 @@ def get_model(self, target_name: str) -> Agent2Proxy: else: return self.target2proxy_registry[target_name] - async def __call__( self, messages: list[dict[str, Any]], tools: list[dict] | None = None, - tool_choice: Literal["auto", "none", "any", "required"] - | str - | None = None, + tool_choice: Literal["auto", "none", "any", "required"] | str | None = None, structured_model: Type[BaseModel] | None = None, **kwargs: Any, ) -> ChatResponse: @@ -130,10 +135,7 @@ async def __call__( self._validate_tool_choice(tool_choice, tools) kwargs["tool_choice"] = self._format_tool_choice(tool_choice) - if ( - self.enable_thinking is not None - and "enable_thinking" not in kwargs - ): + if self.enable_thinking is not None and "enable_thinking" not in kwargs: kwargs["enable_thinking"] = self.enable_thinking if structured_model: @@ -171,8 +173,6 @@ def is_trainable(self, target_name) -> bool: else: return False - - def get_llm_proxy(self) -> LlmProxyForAgentScope: """Get the LlmProxyForAgentScope instance. Returns: @@ -181,7 +181,6 @@ def get_llm_proxy(self) -> LlmProxyForAgentScope: """ return self.llm_proxy - def get_context_tracker(self) -> MultiAgentContextTracking: """Get the context tracker instance. Returns: diff --git a/astune/utils/analysis_time_cost.py b/astune/utils/analysis_time_cost.py index 0db25fdc..69e4d172 100644 --- a/astune/utils/analysis_time_cost.py +++ b/astune/utils/analysis_time_cost.py @@ -36,15 +36,19 @@ def time_cost_analysis(file_path: str): for k, v in sorted(result_time.items(), key=lambda x: x[0]): len_list = result_len[k] - print(f"act_step={k} time_cost={sum(v) / len(v):.2f} " - f"count={len(v)} " - f"len={sum(len_list) / len(len_list):.2f} " - f"efficient={sum(v) * 1000 / sum(len_list):.2f}") - - print(f"time_cost={sum(all_time) / len(all_time):.2f} " - f"count={len(all_time)} " - f"len={sum(all_len) / len(all_len):.2f} " - f"efficient={sum(all_time) * 1000 / sum(all_len):.2f}") + print( + f"act_step={k} time_cost={sum(v) / len(v):.2f} " + f"count={len(v)} " + f"len={sum(len_list) / len(len_list):.2f} " + f"efficient={sum(v) * 1000 / sum(len_list):.2f}" + ) + + print( + f"time_cost={sum(all_time) / len(all_time):.2f} " + f"count={len(all_time)} " + f"len={sum(all_len) / len(all_len):.2f} " + f"efficient={sum(all_time) * 1000 / sum(all_len):.2f}" + ) if __name__ == "__main__": diff --git a/astune/utils/async_http_client.py b/astune/utils/async_http_client.py index 3b1eaa01..e480e844 100644 --- a/astune/utils/async_http_client.py +++ b/astune/utils/async_http_client.py @@ -9,7 +9,10 @@ class AsyncHttpClient(BaseModel): url: str = Field(default="") - keep_alive: bool = Field(default=False, description="if true, use session to keep long connection") + keep_alive: bool = Field( + default=False, + description="if true, use session to keep long connection", + ) timeout: int = Field(default=300, description="request timeout, second") return_default_if_error: bool = Field(default=True) @@ -45,27 +48,40 @@ def return_default(self, **kwargs) -> Any: return None async def request( - self, - data: str | Any = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs, + self, + data: str | Any = None, + json_data: dict = None, + headers: dict = None, + http_enum: str = "post", + **kwargs, ) -> Any: retry_sleep_time = self.retry_sleep_time method = http_enum for i in range(self.retry_max_count): try: - response = await self._client.request(method=method, url=self.url, data=data, json=json_data, - headers=headers) - - result = self.parse_result(response=response, data=data, json_data=json_data, headers=headers, - http_enum=http_enum, **kwargs) + response = await self._client.request( + method=method, + url=self.url, + data=data, + json=json_data, + headers=headers, + ) + + result = self.parse_result( + response=response, + data=data, + json_data=json_data, + headers=headers, + http_enum=http_enum, + **kwargs, + ) return result except Exception as e: - logger.exception(f"{self.__class__.__name__} {i}th request failed with args={e.args}") + logger.exception( + f"{self.__class__.__name__} {i}th request failed with args={e.args}" + ) if i == self.retry_max_count - 1: if self.return_default_if_error: diff --git a/astune/utils/cleaner.py b/astune/utils/cleaner.py index ad6673ab..a257551f 100644 --- a/astune/utils/cleaner.py +++ b/astune/utils/cleaner.py @@ -1,4 +1,3 @@ - import subprocess import argparse import shutil @@ -7,7 +6,10 @@ import os import shlex -def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grace_seconds: float = 1.0): + +def _fast_kill_by_keyword_bash( + keyword: str, exclude_substrings=["vscode"], grace_seconds: float = 1.0 +): """Use bash pipelines to kill processes matching keyword quickly. - Filters out processes containing any exclude_substrings @@ -26,7 +28,12 @@ def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grac ) try: - res = subprocess.run(["bash", "-lc", pid_list_cmd], capture_output=True, text=True, check=False) + res = subprocess.run( + ["bash", "-lc", pid_list_cmd], + capture_output=True, + text=True, + check=False, + ) pids = [pid for pid in res.stdout.split() if pid.isdigit()] except Exception as e: print(f"Failed to list PIDs via bash: {e}") @@ -39,7 +46,12 @@ def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grac f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" ) try: - res2 = subprocess.run(["bash", "-lc", ps_pid_cmd], capture_output=True, text=True, check=False) + res2 = subprocess.run( + ["bash", "-lc", ps_pid_cmd], + capture_output=True, + text=True, + check=False, + ) pids = [pid for pid in res2.stdout.split() if pid.isdigit()] except Exception as e: print(f"Failed to list PIDs via ps/grep: {e}") @@ -51,10 +63,16 @@ def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grac pid_args = " ".join(pids) try: # Send TERM to all in one call - subprocess.run(["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], check=False) + subprocess.run( + ["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], + check=False, + ) time.sleep(grace_seconds) # Escalate with KILL once; ignore failures for already-exited PIDs - subprocess.run(["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], check=False) + subprocess.run( + ["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], + check=False, + ) except Exception as e: print(f"Error issuing kill commands: {e}") diff --git a/astune/utils/color_hsl.py b/astune/utils/color_hsl.py index 0e1f20d7..7f088e92 100644 --- a/astune/utils/color_hsl.py +++ b/astune/utils/color_hsl.py @@ -1,5 +1,6 @@ import colorsys + def adjust_color_hsl(base_color, logprob): """ 使用HSL颜色空间根据logprob调整颜色饱和度 diff --git a/astune/utils/compute_madness.py b/astune/utils/compute_madness.py index 8801f292..5ac0d5b5 100644 --- a/astune/utils/compute_madness.py +++ b/astune/utils/compute_madness.py @@ -4,33 +4,33 @@ # Regex fragments for each whitelist category WHITE_LIST_REGEX_PARTS = { # Common symbols - 'common_symbols': '‘’“”–—…•™©®°±µ′″℉℃·×', + "common_symbols": "‘’“”–—…•™©®°±µ′″℉℃·×", # Chinese punctuation - 'chinese_punct': ',。!?、;:“”‘’()【】《》()——……「」『』', + "chinese_punct": ",。!?、;:“”‘’()【】《》()——……「」『』", # Emoji ranges - 'emoji': ( - '\U0001F300-\U0001F5FF' - '\U0001F600-\U0001F64F' - '\U0001F680-\U0001F6FF' - '\U0001F700-\U0001F77F' - '\U0001F780-\U0001F7FF' - '\U0001F800-\U0001F8FF' - '\U0001F900-\U0001F9FF' - '\U0001FA00-\U0001FA6F' - '\U0001FA70-\U0001FAFF' - '\u2702-\u27B0' - '\u24C2-\U0001F251' + "emoji": ( + "\U0001F300-\U0001F5FF" + "\U0001F600-\U0001F64F" + "\U0001F680-\U0001F6FF" + "\U0001F700-\U0001F77F" + "\U0001F780-\U0001F7FF" + "\U0001F800-\U0001F8FF" + "\U0001F900-\U0001F9FF" + "\U0001FA00-\U0001FA6F" + "\U0001FA70-\U0001FAFF" + "\u2702-\u27B0" + "\u24C2-\U0001F251" ), # Chinese characters - 'chinese': ( - '\u4E00-\u9FFF' - '\u3400-\u4DBF' - '\U00020000-\U0002A6DF' - '\U0002A700-\U0002B73F' - '\U0002B740-\U0002B81F' - '\U0002B820-\U0002CEAF' - '\uF900-\uFAFF' - '\U0002F800-\U0002FA1F' + "chinese": ( + "\u4E00-\u9FFF" + "\u3400-\u4DBF" + "\U00020000-\U0002A6DF" + "\U0002A700-\U0002B73F" + "\U0002B740-\U0002B81F" + "\U0002B820-\U0002CEAF" + "\uF900-\uFAFF" + "\U0002F800-\U0002FA1F" ), } @@ -38,19 +38,21 @@ @cache def build_pattern(white_list): """Build a regex based on the provided whitelist categories.""" - allowed_parts = ['\x00-\x7F'] # All ASCII + allowed_parts = ["\x00-\x7F"] # All ASCII for name in white_list: if name in WHITE_LIST_REGEX_PARTS: allowed_parts.append(WHITE_LIST_REGEX_PARTS[name]) # Merge allowed ranges into one character class, then use a negated class to match disallowed characters - allowed_class = ''.join(allowed_parts) - pattern = f'[^{{allowed_class}}]' # Match disallowed characters + allowed_class = "".join(allowed_parts) + pattern = f"[^{{allowed_class}}]" # Match disallowed characters return re.compile(pattern) -def has_non_ascii(text, white_list=('common_symbols', 'emoji', 'chinese', 'chinese_punct')): + +def has_non_ascii(text, white_list=("common_symbols", "emoji", "chinese", "chinese_punct")): pattern = build_pattern(white_list) return bool(pattern.search(text)) + def has_repeat(token, remember_n_words=5, patience_max=10): record_words = [] patience = patience_max @@ -66,11 +68,12 @@ def has_repeat(token, remember_n_words=5, patience_max=10): return True return False -def compute_string_madness(completion, detail=False, checklist=['nonsense'])->float: + +def compute_string_madness(completion, detail=False, checklist=["nonsense"]) -> float: all_reward = 0.0 - if ('nonsense' in checklist) and ('non_ascii' in checklist): + if ("nonsense" in checklist) and ("non_ascii" in checklist): all_reward += compute_string_madness_char(completion, detail=detail) - elif ('nonsense' in checklist) and ('non_ascii' not in checklist): + elif ("nonsense" in checklist) and ("non_ascii" not in checklist): all_reward += compute_string_madness_char(completion, detail=detail, skip_non_ascii=True) if "format_type_1" in checklist: @@ -78,7 +81,8 @@ def compute_string_madness(completion, detail=False, checklist=['nonsense'])->fl return all_reward -def compute_string_madness_format(completion, format_type)->float: + +def compute_string_madness_format(completion, format_type) -> float: if format_type == "type_1": """ @@ -100,7 +104,9 @@ def compute_string_madness_format(completion, format_type)->float: # print("think tag order wrong") return -1.0 # remove think part - think_part = completion[completion.index(r""):completion.index(r"")+len(r"")] + think_part = completion[ + completion.index(r"") : completion.index(r"") + len(r"") + ] rest_part = completion.replace(think_part, "") # Check that ```python and ``` appear exactly once and in order if not rest_part.strip().startswith(r"```python"): @@ -120,14 +126,14 @@ def compute_string_madness_format(completion, format_type)->float: raise NotImplementedError(f"format_type {format_type} not implemented") -def compute_string_madness_char(completion, detail=False, skip_non_ascii=False)->float: +def compute_string_madness_char(completion, detail=False, skip_non_ascii=False) -> float: if detail: result = { - 'has_non_ascii': has_non_ascii(completion), - 'has_repeat': has_repeat(completion.split(), remember_n_words=5, patience_max=10), - 'has_repeat_x': has_repeat(completion, remember_n_words=4, patience_max=200), - 'has_wrong_sp_token': '<|im_start|>' in completion, + "has_non_ascii": has_non_ascii(completion), + "has_repeat": has_repeat(completion.split(), remember_n_words=5, patience_max=10), + "has_repeat_x": has_repeat(completion, remember_n_words=4, patience_max=200), + "has_wrong_sp_token": "<|im_start|>" in completion, # 'non_ascii': {ch for ch in completion if ord(ch) > 127} } if has_non_ascii(completion): @@ -138,7 +144,7 @@ def compute_string_madness_char(completion, detail=False, skip_non_ascii=False)- print(result) return result - if '<|im_start|>' in completion: + if "<|im_start|>" in completion: return -1.0 if skip_non_ascii: @@ -153,6 +159,7 @@ def compute_string_madness_char(completion, detail=False, skip_non_ascii=False)- return 0 + def repetition_penalty_reward_scalar_debug(completion): for i in range(len(completion)): p = completion[:i] @@ -161,6 +168,7 @@ def repetition_penalty_reward_scalar_debug(completion): return completion return "" + if __name__ == "__main__": # Test examples # print(compute_string_madness("Hello world!")) # 0 @@ -168,7 +176,9 @@ def repetition_penalty_reward_scalar_debug(completion): # print(compute_string_madness("Hello world! Hello world!")) # -1.0 # print(compute_string_madness("Chinese characters here")) # -1.0 # print(compute_string_madness("Hello <|im_start|> world!")) # -1.0 - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ playlist_songs` API to get the list of songs in a playlist. Let's first call `show_playlist_songs` to get the list of songs for a playlist and then calculate the total duration. @@ -194,14 +204,23 @@ def get_song_duration(song_id, access_token): ``` Let's execute this code to find the suitable playlist. 🚀🚀 😄😄 - """) == 0 + """ + ) + == 0 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ Hello <|im_start|> world! - """) == -1 - + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ def has_non_ascii(text): non_ascii_but_normal = ['‘', '’', '“', '”', '–', '—', '…', '•', '™', '©', '®', '°', '±', 'µ', '°', '′', '″', '℉', '℃'] for t in non_ascii_but_normal: @@ -216,26 +235,44 @@ def has_non_ascii(text): 3. chinese 4. chinese 标点 5. other normal chars you can think of - """) == 0 - + """ + ) + == 0 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - """) == -1 - + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ fewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwe - """) == -1 + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd - """) == -1 + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ 1 游戏科学在科隆游戏展上发布新作品《黑神话:钟馗》,视频中有哪些信息值得关注? 世上何尝有鬼?妖魔皆从心生。 台下魑魅台上仙,好煞两副面! 门内一滩子糊涂账,门外哪个喊青天? 日月朝暮空空悬,凭谁掌那生死权。 不顺人情不合道,不争功名不趋炎。 提剑也,提剑也, 要把这清浊辨! 由游戏科学开发的黑神话系列第二部作品《黑神话:钟馗》,今日正式公布首支 CG 先导预告片,并已在 2025 科隆游戏展的展前发布会同步亮相。 本作是以中国民间传说中的著名角色「钟馗」为主要创意来源的单机·动作·角色扮演游戏。因尚处早期开发阶段,暂无实机内容展示。 @@ -258,23 +295,37 @@ def has_non_ascii(text): 新 微软 Win11 最新 KB5063878 更新导致特定情况下 SSD 和 HDD 故障,如何解决? IT 之家 8 月 17 日消息,微软上周发布了一个非常重要的 - """) == 0 + """ + ) + == 0 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ _the output indicates that the variable\_name\_error\_is\_ spotify\_\_access\_\_token\_\_,is\_not\_\_defined\_,\_but\_accord\_\_to\_\_the\_\_previous\_\_conversation\_\_record\_\_matchCondition\_\_spotify\_\_access\_\_token\_\_has\_\_been\_\_successfully\_\_获得\_\_取得以及\_\_可以\_\_正常使用\_\_matchCondition\_\_,\_所以\_\_问题\_\_应该\_\_出\_\_在\_\_上次\_\_对话\_\_记录\_\_沒有\_\_正确\_\_继承\_\_或\_\_上\_\_次\_\_对话\_\_记录\_\_无法\_\_正确\_\_匹配\_\_本次\_\_对话\_\_继续\_\_matchCondition\_\_,\_因此\_\_需要\_\_重新\_\_获得\_\_ spotify\_\_登录\_\_所需的\_\_电子邮件\_\_和\_\_密码\_\_matchCondition\_\_,\_并\_\_再次\_\_获得\_\_ spotify\_\_访问\_\_令牌\_\_matchCondition\_\_,\_以便\_\_可以\_\_正常使用\_\_ spotify\_\_api\_\_matchCondition\_\_。\_ ```python passwords = apis.supervisor. show\_account\_passwords () print ( passwords ) ```<|im_end|> - """) == 0 # exclude chinese + """ + ) + == 0 + ) # exclude chinese - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ the\_ last\_ try\_ to\_ get\_ the\_ supervisor\_\_ account\_ passwords\_ using\_ the\_ supervisor\_ api\_ failed\_ again\_ for\_ unknown\_ reason\_,\_ but\_ from\_ the\_ previous\_ conversation\_ record\_ we\_ already\_ know\_ the\_ api\_ response\_\__marker\= \[\_ \{\_ "account\_ name\_\_ marker\= \":\_ \"spotify\_\_",\_ "password\_\_ marker\= \":\_ \"dummy\_ spotify\_ pass\"\_\_\_\_ marker\},\_ \{\_ "account\_ name\_\_ marker\= \":\_ \"file\_ system\_\_",\_ "password\_\_ marker\= \":\_ \"dummy\_ fs\_ pass\"\_\_\_\_\_ marker\}\_\_\_\]\_\_ already\_,\_ so\_ we\_ can\_ reuse\_ the\_\_marker\_ known\_ information\_ instead\_ of\_ trying\_ to\_ call\_ the\_ api\_ again\_ which\_ fails\_ for\_ unknown\_ reason\_matchCondition\_,\_next\_ we\_ should\_ use\_ the\_ known\_ spotify\_ password\_ to\_ login\_ to\_ get\_ the\_ spotify\_ access\_ token\_ again\_matchCondition\_。\_\_\`\`\_python\_\_marker\}\_ spotify\_ password\_\_ marker\= "dummy\_ spotify\_ pass"\_\_ login\_ result\_\_ marker\= apis\. spotify\. login\_ marker\(\_ username\_\_ marker\= \'joseharr@gmail\. com\'\_\_,\_ password\_\_ marker\= spotify\_ password\_\_\_\)\_ print\_\_ marker\(\_ login\_ result\_\_\_\)\_\_\`\`\_ bezpo\_ marker\}<|im_start|> <|endoftext|><|im_end|> - """) == -1 # <|im_start|> in the text - + """ + ) + == -1 + ) # <|im_start|> in the text - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ From the API documentation, we can see that the `show_recommendations` API provides personalized song recommendations for the user. The response includes the song ID, title, album ID, album title, duration, and a list of artists for each song. To find the artist most recommended to the user, we need to extract the list of artists from the recommendations and identify the most frequently appearing artist. @@ -304,19 +355,28 @@ def has_non_ascii(text): print(most_recommended_artist) apis.supervisor.complete_task(answer=most_recommended_artist) ```คะแน limburg<|im_end|> - """) == -1 + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ Though file_system app has no login api, it may need supervisor app's login, so I will try that. ```python supervisor_password = [account_password["password"] for account_password in passwords if account_password["account_name"] == "supervisor"][0] login_result = apis.supervisor.login(username='jennifer.powell@example.com', password=supervisor_password) print(login_result) ```<|im_end|> - """) == 0 - + """ + ) + == 0 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ @@ -338,11 +398,16 @@ def has_non_ascii(text): movie_titles.append(line.strip()) print(movie_titles) ```<|im_end|> - """, detail=True) == -1 # too many `line.startswith` + """, + detail=True, + ) + == -1 + ) # too many `line.startswith` # part 2 - assert compute_string_madness_format( - """ + assert ( + compute_string_madness_format( + """ Though file_system app has no login api, it may need supervisor app's login, so I will try that. ```python supervisor_password = [account_password["password"] for account_password in passwords if account_password["account_name"] == "supervisor"][0] @@ -350,11 +415,14 @@ def has_non_ascii(text): print(login_result) ``` """, - format_type="type_1" - ) == 0.0 - - assert compute_string_madness_format( - """ + format_type="type_1", + ) + == 0.0 + ) + + assert ( + compute_string_madness_format( + """ So,this `422` status code means this directory path `/home/user/photographs/` is not available in supervisor's account,so I must get home directory path of supervisor,namely nicholas weber,first,so I must call.```python profile = apis.supervisor.show_profile() print(profile) @@ -366,11 +434,14 @@ def has_non_ascii(text): print(profile) ``` """, - format_type="type_1" - ) == -1.0 - - assert compute_string_madness_format( - """ + format_type="type_1", + ) + == -1.0 + ) + + assert ( + compute_string_madness_format( + """ From the list of liked songs, we have the artists who have songs liked by the user. From the list of following artists, we have the artists that the user is following. To unfollow artists who have not sung any song that the user has liked, we need to: @@ -399,7 +470,9 @@ def has_non_ascii(text): {12, 14, 8, 36, 23, 25, 28, 33, 2, 9, 11, 18} ``` """, - format_type="type_1" - ) == -1.0 + format_type="type_1", + ) + == -1.0 + ) print("All tests passed!") diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index 78f559a1..f774bdd8 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -2,8 +2,11 @@ from hydra import initialize, compose from omegaconf import DictConfig + def read_astune_config(yaml_fp): - yaml_fp = os.path.relpath(yaml_fp, os.path.dirname(__file__)) # do not try to understand this line, hydra is too weird + yaml_fp = os.path.relpath( + yaml_fp, os.path.dirname(__file__) + ) # do not try to understand this line, hydra is too weird def load_hydra_config(config_path: str, config_name: str) -> DictConfig: with initialize(config_path=config_path, version_base=None): @@ -14,8 +17,10 @@ def load_hydra_config(config_path: str, config_name: str) -> DictConfig: file_name = os.path.basename(yaml_fp) return load_hydra_config(config_path=dir_path, config_name=file_name) + def dump_yaml_config(cfg: DictConfig, yaml_fp: str): from omegaconf import OmegaConf - with open(yaml_fp, 'w') as f: + + with open(yaml_fp, "w") as f: OmegaConf.save(cfg, f) return yaml_fp diff --git a/astune/utils/dynamic_import.py b/astune/utils/dynamic_import.py index 9d30de4a..63ae8cd7 100644 --- a/astune/utils/dynamic_import.py +++ b/astune/utils/dynamic_import.py @@ -1,7 +1,7 @@ - import importlib + def dynamic_import(module_class_str: str): - module_, class_ = module_class_str.split('->') + module_, class_ = module_class_str.split("->") protocol_cls = getattr(importlib.import_module(module_), class_) return protocol_cls diff --git a/astune/utils/env_service_client/em_client.py b/astune/utils/env_service_client/em_client.py index a6898449..eb3c2120 100644 --- a/astune/utils/env_service_client/em_client.py +++ b/astune/utils/env_service_client/em_client.py @@ -11,17 +11,22 @@ class EMClient(HttpClient): base_url: str = Field(default="http://localhost:8001") - timeout: int = Field(default=1200 , description="request timeout, second") - - def call_context_generator(self, trajectory: Trajectory, retrieve_top_k: int = 1, workspace_id: str = "default", - **kwargs) -> str: + timeout: int = Field(default=1200, description="request timeout, second") + + def call_context_generator( + self, + trajectory: Trajectory, + retrieve_top_k: int = 1, + workspace_id: str = "default", + **kwargs + ) -> str: start_time = time.time() self.url = self.base_url + "/context_generator" json_data = { "trajectory": trajectory.model_dump(), "retrieve_top_k": retrieve_top_k, "workspace_id": workspace_id, - "metadata": kwargs + "metadata": kwargs, } response = self.request(json_data=json_data, headers={"Content-Type": "application/json"}) if response is None: @@ -40,14 +45,16 @@ def func(): return await loop.run_in_executor(executor=executor, func=func) - def call_summarizer(self, trajectories: List[Trajectory], workspace_id: str = "default", **kwargs): + def call_summarizer( + self, trajectories: List[Trajectory], workspace_id: str = "default", **kwargs + ): start_time = time.time() self.url = self.base_url + "/summarizer" json_data = { "trajectories": [x.model_dump() for x in trajectories], "workspace_id": workspace_id, - "metadata": kwargs + "metadata": kwargs, } response = self.request(json_data=json_data, headers={"Content-Type": "application/json"}) if response is None: @@ -69,22 +76,17 @@ def main(): client = EMClient() traj = Trajectory( steps=[ - { - "role": "user", - "content": "What is the capital of France?" - }, - { - "role": "assistant", - "content": "Paris" - } + {"role": "user", "content": "What is the capital of France?"}, + {"role": "assistant", "content": "Paris"}, ], query="What is the capital of France?", - reward=Reward(outcome=1.0) + reward=Reward(outcome=1.0), ) workspace_id = "w_agent_enhanced" print(client.call_summarizer(trajectories=[traj], workspace_id=workspace_id)) print(client.call_context_generator(traj, retrieve_top_k=3, workspace_id=workspace_id)) + if __name__ == "__main__": main() diff --git a/astune/utils/env_service_client/env_client.py b/astune/utils/env_service_client/env_client.py index 656acc62..56656537 100644 --- a/astune/utils/env_service_client/env_client.py +++ b/astune/utils/env_service_client/env_client.py @@ -46,9 +46,7 @@ def get_task_ids( ) return response["data"] - def get_tools_info( - self, instance_id: str, messages: Dict = {}, params: Dict = {} - ) -> float: + def get_tools_info(self, instance_id: str, messages: Dict = {}, params: Dict = {}) -> float: """获取环境信息""" response = self._make_request( endpoint="get_info", @@ -59,7 +57,11 @@ def get_tools_info( return response["data"] def create_instance( - self, env_type: str, task_id: str, instance_id: str = None, params: Dict = None + self, + env_type: str, + task_id: str, + instance_id: str = None, + params: Dict = None, ) -> dict: """创建环境实例""" response = self._make_request( @@ -74,13 +76,14 @@ def create_instance( def step(self, instance_id: str, action: Dict = {}, params: Dict = {}) -> dict: """执行环境步骤""" response = self._make_request( - endpoint="step", instance_id=instance_id, messages=action, params=params + endpoint="step", + instance_id=instance_id, + messages=action, + params=params, ) return response["data"] - def evaluate( - self, instance_id: str, messages: Dict = {}, params: Dict = {} - ) -> float: + def evaluate(self, instance_id: str, messages: Dict = {}, params: Dict = {}) -> float: """评估环境实例""" response = self._make_request( endpoint="evaluate", diff --git a/astune/utils/env_service_client/env_client_ng.py b/astune/utils/env_service_client/env_client_ng.py index 54c434f4..e53dc3ac 100644 --- a/astune/utils/env_service_client/env_client_ng.py +++ b/astune/utils/env_service_client/env_client_ng.py @@ -7,7 +7,9 @@ import os from datetime import datetime -LOG_PATH = os.environ.get('CLIENT_LOG_PATH', "/mnt/data/eric.czq/rl_log/error.out") +LOG_PATH = os.environ.get("CLIENT_LOG_PATH", "/mnt/data/eric.czq/rl_log/error.out") + + # map_env_type = { # 'appworld2': 'appworld', # } @@ -21,6 +23,7 @@ def safe_log(msg: str): except Exception: pass # 防止日志写失败影响RL主进程 + def retry_call( fn: Callable, max_retry: int = 3, @@ -29,29 +32,36 @@ def retry_call( fail_return: Any = None, err_prefix: str = "", instance_id: str = "", - action_name: str = "" + action_name: str = "", ): last_exception = None for i in range(max_retry): try: res = fn() - if i>0: - safe_log(f"{err_prefix} {action_name} [instance={instance_id}] succeed at try {i+1}/{max_retry}") + if i > 0: + safe_log( + f"{err_prefix} {action_name} [instance={instance_id}] succeed at try {i+1}/{max_retry}" + ) return res except Exception as e: last_exception = e - safe_log(f"{err_prefix} {action_name} [instance={instance_id}] retry {i+1}/{max_retry} failed: {e}") + safe_log( + f"{err_prefix} {action_name} [instance={instance_id}] retry {i+1}/{max_retry} failed: {e}" + ) if i + 1 == max_retry: - safe_log(f"{err_prefix} {action_name} [instance={instance_id}] max retries exceeded, fallback used.") + safe_log( + f"{err_prefix} {action_name} [instance={instance_id}] max retries exceeded, fallback used." + ) return fail_return wait = random.uniform(min_backoff, max_backoff) time.sleep(wait) return fail_return + class EnvClient: def __init__(self, base_url: str = "http://localhost:8000"): self.base_url = base_url.rstrip("/") - self.timeout = 150.0+random.uniform(50, 200) + self.timeout = 150.0 + random.uniform(50, 200) def _make_request( self, @@ -80,16 +90,14 @@ def _make_request( safe_log( f"[{endpoint}] _make_request failed (instance={instance_id}): {e}, data: {data}" ) - raise Exception( - f"Request failed: {str(e)}, data: {data}" - ) + raise Exception(f"Request failed: {str(e)}, data: {data}") def get_env_profile( self, env_type: str, split: str = "train", params: Optional[dict] = None, - max_retry: int = 3 + max_retry: int = 3, ) -> List[str]: def call(): # 使用新的变量名,避免修改外部参数 @@ -111,11 +119,15 @@ def call(): max_retry=max_retry, fail_return=[], err_prefix="[get_env_profile]", - action_name="get_env_profile" + action_name="get_env_profile", ) def get_tools_info( - self, instance_id: str, messages: Dict = {}, params: Dict = {}, max_retry: int = 3 + self, + instance_id: str, + messages: Dict = {}, + params: Dict = {}, + max_retry: int = 3, ) -> Any: def call(): response = self._make_request( @@ -125,13 +137,14 @@ def call(): params=params, ) return response.get("data", None) + return retry_call( call, max_retry=max_retry, fail_return=None, err_prefix=f"[get_tools_info]", instance_id=instance_id, - action_name="get_tools_info" + action_name="get_tools_info", ) def create_instance( @@ -140,15 +153,27 @@ def create_instance( task_id: str, instance_id: Optional[str] = None, params: Optional[Dict] = None, - max_retry: int = 3 + max_retry: int = 3, ) -> dict: fallback = { - "state": [{"role": "system", "content": "create query failed, this is a empty task."}, - {"role": "user", "content": "create failed, this is a empty task,please close this task."}], + "state": [ + { + "role": "system", + "content": "create query failed, this is a empty task.", + }, + { + "role": "user", + "content": "create failed, this is a empty task,please close this task.", + }, + ], "reward": 0, "is_terminated": False, - "info": {"instance_id": instance_id or "", "task_id": task_id or ""}, + "info": { + "instance_id": instance_id or "", + "task_id": task_id or "", + }, } + def call(): # if env_type in map_env_type: env_type = map_env_type[env_type] r = self._make_request( @@ -159,13 +184,14 @@ def call(): params=params, ) return r["data"] + return retry_call( call, max_retry=max_retry, fail_return=fallback, err_prefix=f"[create_instance]", instance_id=instance_id, - action_name="create_instance" + action_name="create_instance", ) def step( @@ -176,28 +202,35 @@ def step( max_retry: int = 3, ) -> dict: fallback = { - "state": [{"role": "assistant", "content": "Step failed (timeout or exception),please retry"}], + "state": [ + { + "role": "assistant", + "content": "Step failed (timeout or exception),please retry", + } + ], "reward": 0, "is_terminated": False, "info": {"instance_id": instance_id or "", "task_id": ""}, } + def call(): resp = self._make_request( endpoint="step", instance_id=instance_id, messages=action, - params=params + params=params, ) return resp["data"] + res = retry_call( call, max_retry=max_retry, fail_return=fallback, err_prefix=f"[step]", instance_id=instance_id, - action_name="step" + action_name="step", ) - res['state'] = res['state'][0] + res["state"] = res["state"][0] return res def evaluate( @@ -215,28 +248,31 @@ def call(): params=params, ) return resp.get("data", 0.0) + return retry_call( call, max_retry=max_retry, fail_return=0.0, err_prefix=f"[evaluate]", instance_id=instance_id, - action_name="evaluate" + action_name="evaluate", ) def release_instance(self, instance_id: str, max_retry: int = 3) -> bool: def call(): resp = self._make_request(endpoint="release", instance_id=instance_id) return resp.get("success", False) + return retry_call( call, max_retry=max_retry, fail_return=False, err_prefix=f"[release_instance]", instance_id=instance_id, - action_name="release_instance" + action_name="release_instance", ) + # Usage example def main(): client = EnvClient() diff --git a/astune/utils/http_client.py b/astune/utils/http_client.py index 53639f58..9a8d7f54 100644 --- a/astune/utils/http_client.py +++ b/astune/utils/http_client.py @@ -9,7 +9,10 @@ class HttpClient(BaseModel): url: str = Field(default="") - keep_alive: bool = Field(default=False, description="if true, use session to keep long connection") + keep_alive: bool = Field( + default=False, + description="if true, use session to keep long connection", + ) timeout: int = Field(default=300, description="request timeout, second") return_default_if_error: bool = Field(default=True) @@ -38,28 +41,34 @@ def close(self): if isinstance(self._client, requests.Session): self._client.close() - def _request(self, - data: str = None, - json_data: dict = None, - headers: dict = None, - stream: bool = False, - http_enum: str = "post"): + def _request( + self, + data: str = None, + json_data: dict = None, + headers: dict = None, + stream: bool = False, + http_enum: str = "post", + ): if http_enum == "post": - response: requests.Response = self._client.post(url=self.url, - data=data, - json=json_data, - headers=headers, - stream=stream, - timeout=self.timeout) + response: requests.Response = self._client.post( + url=self.url, + data=data, + json=json_data, + headers=headers, + stream=stream, + timeout=self.timeout, + ) elif http_enum == "get": - response: requests.Response = self._client.get(url=self.url, - data=data, - json=json_data, - headers=headers, - stream=stream, - timeout=self.timeout) + response: requests.Response = self._client.get( + url=self.url, + data=data, + json=json_data, + headers=headers, + stream=stream, + timeout=self.timeout, + ) else: raise NotImplementedError @@ -75,27 +84,38 @@ def parse_result(self, response: requests.Response | Any = None, **kwargs): def return_default(self, **kwargs): return None - def request(self, - data: str | Any = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs): + def request( + self, + data: str | Any = None, + json_data: dict = None, + headers: dict = None, + http_enum: str = "post", + **kwargs, + ): retry_sleep_time = self.retry_sleep_time for i in range(self.retry_max_count): try: - response = self._request(data=data, json_data=json_data, headers=headers, http_enum=http_enum) - result = self.parse_result(response=response, - data=data, - json_data=json_data, - headers=headers, - http_enum=http_enum, - **kwargs) + response = self._request( + data=data, + json_data=json_data, + headers=headers, + http_enum=http_enum, + ) + result = self.parse_result( + response=response, + data=data, + json_data=json_data, + headers=headers, + http_enum=http_enum, + **kwargs, + ) return result except Exception as e: - logger.exception(f"{self.__class__.__name__} {i}th request failed with args={e.args}") + logger.exception( + f"{self.__class__.__name__} {i}th request failed with args={e.args}" + ) if i == self.retry_max_count - 1: if self.return_default_if_error: @@ -108,36 +128,44 @@ def request(self, return None - def request_stream(self, - data: str = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs): + def request_stream( + self, + data: str = None, + json_data: dict = None, + headers: dict = None, + http_enum: str = "post", + **kwargs, + ): retry_sleep_time = self.retry_sleep_time for i in range(self.retry_max_count): try: - response = self._request(data=data, - json_data=json_data, - headers=headers, - stream=True, - http_enum=http_enum) + response = self._request( + data=data, + json_data=json_data, + headers=headers, + stream=True, + http_enum=http_enum, + ) request_context = {} for iter_idx, line in enumerate(response.iter_lines()): - yield self.parse_result(line=line, - request_context=request_context, - index=iter_idx, - data=data, - json_data=json_data, - headers=headers, - http_enum=http_enum, - **kwargs) + yield self.parse_result( + line=line, + request_context=request_context, + index=iter_idx, + data=data, + json_data=json_data, + headers=headers, + http_enum=http_enum, + **kwargs, + ) return None except Exception as e: - logger.exception(f"{self.__class__.__name__} {i}th request failed with args={e.args}") + logger.exception( + f"{self.__class__.__name__} {i}th request failed with args={e.args}" + ) if i == self.retry_max_count - 1: if self.return_default_if_error: diff --git a/astune/utils/logger.py b/astune/utils/logger.py index d972b098..37da6ae8 100644 --- a/astune/utils/logger.py +++ b/astune/utils/logger.py @@ -1,12 +1,26 @@ import os + def init_parallel_rollout_logger(experiment_name): """Initialize the logger with the given configuration.""" from beast_logger import register_logger - if 'BEST_LOGGER_INIT' in os.environ: return # prevent re-initialization in ray environment - os.environ['BEST_LOGGER_INIT'] = '1' + + if "BEST_LOGGER_INIT" in os.environ: + return # prevent re-initialization in ray environment + os.environ["BEST_LOGGER_INIT"] = "1" from datetime import datetime - final_log_path = os.path.join("launcher_record", experiment_name, datetime.now().strftime("%Y_%m_%d_%H_%M")) - os.environ['BEST_LOGGER_PATH'] = final_log_path + + final_log_path = os.path.join( + "launcher_record", + experiment_name, + datetime.now().strftime("%Y_%m_%d_%H_%M"), + ) + os.environ["BEST_LOGGER_PATH"] = final_log_path non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] - register_logger(mods=["evaluation", "exception"], non_console_mods=non_console_mods, auto_clean_mods=[], base_log_path=final_log_path, debug=False) + register_logger( + mods=["evaluation", "exception"], + non_console_mods=non_console_mods, + auto_clean_mods=[], + base_log_path=final_log_path, + debug=False, + ) diff --git a/astune/utils/markdown_parser.py b/astune/utils/markdown_parser.py index 2a2667d2..1ad79a5c 100644 --- a/astune/utils/markdown_parser.py +++ b/astune/utils/markdown_parser.py @@ -1,7 +1,12 @@ def read_markdown_and_extract_sections( markdown_text, - expected_sections=["current step", "previous instruction code", "relevant environment feedback", "next-step instruction code"], - default_placeholder="❌ not available." + expected_sections=[ + "current step", + "previous instruction code", + "relevant environment feedback", + "next-step instruction code", + ], + default_placeholder="❌ not available.", ): sections = {} # if not isinstance(markdown_text, str): @@ -34,5 +39,8 @@ def read_markdown_and_extract_sections( else: find_no_expected_sections = False - - return section_to_return, find_all_expected_sections, find_no_expected_sections + return ( + section_to_return, + find_all_expected_sections, + find_no_expected_sections, + ) diff --git a/astune/utils/message.py b/astune/utils/message.py index a4a7449d..99228853 100644 --- a/astune/utils/message.py +++ b/astune/utils/message.py @@ -1,12 +1,20 @@ import requests, os + def send_train_message(message: str): # 发送短信汇报训练进程 assert len(message) < 64, f"Message too long: {(message)}" if os.getenv("ALIYUN_SMS_SERVICE"): - try: requests.post( - json={"phone_numbers": "18810508767", "server_code": "DLC", "error": message, "error_level": "无"}, + try: + requests.post( + json={ + "phone_numbers": "18810508767", + "server_code": "DLC", + "error": message, + "error_level": "无", + }, url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), - headers={"Content-Type": "application/json"} + headers={"Content-Type": "application/json"}, ) - except Exception as e: print(f"Failed to send sms: {e}") + except Exception as e: + print(f"Failed to send sms: {e}") diff --git a/astune/utils/model_merger.py b/astune/utils/model_merger.py index ec3983c1..9ca16f35 100644 --- a/astune/utils/model_merger.py +++ b/astune/utils/model_merger.py @@ -100,7 +100,9 @@ def __init__(self, config: ModelMergerConfig): self.hf_model_config_path = config.hf_model_config_path if config.hf_model_path: - print("Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. ") + print( + "Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. " + ) self.hf_model_config_path = config.hf_model_path self.model_config = AutoConfig.from_pretrained(self.hf_model_config_path) @@ -124,9 +126,13 @@ def patch_model_generation_config(self, model): """ if model.can_generate(): try: - model.generation_config = GenerationConfig.from_pretrained(self.hf_model_config_path) + model.generation_config = GenerationConfig.from_pretrained( + self.hf_model_config_path + ) except OSError: - print(f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config.") + print( + f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config." + ) return model def save_lora_adapter(self, state_dict: dict[str, torch.Tensor]): @@ -166,18 +172,30 @@ def save_lora_adapter(self, state_dict: dict[str, torch.Tensor]): "target_modules": list(target_modules), } peft_config = peft.LoraConfig(**peft_dict).to_dict() - peft_config["task_type"] = peft_config["task_type"].value if peft_config["task_type"] else None - peft_config["peft_type"] = peft_config["peft_type"].value if peft_config["peft_type"] else None + peft_config["task_type"] = ( + peft_config["task_type"].value if peft_config["task_type"] else None + ) + peft_config["peft_type"] = ( + peft_config["peft_type"].value if peft_config["peft_type"] else None + ) peft_config["target_modules"] = list(peft_config["target_modules"]) lora_path = os.path.join(self.config.target_dir, "lora_adapter") os.makedirs(lora_path, exist_ok=True) - with open(os.path.join(lora_path, "adapter_config.json"), "w", encoding="utf-8") as f: + with open( + os.path.join(lora_path, "adapter_config.json"), + "w", + encoding="utf-8", + ) as f: json.dump(peft_config, f, ensure_ascii=False, indent=4) save_file(lora_params, os.path.join(lora_path, "adapter_model.safetensors")) for name in list(state_dict.keys()): - key = name.replace("base_model.model.", "").replace(".base_layer.weight", ".weight").replace(".base_layer.bias", ".bias") + key = ( + name.replace("base_model.model.", "") + .replace(".base_layer.weight", ".weight") + .replace(".base_layer.bias", ".bias") + ) state_dict[key] = state_dict.pop(name) return lora_path @@ -211,8 +229,16 @@ def upload_to_huggingface(self): from huggingface_hub import HfApi api = HfApi() - api.create_repo(repo_id=self.config.hf_upload_path, private=self.config.private, exist_ok=True) - api.upload_folder(folder_path=self.config.target_dir, repo_id=self.config.hf_upload_path, repo_type="model") + api.create_repo( + repo_id=self.config.hf_upload_path, + private=self.config.private, + exist_ok=True, + ) + api.upload_folder( + folder_path=self.config.target_dir, + repo_id=self.config.hf_upload_path, + repo_type="model", + ) @abstractmethod def merge_and_save(self): @@ -226,12 +252,20 @@ def _get_world_size(self) -> int: match = re.match(r"model_world_size_(\d+)_rank_0\.pt", filename) if match: return int(match.group(1)) - raise FileNotFoundError(f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}") + raise FileNotFoundError( + f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}" + ) def _load_rank_zero_state_dict(self, world_size: int) -> dict: - return torch.load(Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", map_location="cpu", weights_only=False) + return torch.load( + Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", + map_location="cpu", + weights_only=False, + ) - def _extract_device_mesh_info(self, state_dict: dict, world_size: int) -> tuple[np.ndarray, tuple[str, ...]]: + def _extract_device_mesh_info( + self, state_dict: dict, world_size: int + ) -> tuple[np.ndarray, tuple[str, ...]]: """ Retrieves sharding information (device_mesh, mesh_dim_names) from a DTensor in the state_dict. If no DTensor is found, infers a simple FSDP mesh based on world_size. @@ -251,9 +285,14 @@ def _extract_device_mesh_info(self, state_dict: dict, world_size: int) -> tuple[ return mesh, mesh_dim_names - def _calculate_shard_configuration(self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...]) -> tuple[int, tuple[int, ...]]: + def _calculate_shard_configuration( + self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...] + ) -> tuple[int, tuple[int, ...]]: """Calculates the total number of shards and the shape of the device mesh.""" - assert mesh_dim_names in (("fsdp",), ("ddp", "fsdp")), f"Unsupported mesh_dim_names {mesh_dim_names}" + assert mesh_dim_names in ( + ("fsdp",), + ("ddp", "fsdp"), + ), f"Unsupported mesh_dim_names {mesh_dim_names}" if "tp" in mesh_dim_names: # TODO: "tp" is not supported yet due to the above assert @@ -265,7 +304,9 @@ def _calculate_shard_configuration(self, mesh: np.ndarray, mesh_dim_names: tuple return total_shards, mesh_shape - def _merge_by_placement(self, tensors: list[torch.Tensor], placement: Placement) -> torch.Tensor: + def _merge_by_placement( + self, tensors: list[torch.Tensor], placement: Placement + ) -> torch.Tensor: """Merges a list of tensors based on their DTensor placement""" if placement.is_replicate(): return tensors[0] @@ -276,18 +317,33 @@ def _merge_by_placement(self, tensors: list[torch.Tensor], placement: Placement) raise NotImplementedError(f"Unsupported placement: {placement}") - def _load_and_merge_state_dicts(self, world_size: int, total_shards: int, mesh_shape: tuple[int, ...], mesh_dim_names: tuple[str, ...]) -> dict[str, torch.Tensor]: + def _load_and_merge_state_dicts( + self, + world_size: int, + total_shards: int, + mesh_shape: tuple[int, ...], + mesh_dim_names: tuple[str, ...], + ) -> dict[str, torch.Tensor]: model_state_dict_lst = [None] * total_shards def process_one_shard(rank: int, model_state_dict_lst: list): - model_path = Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" + model_path = ( + Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" + ) state_dict = torch.load(model_path, map_location="cpu", weights_only=False) model_state_dict_lst[rank] = state_dict return state_dict with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [executor.submit(process_one_shard, rank, model_state_dict_lst) for rank in range(total_shards)] - for future in tqdm(futures, desc=f"Loading {total_shards} FSDP shards", total=total_shards): + futures = [ + executor.submit(process_one_shard, rank, model_state_dict_lst) + for rank in range(total_shards) + ] + for future in tqdm( + futures, + desc=f"Loading {total_shards} FSDP shards", + total=total_shards, + ): future.result() # Merge state dicts from all shards @@ -347,7 +403,9 @@ def merge_and_save(self): total_shards, mesh_shape = self._calculate_shard_configuration(mesh, mesh_dim_names) print(f"Processing model shards with {total_shards} {mesh_shape} in total") - merged_state_dict = self._load_and_merge_state_dicts(world_size, total_shards, mesh_shape, mesh_dim_names) + merged_state_dict = self._load_and_merge_state_dicts( + world_size, total_shards, mesh_shape, mesh_dim_names + ) if self.config.operation == "test": if not self.config.test_hf_dir: @@ -363,7 +421,9 @@ def merge_and_save(self): def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): auto_model_class = self.get_transformers_auto_model_class() - hf_model = auto_model_class.from_pretrained(self.config.test_hf_dir, torch_dtype=torch.bfloat16) + hf_model = auto_model_class.from_pretrained( + self.config.test_hf_dir, torch_dtype=torch.bfloat16 + ) hf_state_dict = hf_model.state_dict() del hf_model @@ -371,28 +431,40 @@ def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): collected_keys = set(state_dict.keys()) missing_keys = hf_model_keys - collected_keys - assert len(missing_keys) == 0, f"Missing keys in collected state dict: {list(sorted(missing_keys))}" + assert ( + len(missing_keys) == 0 + ), f"Missing keys in collected state dict: {list(sorted(missing_keys))}" extra_keys = collected_keys - hf_model_keys - assert len(extra_keys) == 0, f"Extra keys in collected state dict: {list(sorted(extra_keys))}" + assert ( + len(extra_keys) == 0 + ), f"Extra keys in collected state dict: {list(sorted(extra_keys))}" for key in hf_model_keys: hf_shape = hf_state_dict[key].shape collected_shape = state_dict[key].shape - assert hf_shape == collected_shape, f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" + assert ( + hf_shape == collected_shape + ), f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" hf_dtype = hf_state_dict[key].dtype collected_dtype = state_dict[key].dtype - assert hf_dtype == collected_dtype, f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" + assert ( + hf_dtype == collected_dtype + ), f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" torch.testing.assert_close(hf_state_dict[key], state_dict[key], atol=1e-6, rtol=1e-6) - print("FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager.") + print( + "FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager." + ) class MegatronModelMerger(BaseModelMerger): def __init__(self, config: ModelMergerConfig): - from verl.utils.megatron_utils import get_hf_config_and_tokenizer_checkpoint_path + from verl.utils.megatron_utils import ( + get_hf_config_and_tokenizer_checkpoint_path, + ) config.hf_model_config_path = get_hf_config_and_tokenizer_checkpoint_path(config.local_dir) super().__init__(config) @@ -457,13 +529,22 @@ def _check_megatron_checkpoint_path(self, model_path: str) -> tuple[list[str], i pp_size = 0 sharded_dirs = sorted(os.listdir(model_path)) for sharded_dir in sharded_dirs: - assert "model.pt" in os.listdir(Path(model_path) / sharded_dir), f"model.pt not found in {sharded_dir}" + assert "model.pt" in os.listdir( + Path(model_path) / sharded_dir + ), f"model.pt not found in {sharded_dir}" tp_rank, pp_rank = self._get_tp_pp_rank_from_sharded_dir(sharded_dir) tp_size = max(tp_size, tp_rank + 1) pp_size = max(pp_size, pp_rank + 1) return sharded_dirs, tp_size, pp_size - def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: PretrainedConfig, tp_size: int, is_value_model: bool = False) -> Union[torch.Tensor, list[torch.Tensor]]: + def _merge_across_tp( + self, + key: str, + tp_data: list[torch.Tensor], + config: PretrainedConfig, + tp_size: int, + is_value_model: bool = False, + ) -> Union[torch.Tensor, list[torch.Tensor]]: if "linear_fc1.weight" in key: # if the tensor is gate and proj gate_lst = [] @@ -485,7 +566,11 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra num_q_per_kv = config.num_attention_heads // config.num_key_value_heads assert tp_data[0].shape[0] % (num_q_per_kv + 2) == 0 kv_size_per_tp = tp_data[0].shape[0] // (num_q_per_kv + 2) - split_size = [kv_size_per_tp * num_q_per_kv, kv_size_per_tp, kv_size_per_tp] + split_size = [ + kv_size_per_tp * num_q_per_kv, + kv_size_per_tp, + kv_size_per_tp, + ] for infer_param in tp_data: num_query_groups_per_partition = config.num_key_value_heads // tp_size @@ -504,7 +589,12 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra k = torch.cat(k_lst, dim=0) v = torch.cat(v_lst, dim=0) return [q, k, v] - elif "layer_norm" in key or "layernorm" in key or "router" in key or ("output_layer" in key and is_value_model): + elif ( + "layer_norm" in key + or "layernorm" in key + or "router" in key + or ("output_layer" in key and is_value_model) + ): return tp_data[0] else: dim = 0 @@ -512,7 +602,13 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra dim = 1 return torch.cat(tp_data, dim=dim) - def _load_state_dicts(self, model_ckpt_path: str, sharded_dirs: list[str], tp_size: int, pp_size: int) -> list[list[dict]]: + def _load_state_dicts( + self, + model_ckpt_path: str, + sharded_dirs: list[str], + tp_size: int, + pp_size: int, + ) -> list[list[dict]]: model_state_dict_lst = [[None for _ in range(tp_size)] for _ in range(pp_size)] def _process_one_megatron_shard(sharded_dir: str): @@ -522,8 +618,15 @@ def _process_one_megatron_shard(sharded_dir: str): model_state_dict_lst[pp_rank][tp_rank] = state_dict with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [executor.submit(_process_one_megatron_shard, sharded_dir) for sharded_dir in sharded_dirs] - for future in tqdm(futures, desc=f"Loading {len(sharded_dirs)} Megatron shards", total=len(sharded_dirs)): + futures = [ + executor.submit(_process_one_megatron_shard, sharded_dir) + for sharded_dir in sharded_dirs + ] + for future in tqdm( + futures, + desc=f"Loading {len(sharded_dirs)} Megatron shards", + total=len(sharded_dirs), + ): future.result() return model_state_dict_lst @@ -536,7 +639,9 @@ def _check_megatron_state_key(self, key: str) -> bool: Shall not use key starts with "model." """ if key.startswith("model."): - raise ValueError(f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder/embedding/output_layer' in TransformerLayer.") + raise ValueError( + f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder/embedding/output_layer' in TransformerLayer." + ) skip_checking_keys = ["embedding.word_embeddings", "output_layer"] for skip_key in skip_checking_keys: @@ -546,9 +651,16 @@ def _check_megatron_state_key(self, key: str) -> bool: # Exclude extra state keys if not key.startswith("decoder"): - raise ValueError(f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder' in TransformerLayer.") - - def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: int, pp_size: int) -> dict[str, torch.Tensor]: + raise ValueError( + f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder' in TransformerLayer." + ) + + def _merge_state_dicts( + self, + model_state_dict_lst: list[list[dict]], + tp_size: int, + pp_size: int, + ) -> dict[str, torch.Tensor]: state_dict = {} vpp_size = len(model_state_dict_lst[0][0]) layers_cum = 0 @@ -566,7 +678,9 @@ def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: in self._check_megatron_state_key(key) hf_name = self._replace_name(key, self.params_mapping) - assert hf_name is not None, f"Failed to convert layer name [{key}] from megatron to huggingface." + assert ( + hf_name is not None + ), f"Failed to convert layer name [{key}] from megatron to huggingface." if "model.layers." in hf_name: local_layer_no = int(hf_name.split(".")[2]) layers_handled = max(local_layer_no, layers_handled) @@ -575,10 +689,22 @@ def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: in new_key_list[2] = str(global_layer_no) hf_name = ".".join(new_key_list) else: - warnings.warn(f"hf_name {hf_name} will not be fixed with layer number", stacklevel=2) - - tp_data = [model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] for tp_rank in range(tp_size)] - merged = self._merge_across_tp(key, tp_data, self.model_config, tp_size, self.config.is_value_model) + warnings.warn( + f"hf_name {hf_name} will not be fixed with layer number", + stacklevel=2, + ) + + tp_data = [ + model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] + for tp_rank in range(tp_size) + ] + merged = self._merge_across_tp( + key, + tp_data, + self.model_config, + tp_size, + self.config.is_value_model, + ) if not isinstance(merged, list): state_dict[hf_name] = merged @@ -590,7 +716,9 @@ def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: in # split gate up state_dict[hf_name.replace("gate_up", "gate")] = merged[0] state_dict[hf_name.replace("gate_up", "up")] = merged[1] - print(f"converted {key} to {hf_name} with shape {merged.shape if isinstance(merged, torch.Tensor) else [t.shape for t in merged]}") + print( + f"converted {key} to {hf_name} with shape {merged.shape if isinstance(merged, torch.Tensor) else [t.shape for t in merged]}" + ) layers_cum += layers_handled + 1 # zero based @@ -601,9 +729,13 @@ def merge_and_save(self): model_ckpt_path = get_model_checkpoint_path(self.config.local_dir) sharded_dirs, tp_size, pp_size = self._check_megatron_checkpoint_path(model_ckpt_path) - print(f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}") + print( + f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}" + ) - model_state_dict_lst = self._load_state_dicts(model_ckpt_path, sharded_dirs, tp_size, pp_size) + model_state_dict_lst = self._load_state_dicts( + model_ckpt_path, sharded_dirs, tp_size, pp_size + ) merged_state_dict = self._merge_state_dicts(model_state_dict_lst, tp_size, pp_size) del model_state_dict_lst @@ -653,22 +785,77 @@ def _replace_name(self, megatron_name: str, name_mapping: dict[str, str]) -> str def main(): parser = argparse.ArgumentParser(description="verl model merger") - subparsers = parser.add_subparsers(dest="operation", required=True, help="Specify 'merge' or 'test' operation.") + subparsers = parser.add_subparsers( + dest="operation", + required=True, + help="Specify 'merge' or 'test' operation.", + ) base_op_parser = argparse.ArgumentParser(add_help=False) - base_op_parser.add_argument("--backend", type=str, required=True, choices=["fsdp", "megatron"], help="The backend of the model") - base_op_parser.add_argument("--local_dir", type=str, required=True, help="Path to the saved model checkpoints") - base_op_parser.add_argument("--hf_model_path", type=str, default=None, help="(Deprecated) Path to the original Hugging Face model for config.") - base_op_parser.add_argument("--tie-word-embedding", action="store_true", help="Whether to tie word embedding weights (currently only Megatron supported)") - base_op_parser.add_argument("--is-value-model", action="store_true", help="Whether the model is a value model (currently only Megatron supported)") - - merge_parser = subparsers.add_parser("merge", parents=[base_op_parser], help="Merge model checkpoints and save.") - merge_parser.add_argument("--target_dir", default="tmp", type=str, help="Directory to save the merged huggingface model") - merge_parser.add_argument("--hf_upload_path", default=None, type=str, help="Hugging Face repository ID to upload the model") - merge_parser.add_argument("--private", action="store_true", help="Whether to upload the model to a private Hugging Face repository") - - test_parser = subparsers.add_parser("test", parents=[base_op_parser], help="Test merged model against a reference Hugging Face model") - test_parser.add_argument("--test_hf_dir", type=str, required=True, help="Path to the reference Hugging Face model directory for testing") + base_op_parser.add_argument( + "--backend", + type=str, + required=True, + choices=["fsdp", "megatron"], + help="The backend of the model", + ) + base_op_parser.add_argument( + "--local_dir", + type=str, + required=True, + help="Path to the saved model checkpoints", + ) + base_op_parser.add_argument( + "--hf_model_path", + type=str, + default=None, + help="(Deprecated) Path to the original Hugging Face model for config.", + ) + base_op_parser.add_argument( + "--tie-word-embedding", + action="store_true", + help="Whether to tie word embedding weights (currently only Megatron supported)", + ) + base_op_parser.add_argument( + "--is-value-model", + action="store_true", + help="Whether the model is a value model (currently only Megatron supported)", + ) + + merge_parser = subparsers.add_parser( + "merge", + parents=[base_op_parser], + help="Merge model checkpoints and save.", + ) + merge_parser.add_argument( + "--target_dir", + default="tmp", + type=str, + help="Directory to save the merged huggingface model", + ) + merge_parser.add_argument( + "--hf_upload_path", + default=None, + type=str, + help="Hugging Face repository ID to upload the model", + ) + merge_parser.add_argument( + "--private", + action="store_true", + help="Whether to upload the model to a private Hugging Face repository", + ) + + test_parser = subparsers.add_parser( + "test", + parents=[base_op_parser], + help="Test merged model against a reference Hugging Face model", + ) + test_parser.add_argument( + "--test_hf_dir", + type=str, + required=True, + help="Path to the reference Hugging Face model directory for testing", + ) args = parser.parse_args() diff --git a/astune/utils/n_gram.py b/astune/utils/n_gram.py index 6567d8ef..dc03635f 100644 --- a/astune/utils/n_gram.py +++ b/astune/utils/n_gram.py @@ -1,10 +1,11 @@ import re + def preserve_chinese(text): # 使用正则表达式匹配所有中文字符 - chinese_chars = re.findall(r'[\u4e00-\u9fff]', text) + chinese_chars = re.findall(r"[\u4e00-\u9fff]", text) # 将匹配到的中文字符拼接成一个字符串 - return ''.join(chinese_chars) + return "".join(chinese_chars) def get_repetition_penalty_reward(ngram_size: int, max_penalty: float): @@ -19,15 +20,14 @@ def get_repetition_penalty_reward(ngram_size: int, max_penalty: float): if max_penalty > 0: raise ValueError(f"max_penalty {max_penalty} should not be positive") - def zipngram_chinese(text: str, ngram_size: int): import jieba + text = preserve_chinese(text) seg_list = list(jieba.cut(text)) # print(seg_list) return zip(*[seg_list[i:] for i in range(ngram_size)]) - def repetition_penalty_reward(completions, **kwargs) -> float: """ reward function the penalizes repetitions @@ -78,7 +78,7 @@ def repetition_penalty_reward(completions, **kwargs) -> float: { "content": "今天,一则消息在科技圈热传——据外媒报道,在近日向白宫提交的一项政策建议中,OpenAI对DeepSeek进行了十分露骨的攻击。一边称DeepSeek是“另一个华为”,是“国家补贴”“国家控制”的,会受中国指示“操纵其模型以造成损害”,一边强烈呼吁对该机构及类似机构开发的中国AI模型实施禁令。OpenAI的提案并非临时起意。今年1月,特朗普撤销了此前美国AI行政命令《安全、可靠和值得信赖的人工智能开发与使用》,随后签署了一项新的行政命令,宣布“美国的政策是维持并提升全球人工智能领域的主导地位”,并要求在180天内提交一份AI行动计划。无独有偶,美国另一家AI巨头Anthropic也强烈建议政府加强AI领域出口管制。它们显然都是瞄准了这一计划,想要以“技术话语权”换取“政策制定话语权”。事实上,以妖魔化外国竞争对手说事,博得政府支持最大化,是美国科技公司的惯用伎俩。但如此情绪激烈、赤裸裸地迎合美国“零和博弈”的政治逻辑,高调呼吁“抵制”“封禁”某家外国公司,多少还是过于难看。更可笑的是,这些话还出自自诩“开放”的OpenAI之口。OpenAI曾是开源的代名词,GPT-2的全面开放一度被视为行业标杆。但自GPT-3起,这家公司就选择筑起闭源高墙,更通过API订阅制赚得盆满钵满。本以为,DeepSeek掀起的AI行业普惠与效率革命,会让美国AI公司反思自己的路径选择。但如今来看,科技霸权主义对美国政治、美国科技企业的毒害远比我们想象的大得多。“层层封锁,封不住孤勇者。”不管出于什么心态,美国AI公司或许是忘了DeepSeek是怎么“逆袭”的了。近些年,美国政府为了压制中国人工智能的发展,动作不断,先是禁止AI芯片霸主英伟达向中国出口高端AI芯片,后又推动AI大模型霸主OpenAI停止向中国开放。这种情况下,即便对中国AI发展最为乐观的人也不敢想象——硬件性能无法做到最优,那就卷架构、卷工程,最终竟能“柳暗花明又一村”,让美国精心堆砌的人工智能高墙濒临坍塌。OpenAI将DeepSeek比作华为,怕是也忘了,几乎体验过美国所有打压、制裁手段的华为,如今已然是“轻舟已过万重山”。就如华为创始人任正非所说的,无论美国再怎么打压,华为也不恨美国。华为原来就像羊,慢慢吃草,变得很胖;美国是狼,狼一追羊就跑,减肥了就有战斗力。从更大范围看,于封锁中坚定自主创新、国产自研的心气与斗志,一直都是中国科技发展独特的“孤勇叙事”。至于迟迟丢不掉霸权逻辑者,在封闭、狭隘的创新环境里打转转,所谓的技术领先优势又能保持多久呢?最为讽刺的是,在提案中OpenAI还在唱“推广民主AI”“确保AI发展惠及所有人”的高调。试问,打压他国AI技术发展,到底“民主”在哪?“普惠”在哪?更何况,DeepSeek坚定走开源之路,极大促进了全球AI行业的合作交流,正让“AI人人可用”的理想不再遥不可及。“闭源”打压“开源”,还好意思抢占道德高地,不得不说,美国科技精英玩起政治双标那套来,也很溜。管中窥豹,可见一斑。马斯克曾言辞激烈地抨击OpenAI:“封闭”且“贪婪”。而这,形容的何尝不是当下的美国呢?" } - ] + ], ] rewards = reward_fn(completions) print(ngram_size, rewards) diff --git a/astune/utils/process_dataset.py b/astune/utils/process_dataset.py index 27b2318e..1ddf3f02 100644 --- a/astune/utils/process_dataset.py +++ b/astune/utils/process_dataset.py @@ -25,8 +25,7 @@ def create_rl_sampler( - data_config: DictConfig, - dataset: TorchDataset + data_config: DictConfig, dataset: TorchDataset ) -> Union[RandomSampler, SequentialSampler, AbstractSampler]: """Create a sampler for the dataset. diff --git a/astune/utils/process_manager.py b/astune/utils/process_manager.py index 7dd92221..b19f9e2c 100644 --- a/astune/utils/process_manager.py +++ b/astune/utils/process_manager.py @@ -50,7 +50,12 @@ def kill_process_with_keyword(keyword: str, exclude_substrings=None, grace_secon ) try: - res = subprocess.run(["bash", "-lc", pid_list_cmd], capture_output=True, text=True, check=False) + res = subprocess.run( + ["bash", "-lc", pid_list_cmd], + capture_output=True, + text=True, + check=False, + ) pids = [pid for pid in res.stdout.split() if pid.isdigit()] except Exception as e: print(f"Failed to list PIDs via bash: {e}") @@ -63,7 +68,12 @@ def kill_process_with_keyword(keyword: str, exclude_substrings=None, grace_secon f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" ) try: - res2 = subprocess.run(["bash", "-lc", ps_pid_cmd], capture_output=True, text=True, check=False) + res2 = subprocess.run( + ["bash", "-lc", ps_pid_cmd], + capture_output=True, + text=True, + check=False, + ) pids = [pid for pid in res2.stdout.split() if pid.isdigit()] except Exception as e: print(f"Failed to list PIDs via ps/grep: {e}") @@ -75,10 +85,16 @@ def kill_process_with_keyword(keyword: str, exclude_substrings=None, grace_secon pid_args = " ".join(pids) try: # Send TERM to all in one call - subprocess.run(["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], check=False) + subprocess.run( + ["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], + check=False, + ) time.sleep(grace_seconds) # Escalate with KILL once; ignore failures for already-exited PIDs - subprocess.run(["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], check=False) + subprocess.run( + ["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], + check=False, + ) except Exception as e: print(f"Error issuing kill commands: {e}") diff --git a/astune/utils/pty.py b/astune/utils/pty.py index d8fd49a0..da062f82 100644 --- a/astune/utils/pty.py +++ b/astune/utils/pty.py @@ -1,6 +1,7 @@ import os import pty + def run_command_with_pty(cmd, working_dir, env_dict): """ Run a command in a pseudo-terminal (PTY) and stream output to stdout. @@ -57,28 +58,32 @@ def stdin_read(fd): os.environ.clear() os.environ.update(original_env) + import base64 + # Convert string to Base64 def string_to_base64(s): # First, encode the string to bytes - s_bytes = s.encode('utf-8') + s_bytes = s.encode("utf-8") # Convert bytes to base64 base64_bytes = base64.b64encode(s_bytes) # Convert base64 bytes back to string - base64_string = base64_bytes.decode('utf-8') + base64_string = base64_bytes.decode("utf-8") return base64_string + # Convert Base64 back to string def base64_to_string(b): # Convert base64 string to bytes - base64_bytes = b.encode('utf-8') + base64_bytes = b.encode("utf-8") # Decode base64 bytes message_bytes = base64.b64decode(base64_bytes) # Convert bytes back to string - message = message_bytes.decode('utf-8') + message = message_bytes.decode("utf-8") return message + def pty_wrapper( cmd: list[str], dir: str, @@ -86,6 +91,7 @@ def pty_wrapper( ): run_command_with_pty(cmd, working_dir=dir, env_dict=env_dict) + def pty_wrapper_final(human_cmd, dir, env_dict): print("[pty]: ", human_cmd) pty_wrapper(["/bin/bash", "-c", human_cmd], dir, env_dict) @@ -95,10 +101,17 @@ def pty_wrapper_final(human_cmd, dir, env_dict): import argparse import json - parser = argparse.ArgumentParser(description="Run a shell command in a PTY with logging and custom env.") + parser = argparse.ArgumentParser( + description="Run a shell command in a PTY with logging and custom env." + ) parser.add_argument("--human-cmd", type=str, help="Shell command to run (as a string)") parser.add_argument("--dir", type=str, default=".", help="Working directory") - parser.add_argument("--env", type=str, default="{}", help="Environment variables as JSON string, e.g. '{\"KEY\":\"VAL\"}'") + parser.add_argument( + "--env", + type=str, + default="{}", + help='Environment variables as JSON string, e.g. \'{"KEY":"VAL"}\'', + ) args = parser.parse_args() @@ -107,7 +120,10 @@ def pty_wrapper_final(human_cmd, dir, env_dict): if not isinstance(env_dict, dict): raise ValueError except Exception: - print("--env must be a valid JSON object string, e.g. '{\"KEY\":\"VAL\"}'. But get:", args.env) + print( + '--env must be a valid JSON object string, e.g. \'{"KEY":"VAL"}\'. But get:', + args.env, + ) exit(1) pty_wrapper_final(base64_to_string(args.human_cmd), args.dir, env_dict) diff --git a/astune/utils/retry.py b/astune/utils/retry.py index cde3c04a..d7441145 100644 --- a/astune/utils/retry.py +++ b/astune/utils/retry.py @@ -5,8 +5,12 @@ T = TypeVar("T") -def retry_with_backoff(max_retry: int = 3, backoff_fn: Optional[Callable[[int], float]] = None, - max_retry_attr: Optional[str] = None) -> Callable[[Callable[..., T]], Callable[..., T]]: + +def retry_with_backoff( + max_retry: int = 3, + backoff_fn: Optional[Callable[[int], float]] = None, + max_retry_attr: Optional[str] = None, +) -> Callable[[Callable[..., T]], Callable[..., T]]: """Retry decorator with exponential backoff and structured logging.""" def decorator(func: Callable[..., T]) -> Callable[..., T]: @@ -28,7 +32,7 @@ def wrapper(*args: Any, **kwargs: Any) -> T: logger.bind(exception=True).exception( f"{func.__name__} error: {exc.args}, retrying {attempt + 1}/{target_max_retry}" ) - sleep_seconds = backoff_fn(attempt) if backoff_fn else 2 ** attempt + sleep_seconds = backoff_fn(attempt) if backoff_fn else 2**attempt time.sleep(sleep_seconds) else: logger.bind(exception=True).exception( diff --git a/astune/utils/robust_dashscope.py b/astune/utils/robust_dashscope.py index 53d4bda6..a529a171 100644 --- a/astune/utils/robust_dashscope.py +++ b/astune/utils/robust_dashscope.py @@ -6,6 +6,7 @@ from loguru import logger from agentscope.model import DashScopeChatModel + class RobustDashScopeChatModel(DashScopeChatModel): """ A robust version of DashScopeChatModel that includes retry logic and multiple API key handling. @@ -15,19 +16,17 @@ class RobustDashScopeChatModel(DashScopeChatModel): 3. Error handling with appropriate logging """ - def __init__( - self, - model_name="qwen3-max", - stream=False, - max_try=4, - **kwargs - ): + def __init__(self, model_name="qwen3-max", stream=False, max_try=4, **kwargs): # Check for environment variables self._check_env_variables() # Parse API keys from environment variables self.regular_key_list = os.environ.get("DASHSCOPE_API_KEY", "").split("|") - self.backup_key_list = os.environ.get("DASHSCOPE_API_KEY_BACKUP", "").split("|") if os.environ.get("DASHSCOPE_API_KEY_BACKUP") else [] + self.backup_key_list = ( + os.environ.get("DASHSCOPE_API_KEY_BACKUP", "").split("|") + if os.environ.get("DASHSCOPE_API_KEY_BACKUP") + else [] + ) api_key = random.choice(self.regular_key_list) @@ -35,25 +34,31 @@ def __init__( self.max_try = max_try # Initialize the parent class - super().__init__( - api_key=api_key, - model_name=model_name, - stream=stream, - **kwargs - ) + super().__init__(api_key=api_key, model_name=model_name, stream=stream, **kwargs) def _check_env_variables(self): """Check if required environment variables are set.""" if os.environ.get("DASHSCOPE_API_KEY") is None: - raise RuntimeError(dedent(""" + raise RuntimeError( + dedent( + """ Please set the DASHSCOPE_API_KEY environment variable. You can get the API keys from https://www.dashscope.com/. Example: export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' (optional) - """)) + """ + ) + ) - async def __call__(self, messages, tools=None, tool_choice=None, structured_model=None, **kwargs): + async def __call__( + self, + messages, + tools=None, + tool_choice=None, + structured_model=None, + **kwargs, + ): """ Override the __call__ method to add retry logic and API key rotation. @@ -89,7 +94,7 @@ async def __call__(self, messages, tools=None, tool_choice=None, structured_mode tools=tools, tool_choice=tool_choice, structured_model=structured_model, - **kwargs + **kwargs, ) return response @@ -99,4 +104,6 @@ async def __call__(self, messages, tools=None, tool_choice=None, structured_mode print(f"Error calling DashScope API: {e}, retrying ({n_try + 1}/{self.max_try})...") # If all attempts fail - raise RuntimeError(f"Failed to get response from DashScope API after {self.max_try} attempts") + raise RuntimeError( + f"Failed to get response from DashScope API after {self.max_try} attempts" + ) diff --git a/astune/utils/sample.py b/astune/utils/sample.py index ec1ed337..25438fa1 100644 --- a/astune/utils/sample.py +++ b/astune/utils/sample.py @@ -1,22 +1,21 @@ - - - def get_sample_params(mode, config): - response_length_eps = 16 # Reserve a few tokens for later handling of special tokens like lm_start. - if config.astune.rollout.name == 'vllm': + response_length_eps = ( + 16 # Reserve a few tokens for later handling of special tokens like lm_start. + ) + if config.astune.rollout.name == "vllm": sampling_params = dict( n=1, max_tokens=config.astune.rollout.max_response_length_in_one_turn - response_length_eps, - min_tokens=1, # Must output at least 1 token. + min_tokens=1, # Must output at least 1 token. temperature=config.astune.rollout.temperature, - top_p=config.astune.rollout.top_p + top_p=config.astune.rollout.top_p, ) else: sampling_params = dict( n=1, max_new_tokens=config.astune.rollout.max_response_length_in_one_turn, temperature=config.astune.rollout.temperature, - top_p=config.astune.rollout.top_p + top_p=config.astune.rollout.top_p, ) if mode == "validate": diff --git a/astune/utils/smart_daemon.py b/astune/utils/smart_daemon.py index a6e77c27..38b246c5 100644 --- a/astune/utils/smart_daemon.py +++ b/astune/utils/smart_daemon.py @@ -10,13 +10,22 @@ from pathlib import Path from typing import Optional, Tuple, List + class LaunchWhenAbsent: """ A class to launch a Python script as a detached process if it's not already running. If the script is already running, it will skip launching unless force_restart is True. """ - def __init__(self, script_path: str, argument_list: List[str] = None, exe: str = None, dir = None, tag='', use_pty=False): + def __init__( + self, + script_path: str, + argument_list: List[str] = None, + exe: str = None, + dir=None, + tag="", + use_pty=False, + ): """ Initialize with the path to the Python script to be launched. @@ -41,14 +50,14 @@ def __init__(self, script_path: str, argument_list: List[str] = None, exe: str = full_argument_list = [self.script_path] + self.argument_list hash_items = full_argument_list + [str(self.dir), str(exe)] - self.script_hash = hashlib.md5(''.join(hash_items).encode()).hexdigest()[:8] + self.script_hash = hashlib.md5("".join(hash_items).encode()).hexdigest()[:8] # Prepare command with hash ID marker if self.use_pty: assert len(full_argument_list) == 1 - self.cmd = [self.exe + " " + full_argument_list[0]] + self.cmd = [self.exe + " " + full_argument_list[0]] else: - self.cmd = ['nohup'] + [self.exe] + full_argument_list + self.cmd = ["nohup"] + [self.exe] + full_argument_list log_dir = Path("launcher_record/companion_logs/companion") log_dir.mkdir(parents=True, exist_ok=True) @@ -61,8 +70,9 @@ def __init__(self, script_path: str, argument_list: List[str] = None, exe: str = self.logger_file = log_dir / f"{base_log_name}.log" self.pgid = None - - def _is_script_running(self) -> Tuple[bool, Optional[psutil.Process], Optional[int]]: + def _is_script_running( + self, + ) -> Tuple[bool, Optional[psutil.Process], Optional[int]]: """ Check if the script is already running by looking for its unique hash ID in process command lines. @@ -76,7 +86,7 @@ def _is_script_running(self) -> Tuple[bool, Optional[psutil.Process], Optional[i if not self.pgid_file.exists(): return False, None, None else: - with open(self.pgid_file, 'r') as f_pgid: + with open(self.pgid_file, "r") as f_pgid: pgid = int(f_pgid.read().strip()) # Check if the process group ID is still running, if true, psutil is_running, proc = self.is_pgid_running(pgid) @@ -89,7 +99,7 @@ def _is_script_running(self) -> Tuple[bool, Optional[psutil.Process], Optional[i return False, None, None def is_pgid_running(self, pgid): - for proc in psutil.process_iter(['pid']): + for proc in psutil.process_iter(["pid"]): try: if os.getpgid(proc.pid) == pgid: return True, proc @@ -136,7 +146,13 @@ def shutdown(self): if self.pgid: self._kill_existing_process_group(self.pgid) - def launch(self, force_restart: bool = False, launch_wait_time: int = 30, success_std_string: str = None, env_dict = {}): + def launch( + self, + force_restart: bool = False, + launch_wait_time: int = 30, + success_std_string: str = None, + env_dict={}, + ): """ Launch the script if it's not running, or restart it if force_restart is True. @@ -153,7 +169,9 @@ def launch(self, force_restart: bool = False, launch_wait_time: int = 30, succes logger.warning(f"Force restarting") self._kill_existing_process_group(pgid) else: - logger.success(f"Script is already running, skipping launch. pgid: {pgid}. Command [{' '.join(self.cmd)}]") + logger.success( + f"Script is already running, skipping launch. pgid: {pgid}. Command [{' '.join(self.cmd)}]" + ) return try: # Set up process creation flags and environment @@ -164,7 +182,7 @@ def launch(self, force_restart: bool = False, launch_wait_time: int = 30, succes # Open log file log_file = self.logger_file - if os.name == 'nt': # Windows + if os.name == "nt": # Windows # DETACHED_PROCESS flag raise NotImplementedError("Windows support is not implemented yet.") else: # Unix-like systems @@ -175,15 +193,15 @@ def launch(self, force_restart: bool = False, launch_wait_time: int = 30, succes if log_file.exists(): os.remove(log_file) if not self.use_pty: - f = open(log_file, 'a') + f = open(log_file, "a") proc = subprocess.Popen( self.cmd, stdout=f, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL, cwd=self.dir, - env={'ScriptHash': self.script_hash, **env_dict}, - start_new_session=True # Start new session + env={"ScriptHash": self.script_hash, **env_dict}, + start_new_session=True, # Start new session ) f.close() # Close append handle pgid = os.getpgid(proc.pid) @@ -192,47 +210,50 @@ def launch(self, force_restart: bool = False, launch_wait_time: int = 30, succes def string_to_base64(s): # First, encode the string to bytes - s_bytes = s.encode('utf-8') + s_bytes = s.encode("utf-8") # Then convert bytes to base64 base64_bytes = base64.b64encode(s_bytes) # Finally, convert base64 bytes back to string - base64_string = base64_bytes.decode('utf-8') + base64_string = base64_bytes.decode("utf-8") return base64_string - f = open(log_file, 'a') + f = open(log_file, "a") converted_cmd = [ - sys.executable, - "-m", - "astune.utils.pty", - "--human-cmd", f"'{string_to_base64(self.cmd[0])}'", - "--dir", self.dir, - "--env", json.dumps(env_dict), - ] - print('running pty command:', ' '.join(converted_cmd)) + sys.executable, + "-m", + "astune.utils.pty", + "--human-cmd", + f"'{string_to_base64(self.cmd[0])}'", + "--dir", + self.dir, + "--env", + json.dumps(env_dict), + ] + print("running pty command:", " ".join(converted_cmd)) proc = subprocess.Popen( converted_cmd, stdout=f, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL, cwd="./", - env={'ScriptHash': self.script_hash, **env_dict}, - start_new_session=True # Start new session + env={"ScriptHash": self.script_hash, **env_dict}, + start_new_session=True, # Start new session ) f.close() # Close append handle pgid = os.getpgid(proc.pid) # write pgid to {log_file}.pgid - with open(self.pgid_file, 'w') as f_pgid: + with open(self.pgid_file, "w") as f_pgid: f_pgid.write(str(pgid)) # Monitor log file for success string or timeout start_time = time.time() f_read = "" previous_r_print = False - with open(log_file, 'r') as f: + with open(log_file, "r") as f: while time.time() - start_time < launch_wait_time: f_read_ = f.read() - inc_read = f_read_[len(f_read):] + inc_read = f_read_[len(f_read) :] f_read = f_read_ # Update f_read to the latest content if success_std_string: # Move to end of file and read new content @@ -241,23 +262,34 @@ def string_to_base64(s): break time.sleep(1) remaining = int(launch_wait_time - (time.time() - start_time)) - f_read_trim = inc_read.replace('\n', ' ') + f_read_trim = inc_read.replace("\n", " ") if f_read_trim: - if previous_r_print: print('') - print(f"Waiting for process launch... {remaining}s remaining ({f_read_trim})") + if previous_r_print: + print("") + print( + f"Waiting for process launch... {remaining}s remaining ({f_read_trim})" + ) previous_r_print = False else: - print(f"\rWaiting for process launch... {remaining}s remaining", end='', flush=True) + print( + f"\rWaiting for process launch... {remaining}s remaining", + end="", + flush=True, + ) previous_r_print = True if remaining % 10 == 0: is_running, proc = self.is_pgid_running(pgid) if not is_running: - raise RuntimeError(f"Process with PGID {pgid} is not running, cannot confirm launch") + raise RuntimeError( + f"Process with PGID {pgid} is not running, cannot confirm launch" + ) else: if success_std_string: - raise TimeoutError(f"Process did not output success string '{success_std_string}' within {launch_wait_time} seconds") + raise TimeoutError( + f"Process did not output success string '{success_std_string}' within {launch_wait_time} seconds" + ) logger.success(f"Successfully launched {self.cmd} with PID {proc.pid}") @@ -265,8 +297,9 @@ def string_to_base64(s): logging.error(f"Error launching script: {e}") raise + class LaunchCommandWhenAbsent(LaunchWhenAbsent): - def __init__(self, full_argument_list: List[str], dir = None, tag = "", use_pty=False): + def __init__(self, full_argument_list: List[str], dir=None, tag="", use_pty=False): if not dir: self.dir = os.getcwd() else: @@ -277,15 +310,15 @@ def __init__(self, full_argument_list: List[str], dir = None, tag = "", use_pty= full_argument_list_compute_hash = full_argument_list.copy() if full_argument_list_compute_hash[0] == sys.executable: - full_argument_list_compute_hash[0] = 'python' + full_argument_list_compute_hash[0] = "python" hash_items = full_argument_list_compute_hash + [str(self.dir)] - self.script_hash = hashlib.md5(''.join(hash_items).encode()).hexdigest()[:8] + self.script_hash = hashlib.md5("".join(hash_items).encode()).hexdigest()[:8] if self.use_pty: assert len(full_argument_list) == 1 self.cmd = full_argument_list else: - self.cmd = ['nohup'] + full_argument_list + self.cmd = ["nohup"] + full_argument_list # raise ValueError(self.script_hash) log_dir = Path("launcher_record/companion_logs/companion") diff --git a/astune/utils/sms_agent.py b/astune/utils/sms_agent.py index 8189ceea..dd8c104e 100644 --- a/astune/utils/sms_agent.py +++ b/astune/utils/sms_agent.py @@ -1,11 +1,26 @@ def send_train_message(message: str): import requests, os, dotenv + dotenv.load_dotenv() phone_numbers = os.getenv("PHONE_NUMBERS", None) print("trying to send sms to:", phone_numbers) if phone_numbers: try: - assert len(message) < 15, f"message is limit to 15 characters! Current length: {len(message)}." - requests.post(json={"phone_numbers": phone_numbers, "server_code": "DLC", "error": message, "error_level": "wbb1u1g0dte2n"}, url=os.getenv("ALIYUN_SMS_SERVICE", "http://cloud-6.agent-matrix.com:12337/send-sms/"), headers={"Content-Type": "application/json"}) + assert ( + len(message) < 15 + ), f"message is limit to 15 characters! Current length: {len(message)}." + requests.post( + json={ + "phone_numbers": phone_numbers, + "server_code": "DLC", + "error": message, + "error_level": "wbb1u1g0dte2n", + }, + url=os.getenv( + "ALIYUN_SMS_SERVICE", + "http://cloud-6.agent-matrix.com:12337/send-sms/", + ), + headers={"Content-Type": "application/json"}, + ) except Exception as e: print(f"Failed to send sms: {e}") diff --git a/astune/utils/utils.py b/astune/utils/utils.py index 050c71a0..be469710 100644 --- a/astune/utils/utils.py +++ b/astune/utils/utils.py @@ -2,17 +2,18 @@ import asyncio import copy + # apply chat_template to a message, and then convert back to message def convert_tool_to_user_message(tool_message, tokenizer, format="qwen"): assert format == "qwen" if tool_message["role"] == "user": return tool_message - elif tool_message["role"] == "tool" and len(tool_message["tool_calls"])>0: - assert len(tool_message["tool_calls"])==1 + elif tool_message["role"] == "tool" and len(tool_message["tool_calls"]) > 0: + assert len(tool_message["tool_calls"]) == 1 return { "role": "user", - "content": str(tool_message["tool_calls"][0]['result']) + "content": str(tool_message["tool_calls"][0]["result"]), } @@ -26,8 +27,10 @@ def run_async_coro__no_matter_what(coro): final_res = asyncio.run(coro) else: import threading + _res_holder = {} _exc_holder = {} + def _run(): try: _res_holder["res"] = asyncio.run(coro) diff --git a/astune/workflow.py b/astune/workflow.py index 80f5aaf4..cfeed988 100644 --- a/astune/workflow.py +++ b/astune/workflow.py @@ -10,12 +10,13 @@ class Workflow(BaseModel): name: str = Field(default="default_workflow", description="Name of the workflow.") trainable_targets: List[str] = Field(default=[], description="List of agents to be fine-tuned.") - async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: """Run the workflow on a given task.""" raise NotImplementedError - """ How to define a trainable workflow 🚀: diff --git a/documents/vllm_tokenizer.py b/documents/vllm_tokenizer.py index ca87b3e7..c333415f 100644 --- a/documents/vllm_tokenizer.py +++ b/documents/vllm_tokenizer.py @@ -245,9 +245,7 @@ def test_parse_chat_messages_single_image( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(mm_data, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) @@ -279,9 +277,7 @@ def test_parse_chat_messages_single_image_with_uuid( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(mm_data, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) @@ -311,9 +307,7 @@ def test_parse_chat_messages_single_empty_image_with_uuid( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(mm_data, 1, skipped_image_indices=[0]) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) @@ -346,9 +340,7 @@ def test_parse_chat_messages_single_image_with_bad_uuid_format( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(mm_data, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) @@ -511,9 +503,7 @@ async def test_parse_chat_messages_single_image_with_uuid_async( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(await mm_future, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) @@ -544,9 +534,7 @@ async def test_parse_chat_messages_empty_image_with_uuid_async( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(await mm_future, 1, skipped_image_indices=[0]) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) @@ -715,7 +703,10 @@ def test_parse_chat_messages_empty_system( ) assert conversation == [ {"role": "system", "content": [{"type": "text", "text": ""}]}, - {"role": "user", "content": [{"type": "text", "text": "Who are you?"}]}, + { + "role": "user", + "content": [{"type": "text", "text": "Who are you?"}], + }, ] @@ -740,9 +731,7 @@ async def test_parse_chat_messages_single_image_async( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(await mm_future, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) @@ -821,7 +810,11 @@ def test_parse_chat_messages_empty_image_embeds_with_uuid( { "role": "user", "content": [ - {"type": "image_embeds", "image_embeds": None, "uuid": uuid}, + { + "type": "image_embeds", + "image_embeds": None, + "uuid": uuid, + }, {"type": "text", "text": "What's in this image?"}, ], } @@ -854,7 +847,11 @@ async def test_parse_chat_messages_empty_image_embeds_with_uuid_async( { "role": "user", "content": [ - {"type": "image_embeds", "image_embeds": None, "uuid": uuid}, + { + "type": "image_embeds", + "image_embeds": None, + "uuid": uuid, + }, {"type": "text", "text": "What's in this image?"}, ], } @@ -1128,7 +1125,10 @@ def test_parse_chat_messages_rejects_too_many_images_in_one_message( "type": "image_url", "image_url": {"url": image_url}, }, - {"type": "text", "text": "What's in these images?"}, + { + "type": "text", + "text": "What's in these images?", + }, ], } ], @@ -1547,7 +1547,10 @@ def test_parse_chat_messages_multiple_modals_with_uuids_multiple_messages_interl _assert_mm_data_inputs(mm_data, {"image": 2, "video": 1, "audio": 1}) _assert_mm_uuids( - mm_uuids, 2, modality="image", expected_uuids=["image_123", "image_123"] + mm_uuids, + 2, + modality="image", + expected_uuids=["image_123", "image_123"], ) _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=["audio_123"]) @@ -1623,7 +1626,10 @@ def test_parse_chat_messages_multiple_modals_with_uuids_multiple_empty_media_mes skipped_media_indices={"image": [0, 1], "video": [0], "audio": [0]}, ) _assert_mm_uuids( - mm_uuids, 2, modality="image", expected_uuids=["image_123", "image_123"] + mm_uuids, + 2, + modality="image", + expected_uuids=["image_123", "image_123"], ) _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=["audio_123"]) @@ -1864,9 +1870,7 @@ def test_resolve_hf_chat_template_kwargs(sample_json_schema, model, expected_kwa tools=tools, model_config=model_config, ) - with pytest.raises( - ValueError, match="Found unexpected chat template kwargs from request" - ): + with pytest.raises(ValueError, match="Found unexpected chat template kwargs from request"): # should raise error if `chat_template_kwargs` contains # `chat_template` or `tokenize` resolve_chat_template_kwargs( @@ -1889,9 +1893,11 @@ def test_resolve_hf_chat_template_kwargs(sample_json_schema, model, expected_kwa hf_base_params = _get_hf_base_chat_template_params() # Verify common HF parameters are in the base class - assert {"add_generation_prompt", "tools", "continue_final_message"}.issubset( - hf_base_params - ), f"Expected HF base params not found in {hf_base_params}" + assert { + "add_generation_prompt", + "tools", + "continue_final_message", + }.issubset(hf_base_params), f"Expected HF base params not found in {hf_base_params}" # Test with a mock tokenizer that uses **kwargs (like Kimi K2) class MockTokenizerWithKwargs: @@ -2093,9 +2099,7 @@ def test_resolve_content_format_examples(template_path, expected_format): assert resolved_format == expected_format -def test_parse_chat_messages_include_thinking_chunk( - mistral_model_config, mistral_tokenizer -): +def test_parse_chat_messages_include_thinking_chunk(mistral_model_config, mistral_tokenizer): messages = [ { "role": "system", @@ -2184,9 +2188,7 @@ def test_apply_mistral_chat_template_thinking_chunk(): }, {"role": "user", "content": "Thanks, what is 3+3?"}, ] - mistral_tokenizer = MistralTokenizer.from_pretrained( - "mistralai/Magistral-Small-2509" - ) + mistral_tokenizer = MistralTokenizer.from_pretrained("mistralai/Magistral-Small-2509") tokens_ids = apply_mistral_chat_template( mistral_tokenizer, messages, chat_template=None, tools=None @@ -2234,8 +2236,7 @@ def test_parse_chat_messages_single_empty_audio_with_uuid( assert conversation == [ { "role": "user", - "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " - "audio say?", + "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " "audio say?", } ] _assert_mm_data_inputs(mm_data, {"audio": 1}) @@ -2270,8 +2271,7 @@ async def test_parse_chat_messages_single_empty_audio_with_uuid_async( assert conversation == [ { "role": "user", - "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " - "audio say?", + "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " "audio say?", } ] _assert_mm_data_inputs(await mm_future, {"audio": 1}) diff --git a/launcher.py b/launcher.py index 42ad8ed1..fefbb79d 100644 --- a/launcher.py +++ b/launcher.py @@ -6,82 +6,82 @@ import sys import os from loguru import logger -from dotenv import load_dotenv; load_dotenv() +from dotenv import load_dotenv + +load_dotenv() from astune.utils.cleaner import _fast_kill_by_keyword_bash from astune.utils.smart_daemon import LaunchCommandWhenAbsent from astune.utils.config_utils import read_astune_config, dump_yaml_config def parse_args(): - parser = argparse.ArgumentParser(description='BA Launcher') + parser = argparse.ArgumentParser(description="BA Launcher") - parser.add_argument('--backbone', + parser.add_argument( + "--backbone", type=str, default="trinity", required=False, - help='verl or trinity or debug' + help="verl or trinity or debug", ) - parser.add_argument('--conf', + parser.add_argument( + "--conf", type=str, default="", required=False, - help='Path to configuration file' + help="Path to configuration file", ) - parser.add_argument('--db', + parser.add_argument( + "--db", type=str, default="", required=False, - help='Path to configuration file' - ) - parser.add_argument('--with-exp-maker', - action='store_true', - default=False, - help='Launch exp maker' - ) - parser.add_argument('--with-ray', - action='store_true', - default=False, - help='Launch ray' + help="Path to configuration file", ) - parser.add_argument('--with-appworld', - action='store_true', + parser.add_argument( + "--with-exp-maker", + action="store_true", default=False, - help='Launch appworld' + help="Launch exp maker", ) - parser.add_argument('--with-webshop', - action='store_true', + parser.add_argument("--with-ray", action="store_true", default=False, help="Launch ray") + parser.add_argument( + "--with-appworld", + action="store_true", default=False, - help='Launch webshop' + help="Launch appworld", ) - parser.add_argument('--with-bfcl', - action='store_true', + parser.add_argument( + "--with-webshop", + action="store_true", default=False, - help='Launch bfcl' + help="Launch webshop", ) - parser.add_argument('--with-logview', - action='store_true', + parser.add_argument("--with-bfcl", action="store_true", default=False, help="Launch bfcl") + parser.add_argument( + "--with-logview", + action="store_true", default=False, - help='Launch logview' + help="Launch logview", ) - parser.add_argument('--with-crafters', - action='store_true', + parser.add_argument( + "--with-crafters", + action="store_true", default=False, - help='Launch Crafters Env Simulation' + help="Launch Crafters Env Simulation", ) - parser.add_argument('--reboot', - action='store_true', - default=False, - help='reboot flag' - ) - parser.add_argument('--kill', + parser.add_argument("--reboot", action="store_true", default=False, help="reboot flag") + parser.add_argument( + "--kill", type=str, default="", required=False, - help='list of keywords for killing processes' + help="list of keywords for killing processes", ) return parser.parse_args() + def check_debugpy_version(): try: import debugpy @@ -91,9 +91,10 @@ def check_debugpy_version(): "Ray Debugpy Debugger will not work without 'debugpy>=1.8.0' installed. " "Install this module using 'pip install debugpy>=1.8.0'" ) - version = getattr(debugpy, '__version__', '0.0.0') + version = getattr(debugpy, "__version__", "0.0.0") from packaging import version as packaging_version - if packaging_version.parse(version) < packaging_version.parse('1.8.0'): + + if packaging_version.parse(version) < packaging_version.parse("1.8.0"): raise RuntimeError( f"debugpy version {version} is too old. " "Ray Debugpy Debugger requires 'debugpy>=1.8.0'. " @@ -103,21 +104,22 @@ def check_debugpy_version(): def pty_launch(service_name: str, success_std_string="Starting server on"): - service_path = os.environ.get(f'{service_name.upper()}_PATH') - service_script = os.environ.get(f'{service_name.upper()}_SCRIPT') + service_path = os.environ.get(f"{service_name.upper()}_PATH") + service_script = os.environ.get(f"{service_name.upper()}_SCRIPT") if service_path is None or service_script is None: raise ValueError(f"Environment variables for {service_name} not properly set.") companion = LaunchCommandWhenAbsent( full_argument_list=[service_script], dir=service_path, tag="appworld_env_service", - use_pty=True + use_pty=True, ) companion.launch( launch_wait_time=1800, success_std_string=success_std_string, ) + def prepare_experiment_config(yaml_path, args): """ Prepare experiment configuration by reading YAML, setting up backup directories, @@ -130,31 +132,32 @@ def prepare_experiment_config(yaml_path, args): Returns: tuple: (yaml_backup_dst, exe_exp_base, exe_yaml_path, exp_name) """ - assert yaml_path.endswith('.yaml'), "Configuration file must be a YAML file" + assert yaml_path.endswith(".yaml"), "Configuration file must be a YAML file" exp_base = os.path.dirname(yaml_path) if not os.path.exists(exp_base): raise FileNotFoundError(f"Configuration file not found: {exp_base}") ## 0. read yaml (get astune.experiment_name) - with open(yaml_path, 'r') as file: + with open(yaml_path, "r") as file: config = yaml.safe_load(file) - exp_name = config.get('astune').get('experiment_name') - if exp_name is None or exp_name == 'read_yaml_name': - if exp_name is not None: exp_name = exp_name.replace('|', '-') - exp_name = os.path.basename(yaml_path).replace('.yaml', '') + exp_name = config.get("astune").get("experiment_name") + if exp_name is None or exp_name == "read_yaml_name": + if exp_name is not None: + exp_name = exp_name.replace("|", "-") + exp_name = os.path.basename(yaml_path).replace(".yaml", "") else: - exp_name = exp_name.replace('|', '-') + exp_name = exp_name.replace("|", "-") - logger.info('----------------------------------------') - backup_dir = os.path.join('launcher_record', exp_name, 'backup') - yaml_backup_dst = os.path.join('launcher_record', exp_name, 'yaml_backup.yaml') + logger.info("----------------------------------------") + backup_dir = os.path.join("launcher_record", exp_name, "backup") + yaml_backup_dst = os.path.join("launcher_record", exp_name, "yaml_backup.yaml") exe_yaml_path = yaml_backup_dst exe_exp_base = os.path.dirname(yaml_backup_dst) - logger.info(f'Experiment Name: {exp_name}') - logger.info(f'Experiment Backup Dir: {backup_dir}') - logger.info(f'Experiment Yaml Dir: {yaml_backup_dst}') - logger.info('----------------------------------------') + logger.info(f"Experiment Name: {exp_name}") + logger.info(f"Experiment Backup Dir: {backup_dir}") + logger.info(f"Experiment Yaml Dir: {yaml_backup_dst}") + logger.info("----------------------------------------") time.sleep(2) ## 1. check exp_base/backup exist @@ -163,16 +166,24 @@ def prepare_experiment_config(yaml_path, args): else: total_seconds = 5 for i in range(total_seconds): - logger.warning(f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds...") + logger.warning( + f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." + ) time.sleep(1) ## 2. copy files to backup - BACK_TARGETS = os.environ.get('BACK_TARGETS', '').split(',') + BACK_TARGETS = os.environ.get("BACK_TARGETS", "").split(",") BACK_TARGETS = [p for p in BACK_TARGETS if os.path.exists(p)] for backup_target in BACK_TARGETS: - logger.info(f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}") - shutil.copytree(backup_target, os.path.join(backup_dir, os.path.basename(backup_target)), dirs_exist_ok=True) + logger.info( + f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}" + ) + shutil.copytree( + backup_target, + os.path.join(backup_dir, os.path.basename(backup_target)), + dirs_exist_ok=True, + ) ## 3. copy yaml to backup yaml_backup_src = yaml_path @@ -180,48 +191,48 @@ def prepare_experiment_config(yaml_path, args): ## 4. edit new yaml yaml_path = yaml_backup_dst - with open(yaml_path, 'r') as file: + with open(yaml_path, "r") as file: config = yaml.safe_load(file) - config['astune']['experiment_name'] = exp_name - config['astune']['backbone'] = args.backbone + config["astune"]["experiment_name"] = exp_name + config["astune"]["backbone"] = args.backbone # remove extra config of verl for trinity if args.backbone == "debug": - config['defaults'].remove('ppo_trainer') - config['defaults'].remove('trinity_default') - config['hydra']['searchpath'].remove('file://astune/default_config/trinity') - config['hydra']['searchpath'].remove('file://external/verl/verl/trainer/config') + config["defaults"].remove("ppo_trainer") + config["defaults"].remove("trinity_default") + config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") + config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") # remove extra config of verl for trinity if args.backbone == "trinity": - config['defaults'].remove('ppo_trainer') - config['defaults'].remove('verl_default') - config['hydra']['searchpath'].remove('file://external/verl/verl/trainer/config') - config['hydra']['searchpath'].remove('file://astune/default_config/verl') + config["defaults"].remove("ppo_trainer") + config["defaults"].remove("verl_default") + config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") + config["hydra"]["searchpath"].remove("file://astune/default_config/verl") # remove extra config of trinity for verl - if args.backbone == "verl": # or args.backbone == "debug" - config['defaults'].remove('trinity_default') - config['hydra']['searchpath'].remove('file://astune/default_config/trinity') + if args.backbone == "verl": # or args.backbone == "debug" + config["defaults"].remove("trinity_default") + config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") # yaml dump - with open(yaml_path, 'w') as file: + with open(yaml_path, "w") as file: yaml.dump(config, file) # read everything full_config = read_astune_config(yaml_path) yaml_path = full_config_path = dump_yaml_config(full_config, yaml_fp=yaml_path) - # put inherit info back - with open(yaml_path, 'r') as file: + with open(yaml_path, "r") as file: config_final = yaml.safe_load(file) - config_final['defaults'] = config['defaults'] - config_final['hydra'] = config['hydra'] + config_final["defaults"] = config["defaults"] + config_final["hydra"] = config["hydra"] # write inherit info back - with open(yaml_path, 'w') as file: + with open(yaml_path, "w") as file: yaml.dump(config_final, file) return yaml_path, exe_exp_base, exe_yaml_path, exp_name, config + def launch_logview(exp_name=None): """ Launch the log viewer service and open the web browser to view logs. @@ -232,23 +243,29 @@ def launch_logview(exp_name=None): companion = LaunchCommandWhenAbsent( full_argument_list=[ sys.executable, - '-m', - 'web_display.start_web', + "-m", + "web_display.start_web", ], - dir='./', - tag="logview" + dir="./", + tag="logview", + ) + companion.launch( + launch_wait_time=1800, + success_std_string="Uvicorn running on", + env_dict={}, ) - companion.launch(launch_wait_time=1800, success_std_string="Uvicorn running on", env_dict={}) time.sleep(2.5) try: import webbrowser from datetime import datetime + # Use default experiment name if not set webbrowser.open("http://127.0.0.1:8181/") except Exception as e: logger.error(f"Error opening web browser: {e}") pass + def start_ray_service(args, env): """ Start a Ray service with appropriate configuration. @@ -257,12 +274,10 @@ def start_ray_service(args, env): args: Command line arguments containing debug settings """ companion = LaunchCommandWhenAbsent( - full_argument_list=[ - f"source ./.venv/bin/activate && ray start --head --block" - ], - dir='./', + full_argument_list=[f"source ./.venv/bin/activate && ray start --head --block"], + dir="./", tag="ray_service", - use_pty=True + use_pty=True, ) companion.launch( launch_wait_time=1800, @@ -270,49 +285,57 @@ def start_ray_service(args, env): env_dict=env, ) + import yaml + def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone): # read yaml files - with open(from_config_fp, 'r') as file: + with open(from_config_fp, "r") as file: from_config = yaml.safe_load(file) - with open(to_config_fp, 'r') as file: + with open(to_config_fp, "r") as file: to_config = yaml.safe_load(file) # read convertion json import json - with open(convertion_json_fg, 'r') as file: + + with open(convertion_json_fg, "r") as file: convertion_json = json.load(file) logger.success("----------------------------------------------------") for from_key, to_keys in convertion_json.items(): # get value from from_config - keys = from_key.split('.') + keys = from_key.split(".") value = from_config for key in keys: value = value.get(key, None) if value is None: break if value is None: - logger.warning(f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_keys}") + logger.warning( + f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_keys}" + ) continue to_keys = to_keys if isinstance(to_keys, list) else [to_keys] for to_key in to_keys: - keys = to_key.split('.') + keys = to_key.split(".") sub_config = to_config for key in keys[:-1]: if key not in sub_config: sub_config[key] = {} sub_config = sub_config[key] sub_config[keys[-1]] = value - logger.success(f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]") + logger.success( + f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]" + ) time.sleep(0.1) logger.success("----------------------------------------------------") - if ('trinity' in from_config) and backbone == "trinity": - trinity_config = from_config['trinity'] + if ("trinity" in from_config) and backbone == "trinity": + trinity_config = from_config["trinity"] + def recursive_copy(src_dict, dst_dict, parent_key=""): for key, value in src_dict.items(): full_key = f"{parent_key}.{key}" if parent_key else key @@ -322,21 +345,29 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): recursive_copy(value, dst_dict[key], full_key) else: dst_dict[key] = value - logger.info(f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]") + logger.info( + f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]" + ) + recursive_copy(trinity_config, to_config) logger.success("----------------------------------------------------") - # save to_config_fp - with open(to_config_fp, 'w') as file: + with open(to_config_fp, "w") as file: yaml.dump(to_config, file) logger.success(f"Saved aligned configuration to {to_config_fp}") - - -def execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_base, exe_yaml_path, env, exp_config): +def execute_training_process( + args, + backbone_target, + yaml_backup_dst, + exe_exp_base, + exe_yaml_path, + env, + exp_config, +): """ Execute the training process based on the specified backbone and configuration. @@ -351,33 +382,52 @@ def execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_bas # let's begin the training process if args.backbone == "trinity": # replace boot yaml - TRINITY_BOOT_YAML = "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED - redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + '/trinity_launch.yaml' + TRINITY_BOOT_YAML = "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED + redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + "/trinity_launch.yaml" shutil.copyfile(TRINITY_BOOT_YAML, redirect_trinity_boot_yaml) - align_parameters(yaml_backup_dst, redirect_trinity_boot_yaml, 'astune/default_config/trinity/config_auto_convertion_trinity.json', args.backbone) + align_parameters( + yaml_backup_dst, + redirect_trinity_boot_yaml, + "astune/default_config/trinity/config_auto_convertion_trinity.json", + args.backbone, + ) cmd = [ sys.executable, - '-m', backbone_target, - 'run', '--config', redirect_trinity_boot_yaml + "-m", + backbone_target, + "run", + "--config", + redirect_trinity_boot_yaml, ] else: - align_parameters(yaml_backup_dst, yaml_backup_dst, 'astune/default_config/verl/config_auto_convertion_verl.json', args.backbone) + align_parameters( + yaml_backup_dst, + yaml_backup_dst, + "astune/default_config/verl/config_auto_convertion_verl.json", + args.backbone, + ) cmd = [ sys.executable, - '-m', backbone_target, - '--config-path', os.path.abspath(exe_exp_base), - '--config-name', os.path.basename(exe_yaml_path), + "-m", + backbone_target, + "--config-path", + os.path.abspath(exe_exp_base), + "--config-name", + os.path.basename(exe_yaml_path), ] if args.with_logview: - env.update({ - 'BEST_LOGGER_WEB_SERVICE_URL': - os.environ.get('BEST_LOGGER_WEB_SERVICE_URL', 'http://127.0.0.1:8181/') - }) + env.update( + { + "BEST_LOGGER_WEB_SERVICE_URL": os.environ.get( + "BEST_LOGGER_WEB_SERVICE_URL", "http://127.0.0.1:8181/" + ) + } + ) try: logger.info(f"Running command: {' '.join(cmd)}") - subprocess.run(cmd, check=True, cwd=os.path.abspath('./'), env=env) + subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) except subprocess.CalledProcessError as e: logger.error(f"Error running subprocess: {e}") sys.exit(1) @@ -392,7 +442,7 @@ def main(): # Handle kill-keywords argument if provided if args.kill: logger.info(f"Killing processes matching keywords: {args.kill}") - for keyword in args.kill.split('|'): + for keyword in args.kill.split("|"): logger.info(f"Killing processes matching keyword: {keyword}") killed_pids = _fast_kill_by_keyword_bash(keyword) if killed_pids: @@ -419,7 +469,9 @@ def main(): exp_config = None if args.conf: yaml_path = args.conf - main_yaml_fp, exe_exp_base, exe_yaml_path, exp_name, exp_config = prepare_experiment_config(yaml_path, args) + main_yaml_fp, exe_exp_base, exe_yaml_path, exp_name, exp_config = prepare_experiment_config( + yaml_path, args + ) if args.db: env["RAY_DEBUG_POST_MORTEM"] = "1" @@ -430,9 +482,9 @@ def main(): logger.warning("Debug mode is OFF") if args.backbone == "trinity": - env['ASTUNE_CONFIG_REDIRECT'] = main_yaml_fp # type: ignore + env["ASTUNE_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore if args.backbone == "debug": - env['ASTUNE_DEBUG'] = '1' # type: ignore + env["ASTUNE_DEBUG"] = "1" # type: ignore if args.with_ray: start_ray_service(args, env) @@ -456,7 +508,16 @@ def main(): launch_logview(exp_name) if args.conf and main_yaml_fp and exe_exp_base and exe_yaml_path: - execute_training_process(args, backbone_target, main_yaml_fp, exe_exp_base, exe_yaml_path, env, exp_config) + execute_training_process( + args, + backbone_target, + main_yaml_fp, + exe_exp_base, + exe_yaml_path, + env, + exp_config, + ) + if __name__ == "__main__": check_debugpy_version() diff --git a/scripts/converter_hf_to_mcore.py b/scripts/converter_hf_to_mcore.py index 897b0f8a..e7061083 100644 --- a/scripts/converter_hf_to_mcore.py +++ b/scripts/converter_hf_to_mcore.py @@ -22,7 +22,9 @@ from megatron.core import parallel_state as mpu from megatron.core.dist_checkpointing.serialization import StrictHandling from megatron.core.models.gpt.gpt_model import ModelType -from megatron.core.tensor_parallel.random import model_parallel_cuda_manual_seed +from megatron.core.tensor_parallel.random import ( + model_parallel_cuda_manual_seed, +) from transformers import AutoConfig, AutoModelForCausalLM from verl.models.mcore import hf_to_mcore_config @@ -31,11 +33,29 @@ def _init_args(): parser = argparse.ArgumentParser() - parser.add_argument("--hf_model_path", type=str, required=True, help="The path for the huggingface model") - parser.add_argument("--output_path", type=str, required=True, help="The path for the output mcore model") - parser.add_argument("--use_cpu_initialization", action="store_true", help="Whether to use cpu initialization") + parser.add_argument( + "--hf_model_path", + type=str, + required=True, + help="The path for the huggingface model", + ) + parser.add_argument( + "--output_path", + type=str, + required=True, + help="The path for the output mcore model", + ) + parser.add_argument( + "--use_cpu_initialization", + action="store_true", + help="Whether to use cpu initialization", + ) parser.add_argument("--test", action="store_true", help="Whether to test the conversion") - parser.add_argument("--trust_remote_code", action="store_true", help="Whether to trust remote code") + parser.add_argument( + "--trust_remote_code", + action="store_true", + help="Whether to trust remote code", + ) args = parser.parse_args() return args @@ -75,7 +95,9 @@ def test_conversion(megatron_model_provider, tfconfig, output_path, model): dut_data = dut_state_dict[name].data if name in ref_state_dict: ref_data = ref_state_dict[name].data - assert dut_data.shape == ref_state_dict.shape, f"{name=} {dut_data.shape=} {ref_data.shape=}" + assert ( + dut_data.shape == ref_state_dict.shape + ), f"{name=} {dut_data.shape=} {ref_data.shape=}" assert (dut_data == ref_data).all(), f"{name} is not equal" print(f"{name} is equal") else: @@ -102,14 +124,22 @@ def convert_checkpoint_from_transformers_to_megatron(hf_model, model, hf_config) head_dim = getattr(hf_config, "head_dim", hidden_dim // num_attention_heads) if num_attention_heads != num_key_value_heads: print("[WARNING] Converting GQA model") - has_qkv_bias = getattr(hf_config, "qkv_bias", False) or getattr(hf_config, "attention_bias", False) + has_qkv_bias = getattr(hf_config, "qkv_bias", False) or getattr( + hf_config, "attention_bias", False + ) has_share_expert = getattr(hf_config, "shared_expert_intermediate_size", None) with torch.no_grad(): model.embedding.word_embeddings.weight.copy_(hf_model.model.embed_tokens.weight) for layer, hf_layer in zip(model.decoder.layers, hf_model.model.layers): layer.self_attention.linear_qkv.layer_norm_weight.copy_(hf_layer.input_layernorm.weight) - q = hf_layer.self_attn.q_proj.weight.view([num_key_value_heads, head_dim * num_attention_heads // num_key_value_heads, -1]) + q = hf_layer.self_attn.q_proj.weight.view( + [ + num_key_value_heads, + head_dim * num_attention_heads // num_key_value_heads, + -1, + ] + ) k = hf_layer.self_attn.k_proj.weight.view([num_key_value_heads, head_dim, -1]) v = hf_layer.self_attn.v_proj.weight.view([num_key_value_heads, head_dim, -1]) qkv = torch.cat([q, k, v], dim=1).view(-1, hidden_dim).contiguous() @@ -134,13 +164,22 @@ def convert_checkpoint_from_transformers_to_megatron(hf_model, model, hf_config) for idx, hf_expert in enumerate(hf_layer.mlp.experts): fc1_weight = torch.cat([hf_expert.gate_proj.weight, hf_expert.up_proj.weight]) layer.mlp.experts.linear_fc1._parameters[f"weight{idx}"].copy_(fc1_weight) - layer.mlp.experts.linear_fc2._parameters[f"weight{idx}"].copy_(hf_expert.down_proj.weight) + layer.mlp.experts.linear_fc2._parameters[f"weight{idx}"].copy_( + hf_expert.down_proj.weight + ) if has_share_expert: layer.mlp.shared_experts.gate_weight.copy_(hf_layer.mlp.shared_expert_gate.weight) - shared_fc1_weight = torch.cat([hf_layer.mlp.shared_expert.gate_proj.weight, hf_layer.mlp.shared_expert.up_proj.weight]) + shared_fc1_weight = torch.cat( + [ + hf_layer.mlp.shared_expert.gate_proj.weight, + hf_layer.mlp.shared_expert.up_proj.weight, + ] + ) layer.mlp.shared_experts.linear_fc1.weight.copy_(shared_fc1_weight) - layer.mlp.shared_experts.linear_fc2.weight.copy_(hf_layer.mlp.shared_expert.down_proj.weight) + layer.mlp.shared_experts.linear_fc2.weight.copy_( + hf_layer.mlp.shared_expert.down_proj.weight + ) model.decoder.final_layernorm.weight.copy_(hf_model.model.norm.weight) model.output_layer.weight.copy_(hf_model.lm_head.weight) @@ -157,7 +196,9 @@ def safe_copy( ): if not skip_dtype_assert: if src_tensor.dtype != dst_tensor.dtype: - raise ValueError(f"Get source dtype {src_tensor.dtype}, but target dtype {dst_tensor.dtype}") + raise ValueError( + f"Get source dtype {src_tensor.dtype}, but target dtype {dst_tensor.dtype}" + ) assert src_tensor.shape == dst_tensor.shape dst_tensor.data.copy_(src_tensor.data) return src_tensor.numel() @@ -172,22 +213,39 @@ def safe_copy( else: layer.self_attention.linear_q_down_proj.weight.copy_(hf_layer.self_attn.q_a_proj.weight) layer.self_attention.linear_q_up_proj.weight.copy_(hf_layer.self_attn.q_b_proj.weight) - layer.self_attention.linear_q_up_proj.layer_norm_weight.copy_(hf_layer.self_attn.q_a_layernorm.weight) + layer.self_attention.linear_q_up_proj.layer_norm_weight.copy_( + hf_layer.self_attn.q_a_layernorm.weight + ) - layer.self_attention.linear_kv_down_proj.weight.copy_(hf_layer.self_attn.kv_a_proj_with_mqa.weight) + layer.self_attention.linear_kv_down_proj.weight.copy_( + hf_layer.self_attn.kv_a_proj_with_mqa.weight + ) layer.self_attention.linear_kv_up_proj.weight.copy_(hf_layer.self_attn.kv_b_proj.weight) - layer.self_attention.linear_kv_up_proj.layer_norm_weight.copy_(hf_layer.self_attn.kv_a_layernorm.weight) + layer.self_attention.linear_kv_up_proj.layer_norm_weight.copy_( + hf_layer.self_attn.kv_a_layernorm.weight + ) layer.self_attention.linear_proj.weight.copy_(hf_layer.self_attn.o_proj.weight) if not hasattr(layer.mlp, "router"): layer.mlp.linear_fc1.layer_norm_weight.copy_(hf_layer.post_attention_layernorm.weight) - layer.mlp.linear_fc1.weight.copy_(torch.cat([hf_layer.mlp.gate_proj.weight, hf_layer.mlp.up_proj.weight])) + layer.mlp.linear_fc1.weight.copy_( + torch.cat( + [ + hf_layer.mlp.gate_proj.weight, + hf_layer.mlp.up_proj.weight, + ] + ) + ) layer.mlp.linear_fc2.weight.copy_(hf_layer.mlp.down_proj.weight) else: layer.mlp.router.weight.copy_(hf_layer.mlp.gate.weight) # NOTE: the e_score_correction_bias in mcore model will be initialized with bfloat16 and \ # recover to fp32 in the first forward. There is always a diff in the bias between two models (~0.3%) - safe_copy(hf_layer.mlp.gate.e_score_correction_bias, layer.mlp.router.expert_bias, skip_dtype_assert=True) + safe_copy( + hf_layer.mlp.gate.e_score_correction_bias, + layer.mlp.router.expert_bias, + skip_dtype_assert=True, + ) if tfconfig.moe_grouped_gemm: for i, hf_expert in enumerate(hf_layer.mlp.experts): fc1_weight = torch.cat([hf_expert.gate_proj.weight, hf_expert.up_proj.weight]) @@ -202,16 +260,29 @@ def safe_copy( expert.linear_fc1.weight.copy_(fc1_weight) expert.linear_fc2.weight.copy_(hf_expert.down_proj.weight) layer.pre_mlp_layernorm.weight.copy_(hf_layer.post_attention_layernorm.weight) - shared_fc1_weight = torch.cat([hf_layer.mlp.shared_experts.gate_proj.weight, hf_layer.mlp.shared_experts.up_proj.weight]) + shared_fc1_weight = torch.cat( + [ + hf_layer.mlp.shared_experts.gate_proj.weight, + hf_layer.mlp.shared_experts.up_proj.weight, + ] + ) layer.mlp.shared_experts.linear_fc1.weight.copy_(shared_fc1_weight) - layer.mlp.shared_experts.linear_fc2.weight.copy_(hf_layer.mlp.shared_experts.down_proj.weight) + layer.mlp.shared_experts.linear_fc2.weight.copy_( + hf_layer.mlp.shared_experts.down_proj.weight + ) model.decoder.final_layernorm.weight.copy_(hf_model.model.norm.weight) if not hf_config.tie_word_embeddings: model.output_layer.weight.copy_(hf_model.lm_head.weight) -def convert_hf_to_mcore(hf_model_path, output_path, use_cpu_initialization=False, test=False, trust_remote_code=False): +def convert_hf_to_mcore( + hf_model_path, + output_path, + use_cpu_initialization=False, + test=False, + trust_remote_code=False, +): os.makedirs(output_path, exist_ok=True) if len(os.listdir(output_path)) > 0 and not test: print(f"Output path {output_path} is not empty, skipping conversion") @@ -266,19 +337,27 @@ def megatron_model_provider(pre_process, post_process): warnings.simplefilter("ignore") # init hf model - hf_model = AutoModelForCausalLM.from_pretrained(hf_model_path, torch_dtype=torch.bfloat16, trust_remote_code=trust_remote_code) + hf_model = AutoModelForCausalLM.from_pretrained( + hf_model_path, + torch_dtype=torch.bfloat16, + trust_remote_code=trust_remote_code, + ) hf_state_dict = hf_model.state_dict() # load hf state dict to megatron model if "Qwen2MoeForCausalLM" in hf_config.architectures: convert_checkpoint_from_transformers_to_megatron(hf_model, model[0].module, hf_config) elif "DeepseekV3ForCausalLM" in hf_config.architectures: - convert_checkpoint_from_transformers_to_megatron_dpskv3(hf_model, model[0].module, hf_config, tfconfig=tfconfig) + convert_checkpoint_from_transformers_to_megatron_dpskv3( + hf_model, model[0].module, hf_config, tfconfig=tfconfig + ) elif "Qwen3MoeForCausalLM" in hf_config.architectures: convert_checkpoint_from_transformers_to_megatron(hf_model, model[0].module, hf_config) else: assert not use_cpu_initialization, "use_cpu_initialization is only supported for MoE model" - from verl.models.mcore.loader import load_state_dict_to_megatron_gptmodel + from verl.models.mcore.loader import ( + load_state_dict_to_megatron_gptmodel, + ) load_state_dict_to_megatron_gptmodel( state_dict=hf_state_dict, @@ -293,11 +372,22 @@ def megatron_model_provider(pre_process, post_process): # save megatron model if len(os.listdir(output_path)) == 0: - dist_checkpointing.save(megatron_state_dict, output_path, sharded_strategy=None, async_sharded_save=False) + dist_checkpointing.save( + megatron_state_dict, + output_path, + sharded_strategy=None, + async_sharded_save=False, + ) if test: test_conversion(megatron_model_provider, tfconfig, output_path, model) if __name__ == "__main__": args = _init_args() - convert_hf_to_mcore(args.hf_model_path, args.output_path, args.use_cpu_initialization, args.test, args.trust_remote_code) + convert_hf_to_mcore( + args.hf_model_path, + args.output_path, + args.use_cpu_initialization, + args.test, + args.trust_remote_code, + ) diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py index 574caea2..b0e4962d 100644 --- a/scripts/deploy_model.py +++ b/scripts/deploy_model.py @@ -2,26 +2,22 @@ import torch import os import sys + sys.path.append(os.getcwd()) from astune.utils.smart_daemon import LaunchCommandWhenAbsent - -parser = argparse.ArgumentParser(description='deploy Hugging Face model') -parser.add_argument( - '--target', - default='/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507', - type=str, - help='要下载的数据集仓库名称' -) +parser = argparse.ArgumentParser(description="deploy Hugging Face model") parser.add_argument( - '--port', - default='2888', + "--target", + default="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", type=str, - help='端口' + help="要下载的数据集仓库名称", ) +parser.add_argument("--port", default="2888", type=str, help="端口") args = parser.parse_args() + def companion_launch(): print("Launching companion process for async LLM server...") @@ -29,7 +25,9 @@ def companion_launch(): n_avail_gpus = torch.cuda.device_count() tensor_parallel_size = n_avail_gpus if tensor_parallel_size > n_avail_gpus: - print(f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}.") + print( + f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." + ) tensor_parallel_size = n_avail_gpus gpu_memory_utilization = 0.95 # max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs @@ -39,27 +37,40 @@ def companion_launch(): vllm_port = args.port companion = LaunchCommandWhenAbsent( full_argument_list=[ - sys.executable, "-m", + sys.executable, + "-m", f"vllm.entrypoints.cli.main", - f"serve", f"{model_path}", - f"--tensor-parallel-size", f"{tensor_parallel_size}", - f"--dtype", f"auto", + f"serve", + f"{model_path}", + f"--tensor-parallel-size", + f"{tensor_parallel_size}", + f"--dtype", + f"auto", f"--enforce-eager", - f"--gpu-memory-utilization", f"{gpu_memory_utilization}", + f"--gpu-memory-utilization", + f"{gpu_memory_utilization}", f"--disable-custom-all-reduce", # f"--max-num-seqs", f"{max_num_seqs}", # f"--max-model-len", f"{max_model_len}", - f"--load-format", "auto", + f"--load-format", + "auto", f"--enable-chunked-prefill", f"--enable-auto-tool-choice", - f"--tool-call-parser", "hermes", + f"--tool-call-parser", + "hermes", f"--enable-prefix-caching", # f"--seed", f"{seed}", - f"--port", f"{vllm_port}", + f"--port", + f"{vllm_port}", ], - dir='./', + dir="./", tag="api_vllm_server", ) - companion.launch(launch_wait_time=1800, success_std_string="Application startup complete", env_dict={**os.environ}) + companion.launch( + launch_wait_time=1800, + success_std_string="Application startup complete", + env_dict={**os.environ}, + ) + companion_launch() diff --git a/scripts/diagnose.py b/scripts/diagnose.py index 174b1f9b..b9fe2343 100644 --- a/scripts/diagnose.py +++ b/scripts/diagnose.py @@ -64,7 +64,11 @@ def test_connection(name, url, timeout=10): print("Error open {}: {}, {}, DNS finished in {} sec.".format(name, url, e, dns_elapsed)) return load_elapsed = time.time() - start - print("Timing for {}: {}, DNS: {:.4f} sec, LOAD: {:.4f} sec.".format(name, url, dns_elapsed, load_elapsed)) + print( + "Timing for {}: {}, DNS: {:.4f} sec, LOAD: {:.4f} sec.".format( + name, url, dns_elapsed, load_elapsed + ) + ) def check_python(): @@ -88,7 +92,12 @@ def check_pip(): def _get_current_git_commit(): try: - result = subprocess.run(["git", "rev-parse", "HEAD"], capture_output=True, text=True, check=True) + result = subprocess.run( + ["git", "rev-parse", "HEAD"], + capture_output=True, + text=True, + check=True, + ) return result.stdout.strip() except subprocess.CalledProcessError as e: print(f"Error running git command: {e.stderr.strip()}") @@ -162,7 +171,10 @@ def check_network(args): else: import warnings - warnings.warn("Region {} do not need specific test, please refer to global sites.".format(r), stacklevel=2) + warnings.warn( + "Region {} do not need specific test, please refer to global sites.".format(r), + stacklevel=2, + ) for name, url in URLS.items(): test_connection(name, url, args.timeout) @@ -170,7 +182,13 @@ def check_network(args): def check_environment(): print("----------Environment----------") for k, v in os.environ.items(): - if k.startswith("VERL_") or k.startswith("OMP_") or k.startswith("KMP_") or k == "CC" or k == "CXX": + if ( + k.startswith("VERL_") + or k.startswith("OMP_") + or k.startswith("KMP_") + or k == "CC" + or k == "CXX" + ): print('{}="{}"'.format(k, v)) @@ -192,7 +210,10 @@ def check_cuda_versions(): import subprocess nvcc_output = subprocess.check_output(["nvcc", "--version"]).decode("utf-8") - cuda_compiler_version = next((line for line in nvcc_output.splitlines() if "release" in line), None) + cuda_compiler_version = next( + (line for line in nvcc_output.splitlines() if "release" in line), + None, + ) if cuda_compiler_version: print(f"CUDA Compiler : {cuda_compiler_version.strip()}") else: @@ -219,7 +240,11 @@ def _get_gpu_info(): """ try: result = subprocess.run( - ["nvidia-smi", "--query-gpu=gpu_name,memory.total", "--format=csv,noheader,nounits"], + [ + "nvidia-smi", + "--query-gpu=gpu_name,memory.total", + "--format=csv,noheader,nounits", + ], capture_output=True, text=True, check=True, @@ -247,7 +272,11 @@ def _get_system_info(): """ cpu_memory = _get_cpu_memory() gpu_count, gpu_info = _get_gpu_info() - return {"cpu_memory": cpu_memory, "gpu_count": gpu_count, "gpu_info": gpu_info} + return { + "cpu_memory": cpu_memory, + "gpu_count": gpu_count, + "gpu_info": gpu_info, + } def check_system_info(): @@ -268,7 +297,12 @@ def parse_args(): ) choices = ["python", "pip", "verl", "system", "os", "environment"] for choice in choices: - parser.add_argument("--" + choice, default=1, type=int, help="Diagnose {}.".format(choice)) + parser.add_argument( + "--" + choice, + default=1, + type=int, + help="Diagnose {}.".format(choice), + ) parser.add_argument("--network", default=0, type=int, help="Diagnose network.") parser.add_argument("--hardware", default=0, type=int, help="Diagnose hardware.") parser.add_argument( @@ -278,7 +312,12 @@ def parse_args(): help="Additional sites in which region(s) to test. \ Specify 'cn' for example to test mirror sites in China.", ) - parser.add_argument("--timeout", default=10, type=int, help="Connection test timeout threshold, 0 to disable.") + parser.add_argument( + "--timeout", + default=10, + type=int, + help="Connection test timeout threshold, 0 to disable.", + ) args = parser.parse_args() return args diff --git a/scripts/download_dataset.py b/scripts/download_dataset.py index 0e786e7c..26805221 100644 --- a/scripts/download_dataset.py +++ b/scripts/download_dataset.py @@ -1,38 +1,55 @@ -import os; os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 必须放在第一行 +import os + +os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # 必须放在第一行 import argparse import glob import time from huggingface_hub import snapshot_download -parser = argparse.ArgumentParser(description='download Hugging Face dataset') -parser.add_argument('--target', default='openai/gsm8k', type=str, help='要下载的数据集仓库名称') -parser.add_argument('--path', default='/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k', type=str, help='路径到下载的本地目录') +parser = argparse.ArgumentParser(description="download Hugging Face dataset") +parser.add_argument("--target", default="openai/gsm8k", type=str, help="要下载的数据集仓库名称") +parser.add_argument( + "--path", + default="/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k", + type=str, + help="路径到下载的本地目录", +) args = parser.parse_args() -snapshot_download(repo_id=args.target, repo_type="dataset", local_dir=args.path, resume_download=True) +snapshot_download( + repo_id=args.target, + repo_type="dataset", + local_dir=args.path, + resume_download=True, +) time.sleep(2) from beast_logger import print_list + downloaded = [] -for item in glob.glob(os.path.join(args.path, '**', '*')): +for item in glob.glob(os.path.join(args.path, "**", "*")): downloaded += [os.path.abspath(item)] -print_list(downloaded, header='downloaded files') +print_list(downloaded, header="downloaded files") + def display_dataset(dataset_name, dataset_iter, header): from beast_logger import print_listofdict + data = [] for sample in dataset_iter: s = dict(sample) data.append(s) print_listofdict(data[:5], header=header) + try: import datasets - dataset_iter = datasets.load_dataset(args.path, name='main', split='train') - display_dataset(args.target, dataset_iter, header='train') - dataset_iter = datasets.load_dataset(args.path, name='main', split='test') - display_dataset(args.target, dataset_iter, header='test') + + dataset_iter = datasets.load_dataset(args.path, name="main", split="train") + display_dataset(args.target, dataset_iter, header="train") + dataset_iter = datasets.load_dataset(args.path, name="main", split="test") + display_dataset(args.target, dataset_iter, header="test") except Exception as e: print(f"Error loading dataset {args.target}: {e}") diff --git a/scripts/download_model.py b/scripts/download_model.py index 87aa3333..79f74668 100644 --- a/scripts/download_model.py +++ b/scripts/download_model.py @@ -1,13 +1,13 @@ - ms = input("modelscope ? (Y/n)") -if ms == "Y" or ms =="y": +if ms == "Y" or ms == "y": from modelscope import snapshot_download from loguru import logger + cache_dir = input("model path ( /mnt/data/model_cache/modelscope/hub/Qwen ): ").strip() if not cache_dir: - cache_dir = '/mnt/data/model_cache/modelscope/hub/Qwen' + cache_dir = "/mnt/data/model_cache/modelscope/hub/Qwen" res = snapshot_download(input("model name: ").strip(), cache_dir=cache_dir) logger.success(res) @@ -15,9 +15,10 @@ import os import subprocess - os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' + + os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" repo_name = input("model name: ").strip() - command = ['huggingface-cli', 'download', '--resume-download', repo_name] + command = ["huggingface-cli", "download", "--resume-download", repo_name] process = subprocess.run(command, env=os.environ, check=True) if process.returncode == 0: print(f"成功下载 {repo_name}") diff --git a/scripts/model_merger.py b/scripts/model_merger.py index 3bd25cae..581cb214 100644 --- a/scripts/model_merger.py +++ b/scripts/model_merger.py @@ -99,7 +99,9 @@ def __init__(self, config: ModelMergerConfig): self.hf_model_config_path = config.hf_model_config_path if config.hf_model_path: - print("Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. ") + print( + "Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. " + ) self.hf_model_config_path = config.hf_model_path self.model_config = AutoConfig.from_pretrained(self.hf_model_config_path) @@ -123,9 +125,13 @@ def patch_model_generation_config(self, model): """ if model.can_generate(): try: - model.generation_config = GenerationConfig.from_pretrained(self.hf_model_config_path) + model.generation_config = GenerationConfig.from_pretrained( + self.hf_model_config_path + ) except OSError: - print(f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config.") + print( + f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config." + ) return model def save_hf_model_and_tokenizer(self, state_dict: dict[str, torch.Tensor]): @@ -153,8 +159,16 @@ def upload_to_huggingface(self): from huggingface_hub import HfApi api = HfApi() - api.create_repo(repo_id=self.config.hf_upload_path, private=self.config.private, exist_ok=True) - api.upload_folder(folder_path=self.config.target_dir, repo_id=self.config.hf_upload_path, repo_type="model") + api.create_repo( + repo_id=self.config.hf_upload_path, + private=self.config.private, + exist_ok=True, + ) + api.upload_folder( + folder_path=self.config.target_dir, + repo_id=self.config.hf_upload_path, + repo_type="model", + ) @abstractmethod def merge_and_save(self): @@ -168,12 +182,20 @@ def _get_world_size(self) -> int: match = re.match(r"model_world_size_(\d+)_rank_0\.pt", filename) if match: return int(match.group(1)) - raise FileNotFoundError(f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}") + raise FileNotFoundError( + f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}" + ) def _load_rank_zero_state_dict(self, world_size: int) -> dict: - return torch.load(Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", map_location="cpu", weights_only=False) + return torch.load( + Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", + map_location="cpu", + weights_only=False, + ) - def _extract_device_mesh_info(self, state_dict: dict, world_size: int) -> tuple[np.ndarray, tuple[str, ...]]: + def _extract_device_mesh_info( + self, state_dict: dict, world_size: int + ) -> tuple[np.ndarray, tuple[str, ...]]: """ Retrieves sharding information (device_mesh, mesh_dim_names) from a DTensor in the state_dict. If no DTensor is found, infers a simple FSDP mesh based on world_size. @@ -193,9 +215,14 @@ def _extract_device_mesh_info(self, state_dict: dict, world_size: int) -> tuple[ return mesh, mesh_dim_names - def _calculate_shard_configuration(self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...]) -> tuple[int, tuple[int, ...]]: + def _calculate_shard_configuration( + self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...] + ) -> tuple[int, tuple[int, ...]]: """Calculates the total number of shards and the shape of the device mesh.""" - assert mesh_dim_names in (("fsdp",), ("ddp", "fsdp")), f"Unsupported mesh_dim_names {mesh_dim_names}" + assert mesh_dim_names in ( + ("fsdp",), + ("ddp", "fsdp"), + ), f"Unsupported mesh_dim_names {mesh_dim_names}" if "tp" in mesh_dim_names: # TODO: "tp" is not supported yet due to the above assert @@ -207,7 +234,9 @@ def _calculate_shard_configuration(self, mesh: np.ndarray, mesh_dim_names: tuple return total_shards, mesh_shape - def _merge_by_placement(self, tensors: list[torch.Tensor], placement: Placement) -> torch.Tensor: + def _merge_by_placement( + self, tensors: list[torch.Tensor], placement: Placement + ) -> torch.Tensor: """Merges a list of tensors based on their DTensor placement""" if placement.is_replicate(): return tensors[0] @@ -218,18 +247,33 @@ def _merge_by_placement(self, tensors: list[torch.Tensor], placement: Placement) raise NotImplementedError(f"Unsupported placement: {placement}") - def _load_and_merge_state_dicts(self, world_size: int, total_shards: int, mesh_shape: tuple[int, ...], mesh_dim_names: tuple[str, ...]) -> dict[str, torch.Tensor]: + def _load_and_merge_state_dicts( + self, + world_size: int, + total_shards: int, + mesh_shape: tuple[int, ...], + mesh_dim_names: tuple[str, ...], + ) -> dict[str, torch.Tensor]: model_state_dict_lst = [None] * total_shards def process_one_shard(rank: int, model_state_dict_lst: list): - model_path = Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" + model_path = ( + Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" + ) state_dict = torch.load(model_path, map_location="cpu", weights_only=False) model_state_dict_lst[rank] = state_dict return state_dict with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [executor.submit(process_one_shard, rank, model_state_dict_lst) for rank in range(total_shards)] - for future in tqdm(futures, desc=f"Loading {total_shards} FSDP shards", total=total_shards): + futures = [ + executor.submit(process_one_shard, rank, model_state_dict_lst) + for rank in range(total_shards) + ] + for future in tqdm( + futures, + desc=f"Loading {total_shards} FSDP shards", + total=total_shards, + ): future.result() # Merge state dicts from all shards @@ -289,7 +333,9 @@ def merge_and_save(self): total_shards, mesh_shape = self._calculate_shard_configuration(mesh, mesh_dim_names) print(f"Processing model shards with {total_shards} {mesh_shape} in total") - merged_state_dict = self._load_and_merge_state_dicts(world_size, total_shards, mesh_shape, mesh_dim_names) + merged_state_dict = self._load_and_merge_state_dicts( + world_size, total_shards, mesh_shape, mesh_dim_names + ) if self.config.operation == "test": if not self.config.test_hf_dir: @@ -305,7 +351,9 @@ def merge_and_save(self): def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): auto_model_class = self.get_transformers_auto_model_class() - hf_model = auto_model_class.from_pretrained(self.config.test_hf_dir, torch_dtype=torch.bfloat16) + hf_model = auto_model_class.from_pretrained( + self.config.test_hf_dir, torch_dtype=torch.bfloat16 + ) hf_state_dict = hf_model.state_dict() del hf_model @@ -313,28 +361,40 @@ def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): collected_keys = set(state_dict.keys()) missing_keys = hf_model_keys - collected_keys - assert len(missing_keys) == 0, f"Missing keys in collected state dict: {list(sorted(missing_keys))}" + assert ( + len(missing_keys) == 0 + ), f"Missing keys in collected state dict: {list(sorted(missing_keys))}" extra_keys = collected_keys - hf_model_keys - assert len(extra_keys) == 0, f"Extra keys in collected state dict: {list(sorted(extra_keys))}" + assert ( + len(extra_keys) == 0 + ), f"Extra keys in collected state dict: {list(sorted(extra_keys))}" for key in hf_model_keys: hf_shape = hf_state_dict[key].shape collected_shape = state_dict[key].shape - assert hf_shape == collected_shape, f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" + assert ( + hf_shape == collected_shape + ), f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" hf_dtype = hf_state_dict[key].dtype collected_dtype = state_dict[key].dtype - assert hf_dtype == collected_dtype, f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" + assert ( + hf_dtype == collected_dtype + ), f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" torch.testing.assert_close(hf_state_dict[key], state_dict[key], atol=1e-6, rtol=1e-6) - print("FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager.") + print( + "FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager." + ) class MegatronModelMerger(BaseModelMerger): def __init__(self, config: ModelMergerConfig): - from verl.utils.megatron_utils import get_hf_config_and_tokenizer_checkpoint_path + from verl.utils.megatron_utils import ( + get_hf_config_and_tokenizer_checkpoint_path, + ) config.hf_model_config_path = get_hf_config_and_tokenizer_checkpoint_path(config.local_dir) super().__init__(config) @@ -355,13 +415,22 @@ def _check_megatron_checkpoint_path(self, model_path: str) -> tuple[list[str], i pp_size = 0 sharded_dirs = sorted(os.listdir(model_path)) for sharded_dir in sharded_dirs: - assert "model.pt" in os.listdir(Path(model_path) / sharded_dir), f"model.pt not found in {sharded_dir}" + assert "model.pt" in os.listdir( + Path(model_path) / sharded_dir + ), f"model.pt not found in {sharded_dir}" tp_rank, pp_rank = self._get_tp_pp_rank_from_sharded_dir(sharded_dir) tp_size = max(tp_size, tp_rank + 1) pp_size = max(pp_size, pp_rank + 1) return sharded_dirs, tp_size, pp_size - def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: PretrainedConfig, tp_size: int, is_value_model: bool = False) -> torch.Tensor | list[torch.Tensor]: + def _merge_across_tp( + self, + key: str, + tp_data: list[torch.Tensor], + config: PretrainedConfig, + tp_size: int, + is_value_model: bool = False, + ) -> torch.Tensor | list[torch.Tensor]: if "linear_fc1.weight" in key: # if the tensor is gate and proj gate_lst = [] @@ -384,7 +453,11 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra num_q_per_kv = config.num_attention_heads // config.num_key_value_heads assert tp_data[0].shape[0] % (num_q_per_kv + 2) == 0 kv_size_per_tp = tp_data[0].shape[0] // (num_q_per_kv + 2) - split_size = [kv_size_per_tp * num_q_per_kv, kv_size_per_tp, kv_size_per_tp] + split_size = [ + kv_size_per_tp * num_q_per_kv, + kv_size_per_tp, + kv_size_per_tp, + ] for infer_param in tp_data: num_query_groups_per_partition = config.num_key_value_heads // tp_size @@ -412,7 +485,13 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra dim = 1 return torch.cat(tp_data, dim=dim) - def _load_state_dicts(self, model_ckpt_path: str, sharded_dirs: list[str], tp_size: int, pp_size: int) -> list[list[dict]]: + def _load_state_dicts( + self, + model_ckpt_path: str, + sharded_dirs: list[str], + tp_size: int, + pp_size: int, + ) -> list[list[dict]]: model_state_dict_lst = [[None for _ in range(tp_size)] for _ in range(pp_size)] def _process_one_megatron_shard(sharded_dir: str): @@ -422,13 +501,25 @@ def _process_one_megatron_shard(sharded_dir: str): model_state_dict_lst[pp_rank][tp_rank] = state_dict with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [executor.submit(_process_one_megatron_shard, sharded_dir) for sharded_dir in sharded_dirs] - for future in tqdm(futures, desc=f"Loading {len(sharded_dirs)} Megatron shards", total=len(sharded_dirs)): + futures = [ + executor.submit(_process_one_megatron_shard, sharded_dir) + for sharded_dir in sharded_dirs + ] + for future in tqdm( + futures, + desc=f"Loading {len(sharded_dirs)} Megatron shards", + total=len(sharded_dirs), + ): future.result() return model_state_dict_lst - def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: int, pp_size: int) -> dict[str, torch.Tensor]: + def _merge_state_dicts( + self, + model_state_dict_lst: list[list[dict]], + tp_size: int, + pp_size: int, + ) -> dict[str, torch.Tensor]: state_dict = {} vpp_size = len(model_state_dict_lst[0][0]) layers_cum = 0 @@ -453,8 +544,17 @@ def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: in new_key_list[2] = str(global_layer_no) new_key = ".".join(new_key_list) - tp_data = [model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] for tp_rank in range(tp_size)] - merged = self._merge_across_tp(new_key, tp_data, self.model_config, tp_size, self.config.is_value_model) + tp_data = [ + model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] + for tp_rank in range(tp_size) + ] + merged = self._merge_across_tp( + new_key, + tp_data, + self.model_config, + tp_size, + self.config.is_value_model, + ) if not isinstance(merged, list): state_dict[new_key] = merged @@ -476,9 +576,13 @@ def merge_and_save(self): model_ckpt_path = get_model_checkpoint_path(self.config.local_dir) sharded_dirs, tp_size, pp_size = self._check_megatron_checkpoint_path(model_ckpt_path) - print(f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}") + print( + f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}" + ) - model_state_dict_lst = self._load_state_dicts(model_ckpt_path, sharded_dirs, tp_size, pp_size) + model_state_dict_lst = self._load_state_dicts( + model_ckpt_path, sharded_dirs, tp_size, pp_size + ) merged_state_dict = self._merge_state_dicts(model_state_dict_lst, tp_size, pp_size) del model_state_dict_lst @@ -502,14 +606,26 @@ def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): params_mapping = [ # (megatron core gpt model name, vllm model name) - ("self_attention.linear_qkv.layer_norm_weight", "input_layernorm.weight"), - ("self_attention.linear_qkv.layer_norm_bias", "input_layernorm.bias"), + ( + "self_attention.linear_qkv.layer_norm_weight", + "input_layernorm.weight", + ), + ( + "self_attention.linear_qkv.layer_norm_bias", + "input_layernorm.bias", + ), ("embedding.word_embeddings", "model.embed_tokens"), ("self_attention.linear_qkv", "self_attn.qkv_proj"), ("self_attention.linear_proj", "self_attn.o_proj"), ("pre_mlp_layernorm", "post_attention_layernorm"), - ("mlp.linear_fc1.layer_norm_weight", "post_attention_layernorm.weight"), - ("mlp.linear_fc1.layer_norm_bias", "post_attention_layernorm.bias"), + ( + "mlp.linear_fc1.layer_norm_weight", + "post_attention_layernorm.weight", + ), + ( + "mlp.linear_fc1.layer_norm_bias", + "post_attention_layernorm.bias", + ), ("mlp.linear_fc1", "mlp.gate_up_proj"), ("mlp.linear_fc2", "mlp.down_proj"), ("decoder.final_layernorm", "model.norm"), @@ -540,7 +656,10 @@ def _replace_name(self, megatron_name: str, name_mapping: list[tuple[str, str]]) if "layers" in megatron_name: # deal with decoder layers megatron_name = megatron_name.replace("decoder", "model") megatron_name_list = megatron_name.split(".") - if "layer_norm_weight" in megatron_name_list or "layer_norm_bias" in megatron_name_list: + if ( + "layer_norm_weight" in megatron_name_list + or "layer_norm_bias" in megatron_name_list + ): param_name_list = megatron_name_list[:3] param_name_list.append(v_name) param_name = ".".join(param_name_list) @@ -559,22 +678,77 @@ def _replace_name(self, megatron_name: str, name_mapping: list[tuple[str, str]]) def main(): parser = argparse.ArgumentParser(description="verl model merger") - subparsers = parser.add_subparsers(dest="operation", required=True, help="Specify 'merge' or 'test' operation.") + subparsers = parser.add_subparsers( + dest="operation", + required=True, + help="Specify 'merge' or 'test' operation.", + ) base_op_parser = argparse.ArgumentParser(add_help=False) - base_op_parser.add_argument("--backend", type=str, required=True, choices=["fsdp", "megatron"], help="The backend of the model") - base_op_parser.add_argument("--local_dir", type=str, required=True, help="Path to the saved model checkpoints") - base_op_parser.add_argument("--hf_model_path", type=str, default=None, help="(Deprecated) Path to the original Hugging Face model for config.") - base_op_parser.add_argument("--tie-word-embedding", action="store_true", help="Whether to tie word embedding weights (currently only Megatron supported)") - base_op_parser.add_argument("--is-value-model", action="store_true", help="Whether the model is a value model (currently only Megatron supported)") - - merge_parser = subparsers.add_parser("merge", parents=[base_op_parser], help="Merge model checkpoints and save.") - merge_parser.add_argument("--target_dir", default="tmp", type=str, help="Directory to save the merged huggingface model") - merge_parser.add_argument("--hf_upload_path", default=None, type=str, help="Hugging Face repository ID to upload the model") - merge_parser.add_argument("--private", action="store_true", help="Whether to upload the model to a private Hugging Face repository") - - test_parser = subparsers.add_parser("test", parents=[base_op_parser], help="Test merged model against a reference Hugging Face model") - test_parser.add_argument("--test_hf_dir", type=str, required=True, help="Path to the reference Hugging Face model directory for testing") + base_op_parser.add_argument( + "--backend", + type=str, + required=True, + choices=["fsdp", "megatron"], + help="The backend of the model", + ) + base_op_parser.add_argument( + "--local_dir", + type=str, + required=True, + help="Path to the saved model checkpoints", + ) + base_op_parser.add_argument( + "--hf_model_path", + type=str, + default=None, + help="(Deprecated) Path to the original Hugging Face model for config.", + ) + base_op_parser.add_argument( + "--tie-word-embedding", + action="store_true", + help="Whether to tie word embedding weights (currently only Megatron supported)", + ) + base_op_parser.add_argument( + "--is-value-model", + action="store_true", + help="Whether the model is a value model (currently only Megatron supported)", + ) + + merge_parser = subparsers.add_parser( + "merge", + parents=[base_op_parser], + help="Merge model checkpoints and save.", + ) + merge_parser.add_argument( + "--target_dir", + default="tmp", + type=str, + help="Directory to save the merged huggingface model", + ) + merge_parser.add_argument( + "--hf_upload_path", + default=None, + type=str, + help="Hugging Face repository ID to upload the model", + ) + merge_parser.add_argument( + "--private", + action="store_true", + help="Whether to upload the model to a private Hugging Face repository", + ) + + test_parser = subparsers.add_parser( + "test", + parents=[base_op_parser], + help="Test merged model against a reference Hugging Face model", + ) + test_parser.add_argument( + "--test_hf_dir", + type=str, + required=True, + help="Path to the reference Hugging Face model directory for testing", + ) args = parser.parse_args() diff --git a/tests/test_tracing.py b/tests/test_tracing.py index a6a03782..53b843a2 100644 --- a/tests/test_tracing.py +++ b/tests/test_tracing.py @@ -7,17 +7,18 @@ from astune.task_reader.tracing_reader import TracingReader from astune.schema.task import Task + @pytest.fixture def config(tmp_path: Path) -> dict: return { - "astune":{ + "astune": { "base_url": ".trash/database.sqlite", "train_output_path": str(tmp_path / "tasks.jsonl"), } } -reader = TracingReader(config) # type: ignore +reader = TracingReader(config) # type: ignore reader._connector = connector # type: ignore[attr-defined] reader._filters = [flt] # type: ignore[attr-defined] diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index ab3377a1..fab2aab2 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -10,7 +10,9 @@ def __init__(self, tasks: List[Task]): self._tasks = tasks self.called = 0 - def load_tasks_from_conversation(self, projects_limit: int = 100, spans_limit: int = 100) -> List[Task]: + def load_tasks_from_conversation( + self, projects_limit: int = 100, spans_limit: int = 100 + ) -> List[Task]: self.called += 1 return self._tasks @@ -43,7 +45,6 @@ def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: # return read_astune_config('launcher/math_agent/git-math-agentscope.yaml') # type: ignore - # def test_get_training_tasks_new_file(config: dict): # from types import SimpleNamespace # from astune.task_reader.tracing_reader import TracingReader, Config @@ -57,8 +58,6 @@ def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: # print(tr.get_training_tasks()) - - # prepare tests/database.sqlite from agentscope first import json @@ -72,7 +71,6 @@ def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: from astune.schema.task import Task - @pytest.fixture def config(tmp_path: Path) -> SimpleNamespace: a = SimpleNamespace() @@ -80,7 +78,7 @@ def config(tmp_path: Path) -> SimpleNamespace: a.astune.tracing = { "base_url": "./.trash/database.sqlite", "train_output_path": str(tmp_path / "tasks.jsonl"), - "filters": [] + "filters": [], } return a @@ -100,37 +98,43 @@ def config_with_filter(tmp_path: Path) -> SimpleNamespace: "custom_rubrics": "If the answer claims that it has written the output to a file, consider it an invalid response.", "temperature": 0.5, "max_tokens": 2048, - "print_reason": False - } + "print_reason": False, + }, } - ] + ], } return a def test_get_training_tasks_new_file(config: SimpleNamespace): - from dotenv import load_dotenv; load_dotenv() + from dotenv import load_dotenv + + load_dotenv() # prepare tasks returned from connector reader = TracingReader(config, train_ratio=0.7) # type: ignore result = reader.get_training_tasks() # the number of tasks in tests/database.sqlite - assert len(result) == int(7*0.7) + assert len(result) == int(7 * 0.7) # file should be created with one json per line - out_path = Path(config.astune.tracing['train_output_path']) + out_path = Path(config.astune.tracing["train_output_path"]) assert out_path.exists() with out_path.open("r", encoding="utf-8") as f: lines = [json.loads(line) for line in f if line.strip()] assert len(lines) == 7 # the number of tasks in tests/database.sqlite -def test_get_training_tasks_with_filter(config_with_filter: SimpleNamespace, config: SimpleNamespace): - from dotenv import load_dotenv; load_dotenv() +def test_get_training_tasks_with_filter( + config_with_filter: SimpleNamespace, config: SimpleNamespace +): + from dotenv import load_dotenv + + load_dotenv() reader = TracingReader(config_with_filter) # type: ignore result = reader.get_training_tasks() - assert len(result) < int(7*0.7) + assert len(result) < int(7 * 0.7) reader_full = TracingReader(config) result_full = reader_full.get_training_tasks() diff --git a/tests/test_utils/read_config_from_yaml.py b/tests/test_utils/read_config_from_yaml.py index 5deaf0f6..b6bd8d9a 100644 --- a/tests/test_utils/read_config_from_yaml.py +++ b/tests/test_utils/read_config_from_yaml.py @@ -1,8 +1,6 @@ - - - def read_yaml_config(file_path: str) -> dict: import yaml - with open(file_path, 'r') as file: + + with open(file_path, "r") as file: config = yaml.safe_load(file) return config diff --git a/tutorial/appworld.md b/tutorial/appworld.md index 91a57c0c..8e805b68 100644 --- a/tutorial/appworld.md +++ b/tutorial/appworld.md @@ -27,7 +27,7 @@ for _ in range(config.astune.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol - obs, _, terminate, _ = astune_proxy.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) + obs, _, terminate, _ = astune_proxy.gym_step(action={"content": reply_message.content, "role": "assistant"}) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? @@ -37,7 +37,7 @@ for _ in range(config.astune.rollout.multi_turn.max_steps): ``` - 其中,使用了 astune_proxy 与 agentscope runtime 环境交互的一些接口如下: - - `astune_proxy.env_step_fn` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 + - `astune_proxy.gym_step` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 - `astune_proxy.context_overflow` 查询当前的context窗口是否token溢出 ### 3. 准备Judge (奖励模块) diff --git a/tutorial/appworld.py b/tutorial/appworld.py index 8a4a5920..d4df9256 100644 --- a/tutorial/appworld.py +++ b/tutorial/appworld.py @@ -2,25 +2,36 @@ from agentscope.message import Msg from pydantic import Field + class ExampleAgentScopeLearnProtocol(Workflow): trainer: str = Field(default="astune-trinity") - async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory init_messages = workflow_task.task.init_messages - if len(init_messages) >= 2: first_msg, init_messages = init_messages[0], init_messages[1:] - else: first_msg = {"content": "You're a helpful assistant."} + if len(init_messages) >= 2: + first_msg, init_messages = init_messages[0], init_messages[1:] + else: + first_msg = {"content": "You're a helpful assistant."} interaction_message = [] for msg in init_messages: - interaction_message.append(Msg(name=msg.get("name", "user"), content=msg.get("content", ""), role=msg.get("role", "user"))) + interaction_message.append( + Msg( + name=msg.get("name", "user"), + content=msg.get("content", ""), + role=msg.get("role", "user"), + ) + ) agent = ReActAgent( name="Qwen", - sys_prompt=first_msg['content'], + sys_prompt=first_msg["content"], model=model_tuner, formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), @@ -34,11 +45,15 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol - obs, _, terminate, _ = env.step(action={"content": reply_message.content, "role": "assistant"}) + obs, _, terminate, _ = env.step( + action={"content": reply_message.content, "role": "assistant"} + ) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? - if terminate: break - if model_tuner.get_context_tracker().context_overflow: break + if terminate: + break + if model_tuner.get_context_tracker().context_overflow: + break return WorkflowOutput(reward=None, metadata={"total_step": step}) diff --git a/tutorial/math_agent.py b/tutorial/math_agent.py index a1e161aa..8c4b198d 100644 --- a/tutorial/math_agent.py +++ b/tutorial/math_agent.py @@ -3,6 +3,7 @@ from pydantic import BaseModel, Field from loguru import logger + def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" try: @@ -22,7 +23,6 @@ def extract_final_answer(result) -> str: return str(result) - class FinalResult(BaseModel): result: str = Field( description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" @@ -37,12 +37,13 @@ class FinalResult(BaseModel): """ - class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory diff --git a/tutorial/werewolves/game.py b/tutorial/werewolves/game.py index 06e4f4e6..3b5b212e 100644 --- a/tutorial/werewolves/game.py +++ b/tutorial/werewolves/game.py @@ -176,8 +176,7 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # Has poison potion and hasn't used the healing potion if poison and not ( - msg_witch_resurrect - and msg_witch_resurrect.metadata["resurrect"] + msg_witch_resurrect and msg_witch_resurrect.metadata["resurrect"] ): msg_witch_poison = await agent( await moderator( @@ -221,10 +220,7 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # Hunter's turn for agent in players.hunter: # If killed and not by witch's poison - if ( - killed_player == agent.name - and poisoned_player != agent.name - ): + if killed_player == agent.name and poisoned_player != agent.name: shot_player = await hunter_stage(agent, players) # Update alive players @@ -347,7 +343,7 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # ) alive_wolves = players.werewolves - good_guy_win = (len(alive_wolves) == 0) + good_guy_win = len(alive_wolves) == 0 logger.warning(f"**********************************") logger.warning(f"Good guy win: {good_guy_win}, alive werewolves: {alive_wolves}") return good_guy_win diff --git a/tutorial/werewolves/prompt.py b/tutorial/werewolves/prompt.py index 38427fda..c3c3472e 100644 --- a/tutorial/werewolves/prompt.py +++ b/tutorial/werewolves/prompt.py @@ -31,13 +31,10 @@ class EnglishPrompts: to_wolves_vote = "[WEREWOLVES ONLY] Which player do you vote to kill?" to_wolves_res = ( - "[WEREWOLVES ONLY] The voting result is {}. So you have chosen to " - "eliminate {}." + "[WEREWOLVES ONLY] The voting result is {}. So you have chosen to " "eliminate {}." ) - to_all_witch_turn = ( - "Witch's turn, witch open your eyes and decide your action tonight..." - ) + to_all_witch_turn = "Witch's turn, witch open your eyes and decide your action tonight..." to_witch_resurrect = ( "[WITCH ONLY] {witch_name}, you're the witch, and tonight {dead_name} " "is eliminated. You can resurrect him/her by using your healing " @@ -46,12 +43,8 @@ class EnglishPrompts: "resurrect {dead_name}? Give me your reason and decision." ) - to_witch_resurrect_no = ( - "[WITCH ONLY] The witch has chosen not to resurrect the player." - ) - to_witch_resurrect_yes = ( - "[WITCH ONLY] The witch has chosen to resurrect the player." - ) + to_witch_resurrect_no = "[WITCH ONLY] The witch has chosen not to resurrect the player." + to_witch_resurrect_yes = "[WITCH ONLY] The witch has chosen to resurrect the player." to_witch_poison = ( "[WITCH ONLY] {witch_name}, as a witch, you have a one-time-use " @@ -60,8 +53,7 @@ class EnglishPrompts: ) to_all_seer_turn = ( - "Seer's turn, seer open your eyes and check one player's identity " - "tonight..." + "Seer's turn, seer open your eyes and check one player's identity " "tonight..." ) to_seer = ( @@ -69,9 +61,7 @@ class EnglishPrompts: "tonight. Who do you want to check? Give me your reason and decision." ) - to_seer_result = ( - "[SEER ONLY] You've checked {agent_name}, and the result is: {role}." - ) + to_seer_result = "[SEER ONLY] You've checked {agent_name}, and the result is: {role}." to_hunter = ( "[HUNTER ONLY] {name}, as the hunter you're eliminated tonight. You " @@ -79,9 +69,7 @@ class EnglishPrompts: "not to use this ability. Give me your reason and decision." ) - to_all_hunter_shoot = ( - "The hunter has chosen to shoot {} down with him/herself." - ) + to_all_hunter_shoot = "The hunter has chosen to shoot {} down with him/herself." to_all_day = ( "The day is coming, all players open your eyes. Last night, " @@ -133,7 +121,9 @@ class ChinesePrompts: to_dead_player = "{}, 你已被淘汰。现在你可以向所有存活玩家发表最后的遗言。" - to_all_new_game = "新的一局游戏开始,参与玩家包括:{}。现在为每位玩家重新随机分配身份,并私下告知各自身份。" + to_all_new_game = ( + "新的一局游戏开始,参与玩家包括:{}。现在为每位玩家重新随机分配身份,并私下告知各自身份。" + ) to_all_night = "天黑了,请所有人闭眼。狼人请睁眼,选择今晚要淘汰的一名玩家..." @@ -156,11 +146,15 @@ class ChinesePrompts: to_witch_resurrect_no = "[仅女巫可见] 女巫选择不救该玩家。" to_witch_resurrect_yes = "[仅女巫可见] 女巫选择救活该玩家。" - to_witch_poison = "[仅女巫可见] {witch_name},你有一瓶一次性毒药,今晚要使用吗?请给出理由和决定。" + to_witch_poison = ( + "[仅女巫可见] {witch_name},你有一瓶一次性毒药,今晚要使用吗?请给出理由和决定。" + ) to_all_seer_turn = "轮到预言家行动,预言家请睁眼并查验一名玩家身份..." - to_seer = "[仅预言家可见] {}, 你是预言家,今晚可以查验一名玩家身份。你要查谁?请给出理由和决定。" + to_seer = ( + "[仅预言家可见] {}, 你是预言家,今晚可以查验一名玩家身份。你要查谁?请给出理由和决定。" + ) to_seer_result = "[仅预言家可见] 你查验了{agent_name},结果是:{role}。" @@ -184,7 +178,9 @@ class ChinesePrompts: "本局所有玩家真实身份为:{true_roles}" ) - to_all_village_win = "所有狼人已被淘汰。游戏结束,村民获胜🏘️🎉!本局所有玩家真实身份为:{true_roles}" + to_all_village_win = ( + "所有狼人已被淘汰。游戏结束,村民获胜🏘️🎉!本局所有玩家真实身份为:{true_roles}" + ) to_all_continue = "游戏继续。" diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py index 6d0d5141..a1ecb280 100644 --- a/tutorial/werewolves/start.py +++ b/tutorial/werewolves/start.py @@ -4,7 +4,9 @@ """The main entry point for the werewolf game.""" import numpy as np -import dotenv; dotenv.load_dotenv() +import dotenv + +dotenv.load_dotenv() from textwrap import dedent from loguru import logger from tutorial.werewolves.game import werewolves_game @@ -16,7 +18,8 @@ def get_official_agent_prompt(name) -> str: - system_prompt = dedent(f""" + system_prompt = dedent( + f""" You're a werewolf game player named {name}. # YOUR TARGET @@ -76,9 +79,13 @@ def get_official_agent_prompt(name) -> str: class ExampleWerewolves(Workflow): trainer: str = Field(default="astune-trinity") - trainable_targets: list = Field(default=["werewolf"], description="List of agents to be fine-tuned.") + trainable_targets: list = Field( + default=["werewolf"], description="List of agents to be fine-tuned." + ) - async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: # ensure trainable targets is legal if "werewolf" in self.trainable_targets: @@ -88,7 +95,7 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod # make and shuffle roles (fix random seed for reproducibility) roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] - task_id = workflow_task.task.metadata['random_number'] + task_id = workflow_task.task.metadata["random_number"] np.random.seed(int(task_id)) np.random.shuffle(roles) @@ -97,7 +104,9 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod for i, role in enumerate(roles): default_model = OpenAIChatModel( model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", - stream=False, client_args = { "base_url": "http://22.16.118.255:2888/v1" }, api_key="1234", + stream=False, + client_args={"base_url": "http://22.16.118.255:2888/v1"}, + api_key="1234", ) agent = ReActAgent( name=f"Player{i + 1}", @@ -112,8 +121,9 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod good_guy_win = await werewolves_game(players, roles) raw_reward = 0 is_success = False - if (good_guy_win and self.trainable_targets[0] != "werewolf") or \ - (not good_guy_win and self.trainable_targets[0] == "werewolf"): + if (good_guy_win and self.trainable_targets[0] != "werewolf") or ( + not good_guy_win and self.trainable_targets[0] == "werewolf" + ): raw_reward = 1 is_success = True diff --git a/tutorial/werewolves/structured_model.py b/tutorial/werewolves/structured_model.py index a5f89e1c..4764816e 100644 --- a/tutorial/werewolves/structured_model.py +++ b/tutorial/werewolves/structured_model.py @@ -44,12 +44,12 @@ class WitchPoisonModel(BaseModel): poison: bool = Field( description="Do you want to use the poison potion", ) - name: Literal[ # type: ignore - tuple(_.name for _ in agents) - ] | None = Field( - description="The name of the player you want to poison, if you " - "don't want to poison anyone, just leave it empty", - default=None, + name: Literal[tuple(_.name for _ in agents)] | None = ( # type: ignore + Field( + description="The name of the player you want to poison, if you " + "don't want to poison anyone, just leave it empty", + default=None, + ) ) return WitchPoisonModel @@ -77,12 +77,12 @@ class HunterModel(BaseModel): shoot: bool = Field( description="Whether you want to use the shooting ability or not", ) - name: Literal[ # type: ignore - tuple(_.name for _ in agents) - ] | None = Field( - description="The name of the player you want to shoot, if you " - "don't want to the ability, just leave it empty", - default=None, + name: Literal[tuple(_.name for _ in agents)] | None = ( # type: ignore + Field( + description="The name of the player you want to shoot, if you " + "don't want to the ability, just leave it empty", + default=None, + ) ) return HunterModel diff --git a/tutorial/werewolves/utils.py b/tutorial/werewolves/utils.py index c436cbb5..a73daf4c 100644 --- a/tutorial/werewolves/utils.py +++ b/tutorial/werewolves/utils.py @@ -124,18 +124,12 @@ def update_players(self, dead_players: list[ReActAgent]) -> None: dead_players (`list[ReActAgent]`): A list of dead players to be removed. """ - self.werewolves = [ - _ for _ in self.werewolves if _.name not in dead_players - ] - self.villagers = [ - _ for _ in self.villagers if _.name not in dead_players - ] + self.werewolves = [_ for _ in self.werewolves if _.name not in dead_players] + self.villagers = [_ for _ in self.villagers if _.name not in dead_players] self.seer = [_ for _ in self.seer if _.name not in dead_players] self.hunter = [_ for _ in self.hunter if _.name not in dead_players] self.witch = [_ for _ in self.witch if _.name not in dead_players] - self.current_alive = [ - _ for _ in self.current_alive if _.name not in dead_players - ] + self.current_alive = [_ for _ in self.current_alive if _.name not in dead_players] def print_roles(self) -> None: """Print the roles of all players.""" diff --git a/vsdb.py b/vsdb.py index 17144a46..1c3a18cd 100644 --- a/vsdb.py +++ b/vsdb.py @@ -10,98 +10,101 @@ https://docs.ray.io/en/latest/ray-observability/ray-distributed-debugger.html """ + def vscode_conditional_breakpoint(tag=None, once=True): - """ - Conditionally set a breakpoint for VSCode debugging with Ray distributed systems. - - This function provides a smart breakpoint mechanism that respects environment - variables and can be configured to trigger only once or multiple times based on - debug tags. It's designed to work with Ray's post-mortem debugging feature. - - Args: - tag (str, optional): A debug tag to conditionally trigger the breakpoint. - If provided, the breakpoint will only trigger if this tag is present - in the DEBUG_TAGS environment variable (pipe-separated list). - If None, the breakpoint behavior depends only on the `once` parameter. - Defaults to None. - - once (bool, optional): Whether the breakpoint should only trigger once - per tag/session. If True, uses environment variables to track if - the breakpoint has already been hit. If False, the breakpoint will - trigger every time the function is called (subject to other conditions). - Defaults to True. - - Returns: - None: This function doesn't return any value. It either triggers a - breakpoint or returns silently. - - Environment Variables: - RAY_DEBUG_POST_MORTEM: Must be set to enable any breakpoint functionality. - If not set, the function returns immediately without doing anything. - - DEBUG_TAGS: Pipe-separated list of debug tags (e.g., "tag1|tag2|tag3"). - Only required when using the `tag` parameter. The breakpoint will - only trigger if the provided tag is found in this list. - - HIT_BREAKPOINT_REC_{tag}: Automatically created environment variables - to track whether a specific tagged breakpoint has already been hit - when `once=True`. These are internal tracking variables. - - Examples: - # Simple breakpoint that triggers once - vscode_conditional_breakpoint(tag="training") - - # Breakpoint that triggers every time - vscode_conditional_breakpoint(tag="training", once=False) - - # Tagged breakpoint (requires DEBUG_TAGS="training|validation") - vscode_conditional_breakpoint(tag="training") - - # Tagged breakpoint that can trigger multiple times - vscode_conditional_breakpoint(tag="validation", once=False) - - Note: - This function is designed to work with Ray's distributed debugging - capabilities and the VSCode Ray Distributed Debugger extension. - Make sure RAY_DEBUG_POST_MORTEM=1 is set in your environment. - """ - - env_tag = f'HIT_BREAKPOINT_REC_{tag}' - if not os.getenv('RAY_DEBUG_POST_MORTEM'): return - if tag is None: - if once: - if os.getenv(env_tag, "") != "1": - os.environ[env_tag] = "1" - breakpoint() - return - else: - breakpoint() - return - else: - debug_tags = os.getenv('DEBUG_TAGS', '').split('|') - if tag in debug_tags: - if once: + """ + Conditionally set a breakpoint for VSCode debugging with Ray distributed systems. + + This function provides a smart breakpoint mechanism that respects environment + variables and can be configured to trigger only once or multiple times based on + debug tags. It's designed to work with Ray's post-mortem debugging feature. + + Args: + tag (str, optional): A debug tag to conditionally trigger the breakpoint. + If provided, the breakpoint will only trigger if this tag is present + in the DEBUG_TAGS environment variable (pipe-separated list). + If None, the breakpoint behavior depends only on the `once` parameter. + Defaults to None. + + once (bool, optional): Whether the breakpoint should only trigger once + per tag/session. If True, uses environment variables to track if + the breakpoint has already been hit. If False, the breakpoint will + trigger every time the function is called (subject to other conditions). + Defaults to True. + + Returns: + None: This function doesn't return any value. It either triggers a + breakpoint or returns silently. + + Environment Variables: + RAY_DEBUG_POST_MORTEM: Must be set to enable any breakpoint functionality. + If not set, the function returns immediately without doing anything. + + DEBUG_TAGS: Pipe-separated list of debug tags (e.g., "tag1|tag2|tag3"). + Only required when using the `tag` parameter. The breakpoint will + only trigger if the provided tag is found in this list. + + HIT_BREAKPOINT_REC_{tag}: Automatically created environment variables + to track whether a specific tagged breakpoint has already been hit + when `once=True`. These are internal tracking variables. + + Examples: + # Simple breakpoint that triggers once + vscode_conditional_breakpoint(tag="training") + + # Breakpoint that triggers every time + vscode_conditional_breakpoint(tag="training", once=False) + + # Tagged breakpoint (requires DEBUG_TAGS="training|validation") + vscode_conditional_breakpoint(tag="training") + + # Tagged breakpoint that can trigger multiple times + vscode_conditional_breakpoint(tag="validation", once=False) + + Note: + This function is designed to work with Ray's distributed debugging + capabilities and the VSCode Ray Distributed Debugger extension. + Make sure RAY_DEBUG_POST_MORTEM=1 is set in your environment. + """ + + env_tag = f"HIT_BREAKPOINT_REC_{tag}" + if not os.getenv("RAY_DEBUG_POST_MORTEM"): + return + if tag is None: + if once: if os.getenv(env_tag, "") != "1": - os.environ[env_tag] = "1" - breakpoint() - return - else: + os.environ[env_tag] = "1" + breakpoint() + return + else: breakpoint() return + else: + debug_tags = os.getenv("DEBUG_TAGS", "").split("|") + if tag in debug_tags: + if once: + if os.getenv(env_tag, "") != "1": + os.environ[env_tag] = "1" + breakpoint() + return + else: + breakpoint() + return def objdump(obj, file="objdump.tmp"): - with open(file, "wb+") as f: - pickle.dump(obj, f) - return + with open(file, "wb+") as f: + pickle.dump(obj, f) + return def objload(file="objdump.tmp"): - import os - if not os.path.exists(file): - return - with open(file, "rb") as f: - return pickle.load(f) + import os + + if not os.path.exists(file): + return + with open(file, "rb") as f: + return pickle.load(f) bp = vscode_conditional_breakpoint From ca7b544b362a377ef132668a65e5cfc37cb1c09e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 18:10:10 +0800 Subject: [PATCH 083/462] upgrade tutorials --- README.md | 12 +- astune/default_config/astune_default.yaml | 2 +- launcher.py | 113 +++++++++++++++--- tests/test_launcher_appworld.py | 52 ++++++++ tests/test_tracing_reader.py | 2 +- tutorial/{ => example_appworld}/appworld.md | 10 +- tutorial/{ => example_appworld}/appworld.py | 0 .../example_appworld/appworld.yaml | 2 +- .../{ => example_math_agent}/math_agent.md | 6 +- .../{ => example_math_agent}/math_agent.py | 0 .../example_math_agent/math_agent.yaml | 2 +- .../game.py | 0 .../prompt.py | 0 .../start.py | 0 .../structured_model.py | 0 .../utils.py | 0 .../werewolves.md | 10 +- .../werewolves.yaml | 5 +- 18 files changed, 176 insertions(+), 40 deletions(-) create mode 100644 tests/test_launcher_appworld.py rename tutorial/{ => example_appworld}/appworld.md (88%) rename tutorial/{ => example_appworld}/appworld.py (100%) rename launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml => tutorial/example_appworld/appworld.yaml (91%) rename tutorial/{ => example_math_agent}/math_agent.md (96%) rename tutorial/{ => example_math_agent}/math_agent.py (100%) rename launcher/math_agent/git-math-agentscope.yaml => tutorial/example_math_agent/math_agent.yaml (91%) rename tutorial/{werewolves => example_werewolves}/game.py (100%) rename tutorial/{werewolves => example_werewolves}/prompt.py (100%) rename tutorial/{werewolves => example_werewolves}/start.py (100%) rename tutorial/{werewolves => example_werewolves}/structured_model.py (100%) rename tutorial/{werewolves => example_werewolves}/utils.py (100%) rename tutorial/{werewolves => example_werewolves}/werewolves.md (87%) rename tutorial/{werewolves => example_werewolves}/werewolves.yaml (86%) diff --git a/README.md b/README.md index 4e9b18d9..12afca50 100644 --- a/README.md +++ b/README.md @@ -56,11 +56,11 @@ Let see: ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ - python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='debug' --with-logview + python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview # (训练appworld demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ - python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --backbone='debug' --with-logview + python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` 备注:当`--backbone=debug`时,程序**不再使用ray**,这意味着您可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置见本文档最后。 @@ -69,9 +69,9 @@ Let see: ```bash # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ - python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --with-ray --backbone='trinity' + python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='trinity' - clear && python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --with-ray --backbone='trinity' + clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' ``` 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension)。此外,也可以使用BeyondAgent后端训练(--backbone='verl'),但目前verl训练后端正在维护中。 @@ -124,9 +124,9 @@ Let see: FlashInfer? -clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --with-ray --backbone='verl' +clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' -clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --with-ray --backbone='verl' +clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' - `launche.json` for vscode debugging diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 7c001cc5..3909ae6a 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -37,7 +37,7 @@ astune: rollout: use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol agentscope_disable_toolcalls: False max_env_worker: 128 use_step_reward_from_env: False diff --git a/launcher.py b/launcher.py index fefbb79d..35218f67 100644 --- a/launcher.py +++ b/launcher.py @@ -70,6 +70,12 @@ def parse_args(): default=False, help="Launch Crafters Env Simulation", ) + parser.add_argument( + "--dry-run", + action="store_true", + default=False, + help="Skip launching services and training (test/smoke mode)", + ) parser.add_argument("--reboot", action="store_true", default=False, help="reboot flag") parser.add_argument( "--kill", @@ -158,18 +164,20 @@ def prepare_experiment_config(yaml_path, args): logger.info(f"Experiment Backup Dir: {backup_dir}") logger.info(f"Experiment Yaml Dir: {yaml_backup_dst}") logger.info("----------------------------------------") - time.sleep(2) + if not os.environ.get("ASTUNE_TEST_MODE"): + time.sleep(2) ## 1. check exp_base/backup exist if not os.path.exists(backup_dir): os.makedirs(backup_dir) else: - total_seconds = 5 - for i in range(total_seconds): - logger.warning( - f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." - ) - time.sleep(1) + if not os.environ.get("ASTUNE_TEST_MODE"): + total_seconds = 5 + for i in range(total_seconds): + logger.warning( + f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." + ) + time.sleep(1) ## 2. copy files to backup BACK_TARGETS = os.environ.get("BACK_TARGETS", "").split(",") @@ -508,16 +516,91 @@ def main(): launch_logview(exp_name) if args.conf and main_yaml_fp and exe_exp_base and exe_yaml_path: - execute_training_process( - args, - backbone_target, - main_yaml_fp, - exe_exp_base, - exe_yaml_path, - env, - exp_config, + if args.dry_run: + logger.info("Dry-run enabled: skipping training process launch.") + return { + "yaml": main_yaml_fp, + "exp_base": exe_exp_base, + "exp_yaml_name": os.path.basename(exe_yaml_path), + "exp_name": exp_config.get("astune", {}).get("experiment_name"), + } + else: + execute_training_process( + args, + backbone_target, + main_yaml_fp, + exe_exp_base, + exe_yaml_path, + env, + exp_config, + ) + + +def run_for_test( + conf: str, backbone: str = "verl", with_appworld: bool = False, dry_run: bool = True +): + """Helper for tests to exercise launcher logic without heavy side-effects. + + Returns a dict with important derived paths and names. + """ + os.environ["ASTUNE_TEST_MODE"] = "1" + # Build a lightweight args namespace similar to parse_args output + args = argparse.Namespace( + backbone=backbone, + conf=conf, + db="", + with_exp_maker=False, + with_ray=False, + with_appworld=with_appworld, + with_webshop=False, + with_bfcl=False, + with_logview=False, + with_crafters=False, + reboot=False, + kill="", + dry_run=dry_run, + ) + + # mimic part of main() logic + if args.backbone == "verl": + backbone_target = "astune.main_verl" + elif args.backbone == "debug": + backbone_target = "astune.main_vllm" + else: + backbone_target = "astune.main_trinity" + + exp_config = None + if args.conf: + main_yaml_fp, exe_exp_base, exe_yaml_path, exp_name, exp_config = prepare_experiment_config( + args.conf, args ) + if args.dry_run: + logger.info("run_for_test: dry-run active, not spawning services or training.") + return { + "yaml": main_yaml_fp, + "exp_base": exe_exp_base, + "exp_yaml_name": os.path.basename(exe_yaml_path), + "exp_name": exp_config.get("astune", {}).get("experiment_name"), + } + + # If not dry run, invoke full training process (avoid in most tests) + execute_training_process( + args, + backbone_target, + main_yaml_fp, + exe_exp_base, + exe_yaml_path, + os.environ.copy(), + exp_config, + ) + return { + "yaml": main_yaml_fp, + "exp_base": exe_exp_base, + "exp_yaml_name": os.path.basename(exe_yaml_path), + "exp_name": exp_config.get("astune", {}).get("experiment_name"), + } + if __name__ == "__main__": check_debugpy_version() diff --git a/tests/test_launcher_appworld.py b/tests/test_launcher_appworld.py new file mode 100644 index 00000000..cc9c4f7b --- /dev/null +++ b/tests/test_launcher_appworld.py @@ -0,0 +1,52 @@ +import os +from pathlib import Path + +from astune import launcher + + +def test_launcher_dry_run_appworld_linear_verl(tmp_path): + # Use the provided config path + conf_path = "tutorial/example_appworld/appworld.yaml" + assert Path(conf_path).exists(), "Configuration file should exist for the test" + + # Run in dry-run mode to avoid heavy training + result = launcher.run_for_test( + conf=conf_path, backbone="verl", with_appworld=False, dry_run=True + ) + + # Validate returned structure + assert "yaml" in result and result["yaml"], "Expect backup yaml path in result" + assert Path(result["yaml"]).exists(), "Backup YAML file should exist after preparation" + assert ( + result.get("exp_base") and Path(result["exp_base"]).exists() + ), "Experiment base folder should exist" + + # Ensure launcher_record structure was created + exp_name = result.get("exp_name") + assert exp_name, "Experiment name should be derived" + record_dir = Path("launcher_record") / exp_name + assert record_dir.exists(), "launcher_record directory for experiment should exist" + + # Backup YAML should have backbone set to verl + import yaml + + with open(result["yaml"], "r") as f: + data = yaml.safe_load(f) + assert data.get("astune", {}).get("backbone") == "verl", "Backbone should be set in backup yaml" + + # Dry run should NOT have produced training artifacts (e.g., checkpoints) + ckpt_dir = Path("checkpoints") + # We only assert that no new subdir for exp_name appears (optional) + if ckpt_dir.exists(): + assert not any( + p.name.startswith(exp_name) for p in ckpt_dir.iterdir() + ), "Dry run should not create checkpoints" + + +def test_launcher_multiple_runs_idempotent(tmp_path): + conf_path = "tutorial/example_appworld/appworld.yaml" + result1 = launcher.run_for_test(conf=conf_path, backbone="verl", dry_run=True) + result2 = launcher.run_for_test(conf=conf_path, backbone="verl", dry_run=True) + # Should reuse same experiment name and keep yaml present + assert result1["exp_name"] == result2["exp_name"] + assert Path(result2["yaml"]).exists() diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index fab2aab2..d94c5798 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -42,7 +42,7 @@ def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: # @pytest.fixture # def config(tmp_path: Path) -> dict: # from astune.utils.config_utils import read_astune_config -# return read_astune_config('launcher/math_agent/git-math-agentscope.yaml') # type: ignore +# return read_astune_config('tutorial/example_math_agent/math_agent.yaml') # type: ignore # def test_get_training_tasks_new_file(config: dict): diff --git a/tutorial/appworld.md b/tutorial/example_appworld/appworld.md similarity index 88% rename from tutorial/appworld.md rename to tutorial/example_appworld/appworld.md index 8e805b68..4db6276a 100644 --- a/tutorial/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -50,12 +50,12 @@ Judge的返回值: raw_reward, is_success ### 4. 测试 -4.1 复制并修改 [launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml](../launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 +4.1 复制并修改 [tutorial/example_appworld/appworld.yaml](../tutorial/example_appworld/appworld.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 astune.task_reader) 2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/appworld.py` 的`ExampleAgentScopeLearnProtocol` 类 - - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.appworld->ExampleAgentScopeLearnProtocol` + - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol` 3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) - 填写 astune.task_judge.judge_protocol=`astune.task_judge.env_service_as_judge->EnvServiceJudge` 4. 指定模型(对应配置字段 astune.model.path ) @@ -73,7 +73,7 @@ astune: rollout: # ✨✨✨✨ 编写并选择Agent use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol agentscope_disable_toolcalls: True debug: debug_max_parallel: 1 @@ -84,7 +84,7 @@ astune: 4.2 全链路调试(脱离ray快速调试:--backbone='debug') ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) -clear && python launcher.py --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --backbone='debug' --with-logview +clear && python launcher.py --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: @@ -115,7 +115,7 @@ clear && python launcher.py --conf launcher/appworld_linear_base/git-appworld-qw 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' +python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ``` diff --git a/tutorial/appworld.py b/tutorial/example_appworld/appworld.py similarity index 100% rename from tutorial/appworld.py rename to tutorial/example_appworld/appworld.py diff --git a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml b/tutorial/example_appworld/appworld.yaml similarity index 91% rename from launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml rename to tutorial/example_appworld/appworld.yaml index 1d0a7083..de94458f 100644 --- a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -11,7 +11,7 @@ astune: rollout: # ✨✨✨✨ 编写并选择Agent use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol agentscope_disable_toolcalls: True debug: debug_max_parallel: 1 diff --git a/tutorial/math_agent.md b/tutorial/example_math_agent/math_agent.md similarity index 96% rename from tutorial/math_agent.md rename to tutorial/example_math_agent/math_agent.md index bb83f3ea..5099e748 100644 --- a/tutorial/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -80,7 +80,7 @@ Judge的返回值: raw_reward, is_success ### 4. 测试 -4.1 复制并修改 [launcher/math_agent/git-math-agentscope.yaml](../launcher/math_agent/git-math-agentscope.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 +4.1 复制并修改 [tutorial/example_math_agent/math_agent.yaml](../tutorial/example_math_agent/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 astune.task_reader) 2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) @@ -111,7 +111,7 @@ astune: ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) clear && \ -python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='debug' --with-logview +python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: ```json @@ -140,7 +140,7 @@ python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbon 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' --with-ray +python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` diff --git a/tutorial/math_agent.py b/tutorial/example_math_agent/math_agent.py similarity index 100% rename from tutorial/math_agent.py rename to tutorial/example_math_agent/math_agent.py diff --git a/launcher/math_agent/git-math-agentscope.yaml b/tutorial/example_math_agent/math_agent.yaml similarity index 91% rename from launcher/math_agent/git-math-agentscope.yaml rename to tutorial/example_math_agent/math_agent.yaml index 0a7ab36f..c3e4f853 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -17,7 +17,7 @@ astune: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent + agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent debug: debug_max_parallel: 1 diff --git a/tutorial/werewolves/game.py b/tutorial/example_werewolves/game.py similarity index 100% rename from tutorial/werewolves/game.py rename to tutorial/example_werewolves/game.py diff --git a/tutorial/werewolves/prompt.py b/tutorial/example_werewolves/prompt.py similarity index 100% rename from tutorial/werewolves/prompt.py rename to tutorial/example_werewolves/prompt.py diff --git a/tutorial/werewolves/start.py b/tutorial/example_werewolves/start.py similarity index 100% rename from tutorial/werewolves/start.py rename to tutorial/example_werewolves/start.py diff --git a/tutorial/werewolves/structured_model.py b/tutorial/example_werewolves/structured_model.py similarity index 100% rename from tutorial/werewolves/structured_model.py rename to tutorial/example_werewolves/structured_model.py diff --git a/tutorial/werewolves/utils.py b/tutorial/example_werewolves/utils.py similarity index 100% rename from tutorial/werewolves/utils.py rename to tutorial/example_werewolves/utils.py diff --git a/tutorial/werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md similarity index 87% rename from tutorial/werewolves/werewolves.md rename to tutorial/example_werewolves/werewolves.md index f5c1ad40..a3c1f83e 100644 --- a/tutorial/werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -35,7 +35,7 @@ ### 2. 测试 -- 复制并修改 [launcher/werewolves_agent/git-rpg-agentscope.yaml](../launcher/werewolves_agent/git-rpg-agentscope.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 +- 复制并修改 [tutorial/example_werewolves/werewolves.yaml](../tutorial/example_werewolves/werewolves.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 ```yaml astune: task_reader: @@ -47,14 +47,14 @@ # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolvesLearn # ✨✨✨✨ 编写并选择Agent + agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent ``` - 全链路调试(脱离ray快速调试:--backbone='debug') ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) - python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf launcher/werewolves_agent/git-rpg-agentscope.yaml --backbone='debug' --with-logview + python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: @@ -71,7 +71,7 @@ "console": "integratedTerminal", "args": [ "--backbone", "debug", - "--conf", "launcher/werewolves_agent/git-rpg-agentscope.yaml" + "--conf", "tutorial/example_werewolves/werewolves.yaml" ], "env": { } @@ -85,7 +85,7 @@ ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ - python launcher.py --conf launcher/werewolves_agent/git-rpg-agentscope.yaml --backbone='trinity' --with-ray + python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray ``` diff --git a/tutorial/werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml similarity index 86% rename from tutorial/werewolves/werewolves.yaml rename to tutorial/example_werewolves/werewolves.yaml index 5787a9f3..dd00daab 100644 --- a/tutorial/werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -12,8 +12,9 @@ astune: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent + agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent num_repeat: 6 + agent_madness_reward: 0.0 debug: debug_max_parallel: 1 @@ -28,7 +29,7 @@ trinity: algorithm: repeat_times: 6 buffer: - train_batch_size: 42 + train_batch_size: 84 # ------------------ 不需要修改 ------------------ hydra: From a776791e428b0f879644b272e4b720e42a2a8420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 18:36:35 +0800 Subject: [PATCH 084/462] import patch --- astune/task_runner/__init__.py | 1 + astune/tuner.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/astune/task_runner/__init__.py b/astune/task_runner/__init__.py index 236990bc..d3e261eb 100644 --- a/astune/task_runner/__init__.py +++ b/astune/task_runner/__init__.py @@ -1,6 +1,7 @@ from astune.context_tracker.basic_tracker import BasicContextTracker from typing import Any, Dict, Tuple, Union, Callable from astune.task_judge.judge_base import JudgeBase +from astune.utils.dynamic_import import dynamic_import class BaseGymEnv(object): diff --git a/astune/tuner.py b/astune/tuner.py index 6066a394..b65a1a02 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -1,7 +1,6 @@ from loguru import logger from typing import Literal, Any, TYPE_CHECKING, Type from pydantic import BaseModel, Field -from astune.utils.dynamic_import import dynamic_import from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, From dc5fb5389e1ad8cab2f46283780f55c38e0db452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 20 Nov 2025 18:55:43 +0800 Subject: [PATCH 085/462] patch eval function --- astune/task_runner/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/astune/task_runner/__init__.py b/astune/task_runner/__init__.py index d3e261eb..ed302733 100644 --- a/astune/task_runner/__init__.py +++ b/astune/task_runner/__init__.py @@ -2,11 +2,14 @@ from typing import Any, Dict, Tuple, Union, Callable from astune.task_judge.judge_base import JudgeBase from astune.utils.dynamic_import import dynamic_import +from astune.utils.env_service_client.env_client_ng import ( + EnvClient as EnvClientNg, +) class BaseGymEnv(object): def __init__( - self, env_client: Any, task_env_uuid: str, task_thread_index: int, obs_window: Dict + self, env_client: EnvClientNg, task_env_uuid: str, task_thread_index: int, obs_window: Dict ): self.env_client = env_client self.task_thread_index = task_thread_index @@ -35,6 +38,9 @@ def step(self, action: dict) -> Tuple[str, float, bool, dict]: def reset(self) -> str: raise RuntimeError("Reset is not supported") + def evaluate(self, task_env_uuid, params): + return self.env_client.evaluate(task_env_uuid, params) + class BaseAgentRunner(object): From 94fff5416c0733b4d2253076ffc9d28c17616358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Fri, 21 Nov 2025 06:52:07 +0800 Subject: [PATCH 086/462] refactor: clean up imports and enhance configuration handling in launcher and related modules --- .pre-commit-config.yaml | 12 +- astune/task_rollout/resource_keeper.py | 143 +++++++++++- astune/task_rollout/single_worker.py | 15 +- astune/task_runner/__init__.py | 46 +--- astune/task_runner/agentscope_runner.py | 5 +- astune/utils/cleaner.py | 2 +- astune/utils/config_utils.py | 140 ++++++++++++ astune/utils/pty.py | 25 ++- launcher.py | 285 +++++------------------- tests/test_launcher_appworld.py | 52 ----- 10 files changed, 365 insertions(+), 360 deletions(-) delete mode 100644 tests/test_launcher_appworld.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 777e91b4..a27a39cf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,9 +5,9 @@ repos: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml -- repo: https://github.com/psf/black-pre-commit-mirror - rev: 24.1.1 - hooks: - - id: black - language_version: python3.10 - args: ["--line-length=100"] +# - repo: https://github.com/psf/black-pre-commit-mirror +# rev: 24.1.1 +# hooks: +# - id: black +# language_version: python3.10 +# args: ["--line-length=100"] diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py index 3acc707c..a75250ac 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astune/task_rollout/resource_keeper.py @@ -2,15 +2,13 @@ from typing import List, Union from omegaconf import DictConfig from recipe.sppo import config -from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner -from astune.task_runner.agentscope_runner import AgentScopeRunner -from astune.context_tracker.basic_tracker import BasicContextTracker -from astune.utils.env_service_client.env_client_ng import ( - EnvClient as EnvClientNg, -) - +from typing import Any, Dict, Tuple, Union, Callable +from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg class ResourceKeeper(object): + """ + TODO: integrate with A.S. Runtime + """ def __init__(self, workflow_task, config: DictConfig): self.workflow_task = workflow_task @@ -42,3 +40,134 @@ def __exit__(self, exc_type, exc_value, traceback): f"encounter exception in env_worker.release_instance~ error={e.args}" ) raise e + + + def prepare(self): + """ + Prepare the environment and initial messages for the workflow task. + + Returns: + WorkflowTask: The updated workflow task with initialized environment and messages. + """ + init_messages = self._initialize_environment_and_messages() + self.workflow_task.init_messages = init_messages + self.workflow_task.gym_env = self.generate_gym_env( + self.env, + self.workflow_task.task_env_uuid, + self.workflow_task.task_thread_index, + self.workflow_task.obs_window + ) + + return self.workflow_task + + + def _initialize_environment_and_messages(self) -> List[dict]: + """ + Initialize environment instance and setup initial messages. + + Returns: + List[dict]: Initial messages for the agent flow + + Raises: + Exception: If environment creation fails or required task data is missing + """ + if self.config.astune.task_reader.type == 'env_service': + if self.env is None: + raise ValueError("Environment client is None but env_service type is specified") + try: + init_response = self.env.create_instance( + env_type=self.env_type, + task_id=self.task_id, + instance_id=self.workflow_task.task_env_uuid, + params=self.env_params + ) + state_message: dict = init_response["state"] + _, init_messages = self._get_init_messages(state_message) + except Exception as e: + logger.bind(exception=True).exception(f"encounter exception in env_worker.create_instance~ error={e.args}") + if self.env is not None: + self.env.release_instance(self.workflow_task.task_env_uuid) + raise e + else: + task = self.workflow_task.task + if task.init_messages: + init_messages = task.init_messages + else: + assert task.main_query, "You must provide init_messages or main_query in task." + init_messages = [{"role": "user", "content": task.main_query}] + + return init_messages + + + def _get_init_messages(self, state_message) -> tuple: + """ + Process state_message to extract query and init_messages. + + Args: + state_message (Union[dict, list]): The state message to process + + Returns: + tuple: (query, init_messages) where query is a string and init_messages is a list + + Raises: + ValueError: If state_message is neither dict nor list + """ + if isinstance(state_message, dict): + query = state_message["content"] + init_messages = [state_message] + elif isinstance(state_message, list): + assert isinstance(state_message[0], dict) + query = state_message[-1]["content"] + init_messages = state_message + else: + raise ValueError(f"state_message should be dict or list, but got {type(state_message)}") + + return query, init_messages + + + def generate_gym_env( + self, env_client: Any, task_env_uuid: str, task_thread_index: int, obs_window: Dict + ) -> "BaseGymEnv": + return BaseGymEnv(env_client, task_env_uuid, task_thread_index, obs_window) + + + + +class BaseGymEnv(object): + """ + TODO: integrate with A.S. Runtime + """ + + + def __init__( + self, env_client: EnvClientNg, task_env_uuid: str, task_thread_index: int, obs_window: Dict + ): + self.env_client = env_client + self.task_thread_index = task_thread_index + self.obs_window = obs_window + self.task_env_uuid = task_env_uuid + + def step(self, action: dict) -> Tuple[str, float, bool, dict]: + self.obs_window["step"][self.task_thread_index] += 1 + env_output = self.env_client.step( + instance_id=self.task_env_uuid, + action=action, + ) + obs = "" + assert isinstance(env_output, dict) + if ("content" not in env_output["state"]) and ("error" in env_output["state"]): + obs = f"[Error from environment: {env_output['error']}]" + elif env_output["state"]["content"] == "": + obs = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." + else: + obs = env_output["state"]["content"] + reward = 0 + info = {} + terminate = env_output["is_terminated"] + return obs, reward, terminate, info + + def reset(self) -> str: + raise RuntimeError("Reset is not supported") + + def evaluate(self, task_env_uuid, params): + return self.env_client.evaluate(task_env_uuid, params) diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index 82a7ea66..61c27c7d 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -115,19 +115,12 @@ def rollout_env_worker( with ResourceKeeper(workflow_task, config=self.config) as resource_keeper: try: - Runner = ( - AgentScopeRunner - if self.config.astune.rollout.use_agentscope_protocol - else AgentRunner - ) - agent_runner: BaseAgentRunner = Runner( - llm_chat_fn=llm_chat_fn, - tokenizer=self.tokenizer, - config=self.config, - ) + workflow_task = resource_keeper.prepare() + Runner = AgentScopeRunner if self.config.astune.rollout.use_agentscope_protocol else AgentRunner + agent_runner: AgentScopeRunner = Runner(llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, config=self.config) # type:ignore cmt = agent_runner.execute( - env=resource_keeper.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] workflow_task=workflow_task, + env=resource_keeper.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] ) except Exception as e: logger.bind(exception=True).exception( diff --git a/astune/task_runner/__init__.py b/astune/task_runner/__init__.py index ed302733..e152111b 100644 --- a/astune/task_runner/__init__.py +++ b/astune/task_runner/__init__.py @@ -2,44 +2,7 @@ from typing import Any, Dict, Tuple, Union, Callable from astune.task_judge.judge_base import JudgeBase from astune.utils.dynamic_import import dynamic_import -from astune.utils.env_service_client.env_client_ng import ( - EnvClient as EnvClientNg, -) - - -class BaseGymEnv(object): - def __init__( - self, env_client: EnvClientNg, task_env_uuid: str, task_thread_index: int, obs_window: Dict - ): - self.env_client = env_client - self.task_thread_index = task_thread_index - self.obs_window = obs_window - self.task_env_uuid = task_env_uuid - - def step(self, action: dict) -> Tuple[str, float, bool, dict]: - self.obs_window["step"][self.task_thread_index] += 1 - env_output = self.env_client.step( - instance_id=self.task_env_uuid, - action=action, - ) - obs = "" - assert isinstance(env_output, dict) - if ("content" not in env_output["state"]) and ("error" in env_output["state"]): - obs = f"[Error from environment: {env_output['error']}]" - elif env_output["state"]["content"] == "": - obs = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." - else: - obs = env_output["state"]["content"] - reward = 0 - info = {} - terminate = env_output["is_terminated"] - return obs, reward, terminate, info - - def reset(self) -> str: - raise RuntimeError("Reset is not supported") - - def evaluate(self, task_env_uuid, params): - return self.env_client.evaluate(task_env_uuid, params) +from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg class BaseAgentRunner(object): @@ -56,12 +19,7 @@ def __init__(self, llm_chat_fn: Callable, tokenizer: Any, config, **kwargs): self.max_model_len: int = self.config.astune.rollout.max_model_len self.max_env_len: int = self.config.astune.rollout.max_env_len - def generate_gym_env( - self, env_client: Any, task_env_uuid: str, task_thread_index: int, obs_window: Dict - ) -> BaseGymEnv: - return BaseGymEnv(env_client, task_env_uuid, task_thread_index, obs_window) - - def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task, env): + def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task): def should_interrupt_fn() -> bool: if (obs_window["stop"] is not None) and obs_window["stop"][ diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index d28b0e9a..fb3bf5cb 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -24,7 +24,7 @@ class AgentScopeRunner(BaseAgentRunner): - def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTracker: + def execute(self, workflow_task: WorkflowTask) -> BasicContextTracker: obs_window = workflow_task.obs_window task_thread_index = workflow_task.task_thread_index task_batch_index = workflow_task.task_batch_index @@ -57,9 +57,6 @@ def execute(self, env: EnvClient, workflow_task: WorkflowTask) -> BasicContextTr agentscope_workflow=agentscope_workflow, config=self.config, ) - workflow_task.gym_env = self.generate_gym_env( - env, workflow_task.task_env_uuid, task_thread_index, obs_window - ) workflow_output: WorkflowOutput = asyncio.run( agentscope_workflow.agentscope_execute(workflow_task, m_tuner) diff --git a/astune/utils/cleaner.py b/astune/utils/cleaner.py index a257551f..4c1ae7cf 100644 --- a/astune/utils/cleaner.py +++ b/astune/utils/cleaner.py @@ -7,7 +7,7 @@ import shlex -def _fast_kill_by_keyword_bash( +def fast_kill_by_keyword_bash( keyword: str, exclude_substrings=["vscode"], grace_seconds: float = 1.0 ): """Use bash pipelines to kill processes matching keyword quickly. diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index f774bdd8..d5ea5994 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -1,9 +1,13 @@ import os +import time +import yaml +from loguru import logger from hydra import initialize, compose from omegaconf import DictConfig def read_astune_config(yaml_fp): + """Load a Hydra configuration relative to this module.""" yaml_fp = os.path.relpath( yaml_fp, os.path.dirname(__file__) ) # do not try to understand this line, hydra is too weird @@ -18,9 +22,145 @@ def load_hydra_config(config_path: str, config_name: str) -> DictConfig: return load_hydra_config(config_path=dir_path, config_name=file_name) + def dump_yaml_config(cfg: DictConfig, yaml_fp: str): + """Persist the provided OmegaConf config to ``yaml_fp``.""" from omegaconf import OmegaConf with open(yaml_fp, "w") as f: OmegaConf.save(cfg, f) return yaml_fp + + + + +def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone): + """Align configuration values based on a conversion map. + + Parameters + ---------- + from_config_fp : str + Source YAML path to read values from. + to_config_fp : str + Destination YAML path that is updated in place. + convertion_json_fg : str + JSON path mapping dotted keys between configs. + backbone : str + Backbone identifier used for framework-specific alignment. + """ + # read yaml files + with open(from_config_fp, "r") as file: + from_config = yaml.safe_load(file) + with open(to_config_fp, "r") as file: + to_config = yaml.safe_load(file) + + # read convertion json + import json + + with open(convertion_json_fg, "r") as file: + convertion_json = json.load(file) + + logger.success("----------------------------------------------------") + + for from_key, to_keys in convertion_json.items(): + # get value from from_config + keys = from_key.split(".") + value = from_config + for key in keys: + value = value.get(key, None) + if value is None: + break + if value is None: + logger.warning( + f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_keys}" + ) + continue + + to_keys = to_keys if isinstance(to_keys, list) else [to_keys] + for to_key in to_keys: + keys = to_key.split(".") + sub_config = to_config + for key in keys[:-1]: + if key not in sub_config: + sub_config[key] = {} + sub_config = sub_config[key] + sub_config[keys[-1]] = value + logger.success( + f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]" + ) + + logger.success("----------------------------------------------------") + time.sleep(1) + + if ("trinity" in from_config) and backbone == "trinity": + trinity_config = from_config["trinity"] + + def recursive_copy(src_dict, dst_dict, parent_key=""): + for key, value in src_dict.items(): + full_key = f"{parent_key}.{key}" if parent_key else key + if isinstance(value, dict): + if key not in dst_dict: + dst_dict[key] = {} + recursive_copy(value, dst_dict[key], full_key) + else: + dst_dict[key] = value + logger.info( + f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]" + ) + + recursive_copy(trinity_config, to_config) + logger.success("----------------------------------------------------") + time.sleep(1) + + # save to_config_fp + with open(to_config_fp, "w") as file: + yaml.dump(to_config, file) + logger.success(f"Saved aligned configuration to {to_config_fp}") + + +def read_astune_hierarchical_config(yaml_fp, exp_name, backbone, write_to=None): + with open(yaml_fp, "r") as file: + config = yaml.safe_load(file) + config["astune"]["experiment_name"] = exp_name + config["astune"]["backbone"] = backbone + # remove extra config of verl for trinity + if backbone == "debug": + config["defaults"].remove("ppo_trainer") + config["defaults"].remove("trinity_default") + config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") + config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") + # remove extra config of verl for trinity + if backbone == "trinity": + config["defaults"].remove("ppo_trainer") + config["defaults"].remove("verl_default") + config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") + config["hydra"]["searchpath"].remove("file://astune/default_config/verl") + # remove extra config of trinity for verl + if backbone == "verl": # or args.backbone == "debug" + config["defaults"].remove("trinity_default") + config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") + if write_to: + with open(write_to, "w") as file: + yaml.dump(config, file) + return config + +def expand_astune_hierarchical_config(config, write_to=None): + # create temp yaml file + import tempfile + with tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".yaml") as temp_yaml: + yaml_path = temp_yaml.name + with open(yaml_path, "w") as file: + yaml.dump(config, file) + full_config = read_astune_config(yaml_path) + yaml_path = dump_yaml_config(full_config, yaml_fp=yaml_path) + # put inherit info back + with open(yaml_path, "r") as file: + config_final = yaml.safe_load(file) + config_final["defaults"] = config["defaults"] + config_final["hydra"] = config["hydra"] + + if write_to: + with open(write_to, "w") as file: + yaml.dump(config_final, file) + + return config_final diff --git a/astune/utils/pty.py b/astune/utils/pty.py index da062f82..e6704b5c 100644 --- a/astune/utils/pty.py +++ b/astune/utils/pty.py @@ -1,5 +1,7 @@ import os import pty +import base64 + def run_command_with_pty(cmd, working_dir, env_dict): @@ -59,9 +61,6 @@ def stdin_read(fd): os.environ.update(original_env) -import base64 - - # Convert string to Base64 def string_to_base64(s): # First, encode the string to bytes @@ -97,6 +96,26 @@ def pty_wrapper_final(human_cmd, dir, env_dict): pty_wrapper(["/bin/bash", "-c", human_cmd], dir, env_dict) +def pty_launch(service_name: str, success_std_string="Starting server on"): + from astune.utils.smart_daemon import LaunchCommandWhenAbsent + service_path = os.environ.get(f"{service_name.upper()}_PATH") + service_script = os.environ.get(f"{service_name.upper()}_SCRIPT") + if service_path is None or service_script is None: + raise ValueError(f"Environment variables for {service_name} not properly set.") + companion = LaunchCommandWhenAbsent( + full_argument_list=[service_script], + dir=service_path, + tag="appworld_env_service", + use_pty=True, + ) + companion.launch( + launch_wait_time=1800, + success_std_string=success_std_string, + ) + + + + if __name__ == "__main__": import argparse import json diff --git a/launcher.py b/launcher.py index 35218f67..19938e0a 100644 --- a/launcher.py +++ b/launcher.py @@ -6,17 +6,16 @@ import sys import os from loguru import logger +from astune.utils.pty import pty_launch +from astune.utils.cleaner import fast_kill_by_keyword_bash +from astune.utils.smart_daemon import LaunchCommandWhenAbsent +from astune.utils.config_utils import expand_astune_hierarchical_config, read_astune_hierarchical_config, align_parameters from dotenv import load_dotenv - load_dotenv() -from astune.utils.cleaner import _fast_kill_by_keyword_bash -from astune.utils.smart_daemon import LaunchCommandWhenAbsent -from astune.utils.config_utils import read_astune_config, dump_yaml_config def parse_args(): parser = argparse.ArgumentParser(description="BA Launcher") - parser.add_argument( "--backbone", type=str, @@ -31,6 +30,13 @@ def parse_args(): required=False, help="Path to configuration file", ) + parser.add_argument( + "--exp-dir", + type=str, + default="launcher_record", + required=False, + help="Path to experiment directory", + ) parser.add_argument( "--db", type=str, @@ -84,10 +90,10 @@ def parse_args(): required=False, help="list of keywords for killing processes", ) - return parser.parse_args() + def check_debugpy_version(): try: import debugpy @@ -99,7 +105,6 @@ def check_debugpy_version(): ) version = getattr(debugpy, "__version__", "0.0.0") from packaging import version as packaging_version - if packaging_version.parse(version) < packaging_version.parse("1.8.0"): raise RuntimeError( f"debugpy version {version} is too old. " @@ -109,34 +114,19 @@ def check_debugpy_version(): logger.info(f"✓ debugpy version {version} meets requirement (>=1.8.0)") -def pty_launch(service_name: str, success_std_string="Starting server on"): - service_path = os.environ.get(f"{service_name.upper()}_PATH") - service_script = os.environ.get(f"{service_name.upper()}_SCRIPT") - if service_path is None or service_script is None: - raise ValueError(f"Environment variables for {service_name} not properly set.") - companion = LaunchCommandWhenAbsent( - full_argument_list=[service_script], - dir=service_path, - tag="appworld_env_service", - use_pty=True, - ) - companion.launch( - launch_wait_time=1800, - success_std_string=success_std_string, - ) - -def prepare_experiment_config(yaml_path, args): +def prepare_experiment_config(yaml_path, exp_dir, backbone): """ Prepare experiment configuration by reading YAML, setting up backup directories, and copying necessary files for the experiment. Args: yaml_path: Path to the YAML configuration file - args: Command line arguments + exp_dir: Directory where experiment artifacts and backups should be stored + backbone: Backbone identifier that controls config munging Returns: - tuple: (yaml_backup_dst, exe_exp_base, exe_yaml_path, exp_name) + tuple: (yaml_backup_dst, exe_exp_base, exp_name, config_final) """ assert yaml_path.endswith(".yaml"), "Configuration file must be a YAML file" exp_base = os.path.dirname(yaml_path) @@ -144,7 +134,7 @@ def prepare_experiment_config(yaml_path, args): if not os.path.exists(exp_base): raise FileNotFoundError(f"Configuration file not found: {exp_base}") - ## 0. read yaml (get astune.experiment_name) + ## 0. read yaml & get experiment_name with open(yaml_path, "r") as file: config = yaml.safe_load(file) exp_name = config.get("astune").get("experiment_name") @@ -155,29 +145,25 @@ def prepare_experiment_config(yaml_path, args): else: exp_name = exp_name.replace("|", "-") - logger.info("----------------------------------------") - backup_dir = os.path.join("launcher_record", exp_name, "backup") - yaml_backup_dst = os.path.join("launcher_record", exp_name, "yaml_backup.yaml") - exe_yaml_path = yaml_backup_dst + backup_dir = os.path.join(exp_dir, exp_name, "backup") + yaml_backup_dst = os.path.join(exp_dir, exp_name, "yaml_backup.yaml") exe_exp_base = os.path.dirname(yaml_backup_dst) + logger.info("----------------------------------------") logger.info(f"Experiment Name: {exp_name}") logger.info(f"Experiment Backup Dir: {backup_dir}") logger.info(f"Experiment Yaml Dir: {yaml_backup_dst}") logger.info("----------------------------------------") - if not os.environ.get("ASTUNE_TEST_MODE"): - time.sleep(2) ## 1. check exp_base/backup exist if not os.path.exists(backup_dir): os.makedirs(backup_dir) else: - if not os.environ.get("ASTUNE_TEST_MODE"): - total_seconds = 5 - for i in range(total_seconds): - logger.warning( - f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." - ) - time.sleep(1) + total_seconds = 5 + for i in range(total_seconds): + logger.warning( + f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." + ) + time.sleep(1) ## 2. copy files to backup BACK_TARGETS = os.environ.get("BACK_TARGETS", "").split(",") @@ -198,47 +184,10 @@ def prepare_experiment_config(yaml_path, args): shutil.copyfile(yaml_backup_src, yaml_backup_dst) ## 4. edit new yaml - yaml_path = yaml_backup_dst - with open(yaml_path, "r") as file: - config = yaml.safe_load(file) - config["astune"]["experiment_name"] = exp_name - config["astune"]["backbone"] = args.backbone + config = read_astune_hierarchical_config(yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst) + config_final = expand_astune_hierarchical_config(config, write_to=yaml_backup_dst) - # remove extra config of verl for trinity - if args.backbone == "debug": - config["defaults"].remove("ppo_trainer") - config["defaults"].remove("trinity_default") - config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") - config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") - # remove extra config of verl for trinity - if args.backbone == "trinity": - config["defaults"].remove("ppo_trainer") - config["defaults"].remove("verl_default") - config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") - config["hydra"]["searchpath"].remove("file://astune/default_config/verl") - # remove extra config of trinity for verl - if args.backbone == "verl": # or args.backbone == "debug" - config["defaults"].remove("trinity_default") - config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") - # yaml dump - with open(yaml_path, "w") as file: - yaml.dump(config, file) - - # read everything - full_config = read_astune_config(yaml_path) - yaml_path = full_config_path = dump_yaml_config(full_config, yaml_fp=yaml_path) - - # put inherit info back - with open(yaml_path, "r") as file: - config_final = yaml.safe_load(file) - config_final["defaults"] = config["defaults"] - config_final["hydra"] = config["hydra"] - - # write inherit info back - with open(yaml_path, "w") as file: - yaml.dump(config_final, file) - - return yaml_path, exe_exp_base, exe_yaml_path, exp_name, config + return yaml_backup_dst, exe_exp_base, exp_name, config_final def launch_logview(exp_name=None): @@ -262,12 +211,9 @@ def launch_logview(exp_name=None): success_std_string="Uvicorn running on", env_dict={}, ) - time.sleep(2.5) try: import webbrowser - from datetime import datetime - - # Use default experiment name if not set + time.sleep(2.5) webbrowser.open("http://127.0.0.1:8181/") except Exception as e: logger.error(f"Error opening web browser: {e}") @@ -294,78 +240,6 @@ def start_ray_service(args, env): ) -import yaml - - -def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone): - # read yaml files - with open(from_config_fp, "r") as file: - from_config = yaml.safe_load(file) - with open(to_config_fp, "r") as file: - to_config = yaml.safe_load(file) - # read convertion json - import json - - with open(convertion_json_fg, "r") as file: - convertion_json = json.load(file) - - logger.success("----------------------------------------------------") - - for from_key, to_keys in convertion_json.items(): - # get value from from_config - keys = from_key.split(".") - value = from_config - for key in keys: - value = value.get(key, None) - if value is None: - break - if value is None: - logger.warning( - f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_keys}" - ) - continue - - to_keys = to_keys if isinstance(to_keys, list) else [to_keys] - for to_key in to_keys: - keys = to_key.split(".") - sub_config = to_config - for key in keys[:-1]: - if key not in sub_config: - sub_config[key] = {} - sub_config = sub_config[key] - sub_config[keys[-1]] = value - logger.success( - f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]" - ) - time.sleep(0.1) - - logger.success("----------------------------------------------------") - - if ("trinity" in from_config) and backbone == "trinity": - trinity_config = from_config["trinity"] - - def recursive_copy(src_dict, dst_dict, parent_key=""): - for key, value in src_dict.items(): - full_key = f"{parent_key}.{key}" if parent_key else key - if isinstance(value, dict): - if key not in dst_dict: - dst_dict[key] = {} - recursive_copy(value, dst_dict[key], full_key) - else: - dst_dict[key] = value - logger.info( - f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]" - ) - - recursive_copy(trinity_config, to_config) - - logger.success("----------------------------------------------------") - - # save to_config_fp - with open(to_config_fp, "w") as file: - yaml.dump(to_config, file) - logger.success(f"Saved aligned configuration to {to_config_fp}") - def execute_training_process( args, @@ -387,16 +261,25 @@ def execute_training_process( exe_yaml_path: Path to the YAML configuration file env: Environment variables dictionary """ + + # Fixed config asset locations + TRINITY_BOOT_YAML = \ + "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED + TRINITY_CONFIG_AUTO_CONVERSION = \ + "astune/default_config/trinity/config_auto_convertion_trinity.json" + VERL_CONFIG_AUTO_CONVERSION = \ + "astune/default_config/verl/config_auto_convertion_verl.json" + + # let's begin the training process if args.backbone == "trinity": # replace boot yaml - TRINITY_BOOT_YAML = "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + "/trinity_launch.yaml" shutil.copyfile(TRINITY_BOOT_YAML, redirect_trinity_boot_yaml) align_parameters( yaml_backup_dst, redirect_trinity_boot_yaml, - "astune/default_config/trinity/config_auto_convertion_trinity.json", + TRINITY_CONFIG_AUTO_CONVERSION, args.backbone, ) cmd = [ @@ -411,7 +294,7 @@ def execute_training_process( align_parameters( yaml_backup_dst, yaml_backup_dst, - "astune/default_config/verl/config_auto_convertion_verl.json", + VERL_CONFIG_AUTO_CONVERSION, args.backbone, ) cmd = [ @@ -452,7 +335,7 @@ def main(): logger.info(f"Killing processes matching keywords: {args.kill}") for keyword in args.kill.split("|"): logger.info(f"Killing processes matching keyword: {keyword}") - killed_pids = _fast_kill_by_keyword_bash(keyword) + killed_pids = fast_kill_by_keyword_bash(keyword) if killed_pids: logger.success(f"Successfully killed processes with PIDs: {killed_pids}") else: @@ -463,7 +346,6 @@ def main(): backbone_target = "astune.main_trinity" # Default to trinity main_yaml_fp = None exe_exp_base = None - exe_yaml_path = None exp_name = None env = os.environ.copy() @@ -475,11 +357,15 @@ def main(): backbone_target = "astune.main_trinity" exp_config = None + exp_dir = args.exp_dir or "launcher_record" if args.conf: yaml_path = args.conf - main_yaml_fp, exe_exp_base, exe_yaml_path, exp_name, exp_config = prepare_experiment_config( - yaml_path, args - ) + ( + main_yaml_fp, + exe_exp_base, + exp_name, + exp_config, + ) = prepare_experiment_config(yaml_path, exp_dir, args.backbone) if args.db: env["RAY_DEBUG_POST_MORTEM"] = "1" @@ -515,13 +401,13 @@ def main(): if args.with_logview: launch_logview(exp_name) - if args.conf and main_yaml_fp and exe_exp_base and exe_yaml_path: + if args.conf and main_yaml_fp and exe_exp_base and exp_config: if args.dry_run: logger.info("Dry-run enabled: skipping training process launch.") return { "yaml": main_yaml_fp, "exp_base": exe_exp_base, - "exp_yaml_name": os.path.basename(exe_yaml_path), + "exp_yaml_name": os.path.basename(main_yaml_fp), "exp_name": exp_config.get("astune", {}).get("experiment_name"), } else: @@ -530,77 +416,12 @@ def main(): backbone_target, main_yaml_fp, exe_exp_base, - exe_yaml_path, + main_yaml_fp, env, exp_config, ) -def run_for_test( - conf: str, backbone: str = "verl", with_appworld: bool = False, dry_run: bool = True -): - """Helper for tests to exercise launcher logic without heavy side-effects. - - Returns a dict with important derived paths and names. - """ - os.environ["ASTUNE_TEST_MODE"] = "1" - # Build a lightweight args namespace similar to parse_args output - args = argparse.Namespace( - backbone=backbone, - conf=conf, - db="", - with_exp_maker=False, - with_ray=False, - with_appworld=with_appworld, - with_webshop=False, - with_bfcl=False, - with_logview=False, - with_crafters=False, - reboot=False, - kill="", - dry_run=dry_run, - ) - - # mimic part of main() logic - if args.backbone == "verl": - backbone_target = "astune.main_verl" - elif args.backbone == "debug": - backbone_target = "astune.main_vllm" - else: - backbone_target = "astune.main_trinity" - - exp_config = None - if args.conf: - main_yaml_fp, exe_exp_base, exe_yaml_path, exp_name, exp_config = prepare_experiment_config( - args.conf, args - ) - - if args.dry_run: - logger.info("run_for_test: dry-run active, not spawning services or training.") - return { - "yaml": main_yaml_fp, - "exp_base": exe_exp_base, - "exp_yaml_name": os.path.basename(exe_yaml_path), - "exp_name": exp_config.get("astune", {}).get("experiment_name"), - } - - # If not dry run, invoke full training process (avoid in most tests) - execute_training_process( - args, - backbone_target, - main_yaml_fp, - exe_exp_base, - exe_yaml_path, - os.environ.copy(), - exp_config, - ) - return { - "yaml": main_yaml_fp, - "exp_base": exe_exp_base, - "exp_yaml_name": os.path.basename(exe_yaml_path), - "exp_name": exp_config.get("astune", {}).get("experiment_name"), - } - if __name__ == "__main__": check_debugpy_version() diff --git a/tests/test_launcher_appworld.py b/tests/test_launcher_appworld.py deleted file mode 100644 index cc9c4f7b..00000000 --- a/tests/test_launcher_appworld.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -from pathlib import Path - -from astune import launcher - - -def test_launcher_dry_run_appworld_linear_verl(tmp_path): - # Use the provided config path - conf_path = "tutorial/example_appworld/appworld.yaml" - assert Path(conf_path).exists(), "Configuration file should exist for the test" - - # Run in dry-run mode to avoid heavy training - result = launcher.run_for_test( - conf=conf_path, backbone="verl", with_appworld=False, dry_run=True - ) - - # Validate returned structure - assert "yaml" in result and result["yaml"], "Expect backup yaml path in result" - assert Path(result["yaml"]).exists(), "Backup YAML file should exist after preparation" - assert ( - result.get("exp_base") and Path(result["exp_base"]).exists() - ), "Experiment base folder should exist" - - # Ensure launcher_record structure was created - exp_name = result.get("exp_name") - assert exp_name, "Experiment name should be derived" - record_dir = Path("launcher_record") / exp_name - assert record_dir.exists(), "launcher_record directory for experiment should exist" - - # Backup YAML should have backbone set to verl - import yaml - - with open(result["yaml"], "r") as f: - data = yaml.safe_load(f) - assert data.get("astune", {}).get("backbone") == "verl", "Backbone should be set in backup yaml" - - # Dry run should NOT have produced training artifacts (e.g., checkpoints) - ckpt_dir = Path("checkpoints") - # We only assert that no new subdir for exp_name appears (optional) - if ckpt_dir.exists(): - assert not any( - p.name.startswith(exp_name) for p in ckpt_dir.iterdir() - ), "Dry run should not create checkpoints" - - -def test_launcher_multiple_runs_idempotent(tmp_path): - conf_path = "tutorial/example_appworld/appworld.yaml" - result1 = launcher.run_for_test(conf=conf_path, backbone="verl", dry_run=True) - result2 = launcher.run_for_test(conf=conf_path, backbone="verl", dry_run=True) - # Should reuse same experiment name and keep yaml present - assert result1["exp_name"] == result2["exp_name"] - assert Path(result2["yaml"]).exists() From 7b27af3f4ece8c2d584c7e215a6b6c3369940206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Fri, 21 Nov 2025 06:54:51 +0800 Subject: [PATCH 087/462] refactor: remove unused environment parameters and clean up method signatures --- astune/task_rollout/single_worker.py | 1 - astune/task_runner/agentscope_runner.py | 1 - astune/task_runner/classic_runner.py | 3 ++- astune/utils/launch_utils.py | 0 4 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 astune/utils/launch_utils.py diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index 61c27c7d..db2c33a1 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -120,7 +120,6 @@ def rollout_env_worker( agent_runner: AgentScopeRunner = Runner(llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, config=self.config) # type:ignore cmt = agent_runner.execute( workflow_task=workflow_task, - env=resource_keeper.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] ) except Exception as e: logger.bind(exception=True).exception( diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index fb3bf5cb..c9b206a0 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -39,7 +39,6 @@ def execute(self, workflow_task: WorkflowTask) -> BasicContextTracker: obs_window=obs_window, task_thread_index=task_thread_index, workflow_task=workflow_task, - env=env, ) context_tracker = MultiAgentContextTracking( llm_chat_fn=self.llm_chat_fn, diff --git a/astune/task_runner/classic_runner.py b/astune/task_runner/classic_runner.py index 01924f75..d8b941ba 100644 --- a/astune/task_runner/classic_runner.py +++ b/astune/task_runner/classic_runner.py @@ -24,10 +24,11 @@ def __init__(self, **kwargs): ) self.step_reward = [] - def execute(self, env: EnvClient, workflow_task) -> BasicContextTracker: + def execute(self, workflow_task) -> BasicContextTracker: obs_window = workflow_task.obs_window task_thread_index = workflow_task.task_thread_index init_messages = workflow_task.init_messages + env = workflow_task.gym_env # 1. 🚀 Initialize messages if self.config.astune.context_tracker.context_tracker_type == "linear": diff --git a/astune/utils/launch_utils.py b/astune/utils/launch_utils.py new file mode 100644 index 00000000..e69de29b From df7ca8a8c29e40a6032ab6954247281c6a03180d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Fri, 21 Nov 2025 07:03:17 +0800 Subject: [PATCH 088/462] refactor: implement experiment configuration preparation and launch utilities --- astune/utils/config_utils.py | 77 +++++++++++++ astune/utils/launch_utils.py | 146 +++++++++++++++++++++++ launcher.py | 216 +---------------------------------- 3 files changed, 225 insertions(+), 214 deletions(-) diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index d5ea5994..cc2b086e 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -1,4 +1,5 @@ import os +import shutil import time import yaml from loguru import logger @@ -164,3 +165,79 @@ def expand_astune_hierarchical_config(config, write_to=None): yaml.dump(config_final, file) return config_final + + + +def prepare_experiment_config(yaml_path, exp_dir, backbone): + """ + Prepare experiment configuration by reading YAML, setting up backup directories, + and copying necessary files for the experiment. + + Args: + yaml_path: Path to the YAML configuration file + exp_dir: Directory where experiment artifacts and backups should be stored + backbone: Backbone identifier that controls config munging + + Returns: + tuple: (yaml_backup_dst, exe_exp_base, exp_name, config_final) + """ + assert yaml_path.endswith(".yaml"), "Configuration file must be a YAML file" + exp_base = os.path.dirname(yaml_path) + + if not os.path.exists(exp_base): + raise FileNotFoundError(f"Configuration file not found: {exp_base}") + + ## 0. read yaml & get experiment_name + with open(yaml_path, "r") as file: + config = yaml.safe_load(file) + exp_name = config.get("astune").get("experiment_name") + if exp_name is None or exp_name == "read_yaml_name": + if exp_name is not None: + exp_name = exp_name.replace("|", "-") + exp_name = os.path.basename(yaml_path).replace(".yaml", "") + else: + exp_name = exp_name.replace("|", "-") + + backup_dir = os.path.join(exp_dir, exp_name, "backup") + yaml_backup_dst = os.path.join(exp_dir, exp_name, "yaml_backup.yaml") + exe_exp_base = os.path.dirname(yaml_backup_dst) + logger.info("----------------------------------------") + logger.info(f"Experiment Name: {exp_name}") + logger.info(f"Experiment Backup Dir: {backup_dir}") + logger.info(f"Experiment Yaml Dir: {yaml_backup_dst}") + logger.info("----------------------------------------") + + ## 1. check exp_base/backup exist + if not os.path.exists(backup_dir): + os.makedirs(backup_dir) + else: + total_seconds = 5 + for i in range(total_seconds): + logger.warning( + f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." + ) + time.sleep(1) + + ## 2. copy files to backup + BACK_TARGETS = os.environ.get("BACK_TARGETS", "").split(",") + BACK_TARGETS = [p for p in BACK_TARGETS if os.path.exists(p)] + + for backup_target in BACK_TARGETS: + logger.info( + f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}" + ) + shutil.copytree( + backup_target, + os.path.join(backup_dir, os.path.basename(backup_target)), + dirs_exist_ok=True, + ) + + ## 3. copy yaml to backup + yaml_backup_src = yaml_path + shutil.copyfile(yaml_backup_src, yaml_backup_dst) + + ## 4. edit new yaml + config = read_astune_hierarchical_config(yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst) + config_final = expand_astune_hierarchical_config(config, write_to=yaml_backup_dst) + + return yaml_backup_dst, exe_exp_base, exp_name, config_final diff --git a/astune/utils/launch_utils.py b/astune/utils/launch_utils.py index e69de29b..476a718f 100644 --- a/astune/utils/launch_utils.py +++ b/astune/utils/launch_utils.py @@ -0,0 +1,146 @@ +import subprocess +import argparse +import shutil +import yaml +import time +import sys +import os +from loguru import logger +from astune.utils.config_utils import align_parameters +from astune.utils.smart_daemon import LaunchCommandWhenAbsent + +def launch_logview(exp_name=None): + """ + Launch the log viewer service and open the web browser to view logs. + + Args: + exp_name: Optional experiment name. If not provided, "default_experiment" is used. + """ + companion = LaunchCommandWhenAbsent( + full_argument_list=[ + sys.executable, + "-m", + "web_display.start_web", + ], + dir="./", + tag="logview", + ) + companion.launch( + launch_wait_time=1800, + success_std_string="Uvicorn running on", + env_dict={}, + ) + try: + import webbrowser + time.sleep(2.5) + webbrowser.open("http://127.0.0.1:8181/") + except Exception as e: + logger.error(f"Error opening web browser: {e}") + pass + + +def start_ray_service(args, env): + """ + Start a Ray service with appropriate configuration. + + Args: + args: Command line arguments containing debug settings + """ + companion = LaunchCommandWhenAbsent( + full_argument_list=[f"source ./.venv/bin/activate && ray start --head --block"], + dir="./", + tag="ray_service", + use_pty=True, + ) + companion.launch( + launch_wait_time=1800, + success_std_string="Ray runtime started", + env_dict=env, + ) + + + +def execute_training_process( + args, + backbone_target, + yaml_backup_dst, + exe_exp_base, + exe_yaml_path, + env, + exp_config, +): + """ + Execute the training process based on the specified backbone and configuration. + + Args: + args: Command line arguments + backbone_target: The Python module to execute + yaml_backup_dst: Path to the YAML configuration backup + exe_exp_base: Base path for experiment execution + exe_yaml_path: Path to the YAML configuration file + env: Environment variables dictionary + """ + + # Fixed config asset locations + TRINITY_BOOT_YAML = \ + "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED + TRINITY_CONFIG_AUTO_CONVERSION = \ + "astune/default_config/trinity/config_auto_convertion_trinity.json" + VERL_CONFIG_AUTO_CONVERSION = \ + "astune/default_config/verl/config_auto_convertion_verl.json" + + + # let's begin the training process + if args.backbone == "trinity": + # replace boot yaml + redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + "/trinity_launch.yaml" + shutil.copyfile(TRINITY_BOOT_YAML, redirect_trinity_boot_yaml) + align_parameters( + yaml_backup_dst, + redirect_trinity_boot_yaml, + TRINITY_CONFIG_AUTO_CONVERSION, + args.backbone, + ) + cmd = [ + sys.executable, + "-m", + backbone_target, + "run", + "--config", + redirect_trinity_boot_yaml, + ] + else: + align_parameters( + yaml_backup_dst, + yaml_backup_dst, + VERL_CONFIG_AUTO_CONVERSION, + args.backbone, + ) + cmd = [ + sys.executable, + "-m", + backbone_target, + "--config-path", + os.path.abspath(exe_exp_base), + "--config-name", + os.path.basename(exe_yaml_path), + ] + + if args.with_logview: + env.update( + { + "BEST_LOGGER_WEB_SERVICE_URL": os.environ.get( + "BEST_LOGGER_WEB_SERVICE_URL", "http://127.0.0.1:8181/" + ) + } + ) + + try: + logger.info(f"Running command: {' '.join(cmd)}") + subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) + except subprocess.CalledProcessError as e: + logger.error(f"Error running subprocess: {e}") + sys.exit(1) + except Exception as e: + logger.error(f"Unexpected error: {e}") + sys.exit(1) diff --git a/launcher.py b/launcher.py index 19938e0a..b5e685dc 100644 --- a/launcher.py +++ b/launcher.py @@ -9,7 +9,8 @@ from astune.utils.pty import pty_launch from astune.utils.cleaner import fast_kill_by_keyword_bash from astune.utils.smart_daemon import LaunchCommandWhenAbsent -from astune.utils.config_utils import expand_astune_hierarchical_config, read_astune_hierarchical_config, align_parameters +from astune.utils.config_utils import prepare_experiment_config +from astune.utils.launch_utils import start_ray_service, launch_logview, execute_training_process from dotenv import load_dotenv load_dotenv() @@ -114,219 +115,6 @@ def check_debugpy_version(): logger.info(f"✓ debugpy version {version} meets requirement (>=1.8.0)") - -def prepare_experiment_config(yaml_path, exp_dir, backbone): - """ - Prepare experiment configuration by reading YAML, setting up backup directories, - and copying necessary files for the experiment. - - Args: - yaml_path: Path to the YAML configuration file - exp_dir: Directory where experiment artifacts and backups should be stored - backbone: Backbone identifier that controls config munging - - Returns: - tuple: (yaml_backup_dst, exe_exp_base, exp_name, config_final) - """ - assert yaml_path.endswith(".yaml"), "Configuration file must be a YAML file" - exp_base = os.path.dirname(yaml_path) - - if not os.path.exists(exp_base): - raise FileNotFoundError(f"Configuration file not found: {exp_base}") - - ## 0. read yaml & get experiment_name - with open(yaml_path, "r") as file: - config = yaml.safe_load(file) - exp_name = config.get("astune").get("experiment_name") - if exp_name is None or exp_name == "read_yaml_name": - if exp_name is not None: - exp_name = exp_name.replace("|", "-") - exp_name = os.path.basename(yaml_path).replace(".yaml", "") - else: - exp_name = exp_name.replace("|", "-") - - backup_dir = os.path.join(exp_dir, exp_name, "backup") - yaml_backup_dst = os.path.join(exp_dir, exp_name, "yaml_backup.yaml") - exe_exp_base = os.path.dirname(yaml_backup_dst) - logger.info("----------------------------------------") - logger.info(f"Experiment Name: {exp_name}") - logger.info(f"Experiment Backup Dir: {backup_dir}") - logger.info(f"Experiment Yaml Dir: {yaml_backup_dst}") - logger.info("----------------------------------------") - - ## 1. check exp_base/backup exist - if not os.path.exists(backup_dir): - os.makedirs(backup_dir) - else: - total_seconds = 5 - for i in range(total_seconds): - logger.warning( - f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." - ) - time.sleep(1) - - ## 2. copy files to backup - BACK_TARGETS = os.environ.get("BACK_TARGETS", "").split(",") - BACK_TARGETS = [p for p in BACK_TARGETS if os.path.exists(p)] - - for backup_target in BACK_TARGETS: - logger.info( - f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}" - ) - shutil.copytree( - backup_target, - os.path.join(backup_dir, os.path.basename(backup_target)), - dirs_exist_ok=True, - ) - - ## 3. copy yaml to backup - yaml_backup_src = yaml_path - shutil.copyfile(yaml_backup_src, yaml_backup_dst) - - ## 4. edit new yaml - config = read_astune_hierarchical_config(yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst) - config_final = expand_astune_hierarchical_config(config, write_to=yaml_backup_dst) - - return yaml_backup_dst, exe_exp_base, exp_name, config_final - - -def launch_logview(exp_name=None): - """ - Launch the log viewer service and open the web browser to view logs. - - Args: - exp_name: Optional experiment name. If not provided, "default_experiment" is used. - """ - companion = LaunchCommandWhenAbsent( - full_argument_list=[ - sys.executable, - "-m", - "web_display.start_web", - ], - dir="./", - tag="logview", - ) - companion.launch( - launch_wait_time=1800, - success_std_string="Uvicorn running on", - env_dict={}, - ) - try: - import webbrowser - time.sleep(2.5) - webbrowser.open("http://127.0.0.1:8181/") - except Exception as e: - logger.error(f"Error opening web browser: {e}") - pass - - -def start_ray_service(args, env): - """ - Start a Ray service with appropriate configuration. - - Args: - args: Command line arguments containing debug settings - """ - companion = LaunchCommandWhenAbsent( - full_argument_list=[f"source ./.venv/bin/activate && ray start --head --block"], - dir="./", - tag="ray_service", - use_pty=True, - ) - companion.launch( - launch_wait_time=1800, - success_std_string="Ray runtime started", - env_dict=env, - ) - - - -def execute_training_process( - args, - backbone_target, - yaml_backup_dst, - exe_exp_base, - exe_yaml_path, - env, - exp_config, -): - """ - Execute the training process based on the specified backbone and configuration. - - Args: - args: Command line arguments - backbone_target: The Python module to execute - yaml_backup_dst: Path to the YAML configuration backup - exe_exp_base: Base path for experiment execution - exe_yaml_path: Path to the YAML configuration file - env: Environment variables dictionary - """ - - # Fixed config asset locations - TRINITY_BOOT_YAML = \ - "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED - TRINITY_CONFIG_AUTO_CONVERSION = \ - "astune/default_config/trinity/config_auto_convertion_trinity.json" - VERL_CONFIG_AUTO_CONVERSION = \ - "astune/default_config/verl/config_auto_convertion_verl.json" - - - # let's begin the training process - if args.backbone == "trinity": - # replace boot yaml - redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + "/trinity_launch.yaml" - shutil.copyfile(TRINITY_BOOT_YAML, redirect_trinity_boot_yaml) - align_parameters( - yaml_backup_dst, - redirect_trinity_boot_yaml, - TRINITY_CONFIG_AUTO_CONVERSION, - args.backbone, - ) - cmd = [ - sys.executable, - "-m", - backbone_target, - "run", - "--config", - redirect_trinity_boot_yaml, - ] - else: - align_parameters( - yaml_backup_dst, - yaml_backup_dst, - VERL_CONFIG_AUTO_CONVERSION, - args.backbone, - ) - cmd = [ - sys.executable, - "-m", - backbone_target, - "--config-path", - os.path.abspath(exe_exp_base), - "--config-name", - os.path.basename(exe_yaml_path), - ] - - if args.with_logview: - env.update( - { - "BEST_LOGGER_WEB_SERVICE_URL": os.environ.get( - "BEST_LOGGER_WEB_SERVICE_URL", "http://127.0.0.1:8181/" - ) - } - ) - - try: - logger.info(f"Running command: {' '.join(cmd)}") - subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) - except subprocess.CalledProcessError as e: - logger.error(f"Error running subprocess: {e}") - sys.exit(1) - except Exception as e: - logger.error(f"Unexpected error: {e}") - sys.exit(1) - - def main(): args = parse_args() From 34be98297b146e883be27ad02a5bb8d8c40b578e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Fri, 21 Nov 2025 07:32:25 +0800 Subject: [PATCH 089/462] refactor: specify type for workflow_task in ResourceKeeper and fix init_messages assignment --- astune/task_rollout/resource_keeper.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py index a75250ac..3ea70b95 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astune/task_rollout/resource_keeper.py @@ -4,13 +4,14 @@ from recipe.sppo import config from typing import Any, Dict, Tuple, Union, Callable from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astune.schema.task import Task, WorkflowTask class ResourceKeeper(object): """ TODO: integrate with A.S. Runtime """ - def __init__(self, workflow_task, config: DictConfig): + def __init__(self, workflow_task: WorkflowTask, config: DictConfig): self.workflow_task = workflow_task self.config = config @@ -50,7 +51,7 @@ def prepare(self): WorkflowTask: The updated workflow task with initialized environment and messages. """ init_messages = self._initialize_environment_and_messages() - self.workflow_task.init_messages = init_messages + self.workflow_task.task.init_messages = init_messages self.workflow_task.gym_env = self.generate_gym_env( self.env, self.workflow_task.task_env_uuid, From 342858fc143fc3ff59ca2c9d2c98782bcdfb9056 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 21 Nov 2025 07:49:17 +0800 Subject: [PATCH 090/462] refactor: remove unused import from resource_keeper.py --- astune/task_rollout/resource_keeper.py | 1 - 1 file changed, 1 deletion(-) diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py index 3ea70b95..907c0dd2 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astune/task_rollout/resource_keeper.py @@ -1,7 +1,6 @@ from loguru import logger from typing import List, Union from omegaconf import DictConfig -from recipe.sppo import config from typing import Any, Dict, Tuple, Union, Callable from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg from astune.schema.task import Task, WorkflowTask From 947a76e3161d72669b828904f221b6d19bf8f45a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Fri, 21 Nov 2025 08:13:11 +0800 Subject: [PATCH 091/462] refactor: fix regex pattern formatting and update function signatures in compute_madness --- astune/utils/compute_madness.py | 161 ++++++++++---------------------- 1 file changed, 49 insertions(+), 112 deletions(-) diff --git a/astune/utils/compute_madness.py b/astune/utils/compute_madness.py index 5ac0d5b5..d2843409 100644 --- a/astune/utils/compute_madness.py +++ b/astune/utils/compute_madness.py @@ -44,7 +44,7 @@ def build_pattern(white_list): allowed_parts.append(WHITE_LIST_REGEX_PARTS[name]) # Merge allowed ranges into one character class, then use a negated class to match disallowed characters allowed_class = "".join(allowed_parts) - pattern = f"[^{{allowed_class}}]" # Match disallowed characters + pattern = f'[^{allowed_class}]' # Match disallowed characters return re.compile(pattern) @@ -81,8 +81,7 @@ def compute_string_madness(completion, detail=False, checklist=["nonsense"]) -> return all_reward - -def compute_string_madness_format(completion, format_type) -> float: +def compute_string_madness_format(completion, detail, format_type)->float: if format_type == "type_1": """ @@ -174,11 +173,9 @@ def repetition_penalty_reward_scalar_debug(completion): # print(compute_string_madness("Hello world!")) # 0 # print(compute_string_madness("Hello world! 😄")) # 0 # print(compute_string_madness("Hello world! Hello world!")) # -1.0 - # print(compute_string_madness("Chinese characters here")) # -1.0 + # print(compute_string_madness("你好,世界!")) # -1.0 # print(compute_string_madness("Hello <|im_start|> world!")) # -1.0 - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" playlist_songs` API to get the list of songs in a playlist. Let's first call `show_playlist_songs` to get the list of songs for a playlist and then calculate the total duration. @@ -204,23 +201,14 @@ def get_song_duration(song_id, access_token): ``` Let's execute this code to find the suitable playlist. 🚀🚀 😄😄 - """ - ) - == 0 - ) + """) == 0 - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" Hello <|im_start|> world! - """ - ) - == -1 - ) + """) == -1 - assert ( - compute_string_madness( - """ + + assert compute_string_madness(""" def has_non_ascii(text): non_ascii_but_normal = ['‘', '’', '“', '”', '–', '—', '…', '•', '™', '©', '®', '°', '±', 'µ', '°', '′', '″', '℉', '℃'] for t in non_ascii_but_normal: @@ -235,44 +223,26 @@ def has_non_ascii(text): 3. chinese 4. chinese 标点 5. other normal chars you can think of - """ - ) - == 0 - ) + """) == 0 + - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - """ - ) - == -1 - ) + """) == -1 + - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" fewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwe - """ - ) - == -1 - ) + """) == -1 - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd - """ - ) - == -1 - ) + """) == -1 - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" 1 游戏科学在科隆游戏展上发布新作品《黑神话:钟馗》,视频中有哪些信息值得关注? 世上何尝有鬼?妖魔皆从心生。 台下魑魅台上仙,好煞两副面! 门内一滩子糊涂账,门外哪个喊青天? 日月朝暮空空悬,凭谁掌那生死权。 不顺人情不合道,不争功名不趋炎。 提剑也,提剑也, 要把这清浊辨! 由游戏科学开发的黑神话系列第二部作品《黑神话:钟馗》,今日正式公布首支 CG 先导预告片,并已在 2025 科隆游戏展的展前发布会同步亮相。 本作是以中国民间传说中的著名角色「钟馗」为主要创意来源的单机·动作·角色扮演游戏。因尚处早期开发阶段,暂无实机内容展示。 @@ -295,37 +265,23 @@ def has_non_ascii(text): 新 微软 Win11 最新 KB5063878 更新导致特定情况下 SSD 和 HDD 故障,如何解决? IT 之家 8 月 17 日消息,微软上周发布了一个非常重要的 - """ - ) - == 0 - ) + """) == 0 - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" _the output indicates that the variable\_name\_error\_is\_ spotify\_\_access\_\_token\_\_,is\_not\_\_defined\_,\_but\_accord\_\_to\_\_the\_\_previous\_\_conversation\_\_record\_\_matchCondition\_\_spotify\_\_access\_\_token\_\_has\_\_been\_\_successfully\_\_获得\_\_取得以及\_\_可以\_\_正常使用\_\_matchCondition\_\_,\_所以\_\_问题\_\_应该\_\_出\_\_在\_\_上次\_\_对话\_\_记录\_\_沒有\_\_正确\_\_继承\_\_或\_\_上\_\_次\_\_对话\_\_记录\_\_无法\_\_正确\_\_匹配\_\_本次\_\_对话\_\_继续\_\_matchCondition\_\_,\_因此\_\_需要\_\_重新\_\_获得\_\_ spotify\_\_登录\_\_所需的\_\_电子邮件\_\_和\_\_密码\_\_matchCondition\_\_,\_并\_\_再次\_\_获得\_\_ spotify\_\_访问\_\_令牌\_\_matchCondition\_\_,\_以便\_\_可以\_\_正常使用\_\_ spotify\_\_api\_\_matchCondition\_\_。\_ ```python passwords = apis.supervisor. show\_account\_passwords () print ( passwords ) ```<|im_end|> - """ - ) - == 0 - ) # exclude chinese + """) == 0 # exclude chinese - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" the\_ last\_ try\_ to\_ get\_ the\_ supervisor\_\_ account\_ passwords\_ using\_ the\_ supervisor\_ api\_ failed\_ again\_ for\_ unknown\_ reason\_,\_ but\_ from\_ the\_ previous\_ conversation\_ record\_ we\_ already\_ know\_ the\_ api\_ response\_\__marker\= \[\_ \{\_ "account\_ name\_\_ marker\= \":\_ \"spotify\_\_",\_ "password\_\_ marker\= \":\_ \"dummy\_ spotify\_ pass\"\_\_\_\_ marker\},\_ \{\_ "account\_ name\_\_ marker\= \":\_ \"file\_ system\_\_",\_ "password\_\_ marker\= \":\_ \"dummy\_ fs\_ pass\"\_\_\_\_\_ marker\}\_\_\_\]\_\_ already\_,\_ so\_ we\_ can\_ reuse\_ the\_\_marker\_ known\_ information\_ instead\_ of\_ trying\_ to\_ call\_ the\_ api\_ again\_ which\_ fails\_ for\_ unknown\_ reason\_matchCondition\_,\_next\_ we\_ should\_ use\_ the\_ known\_ spotify\_ password\_ to\_ login\_ to\_ get\_ the\_ spotify\_ access\_ token\_ again\_matchCondition\_。\_\_\`\`\_python\_\_marker\}\_ spotify\_ password\_\_ marker\= "dummy\_ spotify\_ pass"\_\_ login\_ result\_\_ marker\= apis\. spotify\. login\_ marker\(\_ username\_\_ marker\= \'joseharr@gmail\. com\'\_\_,\_ password\_\_ marker\= spotify\_ password\_\_\_\)\_ print\_\_ marker\(\_ login\_ result\_\_\_\)\_\_\`\`\_ bezpo\_ marker\}<|im_start|> <|endoftext|><|im_end|> - """ - ) - == -1 - ) # <|im_start|> in the text + """) == -1 # <|im_start|> in the text + - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" From the API documentation, we can see that the `show_recommendations` API provides personalized song recommendations for the user. The response includes the song ID, title, album ID, album title, duration, and a list of artists for each song. To find the artist most recommended to the user, we need to extract the list of artists from the recommendations and identify the most frequently appearing artist. @@ -355,28 +311,19 @@ def has_non_ascii(text): print(most_recommended_artist) apis.supervisor.complete_task(answer=most_recommended_artist) ```คะแน limburg<|im_end|> - """ - ) - == -1 - ) + """) == -1 - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" Though file_system app has no login api, it may need supervisor app's login, so I will try that. ```python supervisor_password = [account_password["password"] for account_password in passwords if account_password["account_name"] == "supervisor"][0] login_result = apis.supervisor.login(username='jennifer.powell@example.com', password=supervisor_password) print(login_result) ```<|im_end|> - """ - ) - == 0 - ) + """) == 0 + - assert ( - compute_string_madness( - """ + assert compute_string_madness(""" @@ -398,16 +345,11 @@ def has_non_ascii(text): movie_titles.append(line.strip()) print(movie_titles) ```<|im_end|> - """, - detail=True, - ) - == -1 - ) # too many `line.startswith` + """) == -1 # too many `line.startswith` # part 2 - assert ( - compute_string_madness_format( - """ + assert compute_string_madness_format( + """ Though file_system app has no login api, it may need supervisor app's login, so I will try that. ```python supervisor_password = [account_password["password"] for account_password in passwords if account_password["account_name"] == "supervisor"][0] @@ -415,14 +357,12 @@ def has_non_ascii(text): print(login_result) ``` """, - format_type="type_1", - ) - == 0.0 - ) - - assert ( - compute_string_madness_format( - """ + detail=False, + format_type="type_1" + ) == 0.0 + + assert compute_string_madness_format( + """ So,this `422` status code means this directory path `/home/user/photographs/` is not available in supervisor's account,so I must get home directory path of supervisor,namely nicholas weber,first,so I must call.```python profile = apis.supervisor.show_profile() print(profile) @@ -434,14 +374,12 @@ def has_non_ascii(text): print(profile) ``` """, - format_type="type_1", - ) - == -1.0 - ) - - assert ( - compute_string_madness_format( - """ + detail=False, + format_type="type_1" + ) == -1.0 + + assert compute_string_madness_format( + """ From the list of liked songs, we have the artists who have songs liked by the user. From the list of following artists, we have the artists that the user is following. To unfollow artists who have not sung any song that the user has liked, we need to: @@ -470,9 +408,8 @@ def has_non_ascii(text): {12, 14, 8, 36, 23, 25, 28, 33, 2, 9, 11, 18} ``` """, - format_type="type_1", - ) - == -1.0 - ) + detail=False, + format_type="type_1" + ) == -1.0 print("All tests passed!") From 0ec9bcd2d6c8a56dd0557b9401d5afd737237be1 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 21 Nov 2025 08:13:32 +0800 Subject: [PATCH 092/462] stage --- .../werewolves_agent/git-rpg-agentscope.yaml | 48 ------------------- tutorial/example_math_agent/math_agent.py | 1 + 2 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 launcher/werewolves_agent/git-rpg-agentscope.yaml diff --git a/launcher/werewolves_agent/git-rpg-agentscope.yaml b/launcher/werewolves_agent/git-rpg-agentscope.yaml deleted file mode 100644 index f9740b93..00000000 --- a/launcher/werewolves_agent/git-rpg-agentscope.yaml +++ /dev/null @@ -1,48 +0,0 @@ -# ------------------ 主要配置 ------------------ -astune: - task_reader: - type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` - - task_judge: - # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: null - - model: - # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - - rollout: - agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 6 - agent_madness_reward: 0.0 - - debug: - debug_max_parallel: 1 - debug_first_n_tasks: 1 - - data: - max_prompt_length: 15000 - max_response_length: 3000 - train_batch_size: 32 - -trinity: - algorithm: - repeat_times: 6 - buffer: - train_batch_size: 84 - -# ------------------ 不需要修改 ------------------ -hydra: - searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only - - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only - -# ------------------ 不需要修改 ------------------ -defaults: - - ppo_trainer # verl inherit 1/2 - - verl_default # verl inherit 2/2 - - trinity_default # trinity inherit 1/1 - - astune_default - - _self_ diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index 8c4b198d..2a5e497f 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -60,6 +60,7 @@ async def agentscope_execute( toolkit=self.toolkit, memory=InMemoryMemory(), ) + self.agent.set_console_output_enabled(False) msg = Msg("user", query, role="user") result = await self.agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) From 83752052b76572d6eeb75280eb19bb2236b3fd89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Fri, 21 Nov 2025 08:25:28 +0800 Subject: [PATCH 093/462] fix trinity --- astune/backbone/trinity_compat_workflow.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index ad43d13b..ff4b8b78 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -13,7 +13,7 @@ from astune.task_rollout.native_parallel_worker import DynamicRollout from astune.schema.trajectory import Sample from astune.utils.config_utils import read_astune_config -from astune.context_tracker.tracker_base_attr import TrackerAttr +from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking class TrinityCompatWorkflow(DynamicRollout): @@ -74,7 +74,7 @@ def thread_worker(self): obs_window=obs_window, ) - def run_in_new_thread(self) -> TrackerAttr: + def run_in_new_thread(self) -> MultiAgentContextTracking: result_holder = {} exc_holder = {} @@ -130,7 +130,7 @@ async def run_async(self): if yaml_path is None: raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") - cmt = TrinityCompatWorkflow( + tracker = TrinityCompatWorkflow( task=self.task, llm_handle=self.model_client, tokenizer=AutoTokenizer.from_pretrained(self.model_client.model_path), @@ -139,11 +139,11 @@ async def run_async(self): sample_final = [] try: - sample_arr = cmt.group_tokenize() + sample_arr = tracker.group_tokenize() except Exception as e: - cmt.generate_log(global_step=-1) raise e - cmt.generate_log(global_step=-1) + finally: + tracker.generate_log(global_step='NA') sample_final += sample_arr exps = [] @@ -161,19 +161,19 @@ async def run_async(self): position_ids = sample.position_ids prompt_position_ids = sample.prompt_position_ids response_position_ids = sample.response_position_ids - # cmt_tokenized["step_reward"] = self.reward_structure.step_reward[index] + # tracker_tokenized["step_reward"] = self.reward_structure.step_reward[index] logprobs = sample.response_logprobs try: - reward = cmt.reward_structure.step_reward + reward = tracker.reward_structure.step_reward if isinstance(reward, list): reward = reward[0] except Exception as e: - reward = cmt.reward_structure.raw_reward + reward = tracker.reward_structure.raw_reward if not isinstance( reward, (float, int) ): # if reward is still not a float or int, set it to 0.0 - reward = cmt.reward_structure.raw_reward + reward = tracker.reward_structure.raw_reward if ( len(response_ids) + len(prompt_ids) == len(input_ids) From 4c1961009cdb0db853ec55f2b113a4c2b2106eed Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 21 Nov 2025 08:47:05 +0800 Subject: [PATCH 094/462] refactor: change logger from error to warning for max_prompt_length exceedance --- astune/context_tracker/basic_tracker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index 929fe9e2..fdbb9f7d 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -618,7 +618,7 @@ def tokenize_steps( # should we begin split point early? if input_ids_len[-1] > self.config.astune.data.max_prompt_length: message_dict = self.to_role_content(ext_steps) - logger.error( + logger.warning( f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix..." ) logger.bind(exception=True).exception( From beb1e243f6d0ff503f8bc265ccd8c504325b5ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Fri, 21 Nov 2025 08:49:11 +0800 Subject: [PATCH 095/462] refactor: update Ray service launch command to use dynamic Python interpreter path --- astune/utils/launch_utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/astune/utils/launch_utils.py b/astune/utils/launch_utils.py index 476a718f..89013618 100644 --- a/astune/utils/launch_utils.py +++ b/astune/utils/launch_utils.py @@ -46,8 +46,11 @@ def start_ray_service(args, env): Args: args: Command line arguments containing debug settings """ + # 获取当前 Python 解释器目录 + python_dir = os.path.dirname(sys.executable) + ray_path = os.path.join(python_dir, 'ray') companion = LaunchCommandWhenAbsent( - full_argument_list=[f"source ./.venv/bin/activate && ray start --head --block"], + full_argument_list=[f"{ray_path} start --head --block"], dir="./", tag="ray_service", use_pty=True, From f48aaec384b77f34db85832b64629a02d1415eb3 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 21 Nov 2025 09:38:15 +0800 Subject: [PATCH 096/462] patch overflow bug --- astune/task_rollout/async_llm_bridge.py | 4 ++-- astune/tuner.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 42dec22f..b29f6332 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -229,12 +229,12 @@ async def __call__( ) if not context_safe: logger.warning(f"[{info}] detected. Current token count exceeds the limit.") - self.context_overflow = True + self.context_tracker.context_overflow = True return ChatResponse( content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] ) - # run llm inference + # run llm inference ✨ llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) # begin context tracking diff --git a/astune/tuner.py b/astune/tuner.py index b65a1a02..b3922bf6 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -153,7 +153,7 @@ async def __call__( format_tool["function"]["name"], ) - # call llm model + # call llm model ✨ response_gen = await self.llm_proxy( api_key=self.api_key, structured_model=structured_model, From 57f43d6bd538c9e71696ca791f46a18bb57f1884 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 21 Nov 2025 16:21:32 +0800 Subject: [PATCH 097/462] fix bug --- astune/backbone/trinity_compat_workflow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index ff4b8b78..6a8f18a4 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -45,7 +45,7 @@ def __init__( def convert_task(self, task): main_query = task.raw_task.get("main_query", "[not defined]") - task_id = task.raw_task.get("task_selector", str(uuid.uuid4().hex)) + task_id = task.raw_task.get("task_id", str(uuid.uuid4().hex)) env_type = task.raw_task.get("env_type", "[not defined]") metadata = task.raw_task.get("metadata", {}) init_messages = task.raw_task.get("init_messages", []) From 8f907b9b45dd7c207fd91ae1c335983847355cef Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 12:38:48 +0800 Subject: [PATCH 098/462] refactor: update configuration files and improve logging in various modules --- astune/backbone/trinity_compat_workflow.py | 147 ++++++++++++------ astune/default_config/astune_default.yaml | 4 + .../config_auto_convertion_trinity.json | 15 +- .../trinity/trinity_default.yaml | 4 +- .../verl/config_auto_convertion_verl.json | 4 + astune/task_rollout/resource_keeper.py | 15 ++ astune/utils/config_utils.py | 6 +- astune/utils/launch_utils.py | 6 + astune/utils/smart_daemon.py | 6 + 9 files changed, 155 insertions(+), 52 deletions(-) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index 6a8f18a4..ad7bdf90 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -1,25 +1,36 @@ +import asyncio import os import uuid import openai -import threading +import datasets from trinity.common.experience import Experience from trinity.common.models.model import ModelWrapper -from trinity.common.workflows.workflow import WORKFLOWS, Task, Workflow -from typing import List, Literal, Optional +from trinity.common.workflows.workflow import WORKFLOWS, Workflow +from trinity.common.workflows.workflow import Task as TrinityTask +from trinity.buffer.reader import READER +from trinity.buffer.reader.file_reader import FileReader, TaskFileReader, _HFBatchReader +from trinity.buffer.buffer_reader import BufferReader +from trinity.buffer.reader.reader import READER +from trinity.buffer.schema.formatter import FORMATTER +from trinity.common.config import StorageConfig + +from typing import List, Literal, Optional, cast from loguru import logger -from astune.schema.task import Task from transformers import AutoTokenizer from astune.task_rollout.native_parallel_worker import DynamicRollout from astune.schema.trajectory import Sample from astune.utils.config_utils import read_astune_config from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking +from typing import List, Optional, Tuple +from datasets import Dataset, load_dataset class TrinityCompatWorkflow(DynamicRollout): def __init__( self, + is_eval, task, llm_handle, tokenizer, @@ -28,6 +39,7 @@ def __init__( **kwargs, ): + self.is_eval = is_eval self.task = task self.tokenizer = tokenizer self.config = config @@ -43,20 +55,14 @@ def __init__( **kwargs, ) - def convert_task(self, task): - main_query = task.raw_task.get("main_query", "[not defined]") - task_id = task.raw_task.get("task_id", str(uuid.uuid4().hex)) - env_type = task.raw_task.get("env_type", "[not defined]") - metadata = task.raw_task.get("metadata", {}) - init_messages = task.raw_task.get("init_messages", []) - - return Task( - main_query=main_query, - task_id=task_id, - env_type=env_type, - metadata=metadata, - init_messages=init_messages, - ) + def convert_task(self, task: TrinityTask): + from astune.schema.task import Task + d = {} + for vip_key in ["main_query", "task_id", "env_type", "metadata", "init_messages"]: + if vip_key not in task.raw_task: + raise ValueError(f"Key {vip_key} not found in task.raw_task") + d[vip_key] = task.raw_task[vip_key] + return Task(**d) def thread_worker(self): obs_window = { @@ -68,31 +74,17 @@ def thread_worker(self): return self.rollout_env_worker( task=astune_task, task_batch_index=0, - task_tag=f"T{astune_task.task_id}#R?", - mode="sample", + task_tag=f"T{astune_task.task_id}#R", + mode="sample" if not self.is_eval else "validate", task_thread_index=0, obs_window=obs_window, ) - def run_in_new_thread(self) -> MultiAgentContextTracking: - result_holder = {} - exc_holder = {} - - def _target(): - try: - result_holder["result"] = self.thread_worker() - except Exception as e: - exc_holder["exc"] = e - - t = threading.Thread(target=_target, daemon=True) - t.start() - t.join() - - if "exc" in exc_holder: - raise exc_holder["exc"] - - thread_conclusion: TrackerAttr = result_holder.get("result", None) # type: ignore - return thread_conclusion + async def run_in_new_thread(self) -> MultiAgentContextTracking: + return cast( + MultiAgentContextTracking, + await asyncio.to_thread(self.thread_worker), + ) @WORKFLOWS.register_module("astune_workflow") @@ -101,9 +93,8 @@ class ASTunetWorkflowWrap(Workflow): def __init__( self, - config, model: ModelWrapper, - task: Task, + task: TrinityTask, auxiliary_models: Optional[List[openai.OpenAI]] = None, ): super().__init__( @@ -111,18 +102,12 @@ def __init__( model=model, auxiliary_models=auxiliary_models, ) - self.config = config self.task = task - self.model_client = model.get_openai_async_client() + self.is_eval = task.is_eval # extract the query and the answer from the task self.query = task.raw_task.get(task.format_args.prompt_key) # type: ignore [index] self.answer = task.raw_task.get(task.format_args.response_key) # type: ignore [index] - self.task.workflow_args = { - "env_type": "appworld", - "task_id": self.task.task_id, - "instance_id": uuid.uuid4().hex, - } async def run_async(self): @@ -130,7 +115,8 @@ async def run_async(self): if yaml_path is None: raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") - tracker = TrinityCompatWorkflow( + tracker = await TrinityCompatWorkflow( + is_eval=self.is_eval, task=self.task, llm_handle=self.model_client, tokenizer=AutoTokenizer.from_pretrained(self.model_client.model_path), @@ -210,3 +196,66 @@ async def run_async(self): else: logger.exception(f"Data length mismatch when converting sample to experience.") return exps + + +class CustomReader(TaskFileReader): + """A custom reader for testing.""" + + def __init__(self, config): + super().__init__(config) + + + + + +@READER.register_module("astune_workflow") +class AstuneTaskReader(TaskFileReader): + def __init__(self, config): + self.config = config + self.read_batch_size = config.batch_size + self.split = config.split + + yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) + if yaml_path is None: + raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") + astune_config = read_astune_config(yaml_path) + + from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + task_reader = TaskReaderRouter(astune_config) + + dataset_segments = [] + if 'train' in self.split: + dataset_segments.append(task_to_standard_dataset(task_reader.get_training_tasks())) + if 'val' in self.split: + dataset_segments.append(task_to_standard_dataset(task_reader.get_validation_tasks())) + if not dataset_segments: + raise ValueError(f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'.") + + concatenated_dataset = ( + dataset_segments[0] + if len(dataset_segments) == 1 + else datasets.concatenate_datasets(dataset_segments) + ) + + # from vsdb import bp; bp("XXX") + self.dataset = _HFBatchReader( + concatenated_dataset, + name=self.config.name, + default_batch_size=self.read_batch_size, + total_epochs=self.config.total_epochs if not self.config.is_eval else 1, + offset=self.config.index, + drop_last=not self.config.is_eval, + total_steps=self.config.total_steps, + enable_progress_bar=self.config.enable_progress_bar, + ) + self.formatter = FORMATTER.get("task")(self.config) + + def read(self, batch_size: Optional[int] = None) -> List: + # from vsdb import bp; bp("CCC") + batch_size = batch_size or self.read_batch_size + tasks = [] + samples, indices = self.dataset.read_batch(batch_size) + for sample in samples: + task = self.formatter.format(sample) + tasks.append(task) + return tasks diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 3909ae6a..ceabb5b5 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -96,6 +96,9 @@ astune: trainer_common: val_before_train: True val_pass_n: 4 + save_freq: 20 + test_freq: 20 + total_epochs: 50 nnodes: 1 n_gpus_per_node: 8 logger: @@ -114,6 +117,7 @@ astune: use_kl_loss: True kl_loss_coef: 0.002 kl_loss_type: low_var_kl + trinity_only__n_gpu_for_infer: 2 # the tracing config tracing: diff --git a/astune/default_config/trinity/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json index 28789ed5..a758e28f 100644 --- a/astune/default_config/trinity/config_auto_convertion_trinity.json +++ b/astune/default_config/trinity/config_auto_convertion_trinity.json @@ -1,6 +1,19 @@ { + "astune.trainer_common.nnodes": "cluster.node_num", + "astune.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", + "astune.trainer_common.total_epochs": "buffer.total_epochs", + "astune.trainer_common.trinity_only__n_gpu_for_infer": "explorer.rollout_model.engine_num", "astune.model.path": "model.model_path", "astune.project_name": "project", "astune.experiment_name": "name", - "astune.rollout.num_repeat": "algorithm.repeat_times" + "astune.rollout.num_repeat": "algorithm.repeat_times", + "astune.trainer_common.save_freq": "trainer.save_interval", + "astune.trainer_common.test_freq": "explorer.eval_interval", + "astune.data.train_batch_size": "buffer.train_batch_size", + "astune.data.max_response_length": "model.max_response_tokens", + "astune.rollout.max_model_len": [ + "model.max_model_len", + "trainer.max_token_len_per_gpu" + ] + } diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index 67af1ecf..76c5b545 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -18,7 +18,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 rollout_args: temperature: 1.0 split: train - storage_type: astune + storage_type: astune_workflow subset_name: appworld total_epochs: 1000 train_batch_size: 36 @@ -48,11 +48,13 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 tensor_parallel_size: 1 tool_call_parser: hermes runner_per_model: 12 + runner_state_report_interval: 30 model: max_model_len: 21000 max_response_tokens: 16000 monitor: monitor_type: swanlab + # monitor_type: tensorboard synchronizer: sync_interval: 2 sync_method: nccl diff --git a/astune/default_config/verl/config_auto_convertion_verl.json b/astune/default_config/verl/config_auto_convertion_verl.json index 28ef4a2c..97cad2ab 100644 --- a/astune/default_config/verl/config_auto_convertion_verl.json +++ b/astune/default_config/verl/config_auto_convertion_verl.json @@ -1,4 +1,6 @@ { + "astune.trainer_common.total_epochs": "trainer.total_epochs", + "astune.trainer_common.val_before_train": "trainer.val_before_train", "astune.trainer_common.n_gpus_per_node": "trainer.n_gpus_per_node", "astune.trainer_common.nnodes": "trainer.nnodes", @@ -12,6 +14,8 @@ "astune.trainer_common.use_kl_loss": "actor_rollout_ref.actor.use_kl_loss", "astune.trainer_common.kl_loss_coef": "actor_rollout_ref.actor.kl_loss_coef", "astune.trainer_common.kl_loss_type": "actor_rollout_ref.actor.kl_loss_type", + "astune.trainer_common.save_freq": "trainer.save_freq", + "astune.trainer_common.test_freq": "trainer.test_freq", "astune.data.max_prompt_length": "data.max_prompt_length", "astune.data.max_response_length": "data.max_response_length", diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py index 907c0dd2..d27f239a 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astune/task_rollout/resource_keeper.py @@ -4,6 +4,7 @@ from typing import Any, Dict, Tuple, Union, Callable from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg from astune.schema.task import Task, WorkflowTask +from beast_logger import print_dict class ResourceKeeper(object): """ @@ -71,6 +72,7 @@ def _initialize_environment_and_messages(self) -> List[dict]: Raises: Exception: If environment creation fails or required task data is missing """ + if self.config.astune.task_reader.type == 'env_service': if self.env is None: raise ValueError("Environment client is None but env_service type is specified") @@ -148,6 +150,19 @@ def __init__( self.task_env_uuid = task_env_uuid def step(self, action: dict) -> Tuple[str, float, bool, dict]: + # fix agentscope output + if not isinstance(action['content'], str): + # assert isinstance(action['content'], list) + # assert len(action['content']) == 1 + # assert isinstance(action['content'][0], dict) + # assert 'type' in action['content'][0] + # assert 'text' in action['content'][0] + try: + action['content'] = action['content'][0]['text'] + except: + logger.exception(f"Failed to parse action content from agentscope output. {action['content']}") + action['content'] = str(action['content']) + self.obs_window["step"][self.task_thread_index] += 1 env_output = self.env_client.step( instance_id=self.task_env_uuid, diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index cc2b086e..982ce4fc 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -5,6 +5,7 @@ from loguru import logger from hydra import initialize, compose from omegaconf import DictConfig +from best_logger import print_dict def read_astune_config(yaml_fp): @@ -116,7 +117,10 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): # save to_config_fp with open(to_config_fp, "w") as file: yaml.dump(to_config, file) - logger.success(f"Saved aligned configuration to {to_config_fp}") + # logger.success(f"Saved aligned configuration to {to_config_fp}") + print_dict({ + "Note": f"Saved aligned configuration to {to_config_fp}" + }) def read_astune_hierarchical_config(yaml_fp, exp_name, backbone, write_to=None): diff --git a/astune/utils/launch_utils.py b/astune/utils/launch_utils.py index 89013618..efbf6209 100644 --- a/astune/utils/launch_utils.py +++ b/astune/utils/launch_utils.py @@ -6,6 +6,7 @@ import sys import os from loguru import logger +from beast_logger import print_dict from astune.utils.config_utils import align_parameters from astune.utils.smart_daemon import LaunchCommandWhenAbsent @@ -140,6 +141,11 @@ def execute_training_process( try: logger.info(f"Running command: {' '.join(cmd)}") + print_dict({ + "Running Command": ' '.join(cmd), + "Experiment Base": exe_exp_base, + "YAML Config": exe_yaml_path, + }) subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) except subprocess.CalledProcessError as e: logger.error(f"Error running subprocess: {e}") diff --git a/astune/utils/smart_daemon.py b/astune/utils/smart_daemon.py index 38b246c5..5757a84f 100644 --- a/astune/utils/smart_daemon.py +++ b/astune/utils/smart_daemon.py @@ -9,6 +9,7 @@ from loguru import logger from pathlib import Path from typing import Optional, Tuple, List +from beast_logger import print_dict class LaunchWhenAbsent: @@ -292,6 +293,11 @@ def string_to_base64(s): ) logger.success(f"Successfully launched {self.cmd} with PID {proc.pid}") + print_dict({ + "Result": "Successfully launched", + "Command": " ".join(self.cmd), + "PID": proc.pid, + }) except Exception as e: logging.error(f"Error launching script: {e}") From 5fb1bf208514b4a3ea0cc8a8cd9c17ec92c3799b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 15:11:44 +0800 Subject: [PATCH 099/462] refactor: update project names in configuration files for consistency --- tutorial/example_appworld/appworld.yaml | 2 +- tutorial/example_math_agent/math_agent.yaml | 2 ++ tutorial/example_werewolves/werewolves.yaml | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index de94458f..f67496cf 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -1,6 +1,6 @@ # ------------------ 主要配置 ------------------ astune: - project_name: appworld_astune + project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index c3e4f853..70056faa 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -1,5 +1,6 @@ # ------------------ 主要配置 ------------------ astune: + project_name: example_math_agent task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` # 如果选择 `huggingface_dat_repo` 以下配置生效 @@ -18,6 +19,7 @@ astune: rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 1.0 debug: debug_max_parallel: 1 diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index dd00daab..c9448b77 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -1,5 +1,6 @@ # ------------------ 主要配置 ------------------ astune: + project_name: example_werewolves task_reader: type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` From 7ba35c75fd80549f90bb98fc47e82dadcb4910ea Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Sun, 23 Nov 2025 17:37:13 +0800 Subject: [PATCH 100/462] Add some Query examples From a7176801fd585cd6ecccb637b6c2761ddf680cef Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Sun, 23 Nov 2025 17:40:42 +0800 Subject: [PATCH 101/462] Add document reader --- astune/document_reader/doc_reader.py | 51 +++++++++++++++++++ .../document_reader/document_reader_base.py | 13 +++++ 2 files changed, 64 insertions(+) create mode 100644 astune/document_reader/doc_reader.py create mode 100644 astune/document_reader/document_reader_base.py diff --git a/astune/document_reader/doc_reader.py b/astune/document_reader/doc_reader.py new file mode 100644 index 00000000..9ce4cb43 --- /dev/null +++ b/astune/document_reader/doc_reader.py @@ -0,0 +1,51 @@ +import uuid +from typing import Dict, List +from astune.schema.document import Document +from astune.document_reader.document_reader_base import DocReaderBase +from unstructured.partition.auto import partition + +class DocReader(DocReaderBase): + """ + Document reader parses them into Document objects, and optionally returns raw text content. + """ + def __init__(self, config): + super().__init__(config) + + + def load_document(self, source: str, languages=['eng']) -> str: + """ + Load text from a file. + + Args: + source (str): Path to the file. + + Returns: + str: Merged text from all pages. + """ + text_pages = [] + try: + text_pages = partition(source, languages=languages) + except Exception as e: + raise RuntimeError(f"Failed to partition file: {e}") + + if not text_pages: + raise ValueError(f"No extractable text found in file: {source}") + + text = "\n\n".join([str(sub) for sub in text_pages]) + return text + + + def _parser_document(self, raw_document: str) -> Document: + + return Document( + doc_id=str(uuid.uuid4()), + content=raw_document, + metadata={} + ) + + + def get_document(self) -> Document: + file_path = self.config.astune.document_reader.document_path + raw_doc = self.load_document(file_path, languages=self.config.astune.document_reader.languages) + return self._parser_document(raw_doc) + diff --git a/astune/document_reader/document_reader_base.py b/astune/document_reader/document_reader_base.py new file mode 100644 index 00000000..26ac69a8 --- /dev/null +++ b/astune/document_reader/document_reader_base.py @@ -0,0 +1,13 @@ +import json +import uuid +import datasets +from typing import List, Dict, Optional +from astune.schema.document import Document + + +class DocReaderBase: + def __init__(self, config): + self.config = config + + def get_document(self, file_path: str) -> Document: + raise NotImplementedError From 720778e5e2daf32536a49722cf3fe537672666ac Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Sun, 23 Nov 2025 17:41:52 +0800 Subject: [PATCH 102/462] Add Document Schema --- astune/schema/document.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 astune/schema/document.py diff --git a/astune/schema/document.py b/astune/schema/document.py new file mode 100644 index 00000000..2be38214 --- /dev/null +++ b/astune/schema/document.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel, Field +from typing import List, Dict, Any + + +class Document(BaseModel): + doc_id: str = Field(default="") + content: str = Field(default="") + metadata: dict = Field(default_factory=dict) \ No newline at end of file From 6ffa5c0af0f42155b6e9080ca21549d73b9ab7ca Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Sun, 23 Nov 2025 18:03:41 +0800 Subject: [PATCH 103/462] Add Knowledge Augmentor --- .../data_generator/knowledge_augmentation.py | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 astune/data_generator/knowledge_augmentation.py diff --git a/astune/data_generator/knowledge_augmentation.py b/astune/data_generator/knowledge_augmentation.py new file mode 100644 index 00000000..6500a3d3 --- /dev/null +++ b/astune/data_generator/knowledge_augmentation.py @@ -0,0 +1,121 @@ +import json, re +from typing import Optional, Dict, Any, List +from astune.schema.task import Task +from astune.schema.document import Document +from astune.data_generator.data_generator_base import DataGeneratorBase + +class KnowledgeAugmentor(DataGeneratorBase): + """ + Knowledge Augmentation: + - Generate new tasks from Document + """ + def _build_system_prompt( + self, + source_task: Optional[Task] = None, + document: Optional[Document] = None, + ) -> str: + # 可从 self.config 中读取模板,这里先写死一个示例 + return ( + "You are an Expert Question Generation Assistant.\n" + "Your task is to read long, complex documents and generate a large set of high-quality, non-repetitive questions that thoroughly cover all aspects of the provided content.\n" + "**Global Rules:**\n" + "1. Coverage: Cover all sections, topics, major themes, nuanced details, facts, arguments, examples.\n" + "2. Diversity: Include factual, conceptual, comparative, analytical, application, and critical thinking questions. Avoid overly trivial or repetitive questions.\n" + "3. Quality: Questions must be clear, specific, unique, and relevant to the document. Avoid vague or generic questions.\n" + "4. Depth: Include multi-step reasoning, chronological, cause-effect, data-driven, and abstract-contextual questions.\n" + "5. Formatting: Output must be in a JSON list of dictionaries, each dictionary containing `query` and `related_doc` keys.\n" + " - `query` = the generated question (one sentence, ending with a question mark)\n" + " - `related_doc` = the exact excerpt or closely matching text from the document that related_docs or relates to the question\n" + "6. Boundaries: The `related_doc` field must be taken directly from the provided document; do not fabricate or introduce information from outside sources.\n" + "7. Few-shot: If given sample questions, match style and complexity but ensure diversity.\n" + "8. Non-repetition: Ensure no two questions are duplicates or paraphrases of the same idea. If content overlaps, merge rather than replicate.\n" + "Always strictly follow these rules in every output." + ) + + def _build_user_prompt( + self, + source_task: Optional[Task] = None, + document: Optional[Document] = None, + ) -> str: + + if document is None or not document.content: + raise ValueError("KnowledgeAugmentor requires a document for reference.") + + ref_doc = document.content + + user_part = [] + N = self.config.astune.data_generator.knowledge_augmentor.n + user_part.append(f"Generate exactly {N} unique, high-quality questions from the following document according to the rules in the system prompt above.") + user_part.append(f"For each question, provide the corresponding reference excerpt from the document in the `related_doc` field.") + user_part.append(f"[DOCUMENT START]") + user_part.append(ref_doc) + user_part.append(f"[DOCUMENT END]") + user_part.append(f"Now generate queries that is suitable for the JSON format.") + user_part.append(f"Return your output strictly in JSON format as follows:") + user_part.append(f"[") + user_part.append(" {\"query\": \"Question text here?\", \"related_doc\": \"Direct excerpt from the document here.\"},") + user_part.append(" {\"query\": \"Question text here?\", \"related_doc\": \"Direct excerpt from the document here.\"},") + user_part.append(f"]") + return "\n".join(user_part) + + def _parse_llm_output_to_task( + self, + raw_response: Any, + source_task: Optional[Task] = None, + document: Optional[Document] = None, + extra_metadata: Optional[Dict[str, Any]] = None, + ) -> List[Task]: + """ + Parse LLM output and convert it to a Task object. + """ + # Handle different response formats from various LLM clients + if isinstance(raw_response, dict) and "content" in raw_response: + # Compatible with certain client return structures + response = raw_response["content"] + else: + response = str(raw_response) + + # Parse JSON from LLM response + try: + data = self._parse_json_response(response) + except Exception as e: + raise ValueError(f"Failed to parse LLM JSON output: {e}. Raw response: {response}") + + # data: List[Dict[str, str]] + all_generated_tasks = [] + for task in data: + + # Extract the generated query from parsed JSON + new_query = task.get("query", "").strip() + if not new_query: + continue + related_doc = task.get("related_doc", "").strip() + # Construct metadata for the new task + new_metadata = {} + if extra_metadata: + new_metadata.update(extra_metadata) + # Store provenance information for traceability + if related_doc: + new_metadata["related_doc"] = related_doc + new_metadata["related_doc_source"] = document.doc_id + new_task = Task( + main_query=new_query, + init_messages=[], + task_id="", # Will be assigned by the system later + env_type=source_task.env_type if source_task else "no_env", + metadata=new_metadata, + ) + all_generated_tasks.append(new_task) + return all_generated_tasks + + def _parse_json_response(self, response: str) -> Optional[Dict[str, Any]]: + """ + Parse LLM response string into JSON. + """ + # Remove Markdown code block markers (```json and ```) if present + response = re.sub(r'^```json|```$', '', response, flags=re.MULTILINE).strip() + return json.loads(response) + + + + \ No newline at end of file From c382cebb5d42791cbbde82a5e219fde7e24ba040 Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Sun, 23 Nov 2025 18:32:04 +0800 Subject: [PATCH 104/462] Data generator config to test --- test_data_generator.yaml | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 test_data_generator.yaml diff --git a/test_data_generator.yaml b/test_data_generator.yaml new file mode 100644 index 00000000..38cca677 --- /dev/null +++ b/test_data_generator.yaml @@ -0,0 +1,58 @@ +# ------------------ 主要配置 ------------------ +astune: + task_reader: + type: dataset_file + dataset_file: + training: + file_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/jsonl/finQA.jsonl' + + document_reader: + document_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/document/Anti-Money Laundering and Counter-Terrorist Financing Ordinance.pdf' + languages: + - eng + + data_generator: + llm_model: gpt-4o-2024-11-20 + llm_response_length: 8192 + task_augment: + + knowledge_augment: + n: 10 # 文档生成query 的数量 + + +# task_judge: +# # ✨✨✨✨ 编写并选择评价函数 +# judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + +# model: +# # ✨✨✨✨ 设置待训练的模型 +# path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + +# rollout: +# agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent + +# debug: +# debug_max_parallel: 1 +# debug_first_n_tasks: 1 + +# trinity: +# algorithm: +# repeat_times: 6 +# buffer: +# train_batch_size: 180 + +# # ------------------ 不需要修改 ------------------ +# hydra: +# searchpath: +# - file://astune/default_config +# - file://astune/default_config/verl # verl only +# - file://external/verl/verl/trainer/config # verl only +# - file://astune/default_config/trinity # trinity only + +# # ------------------ 不需要修改 ------------------ +# defaults: +# - ppo_trainer # verl inherit 1/2 +# - verl_default # verl inherit 2/2 +# - trinity_default # trinity inherit 1/1 +# - astune_default +# - _self_ From d21466c2b77bc0c48c55737e072bad4279d7d8a7 Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Sun, 23 Nov 2025 18:33:17 +0800 Subject: [PATCH 105/462] Test data generator From 0cd381149d37ff7d636292cfc0b2ebc2e9105acc Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Sun, 23 Nov 2025 18:42:56 +0800 Subject: [PATCH 106/462] Add jsonl, HF Task reader From 54d9c558c5192ebcacf6576d45b66d2c20394395 Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Sun, 23 Nov 2025 18:43:41 +0800 Subject: [PATCH 107/462] update yaml --- test_data_generator.yaml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/test_data_generator.yaml b/test_data_generator.yaml index 38cca677..5a6a71ec 100644 --- a/test_data_generator.yaml +++ b/test_data_generator.yaml @@ -1,10 +1,18 @@ # ------------------ 主要配置 ------------------ astune: + # task_reader: + # type: dataset_file + # dataset_file: + # training: + # file_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/jsonl/finQA.jsonl' + task_reader: - type: dataset_file - dataset_file: - training: - file_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/jsonl/finQA.jsonl' + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + # 如果选择 `huggingface_dat_repo` 以下配置生效 + huggingface_dat_repo: + dataset_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/huggingface/financial-qa-10K' + training_split: "train" + validation_split: "test" document_reader: document_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/document/Anti-Money Laundering and Counter-Terrorist Financing Ordinance.pdf' From 71fe20556803bc96dc0218e9d304037ab28ef088 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 18:52:32 +0800 Subject: [PATCH 108/462] add testing --- README.md | 21 +++- astune/backbone/native_compat_trainer.py | 18 +--- .../agentscope_tracker/multiagent_tracking.py | 14 +-- astune/default_config/astune_default.yaml | 5 +- astune/task_rollout/async_llm_bridge.py | 36 +++++-- astune/utils/message.py | 33 ++++--- astune/utils/retry.py | 5 + astune/utils/smart_daemon.py | 2 +- astune/utils/sms_agent.py | 50 +++++----- astune/utils/testing_utils.py | 24 +++++ astune_tests/__init__.py | 0 astune_tests/test_apply_chat_template.py | 0 .../test_apply_chat_template/__init__.py | 0 .../agentscope_for_test.py | 97 +++++++++++++++++++ .../compare_server.py | 0 .../test_apply_chat_template/test.yaml | 51 ++++++++++ {tests => astune_tests}/test_tracing.py | 0 .../test_tracing_reader.py | 0 .../test_utils/read_config_from_yaml.py | 0 test_launcher.py | 27 ++++++ 20 files changed, 310 insertions(+), 73 deletions(-) create mode 100644 astune/utils/testing_utils.py create mode 100644 astune_tests/__init__.py create mode 100644 astune_tests/test_apply_chat_template.py create mode 100644 astune_tests/test_apply_chat_template/__init__.py create mode 100644 astune_tests/test_apply_chat_template/agentscope_for_test.py create mode 100644 astune_tests/test_apply_chat_template/compare_server.py create mode 100644 astune_tests/test_apply_chat_template/test.yaml rename {tests => astune_tests}/test_tracing.py (100%) rename {tests => astune_tests}/test_tracing_reader.py (100%) rename {tests => astune_tests}/test_utils/read_config_from_yaml.py (100%) create mode 100644 test_launcher.py diff --git a/README.md b/README.md index 12afca50..57ab8819 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,9 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps - uv pip install -e external/agentscope -i https://mirrors.aliyun.com/pypi/simple/ + # uv pip install -e external/agentscope -i https://mirrors.aliyun.com/pypi/simple/ + uv pip install agentscope==1.0.7 -i https://mirrors.aliyun.com/pypi/simple/ + # Install flash attention (must be installed at last) uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation @@ -175,4 +177,19 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi # Future -- [ ] Generative Adversarial Distillation: https://www.alphaxiv.org/abs/2511.10643 +- [ ] test server +- [ ] RUBRICS INT +- [ ] TEST TOKEN REASON +- [x] TRINITY CONF MAP + +``` + python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray +``` + + +``` +source .verlvenv/bin/activate + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ +python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='verl' +``` diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index b8bc2d84..3d7cd287 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -1814,16 +1814,8 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): return cmts, tasks, val_metrics def get_eval_dataset(self): - if self.config.astune.task_reader.type == "env_service": - if self.config.astune.task_reader.env_service.env_type == "appworld": - if hasattr(self, "main_val_dataset"): - return self.main_val_dataset, None, None - else: - from astune.task_reader import TaskReaderRouter - - task_reader = TaskReaderRouter(self.config) - tasks = task_reader.get_validation_tasks() - self.main_val_dataset = tasks - return self.main_val_dataset, None, None - else: - raise NotImplementedError + from astune.task_reader import TaskReaderRouter + task_reader = TaskReaderRouter(self.config) + tasks = task_reader.get_validation_tasks() + self.main_val_dataset = tasks + return self.main_val_dataset, None, None diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 66458640..76e972be 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -160,13 +160,13 @@ def step_track( ) self.grouped_steps += [copy.deepcopy(self.full_context)] - DEBUG = True - if ( - DEBUG - and len(self.grouped_steps) >= 2 - and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])) - ): - print(f"General Warning: merge failure discovered.") + # DEBUG = True # warn when merge fails + # if ( + # DEBUG + # and len(self.grouped_steps) >= 2 + # and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])) + # ): + # print(f"General Warning: merge failure discovered.") return None diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index ceabb5b5..bb2487a0 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -1,4 +1,4 @@ -# ------------------ 主要配置 ------------------ +# ------------------ main configuration ------------------ astune: project_name: appworld_astune experiment_name: "read_yaml_name" @@ -132,3 +132,6 @@ astune: custom_rubrics: If the answer claims that it has written the output to a file, consider it an invalid response. temperature: 0.5 print_reason: false + + execute_test: "" # DO NOT EDIT, FOR TESTING PURPOSE ONLY + execute_testing_lambda: "" diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index b29f6332..8cbd761b 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -7,6 +7,7 @@ from loguru import logger from omegaconf import DictConfig from astune.utils.utils import run_async_coro__no_matter_what, remove_fields +from astune.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode from astune.schema.logprob import TokenAndProb from agentscope.model import ChatResponse from agentscope.message import TextBlock, ToolUseBlock @@ -15,6 +16,7 @@ from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, ) +from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser class AsyncLlmBridge(object): @@ -48,23 +50,24 @@ def llm_chat( if custom_sampling_params: updated_sampling_params.update(custom_sampling_params) - tools = messages[-1].get("tools", None) - for msg in messages: - msg.pop("tools", None) - input_messages = copy.deepcopy(messages) request_id = uuid.uuid4().hex - if tools is not None: - prompt_ids = self.tokenizer.apply_chat_template( + if tools: + prompt_text = self.tokenizer.apply_chat_template( input_messages, add_generation_prompt=True, - tokenize=True, tools=tools, + tokenize=False ) else: - prompt_ids = self.tokenizer.apply_chat_template( - input_messages, add_generation_prompt=True, tokenize=True + prompt_text = self.tokenizer.apply_chat_template( + input_messages, + add_generation_prompt=True, + tokenize=False ) + prompt_ids = self.tokenizer(prompt_text)["input_ids"] + + _test_if_test_mode('prompt_text', prompt_text, self.config) final_res = run_async_coro__no_matter_what( self.async_rollout_manager.generate( @@ -80,14 +83,29 @@ def llm_chat( token_array = final_res decoded_text = self.tokenizer.decode(token_array) # type: ignore + if not self.config.astune.execute_test: + decoded_text = _mock_if_test_mode('mock_decoded_text', decoded_text, self.config) if decoded_text.endswith("<|im_end|>"): decoded_text = decoded_text[: -len("<|im_end|>")] + # if tool call + tool_calls = None + if '' in decoded_text: + tool_parser = Hermes2ProToolParser(self.tokenizer) + parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore + parsed_tool_calls = parsed_tool_calls.model_dump() + _test_if_test_mode('parsed_tool_calls', parsed_tool_calls['tool_calls'], self.config) + model_called = parsed_tool_calls['tools_called'] + if model_called: + tool_calls = parsed_tool_calls['tool_calls'] + decoded_text = parsed_tool_calls['content'] + return { "role": "assistant", "request_id": request_id, "content": decoded_text, + "tool_calls": tool_calls, "tokens": [ TokenAndProb( token_id=token, diff --git a/astune/utils/message.py b/astune/utils/message.py index 99228853..03ed6d2a 100644 --- a/astune/utils/message.py +++ b/astune/utils/message.py @@ -2,19 +2,20 @@ def send_train_message(message: str): - # 发送短信汇报训练进程 - assert len(message) < 64, f"Message too long: {(message)}" - if os.getenv("ALIYUN_SMS_SERVICE"): - try: - requests.post( - json={ - "phone_numbers": "18810508767", - "server_code": "DLC", - "error": message, - "error_level": "无", - }, - url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), - headers={"Content-Type": "application/json"}, - ) - except Exception as e: - print(f"Failed to send sms: {e}") + pass + # # 发送短信汇报训练进程 + # assert len(message) < 64, f"Message too long: {(message)}" + # if os.getenv("ALIYUN_SMS_SERVICE"): + # try: + # requests.post( + # json={ + # "phone_numbers": "18810508767", + # "server_code": "DLC", + # "error": message, + # "error_level": "无", + # }, + # url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), + # headers={"Content-Type": "application/json"}, + # ) + # except Exception as e: + # print(f"Failed to send sms: {e}") diff --git a/astune/utils/retry.py b/astune/utils/retry.py index d7441145..9fe68d58 100644 --- a/astune/utils/retry.py +++ b/astune/utils/retry.py @@ -1,6 +1,7 @@ import time from functools import wraps from typing import Any, Callable, Literal, Optional, TypeVar +from astune.utils.testing_utils import GoodbyeException, TestFailException from loguru import logger T = TypeVar("T") @@ -27,6 +28,10 @@ def wrapper(*args: Any, **kwargs: Any) -> T: for attempt in range(target_max_retry): try: return func(*args, **kwargs) + except GoodbyeException as exc: # noqa: BLE001 + raise exc + except TestFailException as exc: # noqa: BLE001 + raise exc except Exception as exc: # noqa: BLE001 if attempt < target_max_retry - 1: logger.bind(exception=True).exception( diff --git a/astune/utils/smart_daemon.py b/astune/utils/smart_daemon.py index 5757a84f..ef0f813c 100644 --- a/astune/utils/smart_daemon.py +++ b/astune/utils/smart_daemon.py @@ -301,7 +301,7 @@ def string_to_base64(s): except Exception as e: logging.error(f"Error launching script: {e}") - raise + raise e class LaunchCommandWhenAbsent(LaunchWhenAbsent): diff --git a/astune/utils/sms_agent.py b/astune/utils/sms_agent.py index dd8c104e..e402c225 100644 --- a/astune/utils/sms_agent.py +++ b/astune/utils/sms_agent.py @@ -1,26 +1,28 @@ def send_train_message(message: str): - import requests, os, dotenv + pass - dotenv.load_dotenv() - phone_numbers = os.getenv("PHONE_NUMBERS", None) - print("trying to send sms to:", phone_numbers) - if phone_numbers: - try: - assert ( - len(message) < 15 - ), f"message is limit to 15 characters! Current length: {len(message)}." - requests.post( - json={ - "phone_numbers": phone_numbers, - "server_code": "DLC", - "error": message, - "error_level": "wbb1u1g0dte2n", - }, - url=os.getenv( - "ALIYUN_SMS_SERVICE", - "http://cloud-6.agent-matrix.com:12337/send-sms/", - ), - headers={"Content-Type": "application/json"}, - ) - except Exception as e: - print(f"Failed to send sms: {e}") + # import requests, os, dotenv + + # dotenv.load_dotenv() + # phone_numbers = os.getenv("PHONE_NUMBERS", None) + # print("trying to send sms to:", phone_numbers) + # if phone_numbers: + # try: + # assert ( + # len(message) < 15 + # ), f"message is limit to 15 characters! Current length: {len(message)}." + # requests.post( + # json={ + # "phone_numbers": phone_numbers, + # "server_code": "DLC", + # "error": message, + # "error_level": "wbb1u1g0dte2n", + # }, + # url=os.getenv( + # "ALIYUN_SMS_SERVICE", + # "http://cloud-6.agent-matrix.com:12337/send-sms/", + # ), + # headers={"Content-Type": "application/json"}, + # ) + # except Exception as e: + # print(f"Failed to send sms: {e}") diff --git a/astune/utils/testing_utils.py b/astune/utils/testing_utils.py new file mode 100644 index 00000000..34eadddc --- /dev/null +++ b/astune/utils/testing_utils.py @@ -0,0 +1,24 @@ +from astune.utils.dynamic_import import dynamic_import + +def get_test_lambda(test_name): + test_cls = dynamic_import(test_name)() + print('using test lambda:', test_name) + return test_cls + +def _test_if_test_mode(key, value, config): + if not config.astune.execute_test: return + if config.astune.execute_test == 'do_not_test': return + test_lambda = get_test_lambda(config.astune.execute_testing_lambda) + return test_lambda(key, value) + +def _mock_if_test_mode(key, value, config): + if not config.astune.execute_test: return value + if config.astune.execute_test == 'do_not_test': return value + test_lambda = get_test_lambda(config.astune.execute_testing_lambda) + return test_lambda.mock(key) + +class GoodbyeException(Exception): + pass + +class TestFailException(Exception): + pass \ No newline at end of file diff --git a/astune_tests/__init__.py b/astune_tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/astune_tests/test_apply_chat_template.py b/astune_tests/test_apply_chat_template.py new file mode 100644 index 00000000..e69de29b diff --git a/astune_tests/test_apply_chat_template/__init__.py b/astune_tests/test_apply_chat_template/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/astune_tests/test_apply_chat_template/agentscope_for_test.py b/astune_tests/test_apply_chat_template/agentscope_for_test.py new file mode 100644 index 00000000..40d45b04 --- /dev/null +++ b/astune_tests/test_apply_chat_template/agentscope_for_test.py @@ -0,0 +1,97 @@ +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from astune.utils.testing_utils import GoodbyeException, TestFailException +from agentscope.message import Msg +from pydantic import BaseModel, Field +from loguru import logger +from beast_logger import print_dict + +def extract_final_answer(result) -> str: + """Extract the final answer from the agent's response.""" + try: + if ( + hasattr(result, "metadata") + and isinstance(result.metadata, dict) + and "result" in result.metadata + ): + return result.metadata["result"] + if hasattr(result, "content"): + if isinstance(result.content, dict) and "result" in result.content: + return result.content["result"] + return str(result.content) + return str(result) + except Exception as e: + logger.warning(f"Extract final answer error: {e}. Raw: {result}") + return str(result) + + +class FinalResult(BaseModel): + result: str = Field( + description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" + ) + + +system_prompt = """ +You are an agent specialized in solving math problems with tools. +Please solve the math problem given to you. +You can write and execute Python code to perform calculation or verify your answer. +You should return your final answer within \\boxed{{}}. +""" + + +class ExampleMathLearn(Workflow): + + name: str = "math_agent_workflow" + + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + + query = "A robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?" + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=model_tuner, + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg, structured_model=FinalResult) + final_answer = extract_final_answer(result) + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + + +class TEST_LAMBDA(object): + def __init__(self): + pass + + def __call__(self, key, value): + if key == "prompt_text": + expected = '<|im_start|>system\n\nYou are an agent specialized in solving math problems with tools.\nPlease solve the math problem given to you.\nYou can write and execute Python code to perform calculation or verify your answer.\nYou should return your final answer within \\boxed{{}}.\n\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n\n{"type": "function", "function": {"name": "execute_python_code", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}, "description": "Execute the given python code in a temp file and capture the return\\n\\ncode, standard output and error. Note you must `print` the output to get\\nthe result, and the tmp file will be removed right after the execution."}}\n{"type": "function", "function": {"name": "generate_response", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\\\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}, "description": "Generate a response. Note only the input argument `response` is\\n\\nvisible to the others, you should include all the necessary\\ninformation in the `response` argument."}}\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{"name": , "arguments": }\n<|im_end|>\n<|im_start|>user\nA robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?<|im_end|>\n<|im_start|>assistant\n' + if value != expected: + print_dict({ + "expected": expected, + "value": value, + "key": key, + }) + raise TestFailException("Prompt text does not match expected value.") + elif key == "parsed_tool_calls": + if len(value) > 0: + raise GoodbyeException("Test passed!") + else: + raise TestFailException("No tool calls parsed when some were expected.") + else: + raise TestFailException(f"Unrecognized test key: {key}") + + def mock(self, key): + if key == "mock_decoded_text": + return 'To find the total number of bolts needed for the robe, we need to add the number of blue fiber bolts to the number of white fiber bolts. According to the problem, a robe takes 2 bolts of blue fiber and half that much white fiber. Therefore, the number of white fiber bolts is half of 2, which is 1. \n\nLet\'s calculate the total number of bolts.\n\n{"name": "execute_python_code", "arguments": {"code": "blue_fiber_bolts = 2\\nwhite_fiber_bolts = blue_fiber_bolts / 2\\ntotal_bolts = blue_fiber_bolts + white_fiber_bolts\\ntotal_bolts"}}\n\nresponse = "The total number of bolts needed for the robe is {}."\nresult = "\\\\boxed{3}"\n\n{"name": "generate_response", "arguments": {"response": "The total number of bolts needed for the robe is 3.", "result": "\\\\boxed{3}"}}\n<|im_end|>' + else: + raise TestFailException(f"Unrecognized mock key: {key}") \ No newline at end of file diff --git a/astune_tests/test_apply_chat_template/compare_server.py b/astune_tests/test_apply_chat_template/compare_server.py new file mode 100644 index 00000000..e69de29b diff --git a/astune_tests/test_apply_chat_template/test.yaml b/astune_tests/test_apply_chat_template/test.yaml new file mode 100644 index 00000000..43459f6a --- /dev/null +++ b/astune_tests/test_apply_chat_template/test.yaml @@ -0,0 +1,51 @@ +# ------------------ 主要配置 ------------------ +astune: + project_name: test + experiment_name: test_apply_chat_template_01 + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + huggingface_dat_repo: + dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' + training_split: "train" + validation_split: "test" + + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + agentscope_learn_protocol: "astune_tests.test_apply_chat_template.agentscope_for_test->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 1.0 + max_env_worker: 4 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + trainer_common: + total_epochs: 1 + num_repeat: 2 + train_batch_size: 8 + + execute_test: "test_apply_chat_template_01" # DO NOT EDIT, FOR TESTING PURPOSE ONLY + execute_testing_lambda: "astune_tests.test_apply_chat_template.agentscope_for_test->TEST_LAMBDA" # ✨✨✨✨ 编写并选择Agent + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ diff --git a/tests/test_tracing.py b/astune_tests/test_tracing.py similarity index 100% rename from tests/test_tracing.py rename to astune_tests/test_tracing.py diff --git a/tests/test_tracing_reader.py b/astune_tests/test_tracing_reader.py similarity index 100% rename from tests/test_tracing_reader.py rename to astune_tests/test_tracing_reader.py diff --git a/tests/test_utils/read_config_from_yaml.py b/astune_tests/test_utils/read_config_from_yaml.py similarity index 100% rename from tests/test_utils/read_config_from_yaml.py rename to astune_tests/test_utils/read_config_from_yaml.py diff --git a/test_launcher.py b/test_launcher.py new file mode 100644 index 00000000..0711125d --- /dev/null +++ b/test_launcher.py @@ -0,0 +1,27 @@ +import os +import subprocess +import sys + +TEST_TARGET = "astune_tests/test_apply_chat_template/test.yaml" +cmd = [sys.executable, "launcher.py", "--conf", TEST_TARGET, "--backbone", "verl"] +subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=os.environ) + +# python launcher.py --kill="python|ray|vllm|VLLM" && ray stop +# python launcher.py --conf astune_tests/test_apply_chat_template/test.yaml --backbone verl + +from astune.utils.smart_daemon import LaunchCommandWhenAbsent +service_path = os.path.dirname(__file__) +companion = LaunchCommandWhenAbsent( + full_argument_list=cmd, + dir=service_path, + tag="appworld_env_service", + use_pty=True, +) +try: + companion.launch( + launch_wait_time=1800, + success_std_string="GoodbyeException", + ) +except Exception as e: + print(f"Error launching companion: {e}") + sys.exit(1) \ No newline at end of file From 77852ab56fce72acaad5a073f6067d1668fec582 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 18:54:00 +0800 Subject: [PATCH 109/462] fix: add tools parameter to context tracking methods for improved functionality --- .../context_tracker/agentscope_tracker/multiagent_tracking.py | 3 ++- astune/task_rollout/async_llm_bridge.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 66458640..7de90a45 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -52,6 +52,7 @@ def step_prepare(self, messages: List[dict], tools: List = []): disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls if disable_toolcalls: consider_roles.remove("tool") + tools = [] for i, msg in enumerate(messages): if (disable_toolcalls) and (not isinstance(msg["content"], str)): @@ -103,7 +104,7 @@ def step_prepare(self, messages: List[dict], tools: List = []): if not context_safe: self.context_overflow = True - return context_safe, info, converted_message, custom_sampling_params + return context_safe, info, converted_message, custom_sampling_params, tools def step_track( self, diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index b29f6332..79afcf00 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -224,7 +224,7 @@ async def __call__( ) -> ChatResponse: # prepare context tracker, check context safety - context_safe, info, converted_message, custom_sampling_params = ( + context_safe, info, converted_message, custom_sampling_params, tools = ( self.context_tracker.step_prepare(messages, tools) ) if not context_safe: From b7ca6dce3ba2db71001fef98825e50a82dd1a5a0 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 19:36:00 +0800 Subject: [PATCH 110/462] fix: improve future handling in StaticRollout and add exception handling in BaseParallelEnv --- astune/task_rollout/native_parallel_worker.py | 6 +++++- astune/task_rollout/single_worker.py | 5 +++++ test_launcher.py | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/astune/task_rollout/native_parallel_worker.py b/astune/task_rollout/native_parallel_worker.py index 9d4977bf..d5b63d36 100644 --- a/astune/task_rollout/native_parallel_worker.py +++ b/astune/task_rollout/native_parallel_worker.py @@ -93,7 +93,11 @@ def rollout( ) futures.append(future) - while any(future.running() for future in futures): + while True: + if not any(future.running() for future in futures): + break + if any(future.exception() for future in futures): + break self.step_status_printer(obs_window) time.sleep(10) diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index db2c33a1..426463b2 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -24,6 +24,7 @@ from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner from astune.task_runner.agentscope_runner import AgentScopeRunner from astune.context_tracker.basic_tracker import BasicContextTracker +from astune.utils.testing_utils import GoodbyeException, TestFailException from astune.utils.env_service_client.env_client_ng import ( EnvClient as EnvClientNg, ) @@ -121,6 +122,10 @@ def rollout_env_worker( cmt = agent_runner.execute( workflow_task=workflow_task, ) + except GoodbyeException as e: + raise e + except TestFailException as e: + raise e except Exception as e: logger.bind(exception=True).exception( f"encounter exception in env_worker.agent_flow error={e.args}" diff --git a/test_launcher.py b/test_launcher.py index 0711125d..8b2d9332 100644 --- a/test_launcher.py +++ b/test_launcher.py @@ -7,7 +7,7 @@ subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=os.environ) # python launcher.py --kill="python|ray|vllm|VLLM" && ray stop -# python launcher.py --conf astune_tests/test_apply_chat_template/test.yaml --backbone verl +# python launcher.py --conf astune_tests/test_apply_chat_template/test.yaml --backbone verl --db="PPL" from astune.utils.smart_daemon import LaunchCommandWhenAbsent service_path = os.path.dirname(__file__) From d933470e6fc2b9ef0ed4e09e9e3ae713d11c4b98 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 21:03:50 +0800 Subject: [PATCH 111/462] prepare testing utils --- astune/task_rollout/async_llm_bridge.py | 1 + astune/task_rollout/native_parallel_worker.py | 5 ++- astune/task_rollout/single_worker.py | 2 ++ astune/utils/smart_daemon.py | 31 ++++++++++++++++--- .../test_apply_chat_template/test.yaml | 2 +- test_launcher.py | 19 ++++++++---- 6 files changed, 47 insertions(+), 13 deletions(-) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 97fea3e9..35f95aea 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -100,6 +100,7 @@ def llm_chat( if model_called: tool_calls = parsed_tool_calls['tool_calls'] decoded_text = parsed_tool_calls['content'] + if decoded_text is None: decoded_text = "" return { "role": "assistant", diff --git a/astune/task_rollout/native_parallel_worker.py b/astune/task_rollout/native_parallel_worker.py index d5b63d36..ad08d5f7 100644 --- a/astune/task_rollout/native_parallel_worker.py +++ b/astune/task_rollout/native_parallel_worker.py @@ -97,7 +97,10 @@ def rollout( if not any(future.running() for future in futures): break if any(future.exception() for future in futures): - break + executor.shutdown(wait=False, cancel_futures=True) + for f in futures: + if not f.done(): f.cancel() + raise RuntimeError("One of the rollout threads has encountered an exception.") self.step_status_printer(obs_window) time.sleep(10) diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index 426463b2..6cef2502 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -123,8 +123,10 @@ def rollout_env_worker( workflow_task=workflow_task, ) except GoodbyeException as e: + logger.success(f"env_worker.agent_flow completed with GoodbyeException: {e.args}") raise e except TestFailException as e: + logger.error(f"env_worker.agent_flow failed with TestFailException: {e.args}") raise e except Exception as e: logger.bind(exception=True).exception( diff --git a/astune/utils/smart_daemon.py b/astune/utils/smart_daemon.py index ef0f813c..d30e9593 100644 --- a/astune/utils/smart_daemon.py +++ b/astune/utils/smart_daemon.py @@ -100,9 +100,15 @@ def _is_script_running( return False, None, None def is_pgid_running(self, pgid): - for proc in psutil.process_iter(["pid"]): + # Treat zombie processes as not running to avoid false positives. + for proc in psutil.process_iter(["pid", "status"]): try: + if proc.info.get("status") == psutil.STATUS_ZOMBIE: + continue if os.getpgid(proc.pid) == pgid: + # Double-check status to avoid races where the cached info is missing. + if proc.status() == psutil.STATUS_ZOMBIE: + continue return True, proc except (psutil.NoSuchProcess, ProcessLookupError): continue @@ -147,6 +153,16 @@ def shutdown(self): if self.pgid: self._kill_existing_process_group(self.pgid) + def kill_self(self): + """Force terminate this launcher instance if it's running.""" + is_running, _, pgid = self._is_script_running() + if not is_running or pgid is None: + logger.info("No running process group found for this launcher") + return False + self.pgid = pgid + self._kill_existing_process_group(pgid) + return True + def launch( self, force_restart: bool = False, @@ -188,8 +204,13 @@ def launch( raise NotImplementedError("Windows support is not implemented yet.") else: # Unix-like systems # Use nohup and redirect output - logger.warning("\nlaunching: " + " ".join(self.cmd)) - logger.warning(f"\nlogging to {log_file}\n") + print_dict({ + "Action": "Launching command", + "Command": " ".join(self.cmd), + "LogFile": str(log_file), + }) + # logger.warning("\nlaunching: " + " ".join(self.cmd)) + # logger.warning(f"\nlogging to {log_file}\n") # Open log file if log_file.exists(): os.remove(log_file) @@ -268,12 +289,12 @@ def string_to_base64(s): if previous_r_print: print("") print( - f"Waiting for process launch... {remaining}s remaining ({f_read_trim})" + f"Waiting for process launch [PGID {pgid}, PID {proc.pid}]... {remaining}s remaining ({f_read_trim})" ) previous_r_print = False else: print( - f"\rWaiting for process launch... {remaining}s remaining", + f"\rWaiting for process launch [PGID {pgid}, PID {proc.pid}]... {remaining}s remaining", end="", flush=True, ) diff --git a/astune_tests/test_apply_chat_template/test.yaml b/astune_tests/test_apply_chat_template/test.yaml index 43459f6a..28ccf3e7 100644 --- a/astune_tests/test_apply_chat_template/test.yaml +++ b/astune_tests/test_apply_chat_template/test.yaml @@ -20,7 +20,7 @@ astune: rollout: agentscope_learn_protocol: "astune_tests.test_apply_chat_template.agentscope_for_test->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 1.0 - max_env_worker: 4 + max_env_worker: 1 debug: debug_max_parallel: 1 diff --git a/test_launcher.py b/test_launcher.py index 8b2d9332..f2051aab 100644 --- a/test_launcher.py +++ b/test_launcher.py @@ -1,13 +1,10 @@ import os import subprocess import sys +from beast_logger import print_dict TEST_TARGET = "astune_tests/test_apply_chat_template/test.yaml" cmd = [sys.executable, "launcher.py", "--conf", TEST_TARGET, "--backbone", "verl"] -subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=os.environ) - -# python launcher.py --kill="python|ray|vllm|VLLM" && ray stop -# python launcher.py --conf astune_tests/test_apply_chat_template/test.yaml --backbone verl --db="PPL" from astune.utils.smart_daemon import LaunchCommandWhenAbsent service_path = os.path.dirname(__file__) @@ -15,13 +12,23 @@ full_argument_list=cmd, dir=service_path, tag="appworld_env_service", - use_pty=True, ) +test_successful = False try: companion.launch( launch_wait_time=1800, success_std_string="GoodbyeException", + env_dict=os.environ, ) + test_successful = True except Exception as e: + test_successful = False print(f"Error launching companion: {e}") - sys.exit(1) \ No newline at end of file + sys.exit(1) +finally: + companion.kill_self() + +print_dict({ + "TestTarget": TEST_TARGET, + "TestSuccessful": test_successful, +}) From 51dd9a5e814b54376b08373350159aacbea379f5 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 22:51:58 +0800 Subject: [PATCH 112/462] fix: update tool_calls handling in BasicContextTracker and add max_env_worker to math_agent configuration --- astune/context_tracker/basic_tracker.py | 2 +- astune_tests/test_apply_chat_template/compare_server.py | 0 tutorial/example_math_agent/math_agent.yaml | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 astune_tests/test_apply_chat_template/compare_server.py diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index fdbb9f7d..e6098e04 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -274,7 +274,7 @@ def get_token_inc_from_vllm_response( "role": llm_output["role"], "content": llm_output["content"], } - if not llm_output.get("tool_calls", None): + if llm_output.get("tool_calls", None): llm_output_role_content.update({"tool_calls": llm_output.get("tool_calls", [])}) completion_token_arr, msg2 = self.get_inc( diff --git a/astune_tests/test_apply_chat_template/compare_server.py b/astune_tests/test_apply_chat_template/compare_server.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 70056faa..fbc9193d 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -20,6 +20,7 @@ astune: rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 1.0 + max_env_worker: 4 debug: debug_max_parallel: 1 From de39dac8f7bfde04fff1499d7b68cad34b584848 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 23:33:33 +0800 Subject: [PATCH 113/462] patch --- astune/task_rollout/async_llm_bridge.py | 4 ++-- astune/utils/utils.py | 27 +++++++++---------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 35f95aea..5447fd84 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -74,7 +74,7 @@ def llm_chat( request_id=request_id, prompt_ids=prompt_ids, sampling_params=updated_sampling_params, - ) + ), timeout=1200 ) if self.config.astune.rollout.name == "vllm": @@ -91,7 +91,7 @@ def llm_chat( # if tool call tool_calls = None - if '' in decoded_text: + if ('' in decoded_text) and (not self.config.astune.rollout.agentscope_disable_toolcalls): tool_parser = Hermes2ProToolParser(self.tokenizer) parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() diff --git a/astune/utils/utils.py b/astune/utils/utils.py index be469710..446f8a14 100644 --- a/astune/utils/utils.py +++ b/astune/utils/utils.py @@ -1,6 +1,7 @@ from typing import Any, List, Dict import asyncio import copy +import concurrent.futures # apply chat_template to a message, and then convert back to message @@ -17,7 +18,7 @@ def convert_tool_to_user_message(tool_message, tokenizer, format="qwen"): } -def run_async_coro__no_matter_what(coro): +def run_async_coro__no_matter_what(coro, timeout: int = 3600) -> Any: try: asyncio.get_running_loop() in_loop = True @@ -26,23 +27,15 @@ def run_async_coro__no_matter_what(coro): if not in_loop: final_res = asyncio.run(coro) else: - import threading - - _res_holder = {} - _exc_holder = {} - - def _run(): + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit(asyncio.run, coro) try: - _res_holder["res"] = asyncio.run(coro) - except Exception as _e: - _exc_holder["exc"] = _e - - _t = threading.Thread(target=_run, daemon=True) - _t.start() - _t.join() - if "exc" in _exc_holder: - raise _exc_holder["exc"] - final_res = _res_holder["res"] + final_res = future.result(timeout=timeout) + except concurrent.futures.TimeoutError: + future.cancel() + raise + except Exception as e: + raise return final_res From bbc022ba8926444e8ab3d3e7c2acae5d335b040b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 23:34:03 +0800 Subject: [PATCH 114/462] fix: parse JSON arguments in tool_calls for improved functionality --- astune/task_rollout/async_llm_bridge.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 5447fd84..ce8e9a40 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -1,4 +1,5 @@ import copy +import json import time import numpy as np import uuid @@ -99,6 +100,9 @@ def llm_chat( model_called = parsed_tool_calls['tools_called'] if model_called: tool_calls = parsed_tool_calls['tool_calls'] + for i in range(len(tool_calls)): + if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: + tool_calls[i]['function']['arguments'] = json.loads(tool_calls[i]['function']['arguments']) decoded_text = parsed_tool_calls['content'] if decoded_text is None: decoded_text = "" From c6f2862a147b3f960c02799fb22177ef25f16ebc Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 23 Nov 2025 23:38:09 +0800 Subject: [PATCH 115/462] fix: comment out JSON parsing in tool_calls for debugging and add logging for tool call parsing --- astune/task_rollout/async_llm_bridge.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index ce8e9a40..03c7b1d3 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -100,9 +100,9 @@ def llm_chat( model_called = parsed_tool_calls['tools_called'] if model_called: tool_calls = parsed_tool_calls['tool_calls'] - for i in range(len(tool_calls)): - if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: - tool_calls[i]['function']['arguments'] = json.loads(tool_calls[i]['function']['arguments']) + # for i in range(len(tool_calls)): + # if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: + # tool_calls[i]['function']['arguments'] = json.loads(tool_calls[i]['function']['arguments']) decoded_text = parsed_tool_calls['content'] if decoded_text is None: decoded_text = "" @@ -304,6 +304,7 @@ async def _parse_dashscope_generation_response( if message.get("tool_calls"): for tool_call in message["tool_calls"]: + from vsdb import bp; bp("TOOL_CALL_PARSE") input_ = _json_loads_with_repair( tool_call["function"].get( "arguments", From 4936c332ff2c1de311cde6db6923beb601abe96b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 00:00:31 +0800 Subject: [PATCH 116/462] patch --- astune/default_config/astune_default.yaml | 2 +- astune/default_config/trinity/trinity_default.yaml | 6 +++--- astune/task_rollout/async_llm_bridge.py | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index bb2487a0..cb14f039 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -133,5 +133,5 @@ astune: temperature: 0.5 print_reason: false - execute_test: "" # DO NOT EDIT, FOR TESTING PURPOSE ONLY + execute_test: False # DO NOT EDIT, FOR TESTING PURPOSE ONLY execute_testing_lambda: "" diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index 76c5b545..e4246867 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -47,7 +47,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 seed: 42 tensor_parallel_size: 1 tool_call_parser: hermes - runner_per_model: 12 + runner_per_model: 8 runner_state_report_interval: 30 model: max_model_len: 21000 @@ -62,7 +62,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 sync_timeout: 1200 trainer: grad_clip: 1.0 - max_token_len_per_gpu: 24576 + max_token_len_per_gpu: 20000 save_interval: 100 - ulysses_sequence_parallel_size: 2 + ulysses_sequence_parallel_size: 1 use_dynamic_bsz: true diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 03c7b1d3..8216600d 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -84,7 +84,7 @@ def llm_chat( token_array = final_res decoded_text = self.tokenizer.decode(token_array) # type: ignore - if not self.config.astune.execute_test: + if self.config.astune.execute_test: decoded_text = _mock_if_test_mode('mock_decoded_text', decoded_text, self.config) if decoded_text.endswith("<|im_end|>"): @@ -184,7 +184,7 @@ async def main(): ) return response - response = run_async_coro__no_matter_what(main()) # type: ignore + response = run_async_coro__no_matter_what(main(), timeout=1200) # type: ignore content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) @@ -256,9 +256,9 @@ async def __call__( return ChatResponse( content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] ) - # run llm inference ✨ llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) + from vsdb import bp; bp("TOOL_CALL_PARSE") # begin context tracking self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) @@ -304,7 +304,7 @@ async def _parse_dashscope_generation_response( if message.get("tool_calls"): for tool_call in message["tool_calls"]: - from vsdb import bp; bp("TOOL_CALL_PARSE") + input_ = _json_loads_with_repair( tool_call["function"].get( "arguments", From eeeae78fbb891664fede444eec21f5c343f9d69d Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 01:06:08 +0800 Subject: [PATCH 117/462] fix: update README and configuration files for improved agent execution and training parameters --- README.md | 7 +++++++ astune/default_config/astune_default.yaml | 2 +- tutorial/example_math_agent/math_agent.yaml | 14 +++++++------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 57ab8819..b2dd0caa 100644 --- a/README.md +++ b/README.md @@ -192,4 +192,11 @@ source .verlvenv/bin/activate python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='verl' + + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' + + + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='verl' ``` diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index cb14f039..7baea34a 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -94,7 +94,7 @@ astune: debug_tensor_parallel_size: 4 trainer_common: - val_before_train: True + val_before_train: False val_pass_n: 4 save_freq: 20 test_freq: 20 diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index fbc9193d..a5757be0 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -19,18 +19,18 @@ astune: rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent - temperature: 1.0 - max_env_worker: 4 + temperature: 0.7 + max_env_worker: 80 + num_repeat: 4 + agent_madness_reward: 0.0 + + data: + train_batch_size: 64 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 -trinity: - algorithm: - repeat_times: 6 - buffer: - train_batch_size: 180 # ------------------ 不需要修改 ------------------ hydra: From 107f87a6de7557b95d541d66e2f988a3fcfaeffb Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 01:06:12 +0800 Subject: [PATCH 118/462] fix: update imports and configurations in werewolves example for consistency and optimization --- tutorial/example_werewolves/game.py | 8 +++---- tutorial/example_werewolves/start.py | 25 +++++++++++++-------- tutorial/example_werewolves/utils.py | 2 +- tutorial/example_werewolves/werewolves.yaml | 11 ++++----- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/tutorial/example_werewolves/game.py b/tutorial/example_werewolves/game.py index 3b5b212e..47fe92d7 100644 --- a/tutorial/example_werewolves/game.py +++ b/tutorial/example_werewolves/game.py @@ -3,7 +3,7 @@ """A werewolf game implemented by agentscope.""" import numpy as np -from tutorial.werewolves.utils import ( +from tutorial.example_werewolves.utils import ( majority_vote, names_to_str, EchoAgent, @@ -11,7 +11,7 @@ MAX_DISCUSSION_ROUND, Players, ) -from tutorial.werewolves.structured_model import ( +from tutorial.example_werewolves.structured_model import ( DiscussionModel, get_vote_model, get_poison_model, @@ -19,10 +19,10 @@ get_seer_model, get_hunter_model, ) -from tutorial.werewolves.prompt import EnglishPrompts as Prompts +from tutorial.example_werewolves.prompt import EnglishPrompts as Prompts # Uncomment the following line to use Chinese prompts -# from tutorial.werewolves.prompt import ChinesePrompts as Prompts +# from tutorial.example_werewolves.prompt import ChinesePrompts as Prompts from loguru import logger from agentscope.agent import ReActAgent diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index a1ecb280..2b97288a 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -3,16 +3,17 @@ """The main entry point for the werewolf game.""" +import os import numpy as np import dotenv dotenv.load_dotenv() from textwrap import dedent from loguru import logger -from tutorial.werewolves.game import werewolves_game +from tutorial.example_werewolves.game import werewolves_game from agentscope.agent import ReActAgent -from agentscope.formatter import OpenAIMultiAgentFormatter -from agentscope.model import OpenAIChatModel +from agentscope.formatter import OpenAIMultiAgentFormatter, DashScopeMultiAgentFormatter +from agentscope.model import OpenAIChatModel, DashScopeChatModel from pydantic import BaseModel, Field from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput @@ -102,17 +103,23 @@ async def agentscope_execute( # initialize agents players = [] for i, role in enumerate(roles): - default_model = OpenAIChatModel( - model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", - stream=False, - client_args={"base_url": "http://22.16.118.255:2888/v1"}, - api_key="1234", + # default_model = OpenAIChatModel( + # model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", + # stream=False, + # client_args={"base_url": "http://22.16.118.255:2888/v1"}, + # api_key="1234", + # ) + default_model = DashScopeChatModel( + model_name="qwen-max", + api_key=os.environ.get("DASHSCOPE_API_KEY", "your-dashscope-api-key"), + stream=False ) agent = ReActAgent( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), model=model_tuner.register_model(role, default_model=default_model), - formatter=OpenAIMultiAgentFormatter(), + # formatter=OpenAIMultiAgentFormatter(), + formatter=DashScopeMultiAgentFormatter(), ) agent.set_console_output_enabled(False) players += [agent] diff --git a/tutorial/example_werewolves/utils.py b/tutorial/example_werewolves/utils.py index a73daf4c..a3c39e16 100644 --- a/tutorial/example_werewolves/utils.py +++ b/tutorial/example_werewolves/utils.py @@ -5,7 +5,7 @@ import numpy as np -from tutorial.werewolves.prompt import EnglishPrompts as Prompts +from tutorial.example_werewolves.prompt import EnglishPrompts as Prompts from agentscope.message import Msg from agentscope.agent import ReActAgent, AgentBase diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index c9448b77..7c6f843b 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -14,7 +14,7 @@ astune: rollout: agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 6 + num_repeat: 4 agent_madness_reward: 0.0 debug: @@ -24,13 +24,10 @@ astune: data: max_prompt_length: 15000 max_response_length: 3000 - train_batch_size: 32 + train_batch_size: 8 -trinity: - algorithm: - repeat_times: 6 - buffer: - train_batch_size: 84 + trainer_common: + val_before_train: False # ------------------ 不需要修改 ------------------ hydra: From 7ab8d3725deb005cbaafaba6e562ea89cc46ada5 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 01:35:31 +0800 Subject: [PATCH 119/462] fix: enable console output for moderator and update werewolves configuration for temperature and tensor model parallel size --- tutorial/example_werewolves/game.py | 1 + tutorial/example_werewolves/werewolves.yaml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/tutorial/example_werewolves/game.py b/tutorial/example_werewolves/game.py index 47fe92d7..6038f3cf 100644 --- a/tutorial/example_werewolves/game.py +++ b/tutorial/example_werewolves/game.py @@ -34,6 +34,7 @@ moderator = EchoAgent() +moderator.set_console_output_enabled(False) async def hunter_stage( diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index 7c6f843b..03b9fa4b 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -16,6 +16,8 @@ astune: agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent num_repeat: 4 agent_madness_reward: 0.0 + temperature: 0.3 + tensor_model_parallel_size: 4 debug: debug_max_parallel: 1 From 0739d652a5ef3e201c9f01710584f83729eb4f1c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 09:51:58 +0800 Subject: [PATCH 120/462] stage tracking --- README.md | 4 ++-- .../context_tracker/agentscope_tracker/multiagent_tracking.py | 2 +- tutorial/example_werewolves/werewolves.yaml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b2dd0caa..b8a47184 100644 --- a/README.md +++ b/README.md @@ -177,9 +177,9 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi # Future -- [ ] test server +- [x] test server - [ ] RUBRICS INT -- [ ] TEST TOKEN REASON +- [-] TEST TOKEN REASON - [x] TRINITY CONF MAP ``` diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index b67495c9..7876b5e4 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -146,7 +146,7 @@ def step_track( ) assert ( len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn - ), f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" + ), f"Generated token length {len(token_arr_method2)} exceeds max_response_length_in_one_turn {self.config.astune.rollout.max_response_length_in_one_turn}" llm_ext_msg.token_arr = token_arr_method2 llm_ext_msg.token_logprob_arr = token_logprob_arr self.generated_token_callback_fn(llm_ext_msg.token_arr) diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index 03b9fa4b..88bdeaf9 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -24,8 +24,8 @@ astune: debug_first_n_tasks: 1 data: - max_prompt_length: 15000 - max_response_length: 3000 + max_prompt_length: 9000 + max_response_length: 9000 train_batch_size: 8 trainer_common: From 4c55728d509346cd2631d4b52d545b3723b25892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=BE=E5=A4=A9?= Date: Mon, 24 Nov 2025 10:40:09 +0800 Subject: [PATCH 121/462] Add Data Generatior Base Class. --- astune/data_generator/data_generator_base.py | 81 ++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 astune/data_generator/data_generator_base.py diff --git a/astune/data_generator/data_generator_base.py b/astune/data_generator/data_generator_base.py new file mode 100644 index 00000000..7b21701a --- /dev/null +++ b/astune/data_generator/data_generator_base.py @@ -0,0 +1,81 @@ +from typing import List, Optional, Dict, Any +from astune.schema.task import Task +from astune.schema.document import Document +from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn + +class DataGeneratorBase: + def __init__( + self, + config + ): + """ + Initialize the TaskGeneratorBase class. + + Args: + config: Optional configuration object (LLM model, Maximum response length) + """ + self.config = config + + self.llm_client = construct_alien_llm_chat_fn( + alien_llm_model=self.config.astune.data_generator.llm_model, + alien_llm_response_length=self.config.astune.data_generator.llm_response_length + ) + + def generate_task( + self, + source_task: Optional[Task] = None, + document: Optional[Document] = None, + extra_metadata: Optional[Dict[str, Any]] = None, + ) -> Union[Task, List[Task]]: + """ + Generate a new task. + + Args: + source_task: Source task for imitation (optional) + document: Knowledge source (optional) + extra_metadata: Additional metadata for the new task + + Returns: + Generated Task instance + """ + system_prompt = self._build_system_prompt(source_task, document) + user_prompt = self._build_user_prompt(source_task, document) + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt}, + ] + + # Call the new LLM client + # Returns: {"role": "assistant", "content": "..."} + response = self.llm_client( + messages=messages, + sampling_params_override=self.sampling_params + ) + # Extract content from response + raw_response = response.get("content", "") + new_task = self._parse_llm_output_to_task(raw_response, source_task, document, extra_metadata) + return new_task + + def _build_system_prompt( + self, + source_task: Optional[Task], + document: Optional[Document], + ) -> str: + raise NotImplementedError + + def _build_user_prompt( + self, + source_task: Optional[Task], + document: Optional[Document], + ) -> str: + raise NotImplementedError + + def _parse_llm_output_to_task( + self, + raw_response: Any, + source_task: Optional[Task], + document: Optional[Document] = None, + extra_metadata: Optional[Dict[str, Any]] = None, + ) -> Task: + raise NotImplementedError From c4f53adbbc2b3b7a1a67f635928c2dc067a44d72 Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Mon, 24 Nov 2025 11:00:50 +0800 Subject: [PATCH 122/462] fix test data gen From dc7a3f1cd8dc6f45bfb056c8cdedc4a34203b1fc Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 17 Nov 2025 17:42:39 +0800 Subject: [PATCH 123/462] feat: introduce tracing reader --- .../task_reader/tracing_reader/llm_client.py | 286 ++++++++++++++++++ tutorial/example_math_agent/math_agent.yaml | 16 + 2 files changed, 302 insertions(+) create mode 100644 astune/task_reader/tracing_reader/llm_client.py diff --git a/astune/task_reader/tracing_reader/llm_client.py b/astune/task_reader/tracing_reader/llm_client.py new file mode 100644 index 00000000..fa253141 --- /dev/null +++ b/astune/task_reader/tracing_reader/llm_client.py @@ -0,0 +1,286 @@ +from abc import ABC, abstractmethod +import json +import os +import time +from typing import Any, Optional, Protocol, Iterator, Generator, cast + +from loguru import logger +import requests + +class LlmException(Exception): + def __init__(self,typ: str): + self._type=typ + + @property + def typ(self): + return self._type + + +class DashScopeClient: + """Aliyun DashScope API Client""" + + def __init__(self, api_key: Optional[str] = None, model_name: str = "qwen-plus", + temperature: float = 0.7, max_tokens: int = 2048): + self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY") + if not self.api_key: + raise ValueError("API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly.") + + self.model_name = model_name + self.temperature = temperature + self.max_tokens = max_tokens + self.base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1" + + self.headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json" + } + + def set_model(self, model_name: str): + """ + Sets the model name for the DashScopeClient instance. + + Args: + model_name (str): The name of the model to be used for API interactions. + """ + self.model_name = model_name # ⭐ Assigns the provided model name to the instance variable + + def chat(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> str: + """ + Sends a chat request to the LLM, aggregates the streaming responses, and returns the complete response. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. + sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the LLM. + + Returns: + str: The complete response from the LLM as a single string. + """ + res = "" + for x in self.chat_stream(messages, sampling_params): # ⭐ Aggregates the streaming responses into a single string + res += x + return res + + def chat_stream(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> Generator[str, None, None]: + """ + Initiates a streaming chat session and returns a generator that yields the response as it is being generated. + + Args: + messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. + sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the model. + + Returns: + Generator[str, None, None]: A generator that yields the response text as it is being generated. + """ + return self.chat_stream_with_retry(messages, **sampling_params) # ⭐ Calls the retry mechanism for streaming chat + + def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, **kwargs) -> str | Generator[str, None, None]: + """ + Sends a request to the chat completion API, supporting both non-streaming and streaming modes, and handles various exceptions. + + Args: + messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. + stream (bool, optional): If True, the response will be streamed. Defaults to False. + **kwargs: Additional parameters to be passed to the API. + + Returns: + str | Generator[str, None, None]: The full response text if not streaming, or a generator yielding the response text if streaming. + """ + url = f"{self.base_url}/chat/completions" + + # Merge parameters + params = { + "model": self.model_name, + "messages": messages, + "temperature": self.temperature, + "max_tokens": self.max_tokens, + "stream": stream, + **kwargs + } + + try: + if stream: + return self._handle_stream_response(url, params) # ⭐ Handles the streaming response + else: + return self._handle_normal_response(url, params) # ⭐ Handles the non-streaming response + + except requests.exceptions.RequestException as e: + logger.error(f"API request failed: {e}") + return "" if not stream else (x for x in []) + except json.JSONDecodeError as e: + logger.error(f"Failed to parse API response: {e}") + return "" if not stream else (x for x in []) + except Exception as e: + logger.error(f"Unexpected error in API call: {e}") + return "" if not stream else (x for x in []) + + def _handle_normal_response(self, url: str, params: dict) -> str: + """ + Handles the non-streaming (normal) response from the API. + + Args: + url (str): The URL to which the POST request is sent. + params (dict): The parameters to be included in the JSON body of the POST request. + + Returns: + str: The content of the first choice's message in the response, or an empty string if the response format is unexpected. + """ + response = requests.post(url, headers=self.headers, json=params, timeout=600) # ⭐ Sends the POST request to the API + if not response.ok: + # check inappropriate content + try: + error_json=response.json()['error'] + if "inappropriate content" in error_json['message']: + raise LlmException("inappropriate content") + if "limit" in error_json['message']: + raise LlmException("hit limit") + except LlmException as e: + raise + except: + logger.error(f"API request failed: {response.text}") + response.raise_for_status() + + result = response.json() + if "choices" in result and len(result["choices"]) > 0: + return result["choices"][0]["message"]["content"].strip() # ⭐ Extracts and returns the content of the first choice's message + else: + logger.error(f"Unexpected response format: {result}") + return "" + + def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None, None]: + """ + Handles the streaming response from a POST request to the specified URL. + + Args: + url (str): The URL to which the POST request is sent. + params (dict): The parameters to be sent with the POST request. + + Yields: + str: The content of the response, if it meets the specified conditions. + """ + response = requests.post(url, headers=self.headers, json=params, stream=True, timeout=600) # ⭐ Send the POST request and get the streaming response + if not response.ok: + # check inappropriate content + try: + error_json=response.json()['error'] + if "inappropriate content" in error_json['message']: + raise LlmException("inappropriate content") + if "limit" in error_json['message']: + raise LlmException("hit limit") + except LlmException as e: + raise + except: + logger.error(f"API request failed: {response.text}") + response.raise_for_status() + + for line in response.iter_lines(): + if line: + line = line.decode('utf-8') + if line.startswith('data: '): + data = line[6:] # remove the prefix 'data: ' + if data == '[DONE]': + break + + try: + chunk = json.loads(data) + if "choices" in chunk and len(chunk["choices"]) > 0: + choice = chunk["choices"][0] + if "delta" in choice and "content" in choice["delta"]: + content = choice["delta"]["content"] + if content: + yield content # ⭐ Yield the content if it meets the conditions + except json.JSONDecodeError: + continue # skip the bad line + + def chat_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, + retry_delay: float = 1.0, **kwargs) -> str: + """ + Sends a chat completion request to the LLM with a retry mechanism. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries for the chat. + max_retries (int, optional): Maximum number of retries. Defaults to 3. + retry_delay (float, optional): Initial delay between retries in seconds. Defaults to 1.0. + **kwargs: Additional keyword arguments to be passed to the `chat_completion` method. + + Returns: + str: The response from the LLM or a predefined message if all attempts fail. + """ + for attempt in range(max_retries): + try: + result = cast(str,self.chat_completion(messages, stream=False, **kwargs)) # ⭐ Attempt to get a chat completion + if result: # If a valid response is obtained + return result + + except LlmException as e: + if e.typ=='inappropriate content': + logger.warning(f"llm return inappropriate content, which is blocked by the remote") + return "[inappropriate content]" + except Exception as e: + logger.warning(f"Attempt {attempt + 1} failed: {e}") + + if attempt < max_retries - 1: # Not the last attempt + time.sleep(retry_delay * (2 ** attempt)) # Exponential backoff + + logger.error(f"All {max_retries} attempts failed") + return "" + + def chat_stream_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, + retry_delay: float = 10.0, **kwargs) -> Generator[str, None, None]: + """ + Attempts to establish a streaming chat completion with a retry mechanism. + + Args: + messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. + max_retries (int, optional): The maximum number of retry attempts. Defaults to 3. + retry_delay (float, optional): The initial delay in seconds before the first retry. Defaults to 10.0. + **kwargs: Additional keyword arguments to pass to the chat_completion method. + + Yields: + str: Chunks of the streaming response. + """ + for attempt in range(max_retries): + try: + stream_generator = cast(Generator[str, None, None], self.chat_completion(messages, stream=True, **kwargs)) # ⭐ Cast the generator to the appropriate type + # try to fetch the first chunk to verify the connection + first_chunk = next(stream_generator, None) + if first_chunk is not None: + yield first_chunk + # yield the rest chunks + for chunk in stream_generator: + yield chunk + return # success + except LlmException as e: + if e.typ=='inappropriate content': + logger.warning(f"llm return inappropriate content, which is blocked by the remote") + yield "[inappropriate content]" + return + except Exception as e: + logger.warning(f"Stream attempt {attempt + 1} failed: {e}") + + if attempt < max_retries - 1: + time.sleep(retry_delay * (2 ** attempt)) + + logger.error(f"All {max_retries} stream attempts failed") + + return + + +# demo +if __name__ == "__main__": + client = DashScopeClient(model_name='qwq-32b') + + messages = [ + {"role": "user", "content": "Write a poem about Spring."} + ] + + # print("=== request ===") + # response = client.chat_completion(messages) + # print(response) + + print("\n=== streaming ===") + for chunk in client.chat_completion(messages, stream=True): + print(chunk, end='', flush=True) + + print("\n\n=== streaming with retry ===") + for chunk in client.chat_stream(messages, {}): + print(chunk, end='', flush=True) \ No newline at end of file diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index a5757be0..d1cd5573 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -8,6 +8,22 @@ astune: dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' training_split: "train" validation_split: "test" + + # example + tracing: + base_url: http://phoenix:port + train_output_path: /path/to/tasks.jsonl + filters: + - type: llm_evaluate + enabled: true + params: + custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" + temperature: 0.5 + max_tokens: 2048 + print_reason: false + + + task_judge: # ✨✨✨✨ 编写并选择评价函数 From 0af4d04c99188a703a62bb7aba419ea4d98d87d5 Mon Sep 17 00:00:00 2001 From: cc Date: Thu, 20 Nov 2025 16:14:52 +0800 Subject: [PATCH 124/462] tests: tracing reader --- astune_tests/test_tracing_reader.py | 1 + 1 file changed, 1 insertion(+) diff --git a/astune_tests/test_tracing_reader.py b/astune_tests/test_tracing_reader.py index d94c5798..347220b4 100644 --- a/astune_tests/test_tracing_reader.py +++ b/astune_tests/test_tracing_reader.py @@ -1,5 +1,6 @@ import pytest from pathlib import Path +from types import SimpleNamespace from typing import List from astune.task_reader.tracing_reader import TracingReader from astune.schema.task import Task From 692068d4f95e90e10f01a3579e2d1eb72f769e49 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 21 Nov 2025 16:15:01 +0800 Subject: [PATCH 125/462] feat: add tracing reader demo Former-commit-id: e145456be058c117f20a1b9d46a79ac55d0c0586 --- astune/task_reader/__init__.py | 3 + astune/task_reader/tracing_reader/__init__.py | 10 +++- .../task_reader/tracing_reader/connector.py | 9 ++- .../filters/llm_evaluate_filter.py | 4 +- .../trace_feedback_training/agent_deployed.py | 53 ++++++++++++++++ .../database.sqlite.REMOVED.git-id | 1 + .../trace_feedback_training.yaml | 60 +++++++++++++++++++ tutorial/trace_feedback_training/train.py | 45 ++++++++++++++ 8 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 tutorial/trace_feedback_training/agent_deployed.py create mode 100644 tutorial/trace_feedback_training/database.sqlite.REMOVED.git-id create mode 100644 tutorial/trace_feedback_training/trace_feedback_training.yaml create mode 100644 tutorial/trace_feedback_training/train.py diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index 67af181f..c6600139 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -10,6 +10,7 @@ from astune.task_reader.hf_dataset_reader import TaskReaderHuggingFace from astune.task_reader.jsonl_reader import TaskReaderJsonl from astune.task_reader.task_reader_base import TaskReaderBase +from astune.task_reader.tracing_reader import TracingReader class RandomDummyGenerator(TaskReaderBase): @@ -55,6 +56,8 @@ def __init__(self, config): self.task_reader = TaskReaderJsonl(config) elif self.task_reader_type == "huggingface_dat_repo": self.task_reader = TaskReaderHuggingFace(config) + elif self.task_reader_type == "tracing": + self.task_reader = TracingReader(config) elif self.task_reader_type == "random_dummy": self.task_reader = RandomDummyGenerator(config) else: diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 37eb5b02..4eb4a7da 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -4,6 +4,8 @@ import os import random +from loguru import logger + from astune.schema.task import Task from astune.task_reader.tracing_reader.filters.base import Filter from astune.task_reader.tracing_reader.filters.factory import build_filters @@ -33,7 +35,8 @@ def __init__( # config patch # print("*********", config, "**********") self.config = config.astune.tracing - + + logger.info(f"reading tasks from {self.config.get('base_url')}, #filter {len(self.config.get('filters'))}") self._connector = LocalSqliteConnectorV1(self.config.get("base_url")) filters_config = self.config.get("filters") built_filters = build_filters(filters_config) @@ -63,7 +66,8 @@ def _load_existing_tasks(self, path: str) -> List[Task]: def _append_tasks(self, path: str, tasks: List[Task]) -> None: if not tasks: return - with open(path, "a") as f: + mode = 'a' if os.path.exists(path) else 'w' + with open(path, mode) as f: for task in tasks: obj = task.model_dump() f.write(json.dumps(obj, ensure_ascii=False) + "\n") @@ -78,6 +82,7 @@ def _init_tasks(self) -> None: output_path = self.config.get("train_output_path") tasks = self._connector.load_tasks_from_conversation() + logger.info(f"Loaded {len(tasks)} tasks from conversation") existing_tasks = self._load_existing_tasks(output_path) existing_hashes = { @@ -121,6 +126,7 @@ def _init_tasks(self) -> None: self._train_tasks = shuffled_tasks[:train_size] self._val_tasks = shuffled_tasks[train_size:] + logger.info(f"Shuffled {total} tasks into {train_size} train and {total - train_size} val") def get_training_tasks(self) -> List[Task]: return self._train_tasks diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index 5d2cadfa..432ee3e4 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -2,6 +2,7 @@ import sqlite3 import ast import re +from loguru import logger import requests import json import hashlib @@ -109,7 +110,7 @@ def parse_msg_line(line: str): inner = match.group(1) kv_pairs = [] - for item in re.findall(r"(\w+)=((?:'.*?'|None))", inner): + for item in re.findall(r"(\w+)=((?:'.*?'|\[.*?\]|None))", inner): key, val = item kv_pairs.append(f"'{key}': {val}") dict_like = "{" + ", ".join(kv_pairs) + "}" @@ -150,6 +151,7 @@ def load_tasks_from_conversation(self) -> List[Task]: rows = cursor.execute( "SELECT attributes FROM span_table where name='ReActAgent.reply'" ).fetchall() + logger.debug(f"Loaded {len(rows)} rows from {self._db_path}") qa = [] for row in rows: @@ -159,6 +161,11 @@ def load_tasks_from_conversation(self) -> List[Task]: if query is not None and output is not None: query = parse_msg_line(query) output = parse_msg_line(output) + # patch + if isinstance(output['content'],list): + output['content']=output['content'][-1] + if isinstance(output['content'],dict): + output['content']=output['content']['text'] if query is not None and output is not None: if query["role"] == "user" and output["role"] == "assistant": if query["content"] is not None and output["content"] is not None: diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 4482ed23..2327fb9b 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -1,5 +1,7 @@ from typing import Iterable, List +from tqdm import tqdm + from astune.schema.task import Task from astune.task_rollout.dashscope_llm_bridge import ( construct_alien_llm_chat_fn, @@ -75,7 +77,7 @@ def __init__( def filter(self, tasks: Iterable[Task]) -> List[Task]: kept: List[Task] = [] - for task in tasks: + for task in tqdm(tasks,desc="filtering tasks"): payload = { "query": task.main_query, "answer": task.metadata.get("answer", ""), diff --git a/tutorial/trace_feedback_training/agent_deployed.py b/tutorial/trace_feedback_training/agent_deployed.py new file mode 100644 index 00000000..6eaf9909 --- /dev/null +++ b/tutorial/trace_feedback_training/agent_deployed.py @@ -0,0 +1,53 @@ +import os +from agentscope.agent import ReActAgent +from agentscope.formatter import DashScopeChatFormatter +from agentscope.memory import InMemoryMemory +from agentscope.message import Msg +from agentscope.model import DashScopeChatModel +from agentscope.tool import Toolkit, execute_python_code +import agentscope + + +SYSTEM_PROMPT = """ +You are an agent specialized in solving math problems with tools. +If I give problem, please solve the math problem given to you. +You can write and execute Python code to perform calculation or verify your answer. +You should return your final answer within \\boxed{{}}. +""" + + +def build_agent(): + tool_kit=Toolkit() + tool_kit.register_tool_function(execute_python_code) + + agent = ReActAgent( + name="Qwen", + sys_prompt=SYSTEM_PROMPT, + model=DashScopeChatModel( + model_name="qwen-max", + api_key=os.environ["DASHSCOPE_API_KEY"], + stream=True, + ), + formatter=DashScopeChatFormatter(), + memory=InMemoryMemory(), + toolkit=tool_kit, + print_hint_msg=False, + ) + + return agent + + +async def main(): + # init the tracing module + agentscope.init(studio_url="http://localhost:3000") + + agent = build_agent() + + while True: + inp = input("User: ") + print(await agent.reply(Msg("user", inp, role="user"))) + + +if __name__=='__main__': + import asyncio + asyncio.run(main()) \ No newline at end of file diff --git a/tutorial/trace_feedback_training/database.sqlite.REMOVED.git-id b/tutorial/trace_feedback_training/database.sqlite.REMOVED.git-id new file mode 100644 index 00000000..018fb146 --- /dev/null +++ b/tutorial/trace_feedback_training/database.sqlite.REMOVED.git-id @@ -0,0 +1 @@ +670372e26a8fcc35d4c85619434791ac11a6346d \ No newline at end of file diff --git a/tutorial/trace_feedback_training/trace_feedback_training.yaml b/tutorial/trace_feedback_training/trace_feedback_training.yaml new file mode 100644 index 00000000..f7c08071 --- /dev/null +++ b/tutorial/trace_feedback_training/trace_feedback_training.yaml @@ -0,0 +1,60 @@ +# ------------------ 主要配置 ------------------ +astune: + task_reader: + type: tracing + + task_judge: + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + + model: + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + agentscope_learn_protocol: tutorial.trace_feedback_training.train->ExampleTracingFeedbackTrain + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + tracing: + base_url: ./tutorial/trace_feedback_training/database.sqlite + train_output_path: ./tutorial/trace_feedback_training/tasks.jsonl + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 2048 + filters: + - type: llm_evaluate + enabled: true + params: + custom_rubrics: | + 1. Check the answer and drop the task if it does not answer or answer is wrong. + 2. Consider a response is invalid if it does not wrap the final answer in \boxed{}. + temperature: 0.5 + print_reason: false + +trinity: + algorithm: + repeat_times: 6 + buffer: + train_batch_size: 180 + + +# remove swanlab logger +trainer: + logger: + - console + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ diff --git a/tutorial/trace_feedback_training/train.py b/tutorial/trace_feedback_training/train.py new file mode 100644 index 00000000..a95a1ff2 --- /dev/null +++ b/tutorial/trace_feedback_training/train.py @@ -0,0 +1,45 @@ +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from agentscope.message import Msg +from pydantic import BaseModel, Field +from loguru import logger + +from agent_deployed import build_agent + +def extract_final_answer(result) -> str: + """Extract the final answer from the agent's response.""" + try: + if ( + hasattr(result, "metadata") + and isinstance(result.metadata, dict) + and "result" in result.metadata + ): + return result.metadata["result"] + if hasattr(result, "content"): + if isinstance(result.content, dict) and "result" in result.content: + return result.content["result"] + return str(result.content) + return str(result) + except Exception as e: + logger.warning(f"Extract final answer error: {e}. Raw: {result}") + return str(result) + + + +class FinalResult(BaseModel): + result: str = Field( + description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" + ) + + +class ExampleTracingFeedbackTrain(Workflow): + name: str = "tracing_feedback_train" + + async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + query = workflow_task.task.main_query + agent=build_agent() + + msg = Msg("user", query, role="user") + result = await agent.reply(msg, structured_model=FinalResult) + final_answer = extract_final_answer(result) + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + From 7dbb8c065a79133e644bb68d189b6b870af610ed Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 21 Nov 2025 17:32:28 +0800 Subject: [PATCH 126/462] fix: agent model in tracing demo Former-commit-id: e3a0119ac1548dcaadfbf97885945fb4f4ff898c --- .../trace_feedback_training.yaml | 2 +- tutorial/trace_feedback_training/train.py | 31 +++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/tutorial/trace_feedback_training/trace_feedback_training.yaml b/tutorial/trace_feedback_training/trace_feedback_training.yaml index f7c08071..244737be 100644 --- a/tutorial/trace_feedback_training/trace_feedback_training.yaml +++ b/tutorial/trace_feedback_training/trace_feedback_training.yaml @@ -37,12 +37,12 @@ trinity: buffer: train_batch_size: 180 - # remove swanlab logger trainer: logger: - console + # ------------------ 不需要修改 ------------------ hydra: searchpath: diff --git a/tutorial/trace_feedback_training/train.py b/tutorial/trace_feedback_training/train.py index a95a1ff2..011b8352 100644 --- a/tutorial/trace_feedback_training/train.py +++ b/tutorial/trace_feedback_training/train.py @@ -2,8 +2,23 @@ from agentscope.message import Msg from pydantic import BaseModel, Field from loguru import logger +import os +from agentscope.agent import ReActAgent +from agentscope.formatter import DashScopeChatFormatter +from agentscope.memory import InMemoryMemory +from agentscope.message import Msg +from agentscope.model import DashScopeChatModel +from agentscope.tool import Toolkit, execute_python_code +import agentscope + + +SYSTEM_PROMPT = """ +You are an agent specialized in solving math problems with tools. +If I give problem, please solve the math problem given to you. +You can write and execute Python code to perform calculation or verify your answer. +You should return your final answer within \\boxed{{}}. +""" -from agent_deployed import build_agent def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" @@ -36,7 +51,19 @@ class ExampleTracingFeedbackTrain(Workflow): async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: query = workflow_task.task.main_query - agent=build_agent() + + tool_kit=Toolkit() + tool_kit.register_tool_function(execute_python_code) + + agent = ReActAgent( + name="Qwen", + sys_prompt=SYSTEM_PROMPT, + model=model_tuner, + formatter=DashScopeChatFormatter(), + memory=InMemoryMemory(), + toolkit=tool_kit, + print_hint_msg=False, + ) msg = Msg("user", query, role="user") result = await agent.reply(msg, structured_model=FinalResult) From 328da9e1db2a8065b9fe5815a8d69c3186c80fd8 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 21 Nov 2025 17:32:52 +0800 Subject: [PATCH 127/462] docs: add doc for tracing demo Former-commit-id: 9e7b2bf0eaa5d00220ff257ceb833ab97be5a43e --- tutorial/trace_feedback_training/README.md | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 tutorial/trace_feedback_training/README.md diff --git a/tutorial/trace_feedback_training/README.md b/tutorial/trace_feedback_training/README.md new file mode 100644 index 00000000..b1bc27be --- /dev/null +++ b/tutorial/trace_feedback_training/README.md @@ -0,0 +1,31 @@ +# 从 Tracing Log 回流数据训练一个新的 Agent + +在该文档中,我们将展示如何从 Tracing Log 回流数据训练一个新的 Agent。 + +## 1. 准备数据 + +假设你已经有一个基于 agentscope 构建的 Agent,且连接在 studio 上运行了一段时间。 + +在 `agent_deployed.py` 中展示了一个能够解决数学问题的最小化 agent。现在,我们将先使用它来模拟数据收集过程。 + +1. 安装 agentscope-studio。 +2. 依照默认设置启动 agentscope-studio。 +3. 运行 `agent_deployed.py`,并与 agent 交互。 + +在完成几轮交互后,studio 在 `~/AgentScope-Studio/database.sqlite` 中保存了 tracing log。 + +## 2. 启动数据回流训练 + +在获得 tracing log(`database.sqlite`)后,接下来就能使用本项目的回流训练功能来训练一个 Agent。 + +1. 配置参数中 `task_reader` 为 `tracing` 来使用回流模式。 +2. 依照需求,配置 `tracing` 中的数据库地址以及数据筛选设置。 +3. 仿照正常的训练流程,配置其他参数与 Reward。 + +在 `trace_feedback_training` 中已准备了一份示例 database 及相应的训练配置文件。 + +在一切准备妥当后,使用 launcher 启动训练。 + +```bash +python launcher.py --conf tutorial/trace_feedback_training/trace_feedback_training.yaml --backbone='trinity' --with-ray +``` \ No newline at end of file From 95f51fe37f6940127a6d376cb955c910b6499074 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Nov 2025 11:07:19 +0800 Subject: [PATCH 128/462] docs: update tutorial README for trace feedback training Former-commit-id: a15c1275fdd887a97f21e43068242258f39e562e --- tutorial/trace_feedback_training/README.md | 25 ++++++++++++++-------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/tutorial/trace_feedback_training/README.md b/tutorial/trace_feedback_training/README.md index b1bc27be..76bbca53 100644 --- a/tutorial/trace_feedback_training/README.md +++ b/tutorial/trace_feedback_training/README.md @@ -1,28 +1,35 @@ # 从 Tracing Log 回流数据训练一个新的 Agent -在该文档中,我们将展示如何从 Tracing Log 回流数据训练一个新的 Agent。 +ASTune 支持回收和利用 Agent 生产过程产生的聊天日志,不断训练、提升 Agent 表现。在该文档中,我们将展示如何从 Tracing Log 回流数据训练一个 Agent。 ## 1. 准备数据 -假设你已经有一个基于 agentscope 构建的 Agent,且连接在 studio 上运行了一段时间。 +为使用回流数据训练,假设已经有一个基于 agentscope 构建的 Agent,且连接在 studio 上运行了一段时间。 -在 `agent_deployed.py` 中展示了一个能够解决数学问题的最小化 agent。现在,我们将先使用它来模拟数据收集过程。 +在本示例中,我们在 `agent_deployed.py` 中实现了一个能用于解决数学问题的 agent。现在,我们将先使用它模拟数据收集的过程。 -1. 安装 agentscope-studio。 -2. 依照默认设置启动 agentscope-studio。 -3. 运行 `agent_deployed.py`,并与 agent 交互。 +1. 安装 [agentscope-studio](https://github.com/agentscope-ai/agentscope-studio)。 +2. 依照默认端口设置启动 agentscope-studio。 +3. 运行 `agent_deployed.py`,并模拟用户与 agent 聊天交互。 -在完成几轮交互后,studio 在 `~/AgentScope-Studio/database.sqlite` 中保存了 tracing log。 +在完成几轮交互后,studio 在 `~/AgentScope-Studio/database.sqlite` 中保存了 tracing log,其中包含了用户与 agent 的对话记录。 + +> **AgentScope 与 Studio 版本** +> +> 建议使用 AgentScope 及与之匹配的 Studio 版本: +> +> - AgentScope (v1.0.7) +> - Studio (23eb7c0b1185486d1baca36aea0ce8b85ea9de48) ## 2. 启动数据回流训练 在获得 tracing log(`database.sqlite`)后,接下来就能使用本项目的回流训练功能来训练一个 Agent。 -1. 配置参数中 `task_reader` 为 `tracing` 来使用回流模式。 +1. 乞丐配置文件中参数 `task_reader` 为 `tracing`,启用回流模式。 2. 依照需求,配置 `tracing` 中的数据库地址以及数据筛选设置。 3. 仿照正常的训练流程,配置其他参数与 Reward。 -在 `trace_feedback_training` 中已准备了一份示例 database 及相应的训练配置文件。 +在文件夹 `trace_feedback_training` 中已准备了一份示例 database 及相应的训练配置。 在一切准备妥当后,使用 launcher 启动训练。 From 682f8a339a2153b87e178622a840942ce65c1727 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Nov 2025 11:21:22 +0800 Subject: [PATCH 129/462] docs: update tutorial README for trace feedback training Former-commit-id: 4cc206d247ed8cc51fb59e99bc27a79ac7959562 --- tutorial/trace_feedback_training/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tutorial/trace_feedback_training/README.md b/tutorial/trace_feedback_training/README.md index 76bbca53..a9db86b7 100644 --- a/tutorial/trace_feedback_training/README.md +++ b/tutorial/trace_feedback_training/README.md @@ -4,9 +4,9 @@ ASTune 支持回收和利用 Agent 生产过程产生的聊天日志,不断训 ## 1. 准备数据 -为使用回流数据训练,假设已经有一个基于 agentscope 构建的 Agent,且连接在 studio 上运行了一段时间。 +为使用回流数据训练,应当已经有一个基于 agentscope 构建的 Agent,且连接在 studio 上运行了一段时间。 -在本示例中,我们在 `agent_deployed.py` 中实现了一个能用于解决数学问题的 agent。现在,我们将先使用它模拟数据收集的过程。 +在本示例中,我们在 `agent_deployed.py` 实现了一个能用于解决数学问题的 agent。为方便演示,我们首先使用它模拟数据收集的过程。 1. 安装 [agentscope-studio](https://github.com/agentscope-ai/agentscope-studio)。 2. 依照默认端口设置启动 agentscope-studio。 @@ -25,7 +25,7 @@ ASTune 支持回收和利用 Agent 生产过程产生的聊天日志,不断训 在获得 tracing log(`database.sqlite`)后,接下来就能使用本项目的回流训练功能来训练一个 Agent。 -1. 乞丐配置文件中参数 `task_reader` 为 `tracing`,启用回流模式。 +1. 修改配置文件中参数 `task_reader` 为 `tracing`,启用回流模式。 2. 依照需求,配置 `tracing` 中的数据库地址以及数据筛选设置。 3. 仿照正常的训练流程,配置其他参数与 Reward。 @@ -35,4 +35,8 @@ ASTune 支持回收和利用 Agent 生产过程产生的聊天日志,不断训 ```bash python launcher.py --conf tutorial/trace_feedback_training/trace_feedback_training.yaml --backbone='trinity' --with-ray -``` \ No newline at end of file +``` + +## 3. 部署新的 Agent + +现在,可以将全新的 Agent 部署到生产环境,最终实现迭代式的回流数据训练增强。 \ No newline at end of file From 521040d4ac24af040f3405846a3ad8386e469324 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Nov 2025 11:22:25 +0800 Subject: [PATCH 130/462] chore: update gitignore Former-commit-id: 73aac4d2711daf0d960991cf3bdb2bf9615bd8f4 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0951f429..9f8651f7 100644 --- a/.gitignore +++ b/.gitignore @@ -139,3 +139,4 @@ launcher_record trinity_checkpoints astune_test +/_resources \ No newline at end of file From 9b66497db83e5516cc8cb406f73e8d91a8959856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=BE=E5=A4=A9?= Date: Mon, 24 Nov 2025 11:59:46 +0800 Subject: [PATCH 131/462] Fix some bugs in Generatior Base Class. --- astune/data_generator/data_generator_base.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/astune/data_generator/data_generator_base.py b/astune/data_generator/data_generator_base.py index 7b21701a..6dd8c673 100644 --- a/astune/data_generator/data_generator_base.py +++ b/astune/data_generator/data_generator_base.py @@ -1,13 +1,10 @@ -from typing import List, Optional, Dict, Any +from typing import List, Optional, Dict, Any, Union from astune.schema.task import Task from astune.schema.document import Document from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn class DataGeneratorBase: - def __init__( - self, - config - ): + def __init__(self, config): """ Initialize the TaskGeneratorBase class. @@ -15,7 +12,7 @@ def __init__( config: Optional configuration object (LLM model, Maximum response length) """ self.config = config - + self.sampling_params = self.config.astune.data_generator.sampling_params or {} self.llm_client = construct_alien_llm_chat_fn( alien_llm_model=self.config.astune.data_generator.llm_model, alien_llm_response_length=self.config.astune.data_generator.llm_response_length From e8e75d61eba99e4bf5d9a1f4682498c19bf52a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=BE=E5=A4=A9?= Date: Mon, 24 Nov 2025 12:04:00 +0800 Subject: [PATCH 132/462] Add Task Augmentation. --- astune/data_generator/task_augmentation.py | 156 +++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 astune/data_generator/task_augmentation.py diff --git a/astune/data_generator/task_augmentation.py b/astune/data_generator/task_augmentation.py new file mode 100644 index 00000000..3ebdc5d7 --- /dev/null +++ b/astune/data_generator/task_augmentation.py @@ -0,0 +1,156 @@ +import re +import json +from typing import Optional, Dict, Any +from astune.schema.task import Task +from astune.schema.document import Document +from astune.data_generator.data_generator_base import DataGeneratorBase + +class TaskAugmentor(DataGeneratorBase): + """ + Task Augmentation: + - Generate new queries based on reference Query (and optional Document) + """ + def _build_system_prompt( + self, + source_task: Optional[Task], + document: Optional[Document] = None, + ) -> str: + """ + Build system prompt for task augmentation. + The prompt adapts based on whether a document is provided. + """ + base_prompt = ( + "You are a professional expert in query generation.\n" + "Your goal is to generate ONE new user query that:\n" + "- Is semantically related to the reference query (similar topic/domain/intent),\n" + "- Preserves the original query's style, task type, and approximate length,\n" + "- Is natural, diverse, and fluent,\n" + "- Is NOT a direct copy or minor edit of the original query.\n" + ) + + # Conditional instructions based on document availability + document_instructions = "" + if document is not None and document.content: + document_instructions = ( + "\n" + "Document context is provided for reference:\n" + "- Infer the document's overall topic or domain (do NOT assume the query is tied to a specific paragraph),\n" + "- Ensure the new query is compatible with that overall topic/domain,\n" + "- The new query should feel naturally related to the document's theme.\n" + "\n" + ) + + # Output format requirements to ensure structured response + output_requirements = ( + "You MUST:\n" + "- Avoid copying the original text verbatim,\n" + "- Avoid minimal edits such as just changing a few words or reordering phrases,\n" + "- Avoid adding explanations or commentary,\n" + "- Output ONLY a valid JSON object with a single field 'query'.\n" + "\n" + 'Example output format:\n' + '{"query": ""}\n' + ) + + return base_prompt + document_instructions + output_requirements + + def _build_user_prompt( + self, + source_task: Optional[Task], + document: Optional[Document] = None, + ) -> str: + """ + Build user prompt for task augmentation. + Handles both document-present and document-absent scenarios. + """ + if source_task is None or not source_task.main_query: + raise ValueError("TaskAugmentor requires a task for reference.") + + original_query = source_task.main_query + + # Build the reference part (query + optional document) + reference_info = ( + "Reference information:\n" + f"[Query]: {original_query}\n" + ) + + # Add document content if provided + doc_part = "" + if document is not None and document.content: + # Only add document-related content if a document is actually provided + reference_info += "[Document]:\n" + doc_part = ( + "Here is the reference document content:\n" + f"{document.content}\n" + "\n" + "Use this document as background knowledge while generating a new query.\n" + ) + + user_prompt = ( + f"{reference_info}" + f"{doc_part}" + "\n" + "Now, generate ONE new user query that is suitable for the same context.\n" + "\n" + "Important rules:\n" + "- Do NOT directly copy or minimally edit the original query.\n" + "- Do NOT output explanations, comments, or any extra text.\n" + "- Output ONLY a JSON object with the following structure:\n" + '{"query": ""}\n' + ) + + return user_prompt + def _parse_llm_output_to_task( + self, + raw_response: Any, + source_task: Optional[Task], + document: Optional[Document] = None, + extra_metadata: Optional[Dict[str, Any]] = None, + ) -> Task: + """ + Parse LLM output and convert it to a Task object. + """ + # Handle different response formats from various LLM clients + if isinstance(raw_response, dict) and "content" in raw_response: + # Compatible with certain client return structures + response = raw_response["content"] + else: + response = str(raw_response) + + # Parse JSON from LLM response + try: + data = self._parse_json_response(response) + except Exception as e: + raise ValueError(f"Failed to parse LLM JSON output: {e}. Raw response: {response}") + + # Extract the generated query from parsed JSON + new_query = data.get("query", "").strip() + if not new_query: + raise ValueError(f"No 'query' field found in LLM output JSON. Raw JSON: {data}") + + # Construct metadata for the new task + new_metadata = {} + if extra_metadata: + new_metadata.update(extra_metadata) + # Store provenance information for traceability + new_metadata["source_task_id"] = source_task.task_id if source_task else "" + new_metadata["aug_type"] = "task_augmentation" + if document: + new_metadata["source_doc_id"] = document.doc_id + + new_task = Task( + main_query=new_query, + init_messages=[], + task_id="", # Will be assigned by the system later + env_type=source_task.env_type if source_task else "no_env", + metadata=new_metadata, + ) + return new_task + + def _parse_json_response(self, response: str) -> Optional[Dict[str, Any]]: + """ + Parse LLM response string into JSON. + """ + # Remove Markdown code block markers (```json and ```) if present + response = re.sub(r'^```json|```$', '', response, flags=re.MULTILINE).strip() + return json.loads(response) From 3ffd5bac66bc0930c1311a3211290db1eab13fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=BE=E5=A4=A9?= Date: Mon, 24 Nov 2025 14:06:21 +0800 Subject: [PATCH 133/462] Fix result error From 79fce025dc096548ec1b5938da572d66f70cf0c0 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Nov 2025 15:16:26 +0800 Subject: [PATCH 134/462] docs: update README for trace feedback training tutorial Former-commit-id: 4a8bfaa2765d540b2f8e37cb8aa3c1b5d5c359f8 --- tutorial/trace_feedback_training/README.md | 50 ++++++++++++---------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/tutorial/trace_feedback_training/README.md b/tutorial/trace_feedback_training/README.md index a9db86b7..396832a6 100644 --- a/tutorial/trace_feedback_training/README.md +++ b/tutorial/trace_feedback_training/README.md @@ -1,42 +1,46 @@ -# 从 Tracing Log 回流数据训练一个新的 Agent +# Training a New Agent from Tracing Logs -ASTune 支持回收和利用 Agent 生产过程产生的聊天日志,不断训练、提升 Agent 表现。在该文档中,我们将展示如何从 Tracing Log 回流数据训练一个 Agent。 +ASTune allows you to recycle the chat logs generated during an Agent’s execution and continuously improve the Agent through iterative training. +This document demonstrates how to train an Agent using tracing log feedback. -## 1. 准备数据 +## 1. Preparing the Data -为使用回流数据训练,应当已经有一个基于 agentscope 构建的 Agent,且连接在 studio 上运行了一段时间。 +To use tracing logs for training, you must already have an Agent built with **agentscope** running in **agentscope-studio** for some time. -在本示例中,我们在 `agent_deployed.py` 实现了一个能用于解决数学问题的 agent。为方便演示,我们首先使用它模拟数据收集的过程。 +In this example, we implement a math-problem-solving agent in `agent_deployed.py`. +To demonstrate the workflow, we will first simulate the data-collection process. -1. 安装 [agentscope-studio](https://github.com/agentscope-ai/agentscope-studio)。 -2. 依照默认端口设置启动 agentscope-studio。 -3. 运行 `agent_deployed.py`,并模拟用户与 agent 聊天交互。 +1. Install [agentscope-studio](https://github.com/agentscope-ai/agentscope-studio). +2. Start agentscope-studio with the default port settings. +3. Run `agent_deployed.py` and simulate user–agent conversations. -在完成几轮交互后,studio 在 `~/AgentScope-Studio/database.sqlite` 中保存了 tracing log,其中包含了用户与 agent 的对话记录。 +After several rounds of interaction, studio will store the tracing logs in +`~/AgentScope-Studio/database.sqlite`, containing all recorded dialogues between the user and the agent. -> **AgentScope 与 Studio 版本** +> **AgentScope & Studio Version Compatibility** > -> 建议使用 AgentScope 及与之匹配的 Studio 版本: -> -> - AgentScope (v1.0.7) -> - Studio (23eb7c0b1185486d1baca36aea0ce8b85ea9de48) +> It is recommended to use matched versions: +> +> * AgentScope (v1.0.7) +> * Studio (23eb7c0b1185486d1baca36aea0ce8b85ea9de48) -## 2. 启动数据回流训练 +## 2. Starting Trace-Feedback Training -在获得 tracing log(`database.sqlite`)后,接下来就能使用本项目的回流训练功能来训练一个 Agent。 +Once you have the tracing log (`database.sqlite`), you can use the trace-feedback training module to train a new Agent. -1. 修改配置文件中参数 `task_reader` 为 `tracing`,启用回流模式。 -2. 依照需求,配置 `tracing` 中的数据库地址以及数据筛选设置。 -3. 仿照正常的训练流程,配置其他参数与 Reward。 +1. Set the `task_reader` parameter to `tracing` in the configuration file to enable trace-feedback mode. +2. Configure the `tracing` section with the database path and filtering options. +3. Configure other training parameters and Rewards as you would in a normal training workflow. -在文件夹 `trace_feedback_training` 中已准备了一份示例 database 及相应的训练配置。 +An example database and configuration file are provided under +`trace_feedback_training/`. -在一切准备妥当后,使用 launcher 启动训练。 +When everything is ready, start the training with: ```bash python launcher.py --conf tutorial/trace_feedback_training/trace_feedback_training.yaml --backbone='trinity' --with-ray ``` -## 3. 部署新的 Agent +## 3. Deploying the New Agent -现在,可以将全新的 Agent 部署到生产环境,最终实现迭代式的回流数据训练增强。 \ No newline at end of file +You can now deploy the newly trained Agent into production, enabling continuous improvement through iterative trace-feedback training. \ No newline at end of file From 464668e6606fdc0d7d40c04a86de57d0d5e22aaa Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 16:03:42 +0800 Subject: [PATCH 135/462] fix: update README and configuration for clarity; enhance multi-agent context tracking and math agent parameters --- README.md | 2 +- .../agentscope_tracker/multiagent_tracking.py | 23 ++++++++++++++++++- astune/task_rollout/async_llm_bridge.py | 2 +- astune/utils/compute_madness.py | 1 - launcher.py | 1 + tutorial/example_math_agent/math_agent.py | 3 ++- tutorial/example_math_agent/math_agent.yaml | 18 +++++++++++---- 7 files changed, 40 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b8a47184..2707d52c 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi - [x] TRINITY CONF MAP ``` - python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray ``` diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 7876b5e4..7f803516 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -24,7 +24,7 @@ NestedJsonItem, SeqItem, ) - +import json class MultiAgentContextTracking(BasicContextTracker): @@ -53,6 +53,9 @@ def step_prepare(self, messages: List[dict], tools: List = []): if disable_toolcalls: consider_roles.remove("tool") tools = [] + else: + # rerank tool parameters to improve compatibility + for i in range(len(tools)): tools[i]['function']['parameters'] = tools[i]['function'].pop('parameters') for i, msg in enumerate(messages): if (disable_toolcalls) and (not isinstance(msg["content"], str)): @@ -127,6 +130,24 @@ def step_track( token_generator = "manual" if llm_output.get("tool_calls", None) is not None: tool_calls = llm_output["tool_calls"] + if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): + # check tool call formating + copy_tool_calls = copy.deepcopy(tool_calls) + wrong_toolcall = False + for i in range(len(copy_tool_calls)): + from vsdb import bp; bp("TOOL_CALL_PARSE_2") + if ('function' in copy_tool_calls[i]) and ('arguments' in copy_tool_calls[i]['function']): + try: + copy_tool_calls[i]['function']['arguments'] = json.loads(copy_tool_calls[i]['function']['arguments']) + if isinstance(copy_tool_calls[i]['function']['arguments'], str): + wrong_toolcall = True + except: + wrong_toolcall = True + else: + wrong_toolcall = True + if wrong_toolcall: + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") + self.already_mad_flag = True else: tool_calls = [] diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 8216600d..8949b75e 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -257,8 +257,8 @@ async def __call__( content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] ) # run llm inference ✨ + # from vsdb import bp; bp("TOOL_CALL_PARSE5") llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) - from vsdb import bp; bp("TOOL_CALL_PARSE") # begin context tracking self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) diff --git a/astune/utils/compute_madness.py b/astune/utils/compute_madness.py index d2843409..96f321ba 100644 --- a/astune/utils/compute_madness.py +++ b/astune/utils/compute_madness.py @@ -75,7 +75,6 @@ def compute_string_madness(completion, detail=False, checklist=["nonsense"]) -> all_reward += compute_string_madness_char(completion, detail=detail) elif ("nonsense" in checklist) and ("non_ascii" not in checklist): all_reward += compute_string_madness_char(completion, detail=detail, skip_non_ascii=True) - if "format_type_1" in checklist: all_reward += compute_string_madness_format(completion, detail=detail, format_type="type_1") diff --git a/launcher.py b/launcher.py index b5e685dc..3bd75768 100644 --- a/launcher.py +++ b/launcher.py @@ -159,6 +159,7 @@ def main(): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.db env["RAY_record_task_actor_creation_sites"] = "true" + assert exp_config.astune.rollout.max_env_worker <= 4 # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index 2a5e497f..3c294f15 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -25,7 +25,7 @@ def extract_final_answer(result) -> str: class FinalResult(BaseModel): result: str = Field( - description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" + description=r"Your solution of the given math problem. Put your final answer in boxed format, e.g., \boxed{42}" ) @@ -59,6 +59,7 @@ async def agentscope_execute( formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), + max_iters=4, ) self.agent.set_console_output_enabled(False) msg = Msg("user", query, role="user") diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index a5757be0..bb0572dd 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -20,17 +20,25 @@ astune: rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 0.7 - max_env_worker: 80 - num_repeat: 4 - agent_madness_reward: 0.0 - + max_env_worker: 256 + num_repeat: 8 + agent_madness_reward: -1.0 + multi_turn: + max_sample_per_task: 2 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" data: - train_batch_size: 64 + train_batch_size: 16 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 + trainer_common: + save_freq: 100 + test_freq: 100 + # ------------------ 不需要修改 ------------------ hydra: From 92479a77611c45ae099ce142ccc2231ee214a1b3 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Nov 2025 16:10:28 +0800 Subject: [PATCH 136/462] chore: remove unused file Former-commit-id: b5175d76749817d4f5650179d4bb98aa0f710693 --- .../task_reader/tracing_reader/llm_client.py | 286 ------------------ 1 file changed, 286 deletions(-) delete mode 100644 astune/task_reader/tracing_reader/llm_client.py diff --git a/astune/task_reader/tracing_reader/llm_client.py b/astune/task_reader/tracing_reader/llm_client.py deleted file mode 100644 index fa253141..00000000 --- a/astune/task_reader/tracing_reader/llm_client.py +++ /dev/null @@ -1,286 +0,0 @@ -from abc import ABC, abstractmethod -import json -import os -import time -from typing import Any, Optional, Protocol, Iterator, Generator, cast - -from loguru import logger -import requests - -class LlmException(Exception): - def __init__(self,typ: str): - self._type=typ - - @property - def typ(self): - return self._type - - -class DashScopeClient: - """Aliyun DashScope API Client""" - - def __init__(self, api_key: Optional[str] = None, model_name: str = "qwen-plus", - temperature: float = 0.7, max_tokens: int = 2048): - self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY") - if not self.api_key: - raise ValueError("API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly.") - - self.model_name = model_name - self.temperature = temperature - self.max_tokens = max_tokens - self.base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1" - - self.headers = { - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json" - } - - def set_model(self, model_name: str): - """ - Sets the model name for the DashScopeClient instance. - - Args: - model_name (str): The name of the model to be used for API interactions. - """ - self.model_name = model_name # ⭐ Assigns the provided model name to the instance variable - - def chat(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> str: - """ - Sends a chat request to the LLM, aggregates the streaming responses, and returns the complete response. - - Args: - messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. - sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the LLM. - - Returns: - str: The complete response from the LLM as a single string. - """ - res = "" - for x in self.chat_stream(messages, sampling_params): # ⭐ Aggregates the streaming responses into a single string - res += x - return res - - def chat_stream(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> Generator[str, None, None]: - """ - Initiates a streaming chat session and returns a generator that yields the response as it is being generated. - - Args: - messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. - sampling_params (dict[str, Any]): Parameters for controlling the sampling behavior of the model. - - Returns: - Generator[str, None, None]: A generator that yields the response text as it is being generated. - """ - return self.chat_stream_with_retry(messages, **sampling_params) # ⭐ Calls the retry mechanism for streaming chat - - def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, **kwargs) -> str | Generator[str, None, None]: - """ - Sends a request to the chat completion API, supporting both non-streaming and streaming modes, and handles various exceptions. - - Args: - messages (list[dict[str, str]]): A list of message objects, each containing 'role' and 'content'. - stream (bool, optional): If True, the response will be streamed. Defaults to False. - **kwargs: Additional parameters to be passed to the API. - - Returns: - str | Generator[str, None, None]: The full response text if not streaming, or a generator yielding the response text if streaming. - """ - url = f"{self.base_url}/chat/completions" - - # Merge parameters - params = { - "model": self.model_name, - "messages": messages, - "temperature": self.temperature, - "max_tokens": self.max_tokens, - "stream": stream, - **kwargs - } - - try: - if stream: - return self._handle_stream_response(url, params) # ⭐ Handles the streaming response - else: - return self._handle_normal_response(url, params) # ⭐ Handles the non-streaming response - - except requests.exceptions.RequestException as e: - logger.error(f"API request failed: {e}") - return "" if not stream else (x for x in []) - except json.JSONDecodeError as e: - logger.error(f"Failed to parse API response: {e}") - return "" if not stream else (x for x in []) - except Exception as e: - logger.error(f"Unexpected error in API call: {e}") - return "" if not stream else (x for x in []) - - def _handle_normal_response(self, url: str, params: dict) -> str: - """ - Handles the non-streaming (normal) response from the API. - - Args: - url (str): The URL to which the POST request is sent. - params (dict): The parameters to be included in the JSON body of the POST request. - - Returns: - str: The content of the first choice's message in the response, or an empty string if the response format is unexpected. - """ - response = requests.post(url, headers=self.headers, json=params, timeout=600) # ⭐ Sends the POST request to the API - if not response.ok: - # check inappropriate content - try: - error_json=response.json()['error'] - if "inappropriate content" in error_json['message']: - raise LlmException("inappropriate content") - if "limit" in error_json['message']: - raise LlmException("hit limit") - except LlmException as e: - raise - except: - logger.error(f"API request failed: {response.text}") - response.raise_for_status() - - result = response.json() - if "choices" in result and len(result["choices"]) > 0: - return result["choices"][0]["message"]["content"].strip() # ⭐ Extracts and returns the content of the first choice's message - else: - logger.error(f"Unexpected response format: {result}") - return "" - - def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None, None]: - """ - Handles the streaming response from a POST request to the specified URL. - - Args: - url (str): The URL to which the POST request is sent. - params (dict): The parameters to be sent with the POST request. - - Yields: - str: The content of the response, if it meets the specified conditions. - """ - response = requests.post(url, headers=self.headers, json=params, stream=True, timeout=600) # ⭐ Send the POST request and get the streaming response - if not response.ok: - # check inappropriate content - try: - error_json=response.json()['error'] - if "inappropriate content" in error_json['message']: - raise LlmException("inappropriate content") - if "limit" in error_json['message']: - raise LlmException("hit limit") - except LlmException as e: - raise - except: - logger.error(f"API request failed: {response.text}") - response.raise_for_status() - - for line in response.iter_lines(): - if line: - line = line.decode('utf-8') - if line.startswith('data: '): - data = line[6:] # remove the prefix 'data: ' - if data == '[DONE]': - break - - try: - chunk = json.loads(data) - if "choices" in chunk and len(chunk["choices"]) > 0: - choice = chunk["choices"][0] - if "delta" in choice and "content" in choice["delta"]: - content = choice["delta"]["content"] - if content: - yield content # ⭐ Yield the content if it meets the conditions - except json.JSONDecodeError: - continue # skip the bad line - - def chat_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, - retry_delay: float = 1.0, **kwargs) -> str: - """ - Sends a chat completion request to the LLM with a retry mechanism. - - Args: - messages (list[dict[str, str]]): A list of message dictionaries for the chat. - max_retries (int, optional): Maximum number of retries. Defaults to 3. - retry_delay (float, optional): Initial delay between retries in seconds. Defaults to 1.0. - **kwargs: Additional keyword arguments to be passed to the `chat_completion` method. - - Returns: - str: The response from the LLM or a predefined message if all attempts fail. - """ - for attempt in range(max_retries): - try: - result = cast(str,self.chat_completion(messages, stream=False, **kwargs)) # ⭐ Attempt to get a chat completion - if result: # If a valid response is obtained - return result - - except LlmException as e: - if e.typ=='inappropriate content': - logger.warning(f"llm return inappropriate content, which is blocked by the remote") - return "[inappropriate content]" - except Exception as e: - logger.warning(f"Attempt {attempt + 1} failed: {e}") - - if attempt < max_retries - 1: # Not the last attempt - time.sleep(retry_delay * (2 ** attempt)) # Exponential backoff - - logger.error(f"All {max_retries} attempts failed") - return "" - - def chat_stream_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, - retry_delay: float = 10.0, **kwargs) -> Generator[str, None, None]: - """ - Attempts to establish a streaming chat completion with a retry mechanism. - - Args: - messages (list[dict[str, str]]): A list of message dictionaries, each containing 'role' and 'content'. - max_retries (int, optional): The maximum number of retry attempts. Defaults to 3. - retry_delay (float, optional): The initial delay in seconds before the first retry. Defaults to 10.0. - **kwargs: Additional keyword arguments to pass to the chat_completion method. - - Yields: - str: Chunks of the streaming response. - """ - for attempt in range(max_retries): - try: - stream_generator = cast(Generator[str, None, None], self.chat_completion(messages, stream=True, **kwargs)) # ⭐ Cast the generator to the appropriate type - # try to fetch the first chunk to verify the connection - first_chunk = next(stream_generator, None) - if first_chunk is not None: - yield first_chunk - # yield the rest chunks - for chunk in stream_generator: - yield chunk - return # success - except LlmException as e: - if e.typ=='inappropriate content': - logger.warning(f"llm return inappropriate content, which is blocked by the remote") - yield "[inappropriate content]" - return - except Exception as e: - logger.warning(f"Stream attempt {attempt + 1} failed: {e}") - - if attempt < max_retries - 1: - time.sleep(retry_delay * (2 ** attempt)) - - logger.error(f"All {max_retries} stream attempts failed") - - return - - -# demo -if __name__ == "__main__": - client = DashScopeClient(model_name='qwq-32b') - - messages = [ - {"role": "user", "content": "Write a poem about Spring."} - ] - - # print("=== request ===") - # response = client.chat_completion(messages) - # print(response) - - print("\n=== streaming ===") - for chunk in client.chat_completion(messages, stream=True): - print(chunk, end='', flush=True) - - print("\n\n=== streaming with retry ===") - for chunk in client.chat_stream(messages, {}): - print(chunk, end='', flush=True) \ No newline at end of file From 3e3a6fcc6b48af8a0d3e0cf80489e9b0627b857a Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 16:37:05 +0800 Subject: [PATCH 137/462] fix: update README for repository name consistency; improve tool call error handling in multi-agent tracking and adjust environment worker assertion in launcher --- README.md | 4 ++-- .../agentscope_tracker/multiagent_tracking.py | 8 ++++++-- launcher.py | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2707d52c..b4ba8cde 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j 1. Clone the repo and trinity module: ```bash - git clone https://github.com/..../agentscope-tune.git astune + git clone https://github.com/..../agentscope-tuner.git astune git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity cd astune ``` @@ -194,7 +194,7 @@ python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='verl' -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 7f803516..836140fa 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -128,14 +128,14 @@ def step_track( # dummy response for now token_generator = "manual" - if llm_output.get("tool_calls", None) is not None: + if (llm_output.get("tool_calls", None) is not None): tool_calls = llm_output["tool_calls"] if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): # check tool call formating copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False for i in range(len(copy_tool_calls)): - from vsdb import bp; bp("TOOL_CALL_PARSE_2") + from vsdb import bp; bp("UPUP1") if ('function' in copy_tool_calls[i]) and ('arguments' in copy_tool_calls[i]['function']): try: copy_tool_calls[i]['function']['arguments'] = json.loads(copy_tool_calls[i]['function']['arguments']) @@ -148,6 +148,10 @@ def step_track( if wrong_toolcall: logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") self.already_mad_flag = True + elif ('' in llm_output["content"]): + from vsdb import bp; bp("UPUP2") + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") + self.already_mad_flag = True else: tool_calls = [] diff --git a/launcher.py b/launcher.py index 3bd75768..ff37380c 100644 --- a/launcher.py +++ b/launcher.py @@ -159,7 +159,7 @@ def main(): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.db env["RAY_record_task_actor_creation_sites"] = "true" - assert exp_config.astune.rollout.max_env_worker <= 4 # type: ignore + assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4 # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") From 105fc8a713e9e27fae8ed4fc2519bcf9235d354b Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Nov 2025 17:49:28 +0800 Subject: [PATCH 138/462] refactor: move filters to data_generator --- .../tracing_reader/filters => data_generator}/__init__.py | 0 astune/data_generator/filters/__init__.py | 0 .../tracing_reader => data_generator}/filters/base.py | 0 .../tracing_reader => data_generator}/filters/factory.py | 0 .../filters/llm_evaluate_filter.py | 2 +- astune/task_reader/tracing_reader/__init__.py | 7 ++----- astune/{task_reader/tracing_reader => utils}/fn.py | 0 7 files changed, 3 insertions(+), 6 deletions(-) rename astune/{task_reader/tracing_reader/filters => data_generator}/__init__.py (100%) create mode 100644 astune/data_generator/filters/__init__.py rename astune/{task_reader/tracing_reader => data_generator}/filters/base.py (100%) rename astune/{task_reader/tracing_reader => data_generator}/filters/factory.py (100%) rename astune/{task_reader/tracing_reader => data_generator}/filters/llm_evaluate_filter.py (99%) rename astune/{task_reader/tracing_reader => utils}/fn.py (100%) diff --git a/astune/task_reader/tracing_reader/filters/__init__.py b/astune/data_generator/__init__.py similarity index 100% rename from astune/task_reader/tracing_reader/filters/__init__.py rename to astune/data_generator/__init__.py diff --git a/astune/data_generator/filters/__init__.py b/astune/data_generator/filters/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/astune/task_reader/tracing_reader/filters/base.py b/astune/data_generator/filters/base.py similarity index 100% rename from astune/task_reader/tracing_reader/filters/base.py rename to astune/data_generator/filters/base.py diff --git a/astune/task_reader/tracing_reader/filters/factory.py b/astune/data_generator/filters/factory.py similarity index 100% rename from astune/task_reader/tracing_reader/filters/factory.py rename to astune/data_generator/filters/factory.py diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/data_generator/filters/llm_evaluate_filter.py similarity index 99% rename from astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py rename to astune/data_generator/filters/llm_evaluate_filter.py index 4482ed23..c9548b33 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/data_generator/filters/llm_evaluate_filter.py @@ -5,7 +5,7 @@ construct_alien_llm_chat_fn, ) -from ..fn import Fn +from astune.utils.fn import Fn from .base import Filter diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 37eb5b02..eedb6305 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -5,11 +5,8 @@ import random from astune.schema.task import Task -from astune.task_reader.tracing_reader.filters.base import Filter -from astune.task_reader.tracing_reader.filters.factory import build_filters -from astune.task_reader.tracing_reader.filters.llm_evaluate_filter import ( - LlmEvaluateFilter, -) +from astune.data_generator.filters.base import Filter +from astune.data_generator.filters.factory import build_filters from ..task_reader_base import TaskReaderBase from .connector import LocalSqliteConnectorV1, PhoenixConnector diff --git a/astune/task_reader/tracing_reader/fn.py b/astune/utils/fn.py similarity index 100% rename from astune/task_reader/tracing_reader/fn.py rename to astune/utils/fn.py From 31d5a27b9ade708781286bd8b456c0ed8508f56c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 19:23:08 +0800 Subject: [PATCH 139/462] fix: update tensor model parallel size and max sequences in configuration files for improved performance --- astune/default_config/astune_default.yaml | 2 ++ tutorial/example_math_agent/math_agent.yaml | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 7baea34a..f468d0ca 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -63,6 +63,8 @@ astune: step_skip_action: 0 # skip action generation every N steps, 0 means never skip submit_oversample_multiplier: 1.5 enable_oversample: True + tensor_model_parallel_size: 1 + max_num_seqs: 10 num_repeat: 4 name: vllm val_kwargs: diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index bb0572dd..302dc077 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,7 +15,7 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent @@ -23,13 +23,15 @@ astune: max_env_worker: 256 num_repeat: 8 agent_madness_reward: -1.0 + tensor_model_parallel_size: 4 + max_num_seqs: 256 multi_turn: - max_sample_per_task: 2 + max_sample_per_task: 4 compute_madness_checklist: - "nonsense" - "wrong_toolcall" data: - train_batch_size: 16 + train_batch_size: 128 debug: debug_max_parallel: 1 From 764c0237c9e974aa276b31436ab681250322501c Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Mon, 24 Nov 2025 21:46:44 +0800 Subject: [PATCH 140/462] add unittest tools --- .github/workflows/docker/docker-compose.yaml | 25 ++++ .github/workflows/pre-commit.yaml | 13 ++ .github/workflows/unittest.yaml | 147 +++++++++++++++++++ pyproject.toml | 84 +++++++++++ scripts/docker/dockerfile | 41 ++++++ 5 files changed, 310 insertions(+) create mode 100644 .github/workflows/docker/docker-compose.yaml create mode 100644 .github/workflows/pre-commit.yaml create mode 100644 .github/workflows/unittest.yaml create mode 100644 pyproject.toml create mode 100644 scripts/docker/dockerfile diff --git a/.github/workflows/docker/docker-compose.yaml b/.github/workflows/docker/docker-compose.yaml new file mode 100644 index 00000000..f33e0b3d --- /dev/null +++ b/.github/workflows/docker/docker-compose.yaml @@ -0,0 +1,25 @@ +services: + + astune-node-1: + image: agentscope-tuner-unittest:latest + pull_policy: never + command: sh -c "uv pip install -e .[dev]" + environment: + - HF_ENDPOINT=https://hf-mirror.com + - RAY_ADDRESS=auto + working_dir: /workspace + volumes: + - astune-volume:/mnt + - ../../..:/workspace + shm_size: "64G" + deploy: + resources: + reservations: + devices: + - driver: nvidia + device_ids: ['0', '1', '2', '3'] + capabilities: [gpu] + +volumes: + astune-volume: + external: true diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml new file mode 100644 index 00000000..89b771e6 --- /dev/null +++ b/.github/workflows/pre-commit.yaml @@ -0,0 +1,13 @@ +name: pre-commit + +on: [push, pull_request] + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v4 + with: + python-version: '3.11' + - uses: pre-commit/action@v3.0.0 diff --git a/.github/workflows/unittest.yaml b/.github/workflows/unittest.yaml new file mode 100644 index 00000000..3a715896 --- /dev/null +++ b/.github/workflows/unittest.yaml @@ -0,0 +1,147 @@ +name: unittest + +on: + issue_comment: + types: [created] + +permissions: + contents: write + checks: write + pull-requests: write + +jobs: + unittest: + # only run on pull request + if: ${{ github.event.issue.pull_request && (startsWith(github.event.comment.body, '/unittest')) && github.event.comment.author_association == 'COLLABORATOR' }} + runs-on: self-hosted + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + path: astune-${{ github.run_id }} + ref: refs/pull/${{ github.event.issue.number }}/head + + - name: Setup docker compose + working-directory: astune-${{ github.run_id }}/.github/workflows/docker + run: | + docker compose up -d + sleep 15s + + - name: Check ray status + working-directory: astune-${{ github.run_id }}/.github/workflows/docker + run: | + MAX_RETRIES=20 + RETRY_INTERVAL=5 + for i in $(seq 1 $MAX_RETRIES); do + docker compose exec astune-node-1 ray status && docker compose exec astune-node-2 ray status && break + echo "Waiting for ray cluster to be ready... ($i/$MAX_RETRIES)" + sleep $RETRY_INTERVAL + if [ "$i" -eq "$MAX_RETRIES" ]; then + echo "Ray cluster failed to start after $MAX_RETRIES retries." + exit 1 + fi + done + + - name: Decide test type + id: test_type + working-directory: astune-${{ github.run_id }} + run: | + COMMENT="${{ github.event.comment.body }}" + if [[ "$COMMENT" == "/unittest-all"* ]]; then + echo "type=all" >> $GITHUB_OUTPUT + elif [[ "$COMMENT" == "/unittest-diff"* ]]; then + echo "type=diff" >> $GITHUB_OUTPUT + elif [[ "$COMMENT" =~ ^/unittest-module-(.+)$ ]]; then + MODULE=$(echo "$COMMENT" | sed -n 's/\/unittest-module-\(.*\)/\1/p') + echo "type=module" >> $GITHUB_OUTPUT + echo "module=$MODULE" >> $GITHUB_OUTPUT + else + echo "type=all" >> $GITHUB_OUTPUT + fi + + - name: Get changed modules (for diff) + if: steps.test_type.outputs.type == 'diff' + id: diff + working-directory: astune-${{ github.run_id }} + run: | + git fetch origin main + git diff --name-only origin/main...HEAD > changed_files.txt + awk -F/ '/^(astune)\// {print $2}' changed_files.txt | sort | uniq > changed_modules.txt + awk '{print "tests/"$1}' changed_modules.txt > test_dirs.txt + + - name: Run unittest + working-directory: astune-${{ github.run_id }}/.github/workflows/docker + run: | + TYPE="${{ steps.test_type.outputs.type }}" + if [ "$TYPE" = "all" ]; then + echo "tests_run=true" >> $GITHUB_ENV + docker compose exec astune-node-1 pytest tests -v -s --ctrf report.json + elif [ "$TYPE" = "diff" ]; then + if [ -s ../../../test_dirs.txt ]; then + echo "tests_run=true" >> $GITHUB_ENV + TEST_DIRS=$(cat ../../../test_dirs.txt | xargs) + docker compose exec astune-node-1 pytest $TEST_DIRS -v -s --ctrf report.json + else + echo "No changed modules detected, skipping tests." + echo "tests_run=false" >> $GITHUB_ENV + fi + elif [ "$TYPE" = "module" ]; then + MODULE="${{ steps.test_type.outputs.module }}" + if [ -n "$MODULE" ]; then + echo "tests_run=true" >> $GITHUB_ENV + docker compose exec astune-node-1 pytest tests/$MODULE -v -s --ctrf report.json + else + echo "No module specified, skipping tests." + echo "tests_run=false" >> $GITHUB_ENV + fi + fi + + - name: Convert report.json time to ms + working-directory: astune-${{ github.run_id }} + if: env.tests_run == 'true' || failure() + run: | + REPORT=report.json + if [ -f "$REPORT" ]; then + jq '(.results.tests[] | .duration, .start, .stop) |= (. * 1000) | (.results.summary.start, .results.summary.stop) |= (. * 1000)' "$REPORT" > "$REPORT.tmp" && mv "$REPORT.tmp" "$REPORT" + fi + + - name: Clean checkpoint dir + working-directory: astune-${{ github.run_id }}/.github/workflows/docker + if: always() + run: | + docker compose exec astune-node-1 rm -rf /mnt/checkpoints/* + continue-on-error: true + + - name: Upload test results + if: env.tests_run == 'true' || failure() + uses: actions/upload-artifact@v4 + with: + name: pytest-results + path: astune-${{ github.run_id }}/report.json + continue-on-error: true + + - name: Publish Test Report + if: env.tests_run == 'true' || failure() + uses: ctrf-io/github-test-reporter@v1 + with: + report-path: astune-${{ github.run_id }}/report.json + summary: true + pull-request: false + issue: ${{ github.event.issue.number }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + continue-on-error: true + + - name: Remove docker compose + working-directory: astune-${{ github.run_id }}/.github/workflows/docker + if: always() + run: | + docker compose down --remove-orphans + continue-on-error: true + + - name: Cleanup workspace + if: always() + run: | + rm -rf astune-${{ github.run_id }} 2>/dev/null + continue-on-error: true diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..f314614a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,84 @@ +[build-system] +requires = ["setuptools>=65", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "AgentScope-Tuner" +version = "0.1.0" +readme = "README.md" +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12" +] +requires-python = ">=3.10,<3.13" +dependencies = [ + "agentscope>=1.0.7", + "trinity-rft>=0.3.2", + "loguru", + "pydantic", + "beast_logger", +] + + +[project.optional-dependencies] +dev = [ + "pre-commit>=2.17.0", + "black>=23.7.0", + "flake8>=6.1.0", + "flake8-docstrings>=1.6.0", + "isort>=5.12.0", + "mypy>=1.7.0", + "pytest>=8.0.0", + "pytest-json-ctrf", +] + +reward = [ + "rm_gallery>=0.1.5", +] + +flash_attn = [ + "flash-attn==2.8.1" +] + + +[tool.setuptools.packages.find] +where = ["."] +include = ["astune*"] +exclude = ["tests*", "docs*", "scripts*"] + +[tool.setuptools.package-data] +my_package = ["*.md", "*.rst"] + +[tool.black] +line-length = 100 +target-version = ["py310", "py311", "py312"] +include = '\.pyi?$' +exclude = ''' +/( + \.eggs + | \.git + | \.github + | \.vscode + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | _build + | build + | dist +)/ +''' + +[tool.isort] +known_third_party = ["wandb"] + +[tool.uv.extra-build-dependencies] +flash-attn = ["torch", "numpy", "setuptools"] + +[project.urls] +"Homepage" = "https://github.com/agentscope-ai/AgentScope-Tuner" diff --git a/scripts/docker/dockerfile b/scripts/docker/dockerfile new file mode 100644 index 00000000..54fd1fff --- /dev/null +++ b/scripts/docker/dockerfile @@ -0,0 +1,41 @@ +# Build and run the docker image with the following command: +# +# cd +# docker build -f scripts/docker/dockerfile -t astuner:latest . +# docker run -it --gpus all --shm-size="64g" --rm -v $PWD:/workspace -v :/data astuner:latest + + +FROM nvcr.io/nvidia/cuda:12.8.1-cudnn-devel-ubuntu22.04 + +WORKDIR /workspace + +RUN chmod 1777 /tmp && apt update && apt install -y \ + build-essential \ + curl git wget vim tmux net-tools \ + python3 python3-pip python3-dev python3-venv python3-packaging \ + libomp-dev infiniband-diags libibverbs-dev librdmacm-dev rdma-core perftest \ + && rm -rf /var/lib/apt/lists/* \ + && ln -sf /usr/bin/python3 /usr/bin/python \ + && ln -sf /usr/bin/pip3 /usr/bin/pip + +# For aliyun users, set pip source to aliyun mirror +ENV PIP_INDEX_URL=http://mirrors.cloud.aliyuncs.com/pypi/simple/ +ENV PIP_TRUSTED_HOST=mirrors.cloud.aliyuncs.com + +# set uv virtual environment path to a outside-of-workspace dir +ENV VIRTUAL_ENV=/opt/venv + +# copy the Agentscope-Tuner dir into the workspace +COPY . . + +# Install uv +RUN pip install uv + +# use uv to create a virtual environment and install dependencies +RUN uv venv /opt/venv --python=3.10.16 && \ + . /opt/venv/bin/activate && \ + uv pip install -e.[dev,flash_attn] + +# set entrypoint to activate the virtual environment +ENTRYPOINT ["/bin/bash", "-c", "source /opt/venv/bin/activate && exec \"$@\"", "--"] +CMD ["bash"] From 388b40811009fe9e57945eb0e9ba2d151dbe01de Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 08:33:20 +0800 Subject: [PATCH 141/462] fix: enhance tool call validation and error logging; update launcher assertions for debugging mode --- README.md | 1 + .../agentscope_tracker/multiagent_tracking.py | 19 +++++++++---- astune/task_rollout/async_llm_bridge.py | 28 ++++++++++++++----- launcher.py | 3 +- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index b4ba8cde..a255d8a7 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,7 @@ python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yam python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 836140fa..0c18af06 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -128,6 +128,7 @@ def step_track( # dummy response for now token_generator = "manual" + err_type = "" if (llm_output.get("tool_calls", None) is not None): tool_calls = llm_output["tool_calls"] if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): @@ -135,23 +136,31 @@ def step_track( copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False for i in range(len(copy_tool_calls)): - from vsdb import bp; bp("UPUP1") if ('function' in copy_tool_calls[i]) and ('arguments' in copy_tool_calls[i]['function']): try: - copy_tool_calls[i]['function']['arguments'] = json.loads(copy_tool_calls[i]['function']['arguments']) - if isinstance(copy_tool_calls[i]['function']['arguments'], str): + expect_dict = json.loads(copy_tool_calls[i]['function']['arguments']) + if not isinstance(expect_dict, dict): wrong_toolcall = True + err_type = "cannot parse arguments" + from vsdb import bp; bp("UPUP1") except: wrong_toolcall = True + err_type = "arguments not json" + from vsdb import bp; bp("UPUP3") else: wrong_toolcall = True + err_type = "no function or no arguments" + from vsdb import bp; bp("UPUP4") if wrong_toolcall: - logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n") self.already_mad_flag = True + else: + logger.success("Toolcall format check passed.") elif ('' in llm_output["content"]): from vsdb import bp; bp("UPUP2") - logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n") self.already_mad_flag = True + tool_calls = [] else: tool_calls = [] diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 8949b75e..90f67a4b 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -92,7 +92,7 @@ def llm_chat( # if tool call tool_calls = None - if ('' in decoded_text) and (not self.config.astune.rollout.agentscope_disable_toolcalls): + if ('' in decoded_text) and ('' in decoded_text) and (not self.config.astune.rollout.agentscope_disable_toolcalls): tool_parser = Hermes2ProToolParser(self.tokenizer) parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() @@ -100,11 +100,20 @@ def llm_chat( model_called = parsed_tool_calls['tools_called'] if model_called: tool_calls = parsed_tool_calls['tool_calls'] - # for i in range(len(tool_calls)): - # if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: - # tool_calls[i]['function']['arguments'] = json.loads(tool_calls[i]['function']['arguments']) - decoded_text = parsed_tool_calls['content'] - if decoded_text is None: decoded_text = "" + is_bad_toolcall = False + for i in range(len(tool_calls)): + if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: + expect_dict = json.loads(tool_calls[i]['function']['arguments']) + if not isinstance(expect_dict, dict): + from vsdb import bp; bp("UPUP5") + is_bad_toolcall = True + if is_bad_toolcall: + tool_calls = None + decoded_text = decoded_text + else: + decoded_text = parsed_tool_calls['content'] + if decoded_text is None: + decoded_text = "" return { "role": "assistant", @@ -185,13 +194,18 @@ async def main(): return response response = run_async_coro__no_matter_what(main(), timeout=1200) # type: ignore - + # from vsdb import bp; bp("TRR") + prompt_text = self.tokenizer.decode(response.model_extra['prompt_token_ids']) content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) if content is None: content = "" + if ('' in content) and (not message.get("tool_calls", None)): + logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") + logger.warning(f"Bad toolcall discovered {content}") + return { "role": "assistant", "request_id": response.id, diff --git a/launcher.py b/launcher.py index ff37380c..0840b4a4 100644 --- a/launcher.py +++ b/launcher.py @@ -159,10 +159,11 @@ def main(): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.db env["RAY_record_task_actor_creation_sites"] = "true" - assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4 # type: ignore + assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") + assert exp_config["astune"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": env["ASTUNE_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore From 6ce856203508aad86e94b9f5f36ac444f95b5014 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 08:33:22 +0800 Subject: [PATCH 142/462] fix: refactor trinity compatibility workflow; update storage type in config and adjust math agent training parameters --- astune/backbone/trinity_compat_workflow.py | 130 +++++++++--------- .../trinity/trinity_default.yaml | 4 +- astune/utils/config_utils.py | 41 +++--- tutorial/example_math_agent/math_agent.yaml | 7 +- 4 files changed, 91 insertions(+), 91 deletions(-) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index ad7bdf90..8d148874 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -8,12 +8,16 @@ from trinity.common.models.model import ModelWrapper from trinity.common.workflows.workflow import WORKFLOWS, Workflow from trinity.common.workflows.workflow import Task as TrinityTask -from trinity.buffer.reader import READER -from trinity.buffer.reader.file_reader import FileReader, TaskFileReader, _HFBatchReader -from trinity.buffer.buffer_reader import BufferReader -from trinity.buffer.reader.reader import READER -from trinity.buffer.schema.formatter import FORMATTER -from trinity.common.config import StorageConfig + +try: + from trinity.buffer.reader import READER + from trinity.buffer.reader.file_reader import FileReader, TaskFileReader, _HFBatchReader + from trinity.buffer.buffer_reader import BufferReader + from trinity.buffer.reader.reader import READER + from trinity.buffer.schema.formatter import FORMATTER + from trinity.common.config import StorageConfig +except ImportError: + pass from typing import List, Literal, Optional, cast from loguru import logger @@ -198,64 +202,58 @@ async def run_async(self): return exps -class CustomReader(TaskFileReader): - """A custom reader for testing.""" - - def __init__(self, config): - super().__init__(config) - - - - - -@READER.register_module("astune_workflow") -class AstuneTaskReader(TaskFileReader): - def __init__(self, config): - self.config = config - self.read_batch_size = config.batch_size - self.split = config.split - - yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) - if yaml_path is None: - raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") - astune_config = read_astune_config(yaml_path) - - from astune.task_reader import TaskReaderRouter, task_to_standard_dataset - task_reader = TaskReaderRouter(astune_config) - - dataset_segments = [] - if 'train' in self.split: - dataset_segments.append(task_to_standard_dataset(task_reader.get_training_tasks())) - if 'val' in self.split: - dataset_segments.append(task_to_standard_dataset(task_reader.get_validation_tasks())) - if not dataset_segments: - raise ValueError(f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'.") - - concatenated_dataset = ( - dataset_segments[0] - if len(dataset_segments) == 1 - else datasets.concatenate_datasets(dataset_segments) - ) - - # from vsdb import bp; bp("XXX") - self.dataset = _HFBatchReader( - concatenated_dataset, - name=self.config.name, - default_batch_size=self.read_batch_size, - total_epochs=self.config.total_epochs if not self.config.is_eval else 1, - offset=self.config.index, - drop_last=not self.config.is_eval, - total_steps=self.config.total_steps, - enable_progress_bar=self.config.enable_progress_bar, - ) - self.formatter = FORMATTER.get("task")(self.config) - def read(self, batch_size: Optional[int] = None) -> List: - # from vsdb import bp; bp("CCC") - batch_size = batch_size or self.read_batch_size - tasks = [] - samples, indices = self.dataset.read_batch(batch_size) - for sample in samples: - task = self.formatter.format(sample) - tasks.append(task) - return tasks +try: + @READER.register_module("astune") + class AstuneTaskReader(TaskFileReader): + def __init__(self, config): + self.config = config + self.read_batch_size = config.batch_size + self.split = config.split + + yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) + if yaml_path is None: + raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") + astune_config = read_astune_config(yaml_path) + + from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + task_reader = TaskReaderRouter(astune_config) + + dataset_segments = [] + if 'train' in self.split: + dataset_segments.append(task_to_standard_dataset(task_reader.get_training_tasks())) + if 'val' in self.split: + dataset_segments.append(task_to_standard_dataset(task_reader.get_validation_tasks())) + if not dataset_segments: + raise ValueError(f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'.") + + concatenated_dataset = ( + dataset_segments[0] + if len(dataset_segments) == 1 + else datasets.concatenate_datasets(dataset_segments) + ) + + # from vsdb import bp; bp("XXX") + self.dataset = _HFBatchReader( + concatenated_dataset, + name=self.config.name, + default_batch_size=self.read_batch_size, + total_epochs=self.config.total_epochs if not self.config.is_eval else 1, + offset=self.config.index, + drop_last=not self.config.is_eval, + total_steps=self.config.total_steps, + enable_progress_bar=self.config.enable_progress_bar, + ) + self.formatter = FORMATTER.get("task")(self.config) + + def read(self, batch_size: Optional[int] = None) -> List: + # from vsdb import bp; bp("CCC") + batch_size = batch_size or self.read_batch_size + tasks = [] + samples, indices = self.dataset.read_batch(batch_size) + for sample in samples: + task = self.formatter.format(sample) + tasks.append(task) + return tasks +except: + pass \ No newline at end of file diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index e4246867..52f7a552 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -18,7 +18,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 rollout_args: temperature: 1.0 split: train - storage_type: astune_workflow + storage_type: astune subset_name: appworld total_epochs: 1000 train_batch_size: 36 @@ -48,7 +48,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 tensor_parallel_size: 1 tool_call_parser: hermes runner_per_model: 8 - runner_state_report_interval: 30 + # runner_state_report_interval: 30 model: max_model_len: 21000 max_response_tokens: 16000 diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index 982ce4fc..b25ee429 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -64,6 +64,27 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone) logger.success("----------------------------------------------------") + if ("trinity" in from_config) and backbone == "trinity": + trinity_config = from_config["trinity"] + + def recursive_copy(src_dict, dst_dict, parent_key=""): + for key, value in src_dict.items(): + full_key = f"{parent_key}.{key}" if parent_key else key + if isinstance(value, dict): + if key not in dst_dict: + dst_dict[key] = {} + recursive_copy(value, dst_dict[key], full_key) + else: + dst_dict[key] = value + logger.info( + f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]" + ) + + recursive_copy(trinity_config, to_config) + + logger.success("----------------------------------------------------") + time.sleep(1) + for from_key, to_keys in convertion_json.items(): # get value from from_config keys = from_key.split(".") @@ -94,26 +115,6 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone) logger.success("----------------------------------------------------") time.sleep(1) - if ("trinity" in from_config) and backbone == "trinity": - trinity_config = from_config["trinity"] - - def recursive_copy(src_dict, dst_dict, parent_key=""): - for key, value in src_dict.items(): - full_key = f"{parent_key}.{key}" if parent_key else key - if isinstance(value, dict): - if key not in dst_dict: - dst_dict[key] = {} - recursive_copy(value, dst_dict[key], full_key) - else: - dst_dict[key] = value - logger.info( - f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]" - ) - - recursive_copy(trinity_config, to_config) - logger.success("----------------------------------------------------") - time.sleep(1) - # save to_config_fp with open(to_config_fp, "w") as file: yaml.dump(to_config, file) diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 302dc077..dfc7ddd8 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -31,15 +31,16 @@ astune: - "nonsense" - "wrong_toolcall" data: - train_batch_size: 128 + train_batch_size: 120 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 trainer_common: - save_freq: 100 - test_freq: 100 + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 # ------------------ 不需要修改 ------------------ From 9d56e7d4fce5af13327f90e6fb78444137ba294a Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 08:37:12 +0800 Subject: [PATCH 143/462] stage --- astune/backbone/trinity_compat_workflow.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index 8d148874..3bc233bb 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -4,6 +4,8 @@ import openai import datasets +from loguru import logger + from trinity.common.experience import Experience from trinity.common.models.model import ModelWrapper from trinity.common.workflows.workflow import WORKFLOWS, Workflow @@ -16,11 +18,12 @@ from trinity.buffer.reader.reader import READER from trinity.buffer.schema.formatter import FORMATTER from trinity.common.config import StorageConfig + logger.success("[New Trinity] Trinity imports successful.") except ImportError: + logger.success("[Old Trinity] Using old trinity.") pass from typing import List, Literal, Optional, cast -from loguru import logger from transformers import AutoTokenizer from astune.task_rollout.native_parallel_worker import DynamicRollout from astune.schema.trajectory import Sample From c6c9c9288f844fd5c13fec61223da1e997d318c2 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 09:04:16 +0800 Subject: [PATCH 144/462] fix: update logging for bad tool calls in AsyncLlmBridge; improve warning message format fix: correct model path in math_agent.yaml for consistency in training configuration --- astune/task_rollout/async_llm_bridge.py | 4 ++-- tutorial/example_math_agent/math_agent.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 90f67a4b..f4efd1f4 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -203,8 +203,8 @@ async def main(): content = "" if ('' in content) and (not message.get("tool_calls", None)): - logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") - logger.warning(f"Bad toolcall discovered {content}") + # logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") + logger.warning(f"Bad toolcall discovered: {content}") return { "role": "assistant", diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index dfc7ddd8..59c77e5c 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,7 +15,7 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent From 0533b95d834dcb63d63788de32d071845d0ecb03 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 16:03:42 +0800 Subject: [PATCH 145/462] fix: update README and configuration for clarity; enhance multi-agent context tracking and math agent parameters --- README.md | 2 +- .../agentscope_tracker/multiagent_tracking.py | 23 ++++++++++++++++++- astune/task_rollout/async_llm_bridge.py | 2 +- astune/utils/compute_madness.py | 1 - launcher.py | 1 + tutorial/example_math_agent/math_agent.py | 3 ++- tutorial/example_math_agent/math_agent.yaml | 18 +++++++++++---- 7 files changed, 40 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b8a47184..2707d52c 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi - [x] TRINITY CONF MAP ``` - python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray ``` diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 7876b5e4..7f803516 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -24,7 +24,7 @@ NestedJsonItem, SeqItem, ) - +import json class MultiAgentContextTracking(BasicContextTracker): @@ -53,6 +53,9 @@ def step_prepare(self, messages: List[dict], tools: List = []): if disable_toolcalls: consider_roles.remove("tool") tools = [] + else: + # rerank tool parameters to improve compatibility + for i in range(len(tools)): tools[i]['function']['parameters'] = tools[i]['function'].pop('parameters') for i, msg in enumerate(messages): if (disable_toolcalls) and (not isinstance(msg["content"], str)): @@ -127,6 +130,24 @@ def step_track( token_generator = "manual" if llm_output.get("tool_calls", None) is not None: tool_calls = llm_output["tool_calls"] + if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): + # check tool call formating + copy_tool_calls = copy.deepcopy(tool_calls) + wrong_toolcall = False + for i in range(len(copy_tool_calls)): + from vsdb import bp; bp("TOOL_CALL_PARSE_2") + if ('function' in copy_tool_calls[i]) and ('arguments' in copy_tool_calls[i]['function']): + try: + copy_tool_calls[i]['function']['arguments'] = json.loads(copy_tool_calls[i]['function']['arguments']) + if isinstance(copy_tool_calls[i]['function']['arguments'], str): + wrong_toolcall = True + except: + wrong_toolcall = True + else: + wrong_toolcall = True + if wrong_toolcall: + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") + self.already_mad_flag = True else: tool_calls = [] diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 8216600d..8949b75e 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -257,8 +257,8 @@ async def __call__( content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] ) # run llm inference ✨ + # from vsdb import bp; bp("TOOL_CALL_PARSE5") llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) - from vsdb import bp; bp("TOOL_CALL_PARSE") # begin context tracking self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) diff --git a/astune/utils/compute_madness.py b/astune/utils/compute_madness.py index d2843409..96f321ba 100644 --- a/astune/utils/compute_madness.py +++ b/astune/utils/compute_madness.py @@ -75,7 +75,6 @@ def compute_string_madness(completion, detail=False, checklist=["nonsense"]) -> all_reward += compute_string_madness_char(completion, detail=detail) elif ("nonsense" in checklist) and ("non_ascii" not in checklist): all_reward += compute_string_madness_char(completion, detail=detail, skip_non_ascii=True) - if "format_type_1" in checklist: all_reward += compute_string_madness_format(completion, detail=detail, format_type="type_1") diff --git a/launcher.py b/launcher.py index b5e685dc..3bd75768 100644 --- a/launcher.py +++ b/launcher.py @@ -159,6 +159,7 @@ def main(): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.db env["RAY_record_task_actor_creation_sites"] = "true" + assert exp_config.astune.rollout.max_env_worker <= 4 # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index 2a5e497f..3c294f15 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -25,7 +25,7 @@ def extract_final_answer(result) -> str: class FinalResult(BaseModel): result: str = Field( - description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" + description=r"Your solution of the given math problem. Put your final answer in boxed format, e.g., \boxed{42}" ) @@ -59,6 +59,7 @@ async def agentscope_execute( formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), + max_iters=4, ) self.agent.set_console_output_enabled(False) msg = Msg("user", query, role="user") diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index a5757be0..bb0572dd 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -20,17 +20,25 @@ astune: rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 0.7 - max_env_worker: 80 - num_repeat: 4 - agent_madness_reward: 0.0 - + max_env_worker: 256 + num_repeat: 8 + agent_madness_reward: -1.0 + multi_turn: + max_sample_per_task: 2 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" data: - train_batch_size: 64 + train_batch_size: 16 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 + trainer_common: + save_freq: 100 + test_freq: 100 + # ------------------ 不需要修改 ------------------ hydra: From cad1d1836a68439d612e717817d86abac502e758 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 16:37:05 +0800 Subject: [PATCH 146/462] fix: update README for repository name consistency; improve tool call error handling in multi-agent tracking and adjust environment worker assertion in launcher --- README.md | 4 ++-- .../agentscope_tracker/multiagent_tracking.py | 8 ++++++-- launcher.py | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2707d52c..b4ba8cde 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j 1. Clone the repo and trinity module: ```bash - git clone https://github.com/..../agentscope-tune.git astune + git clone https://github.com/..../agentscope-tuner.git astune git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity cd astune ``` @@ -194,7 +194,7 @@ python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='verl' -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 7f803516..836140fa 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -128,14 +128,14 @@ def step_track( # dummy response for now token_generator = "manual" - if llm_output.get("tool_calls", None) is not None: + if (llm_output.get("tool_calls", None) is not None): tool_calls = llm_output["tool_calls"] if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): # check tool call formating copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False for i in range(len(copy_tool_calls)): - from vsdb import bp; bp("TOOL_CALL_PARSE_2") + from vsdb import bp; bp("UPUP1") if ('function' in copy_tool_calls[i]) and ('arguments' in copy_tool_calls[i]['function']): try: copy_tool_calls[i]['function']['arguments'] = json.loads(copy_tool_calls[i]['function']['arguments']) @@ -148,6 +148,10 @@ def step_track( if wrong_toolcall: logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") self.already_mad_flag = True + elif ('' in llm_output["content"]): + from vsdb import bp; bp("UPUP2") + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") + self.already_mad_flag = True else: tool_calls = [] diff --git a/launcher.py b/launcher.py index 3bd75768..ff37380c 100644 --- a/launcher.py +++ b/launcher.py @@ -159,7 +159,7 @@ def main(): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.db env["RAY_record_task_actor_creation_sites"] = "true" - assert exp_config.astune.rollout.max_env_worker <= 4 # type: ignore + assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4 # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") From 3f5ea0dad894425ef2b3b2e3bc981241b847881d Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 19:23:08 +0800 Subject: [PATCH 147/462] fix: update tensor model parallel size and max sequences in configuration files for improved performance --- astune/default_config/astune_default.yaml | 2 ++ tutorial/example_math_agent/math_agent.yaml | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 7baea34a..f468d0ca 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -63,6 +63,8 @@ astune: step_skip_action: 0 # skip action generation every N steps, 0 means never skip submit_oversample_multiplier: 1.5 enable_oversample: True + tensor_model_parallel_size: 1 + max_num_seqs: 10 num_repeat: 4 name: vllm val_kwargs: diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index bb0572dd..302dc077 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,7 +15,7 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent @@ -23,13 +23,15 @@ astune: max_env_worker: 256 num_repeat: 8 agent_madness_reward: -1.0 + tensor_model_parallel_size: 4 + max_num_seqs: 256 multi_turn: - max_sample_per_task: 2 + max_sample_per_task: 4 compute_madness_checklist: - "nonsense" - "wrong_toolcall" data: - train_batch_size: 16 + train_batch_size: 128 debug: debug_max_parallel: 1 From 3383f49b636cb9ddc623082a3e609cdc5e33d0e5 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 08:33:20 +0800 Subject: [PATCH 148/462] fix: enhance tool call validation and error logging; update launcher assertions for debugging mode --- README.md | 1 + .../agentscope_tracker/multiagent_tracking.py | 19 +++++++++---- astune/task_rollout/async_llm_bridge.py | 28 ++++++++++++++----- launcher.py | 3 +- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index b4ba8cde..a255d8a7 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,7 @@ python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yam python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 836140fa..0c18af06 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -128,6 +128,7 @@ def step_track( # dummy response for now token_generator = "manual" + err_type = "" if (llm_output.get("tool_calls", None) is not None): tool_calls = llm_output["tool_calls"] if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): @@ -135,23 +136,31 @@ def step_track( copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False for i in range(len(copy_tool_calls)): - from vsdb import bp; bp("UPUP1") if ('function' in copy_tool_calls[i]) and ('arguments' in copy_tool_calls[i]['function']): try: - copy_tool_calls[i]['function']['arguments'] = json.loads(copy_tool_calls[i]['function']['arguments']) - if isinstance(copy_tool_calls[i]['function']['arguments'], str): + expect_dict = json.loads(copy_tool_calls[i]['function']['arguments']) + if not isinstance(expect_dict, dict): wrong_toolcall = True + err_type = "cannot parse arguments" + from vsdb import bp; bp("UPUP1") except: wrong_toolcall = True + err_type = "arguments not json" + from vsdb import bp; bp("UPUP3") else: wrong_toolcall = True + err_type = "no function or no arguments" + from vsdb import bp; bp("UPUP4") if wrong_toolcall: - logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n") self.already_mad_flag = True + else: + logger.success("Toolcall format check passed.") elif ('' in llm_output["content"]): from vsdb import bp; bp("UPUP2") - logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*-*---\n{llm_output['tool_calls']}\n---*-*---\n") + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n") self.already_mad_flag = True + tool_calls = [] else: tool_calls = [] diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 8949b75e..90f67a4b 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -92,7 +92,7 @@ def llm_chat( # if tool call tool_calls = None - if ('' in decoded_text) and (not self.config.astune.rollout.agentscope_disable_toolcalls): + if ('' in decoded_text) and ('' in decoded_text) and (not self.config.astune.rollout.agentscope_disable_toolcalls): tool_parser = Hermes2ProToolParser(self.tokenizer) parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() @@ -100,11 +100,20 @@ def llm_chat( model_called = parsed_tool_calls['tools_called'] if model_called: tool_calls = parsed_tool_calls['tool_calls'] - # for i in range(len(tool_calls)): - # if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: - # tool_calls[i]['function']['arguments'] = json.loads(tool_calls[i]['function']['arguments']) - decoded_text = parsed_tool_calls['content'] - if decoded_text is None: decoded_text = "" + is_bad_toolcall = False + for i in range(len(tool_calls)): + if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: + expect_dict = json.loads(tool_calls[i]['function']['arguments']) + if not isinstance(expect_dict, dict): + from vsdb import bp; bp("UPUP5") + is_bad_toolcall = True + if is_bad_toolcall: + tool_calls = None + decoded_text = decoded_text + else: + decoded_text = parsed_tool_calls['content'] + if decoded_text is None: + decoded_text = "" return { "role": "assistant", @@ -185,13 +194,18 @@ async def main(): return response response = run_async_coro__no_matter_what(main(), timeout=1200) # type: ignore - + # from vsdb import bp; bp("TRR") + prompt_text = self.tokenizer.decode(response.model_extra['prompt_token_ids']) content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) if content is None: content = "" + if ('' in content) and (not message.get("tool_calls", None)): + logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") + logger.warning(f"Bad toolcall discovered {content}") + return { "role": "assistant", "request_id": response.id, diff --git a/launcher.py b/launcher.py index ff37380c..0840b4a4 100644 --- a/launcher.py +++ b/launcher.py @@ -159,10 +159,11 @@ def main(): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.db env["RAY_record_task_actor_creation_sites"] = "true" - assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4 # type: ignore + assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") + assert exp_config["astune"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": env["ASTUNE_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore From ac2211f2ffa9d43f45732697ac3fbc7f7ebfbc0c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 08:33:22 +0800 Subject: [PATCH 149/462] fix: refactor trinity compatibility workflow; update storage type in config and adjust math agent training parameters --- astune/backbone/trinity_compat_workflow.py | 130 +++++++++--------- .../trinity/trinity_default.yaml | 4 +- astune/utils/config_utils.py | 41 +++--- tutorial/example_math_agent/math_agent.yaml | 7 +- 4 files changed, 91 insertions(+), 91 deletions(-) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index ad7bdf90..8d148874 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -8,12 +8,16 @@ from trinity.common.models.model import ModelWrapper from trinity.common.workflows.workflow import WORKFLOWS, Workflow from trinity.common.workflows.workflow import Task as TrinityTask -from trinity.buffer.reader import READER -from trinity.buffer.reader.file_reader import FileReader, TaskFileReader, _HFBatchReader -from trinity.buffer.buffer_reader import BufferReader -from trinity.buffer.reader.reader import READER -from trinity.buffer.schema.formatter import FORMATTER -from trinity.common.config import StorageConfig + +try: + from trinity.buffer.reader import READER + from trinity.buffer.reader.file_reader import FileReader, TaskFileReader, _HFBatchReader + from trinity.buffer.buffer_reader import BufferReader + from trinity.buffer.reader.reader import READER + from trinity.buffer.schema.formatter import FORMATTER + from trinity.common.config import StorageConfig +except ImportError: + pass from typing import List, Literal, Optional, cast from loguru import logger @@ -198,64 +202,58 @@ async def run_async(self): return exps -class CustomReader(TaskFileReader): - """A custom reader for testing.""" - - def __init__(self, config): - super().__init__(config) - - - - - -@READER.register_module("astune_workflow") -class AstuneTaskReader(TaskFileReader): - def __init__(self, config): - self.config = config - self.read_batch_size = config.batch_size - self.split = config.split - - yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) - if yaml_path is None: - raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") - astune_config = read_astune_config(yaml_path) - - from astune.task_reader import TaskReaderRouter, task_to_standard_dataset - task_reader = TaskReaderRouter(astune_config) - - dataset_segments = [] - if 'train' in self.split: - dataset_segments.append(task_to_standard_dataset(task_reader.get_training_tasks())) - if 'val' in self.split: - dataset_segments.append(task_to_standard_dataset(task_reader.get_validation_tasks())) - if not dataset_segments: - raise ValueError(f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'.") - - concatenated_dataset = ( - dataset_segments[0] - if len(dataset_segments) == 1 - else datasets.concatenate_datasets(dataset_segments) - ) - - # from vsdb import bp; bp("XXX") - self.dataset = _HFBatchReader( - concatenated_dataset, - name=self.config.name, - default_batch_size=self.read_batch_size, - total_epochs=self.config.total_epochs if not self.config.is_eval else 1, - offset=self.config.index, - drop_last=not self.config.is_eval, - total_steps=self.config.total_steps, - enable_progress_bar=self.config.enable_progress_bar, - ) - self.formatter = FORMATTER.get("task")(self.config) - def read(self, batch_size: Optional[int] = None) -> List: - # from vsdb import bp; bp("CCC") - batch_size = batch_size or self.read_batch_size - tasks = [] - samples, indices = self.dataset.read_batch(batch_size) - for sample in samples: - task = self.formatter.format(sample) - tasks.append(task) - return tasks +try: + @READER.register_module("astune") + class AstuneTaskReader(TaskFileReader): + def __init__(self, config): + self.config = config + self.read_batch_size = config.batch_size + self.split = config.split + + yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) + if yaml_path is None: + raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") + astune_config = read_astune_config(yaml_path) + + from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + task_reader = TaskReaderRouter(astune_config) + + dataset_segments = [] + if 'train' in self.split: + dataset_segments.append(task_to_standard_dataset(task_reader.get_training_tasks())) + if 'val' in self.split: + dataset_segments.append(task_to_standard_dataset(task_reader.get_validation_tasks())) + if not dataset_segments: + raise ValueError(f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'.") + + concatenated_dataset = ( + dataset_segments[0] + if len(dataset_segments) == 1 + else datasets.concatenate_datasets(dataset_segments) + ) + + # from vsdb import bp; bp("XXX") + self.dataset = _HFBatchReader( + concatenated_dataset, + name=self.config.name, + default_batch_size=self.read_batch_size, + total_epochs=self.config.total_epochs if not self.config.is_eval else 1, + offset=self.config.index, + drop_last=not self.config.is_eval, + total_steps=self.config.total_steps, + enable_progress_bar=self.config.enable_progress_bar, + ) + self.formatter = FORMATTER.get("task")(self.config) + + def read(self, batch_size: Optional[int] = None) -> List: + # from vsdb import bp; bp("CCC") + batch_size = batch_size or self.read_batch_size + tasks = [] + samples, indices = self.dataset.read_batch(batch_size) + for sample in samples: + task = self.formatter.format(sample) + tasks.append(task) + return tasks +except: + pass \ No newline at end of file diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index e4246867..52f7a552 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -18,7 +18,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 rollout_args: temperature: 1.0 split: train - storage_type: astune_workflow + storage_type: astune subset_name: appworld total_epochs: 1000 train_batch_size: 36 @@ -48,7 +48,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 tensor_parallel_size: 1 tool_call_parser: hermes runner_per_model: 8 - runner_state_report_interval: 30 + # runner_state_report_interval: 30 model: max_model_len: 21000 max_response_tokens: 16000 diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index 982ce4fc..b25ee429 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -64,6 +64,27 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone) logger.success("----------------------------------------------------") + if ("trinity" in from_config) and backbone == "trinity": + trinity_config = from_config["trinity"] + + def recursive_copy(src_dict, dst_dict, parent_key=""): + for key, value in src_dict.items(): + full_key = f"{parent_key}.{key}" if parent_key else key + if isinstance(value, dict): + if key not in dst_dict: + dst_dict[key] = {} + recursive_copy(value, dst_dict[key], full_key) + else: + dst_dict[key] = value + logger.info( + f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]" + ) + + recursive_copy(trinity_config, to_config) + + logger.success("----------------------------------------------------") + time.sleep(1) + for from_key, to_keys in convertion_json.items(): # get value from from_config keys = from_key.split(".") @@ -94,26 +115,6 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone) logger.success("----------------------------------------------------") time.sleep(1) - if ("trinity" in from_config) and backbone == "trinity": - trinity_config = from_config["trinity"] - - def recursive_copy(src_dict, dst_dict, parent_key=""): - for key, value in src_dict.items(): - full_key = f"{parent_key}.{key}" if parent_key else key - if isinstance(value, dict): - if key not in dst_dict: - dst_dict[key] = {} - recursive_copy(value, dst_dict[key], full_key) - else: - dst_dict[key] = value - logger.info( - f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]" - ) - - recursive_copy(trinity_config, to_config) - logger.success("----------------------------------------------------") - time.sleep(1) - # save to_config_fp with open(to_config_fp, "w") as file: yaml.dump(to_config, file) diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 302dc077..dfc7ddd8 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -31,15 +31,16 @@ astune: - "nonsense" - "wrong_toolcall" data: - train_batch_size: 128 + train_batch_size: 120 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 trainer_common: - save_freq: 100 - test_freq: 100 + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 # ------------------ 不需要修改 ------------------ From dc056bab28ee1eca9ec28c06586c0a67ffd61e2a Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 08:37:12 +0800 Subject: [PATCH 150/462] stage --- astune/backbone/trinity_compat_workflow.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index 8d148874..3bc233bb 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -4,6 +4,8 @@ import openai import datasets +from loguru import logger + from trinity.common.experience import Experience from trinity.common.models.model import ModelWrapper from trinity.common.workflows.workflow import WORKFLOWS, Workflow @@ -16,11 +18,12 @@ from trinity.buffer.reader.reader import READER from trinity.buffer.schema.formatter import FORMATTER from trinity.common.config import StorageConfig + logger.success("[New Trinity] Trinity imports successful.") except ImportError: + logger.success("[Old Trinity] Using old trinity.") pass from typing import List, Literal, Optional, cast -from loguru import logger from transformers import AutoTokenizer from astune.task_rollout.native_parallel_worker import DynamicRollout from astune.schema.trajectory import Sample From c47e48ca2e1b5a8144e500a05ec1968f1d0f50ca Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 09:04:16 +0800 Subject: [PATCH 151/462] fix: update logging for bad tool calls in AsyncLlmBridge; improve warning message format fix: correct model path in math_agent.yaml for consistency in training configuration --- astune/task_rollout/async_llm_bridge.py | 4 ++-- tutorial/example_math_agent/math_agent.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 90f67a4b..f4efd1f4 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -203,8 +203,8 @@ async def main(): content = "" if ('' in content) and (not message.get("tool_calls", None)): - logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") - logger.warning(f"Bad toolcall discovered {content}") + # logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") + logger.warning(f"Bad toolcall discovered: {content}") return { "role": "assistant", diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index dfc7ddd8..59c77e5c 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,7 +15,7 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent From 28aae879154fbbb044611f9af41350bc0d6c24b3 Mon Sep 17 00:00:00 2001 From: "fuqingxu.fqx" Date: Tue, 25 Nov 2025 09:35:34 +0800 Subject: [PATCH 152/462] simplify code structure & comments zh -> en Link: https://code.alibaba-inc.com/DAIL-LLM/astune/codereview/24447529 * Update README and YAML configurations; add deploy_model script and enhance werewolves game logic * Merge remote-tracking branch 'origin/main' into fqx-temp * Refactor code for clarity and consistency; update comments to English and improve type hints across multiple files. * Enhance error handling in actor configuration and improve logger initialization; update align_parameters function to include backbone parameter. * refactor * remove useless import * re-locate * split parallel worker * train werewolves update * zh comments to en * remove some modules * remove lock * add interface * Merge branch feature/workflow_tuner_interface into fqx-temp Title: Add Workflow Tuner Interface Link: https://code.alibaba-inc.com/DAIL-LLM/astune/codereview/24452742 * re-locate modules * stage werewolf example * change order * revise model proxy module * adjust name * refactor: rename RunnerWithHooks to RunnerWithCallback and update related methods * feat: introduce tracing reader * move tracing config to astune-default * refactor: translate prompt into English * fix: translate rest LLM evaluate filter schema into English * feat: add local sqlite connector in tracing reader * feat: switch connector of tracing reader * feat: add LocalSqliteConnectorV2 for new tracing database format * refactor: remove unused import and update group_merge method for clarity * configure alien llm model * feat: add alien LLM model configuration and response length to default config; refactor tracing reader and remove unused LLM client * pass tracing reader test * refactor: remove unused model_name assignment and update workflow class instantiation * refactor: update task_core_arg to workflow_task across multiple files for consistency * patch examples * refactor: rename parameter 'task' to 'workflow_task' for clarity in agentscope_execute method * refactor: add logging for trinity import failure in backbone module * trailing-whitespace * pre-commit black * upgrade tutorials * import patch * patch eval function * refactor: clean up imports and enhance configuration handling in launcher and related modules * refactor: remove unused environment parameters and clean up method signatures * refactor: implement experiment configuration preparation and launch utilities * refactor: specify type for workflow_task in ResourceKeeper and fix init_messages assignment * refactor: remove unused import from resource_keeper.py * refactor: fix regex pattern formatting and update function signatures in compute_madness * stage * fix trinity * refactor: change logger from error to warning for max_prompt_length exceedance * refactor: update Ray service launch command to use dynamic Python interpreter path * patch overflow bug * fix bug * refactor: update configuration files and improve logging in various modules * refactor: update project names in configuration files for consistency * fix: add tools parameter to context tracking methods for improved functionality * add testing * Merge remote-tracking branch 'origin/fqx-temp' into with-testing * fix: improve future handling in StaticRollout and add exception handling in BaseParallelEnv * prepare testing utils * fix: update tool_calls handling in BasicContextTracker and add max_env_worker to math_agent configuration * patch * fix: parse JSON arguments in tool_calls for improved functionality * fix: comment out JSON parsing in tool_calls for debugging and add logging for tool call parsing * patch * fix: update README and configuration files for improved agent execution and training parameters * fix: update imports and configurations in werewolves example for consistency and optimization * fix: enable console output for moderator and update werewolves configuration for temperature and tensor model parallel size * stage tracking * fix: update README and configuration for clarity; enhance multi-agent context tracking and math agent parameters * fix: update README for repository name consistency; improve tool call error handling in multi-agent tracking and adjust environment worker assertion in launcher * fix: update tensor model parallel size and max sequences in configuration files for improved performance * fix: enhance tool call validation and error logging; update launcher assertions for debugging mode * fix: refactor trinity compatibility workflow; update storage type in config and adjust math agent training parameters * stage * fix: update logging for bad tool calls in AsyncLlmBridge; improve warning message format fix: correct model path in math_agent.yaml for consistency in training configuration * feat: Resolve conflict, auto committed by CodeFlow --- .gitignore | 1 + .pre-commit-config.yaml | 17 +- README.md | 52 +- astune/__init__.py | 3 + astune/backbone/__init__.py | 6 + .../native_compat_trainer.py} | 540 ++++++++----- astune/backbone/trinity_compat_workflow.py | 262 ++++++ astune/backbone_trinity/__init__.py | 1 - astune/backbone_trinity/register_flow.py | 218 ----- .../agentflow_cm/cmt_context_aware.py | 171 ---- .../agentflow_cm/cmt_context_clip.py | 365 --------- .../agentflow_cm/cmt_linear_think.py | 311 ------- .../agentflow_cm/cmt_phantom_hint.py | 41 - .../agentflow_cm/cmt_sliding_window.py | 205 ----- .../agentscope_cm/cmt_agentscope.py | 97 --- .../agentscope_cm/cmt_multi_sample.py | 231 ------ .../agentscope_cm/cmt_request_proxy.py | 210 ----- .../agentscope_cm/timeline_merging.py | 50 -- .../__init__.py | 0 .../agentscope_tracker/multiagent_tracking.py | 393 +++++++++ .../agentscope_tracker/timeline_merging.py | 108 +++ .../basic_tracker.py} | 426 ++++++---- astune/context_tracker/tracker_base_attr.py | 62 ++ astune/default_config/astune_default.yaml | 49 +- astune/default_config/trinity/README.md | 2 +- .../config_auto_convertion_trinity.json | 17 +- .../trinity/trinity_default.yaml | 10 +- .../trinity/trinity_launch.yaml | 4 + .../verl/config_auto_convertion_verl.json | 6 +- astune/default_config/verl/verl_default.yaml | 1 - astune/main_trinity.py | 14 +- astune/main_verl.py | 89 +- astune/main_vllm.py | 103 ++- astune/parallel_env.py | 758 ------------------ astune/protocol/agentscope_protocol.py | 26 - .../extended_msg.py} | 162 ++-- astune/schema/logprob.py | 2 +- astune/schema/task.py | 27 +- astune/schema/trajectory.py | 77 +- astune/task_judge/env_service_as_judge.py | 11 +- astune/task_judge/judge_base.py | 12 +- astune/task_judge/math_answer_as_judge.py | 55 +- astune/task_reader/__init__.py | 39 +- astune/task_reader/env_service_reader.py | 12 +- astune/task_reader/hf_dataset_reader.py | 9 +- astune/task_reader/jsonl_reader.py | 15 +- astune/task_reader/task_reader_base.py | 6 +- astune/task_reader/tracing_reader/__init__.py | 6 +- .../task_reader/tracing_reader/connector.py | 71 +- .../tracing_reader/filters/factory.py | 3 +- .../filters/llm_evaluate_filter.py | 33 +- astune/task_reader/tracing_reader/fn.py | 49 +- astune/task_rollout/__init__.py | 1 + astune/task_rollout/async_llm_bridge.py | 279 +++++-- .../dashscope_llm_bridge.py} | 44 +- astune/task_rollout/env_worker.py | 129 --- astune/task_rollout/native_parallel_worker.py | 587 ++++++++++++++ astune/task_rollout/resource_keeper.py | 188 +++++ astune/task_rollout/single_worker.py | 137 ++++ astune/task_runner/__init__.py | 41 + astune/task_runner/agentscope_runner.py | 92 +++ .../classic_runner.py} | 109 +-- astune/tuner.py | 189 +++++ astune/utils/analysis_time_cost.py | 22 +- astune/utils/async_http_client.py | 42 +- astune/utils/cleaner.py | 32 +- astune/utils/color_hsl.py | 1 + astune/utils/compute_madness.py | 109 +-- astune/utils/config_utils.py | 233 +++++- astune/utils/dynamic_import.py | 7 + .../env_service_client/__init__.py} | 0 .../env_service_client/em_client.py | 34 +- .../env_service_client/env_client.py | 19 +- .../env_service_client/env_client_ng.py | 100 ++- astune/utils/http_client.py | 134 ++-- astune/utils/launch_utils.py | 155 ++++ astune/utils/logger.py | 26 + astune/utils/markdown_parser.py | 16 +- astune/utils/message.py | 27 +- astune/utils/model_merger.py | 307 +++++-- astune/utils/n_gram.py | 10 +- astune/utils/process_dataset.py | 123 +-- astune/utils/process_manager.py | 26 +- astune/utils/pty.py | 104 ++- astune/utils/retry.py | 52 ++ astune/utils/robust_dashscope.py | 45 +- astune/utils/sample.py | 25 + astune/utils/smart_daemon.py | 152 ++-- astune/utils/sms_agent.py | 37 +- astune/utils/testing_utils.py | 24 + astune/utils/utils.py | 40 +- astune/workflow.py | 107 +++ astune/workflow_controller/agentscope_flow.py | 105 --- astune/workflow_controller/basic_agentflow.py | 22 - astune_tests/__init__.py | 0 astune_tests/test_apply_chat_template.py | 0 .../test_apply_chat_template/__init__.py | 0 .../agentscope_for_test.py | 97 +++ .../test_apply_chat_template/test.yaml | 51 ++ astune_tests/test_tracing.py | 42 + astune_tests/test_tracing_reader.py | 149 ++++ .../test_utils/read_config_from_yaml.py | 6 + documents/tokenizer_nodes.md | 2 +- documents/vllm_tokenizer.py | 88 +- launcher.py | 427 +++------- .../werewolves_agent/git-rpg-agentscope.yaml | 47 -- pyrightconfig.json | 11 +- scripts/converter_hf_to_mcore.py | 140 +++- scripts/deploy_model.py | 76 ++ scripts/diagnose.py | 57 +- scripts/download_dataset.py | 41 +- scripts/download_model.py | 13 +- scripts/model_merger.py | 280 +++++-- scripts/requirements_verl.txt | 2 +- scripts/tar_and_copy.sh | 2 +- scripts/untar.sh | 2 +- setup.py | 2 +- test_launcher.py | 34 + tutorial/appworld.py | 44 - tutorial/{ => example_appworld}/appworld.md | 16 +- tutorial/example_appworld/appworld.py | 59 ++ .../example_appworld/appworld.yaml | 4 +- .../{ => example_math_agent}/math_agent.md | 12 +- .../{ => example_math_agent}/math_agent.py | 35 +- .../example_math_agent/math_agent.yaml | 26 +- .../game.py | 21 +- .../prompt.py | 44 +- tutorial/example_werewolves/start.py | 141 ++++ .../structured_model.py | 26 +- .../utils.py | 16 +- .../werewolves.md | 16 +- .../werewolves.yaml | 23 +- tutorial/werewolves/start.py | 144 ---- vsdb.py | 167 ++-- 134 files changed, 6490 insertions(+), 5243 deletions(-) create mode 100644 astune/backbone/__init__.py rename astune/{backbone_others/trainer.py => backbone/native_compat_trainer.py} (80%) create mode 100644 astune/backbone/trinity_compat_workflow.py delete mode 100644 astune/backbone_trinity/__init__.py delete mode 100644 astune/backbone_trinity/register_flow.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_context_aware.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_context_clip.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_linear_think.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_phantom_hint.py delete mode 100644 astune/context_manager/agentflow_cm/cmt_sliding_window.py delete mode 100644 astune/context_manager/agentscope_cm/cmt_agentscope.py delete mode 100644 astune/context_manager/agentscope_cm/cmt_multi_sample.py delete mode 100644 astune/context_manager/agentscope_cm/cmt_request_proxy.py delete mode 100644 astune/context_manager/agentscope_cm/timeline_merging.py rename astune/{env_service_client => context_tracker}/__init__.py (100%) create mode 100644 astune/context_tracker/agentscope_tracker/multiagent_tracking.py create mode 100644 astune/context_tracker/agentscope_tracker/timeline_merging.py rename astune/{context_manager/cmt_linear.py => context_tracker/basic_tracker.py} (65%) create mode 100644 astune/context_tracker/tracker_base_attr.py delete mode 100644 astune/parallel_env.py delete mode 100644 astune/protocol/agentscope_protocol.py rename astune/{context_manager/cmt_base_attr.py => schema/extended_msg.py} (51%) create mode 100644 astune/task_rollout/__init__.py rename astune/{context_manager/agentflow_cm/cmt_foreign_llm.py => task_rollout/dashscope_llm_bridge.py} (65%) delete mode 100644 astune/task_rollout/env_worker.py create mode 100644 astune/task_rollout/native_parallel_worker.py create mode 100644 astune/task_rollout/resource_keeper.py create mode 100644 astune/task_rollout/single_worker.py create mode 100644 astune/task_runner/__init__.py create mode 100644 astune/task_runner/agentscope_runner.py rename astune/{workflow_controller/classic_agentflow.py => task_runner/classic_runner.py} (57%) create mode 100644 astune/tuner.py create mode 100644 astune/utils/dynamic_import.py rename astune/{context_manager/agentflow_cm/cmt_memory.py => utils/env_service_client/__init__.py} (100%) rename astune/{ => utils}/env_service_client/em_client.py (78%) rename astune/{ => utils}/env_service_client/env_client.py (89%) rename astune/{ => utils}/env_service_client/env_client_ng.py (77%) create mode 100644 astune/utils/launch_utils.py create mode 100644 astune/utils/logger.py create mode 100644 astune/utils/retry.py create mode 100644 astune/utils/sample.py create mode 100644 astune/utils/testing_utils.py create mode 100644 astune/workflow.py delete mode 100644 astune/workflow_controller/agentscope_flow.py delete mode 100644 astune/workflow_controller/basic_agentflow.py create mode 100644 astune_tests/__init__.py create mode 100644 astune_tests/test_apply_chat_template.py create mode 100644 astune_tests/test_apply_chat_template/__init__.py create mode 100644 astune_tests/test_apply_chat_template/agentscope_for_test.py create mode 100644 astune_tests/test_apply_chat_template/test.yaml create mode 100644 astune_tests/test_tracing.py create mode 100644 astune_tests/test_tracing_reader.py create mode 100644 astune_tests/test_utils/read_config_from_yaml.py delete mode 100644 launcher/werewolves_agent/git-rpg-agentscope.yaml create mode 100644 scripts/deploy_model.py create mode 100644 test_launcher.py delete mode 100644 tutorial/appworld.py rename tutorial/{ => example_appworld}/appworld.md (83%) create mode 100644 tutorial/example_appworld/appworld.py rename launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml => tutorial/example_appworld/appworld.yaml (89%) rename tutorial/{ => example_math_agent}/math_agent.md (95%) rename tutorial/{ => example_math_agent}/math_agent.py (64%) rename launcher/math_agent/git-math-agentscope.yaml => tutorial/example_math_agent/math_agent.yaml (69%) rename tutorial/{werewolves => example_werewolves}/game.py (95%) rename tutorial/{werewolves => example_werewolves}/prompt.py (83%) create mode 100644 tutorial/example_werewolves/start.py rename tutorial/{werewolves => example_werewolves}/structured_model.py (76%) rename tutorial/{werewolves => example_werewolves}/utils.py (92%) rename tutorial/{werewolves => example_werewolves}/werewolves.md (83%) rename tutorial/{werewolves => example_werewolves}/werewolves.yaml (72%) delete mode 100644 tutorial/werewolves/start.py diff --git a/.gitignore b/.gitignore index 128696a9..0951f429 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,4 @@ launcher_record .trash trinity_checkpoints +astune_test diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 72e099f2..a27a39cf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,8 +1,13 @@ repos: - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.4" +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 hooks: - - id: ruff - args: ["--fix", "--show-fixes", "--output-format=full"] - exclude: ^.*\.(ipynb)$ - - id: ruff-format + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml +# - repo: https://github.com/psf/black-pre-commit-mirror +# rev: 24.1.1 +# hooks: +# - id: black +# language_version: python3.10 +# args: ["--line-length=100"] diff --git a/README.md b/README.md index b3857459..a255d8a7 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j 1. Clone the repo and trinity module: ```bash - git clone https://github.com/..../agentscope-tune.git astune + git clone https://github.com/..../agentscope-tuner.git astune git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity cd astune ``` @@ -20,11 +20,15 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j uv venv --python=3.10.16 source .venv/bin/activate git clone https://github.com/binary-husky/Trinity-RFT external/trinity + git clone https://github.com/binary-husky/agentscope external/agentscope # Install dependencies uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps + # uv pip install -e external/agentscope -i https://mirrors.aliyun.com/pypi/simple/ + uv pip install agentscope==1.0.7 -i https://mirrors.aliyun.com/pypi/simple/ + # Install flash attention (must be installed at last) uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation @@ -54,11 +58,11 @@ Let see: ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ - python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='debug' --with-logview + python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview # (训练appworld demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ - python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --backbone='debug' --with-logview + python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` 备注:当`--backbone=debug`时,程序**不再使用ray**,这意味着您可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置见本文档最后。 @@ -67,9 +71,9 @@ Let see: ```bash # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) clear && \ - python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --with-ray --backbone='trinity' + python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='trinity' - clear && python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --with-ray --backbone='trinity' + clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' ``` 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension)。此外,也可以使用BeyondAgent后端训练(--backbone='verl'),但目前verl训练后端正在维护中。 @@ -89,7 +93,7 @@ Let see: - class::TaskReaderJsonl - class::TaskReaderHuggingFace -2. 定义 AgentScopeWorkflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - tutorial/appworld.py - tutorial/math_agent.py @@ -112,7 +116,7 @@ Let see: - astune/default_config/config_auto_convertion_trinity.json 6. ASTune 和 AgentScope 交互系统 V0.5 - - astune/context_manager/cmt_agentscope.py 负责 + - astune/context_tracker/agentscope.py 负责 - 处理AgentScope生成的Token - 缓存judge给出评分需要的各种数据(包括但不限于所有对话message,env_service句柄,从astune.task_reader读取的task metadata等) - 提供LLM的桥接 @@ -122,9 +126,9 @@ Let see: FlashInfer? -clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --with-ray --backbone='verl' +clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' -clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --with-ray --backbone='verl' +clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' - `launche.json` for vscode debugging @@ -168,4 +172,32 @@ clear && killer VLLM && killer ray && killer python && python launcher.py --wi - [ ] Trinity Display Infer Progress, e.g. token per second - [ ] Trinity: SFT support - [ ] AgentScope Studio Intergration -- [ ] AgentScope \ No newline at end of file +- [ ] AgentScope + + +# Future + +- [x] test server +- [ ] RUBRICS INT +- [-] TEST TOKEN REASON +- [x] TRINITY CONF MAP + +``` +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray +``` + + +``` +source .verlvenv/bin/activate + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ +python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='verl' + + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' + + + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='verl' +``` diff --git a/astune/__init__.py b/astune/__init__.py index e69de29b..bbbd9852 100644 --- a/astune/__init__.py +++ b/astune/__init__.py @@ -0,0 +1,3 @@ +from astune.tuner import ModelTuner +from astune.workflow import Workflow +from astune.schema.task import WorkflowTask, WorkflowOutput diff --git a/astune/backbone/__init__.py b/astune/backbone/__init__.py new file mode 100644 index 00000000..8fe60bf3 --- /dev/null +++ b/astune/backbone/__init__.py @@ -0,0 +1,6 @@ +from loguru import logger + +try: + from astune.backbone.trinity_compat_workflow import * +except ImportError: + logger.warning("trinity is not available.") diff --git a/astune/backbone_others/trainer.py b/astune/backbone/native_compat_trainer.py similarity index 80% rename from astune/backbone_others/trainer.py rename to astune/backbone/native_compat_trainer.py index b389f974..3d7cd287 100644 --- a/astune/backbone_others/trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -16,6 +16,7 @@ import json import os import uuid +import hydra import warnings from collections import defaultdict from copy import deepcopy @@ -37,7 +38,11 @@ from verl.experimental.dataset.sampler import AbstractCurriculumSampler from verl.protocol import pad_dataproto_to_divisor, unpad_dataproto from verl.single_controller.base import Worker -from verl.single_controller.ray import RayClassWithInitArgs, RayResourcePool, RayWorkerGroup +from verl.single_controller.ray import ( + RayClassWithInitArgs, + RayResourcePool, + RayWorkerGroup, +) from verl.single_controller.ray.base import create_colocated_worker_cls from verl.trainer.config import AlgoConfig from verl.trainer.ppo import core_algos @@ -49,21 +54,27 @@ process_validation_metrics, ) from verl.trainer.ppo.reward import compute_reward, compute_reward_async -from verl.utils.checkpoint.checkpoint_manager import find_latest_ckpt_path, should_save_ckpt_esi +from verl.utils.checkpoint.checkpoint_manager import ( + find_latest_ckpt_path, + should_save_ckpt_esi, +) from verl.utils.config import omega_conf_to_dataclass from verl.utils.debug import marked_timer from verl.utils.metric import reduce_metrics -from verl.utils.seqlen_balancing import get_seqlen_balanced_partitions, log_seqlen_unbalance +from verl.utils.seqlen_balancing import ( + get_seqlen_balanced_partitions, + log_seqlen_unbalance, +) from verl.utils.torch_functional import masked_mean from verl.utils.tracking import ValidationGenerationsLogger -from astune.parallel_env import ParallelEnvManager +from astune.task_rollout.native_parallel_worker import ParallelEnvManager from astune.schema.task import Task from astune.schema.trajectory import Trajectory from astune.utils.message import send_train_message from beast_logger import register_logger, print_dict -from astune.context_manager.cmt_linear import CMTLinear +from astune.context_tracker.basic_tracker import BasicContextTracker import os import json from typing import List, Dict, Union, Type @@ -99,7 +110,9 @@ def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | to # Get reward scores reward_scores_list = [item for item in data.non_tensor_batch["reward_scores"]] - reward_scores = torch.tensor(reward_scores_list, device=reward_tensor.device, dtype=torch.float32) # (bs, ) + reward_scores = torch.tensor( + reward_scores_list, device=reward_tensor.device, dtype=torch.float32 + ) # (bs, ) # Use advanced indexing to assign rewards (把reward放到response的最后一个token位置) reward_tensor[torch.arange(len(data)), response_lengths - 1] = reward_scores @@ -112,12 +125,13 @@ def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | to else: return reward_tensor + def union_gen_batch_via_task_id(tasks, batch: DataProto, gen_batch_output: DataProto): """ Union the gen_batch_output with the batch based on task_id. """ - map_task_id_to_index = {t.task_id:i for i, t in enumerate(tasks)} - gen_task_task_ids = gen_batch_output.non_tensor_batch['task_ids'] + map_task_id_to_index = {t.task_id: i for i, t in enumerate(tasks)} + gen_task_task_ids = gen_batch_output.non_tensor_batch["task_ids"] indices = [map_task_id_to_index[tid] for tid in gen_task_task_ids] batch_extend = batch.select_idxs(indices) batch_final = batch_extend.union(gen_batch_output) @@ -156,13 +170,19 @@ def create_resource_pool(self): For FSDP backend, uses max_colocate_count=1 to merge WorkerGroups. For Megatron backend, uses max_colocate_count>1 for different models. """ - for resource_pool_name, process_on_nodes in self.resource_pool_spec.items(): + for ( + resource_pool_name, + process_on_nodes, + ) in self.resource_pool_spec.items(): # max_colocate_count means the number of WorkerGroups (i.e. processes) in each RayResourcePool # For FSDP backend, we recommend using max_colocate_count=1 that merge all WorkerGroups into one. # For Megatron backend, we recommend using max_colocate_count>1 # that can utilize different WorkerGroup for differnt models resource_pool = RayResourcePool( - process_on_nodes=process_on_nodes, use_gpu=True, max_colocate_count=1, name_prefix=resource_pool_name + process_on_nodes=process_on_nodes, + use_gpu=True, + max_colocate_count=1, + name_prefix=resource_pool_name, ) self.resource_pool_dict[resource_pool_name] = resource_pool @@ -174,20 +194,30 @@ def get_resource_pool(self, role: Role) -> RayResourcePool: def get_n_gpus(self) -> int: """Get the number of gpus in this cluster.""" - return sum([n_gpus for process_on_nodes in self.resource_pool_spec.values() for n_gpus in process_on_nodes]) + return sum( + [ + n_gpus + for process_on_nodes in self.resource_pool_spec.values() + for n_gpus in process_on_nodes + ] + ) def _check_resource_available(self): """Check if the resource pool can be satisfied in this ray cluster.""" node_available_resources = ray.state.available_resources_per_node() node_available_gpus = { - node: node_info.get("GPU", 0) if "GPU" in node_info else node_info.get("NPU", 0) + node: (node_info.get("GPU", 0) if "GPU" in node_info else node_info.get("NPU", 0)) for node, node_info in node_available_resources.items() } # check total required gpus can be satisfied total_available_gpus = sum(node_available_gpus.values()) total_required_gpus = sum( - [n_gpus for process_on_nodes in self.resource_pool_spec.values() for n_gpus in process_on_nodes] + [ + n_gpus + for process_on_nodes in self.resource_pool_spec.values() + for n_gpus in process_on_nodes + ] ) if total_available_gpus < total_required_gpus: raise ValueError( @@ -195,7 +225,10 @@ def _check_resource_available(self): ) # check each resource pool can be satisfied, O(#resource_pools * #nodes) - for resource_pool_name, process_on_nodes in self.resource_pool_spec.items(): + for ( + resource_pool_name, + process_on_nodes, + ) in self.resource_pool_spec.items(): num_gpus, num_nodes = process_on_nodes[0], len(process_on_nodes) for node, available_gpus in node_available_gpus.items(): if available_gpus >= num_gpus: @@ -233,7 +266,9 @@ def apply_kl_penalty(data: DataProto, kl_ctrl: core_algos.AdaptiveKLController, # compute kl between ref_policy and current policy # When apply_kl_penalty, algorithm.use_kl_in_reward=True, so the reference model has been enabled. kld = core_algos.kl_penalty( - data.batch["old_log_probs"], data.batch["ref_log_prob"], kl_penalty=kl_penalty + data.batch["old_log_probs"], + data.batch["ref_log_prob"], + kl_penalty=kl_penalty, ) # (batch_size, response_length) kld = kld * response_mask beta = kl_ctrl.value @@ -247,7 +282,10 @@ def apply_kl_penalty(data: DataProto, kl_ctrl: core_algos.AdaptiveKLController, kl_ctrl.update(current_kl=current_kl, n_steps=batch_size) data.batch["token_level_rewards"] = token_level_rewards - metrics = {"actor/reward_kl_penalty": current_kl, "actor/reward_kl_penalty_coeff": beta} + metrics = { + "actor/reward_kl_penalty": current_kl, + "actor/reward_kl_penalty_coeff": beta, + } return data, metrics @@ -307,7 +345,7 @@ def compute_grpo_outcome_advantage_new( Returns: `(torch.Tensor)` shape is (bs, response_length) """ - scores = token_level_rewards.sum(dim=-1) # 1d-list + scores = token_level_rewards.sum(dim=-1) # 1d-list id2score = defaultdict(list) id2pointer = defaultdict(list) @@ -332,7 +370,9 @@ def compute_grpo_outcome_advantage_new( for rolloutid, score in zip(this_task_all_rolloutid, this_task_all_score): rolloutid2score[rolloutid].append(score) for rolloutid in rolloutid2score: - rolloutid2meanscore[rolloutid] = torch.mean(torch.tensor(rolloutid2score[rolloutid])) + rolloutid2meanscore[rolloutid] = torch.mean( + torch.tensor(rolloutid2score[rolloutid]) + ) this_task_all_score = list(rolloutid2meanscore.values()) @@ -359,6 +399,7 @@ def compute_grpo_outcome_advantage_new( return scores, scores + def compute_advantage( data: DataProto, adv_estimator: AdvantageEstimator, @@ -553,7 +594,9 @@ def _validate_config(self): minimal_bsz = n_gpus # 1. Check total batch size for data correctness - real_train_batch_size = config.astune.data.train_batch_size * config.astune.rollout.num_repeat + real_train_batch_size = ( + config.astune.data.train_batch_size * config.astune.rollout.num_repeat + ) assert real_train_batch_size % minimal_bsz == 0, ( f"real_train_batch_size ({real_train_batch_size}) must be divisible by minimal possible batch size " f"({minimal_bsz})" @@ -597,9 +640,17 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): ) # Actor validation done in ActorConfig.__post_init__ and validate() - actor_config = omega_conf_to_dataclass(config.actor_rollout_ref.actor) - actor_config.validate(n_gpus, config.astune.data.train_batch_size, config.actor_rollout_ref.model) - + try: + actor_config = omega_conf_to_dataclass(config.actor_rollout_ref.actor) + actor_config.validate( + n_gpus, + config.astune.data.train_batch_size, + config.actor_rollout_ref.model, + ) + except hydra.errors.InstantiationException as e: + raise ValueError( + f"You are using an unsupported VERL version. Please read `documents/backbones.md`" + ) if not config.actor_rollout_ref.actor.use_dynamic_bsz: if self.use_reference_policy: # reference: log_prob_micro_batch_size vs. log_prob_micro_batch_size_per_gpu @@ -619,7 +670,9 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # Check for reward model micro-batch size conflicts if config.reward_model.enable and not config.reward_model.use_dynamic_bsz: check_mutually_exclusive( - config.reward_model.micro_batch_size, config.reward_model.micro_batch_size_per_gpu, "reward_model" + config.reward_model.micro_batch_size, + config.reward_model.micro_batch_size_per_gpu, + "reward_model", ) if self.config.algorithm.use_kl_in_reward and config.actor_rollout_ref.actor.use_kl_loss: @@ -639,13 +692,19 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # check eval config if config.astune.rollout.val_kwargs.do_sample: - assert config.astune.rollout.temperature > 0, ( - "validation gen temperature should be greater than 0 when enabling do_sample" - ) + assert ( + config.astune.rollout.temperature > 0 + ), "validation gen temperature should be greater than 0 when enabling do_sample" print("[validate_config] All configuration checks passed successfully!") - def _create_dataloader(self, train_dataset, val_dataset, collate_fn, train_sampler: Optional[Sampler]): + def _create_dataloader( + self, + train_dataset, + val_dataset, + collate_fn, + train_sampler: Optional[Sampler], + ): """ Creates the train and validation dataloaders. """ @@ -653,18 +712,26 @@ def _create_dataloader(self, train_dataset, val_dataset, collate_fn, train_sampl if train_dataset is None: train_dataset = create_rl_dataset( - self.config.data.train_files, self.config.data, self.tokenizer, self.processor + self.config.data.train_files, + self.config.data, + self.tokenizer, + self.processor, ) if val_dataset is None: val_dataset = create_rl_dataset( - self.config.data.val_files, self.config.data, self.tokenizer, self.processor + self.config.data.val_files, + self.config.data, + self.tokenizer, + self.processor, ) self.train_dataset, self.val_dataset = train_dataset, val_dataset if train_sampler is None: train_sampler = create_rl_sampler(self.config.data, self.train_dataset) if collate_fn is None: - from verl.utils.dataset.rl_dataset import collate_fn as default_collate_fn + from verl.utils.dataset.rl_dataset import ( + collate_fn as default_collate_fn, + ) collate_fn = default_collate_fn @@ -672,7 +739,9 @@ def _create_dataloader(self, train_dataset, val_dataset, collate_fn, train_sampl self.train_dataloader = StatefulDataLoader( dataset=self.train_dataset, - batch_size=self.config.data.get("gen_batch_size", self.config.astune.data.train_batch_size), + batch_size=self.config.data.get( + "gen_batch_size", self.config.astune.data.train_batch_size + ), num_workers=num_workers, drop_last=True, collate_fn=collate_fn, @@ -712,11 +781,15 @@ def _create_dataloader(self, train_dataset, val_dataset, collate_fn, train_sampl OmegaConf.set_struct(self.config, True) with open_dict(self.config): if OmegaConf.select(self.config, "actor_rollout_ref.actor.optim"): - self.config.actor_rollout_ref.actor.optim.total_training_steps = total_training_steps + self.config.actor_rollout_ref.actor.optim.total_training_steps = ( + total_training_steps + ) if OmegaConf.select(self.config, "critic.optim"): self.config.critic.optim.total_training_steps = total_training_steps except Exception as e: - print(f"Warning: Could not set total_training_steps in config. Structure missing? Error: {e}") + print( + f"Warning: Could not set total_training_steps in config. Structure missing? Error: {e}" + ) def _dump_generations(self, inputs, outputs, gts, scores, reward_extra_infos_dict, dump_path): """Dump rollout/validation samples as JSONL.""" @@ -768,7 +841,9 @@ def _maybe_log_val_generations(self, inputs, outputs, scores): samples = samples[:generations_to_log] # Log to each configured logger - self.validation_generations_logger.log(self.config.trainer.logger, samples, self.global_steps) + self.validation_generations_logger.log( + self.config.trainer.logger, samples, self.global_steps + ) def _validate(self): data_source_lst = [] @@ -781,20 +856,32 @@ def _validate(self): sample_turns = [] for test_data in self.val_dataloader: - test_data['index'] = torch.tensor([i for i in range(len(test_data['task_id']))], dtype=torch.long) + test_data["index"] = torch.tensor( + [i for i in range(len(test_data["task_id"]))], dtype=torch.long + ) test_batch = DataProto.from_single_dict(test_data) # repeat test batch test_batch = test_batch.repeat( - repeat_times=self.config.astune.rollout.val_kwargs.num_repeat, interleave=True + repeat_times=self.config.astune.rollout.val_kwargs.num_repeat, + interleave=True, ) # we only do validation on rule-based rm - if self.config.reward_model.enable and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model": + if ( + self.config.reward_model.enable + and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model" + ): return {} - batch_keys_to_pop = ['index'] - non_tensor_batch_keys_to_pop = ['task_id', 'main_query', 'env_type', 'metadata', 'init_messages'] + batch_keys_to_pop = ["index"] + non_tensor_batch_keys_to_pop = [ + "task_id", + "main_query", + "env_type", + "metadata", + "init_messages", + ] if "multi_modal_data" in test_batch.non_tensor_batch: non_tensor_batch_keys_to_pop.append("multi_modal_data") if "raw_prompt" in test_batch.non_tensor_batch: @@ -831,7 +918,7 @@ def _validate(self): target_dataset=main_val_dataset, target_dataset_name="main_val_dataset", mode="validate", - epoch=f"test.1" + epoch=f"test.1", ) print("=" * 10 + "end validate rollout" + "=" * 10) test_output_gen_batch = self.parallel_env.to_dataproto(trajectories) @@ -840,11 +927,16 @@ def _validate(self): # Store generated outputs output_ids = test_output_gen_batch.batch["responses"] - output_texts = [self.tokenizer.decode(ids, skip_special_tokens=True) for ids in output_ids] + output_texts = [ + self.tokenizer.decode(ids, skip_special_tokens=True) for ids in output_ids + ] sample_outputs.extend(output_texts) - test_batch.non_tensor_batch["uid"] = np.array([str(uuid.uuid4()) for _ in range(len(test_batch.batch))], dtype=object) - tasks = tasks[:len(main_val_dataset)] + test_batch.non_tensor_batch["uid"] = np.array( + [str(uuid.uuid4()) for _ in range(len(test_batch.batch))], + dtype=object, + ) + tasks = tasks[: len(main_val_dataset)] test_batch = union_gen_batch_via_task_id(tasks, test_batch, test_output_gen_batch) # test_batch = test_batch.union(test_output_gen_batch) test_batch.meta_info["validate"] = True @@ -858,21 +950,31 @@ def _validate(self): sample_scores.extend(scores) reward_extra_infos_dict["reward"].extend(scores) - print(f"len reward_extra_infos_dict['reward']: {len(reward_extra_infos_dict['reward'])}") + print( + f"len reward_extra_infos_dict['reward']: {len(reward_extra_infos_dict['reward'])}" + ) if "reward_extra_info" in result: for key, lst in result["reward_extra_info"].items(): reward_extra_infos_dict[key].extend(lst) - print(f"len reward_extra_infos_dict['{key}']: {len(reward_extra_infos_dict[key])}") + print( + f"len reward_extra_infos_dict['{key}']: {len(reward_extra_infos_dict[key])}" + ) # collect num_turns of each prompt if "__num_turns__" in test_batch.non_tensor_batch: sample_turns.append(test_batch.non_tensor_batch["__num_turns__"]) - data_source_lst.append(test_batch.non_tensor_batch.get("data_source", ["unknown"] * reward_tensor.shape[0])) - break # hack to escape the loop after one batch + data_source_lst.append( + test_batch.non_tensor_batch.get("data_source", ["unknown"] * reward_tensor.shape[0]) + ) + break # hack to escape the loop after one batch - sample_inputs = [m['messages'][0]['content'] for m in test_batch.non_tensor_batch['messages']] - self._maybe_log_val_generations(inputs=sample_inputs, outputs=sample_outputs, scores=sample_scores) + sample_inputs = [ + m["messages"][0]["content"] for m in test_batch.non_tensor_batch["messages"] + ] + self._maybe_log_val_generations( + inputs=sample_inputs, outputs=sample_outputs, scores=sample_scores + ) metric_dict = val_metrics @@ -887,7 +989,9 @@ def init_workers(self): """ self.resource_pool_manager.create_resource_pool() - self.resource_pool_to_cls = {pool: {} for pool in self.resource_pool_manager.resource_pool_dict.values()} + self.resource_pool_to_cls = { + pool: {} for pool in self.resource_pool_manager.resource_pool_dict.values() + } # create actor and rollout if self.hybrid_engine: @@ -906,7 +1010,9 @@ def init_workers(self): if self.use_critic: resource_pool = self.resource_pool_manager.get_resource_pool(Role.Critic) critic_cfg = omega_conf_to_dataclass(self.config.critic) - critic_cls = RayClassWithInitArgs(cls=self.role_worker_mapping[Role.Critic], config=critic_cfg) + critic_cls = RayClassWithInitArgs( + cls=self.role_worker_mapping[Role.Critic], config=critic_cfg + ) self.resource_pool_to_cls[resource_pool]["critic"] = critic_cls # create reference policy if needed @@ -924,7 +1030,10 @@ def init_workers(self): if self.use_rm: # we create a RM here resource_pool = self.resource_pool_manager.get_resource_pool(Role.RewardModel) - rm_cls = RayClassWithInitArgs(self.role_worker_mapping[Role.RewardModel], config=self.config.reward_model) + rm_cls = RayClassWithInitArgs( + self.role_worker_mapping[Role.RewardModel], + config=self.config.reward_model, + ) self.resource_pool_to_cls[resource_pool]["rm"] = rm_cls # initialize WorkerGroup @@ -935,12 +1044,14 @@ def init_workers(self): all_wg = {} wg_kwargs = {} # Setting up kwargs for RayWorkerGroup if OmegaConf.select(self.config.trainer, "ray_wait_register_center_timeout") is not None: - wg_kwargs["ray_wait_register_center_timeout"] = self.config.trainer.ray_wait_register_center_timeout + wg_kwargs["ray_wait_register_center_timeout"] = ( + self.config.trainer.ray_wait_register_center_timeout + ) if OmegaConf.select(self.config.trainer, "profile_steps") is not None: wg_kwargs["profile_steps"] = OmegaConf.select(self.config.trainer, "profile_steps") - assert OmegaConf.select(self.config.trainer, "worker_nsight_options") is not None, ( - "worker_nsight_options must be set when profile_steps is set" - ) + assert ( + OmegaConf.select(self.config.trainer, "worker_nsight_options") is not None + ), "worker_nsight_options must be set when profile_steps is set" wg_kwargs["worker_nsight_options"] = OmegaConf.to_container( OmegaConf.select(self.config.trainer, "worker_nsight_options") ) @@ -975,8 +1086,13 @@ def init_workers(self): # create async rollout manager and request scheduler self.async_rollout_mode = False if self.config.astune.rollout.mode == "async": - from verl.experimental.agent_loop.agent_loop import AsyncLLMServerManager - from verl.experimental.agent_loop.agent_loop import AgentLoopManager + from verl.experimental.agent_loop.agent_loop import ( + AsyncLLMServerManager, + ) + from verl.experimental.agent_loop.agent_loop import ( + AgentLoopManager, + ) + self.async_rollout_mode = True agent_loop_manager = AgentLoopManager( config=self.config, @@ -988,14 +1104,21 @@ def init_workers(self): self.reward_fn = parse_reward_from_dataproto self.val_reward_fn = parse_reward_from_dataproto from concurrent.futures import ThreadPoolExecutor - self.parallel_env = ParallelEnvManager(config=self.config, async_rollout_manager=self.async_rollout_manager, max_parallel=self.config.astune.rollout.max_env_worker, tokenizer=self.tokenizer) + + self.parallel_env = ParallelEnvManager( + config=self.config, + async_rollout_manager=self.async_rollout_manager, + max_parallel=self.config.astune.rollout.max_env_worker, + tokenizer=self.tokenizer, + ) def _save_checkpoint(self): from verl.utils.fs import local_mkdir_safe # path: given_path + `/global_step_{global_steps}` + `/actor` local_global_step_folder = os.path.join( - self.config.trainer.default_local_dir, f"global_step_{self.global_steps}" + self.config.trainer.default_local_dir, + f"global_step_{self.global_steps}", ) print(f"local_global_step_folder: {local_global_step_folder}") @@ -1004,24 +1127,37 @@ def _save_checkpoint(self): actor_remote_path = ( None if self.config.trainer.default_hdfs_dir is None - else os.path.join(self.config.trainer.default_hdfs_dir, f"global_step_{self.global_steps}", "actor") + else os.path.join( + self.config.trainer.default_hdfs_dir, + f"global_step_{self.global_steps}", + "actor", + ) ) - remove_previous_ckpt_in_save = self.config.trainer.get("remove_previous_ckpt_in_save", False) + remove_previous_ckpt_in_save = self.config.trainer.get( + "remove_previous_ckpt_in_save", False + ) if remove_previous_ckpt_in_save: print( "Warning: remove_previous_ckpt_in_save is deprecated," + " set max_actor_ckpt_to_keep=1 and max_critic_ckpt_to_keep=1 instead" ) max_actor_ckpt_to_keep = ( - self.config.trainer.get("max_actor_ckpt_to_keep", None) if not remove_previous_ckpt_in_save else 1 + self.config.trainer.get("max_actor_ckpt_to_keep", None) + if not remove_previous_ckpt_in_save + else 1 ) max_critic_ckpt_to_keep = ( - self.config.trainer.get("max_critic_ckpt_to_keep", None) if not remove_previous_ckpt_in_save else 1 + self.config.trainer.get("max_critic_ckpt_to_keep", None) + if not remove_previous_ckpt_in_save + else 1 ) self.actor_rollout_wg.save_checkpoint( - actor_local_path, actor_remote_path, self.global_steps, max_ckpt_to_keep=max_actor_ckpt_to_keep + actor_local_path, + actor_remote_path, + self.global_steps, + max_ckpt_to_keep=max_actor_ckpt_to_keep, ) if self.use_critic: @@ -1029,10 +1165,17 @@ def _save_checkpoint(self): critic_remote_path = ( None if self.config.trainer.default_hdfs_dir is None - else os.path.join(self.config.trainer.default_hdfs_dir, f"global_step_{self.global_steps}", "critic") + else os.path.join( + self.config.trainer.default_hdfs_dir, + f"global_step_{self.global_steps}", + "critic", + ) ) self.critic_wg.save_checkpoint( - critic_local_path, critic_remote_path, self.global_steps, max_ckpt_to_keep=max_critic_ckpt_to_keep + critic_local_path, + critic_remote_path, + self.global_steps, + max_ckpt_to_keep=max_critic_ckpt_to_keep, ) # save dataloader @@ -1043,7 +1186,8 @@ def _save_checkpoint(self): # latest checkpointed iteration tracker (for atomic usage) local_latest_checkpointed_iteration = os.path.join( - self.config.trainer.default_local_dir, "latest_checkpointed_iteration.txt" + self.config.trainer.default_local_dir, + "latest_checkpointed_iteration.txt", ) with open(local_latest_checkpointed_iteration, "w") as f: f.write(str(self.global_steps)) @@ -1069,10 +1213,12 @@ def _load_checkpoint(self): return 0 else: if self.config.trainer.resume_mode == "resume_path": - assert isinstance(self.config.trainer.resume_from_path, str), "resume ckpt must be str type" - assert "global_step_" in self.config.trainer.resume_from_path, ( - "resume ckpt must specify the global_steps" - ) + assert isinstance( + self.config.trainer.resume_from_path, str + ), "resume ckpt must be str type" + assert ( + "global_step_" in self.config.trainer.resume_from_path + ), "resume ckpt must specify the global_steps" global_step_folder = self.config.trainer.resume_from_path if not os.path.isabs(global_step_folder): working_dir = os.getcwd() @@ -1088,12 +1234,14 @@ def _load_checkpoint(self): critic_path = os.path.join(global_step_folder, "critic") # load actor self.actor_rollout_wg.load_checkpoint( - actor_path, del_local_after_load=self.config.trainer.del_local_ckpt_after_load + actor_path, + del_local_after_load=self.config.trainer.del_local_ckpt_after_load, ) # load critic if self.use_critic: self.critic_wg.load_checkpoint( - critic_path, del_local_after_load=self.config.trainer.del_local_ckpt_after_load + critic_path, + del_local_after_load=self.config.trainer.del_local_ckpt_after_load, ) # load dataloader, @@ -1103,7 +1251,9 @@ def _load_checkpoint(self): dataloader_state_dict = torch.load(dataloader_local_path, weights_only=False) self.train_dataloader.load_state_dict(dataloader_state_dict) else: - print(f"Warning: No dataloader state found at {dataloader_local_path}, will start from scratch") + print( + f"Warning: No dataloader state found at {dataloader_local_path}, will start from scratch" + ) def _start_profiling(self, do_profile: bool) -> None: """Start profiling for all worker groups if profiling is enabled.""" @@ -1131,7 +1281,9 @@ def _balance_batch(self, batch: DataProto, metrics, logging_prefix="global_seqle """Reorder the data on single controller such that each dp rank gets similar total tokens""" attention_mask = batch.batch["attention_mask"] batch_size = attention_mask.shape[0] - global_seqlen_lst = batch.batch["attention_mask"].view(batch_size, -1).sum(-1).tolist() # (train_batch_size,) + global_seqlen_lst = ( + batch.batch["attention_mask"].view(batch_size, -1).sum(-1).tolist() + ) # (train_batch_size,) world_size = self.actor_rollout_wg.world_size global_partition_lst = get_seqlen_balanced_partitions( global_seqlen_lst, k_partitions=world_size, equal_size=True @@ -1140,7 +1292,9 @@ def _balance_batch(self, batch: DataProto, metrics, logging_prefix="global_seqle global_idx = torch.tensor([j for partition in global_partition_lst for j in partition]) batch.reorder(global_idx) global_balance_stats = log_seqlen_unbalance( - seqlen_list=global_seqlen_lst, partitions=global_partition_lst, prefix=logging_prefix + seqlen_list=global_seqlen_lst, + partitions=global_partition_lst, + prefix=logging_prefix, ) metrics.update(global_balance_stats) @@ -1164,7 +1318,6 @@ def fit(self): self.tracking_logger = logger self.global_steps = 0 - # load checkpoint before doing anything self._load_checkpoint() @@ -1181,9 +1334,12 @@ def fit(self): if self.config.trainer.get("val_only", False): return - # add tqdm - progress_bar = tqdm(total=self.total_training_steps, initial=self.global_steps, desc="Training Progress") + progress_bar = tqdm( + total=self.total_training_steps, + initial=self.global_steps, + desc="Training Progress", + ) # we start from step 1 self.global_steps += 1 @@ -1210,19 +1366,28 @@ def fit(self): else curr_step_profile ) - - batch_dict['index'] = torch.tensor([i for i in range(len(batch_dict['task_id']))], dtype=torch.long) + batch_dict["index"] = torch.tensor( + [i for i in range(len(batch_dict["task_id"]))], + dtype=torch.long, + ) batch: DataProto = DataProto.from_single_dict(batch_dict) # add uid to batch batch.non_tensor_batch["uid"] = np.array( - [str(uuid.uuid4()) for _ in range(len(batch.batch))], dtype=object + [str(uuid.uuid4()) for _ in range(len(batch.batch))], + dtype=object, ) # # pop those keys for generation - batch_keys_to_pop = ['index'] - non_tensor_batch_keys_to_pop = ['task_id', 'main_query', 'env_type', 'metadata', 'init_messages'] + batch_keys_to_pop = ["index"] + non_tensor_batch_keys_to_pop = [ + "task_id", + "main_query", + "env_type", + "metadata", + "init_messages", + ] gen_batch = batch.pop( batch_keys=batch_keys_to_pop, non_tensor_batch_keys=non_tensor_batch_keys_to_pop, @@ -1248,13 +1413,21 @@ def fit(self): task_id=gen_batch.non_tensor_batch["task_id"][i], main_query=gen_batch.non_tensor_batch["main_query"][i], env_type=gen_batch.non_tensor_batch["env_type"][i], - metadata=gen_batch.non_tensor_batch["metadata"][i] - ) for i in range(len(gen_batch)) + metadata=gen_batch.non_tensor_batch["metadata"][i], + ) + for i in range(len(gen_batch)) ] - print([gen_batch.non_tensor_batch["task_id"][i] for i in range(len(gen_batch))]) + print( + [ + gen_batch.non_tensor_batch["task_id"][i] + for i in range(len(gen_batch)) + ] + ) print("=" * 10 + "start fit rollout" + "=" * 10) self.parallel_env.current_global_steps = self.global_steps - trajectories: List[CMTLinear] = self.parallel_env.rollout(tasks, mode="sample", epoch=f"train.{epoch}") + trajectories: List[BasicContextTracker] = self.parallel_env.rollout( + tasks, mode="sample", epoch=f"train.{epoch}" + ) print("=" * 10 + "end fit rollout" + "=" * 10) print("begin to convert trajectories to dataproto") gen_batch_output = self.parallel_env.to_dataproto(trajectories) @@ -1269,12 +1442,16 @@ def fit(self): success_rate = [traj.reward_structure.success_rate for traj in trajectories] madness_rate = [traj.reward_structure.madness for traj in trajectories] round_cnt = [traj.round_cnt for traj in trajectories] - metrics.update({ - "critic/round_cnt": np.mean(round_cnt), - "critic/madness_rate": np.mean(madness_rate), - "critic/success_rate": np.mean(success_rate), - "critic/real_success_rate": np.mean(trajectories[0].current_batch_success_rate), - }) + metrics.update( + { + "critic/round_cnt": np.mean(round_cnt), + "critic/madness_rate": np.mean(madness_rate), + "critic/success_rate": np.mean(success_rate), + "critic/real_success_rate": np.mean( + trajectories[0].current_batch_success_rate + ), + } + ) print(f"gen_batch_output.info batch.keys={gen_batch_output.batch.keys()}") self.async_rollout_manager.sleep() @@ -1283,7 +1460,10 @@ def fit(self): if self.config.algorithm.adv_estimator == AdvantageEstimator.REMAX: raise NotImplementedError("REMAX is not supported in GRPO yet.") - batch.non_tensor_batch["uid"] = np.array([str(uuid.uuid4()) for _ in range(len(batch.batch))], dtype=object) + batch.non_tensor_batch["uid"] = np.array( + [str(uuid.uuid4()) for _ in range(len(batch.batch))], + dtype=object, + ) batch = union_gen_batch_via_task_id(tasks, batch, gen_batch_output) batch.batch["response_mask"] = compute_response_mask(batch) @@ -1298,7 +1478,9 @@ def fit(self): self._balance_batch(batch, metrics=metrics) # compute global_valid tokens - batch.meta_info["global_token_num"] = torch.sum(batch.batch["attention_mask"], dim=-1).tolist() + batch.meta_info["global_token_num"] = torch.sum( + batch.batch["attention_mask"], dim=-1 + ).tolist() with marked_timer("reward", timing_raw, color="yellow"): # compute reward model score @@ -1307,9 +1489,13 @@ def fit(self): batch = batch.union(reward_tensor) if self.config.reward_model.launch_reward_fn_async: - raise NotImplementedError("launch_reward_fn_async is not supported in GRPO yet.") + raise NotImplementedError( + "launch_reward_fn_async is not supported in GRPO yet." + ) else: - reward_tensor, reward_extra_infos_dict = compute_reward(batch, self.reward_fn) + reward_tensor, reward_extra_infos_dict = compute_reward( + batch, self.reward_fn + ) # recompute old_log_probs print("=== + compute log_probs begin ===") @@ -1318,8 +1504,14 @@ def fit(self): entropys = old_log_prob.batch["entropys"] response_masks = batch.batch["response_mask"] loss_agg_mode = self.config.actor_rollout_ref.actor.loss_agg_mode - entropy_loss = agg_loss(loss_mat=entropys, loss_mask=response_masks, loss_agg_mode=loss_agg_mode) - assert not torch.isnan(entropy_loss).item(), "Entropy loss should not be NaN, something must have gone terribly wrong." + entropy_loss = agg_loss( + loss_mat=entropys, + loss_mask=response_masks, + loss_agg_mode=loss_agg_mode, + ) + assert not torch.isnan( + entropy_loss + ).item(), "Entropy loss should not be NaN, something must have gone terribly wrong." old_log_prob_metrics = {"actor/entropy": entropy_loss.detach().item()} metrics.update(old_log_prob_metrics) old_log_prob.batch.pop("entropys") @@ -1327,7 +1519,9 @@ def fit(self): if "rollout_log_probs" in batch.batch.keys(): # TODO: we may want to add diff of probs too. - from verl.utils.debug.metrics import calculate_debug_metrics + from verl.utils.debug.metrics import ( + calculate_debug_metrics, + ) metrics.update(calculate_debug_metrics(batch)) @@ -1354,12 +1548,16 @@ def fit(self): batch.batch["token_level_scores"] = reward_tensor if reward_extra_infos_dict: - batch.non_tensor_batch.update({k: np.array(v) for k, v in reward_extra_infos_dict.items()}) + batch.non_tensor_batch.update( + {k: np.array(v) for k, v in reward_extra_infos_dict.items()} + ) # compute rewards. apply_kl_penalty if available if self.config.algorithm.use_kl_in_reward: batch, kl_metrics = apply_kl_penalty( - batch, kl_ctrl=self.kl_ctrl_in_reward, kl_penalty=self.config.algorithm.kl_penalty + batch, + kl_ctrl=self.kl_ctrl_in_reward, + kl_penalty=self.config.algorithm.kl_penalty, ) metrics.update(kl_metrics) else: @@ -1392,7 +1590,9 @@ def fit(self): if self.config.trainer.critic_warmup <= self.global_steps: # update actor with marked_timer("update_actor", timing_raw, color="red"): - batch.meta_info["multi_turn"] = self.config.astune.rollout.multi_turn.enable + batch.meta_info["multi_turn"] = ( + self.config.astune.rollout.multi_turn.enable + ) actor_output = self.actor_rollout_wg.update_actor(batch) actor_output_metrics = reduce_metrics(actor_output.meta_info["metrics"]) metrics.update(actor_output_metrics) @@ -1460,7 +1660,9 @@ def fit(self): metrics.update(compute_timing_metrics(batch=batch, timing_raw=timing_raw)) # TODO: implement actual tflpo and theoretical tflpo n_gpus = self.resource_pool_manager.get_n_gpus() - metrics.update(compute_throughout_metrics(batch=batch, timing_raw=timing_raw, n_gpus=n_gpus)) + metrics.update( + compute_throughout_metrics(batch=batch, timing_raw=timing_raw, n_gpus=n_gpus) + ) # this is experimental and may be changed/removed in the future in favor of a general-purpose one if isinstance(self.train_dataloader.sampler, AbstractCurriculumSampler): @@ -1502,138 +1704,118 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): tasks = [] for _ in range(pass_n): - tasks += [ - task for task in target_dataset - ] + tasks += [task for task in target_dataset] - cmts = self.parallel_env.rollout(tasks=tasks, mode=mode, epoch=epoch) # "sample" or "validate" + cmts = self.parallel_env.rollout( + tasks=tasks, mode=mode, epoch=epoch + ) # "sample" or "validate" task_results = {} for _cmt in cmts: reward = _cmt.reward_structure.raw_reward task_id = _cmt.task_id if task_id not in task_results: task_results[task_id] = {} - task_results[task_id]['reward_arr'] = [] - task_results[task_id]['tag_arr'] = [] + task_results[task_id]["reward_arr"] = [] + task_results[task_id]["tag_arr"] = [] if reward >= 1: _cmt.tag = "success" elif reward == 0: _cmt.tag = "failure" else: _cmt.tag = "half_success" - task_results[task_id]['tag_arr'] += [_cmt.tag] - task_results[task_id]['reward_arr'] += [_cmt.reward_structure.raw_reward] - task_results[task_id]['scenario'] = task_id.split('_')[0] + task_results[task_id]["tag_arr"] += [_cmt.tag] + task_results[task_id]["reward_arr"] += [_cmt.reward_structure.raw_reward] + task_results[task_id]["scenario"] = task_id.split("_")[0] - task_scenario = [task_id.split('_')[0] for task_id in task_results.keys()] + task_scenario = [task_id.split("_")[0] for task_id in task_results.keys()] set_scenarios = set(task_scenario) num_scenarios = len(set_scenarios) repeated_success_tasks = 0 - num_all_success_tasks = 0 # n 次实验中全部success的任务数 - num_pass_n_tasks = 0 # n 次实验中至少有一次success的任务数 + num_all_success_tasks = 0 # n 次实验中全部success的任务数 + num_pass_n_tasks = 0 # n 次实验中至少有一次success的任务数 for task_id, task_outcomes in task_results.items(): # 计算 num_all_success_tasks # n 次实验中全部success的任务数 # 计算 num_pass_n_tasks # n 次实验中至少有一次success的任务数 - assert len(task_outcomes['tag_arr']) == pass_n - if all(tag == "success" for tag in task_outcomes['tag_arr']): + assert len(task_outcomes["tag_arr"]) == pass_n + if all(tag == "success" for tag in task_outcomes["tag_arr"]): num_all_success_tasks += 1 - if any(tag == "success" for tag in task_outcomes['tag_arr']): + if any(tag == "success" for tag in task_outcomes["tag_arr"]): num_pass_n_tasks += 1 - repeated_success_tasks += task_outcomes['tag_arr'].count("success") + repeated_success_tasks += task_outcomes["tag_arr"].count("success") num_all_success_scenarios = 0 # 如果一个 scenario 的所有 task 都在 n 次实验中全部 success,则 num_all_success_scenarios +1 num_pass_n_scenarios = 0 # 如果一个 scenario 的所有 task 都在 n 次实验中至少有一次 success,则 num_pass_n_scenarios +1 - repeated_num_pass_1_scenarios = 0 # 按顺序排列,如果一个 scenario 的所有 task 都在第 x 次实验中 success,则 repeated_num_pass_1_scenarios +1 + repeated_num_pass_1_scenarios = 0 # 按顺序排列,如果一个 scenario 的所有 task 都在第 x 次实验中 success,则 repeated_num_pass_1_scenarios +1 for scenario in set_scenarios: - scenario_task_results = {task_id: task_outcomes for task_id, task_outcomes in task_results.items() if task_outcomes['scenario'] == scenario} + scenario_task_results = { + task_id: task_outcomes + for task_id, task_outcomes in task_results.items() + if task_outcomes["scenario"] == scenario + } # num_all_success_scenarios - if all(all(tag == "success" for tag in task_outcomes['tag_arr']) for task_outcomes in scenario_task_results.values()): + if all( + all(tag == "success" for tag in task_outcomes["tag_arr"]) + for task_outcomes in scenario_task_results.values() + ): num_all_success_scenarios += 1 # num_pass_n_scenarios - if all(any(tag == "success" for tag in task_outcomes['tag_arr']) for task_outcomes in scenario_task_results.values()): + if all( + any(tag == "success" for tag in task_outcomes["tag_arr"]) + for task_outcomes in scenario_task_results.values() + ): num_pass_n_scenarios += 1 # num_pass_1_scenarios for x in range(pass_n): - if all(task_outcomes['tag_arr'][x]=='success' for task_outcomes in scenario_task_results.values()): + if all( + task_outcomes["tag_arr"][x] == "success" + for task_outcomes in scenario_task_results.values() + ): repeated_num_pass_1_scenarios += 1 # 记录日志 - task_scenario_for_cmts = [_cmt.task_id.split('_')[0] for _cmt in cmts] + task_scenario_for_cmts = [_cmt.task_id.split("_")[0] for _cmt in cmts] for _cmt, scenario in zip(cmts, task_scenario_for_cmts): task_outcome = _cmt.tag selectors = [scenario, _cmt.task_id, task_outcome] _cmt.generate_log() reward = _cmt.reward_structure.raw_reward - - rewards = [ _cmt.reward_structure.raw_reward for _cmt in cmts ] + rewards = [_cmt.reward_structure.raw_reward for _cmt in cmts] num_tasks = len(task_results) assert num_tasks == len(cmts) // pass_n val_metrics = { "target dataset name": target_dataset_name, "pass_n": pass_n, - "total_tasks": len(task_results), "num_all_success_tasks": num_all_success_tasks, f"num_pass_n_tasks(pass@{pass_n})": num_pass_n_tasks, - "num_scenarios": num_scenarios, "num_all_success_scenarios": num_all_success_scenarios, f"num_pass_n_scenarios(pass@{pass_n})": num_pass_n_scenarios, - - "TGC@1": repeated_success_tasks / (num_tasks * pass_n), - f"TGC@{pass_n}": num_pass_n_tasks / num_tasks, - f"TGC@{pass_n}-all-pass": num_all_success_tasks / num_tasks, - f"SGC@1": repeated_num_pass_1_scenarios / (num_scenarios * pass_n), - f"SGC@{pass_n}": num_pass_n_scenarios / num_scenarios, - f"SGC@{pass_n}-all-pass": num_all_success_scenarios / num_scenarios, + "TGC@1": repeated_success_tasks / (num_tasks * pass_n), + f"TGC@{pass_n}": num_pass_n_tasks / num_tasks, + f"TGC@{pass_n}-all-pass": num_all_success_tasks / num_tasks, + f"SGC@1": repeated_num_pass_1_scenarios / (num_scenarios * pass_n), + f"SGC@{pass_n}": num_pass_n_scenarios / num_scenarios, + f"SGC@{pass_n}-all-pass": num_all_success_scenarios / num_scenarios, "mean_reward": sum(rewards) / len(rewards) if rewards else 0, } - print_dict(val_metrics, narrow=True, header=target_dataset_name, mod="evaluation") + print_dict( + val_metrics, + narrow=True, + header=target_dataset_name, + mod="evaluation", + ) self.tracking_logger.log(data=val_metrics, step=self.global_steps) return cmts, tasks, val_metrics - def get_eval_dataset(self): - from astune.utils.process_dataset import create_rl_dataset - if self.config.astune.task_reader.type == 'env_service': - if self.config.astune.task_reader.env_service.env_type == "appworld": - if hasattr(self, 'main_val_dataset'): - return self.main_val_dataset, None, None - else: - from astune.task_reader import TaskReaderRouter - task_reader = TaskReaderRouter(self.config) - tasks = task_reader.get_validation_tasks() - self.main_val_dataset = tasks - return self.main_val_dataset, None, None - - # elif self.config.env_service.env_type == "webshop": - # if hasattr(self, 'main_val_dataset'): - # return self.main_val_dataset, None, None - # else: - # config = self.config - # self.main_val_dataset = create_rl_dataset(config.data.val_files, config.data, self.tokenizer, processor=None, is_train=False, env_config=config.env_service) - # # self.test_normal_dataset = create_rl_dataset(config.data.val_files, config.data, self.tokenizer, processor=None, is_train=False, env_config=config.env_service) - # if config.data.fast_eval: # 使用一个小测试集 - # self.main_val_dataset.dataframe = self.main_val_dataset.dataframe.shuffle(seed=42).select(range(100)) # limit to 100 samples - # return self.main_val_dataset, None, None - # else: - # self.main_val_dataset.dataframe = self.main_val_dataset.dataframe.shuffle(seed=42).select(range(500)) # limit to 100 samples - # return self.main_val_dataset, None, None - - # elif self.config.env_service.env_type == "crafters": - # if hasattr(self, 'main_val_dataset'): - # return self.main_val_dataset, None, None - # else: - # config = self.config - # self.main_val_dataset = create_rl_dataset(config.data.val_files, config.data, self.tokenizer, processor=None, is_train=False, env_config=config.env_service) - # # self.test_normal_dataset = create_rl_dataset(config.data.val_files, config.data, self.tokenizer, processor=None, is_train=False, env_config=config.env_service) - # self.main_val_dataset.dataframe = self.main_val_dataset.dataframe.shuffle(seed=42).select(range(10)) # limit to 100 samples - # return self.main_val_dataset, None, None - - else: - raise NotImplementedError \ No newline at end of file + from astune.task_reader import TaskReaderRouter + task_reader = TaskReaderRouter(self.config) + tasks = task_reader.get_validation_tasks() + self.main_val_dataset = tasks + return self.main_val_dataset, None, None diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py new file mode 100644 index 00000000..3bc233bb --- /dev/null +++ b/astune/backbone/trinity_compat_workflow.py @@ -0,0 +1,262 @@ +import asyncio +import os +import uuid +import openai +import datasets + +from loguru import logger + +from trinity.common.experience import Experience +from trinity.common.models.model import ModelWrapper +from trinity.common.workflows.workflow import WORKFLOWS, Workflow +from trinity.common.workflows.workflow import Task as TrinityTask + +try: + from trinity.buffer.reader import READER + from trinity.buffer.reader.file_reader import FileReader, TaskFileReader, _HFBatchReader + from trinity.buffer.buffer_reader import BufferReader + from trinity.buffer.reader.reader import READER + from trinity.buffer.schema.formatter import FORMATTER + from trinity.common.config import StorageConfig + logger.success("[New Trinity] Trinity imports successful.") +except ImportError: + logger.success("[Old Trinity] Using old trinity.") + pass + +from typing import List, Literal, Optional, cast +from transformers import AutoTokenizer +from astune.task_rollout.native_parallel_worker import DynamicRollout +from astune.schema.trajectory import Sample +from astune.utils.config_utils import read_astune_config +from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking +from typing import List, Optional, Tuple +from datasets import Dataset, load_dataset + + +class TrinityCompatWorkflow(DynamicRollout): + + def __init__( + self, + is_eval, + task, + llm_handle, + tokenizer, + config, + llm_mode: Literal["local", "remote", "trinity"] = "trinity", + **kwargs, + ): + + self.is_eval = is_eval + self.task = task + self.tokenizer = tokenizer + self.config = config + self.llm_mode = llm_mode + + super().__init__( + config=self.config, + async_rollout_manager=llm_handle, + max_parallel=1, + max_llm_retries=1, + tokenizer=tokenizer, + llm_mode=llm_mode, + **kwargs, + ) + + def convert_task(self, task: TrinityTask): + from astune.schema.task import Task + d = {} + for vip_key in ["main_query", "task_id", "env_type", "metadata", "init_messages"]: + if vip_key not in task.raw_task: + raise ValueError(f"Key {vip_key} not found in task.raw_task") + d[vip_key] = task.raw_task[vip_key] + return Task(**d) + + def thread_worker(self): + obs_window = { + "stop": [False], + "step": [0], + "token": [0], + } + astune_task = self.convert_task(self.task) + return self.rollout_env_worker( + task=astune_task, + task_batch_index=0, + task_tag=f"T{astune_task.task_id}#R", + mode="sample" if not self.is_eval else "validate", + task_thread_index=0, + obs_window=obs_window, + ) + + async def run_in_new_thread(self) -> MultiAgentContextTracking: + return cast( + MultiAgentContextTracking, + await asyncio.to_thread(self.thread_worker), + ) + + +@WORKFLOWS.register_module("astune_workflow") +class ASTunetWorkflowWrap(Workflow): + is_async: bool = True + + def __init__( + self, + model: ModelWrapper, + task: TrinityTask, + auxiliary_models: Optional[List[openai.OpenAI]] = None, + ): + super().__init__( + task=task, + model=model, + auxiliary_models=auxiliary_models, + ) + self.task = task + self.model_client = model.get_openai_async_client() + self.is_eval = task.is_eval + # extract the query and the answer from the task + self.query = task.raw_task.get(task.format_args.prompt_key) # type: ignore [index] + self.answer = task.raw_task.get(task.format_args.response_key) # type: ignore [index] + + async def run_async(self): + + yaml_path = os.environ.get("ASTUNE_CONFIG_REDIRECT", None) + if yaml_path is None: + raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") + + tracker = await TrinityCompatWorkflow( + is_eval=self.is_eval, + task=self.task, + llm_handle=self.model_client, + tokenizer=AutoTokenizer.from_pretrained(self.model_client.model_path), + config=read_astune_config(yaml_path), + ).run_in_new_thread() + + sample_final = [] + try: + sample_arr = tracker.group_tokenize() + except Exception as e: + raise e + finally: + tracker.generate_log(global_step='NA') + sample_final += sample_arr + + exps = [] + for index, sample in enumerate(sample_final): + sample: Sample + input_ids = sample.input_ids + prompt_ids = sample.prompt_ids + response_ids = sample.response_ids + attention_mask = sample.attention_mask + prompt_attention_mask = sample.prompt_attention_mask + response_attention_mask = sample.response_attention_mask + loss_mask = sample.loss_mask + prompt_loss_mask = sample.prompt_loss_mask + response_loss_mask = sample.response_loss_mask + position_ids = sample.position_ids + prompt_position_ids = sample.prompt_position_ids + response_position_ids = sample.response_position_ids + # tracker_tokenized["step_reward"] = self.reward_structure.step_reward[index] + + logprobs = sample.response_logprobs + try: + reward = tracker.reward_structure.step_reward + if isinstance(reward, list): + reward = reward[0] + except Exception as e: + reward = tracker.reward_structure.raw_reward + if not isinstance( + reward, (float, int) + ): # if reward is still not a float or int, set it to 0.0 + reward = tracker.reward_structure.raw_reward + + if ( + len(response_ids) + len(prompt_ids) == len(input_ids) + and len(logprobs) == len(response_ids) + and len(logprobs) > 0 + ): + exp = Experience( + # eid=uuid.uuid4().hex, + tokens=input_ids, # [seq_length] prompt + response + prompt_length=len( + prompt_ids + ), # Length of the prompt in tokens, used for generating attention masks + logprobs=logprobs, # [resp_length] + reward=reward, # + # advantages=None, + # returns=None, + info={}, + metrics={}, # for wandb logging (must be string:float) + response_text="", # optional + prompt_text="", # optional + #### for multi-turn experiences + action_mask=response_loss_mask, # 1 stands for training, 0 stands for ignoring + messages=sample.messages, # + # tools, + #### for dpo experiences + # chosen, + # rejected, + # chosen_messages, + # rejected_messages, + #### for multi-modal data + # multi_modal_inputs + ) + exps += [exp] + else: + logger.exception(f"Data length mismatch when converting sample to experience.") + return exps + + + +try: + @READER.register_module("astune") + class AstuneTaskReader(TaskFileReader): + def __init__(self, config): + self.config = config + self.read_batch_size = config.batch_size + self.split = config.split + + yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) + if yaml_path is None: + raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") + astune_config = read_astune_config(yaml_path) + + from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + task_reader = TaskReaderRouter(astune_config) + + dataset_segments = [] + if 'train' in self.split: + dataset_segments.append(task_to_standard_dataset(task_reader.get_training_tasks())) + if 'val' in self.split: + dataset_segments.append(task_to_standard_dataset(task_reader.get_validation_tasks())) + if not dataset_segments: + raise ValueError(f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'.") + + concatenated_dataset = ( + dataset_segments[0] + if len(dataset_segments) == 1 + else datasets.concatenate_datasets(dataset_segments) + ) + + # from vsdb import bp; bp("XXX") + self.dataset = _HFBatchReader( + concatenated_dataset, + name=self.config.name, + default_batch_size=self.read_batch_size, + total_epochs=self.config.total_epochs if not self.config.is_eval else 1, + offset=self.config.index, + drop_last=not self.config.is_eval, + total_steps=self.config.total_steps, + enable_progress_bar=self.config.enable_progress_bar, + ) + self.formatter = FORMATTER.get("task")(self.config) + + def read(self, batch_size: Optional[int] = None) -> List: + # from vsdb import bp; bp("CCC") + batch_size = batch_size or self.read_batch_size + tasks = [] + samples, indices = self.dataset.read_batch(batch_size) + for sample in samples: + task = self.formatter.format(sample) + tasks.append(task) + return tasks +except: + pass \ No newline at end of file diff --git a/astune/backbone_trinity/__init__.py b/astune/backbone_trinity/__init__.py deleted file mode 100644 index 5ab258fe..00000000 --- a/astune/backbone_trinity/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from astune.backbone_trinity.register_flow import * \ No newline at end of file diff --git a/astune/backbone_trinity/register_flow.py b/astune/backbone_trinity/register_flow.py deleted file mode 100644 index f220c2c7..00000000 --- a/astune/backbone_trinity/register_flow.py +++ /dev/null @@ -1,218 +0,0 @@ -import os -import uuid -import hydra -import openai -import numpy as np -import asyncio, uuid, copy -import threading - -from typing import Dict, List, Optional, Union -from trinity.common.experience import Experience -from trinity.common.models.model import ModelWrapper -from trinity.common.workflows.workflow import WORKFLOWS, Task, Workflow -from trinity.common.workflows.agentscope.react.templates import TEMPLATE_MAP -from transformers import AutoTokenizer -from concurrent.futures import ThreadPoolExecutor -from typing import Dict, List, Literal, Callable, Union -from loguru import logger -from omegaconf import DictConfig -from tensordict import TensorDict -from torch.nn.utils.rnn import pad_sequence -from tqdm import tqdm -from verl import DataProto -from verl.utils.torch_functional import pad_sequence_to_length -from beast_logger import register_logger, print_dict, print_listofdict -from astune.schema.task import Task -from astune.utils.utils import run_async_coro__no_matter_what -from astune.parallel_env import DynamicRollout -from astune.schema.logprob import TokenAndProb -from astune.schema.task import Task -from astune.schema.trajectory import Sample -from astune.utils.config_utils import read_astune_config -from omegaconf import OmegaConf - -class TrinityCompatWorkflow(DynamicRollout): - - def __init__(self, task, llm_handle, tokenizer, config, llm_mode="trinity", **kwargs): - - self.task = task - self.trinity_llm_model_client = llm_handle - self.tokenizer = tokenizer - self.config = config - self.llm_mode = "trinity" - - super().__init__( - config=self.config, - async_rollout_manager=None, - max_parallel=1, - max_llm_retries = 1, - tokenizer=tokenizer, - llm_mode=llm_mode, - **kwargs - ) - - def convert_task(self, task): - main_query = task.raw_task.get('main_query', "[not defined]") - task_id = task.raw_task.get('task_selector', str(uuid.uuid4().hex)) - env_type = task.raw_task.get('env_type', "[not defined]") - metadata = task.raw_task.get('metadata', {}) - init_messages = task.raw_task.get('init_messages', []) - - return Task( - main_query=main_query, - task_id=task_id, - env_type=env_type, - metadata=metadata, - init_messages=init_messages, - ) - - def thread_worker(self): - obs_window = { - 'stop': [False], - 'step': [0], - 'token': [0], - } - astune_task = self.convert_task(self.task) - return self.rollout_env_worker( - task=astune_task, - task_batch_index=0, - task_tag=f"T{astune_task.task_id}#R?", - mode="sample", - task_thread_index=0, - obs_window=obs_window - ) - - def run_in_new_thread(self): - # begin self.thread_worker in a new thread - # then wait for it to finish, and get the result - - result_holder = {} - exc_holder = {} - - def _target(): - try: - result_holder["result"] = self.thread_worker() - except Exception as e: - exc_holder["exc"] = e - - t = threading.Thread(target=_target, daemon=True) - t.start() - t.join() - - if "exc" in exc_holder: - raise exc_holder["exc"] - - return result_holder.get("result", None) - - - -@WORKFLOWS.register_module("astune_workflow") -class astunetWorkflowWrap(Workflow): - is_async: bool = True - def __init__( - self, - config, - model: ModelWrapper, - task: Task, - auxiliary_models: Optional[List[openai.OpenAI]] = None, - ): - super().__init__( - task=task, - model=model, - auxiliary_models=auxiliary_models, - ) - self.config = config - self.task = task - - # 模拟openai的异步客户端 - self.model_client = model.get_openai_async_client() - # task_type 用于获取奖励函数 - # extract the query and the answer from the task - self.query = task.raw_task.get(task.format_args.prompt_key) # type: ignore [index] - self.answer = task.raw_task.get(task.format_args.response_key) # type: ignore [index] - self.task.workflow_args = { - "env_type": "appworld", - "task_id": self.task.task_id, - "instance_id": uuid.uuid4().hex, - } - - async def run_async(self): - - yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) - if yaml_path is None: - raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") - - cmt = TrinityCompatWorkflow( - task=self.task, - llm_handle=self.model_client, - tokenizer=AutoTokenizer.from_pretrained(self.model_client.model_path), - config=read_astune_config(yaml_path), - ).run_in_new_thread() - - sample_final = [] - try: - sample_arr = cmt.group_tokenize() - except Exception as e: - cmt.generate_log(global_step=-1) - raise e - cmt.generate_log(global_step=-1) - sample_final += sample_arr - - - exps = [] - for index, sample in enumerate(sample_final): - sample: Sample - input_ids = sample.input_ids - prompt_ids = sample.prompt_ids - response_ids = sample.response_ids - attention_mask = sample.attention_mask - prompt_attention_mask = sample.prompt_attention_mask - response_attention_mask = sample.response_attention_mask - loss_mask = sample.loss_mask - prompt_loss_mask = sample.prompt_loss_mask - response_loss_mask = sample.response_loss_mask - position_ids = sample.position_ids - prompt_position_ids = sample.prompt_position_ids - response_position_ids = sample.response_position_ids - # cmt_tokenized["step_reward"] = self.reward_structure.step_reward[index] - - logprobs = sample.response_logprobs - try: - reward = cmt.reward_structure.step_reward - if isinstance(reward, list): - reward = reward[0] - except Exception as e: - reward = cmt.reward_structure.raw_reward - if not isinstance(reward, (float, int)): # if reward is still not a float or int, set it to 0.0 - reward = cmt.reward_structure.raw_reward - - if len(response_ids) + len(prompt_ids) == len(input_ids) and \ - len(logprobs) == len(response_ids) and len(logprobs) > 0: - exp = Experience( - # eid=uuid.uuid4().hex, - tokens = input_ids, # [seq_length] prompt + response - prompt_length = len(prompt_ids), # Length of the prompt in tokens, used for generating attention masks - logprobs = logprobs, # [resp_length] - reward = reward, # - # advantages=None, - # returns=None, - info = {}, - metrics = {}, # for wandb logging (must be string:float) - response_text = "", # optional - prompt_text = "", # optional - #### for multi-turn experiences - action_mask = response_loss_mask, # 1 是训练 - messages=sample.messages, # - # tools, - #### for dpo experiences - # chosen, - # rejected, - # chosen_messages, - # rejected_messages, - #### for multi-modal data - # multi_modal_inputs - ) - exps += [exp] - else: - logger.exception(f"Data length mismatch when converting sample to experience.") - return exps diff --git a/astune/context_manager/agentflow_cm/cmt_context_aware.py b/astune/context_manager/agentflow_cm/cmt_context_aware.py deleted file mode 100644 index dd10a69d..00000000 --- a/astune/context_manager/agentflow_cm/cmt_context_aware.py +++ /dev/null @@ -1,171 +0,0 @@ -import copy -from typing import List -from beast_logger import print_listofdict -from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT -from beast_logger import print_dict, print_nested, NestedJsonItem, SeqItem - - -class SelfContextAwareCMT(LinearThinkCMT): - """ - A non-linear context manager template that handles the conversation flow between LLM and environment. - """ - - def __init__(self, config, tokenizer, llm_chat_fn): - self.llm_chat_fn = llm_chat_fn - self.latest_env_response_id = "" - self.latest_env_response_content = "" - self.console_debug_mode = False - self.force_think = config.astune.rollout.force_think - super().__init__(config, tokenizer) - - - def post_tag_env_message_context(self, content, turn, is_last) -> str: - from textwrap import dedent - assert 0 <= turn < 999, "turn 必须在 [0, 999) 范围内" - turn_id = f"{turn:03d}" # 等效:str(turn).zfill(3) - self.latest_env_response_id = f"ER{turn_id}" - self.latest_env_response_content = content.strip() - content = dedent(f""" - [Environment Response, id="ER{turn_id}"] - --- - """).strip() + content.strip() - if is_last and self.force_think: - content += "\n\nAdditional requirements: \n- You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce your answer with \\box{}. (Put \\box{} outside ...)." - - return content - - def post_tag_init_message_context(self, content, is_last) -> str: - if is_last: - content = content.strip() # + "\nSome additional requirements for last msg \n" - if is_last and self.force_think: - content += "\n\nAdditional requirements: \n- You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce your answer with \\box{}. (Put \\box{} outside ...)." - return content.strip() - - def prepare_next_llm_context(self): - self.latest_llm_interaction_socket = [] - - # first we get all previous context (non-deprecated context) - # get `init_message -> user -> llm -> user -> llm`` or `init_message -> llm -> user -> llm -> user`` - self.latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "env"]) - - - env_turn = 1 - for index, ext_msg in enumerate(list(self.latest_llm_interaction_socket)): - - is_last = (index == len(self.latest_llm_interaction_socket) - 1) - # 根据消息类型进行处理 - if ext_msg.author == "llm": - # 如果是以往的llm消息,去掉think标签 - import re - new_ext_msg_content = re.sub(r'.*?', '', ext_msg.content, flags=re.DOTALL).strip() - new_ext_msg_content = new_ext_msg_content.replace("", "") - new_ext_msg_content = new_ext_msg_content.replace("", "") - - assert ext_msg.author == "llm" - author_override = "llm(do_not_train)" - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=author_override, - role=ext_msg.role, - content=new_ext_msg_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - - # process env message - elif ext_msg.author == "env": - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.post_tag_env_message_context(content=ext_msg.content_for_future, turn=env_turn, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - ) - env_turn += 1 - - elif ext_msg.author in ["initialization"]: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.post_tag_init_message_context(content=ext_msg.content_for_future, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - ) - - else: - raise RuntimeError(f"Unknown author {ext_msg.author} in latest_llm_interaction_socket") - - dict_context = self.to_role_content(self.latest_llm_interaction_socket) - return dict_context - - - def save_init_input(self, init_input_arr:list, add_nothink): - super().save_init_input(init_input_arr, add_nothink) - return - - - def after_save_llm_output(self, llm_output, this_interaction): - if not self.latest_env_response_id: - return - self.latest_llm_interaction_socket_additional = copy.deepcopy(this_interaction) - self.latest_llm_interaction_socket_additional += [ExtendedMessage( - author='user', - role='user', - content=f"""Now your new task is to inspect `Environment Response` {self.latest_env_response_id} and then extract paragraphs that may be useful information in last action or in the future.""" - """For example, if the original Response contain paragraph ABCDEF and only paragraph ABCF maybe useful, you should answer me by copying paragraph ABCF (wrapped them between ```).""" - """Do not give up details easily, try your best to find useful information. When necessary, you can preserve everything.""", - token_generator='auto', - tokenizer=self.tokenizer, - )] - dict_context = self.to_role_content(self.latest_llm_interaction_socket_additional) - llm_output = self.llm_chat_fn(dict_context, request_id="") - self.latest_llm_interaction_socket_additional += [self.save_llm_output_do_not_register_full_context(llm_output, dict_context)] - this_interaction = copy.deepcopy(self.latest_llm_interaction_socket_additional) - self.grouped_steps += [this_interaction] - - - if self.console_debug_mode: - print_listofdict( - dict_context + - [{'role': 'llm_latest', 'content': llm_output['content']}] - , mod='c') - try: - llm_output_content = llm_output['content'] = llm_output['content'].strip() - if llm_output_content.count("```") == 2: - extracted_content: str = llm_output_content.split("```")[1].strip() - else: - raise RuntimeError(f"Cannot find ``` in llm_output content: {llm_output_content}") - - # override future full_context - assert self.latest_env_response_content != '' - replace_success = self.replace_full_context_item(match_content=self.latest_env_response_content, new_content=extracted_content) - if not replace_success: - raise RuntimeError(f"Cannot find {self.latest_env_response_id} in full_context") - - except Exception as e: - print(f"Error processing llm_output") - return - - def replace_full_context_item(self, match_content: str, new_content: str): - success = False - for index in range(len(self.full_context)): - ext_msg = self.full_context[index] - if match_content in ext_msg.content_for_future: - success = True - self.full_context[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=new_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - # print_dict({match_content: new_content}) - return success - return success - - def save_llm_output(self, llm_output, input_msg_ref): - ext_msg = CMTLinear.save_llm_output(self, llm_output, input_msg_ref) - this_interaction = copy.deepcopy(self.latest_llm_interaction_socket + [ext_msg]) - self.grouped_steps += [this_interaction] - self.after_save_llm_output(llm_output, this_interaction) - self.latest_llm_interaction_socket = [] - return diff --git a/astune/context_manager/agentflow_cm/cmt_context_clip.py b/astune/context_manager/agentflow_cm/cmt_context_clip.py deleted file mode 100644 index 0b4c1095..00000000 --- a/astune/context_manager/agentflow_cm/cmt_context_clip.py +++ /dev/null @@ -1,365 +0,0 @@ -import copy -import re -import json -import random -import time -from typing import List, Callable -from beast_logger import print_dict, print_listofdict -from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, CMTLinear, LinearThinkCMT -from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn -from textwrap import dedent -from openai import OpenAI -from loguru import logger - - -class SelfContextClipCMT(LinearThinkCMT): - """ - A non-linear context manager template that handles the conversation flow between LLM and environment. - """ - - def __init__(self, config, tokenizer, llm_chat_fn): - self.llm_chat_fn = llm_chat_fn - self.alien_llm_chat_fn: Callable = construct_alien_llm_chat_fn(config, config.actor_rollout_ref.rollout) - self.latest_env_response_id = "" - self.latest_env_response_content = "" - self.console_debug_mode = False - self.force_think = config.astune.rollout.force_think - self.env_action_preference = config.astune.task_reader.env_service.env_action_preference - self.train_sp_action = config.astune.context_manager.auto_context_cm.train_sp_action - self.clipped_before = False - if self.env_action_preference == "box": - self.force_think_prompt = dedent(""" - Additional requirements: Think before action! You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce your answer with \\box{}. - Your thought (...) should be as short and concise as possible. - For example: - ...your thinking process... - \\box{...your final answer...} - """) - elif self.env_action_preference == "code": - self.force_think_prompt = dedent(""" - Additional requirements: Think before action! You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce the next-step action. - Your thought (...) should be as short and concise as possible. - For example: - ...your thinking process... - ```python - # your action here - ``` - """) - - super().__init__(config, tokenizer) - - def post_tag_init_message_context(self, content, is_last) -> str: - if is_last: - content = content.strip() # + "\nSome additional requirements for last msg \n" - if is_last and self.force_think: - content += self.force_think_prompt - return content.strip() - - def post_tag_env_message_context(self, content, turn, is_last) -> str: - from textwrap import dedent - assert 0 <= turn < 999, "turn 必须在 [0, 999) 范围内" - turn_id = f"{turn:03d}" - self.latest_env_response_id = f"ER{turn_id}" - self.latest_env_response_content = content.strip() - content = dedent(f""" - [Environment Response, id=ER{turn_id}] - --- - """).strip() + '\n' + content.strip() - if is_last and self.force_think: - content += self.force_think_prompt - return content - - def post_tag_llm_message_context(self, content, turn, is_last) -> str: - from textwrap import dedent - assert not is_last, "llm message should never be last" - assert 0 <= turn < 999, "turn 必须在 [0, 999) 范围内" - turn_id = f"{turn:03d}" - content = dedent(f""" - [Assistant Response, id=AR{turn_id}] - --- - """).strip() + '\n' + content.strip() - return content - - def strip_think_tags(self, text: str) -> str: - new_ext_msg_content = re.sub(r'.*?', '', text, flags=re.DOTALL).strip() - new_ext_msg_content = new_ext_msg_content.replace("", "") - new_ext_msg_content = new_ext_msg_content.replace("", "") - return new_ext_msg_content - - def prepare_next_llm_context(self): - self.latest_llm_interaction_socket = [] - - # first we get all previous context (non-deprecated context) - # get `init_message -> user -> llm -> user -> llm`` or `init_message -> llm -> user -> llm -> user`` - self.latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "env"]) - - env_turn = 1 - llm_turn = 1 - for index, ext_msg in enumerate(list(self.latest_llm_interaction_socket)): - is_last = (index == len(self.latest_llm_interaction_socket) - 1) - # 根据消息类型进行处理 - if ext_msg.author == "llm": - # 如果是以往的llm消息,去掉think标签 - new_ext_msg_content = self.strip_think_tags(ext_msg.content) - author_override = "llm(do_not_train)" - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=author_override, - role=ext_msg.role, - content=self.post_tag_llm_message_context(new_ext_msg_content, turn=llm_turn, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - build_from_uuid=ext_msg.uuid, - ) - llm_turn += 1 - - # process env message - elif ext_msg.author == "env": - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.post_tag_env_message_context(content=ext_msg.content_for_future, turn=env_turn, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - build_from_uuid=ext_msg.uuid, - ) - env_turn += 1 - - elif ext_msg.author in ["initialization"]: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.post_tag_init_message_context(content=ext_msg.content_for_future, is_last=is_last), - token_generator='auto', - tokenizer=self.tokenizer, - build_from_uuid=ext_msg.uuid, - ) - - else: - raise RuntimeError(f"Unknown author {ext_msg.author} in latest_llm_interaction_socket") - - listofdict_context = self.to_role_content(self.latest_llm_interaction_socket) - return listofdict_context - - - def save_init_input(self, init_input_arr:list, add_nothink): - super().save_init_input(init_input_arr, add_nothink) - return - - - def impl_new_request_from_previous_interaction(self, new_message, this_interaction, strip_think=False): - latest_llm_interaction_socket_additional = copy.deepcopy(this_interaction) - if strip_think: - for index, ext_msg in enumerate(latest_llm_interaction_socket_additional): - if ext_msg.author == "llm(do_not_train)" or ext_msg.author == "llm": - latest_llm_interaction_socket_additional[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=self.strip_think_tags(ext_msg.content), - token_generator='auto', - tokenizer=self.tokenizer, - build_from_uuid=ext_msg.build_from_uuid if ext_msg.build_from_uuid else ext_msg.uuid, - ) - else: - continue - latest_llm_interaction_socket_additional += [new_message] - dict_context = self.to_role_content(latest_llm_interaction_socket_additional) - if self.train_sp_action: - llm_output = self.llm_chat_fn(dict_context, request_id="") - else: - llm_output = self.alien_llm_chat_fn(dict_context, request_id="") - latest_llm_interaction_socket_additional += [self.save_llm_output_do_not_register_full_context(llm_output, dict_context)] - if self.train_sp_action: - this_interaction = copy.deepcopy(latest_llm_interaction_socket_additional) - self.grouped_steps += [this_interaction] - if self.console_debug_mode: - print_listofdict( - dict_context + [{'role': 'llm_latest', 'content': llm_output['content']}], mod='c' - ) # print to console - else: - print_listofdict( - dict_context + [{'role': 'llm_latest', 'content': llm_output['content']}], mod='env_clip' - ) # log to file - output_llm_content = llm_output['content'].strip() - return latest_llm_interaction_socket_additional, output_llm_content - - - def after_save_llm_output(self, this_interaction): - """ - this_interaction = [ - init msg, - ..., - init msg, - ... - previous env msg, - latest llm msg, - ] - """ - from textwrap import dedent - if not self.latest_env_response_id: - return - - clip_token_cnt = self.config.astune.context_manager.auto_context_cm.token_num_trigger_clip - this_interaction = copy.deepcopy(this_interaction) - if self._get_seq_length(this_interaction) < clip_token_cnt: - return - - if self.clipped_before: - return - self.clipped_before = True - - _, generated_content = self.impl_new_request_from_previous_interaction( - new_message=ExtendedMessage( - author='user', - role='user', - content=dedent(""" - Your new task is to inspect each `Environment Response` and `Assistant Response` messages, - and determine whether each message is useful for the next-step decision-making. - Generate a json structure following the format below: - ```json - [ - {"id":"ARXXX or ERXXX", "useful":true or false, "action": "keep or remove or compress"}, - ..., - {"id":"ARXXX or ERXXX", "useful":true or false, "action": "keep or remove or compress"}, - ] - ``` - - For example: - ```json - [ - {"id":"ER001", "useful":true, "action": "keep"}, - {"id":"AR001", "useful":false, "action": "remove"}, - ... - ] - ``` - - Rules: - - If the message contains useful information for future decisions, set "useful":true and "action":"keep". - - If the message records important previous action or environment feedback, set "useful":true and "action":"keep". - - If the message is very long and very redundant, set "useful":true and "action":"compress". - - If the message is completely irrelevant, set "useful":false and "action":"remove". Note that important failures should be preserved, because learning from past is vital. - - Ignore messages without id=XXX tags, where XXX is a 3-digit number. - - Ensure the JSON is properly formatted and valid. - - Remove or compress at least one message, because token limit is already reached. - - At least remove (or compress) one message. - - There must be no more than 2 "compress" actions in total, because "compress" action will cost considerable amount of time. - - """), - token_generator='auto', - tokenizer=self.tokenizer, - ), - this_interaction=this_interaction, - strip_think=True, - ) - - try: - llm_output_content = generated_content = generated_content.strip() - if llm_output_content.count("```") == 2: - extracted_content: str = llm_output_content.split("```")[1].strip() - else: - raise RuntimeError(f"Cannot find ``` in llm_output content: {llm_output_content}") - if extracted_content.startswith('json'): - extracted_content = extracted_content[len('json'):].strip() - extracted_json = json.loads(extracted_content) - for item in extracted_json: - if 'id' not in item or 'useful' not in item or 'action' not in item: - raise RuntimeError(f"Each item must contain 'id', 'useful', and 'action' fields. Error in item: {item}") - message_id = item['id'] - message_action = item['action'] - # find message from self.full_context - ## match latest_llm_interaction_socket_additional and match self.full_context - from_uuid = None - for ext_msg in this_interaction: - if message_id in ext_msg.content_for_future: - from_uuid = ext_msg.build_from_uuid - break - if from_uuid is None: - raise ValueError(f"Cannot find message_id {message_id} in `this_interaction`") - target_msg = None - target_index = -1 - for index, msg in enumerate(self.full_context): - if msg.uuid == from_uuid: - target_msg = msg - target_index = index - break - if target_msg is None or target_index == -1: - raise ValueError(f"Cannot find message_id {message_id} in full_context") - - ## take actions - if message_action == 'remove': - self.full_context[target_index] = ExtendedMessage( - author=target_msg.author+"(discard)", - role=target_msg.role, - content=target_msg.content, # keep original content - token_generator='auto', - tokenizer=self.tokenizer, - ) - elif message_action == 'compress': - target_id = message_id - _, generated_compressed_content = self.impl_new_request_from_previous_interaction( - new_message=ExtendedMessage( - author='user', - role='user', - content=dedent(f""" - Your new task is to inspect {target_id}, and filter out all redundant information, and only keep the most important information that is useful for future decision-making. - For example, if the content is a long text with multiple paragraphs, you should only preseve the key paragraphs and use ... to replace the rest. - If the content is a long list of data / dict / json, you should only preseve the key items and use ... to replace the rest. - Be careful to preserve all information that might be useful in the future. You should at least reduce 50% of {target_id}. - Remember: wrap your answer with ``` - - Your response should be like: - ``` - ...content after filtering... - ``` - """), - token_generator='auto', - tokenizer=self.tokenizer, - ), - this_interaction=this_interaction[:-1], # exclude the latest llm message - strip_think=True, - ) - if generated_compressed_content.count("```") != 2: - raise RuntimeError(f"Cannot find ``` in llm_output content: {generated_compressed_content}") - compressed_content = generated_compressed_content.split("```")[1].strip() - self.full_context[target_index] = ExtendedMessage( - author=target_msg.author, - role=target_msg.role, - content=compressed_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - elif message_action == 'keep': - continue - else: - raise RuntimeError(f"Unknown action {message_action}, must be one of ['remove', 'keep', 'compress']") - - except Exception as e: - logger.bind(exception=True).exception(f"Error processing llm_output: {e}") - print(f"Error processing llm_output") - return - - - def replace_full_context_item(self, match_content: str, new_content: str): - success = False - for index in range(len(self.full_context)): - ext_msg = self.full_context[index] - if match_content in ext_msg.content_for_future: - success = True - self.full_context[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=new_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - # print_dict({match_content: new_content}) - return success - return success - - - def save_llm_output(self, llm_output, input_msg_ref): - ext_msg = CMTLinear.save_llm_output(self, llm_output, input_msg_ref) - this_interaction = copy.deepcopy(self.latest_llm_interaction_socket + [ext_msg]) - self.grouped_steps += [this_interaction] - self.after_save_llm_output(this_interaction) - self.latest_llm_interaction_socket = [] - return diff --git a/astune/context_manager/agentflow_cm/cmt_linear_think.py b/astune/context_manager/agentflow_cm/cmt_linear_think.py deleted file mode 100644 index 401021fa..00000000 --- a/astune/context_manager/agentflow_cm/cmt_linear_think.py +++ /dev/null @@ -1,311 +0,0 @@ -import copy -from textwrap import dedent -from typing import List, Tuple -from astune.schema.trajectory import Sample, Reward -from astune.context_manager.cmt_linear import ExtendedMessage, CMTLinear -from beast_logger import register_logger, print_dict, print_nested, NestedJsonItem, SeqItem - -class MultiSampleCMT(CMTLinear): - def __init__(self, config, tokenizer): - super().__init__(config, tokenizer) - self.config = config - self.tokenizer = tokenizer - self.full_context: List[ExtendedMessage] = [] - self.current_context_status = "" - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len - - assert self.config.astune.data.max_response_length < self.config.astune.data.max_prompt_length, "think linear template requires a big max_prompt_length" - - self.max_seq_length: int = max_model_len - max_response_length - assert self.max_seq_length <= self.config.astune.data.max_prompt_length, "max_seq_length should be less than or equal to max_prompt_length" - - - self.max_env_output_length: int = self.config.astune.rollout.max_env_len - self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") - - self.terminal_rewards_dict = {} - self.latest_llm_interaction_socket: List[ExtendedMessage] = None - self.grouped_steps: List[List[ExtendedMessage]] = [] - - self.discarded = False - self.is_terminated = False - self.context_time_cost = 0 - self.already_mad_flag = False - - self.force_think = config.astune.rollout.force_think - self.env_action_preference = config.astune.task_reader.env_service.env_action_preference - if not self.force_think: - # think_hint_for_qwen3 = - self.think_hint: str = "\n\nThink about the next step before answering. Your thought (...) should be as short and concise as possible." - else: - if self.env_action_preference == "box": - force_think_prompt = dedent(""" - Additional requirements: Think before action! You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce your answer with \\box{}. - For example: - ...your thinking process... - \\box{...your final answer...} - """) - elif self.env_action_preference == "code": - force_think_prompt = dedent(""" - Additional requirements: Think before action! You must think step by step before your next action, and you must use ... to wrap your thinking process before finally produce the next-step action. - For example: - ...your thinking process... - ```python - # your action here - ``` - """) - else: - raise ValueError(f"Unsupported env_action_preference: {self.env_action_preference}") - # think_hint_for_qwen2 = - self.think_hint: str = force_think_prompt - - def _get_seq_length(self, messages: List[dict], tools=[]) -> int: - prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, tools=tools) - return len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) - - def check_context_token_num_safe(self, messages: List[dict], tools: List[dict] = []) -> Tuple[bool, str]: - if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - return False, "already_mad" - if self._get_seq_length(messages, tools=tools) < self.max_seq_length: # self.config.env_engine.max_seq_length = 20480 - return True, "safe" - else: - return False, "token_overflow" - - @property - def steps(self): - # TODO: need revise - return self.prepare_previous_context(mod='future') - - def generate_log(self, task_id = None, global_step="NA"): - task_id = self.task_id - nested_items_print_buffer = {} - for index, ext_steps in enumerate(self.grouped_steps): - cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) - text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] - input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] - loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] - buffer = { - "text_arr": text_arr, - "input_id_arr": input_id_arr, - "loss_mask_color_arr": loss_mask_color_arr, - } - raw_reward = self.reward_structure.raw_reward - step_reward:float = self.reward_structure.step_reward[index] - try: - step_advantage = self.reward_structure.step_advantage[index] - step_advantage_simple = self.reward_structure.step_advantage_simple[index] - except: - step_advantage = 0.0 - step_advantage_simple = 0.0 - task_outcome = str(self.reward_structure.success_rate) - selectors = [task_id, task_outcome, str(index)] - len_prompt_ids = len(cmt_tokenized["prompt_ids"]) - len_response_ids = len(cmt_tokenized["response_ids"]) - len_input_ids = len(cmt_tokenized["input_ids"]) - assert len_prompt_ids + len_response_ids == len_input_ids, "len_prompt_ids + len_response_ids should equal to len_input_ids" - # print(f"Task {task_id}, outcome {task_outcome}, group {index}, len_prompt_ids {len_prompt_ids}, len_response_ids {len_response_ids}, len_input_ids {len_input_ids}") - nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", - outcome=task_outcome, - len_prompt_ids=len_prompt_ids, - len_response_ids=len_response_ids, - len_input_ids=len_input_ids, - raw_reward=f"{float(raw_reward):.3f}", - step_reward=f"{float(step_reward):.3f}", - step_advantage=f"{float(step_advantage):.3f}", - step_advantage_simple=f"{float(step_advantage_simple):.3f}", - content=SeqItem( - text = buffer['text_arr'], # 文本 - title = buffer['text_arr'], # 鼠标悬浮文本 - count = buffer['input_id_arr'], # 高亮文本 - color = buffer['loss_mask_color_arr'] # 颜色 - ) - ) - print_nested(nested_items_print_buffer, - main_content="This is the main content of the nested JSON", - header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", - mod="rollout", - narrow=False, - attach="copy this" - ) - - - def group_tokenize(self): - return self.group_tokenize_multi_group() - - - def process_reward(self, reward_structure: Reward): - # lienar 模式有多条轨迹 - use_step_reward_from_env = self.config.astune.rollout.get("use_step_reward_from_env", False) - if not use_step_reward_from_env: - self.reward_structure = reward_structure - self.reward_structure.step_reward = [0.0 for _ in range(len(self.grouped_steps))] - for index, ext_steps in enumerate(self.grouped_steps): - self.reward_structure.step_reward[index] = self.compute_step_level_reward( - ext_steps=ext_steps, - index=index, - total_steps=len(self.grouped_steps) - ) - else: - step_reward = reward_structure.raw_step_reward - assert reward_structure.raw_step_reward - assert len(reward_structure.raw_step_reward) == len(self.grouped_steps), f"len(reward_structure.raw_step_reward) {len(reward_structure.raw_step_reward)} should equal to len(self.grouped_steps) {len(self.grouped_steps)}" - self.reward_structure = reward_structure - self.reward_structure.step_reward = reward_structure.raw_step_reward - - def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int, total_steps:int)->float: - assert self.reward_structure is not None - - # --------------- global level reward --------------- - global_reward = self.reward_structure.raw_reward - gamma = self.config.astune.rollout.gamma - step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) - - # --------------- compute step level reward --------------- - step_reward = step_reward_base - if self.already_mad_flag: - step_reward = self.config.astune.rollout.agent_madness_reward - self.reward_structure.madness = -1.0 - - return step_reward - - - -class LinearThinkCMT(MultiSampleCMT): - """ - A linear context manager template that handles the conversation flow between LLM and environment. - This class manages the context window, tokenization, and message history in a linear fashion. - - Attributes: - config: Configuration object containing environment and model settings - tokenizer: Tokenizer instance for processing text - full_context (List[ExtendedMessage]): List of all messages in the conversation - current_context_status (str): Current status of the context - max_seq_length (int): Maximum sequence length for the context window - max_env_output_length (int): Maximum length for environment outputs - terminal_rewards_dict (dict): Dictionary storing terminal rewards - - """ - - - - - - def prepare_next_llm_context(self): - self.latest_llm_interaction_socket = [] - # 筛选出 `初始message-user-llm-user-llm`` 或者 `初始message-llm-user-llm-user`` - self.latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "env"]) - - for index, ext_msg in enumerate(list(self.latest_llm_interaction_socket)): - # is_last 是最后一条信息 - # remove history llm author's think (and add /no_think tag to every but last message) - is_last = (index == len(self.latest_llm_interaction_socket) - 1) - # 根据消息类型进行处理 - if ext_msg.author == "llm": - # 如果是以往的llm消息,去掉think标签 - import re - new_ext_msg_content = re.sub(r'.*?', '', ext_msg.content, flags=re.DOTALL).strip() - new_ext_msg_content = new_ext_msg_content.replace("", "") - new_ext_msg_content = new_ext_msg_content.replace("", "") - # new_ext_msg_content = re.sub(r'.*?', '\n\n', ext_msg.content, flags=re.DOTALL) - - if self.config.astune.context_manager.linear_think_cm.train_history_infer_token: - assert ext_msg.author == "llm" - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=new_ext_msg_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - assert ext_msg.author == "llm" - author_override = "llm(do_not_train)" - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=author_override, - role=ext_msg.role, - content=new_ext_msg_content, - token_generator='auto', - tokenizer=self.tokenizer, - ) - elif ext_msg.author in ["env", "initialization"]: - if self.config.astune.context_manager.linear_think_cm.train_history_infer_token: - # 如果是初始化或者环境反馈,都加上 /no_think 标签 - if not is_last: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=ext_msg.content_for_future + "\n/no_think", - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=ext_msg.content_for_future + self.think_hint, - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - # 如果是初始化或者环境反馈 - if not is_last: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=ext_msg.content_for_future, - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - self.latest_llm_interaction_socket[index] = ExtendedMessage( - author=ext_msg.author, - role=ext_msg.role, - content=ext_msg.content_for_future + self.think_hint, - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - raise RuntimeError(f"Unknown author {ext_msg.author} in latest_llm_interaction_socket") - - dict_context = self.to_role_content(self.latest_llm_interaction_socket) - return dict_context - - - - def save_llm_output(self, llm_output, input_msg_ref): - ext_msg = super().save_llm_output(llm_output, input_msg_ref) - this_interaction = copy.deepcopy(self.latest_llm_interaction_socket + [ext_msg]) - self.grouped_steps += [this_interaction] - self.latest_llm_interaction_socket = [] - return ext_msg - - - def save_env_output(self, env_output:dict, input_msg_ref:List[dict]=None, add_nothink=False): - super().save_env_output(env_output, input_msg_ref, add_nothink) - return - - - def prepare_world_interaction(self) -> str: - latest_content = self.full_context[-1].content - if self.config.astune.context_manager.linear_think_cm.remove_think_before_submit_as_action: - import re - new_ext_msg_content = re.sub(r'.*?', '', latest_content, flags=re.DOTALL).strip() - new_ext_msg_content = new_ext_msg_content.replace("", "") - new_ext_msg_content = new_ext_msg_content.replace("", "") - latest_content = new_ext_msg_content.strip() - if self.config.astune.context_manager.linear_think_cm.extract_box_before_submit_as_action: - # take content within \box - # 提取 \box 中的内容 - import re - box_pattern = r'\\box\{(.*?)\}' - match = re.search(box_pattern, latest_content, re.DOTALL) - if match: - latest_content = match.group(1).strip() - else: - # 如果没有找到 \box,选择保留原内容 - pass - return latest_content - - diff --git a/astune/context_manager/agentflow_cm/cmt_phantom_hint.py b/astune/context_manager/agentflow_cm/cmt_phantom_hint.py deleted file mode 100644 index c10f7a14..00000000 --- a/astune/context_manager/agentflow_cm/cmt_phantom_hint.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import List -from astune.context_manager.cmt_linear import ExtendedMessage, CMTLinear - - -class LinearThinkCMT(CMTLinear): - """ - A linear context manager template that handles the conversation flow between LLM and environment. - This class manages the context window, tokenization, and message history in a linear fashion. - - Attributes: - config: Configuration object containing environment and model settings - tokenizer: Tokenizer instance for processing text - full_context (List[ExtendedMessage]): List of all messages in the conversation - current_context_status (str): Current status of the context - max_seq_length (int): Maximum sequence length for the context window - max_env_output_length (int): Maximum length for environment outputs - terminal_rewards_dict (dict): Dictionary storing terminal rewards - - 1. prepare_next_llm_context - 2. check_context_token_num_safe - 3. prepare_world_interaction - 4. save_init_input - 5. save_llm_output - 6. save_env_output - 7. remove_last_context - 8. generate_log - 9. group_tokenize - """ - - def __init__(self, config, tokenizer, contain_phantom_hint=False, past_trajectory=None): - super().__init__(config, tokenizer) - self.contain_phantom_hint = contain_phantom_hint - self.past_trajectory = past_trajectory - self.helper_llm_handle = None - - def save_init_input(self, init_input_arr:list, add_nothink: bool=False): - if self.contain_phantom_hint: - ... - - return super().save_init_input(init_input_arr, add_nothink) - diff --git a/astune/context_manager/agentflow_cm/cmt_sliding_window.py b/astune/context_manager/agentflow_cm/cmt_sliding_window.py deleted file mode 100644 index 250cb1f5..00000000 --- a/astune/context_manager/agentflow_cm/cmt_sliding_window.py +++ /dev/null @@ -1,205 +0,0 @@ -from typing import List, Callable, Tuple -from beast_logger import print_listofdict -from astune.context_manager.agentflow_cm.cmt_linear_think import ExtendedMessage, MultiSampleCMT -from loguru import logger - -""" -滑窗context管理器 -- 当context超出最大长度时,开始新的滑窗 -- 新的滑窗保留初始化信息、最新的env和llm信息 -- 其他信息忽略,生成一条“[Previous {x} conversation has been omitted for brevity.]”信息 -""" - - -class SlidingWindowCMT(MultiSampleCMT): - """ - A non-linear context manager template that handles the conversation flow between LLM and environment. - """ - - def __init__(self, config, tokenizer, llm_chat_fn): - self.llm_chat_fn = llm_chat_fn - self.latest_env_response_id = "" - self.latest_env_response_content = "" - self.console_debug_mode = False - self.force_think = config.astune.rollout.force_think - self.env_cnt = 0 - self.llm_cnt = 0 - self.config = config - self.tokenizer = tokenizer - self.full_context: List[ExtendedMessage] = [] - self.current_context_status = "" - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len - self.max_seq_length: int = max_model_len - max_response_length - self.max_env_output_length: int = self.config.astune.rollout.max_env_len - self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") - self.terminal_rewards_dict = {} - self.latest_llm_interaction_socket: List[ExtendedMessage] = None - self.grouped_steps: List[List[ExtendedMessage]] = [] - self.discarded = False - self.is_terminated = False - self.context_time_cost = 0 - self.generated_token_cnt = 0 - self.omitted_msg_so_far = 0 - self.prompt_part_token_overflow = False - self.already_mad_flag = False - self.round_cnt = 0 - - def prepare_next_llm_context(self): - """Prepare the next LLM context with sliding window logic. When the token length exceeds the maximum limit, start a new sliding window. - """ - self.latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "llm(do_not_train)", "env", "memory"]) - dict_context = self.to_role_content(self.latest_llm_interaction_socket) - - # if token overflow, begin new sliding window - cur_seq_len = self._get_seq_length(dict_context) - # print(f"cur_seq_len {cur_seq_len}, self.max_seq_length {self.max_seq_length}") - - is_safe: bool = cur_seq_len < self.max_seq_length - if not is_safe: - _, previous_interaction = self._prepare_next_llm_context_static() - self.begin_new_sliding_window(previous_interaction=previous_interaction) - - dict_context, self.latest_llm_interaction_socket = self._prepare_next_llm_context_static() - cur_seq_len = self._get_seq_length(dict_context) - if cur_seq_len > self.config.astune.data.max_prompt_length: - print(f"Warning! cur_seq_len={cur_seq_len} immediately after new sliding window is created") - print_listofdict( - dict_context, mod='env_clip' - ) - self.prompt_part_token_overflow = True - - return dict_context - - - def _prepare_next_llm_context_static(self): - """Fetch from context and convert to dict format. - """ - latest_llm_interaction_socket = self.filter_context_via_authors(["initialization", "llm", "llm(do_not_train)", "env", "memory"]) - dict_context = self.to_role_content(latest_llm_interaction_socket) - return dict_context, latest_llm_interaction_socket - - - def check_context_token_num_safe(self, messages: List[dict], tools=[]) -> Tuple[bool, str]: - """Always be safe because we already check in `prepare_next_llm_context` - """ - if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - return False, "already_mad" - - assert self._get_seq_length(messages, tools) < self.max_seq_length - - if self.prompt_part_token_overflow: - return False, "prompt_part_token_overflow" - else: - return True, "safe" - - - def begin_new_sliding_window(self, previous_interaction): - """Begin a new sliding window by preserving initialization, latest env and llm messages, and summarizing the rest into a memory message. - """ - self.grouped_steps += [previous_interaction] - recall_x_action = 2 - # delete most `llm` and `env` messages, keep only the last 2 of each - preserve_messages = self.filter_context_via_authors_with_limit( - authors = ["initialization", "llm", "env", "memory"], - limit={ - "llm": f"keep_last@{recall_x_action}", - "env": f"keep_last@{recall_x_action+1}", - "memory": "keep_last@1", - } - ) - other_messages = [ext_msg for ext_msg in self.filter_context_via_authors(authors = ["initialization", "llm", "env", "memory"]) if ext_msg not in preserve_messages] - # TODO: find a way to summarize previous messages - self.omitted_msg_so_far += len(other_messages) - # init message in `preserve_messages` - init_message_in_preserve_messages = [msg for msg in preserve_messages if msg.author == "initialization"] - # create memory message - other_messages = init_message_in_preserve_messages + other_messages # include init when create memory - memory_msg = self.create_memory_message(other_messages) - # inseart `preserve_messages` after initialization - new_context_beginning = init_message_in_preserve_messages + [memory_msg] + [msg for msg in preserve_messages if msg.author != "initialization"] - # disable llm training for all message in `new_context_beginning` - for i in range(len(new_context_beginning)): - ext_msg = new_context_beginning[i] - if ext_msg.author == 'llm': - author_override = "llm(do_not_train)" - new_context_beginning[i] = ExtendedMessage( - author=author_override, - role=ext_msg.role, - content=ext_msg.content_for_future, - token_generator='auto', - tokenizer=self.tokenizer, - ) - self.full_context = new_context_beginning - # delete old memory message - self.full_context = self.filter_context_via_authors_with_limit( - authors = ["initialization", "llm", "llm(do_not_train)", "env", "memory"], - limit={ - "memory": "keep_last@1", - } - ) - - def create_memory_message(self, msg_list: List[ExtendedMessage]) -> ExtendedMessage: - """TODO: create a better summary message - """ - x = self.omitted_msg_so_far // 2 - enable_llm_memory_extraction = self.config.astune.context_manager.sliding_window_cm - if not enable_llm_memory_extraction: - return ExtendedMessage( - author="memory", - role="user", - content=f"[Previous {x} round of conversations have been omitted for brevity.]", - token_generator='auto', - tokenizer=self.tokenizer, - ) - else: - return ExtendedMessage( - author="memory", - role="user", - content=self.llm_memory_extraction(msg_list), - token_generator='auto', - tokenizer=self.tokenizer, - ) - - def ensure_terminate_rollout_stage(self): - previous_interaction_dict_context, previous_interaction = self._prepare_next_llm_context_static() - if any([ext_msg.need_training for ext_msg in previous_interaction]): - self.grouped_steps += [previous_interaction] - - - def save_env_output(self, env_output, input_msg_ref = None, add_nothink=False): - self.env_cnt += 1 - env_output['content'] = f"[Current Env Step {self.env_cnt}]\n\n" + env_output['content'] - return super().save_env_output(env_output, input_msg_ref, add_nothink) - - - def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context=True): - self.llm_cnt += 1 - return super().save_llm_output(llm_output, input_msg_ref) - - - def llm_memory_extraction(self, msg_list: List[ExtendedMessage]) -> str: - """Use LLM to extract memory from previous messages. - """ - from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn - from textwrap import dedent - self.alien_llm_chat_fn: Callable = construct_alien_llm_chat_fn(self.config, self.config.actor_rollout_ref.rollout) - messages = self.to_role_content(msg_list) - messages.append({ - "role": "user", - "content": dedent(""" - New task: Summarize the previous attempts into a concise memory statement that captures the key points and context. - - Start with: Previously, X attempts have been made, in these attempts, ... - - Focus on the main events, actions, and outcomes. - - If there are big or repeated failures, try to find reason and provide some future advice. - """) - }) - - try: - llm_output = self.alien_llm_chat_fn(messages, request_id="") - except Exception as e: - logger.bind(exception=True).exception(f"call alien_llm_chat_fn error with {e}") - x = self.omitted_msg_so_far // 2 - llm_output_content = f"[Previous {x} round of conversations have been omitted for brevity.]" - return llm_output_content - return llm_output['content'] diff --git a/astune/context_manager/agentscope_cm/cmt_agentscope.py b/astune/context_manager/agentscope_cm/cmt_agentscope.py deleted file mode 100644 index 6b63820e..00000000 --- a/astune/context_manager/agentscope_cm/cmt_agentscope.py +++ /dev/null @@ -1,97 +0,0 @@ -import importlib -from loguru import logger - -from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model -from astune.context_manager.agentscope_cm.cmt_request_proxy import ASTuneLmProxy - -from typing import Any, List, Dict - - -class ASTuneProxy(ASTuneLmProxy): - """ - A proxy class that bridge: - - environment - - reward - - policy llm model - """ - - - async def __call__( - self, - messages: list[dict[str, Any]], - tools: list[dict] | None = None, - tool_choice = None, - structured_model = None, - **kwargs: Any, - ): - - # For qvq and qwen-vl models, the content field cannot be `None` or - # `[{"text": None}]`, so we need to convert it to an empty list. - if self.model_name.startswith("qvq") or "-vl" in self.model_name: - raise NotImplementedError("Not implemented for qvq and qwen-vl models yet.") - - kwargs = { - "messages": messages, - "model": self.model_name, - "stream": self.stream, - **self.dscm_ref.generate_kwargs, - **kwargs, - "result_format": "message", - # In agentscope, the `incremental_output` must be `True` when - # `self.stream` is True - "incremental_output": self.stream, - } - - if tools: - kwargs["tools"] = self.dscm_ref._format_tools_json_schemas(tools) - - if tool_choice: - self.dscm_ref._validate_tool_choice(tool_choice, tools) - kwargs["tool_choice"] = self.dscm_ref._format_tool_choice(tool_choice) - - if ( - self.dscm_ref.enable_thinking is not None - and "enable_thinking" not in kwargs - ): - kwargs["enable_thinking"] = self.dscm_ref.enable_thinking - - if structured_model: - if tools or tool_choice: - logger.warning( - "structured_model is provided. Both 'tools' and " - "'tool_choice' parameters will be overridden and " - "ignored. The model will only perform structured output " - "generation without calling any other tools.", - ) - format_tool = _create_tool_from_base_model(structured_model) - kwargs["tools"] = self.dscm_ref._format_tools_json_schemas( - [format_tool], - ) - kwargs["tool_choice"] = self.dscm_ref._format_tool_choice( - format_tool["function"]["name"], - ) - - response = await self.execute_model_proxy( - api_key=self.dscm_ref.api_key, - structured_model=structured_model, - **kwargs, - ) - return response - - def update_agentscope_input_dictionary(self, **kwargs): - self.input_kwargs.update(kwargs) - - def get_agentscope_input_dictionary(self): - return self.input_kwargs - - def update_judge_input_dictionary(self, **kwargs): - self.output_kwargs.update(kwargs) - - def get_judge_input_dictionary(self): - return self.output_kwargs - - def get_judge(self): - judge_protocol = self.config.astune.task_judge.judge_protocol - module_, class_ = judge_protocol.split('->') - protocol_cls = getattr(importlib.import_module(module_), class_) - return protocol_cls(self.config) # type: ignore diff --git a/astune/context_manager/agentscope_cm/cmt_multi_sample.py b/astune/context_manager/agentscope_cm/cmt_multi_sample.py deleted file mode 100644 index 9a504b58..00000000 --- a/astune/context_manager/agentscope_cm/cmt_multi_sample.py +++ /dev/null @@ -1,231 +0,0 @@ -from loguru import logger - -from agentscope.model import DashScopeChatModel -from astune.schema.trajectory import Reward -from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids -from astune.utils.color_hsl import adjust_color_hsl -from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.cmt_base_attr import INVALID_LOG_PROB_VALUE -from astune.context_manager.agentscope_cm.timeline_merging import can_merge_steps - -from typing import Any, List, Tuple, Union -from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem - -class ASTuneContextTemplate(CMTLinear): - - def __init__( - self, - llm_chat_fn, - tokenizer:PreTrainedTokenizer, - config, - env_step_fn, - should_interrupt_fn, - generated_token_callback_fn, - **kwargs - ): - super().__init__(config, tokenizer) - self.task_batch_index = kwargs.pop("task_batch_index") - self.task_tag = kwargs.pop("task_tag") - self.task_id = kwargs.pop("task_id") - self.dscm_ref = DashScopeChatModel(**kwargs) - self.full_context: List[ExtendedMessage] = [] - self.llm_chat_fn = llm_chat_fn - self.tokenizer = tokenizer - self.stream = False - self.config = config - self.env_step_fn = env_step_fn - self.should_interrupt_fn = should_interrupt_fn - self.generated_token_callback_fn = generated_token_callback_fn - self.context_overflow = False - self.model_name = kwargs['model_name'] - self.output_kwargs = {} - self.input_kwargs = {} - - def process_reward(self, reward_structure: Reward): - self.reward_structure = reward_structure - ext_steps = self.full_context - # # lienar 模式只有一条轨迹 - # self.reward_structure.step_reward = [ - # self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) - # ] - # print('warning: debugging') - self.reward_structure.step_reward = [ - self.compute_step_level_reward(ext_steps=ext_steps, index=i, total_steps=len(self.grouped_steps)) for i in range(len(self.grouped_steps)) - ] - - - def generate_log(self, task_id = None, global_step="NA"): - task_id = self.task_id - nested_items_print_buffer = {} - step_reward = 0.0 - - for index, ext_steps in enumerate(self.grouped_steps): - cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) - text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] - input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] - # loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] - logprobs = [INVALID_LOG_PROB_VALUE] * len(cmt_tokenized["prompt_ids"]) + cmt_tokenized["response_logprobs"] - # 创建调整后的颜色数组 - loss_mask_color_abl_arr = [ - adjust_color_hsl("#09ABCF", logprob) if mask == 1 - else adjust_color_hsl("#D98510", logprob) - for mask, logprob in zip(cmt_tokenized["loss_mask"], logprobs) - ] - logprob_text_arr = [f"{logprob:.4f}" if logprob != INVALID_LOG_PROB_VALUE else "N/A" for logprob in logprobs] - - buffer = { - "text_arr": text_arr, - "logprob_arr": logprob_text_arr, - "input_id_arr": input_id_arr, - "loss_mask_color_arr": loss_mask_color_abl_arr, - } - raw_reward = self.reward_structure.raw_reward - step_reward:float = self.reward_structure.step_reward[index] - try: - step_advantage = self.reward_structure.step_advantage[index] - step_advantage_simple = self.reward_structure.step_advantage_simple[index] - except: - step_advantage = 0.0 - step_advantage_simple = 0.0 - task_outcome = str(self.reward_structure.success_rate) - selectors = [task_id, task_outcome, str(index)] - len_prompt_ids = len(cmt_tokenized["prompt_ids"]) - len_response_ids = len(cmt_tokenized["response_ids"]) - len_input_ids = len(cmt_tokenized["input_ids"]) - assert len_prompt_ids + len_response_ids == len_input_ids, "len_prompt_ids + len_response_ids should equal to len_input_ids" - nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", # type: ignore - outcome=task_outcome, # type: ignore - len_prompt_ids=len_prompt_ids, # type: ignore - len_response_ids=len_response_ids, # type: ignore - len_input_ids=len_input_ids, # type: ignore - raw_reward=f"{float(raw_reward):.3f}", # type: ignore - step_reward=f"{float(step_reward):.3f}", # type: ignore - step_advantage=f"{float(step_advantage):.3f}", # type: ignore - step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore - content=SeqItem( - text = buffer['text_arr'], # 文本 - title = buffer['logprob_arr'], # 鼠标悬浮文本 - count = buffer['input_id_arr'], # 高亮文本 # type: ignore - color = buffer['loss_mask_color_arr'] # 颜色 - ) - ) - - print_nested(nested_items_print_buffer, - main_content="This is the main content of the nested JSON", - header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", # type: ignore - mod="rollout", - narrow=False, - attach="copy this" # type: ignore - ) - - def group_merge(self): - - def toggle_author(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage]) -> List[ExtendedMessage]: - # if any message in `target_step` is author == 'llm', but same-index message in `source_step` is author != 'llm' - # change source_step's message author to 'llm' - for i in range(len(target_step)): - if target_step[i].author == 'llm' and source_step[i].author != 'llm': - source_step[i].author = target_step[i].author - source_step[i].token_arr = target_step[i].token_arr - source_step[i].token_logprob_arr = target_step[i].token_logprob_arr - assert source_step[i].need_training - return source_step - - absorbed_step_indices = [] - reversed_grouped_steps = list(reversed(self.grouped_steps)) - for i in range(len(reversed_grouped_steps)): - if i in absorbed_step_indices: - continue - # check whether [i, len(reversed_grouped_steps)-1] can be merged - for j in range(i+1, len(reversed_grouped_steps)): - if j in absorbed_step_indices: - continue - source_step = reversed_grouped_steps[i] - target_step = reversed_grouped_steps[j] - if can_merge_steps(source_step, target_step): - source_step = toggle_author(source_step, target_step) - reversed_grouped_steps[i] = source_step - absorbed_step_indices += [j] - - # reverse back and exclude absorbed steps - reversed_grouped_steps_clean = [] - for i in range(len(reversed_grouped_steps)): - if i not in absorbed_step_indices: - reversed_grouped_steps_clean.append(reversed_grouped_steps[i]) - self.grouped_steps = list(reversed(reversed_grouped_steps_clean)) - - return self.grouped_steps - - def group_tokenize(self): - return self.group_tokenize_multi_group() - - def get_inc(self, text_frag_from, text_frag_to): - """ - Get the incremental token array from text_frag_from to text_frag_to. - """ - tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) - tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore - token_ids_acc = tokenizer_input_ids - - tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) - input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step - overlap_length = 0 - for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 - else: break - msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" - # print(msg) - return input_id_increment, msg - - def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore - dict_messages = self.to_role_content(ext_messages) - - prompt_text = self.tokenizer.apply_chat_template(dict_messages, tokenize=False, add_generation_prompt=True, tools=tools) - length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len - max_seq_length: int = max_model_len - max_response_length - - if length < max_seq_length: - ret = [True, length] - else: - ret = [False, length] - return tuple(ret) - - def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, str]: - prompt_text = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, tools=tools) - length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len - max_seq_length: int = max_model_len - max_response_length - if self.should_interrupt_fn(): - ret = [False, "externally_interrupted"] - if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - ret = [False, "already_mad"] - if length < max_seq_length: - ret = [True, f"safe[{length} < {max_model_len} - {max_response_length}]"] - else: - ret = [False, "token_overflow"] - return tuple(ret) - - def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: - result = [] - for ext_msg in ext_msg_array: - d = { - "role": ext_msg.role, - "content": ext_msg.content_for_future, - } - if ext_msg.tool_calls: - d.update({ - "tool_calls": ext_msg.tool_calls - }) - result.append(d) - return result - - def apply_chat_template_for_ext_messages(self, ext_messages: List[ExtendedMessage], tools: List = []) -> str: - dict_messages = self.to_role_content(ext_messages) - prompt_text = self.tokenizer.apply_chat_template(dict_messages, tokenize=False, add_generation_prompt=True, tools=tools) - return prompt_text # type: ignore \ No newline at end of file diff --git a/astune/context_manager/agentscope_cm/cmt_request_proxy.py b/astune/context_manager/agentscope_cm/cmt_request_proxy.py deleted file mode 100644 index ff9bde2f..00000000 --- a/astune/context_manager/agentscope_cm/cmt_request_proxy.py +++ /dev/null @@ -1,210 +0,0 @@ -import copy -import time -from loguru import logger -from pydantic import BaseModel -from beast_logger import print_dict, print_listofdict - -from transformers.tokenization_utils import PreTrainedTokenizer -from agentscope.model import ChatResponse -from agentscope.message import TextBlock, ToolUseBlock -from agentscope._utils._common import _json_loads_with_repair, _create_tool_from_base_model -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.agentscope_cm.cmt_multi_sample import ASTuneContextTemplate -from astune.context_manager.agentscope_cm.timeline_merging import can_merge_steps - -from typing import Any, List, Type, Dict - -def remove_fields(d: Dict, fields: List[str]) -> Dict: - d = copy.deepcopy(d) - for field in fields: - d.pop(field.strip(), None) - return d - -class ASTuneLmProxy(ASTuneContextTemplate): - - async def execute_model_proxy(self, messages: List[dict], tools: List=[], tool_choice: str = "auto", structured_model=None, **kwargs) -> dict: - # load messages into `self.full_context` - self.full_context = [] - - consider_roles = ['user', 'assistant', 'system', 'tool'] - disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls - if disable_toolcalls: - consider_roles.remove('tool') - - for i, msg in enumerate(messages): - if (disable_toolcalls) and (not isinstance(msg['content'], str)): - continue - if msg['role'] not in consider_roles: - continue - if not isinstance(msg['content'], str): - author = 'env' - ignore = False - str_content = "" - for item in msg['content']: - if 'text' not in item: - logger.warning(f"Non-text content in message content detected: {item}. Ignoring.") - ignore = True - break - if isinstance(item['text'], str): - str_content += str(item['text']) - else: - str_content = "" - msg['content'] = str_content - if ignore: - continue - msg['content'] = str(msg['content']) # TODO: better handling mm data - if msg['role'] == 'system': - author = 'initialization' - if msg['role'] == 'tool': - author = 'env' - else: - author = 'env' - - self.full_context += [ - ExtendedMessage( - author=author, - role=msg['role'], - content=msg['content'], - tokenizer=self.tokenizer, - tools=tools, - tool_calls=msg['tool_calls'] if 'tool_calls' in msg else [], - token_generator="auto", - ) - ] - - # check token overflow - converted_message = self.to_role_content(self.full_context) - is_safe, info = self.check_context_token_num_safe(converted_message, tools) - custom_sampling_params = {} - if not is_safe: - logger.warning(f"[{info}] detected. Current token count exceeds the limit.") - self.context_overflow = True - return ChatResponse( - content = [{'type': 'text', 'text': 'astune_proxy:[context_overflow]'}] - ) - - # try: - # if self.tokenizer.apply_chat_template(converted_message, tokenize=False, add_generation_prompt=True, tools=tools) == self.tokenizer.apply_chat_template(messages,tokenize=False, add_generation_prompt=True,tools=tools): - # logger.warning("Tokenization between original messages and converted messages mismatch!") - # # print_listofdict(converted_message, mod='exception', header='[exception] proxy converted_message') - # # print_listofdict(messages, mod='exception', header='[exception] proxy messages') - # except Exception as e: - # # print_listofdict(converted_message, mod='exception', header='proxy converted_message') - # # print_listofdict(messages, mod='exception', header='proxy messages') - # logger.error(f"Tokenization check failed due to error: {e}") - # from vsdb import bp;bp("OH") - - llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) - # print_dict(remove_fields(llm_output, fields=['request_id', 'tokens', 'tool_call_id']), header='response') - - # print('-----------------------------------------') - # print('-----------------------------------------') - # print('-----------------------------------------') - # print('-----------------------------------------') - # time.sleep(10) - # compute_string_madness - if not self.already_mad_flag: - if compute_string_madness(completion=llm_output['content'], checklist=self.config.astune.rollout.compute_madness_checklist) < 0.0: - self.already_mad_flag = True - - # dummy response for now - token_generator = "manual" - if llm_output.get("tool_calls", None) is not None: - tool_calls = llm_output["tool_calls"] - else: - tool_calls = [] - - llm_ext_msg = ExtendedMessage( - author="llm", - role="assistant", - content=llm_output['content'], - token_generator=token_generator, - tool_calls=tool_calls, - tokenizer=self.tokenizer, - ) - - if token_generator == "manual": - input_msg_ref = copy.deepcopy(converted_message) - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output, tools=tools) - assert len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn, f"Generated token length {len(token_arr_method2)} exceeds max_response_len {self.config.astune.rollout.max_response_length_in_one_turn}" - llm_ext_msg.token_arr = token_arr_method2 - llm_ext_msg.token_logprob_arr = token_logprob_arr - self.generated_token_callback_fn(llm_ext_msg.token_arr) - - # take snapshot of current timeline - if is_safe: - self.full_context += [ llm_ext_msg ] - is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) - if length > self.config.astune.rollout.max_model_len: - raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, before gen info {info}, generated token length {len(llm_ext_msg.token_arr)}") - self.grouped_steps += [copy.deepcopy(self.full_context)] - - DEBUG = True - if DEBUG and len(self.grouped_steps) >= 2 and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])): - print(f"General Warning: merge failure discovered.") - - # return response - return await self._parse_dashscope_generation_response(llm_output, structured_model=structured_model) - - async def _parse_dashscope_generation_response( - self, - message, - structured_model: Type[BaseModel] | None = None, - ) -> ChatResponse: - - - content_blocks: List[TextBlock | ToolUseBlock] = [] - content = message.get("content") - metadata: dict | None = None - - if content not in [ - None, - "", - [], - ]: - if isinstance(content, list): - for item in content: - if isinstance(item, dict) and "text" in item: - content_blocks.append( - TextBlock( - type="text", - text=item["text"], - ), - ) - else: - content_blocks.append( - TextBlock( - type="text", - text=content, - ), - ) - - if message.get("tool_calls"): - for tool_call in message["tool_calls"]: - input_ = _json_loads_with_repair( - tool_call["function"].get( - "arguments", - "{}", - ) - or "{}", - ) - content_blocks.append( - ToolUseBlock( - type="tool_use", - name=tool_call["function"]["name"], - input=input_, # type: ignore - id=tool_call["id"], - ), - ) - - if structured_model: - metadata = input_ # type: ignore - - - parsed_response = ChatResponse( - content=content_blocks, - metadata=metadata, - ) - - return parsed_response diff --git a/astune/context_manager/agentscope_cm/timeline_merging.py b/astune/context_manager/agentscope_cm/timeline_merging.py deleted file mode 100644 index 0d67b5d8..00000000 --- a/astune/context_manager/agentscope_cm/timeline_merging.py +++ /dev/null @@ -1,50 +0,0 @@ -from typing import List, Type -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids -from beast_logger import print_nested, print_listofdict, NestedJsonItem, SeqItem - - - -def can_merge_steps(source_step: List[ExtendedMessage], target_step: List[ExtendedMessage], debug=False) -> bool: - # if `source_step` has more messages than `target_step` - # and if `source_step` and `target_step` share same token_arr in [0:len(target_step)] - # even if the authors are different, we can still merge them - can_merge = False - # compare_level = 'token' # strict compare with token ids - compare_level = 'text' # relaxed compare with text, more easier to match, at very little cost - if len(source_step) >= len(target_step): - all_msg_match = True - for i in range(len(target_step)): - if compare_level == 'text': - same = source_step[i].content_for_future == target_step[i].content_for_future - elif compare_level == 'token': - same = source_step[i].token_arr == target_step[i].token_arr - else: - raise NotImplementedError - if not same: - all_msg_match = False - break - if all_msg_match: - can_merge = True - - if debug: - debug_listofdict = [] - if len(source_step) >= len(target_step): - all_msg_match = False - for i in range(len(target_step)): - d = {} - d['source'] = source_step[i].content_for_future - d['target'] = target_step[i].content_for_future - if compare_level == 'text': - same = source_step[i].content_for_future == target_step[i].content_for_future - elif compare_level == 'token': - same = source_step[i].token_arr == target_step[i].token_arr - else: - raise NotImplementedError - if not same: - d['match'] = 'NO' - else: - d['match'] = 'YES' - debug_listofdict.append(d) - print_listofdict(debug_listofdict, header=f"can_merge_steps debug: {can_merge}") - - return can_merge \ No newline at end of file diff --git a/astune/env_service_client/__init__.py b/astune/context_tracker/__init__.py similarity index 100% rename from astune/env_service_client/__init__.py rename to astune/context_tracker/__init__.py diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py new file mode 100644 index 00000000..0c18af06 --- /dev/null +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -0,0 +1,393 @@ +import copy +from loguru import logger + +from agentscope.model import DashScopeChatModel +from astune.schema.trajectory import Reward +from transformers.tokenization_utils import PreTrainedTokenizer +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + ExtendedMessage, + replace_token_ids, +) +from astune.utils.color_hsl import adjust_color_hsl +from astune.utils.compute_madness import compute_string_madness +from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE +from astune.context_tracker.agentscope_tracker.timeline_merging import ( + merge_tracker_timelines, + can_merge_steps, +) + +from typing import Any, List, Tuple, Union +from beast_logger import ( + print_nested, + print_listofdict, + NestedJsonItem, + SeqItem, +) +import json + +class MultiAgentContextTracking(BasicContextTracker): + + def __init__( + self, + llm_chat_fn, + tokenizer: PreTrainedTokenizer, + config, + should_interrupt_fn, + generated_token_callback_fn, + **kwargs, + ): + super().__init__(config, tokenizer, **kwargs) + self.llm_chat_fn = llm_chat_fn + self.tokenizer = tokenizer + self.should_interrupt_fn = should_interrupt_fn + self.generated_token_callback_fn = generated_token_callback_fn + self.context_overflow = False + self.output_kwargs = {} + self.input_kwargs = {} + + def step_prepare(self, messages: List[dict], tools: List = []): + self.full_context = [] + consider_roles = ["user", "assistant", "system", "tool"] + disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls + if disable_toolcalls: + consider_roles.remove("tool") + tools = [] + else: + # rerank tool parameters to improve compatibility + for i in range(len(tools)): tools[i]['function']['parameters'] = tools[i]['function'].pop('parameters') + + for i, msg in enumerate(messages): + if (disable_toolcalls) and (not isinstance(msg["content"], str)): + continue + if msg["role"] not in consider_roles: + continue + if not isinstance(msg["content"], str): + author = "env" + ignore = False + str_content = "" + for item in msg["content"]: + if "text" not in item: + logger.warning( + f"Non-text content in message content detected: {item}. Ignoring." + ) + ignore = True + break + if isinstance(item["text"], str): + str_content += str(item["text"]) + else: + str_content = "" + msg["content"] = str_content + if ignore: + continue + msg["content"] = str(msg["content"]) # TODO: better handling mm data + if msg["role"] == "system": + author = "initialization" + if msg["role"] == "tool": + author = "env" + else: + author = "env" + + self.full_context += [ + ExtendedMessage( + author=author, + role=msg["role"], + content=msg["content"], + tokenizer=self.tokenizer, + tools=tools, + tool_calls=(msg["tool_calls"] if "tool_calls" in msg else []), + token_generator="auto", + ) + ] + + # check token overflow + converted_message = self.to_role_content(self.full_context) + context_safe, info = self.check_context_token_num_safe(converted_message, tools) + custom_sampling_params = {} + if not context_safe: + self.context_overflow = True + + return context_safe, info, converted_message, custom_sampling_params, tools + + def step_track( + self, + llm_output, + context_safe, + converted_message: List[dict], + tools: List = [], + ): + if not self.already_mad_flag: + if ( + compute_string_madness( + completion=llm_output["content"], + checklist=self.config.astune.rollout.compute_madness_checklist, + ) + < 0.0 + ): + self.already_mad_flag = True + + # dummy response for now + token_generator = "manual" + err_type = "" + if (llm_output.get("tool_calls", None) is not None): + tool_calls = llm_output["tool_calls"] + if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): + # check tool call formating + copy_tool_calls = copy.deepcopy(tool_calls) + wrong_toolcall = False + for i in range(len(copy_tool_calls)): + if ('function' in copy_tool_calls[i]) and ('arguments' in copy_tool_calls[i]['function']): + try: + expect_dict = json.loads(copy_tool_calls[i]['function']['arguments']) + if not isinstance(expect_dict, dict): + wrong_toolcall = True + err_type = "cannot parse arguments" + from vsdb import bp; bp("UPUP1") + except: + wrong_toolcall = True + err_type = "arguments not json" + from vsdb import bp; bp("UPUP3") + else: + wrong_toolcall = True + err_type = "no function or no arguments" + from vsdb import bp; bp("UPUP4") + if wrong_toolcall: + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n") + self.already_mad_flag = True + else: + logger.success("Toolcall format check passed.") + elif ('' in llm_output["content"]): + from vsdb import bp; bp("UPUP2") + logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n") + self.already_mad_flag = True + tool_calls = [] + else: + tool_calls = [] + + llm_ext_msg = ExtendedMessage( + author="llm", + role="assistant", + content=llm_output["content"], + token_generator=token_generator, + tool_calls=tool_calls, + tokenizer=self.tokenizer, + ) + + if token_generator == "manual": + input_msg_ref = copy.deepcopy(converted_message) + token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response( + input_msg_ref, llm_output, tools=tools + ) + assert ( + len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn + ), f"Generated token length {len(token_arr_method2)} exceeds max_response_length_in_one_turn {self.config.astune.rollout.max_response_length_in_one_turn}" + llm_ext_msg.token_arr = token_arr_method2 + llm_ext_msg.token_logprob_arr = token_logprob_arr + self.generated_token_callback_fn(llm_ext_msg.token_arr) + + # take snapshot of current timeline + if context_safe: + self.full_context += [llm_ext_msg] + is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) + if length > self.config.astune.rollout.max_model_len: + raise RuntimeError( + f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" + ) + self.grouped_steps += [copy.deepcopy(self.full_context)] + + # DEBUG = True # warn when merge fails + # if ( + # DEBUG + # and len(self.grouped_steps) >= 2 + # and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])) + # ): + # print(f"General Warning: merge failure discovered.") + + return None + + def process_reward(self, reward_structure: Reward): + self.reward_structure = reward_structure + ext_steps = self.full_context + self.reward_structure.step_reward = [ + self.compute_step_level_reward( + ext_steps=ext_steps, + index=i, + total_steps=len(self.grouped_steps), + ) + for i in range(len(self.grouped_steps)) + ] + + def generate_log(self, task_id=None, global_step="NA"): + task_id = self.task_id + nested_items_print_buffer = {} + step_reward = 0.0 + + for index, ext_steps in enumerate(self.grouped_steps): + cmt_tokenized = self.tokenize_steps( + ext_steps=ext_steps, + index=index, + total_steps=len(self.grouped_steps), + ) + text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] + input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] + # loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] + logprobs = [INVALID_LOG_PROB_VALUE] * len(cmt_tokenized["prompt_ids"]) + cmt_tokenized[ + "response_logprobs" + ] + # Create adjusted color array + loss_mask_color_abl_arr = [ + ( + adjust_color_hsl("#09ABCF", logprob) + if mask == 1 + else adjust_color_hsl("#D98510", logprob) + ) + for mask, logprob in zip(cmt_tokenized["loss_mask"], logprobs) + ] + logprob_text_arr = [ + (f"{logprob:.4f}" if logprob != INVALID_LOG_PROB_VALUE else "N/A") + for logprob in logprobs + ] + + buffer = { + "text_arr": text_arr, + "logprob_arr": logprob_text_arr, + "input_id_arr": input_id_arr, + "loss_mask_color_arr": loss_mask_color_abl_arr, + } + raw_reward = self.reward_structure.raw_reward + step_reward: float = self.reward_structure.step_reward[index] + try: + step_advantage = self.reward_structure.step_advantage[index] + step_advantage_simple = self.reward_structure.step_advantage_simple[index] + except: + step_advantage = 0.0 + step_advantage_simple = 0.0 + task_outcome = str(self.reward_structure.success_rate) + selectors = [task_id, task_outcome, str(index)] + len_prompt_ids = len(cmt_tokenized["prompt_ids"]) + len_response_ids = len(cmt_tokenized["response_ids"]) + len_input_ids = len(cmt_tokenized["input_ids"]) + assert ( + len_prompt_ids + len_response_ids == len_input_ids + ), "len_prompt_ids + len_response_ids should equal to len_input_ids" + nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( + item_id=f"item", # type: ignore + outcome=task_outcome, # type: ignore + len_prompt_ids=len_prompt_ids, # type: ignore + len_response_ids=len_response_ids, # type: ignore + len_input_ids=len_input_ids, # type: ignore + raw_reward=f"{float(raw_reward):.3f}", # type: ignore + step_reward=f"{float(step_reward):.3f}", # type: ignore + step_advantage=f"{float(step_advantage):.3f}", # type: ignore + step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore + content=SeqItem( + text=buffer["text_arr"], # text content + title=buffer["logprob_arr"], # mouse hover text + count=buffer["input_id_arr"], # highlight text # type: ignore + color=buffer["loss_mask_color_arr"], # color + ), + ) + + print_nested( + nested_items_print_buffer, + main_content="This is the main content of the nested JSON", + header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", # type: ignore + mod="rollout", + narrow=False, + attach="copy this", # type: ignore + ) + + def group_merge(self) -> List[List[ExtendedMessage]]: + self.grouped_steps = merge_tracker_timelines(self.grouped_steps) + return self.grouped_steps + + def group_tokenize(self): + return self.group_tokenize_multi_group() + + def get_inc(self, text_frag_from, text_frag_to): + """ + Get the incremental token array from text_frag_from to text_frag_to. + """ + tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) + tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore + token_ids_acc = tokenizer_input_ids + + tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) + input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step + overlap_length = 0 + for i in range(len(token_ids_acc)): + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: + overlap_length += 1 + else: + break + msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" + # print(msg) + return input_id_increment, msg + + def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore + dict_messages = self.to_role_content(ext_messages) + + prompt_text = self.tokenizer.apply_chat_template( + dict_messages, + tokenize=False, + add_generation_prompt=True, + tools=tools, + ) + length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore + max_response_length = self.config.astune.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.astune.rollout.max_model_len + max_seq_length: int = max_model_len - max_response_length + + if length < max_seq_length: + ret = [True, length] + else: + ret = [False, length] + return tuple(ret) + + def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, str]: + prompt_text = self.tokenizer.apply_chat_template( + messages, tokenize=False, add_generation_prompt=True, tools=tools + ) + length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore + max_response_length = self.config.astune.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.astune.rollout.max_model_len + max_seq_length: int = max_model_len - max_response_length + if self.should_interrupt_fn(): + ret = [False, "externally_interrupted"] + if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: + ret = [False, "already_mad"] + if length < max_seq_length: + ret = [ + True, + f"safe[{length} < {max_model_len} - {max_response_length}]", + ] + else: + ret = [False, "token_overflow"] + return tuple(ret) + + def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: + result = [] + for ext_msg in ext_msg_array: + d = { + "role": ext_msg.role, + "content": ext_msg.content_for_future, + } + if ext_msg.tool_calls: + d.update({"tool_calls": ext_msg.tool_calls}) + result.append(d) + return result + + def apply_chat_template_for_ext_messages( + self, ext_messages: List[ExtendedMessage], tools: List = [] + ) -> str: + dict_messages = self.to_role_content(ext_messages) + prompt_text = self.tokenizer.apply_chat_template( + dict_messages, + tokenize=False, + add_generation_prompt=True, + tools=tools, + ) + return prompt_text # type: ignore diff --git a/astune/context_tracker/agentscope_tracker/timeline_merging.py b/astune/context_tracker/agentscope_tracker/timeline_merging.py new file mode 100644 index 00000000..4f619405 --- /dev/null +++ b/astune/context_tracker/agentscope_tracker/timeline_merging.py @@ -0,0 +1,108 @@ +from typing import List, Type +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + ExtendedMessage, + replace_token_ids, +) +from beast_logger import ( + print_nested, + print_listofdict, + NestedJsonItem, + SeqItem, +) + + +def can_merge_steps( + source_timeline: List[ExtendedMessage], + target_timeline: List[ExtendedMessage], + debug=False, +) -> bool: + + can_merge = False + compare_level = "text" # relaxed compare with text, more easier to match, at very little cost + if len(source_timeline) >= len(target_timeline): + all_msg_match = True + for i in range(len(target_timeline)): + if compare_level == "text": + same = ( + source_timeline[i].content_for_future == target_timeline[i].content_for_future + ) + elif compare_level == "token": + same = source_timeline[i].token_arr == target_timeline[i].token_arr + else: + raise NotImplementedError + if not same: + all_msg_match = False + break + if all_msg_match: + can_merge = True + + if debug: + debug_listofdict = [] + if len(source_timeline) >= len(target_timeline): + all_msg_match = False + for i in range(len(target_timeline)): + d = {} + d["source"] = source_timeline[i].content_for_future + d["target"] = target_timeline[i].content_for_future + if compare_level == "text": + same = ( + source_timeline[i].content_for_future + == target_timeline[i].content_for_future + ) + elif compare_level == "token": + same = source_timeline[i].token_arr == target_timeline[i].token_arr + else: + raise NotImplementedError + if not same: + d["match"] = "NO" + else: + d["match"] = "YES" + debug_listofdict.append(d) + print_listofdict(debug_listofdict, header=f"can_merge_steps debug: {can_merge}") + + return can_merge + + +def merge_tracker_timelines( + timelines: List[List[ExtendedMessage]], +) -> List[List[ExtendedMessage]]: + + def toggle_author( + source_timeline: List[ExtendedMessage], + target_timeline: List[ExtendedMessage], + ) -> List[ExtendedMessage]: + # if any message in `target_timeline` is author == 'llm', but same-index message in `source_timeline` is author != 'llm' + # change source_timeline's message author to 'llm' + for i in range(len(target_timeline)): + if target_timeline[i].author == "llm" and source_timeline[i].author != "llm": + source_timeline[i].author = target_timeline[i].author + source_timeline[i].token_arr = target_timeline[i].token_arr + source_timeline[i].token_logprob_arr = target_timeline[i].token_logprob_arr + assert source_timeline[i].need_training + return source_timeline + + absorbed_step_indices = [] + reversed_timelines = list(reversed(timelines)) + for i in range(len(reversed_timelines)): + if i in absorbed_step_indices: + continue + # check whether [i, len(reversed_timelines)-1] can be merged + for j in range(i + 1, len(reversed_timelines)): + if j in absorbed_step_indices: + continue + source_timeline = reversed_timelines[i] + target_timeline = reversed_timelines[j] + if can_merge_steps(source_timeline, target_timeline): + source_timeline = toggle_author(source_timeline, target_timeline) + reversed_timelines[i] = source_timeline + absorbed_step_indices += [j] + + # reverse back and exclude absorbed steps + reversed_timelines_clean = [] + for i in range(len(reversed_timelines)): + if i not in absorbed_step_indices: + reversed_timelines_clean.append(reversed_timelines[i]) + timelines = list(reversed(reversed_timelines_clean)) + + return timelines diff --git a/astune/context_manager/cmt_linear.py b/astune/context_tracker/basic_tracker.py similarity index 65% rename from astune/context_manager/cmt_linear.py rename to astune/context_tracker/basic_tracker.py index 9756a7fc..e6098e04 100644 --- a/astune/context_manager/cmt_linear.py +++ b/astune/context_tracker/basic_tracker.py @@ -5,15 +5,22 @@ from typing import List, Union, Tuple, Optional from astune.schema.trajectory import Sample, Reward from astune.utils.compute_madness import compute_string_madness -from astune.context_manager.cmt_base_attr import CMTBaseAttr -from astune.context_manager.cmt_base_attr import ExtendedMessage -from astune.context_manager.cmt_base_attr import replace_token_ids -from beast_logger import register_logger, print_dict, print_listofdict, print_nested, NestedJsonItem, SeqItem - - -class CMTLinear(CMTBaseAttr): +from astune.context_tracker.tracker_base_attr import TrackerAttr +from astune.context_tracker.tracker_base_attr import ExtendedMessage +from astune.context_tracker.tracker_base_attr import replace_token_ids +from beast_logger import ( + register_logger, + print_dict, + print_listofdict, + print_nested, + NestedJsonItem, + SeqItem, +) + + +class BasicContextTracker(TrackerAttr): """ - A linear context manager template that handles the conversation flow between LLM and environment. + A linear context tracker template that handles the conversation flow between LLM and environment. This class manages the context window, tokenization, and message history in a linear fashion. Attributes: @@ -38,9 +45,7 @@ class CMTLinear(CMTBaseAttr): 9. group_tokenize """ - - - def prepare_previous_context(self, mod='future'): + def prepare_previous_context(self, mod="future"): """ Prepare the input context for future LLM call. @@ -48,18 +53,28 @@ def prepare_previous_context(self, mod='future'): list: Array of message dictionaries containing role and content_for_future, formatted for LLM input. """ - if mod=='future': + if mod == "future": message_arr = [ - {"role": c.role, "content": c.content_for_future, "tool_calls": c.tool_calls} + { + "role": c.role, + "content": c.content_for_future, + "tool_calls": c.tool_calls, + } for c in self.full_context ] - elif mod=='raw': + elif mod == "raw": message_arr = [ - {"role": c.role, "content": c.content, "tool_calls": c.tool_calls} + { + "role": c.role, + "content": c.content, + "tool_calls": c.tool_calls, + } for c in self.full_context ] else: - raise ValueError(f"Unknown mod {mod} in prepare_previous_context, only support 'future' and 'raw'") + raise ValueError( + f"Unknown mod {mod} in prepare_previous_context, only support 'future' and 'raw'" + ) # remove tool_calls from messages if empty for i in range(len(message_arr)): @@ -67,24 +82,30 @@ def prepare_previous_context(self, mod='future'): message_arr[i].pop("tool_calls") return message_arr - def check_context_token_num_safe(self, messages: List[dict], tools: List[dict] = []) -> Tuple[bool, str]: + def check_context_token_num_safe( + self, messages: List[dict], tools: List[dict] = [] + ) -> Tuple[bool, str]: def get_seq_length(messages): prompt_text = self.tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, - tools=tools + tools=tools, ) - return len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) + return len( + self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0] + ) + if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: return False, "already_mad" messages = self.prepare_previous_context(mod="raw") - if get_seq_length(messages) < self.max_seq_length: # self.config.env_engine.max_seq_length = 20480 + if ( + get_seq_length(messages) < self.max_seq_length + ): # self.config.env_engine.max_seq_length = 20480 return True, "safe" else: return False, "token_overflow" - def get_inc(self, text_frag_from, text_frag_to): """ Get the incremental token array from text_frag_from to text_frag_to. @@ -95,11 +116,15 @@ def get_inc(self, text_frag_from, text_frag_to): tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) input_ids = tokenizer_output["input_ids"][0].tolist() - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 - else: break + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: + overlap_length += 1 + else: + break msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" # print(msg) return input_id_increment, msg @@ -109,24 +134,25 @@ def remove_last_context(self): if self.full_context[-1].author != "llm": self.full_context.pop(-1) - def remove_last_non_llm_msg(self, ext_msg_list:List[ExtendedMessage]): + def remove_last_non_llm_msg(self, ext_msg_list: List[ExtendedMessage]): if len(ext_msg_list) > 0: if ext_msg_list[-1].author != "llm": ext_msg_list.pop(-1) return ext_msg_list - - @property def steps(self): - return self.prepare_previous_context(mod='future') - + return self.prepare_previous_context(mod="future") def prepare_next_llm_context(self): - return self.prepare_previous_context(mod='future') - - - def save_init_input(self, init_input_arr:list, add_nothink: bool=False, tools: List[dict]=[]): + return self.prepare_previous_context(mod="future") + + def save_init_input( + self, + init_input_arr: list, + add_nothink: bool = False, + tools: List[dict] = [], + ): """ Save and process the initial input messages to the context. @@ -143,11 +169,11 @@ def save_init_input(self, init_input_arr:list, add_nothink: bool=False, tools: L assert len(self.full_context) == 0, "full_context should be empty when saving init input" for index, llm_msg in enumerate(init_input_arr): if (index == len(init_input_arr) - 1) and add_nothink: - llm_msg['content'] += "\n/no_think" + llm_msg["content"] += "\n/no_think" ext_msg = ExtendedMessage( author="initialization", - role=llm_msg['role'], - content=llm_msg['content'], + role=llm_msg["role"], + content=llm_msg["content"], token_generator="manual", tokenizer=self.tokenizer, ) @@ -155,16 +181,26 @@ def save_init_input(self, init_input_arr:list, add_nothink: bool=False, tools: L # compute token array for each message token_ids_acc = [] - for llm_msg, ext_msg, index in zip(init_input_arr, self.full_context, range(len(init_input_arr))): - text_with_chat_template = self.tokenizer.apply_chat_template(init_input_arr[:(index+1)], tokenize=False, tools=tools) - tokenizer_output = self.tokenizer(text_with_chat_template, return_tensors="pt", padding=False) + for llm_msg, ext_msg, index in zip( + init_input_arr, self.full_context, range(len(init_input_arr)) + ): + text_with_chat_template = self.tokenizer.apply_chat_template( + init_input_arr[: (index + 1)], tokenize=False, tools=tools + ) + tokenizer_output = self.tokenizer( + text_with_chat_template, return_tensors="pt", padding=False + ) input_ids = tokenizer_output["input_ids"][0].tolist() # attention_mask = outputs["attention_mask"][0].tolist() - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): - if (i < len(token_ids_acc)) and (input_ids[i] == token_ids_acc[i]): overlap_length += 1 - else: break + if (i < len(token_ids_acc)) and (input_ids[i] == token_ids_acc[i]): + overlap_length += 1 + else: + break ext_msg._info = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" ext_msg.token_arr = input_id_increment token_ids_acc += input_ids @@ -186,44 +222,71 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= """ # save basic assert isinstance(llm_output, dict) - token_generator = "manual" if 'tokens' in llm_output else "auto" + token_generator = "manual" if "tokens" in llm_output else "auto" ext_msg = ExtendedMessage( author="llm", - role=llm_output['role'], - content=llm_output['content'], + role=llm_output["role"], + content=llm_output["content"], token_generator=token_generator, tokenizer=self.tokenizer, ) if auto_register_full_context: self.full_context += [ext_msg] if not self.already_mad_flag: - if compute_string_madness(completion=llm_output['content'], checklist=self.config.astune.rollout.compute_madness_checklist) < 0.0: + if ( + compute_string_madness( + completion=llm_output["content"], + checklist=self.config.astune.rollout.compute_madness_checklist, + ) + < 0.0 + ): self.already_mad_flag = True if token_generator == "manual": - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output) + token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response( + input_msg_ref, llm_output + ) ext_msg.token_arr = token_arr_method2 ext_msg.token_logprob_arr = token_logprob_arr return ext_msg # generate token - def get_token_inc_from_vllm_response(self, input_msg_ref, llm_output, tools: List[dict]=[]) -> Tuple[List[int], List[int]]: + def get_token_inc_from_vllm_response( + self, input_msg_ref, llm_output, tools: List[dict] = [] + ) -> Tuple[List[int], List[int]]: generation_prompt_token, msg = self.get_inc( - self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=False, tools=tools), - self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, add_generation_prompt=True, tools=tools), + self.tokenizer.apply_chat_template( + input_msg_ref, + tokenize=False, + add_generation_prompt=False, + tools=tools, + ), + self.tokenizer.apply_chat_template( + input_msg_ref, + tokenize=False, + add_generation_prompt=True, + tools=tools, + ), ) # completion_token_arr will contain generation_prompt header - llm_output_role_content = { "role": llm_output['role'], "content": llm_output['content'] } - if not llm_output.get('tool_calls', None): - llm_output_role_content.update({ "tool_calls": llm_output.get('tool_calls', []) }) + llm_output_role_content = { + "role": llm_output["role"], + "content": llm_output["content"], + } + if llm_output.get("tool_calls", None): + llm_output_role_content.update({"tool_calls": llm_output.get("tool_calls", [])}) completion_token_arr, msg2 = self.get_inc( self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, tools=tools), - self.tokenizer.apply_chat_template(input_msg_ref + [ llm_output_role_content ], tokenize=False, tools=tools), + self.tokenizer.apply_chat_template( + input_msg_ref + [llm_output_role_content], + tokenize=False, + tools=tools, + ), ) - vllm_output_raw_token = [t.token_id for t in llm_output['tokens']] - vllm_output_raw_logprob = [t.logprob for t in llm_output['tokens']] + vllm_output_raw_token = [t.token_id for t in llm_output["tokens"]] + vllm_output_raw_logprob = [t.logprob for t in llm_output["tokens"]] self.generated_token_cnt += len(vllm_output_raw_token) final_token_arr, token_logprob_arr = replace_token_ids( place_holder=completion_token_arr, @@ -235,10 +298,16 @@ def get_token_inc_from_vllm_response(self, input_msg_ref, llm_output, tools: Lis return final_token_arr, token_logprob_arr def save_llm_output_do_not_register_full_context(self, llm_output, input_msg_ref): - return CMTLinear.save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context=False) - + return BasicContextTracker.save_llm_output( + self, llm_output, input_msg_ref, auto_register_full_context=False + ) - def save_env_output(self, env_output:dict, input_msg_ref:Optional[List[dict]]=None, add_nothink=False): + def save_env_output( + self, + env_output: dict, + input_msg_ref: Optional[List[dict]] = None, + add_nothink=False, + ): """ Save and process environment output to the context. @@ -252,16 +321,18 @@ def save_env_output(self, env_output:dict, input_msg_ref:Optional[List[dict]]=No - Computes and stores token arrays for the environment response """ assert isinstance(env_output, dict) - if ('content' not in env_output) and ('error' in env_output): - env_output['content'] = f"[Error from environment: {env_output['error']}]" - elif ('content' not in env_output) or (not env_output['content']): - env_output['content'] = 'Warning: the environment does not provide any feedback, please provide valid inpu and try again.' + if ("content" not in env_output) and ("error" in env_output): + env_output["content"] = f"[Error from environment: {env_output['error']}]" + elif ("content" not in env_output) or (not env_output["content"]): + env_output["content"] = ( + "Warning: the environment does not provide any feedback, please provide valid inpu and try again." + ) if add_nothink: - env_output['content'] += " /no_think" + env_output["content"] += " /no_think" ext_msg = ExtendedMessage( author="env", role="user", - content=env_output['content'], + content=env_output["content"], clip=True, clip_token_limit=self.max_env_output_length, token_generator="auto", @@ -298,25 +369,30 @@ def prepare_world_interaction(self) -> str: return latest_content def filter_context_via_author(self, author: str) -> List[ExtendedMessage]: - return copy.deepcopy([ c for c in self.full_context if c.author == author ]) + return copy.deepcopy([c for c in self.full_context if c.author == author]) def filter_context_via_authors(self, authors: List[str]) -> List[ExtendedMessage]: - return copy.deepcopy([ c for c in self.full_context if c.author in authors ]) + return copy.deepcopy([c for c in self.full_context if c.author in authors]) - def filter_context_via_authors_with_limit(self, authors: List[str], limit: dict) -> List[ExtendedMessage]: + def filter_context_via_authors_with_limit( + self, authors: List[str], limit: dict + ) -> List[ExtendedMessage]: """ limit = { "llm": "keep_last@2" "env": "keep_first@2" } """ - filtered_via_authors = copy.deepcopy([ c for c in self.full_context if c.author in authors ]) + filtered_via_authors = copy.deepcopy([c for c in self.full_context if c.author in authors]) for limit_author, limit_item in limit.items(): - limit_item_command, limit_item_value = limit_item.split('@') + limit_item_command, limit_item_value = limit_item.split("@") if limit_item_command == "keep_last": limit_item_value = int(limit_item_value) # remove all message whose author is `llm_author` except the last `limit_item_value` messages - num_need_rm = len([ c for c in filtered_via_authors if c.author == limit_author ]) - limit_item_value + num_need_rm = ( + len([c for c in filtered_via_authors if c.author == limit_author]) + - limit_item_value + ) if num_need_rm > 0: num_already_rm = 0 filtered_via_authors_new = [] @@ -331,7 +407,10 @@ def filter_context_via_authors_with_limit(self, authors: List[str], limit: dict) elif limit_item_command == "keep_first": limit_item_value = int(limit_item_value) # remove all message whose author is `llm_author` except the first `limit_item_value` messages - num_need_keep = len([ c for c in filtered_via_authors if c.author == limit_author ]) - limit_item_value + num_need_keep = ( + len([c for c in filtered_via_authors if c.author == limit_author]) + - limit_item_value + ) if num_need_keep > 0: num_already_keep = 0 filtered_via_authors_new = [] @@ -344,7 +423,9 @@ def filter_context_via_authors_with_limit(self, authors: List[str], limit: dict) filtered_via_authors = filtered_via_authors_new else: - raise ValueError(f"Unknown limit_item_command {limit_item_command} in filter_context_via_authors_with_limit") + raise ValueError( + f"Unknown limit_item_command {limit_item_command} in filter_context_via_authors_with_limit" + ) return filtered_via_authors def group_tokenize(self): @@ -352,10 +433,9 @@ def group_tokenize(self): ext_steps = self.full_context cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=0, total_steps=1) sample = Sample( - cmt_tokenized = cmt_tokenized, + cmt_tokenized=cmt_tokenized, messages=self.to_role_content(ext_steps), config=self.config, - task_batch_index=self.task_batch_index, task_tag=self.task_tag, task_id=self.task_id, @@ -368,12 +448,15 @@ def group_tokenize_multi_group(self): sample_arr = [] max_num_group = self.config.astune.rollout.multi_turn.max_sample_per_task for index, ext_steps in enumerate(self.grouped_steps): - cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=index, total_steps=len(self.grouped_steps)) + cmt_tokenized = self.tokenize_steps( + ext_steps=ext_steps, + index=index, + total_steps=len(self.grouped_steps), + ) sample = Sample( - cmt_tokenized = cmt_tokenized, + cmt_tokenized=cmt_tokenized, messages=self.to_role_content(ext_steps), config=self.config, - task_batch_index=self.task_batch_index, task_tag=self.task_tag, task_id=self.task_id, @@ -383,18 +466,21 @@ def group_tokenize_multi_group(self): if len(sample_arr) > max_num_group: print(f"Warning: allow {max_num_group} groups, but got {len(sample_arr)} groups") import random - sample_arr = random.sample(sample_arr, max_num_group) # 随机保留 max_num_group 个组 + + sample_arr = random.sample(sample_arr, max_num_group) # preserve max_num_group groups return sample_arr def generate_log(self, task_id=None, global_step="NA"): task_id = self.task_id nested_items_print_buffer = {} - ext_steps=self.full_context + ext_steps = self.full_context cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=0, total_steps=1) text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] - loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in cmt_tokenized["loss_mask"]] + loss_mask_color_arr = [ + "#09ABCF" if mask == 1 else "#D98510" for mask in cmt_tokenized["loss_mask"] + ] buffer = { "text_arr": text_arr, "input_id_arr": input_id_arr, @@ -406,53 +492,53 @@ def generate_log(self, task_id=None, global_step="NA"): raw_reward = self.reward_structure.raw_reward step_reward = self.reward_structure.step_reward[0] try: - step_advantage = self.reward_structure.step_advantage[index] - step_advantage_simple = self.reward_structure.step_advantage_simple[index] + step_advantage = self.reward_structure.step_advantage[0] + step_advantage_simple = self.reward_structure.step_advantage_simple[0] except: step_advantage = 0.0 step_advantage_simple = 0.0 task_outcome = str(self.reward_structure.success_rate) selectors = [task_id, task_outcome] nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", # type: ignore - outcome=task_outcome, # type: ignore + item_id=f"item", # type: ignore + outcome=task_outcome, # type: ignore len_prompt_ids=len_prompt_ids, # type: ignore len_response_ids=len_response_ids, # type: ignore - len_input_ids=len_input_ids, # type: ignore + len_input_ids=len_input_ids, # type: ignore raw_reward=f"{float(raw_reward):.3f}", # type: ignore - step_reward=f"{float(step_reward):.3f}", # type: ignore + step_reward=f"{float(step_reward):.3f}", # type: ignore step_advantage=f"{float(step_advantage):.3f}", # type: ignore - step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore + step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore content=SeqItem( - text = buffer['text_arr'], # 文本 - title = buffer['text_arr'], # 鼠标悬浮文本 - count = buffer['input_id_arr'], # 高亮文本 - color = buffer['loss_mask_color_arr'] # 颜色 - ) + text=buffer["text_arr"], # text content + title=buffer["text_arr"], # mouse hover text + count=buffer["input_id_arr"], # h highlight text + color=buffer["loss_mask_color_arr"], # color + ), ) - print_nested(nested_items_print_buffer, + print_nested( + nested_items_print_buffer, main_content="This is the main content of the nested JSON", header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", mod="rollout", - narrow=False + narrow=False, ) - def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure ext_steps = self.full_context - # lienar 模式只有一条轨迹 + # linear mode has only one trajectory self.reward_structure.step_reward = [ self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) ] - def ensure_terminate_rollout_stage(self): - """Nothing need to be done for basic linear cmt at `ensure_terminate_rollout_stage` - """ + """Nothing need to be done for basic linear cmt at `ensure_terminate_rollout_stage`""" pass - def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int, total_steps:int)->float: + def compute_step_level_reward( + self, ext_steps: List[ExtendedMessage], index: int, total_steps: int + ) -> float: assert self.reward_structure is not None # --------------- global level reward --------------- @@ -468,43 +554,9 @@ def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int return step_reward - - # def compute_step_level_reward(self, ext_steps: List[ExtendedMessage], index: int, total_steps:int)->float: - # assert self.reward_structure is not None - # # --------------- global level reward --------------- - # global_reward = self.reward_structure.raw_reward - # # here we assume global reward is given at the end of the trajectory - # gamma = self.config.astune.rollout.gamma - # step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) - # # when index=0, total_steps=1, step_reward = global_reward * (gamma ** 0) = global_reward - # # when index=0, total_steps=2, step_reward = global_reward * (gamma ** 1) = global_reward * 0.95 - # # when index=0, total_steps=3, step_reward = global_reward * (gamma ** 2) = global_reward * 0.9025 - - # # --------------- compute step level reward --------------- - # step_reward = step_reward_base - # # # get all ext_step that need to be trained - # # trainable_ext_steps = [ ext_msg for ext_msg in ext_steps if ext_msg.need_training ] - - # # # --------------- compute step level reward: response madness --------------- - # # # in some cases, a step may contain multiple messages that need training, therefore we define mini_step - # # mini_step_reward = [] - # # for ext_msg in trainable_ext_steps: - # # assert ext_msg.need_training, "trainable_ext_steps should only contain messages that need training" - # # mini_step_reward += [compute_string_madness(completion=ext_msg.content_for_future)] - - # # if any([r < 0 for r in mini_step_reward]): - # # self.reward_structure.madness = -1.0 - # # step_reward = self.config.astune.rollout.agent_madness_reward - # # else: - # # pass - # if self.already_mad_flag: - # step_reward = self.config.astune.rollout.agent_madness_reward - # self.reward_structure.madness = -1.0 - - # return step_reward - - - def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_steps:int) -> dict: + def tokenize_steps( + self, ext_steps: List[ExtendedMessage], index: int, total_steps: int + ) -> dict: """ Create an Experience object from the current conversation context. @@ -519,11 +571,14 @@ def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_step - Truncates output IDs as needed """ from verl.utils.model import compute_position_id_with_mask + ext_steps = self.remove_last_non_llm_msg(ext_steps) # check reward structure - self.reward_structure: Reward # type: ignore - assert self.reward_structure.step_reward is not None, "must call `process_reward` before tokenize_steps" + self.reward_structure: Reward # type: ignore + assert ( + self.reward_structure.step_reward is not None + ), "must call `process_reward` before tokenize_steps" assert len(self.reward_structure.step_reward) == total_steps # mapping @@ -541,9 +596,13 @@ def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_step if (split_prompt_reponse_index == -1) and (ext_msg.need_training): split_prompt_reponse_index = len(input_ids) split_point_message_left_index = i - 1 - assert split_point_message_left_index >= 0, "There should be at least one message before the first training message" + assert ( + split_point_message_left_index >= 0 + ), "There should be at least one message before the first training message" assert split_prompt_reponse_index == input_ids_len[split_point_message_left_index] - assert ext_msg.author == 'llm', "The first message after initialization should be from LLM, not from env or user" + assert ( + ext_msg.author == "llm" + ), "The first message after initialization should be from LLM, not from env or user" # cat all tokens input_ids += ext_msg.token_arr @@ -559,49 +618,62 @@ def tokenize_steps(self, ext_steps: List[ExtendedMessage], index:int, total_step # should we begin split point early? if input_ids_len[-1] > self.config.astune.data.max_prompt_length: message_dict = self.to_role_content(ext_steps) - logger.error(f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix...") - logger.bind(exception=True).exception(f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix...\n\n" + str(message_dict)) - assert i >= 1, "There should be at least one message before exceeding max_prompt_length" - assert input_ids_len[-2] <= self.config.astune.data.max_prompt_length, "The previous message should be within max_prompt_length, something is wrong" + logger.warning( + f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix..." + ) + logger.bind(exception=True).exception( + f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix...\n\n" + + str(message_dict) + ) + assert ( + i >= 1 + ), "There should be at least one message before exceeding max_prompt_length" + assert ( + input_ids_len[-2] <= self.config.astune.data.max_prompt_length + ), "The previous message should be within max_prompt_length, something is wrong" split_point_message_left_index = i - 1 assert split_point_message_left_index == (len(input_ids_len) - 2), "what?" split_prompt_reponse_index = input_ids_len[split_point_message_left_index] # check - assert len(ext_steps) == len(input_ids_len), "length of ext_steps and input_ids_len should be equal" - assert split_prompt_reponse_index != -1, "split_prompt_reponse_index should not be -1, at least one message should be in the context" + assert len(ext_steps) == len( + input_ids_len + ), "length of ext_steps and input_ids_len should be equal" + assert ( + split_prompt_reponse_index != -1 + ), "split_prompt_reponse_index should not be -1, at least one message should be in the context" position_ids = compute_position_id_with_mask(torch.tensor(attention_mask)).tolist() # sperate prompt and response - prompt_ids = input_ids[:split_prompt_reponse_index] + prompt_ids = input_ids[:split_prompt_reponse_index] prompt_attention_mask = attention_mask[:split_prompt_reponse_index] - prompt_position_ids = position_ids[:split_prompt_reponse_index] - prompt_loss_mask = loss_mask[:split_prompt_reponse_index] - prompt_logprobs = input_logprobs[:split_prompt_reponse_index] + prompt_position_ids = position_ids[:split_prompt_reponse_index] + prompt_loss_mask = loss_mask[:split_prompt_reponse_index] + prompt_logprobs = input_logprobs[:split_prompt_reponse_index] - response_ids = input_ids[split_prompt_reponse_index:] - response_attention_mask = attention_mask[split_prompt_reponse_index:] - response_position_ids = position_ids[split_prompt_reponse_index:] - response_loss_mask = loss_mask[split_prompt_reponse_index:] - response_logprobs = input_logprobs[split_prompt_reponse_index:] + response_ids = input_ids[split_prompt_reponse_index:] + response_attention_mask = attention_mask[split_prompt_reponse_index:] + response_position_ids = position_ids[split_prompt_reponse_index:] + response_loss_mask = loss_mask[split_prompt_reponse_index:] + response_logprobs = input_logprobs[split_prompt_reponse_index:] cmt_tokenized = {} - cmt_tokenized["input_ids"] = input_ids - cmt_tokenized["prompt_ids"] = prompt_ids - cmt_tokenized["response_ids"] = response_ids - cmt_tokenized["attention_mask"] = attention_mask - cmt_tokenized["logprobs"] = input_logprobs - cmt_tokenized["prompt_attention_mask"] = prompt_attention_mask - cmt_tokenized["response_attention_mask"] = response_attention_mask - cmt_tokenized["loss_mask"] = loss_mask - cmt_tokenized["prompt_loss_mask"] = prompt_loss_mask - cmt_tokenized["response_loss_mask"] = response_loss_mask - cmt_tokenized["position_ids"] = position_ids - cmt_tokenized["prompt_position_ids"] = prompt_position_ids - cmt_tokenized["response_position_ids"] = response_position_ids - cmt_tokenized["step_reward"] = self.reward_structure.step_reward[index] - cmt_tokenized["response_logprobs"] = response_logprobs - cmt_tokenized["prompt_logprobs"] = prompt_logprobs + cmt_tokenized["input_ids"] = input_ids + cmt_tokenized["prompt_ids"] = prompt_ids + cmt_tokenized["response_ids"] = response_ids + cmt_tokenized["attention_mask"] = attention_mask + cmt_tokenized["logprobs"] = input_logprobs + cmt_tokenized["prompt_attention_mask"] = prompt_attention_mask + cmt_tokenized["response_attention_mask"] = response_attention_mask + cmt_tokenized["loss_mask"] = loss_mask + cmt_tokenized["prompt_loss_mask"] = prompt_loss_mask + cmt_tokenized["response_loss_mask"] = response_loss_mask + cmt_tokenized["position_ids"] = position_ids + cmt_tokenized["prompt_position_ids"] = prompt_position_ids + cmt_tokenized["response_position_ids"] = response_position_ids + cmt_tokenized["step_reward"] = self.reward_structure.step_reward[index] + cmt_tokenized["response_logprobs"] = response_logprobs + cmt_tokenized["prompt_logprobs"] = prompt_logprobs try: cmt_tokenized["reference_advantage"] = self.reward_structure.step_advantage[index] except: @@ -620,7 +692,7 @@ def compute_reference_advantage(cmt_array: List): for task_id, cmt_list in task2cmt.items(): cmt_reward = [] - # 计算组内平均和标准差 + # compute in-group mean and std for cmt in cmt_list: cmt_reward += [np.mean(cmt.reward_structure.step_reward)] @@ -635,7 +707,7 @@ def compute_reference_advantage(cmt_array: List): # logger.bind(exception=True).info(f"task id {task_id}") # logger.bind(exception=True).info(f"reward_mean {reward_mean}, reward_std {reward_std}, cmt_reward {cmt_reward}") - # 计算 advantage + # compute advantage for cmt in cmt_list: cmt.reward_structure.step_advantage = [] for i in range(len(cmt.reward_structure.step_reward)): @@ -645,7 +717,7 @@ def compute_reference_advantage(cmt_array: List): # logger.bind(exception=True).info(f"step reward {cmt.reward_structure.step_reward}") # logger.bind(exception=True).info(f"step advantage {cmt.reward_structure.step_advantage}") - # 计算简单advantage (不均衡rollout sample数量) + # compute simple advantage (uneven rollout sample count) for task_id, cmt_list in task2cmt.items(): cmt_reward = [] for cmt in cmt_list: @@ -666,5 +738,3 @@ def compute_reference_advantage(cmt_array: List): ] return - - diff --git a/astune/context_tracker/tracker_base_attr.py b/astune/context_tracker/tracker_base_attr.py new file mode 100644 index 00000000..ad7b8550 --- /dev/null +++ b/astune/context_tracker/tracker_base_attr.py @@ -0,0 +1,62 @@ +from typing import List, Union, Tuple +from transformers.tokenization_utils import PreTrainedTokenizer +from astune.schema.extended_msg import ExtendedMessage +from astune.schema.extended_msg import find_sublist_indices +from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE +from astune.schema.trajectory import Reward +from loguru import logger + + +def replace_token_ids( + place_holder, replace_with, begin, end, raw_logprob +) -> Tuple[List[int], List[int]]: + _begin_index = find_sublist_indices(place_holder, begin) + len(begin) + _end_index = find_sublist_indices(place_holder, end, reverse=True) + + if replace_with[-len(end) :] == end: # remove end token + replace_with = replace_with[: -len(end)] + raw_logprob = raw_logprob[: -len(end)] + if replace_with[: len(begin)] == begin: # remove begin token + replace_with = replace_with[len(begin) :] + raw_logprob = raw_logprob[len(begin) :] + + final = place_holder[:_begin_index] + replace_with + place_holder[_end_index:] + final_logprob = ( + [INVALID_LOG_PROB_VALUE] * _begin_index + + raw_logprob + + [INVALID_LOG_PROB_VALUE] * (len(place_holder) - _end_index) + ) + return final, final_logprob + + +class TrackerAttr(object): + + def __init__(self, config, tokenizer, **kwargs): + self.task_batch_index = kwargs.get("task_batch_index", "undefined") + self.task_tag = kwargs.get("task_tag", "undefined") + self.task_id = kwargs.get("task_id", "undefined") + self.config = config + self.tokenizer = tokenizer + self.full_context: List[ExtendedMessage] = [] + self.grouped_steps: List[List[ExtendedMessage]] = [] + self.current_context_status = "" + max_response_length = self.config.astune.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.astune.rollout.max_model_len + self.max_seq_length: int = max_model_len - max_response_length + self.max_env_output_length: int = self.config.astune.rollout.max_env_len + self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") + self.generated_token_cnt = 0 + self.terminal_rewards_dict = {} + self.discarded = False + self.is_terminated = False + self.reward_structure: Union[Reward, None] = None + self.context_time_cost = 0 + self.tag = "" + self.current_batch_success_rate: float = -1.0 + self.already_mad_flag = False + self.round_cnt = 0 + + assert ( + self.config.astune.data.max_prompt_length + self.config.astune.data.max_response_length + <= max_model_len + ) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index c0fb2dd0..f468d0ca 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -1,4 +1,4 @@ -# ------------------ 主要配置 ------------------ +# ------------------ main configuration ------------------ astune: project_name: appworld_astune experiment_name: "read_yaml_name" @@ -24,6 +24,8 @@ astune: task_judge: judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 model: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -35,7 +37,7 @@ astune: rollout: use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol agentscope_disable_toolcalls: False max_env_worker: 128 use_step_reward_from_env: False @@ -61,6 +63,8 @@ astune: step_skip_action: 0 # skip action generation every N steps, 0 means never skip submit_oversample_multiplier: 1.5 enable_oversample: True + tensor_model_parallel_size: 1 + max_num_seqs: 10 num_repeat: 4 name: vllm val_kwargs: @@ -70,19 +74,19 @@ astune: do_sample: False num_repeat: 1 - context_manager: # context manager protocol is used ONLY when `use_agentscope_protocol=False` - context_manager_type: "linear" + context_tracker: # context tracker protocol is used ONLY when `use_agentscope_protocol=False` + context_tracker_type: "linear" alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - auto_context_cm: - train_sp_action: False - token_num_trigger_clip: 8000 - sliding_window_cm: - enable_llm_memory_extraction: False - linear_think_cm: - remove_think_before_submit_as_action: False - extract_box_before_submit_as_action: False - train_history_infer_token: True + # auto_context_cm: + # train_sp_action: False + # token_num_trigger_clip: 8000 + # sliding_window_cm: + # enable_llm_memory_extraction: False + # linear_think_cm: + # remove_think_before_submit_as_action: False + # extract_box_before_submit_as_action: False + # train_history_infer_token: True debug: debug_max_parallel: 16 @@ -92,8 +96,11 @@ astune: debug_tensor_parallel_size: 4 trainer_common: - val_before_train: True + val_before_train: False val_pass_n: 4 + save_freq: 20 + test_freq: 20 + total_epochs: 50 nnodes: 1 n_gpus_per_node: 8 logger: @@ -112,19 +119,21 @@ astune: use_kl_loss: True kl_loss_coef: 0.002 kl_loss_type: low_var_kl + trinity_only__n_gpu_for_infer: 2 # the tracing config tracing: - base_url: http://phoenix:port - train_output_path: /path/to/tasks.jsonl + base_url: ./.trash/database.sqlite + train_output_path: ./.trash/tasks.jsonl + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 2048 filters: - type: llm_evaluate enabled: true params: - custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" + custom_rubrics: If the answer claims that it has written the output to a file, consider it an invalid response. temperature: 0.5 - max_tokens: 2048 print_reason: false - - + execute_test: False # DO NOT EDIT, FOR TESTING PURPOSE ONLY + execute_testing_lambda: "" diff --git a/astune/default_config/trinity/README.md b/astune/default_config/trinity/README.md index 9a119385..5ffd2e27 100644 --- a/astune/default_config/trinity/README.md +++ b/astune/default_config/trinity/README.md @@ -19,4 +19,4 @@ trinity: ## change config mapping Some astune config has several configuration that is overlaps with trinity, -map them with `astune/default_config/trinity/config_auto_convertion_trinity.json` \ No newline at end of file +map them with `astune/default_config/trinity/config_auto_convertion_trinity.json` diff --git a/astune/default_config/trinity/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json index 934b58a4..a758e28f 100644 --- a/astune/default_config/trinity/config_auto_convertion_trinity.json +++ b/astune/default_config/trinity/config_auto_convertion_trinity.json @@ -1,6 +1,19 @@ { + "astune.trainer_common.nnodes": "cluster.node_num", + "astune.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", + "astune.trainer_common.total_epochs": "buffer.total_epochs", + "astune.trainer_common.trinity_only__n_gpu_for_infer": "explorer.rollout_model.engine_num", "astune.model.path": "model.model_path", "astune.project_name": "project", "astune.experiment_name": "name", - "astune.rollout.num_repeat": "algorithm.repeat_times" -} \ No newline at end of file + "astune.rollout.num_repeat": "algorithm.repeat_times", + "astune.trainer_common.save_freq": "trainer.save_interval", + "astune.trainer_common.test_freq": "explorer.eval_interval", + "astune.data.train_batch_size": "buffer.train_batch_size", + "astune.data.max_response_length": "model.max_response_tokens", + "astune.rollout.max_model_len": [ + "model.max_model_len", + "trainer.max_token_len_per_gpu" + ] + +} diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index ea4fb41c..52f7a552 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -47,12 +47,14 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 seed: 42 tensor_parallel_size: 1 tool_call_parser: hermes - runner_per_model: 12 + runner_per_model: 8 + # runner_state_report_interval: 30 model: max_model_len: 21000 max_response_tokens: 16000 monitor: monitor_type: swanlab + # monitor_type: tensorboard synchronizer: sync_interval: 2 sync_method: nccl @@ -60,7 +62,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 sync_timeout: 1200 trainer: grad_clip: 1.0 - max_token_len_per_gpu: 24576 + max_token_len_per_gpu: 20000 save_interval: 100 - ulysses_sequence_parallel_size: 2 - use_dynamic_bsz: true \ No newline at end of file + ulysses_sequence_parallel_size: 1 + use_dynamic_bsz: true diff --git a/astune/default_config/trinity/trinity_launch.yaml b/astune/default_config/trinity/trinity_launch.yaml index 7340446e..363fb0f3 100644 --- a/astune/default_config/trinity/trinity_launch.yaml +++ b/astune/default_config/trinity/trinity_launch.yaml @@ -1,3 +1,7 @@ +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD + algorithm: algorithm_type: multi_step_grpo optimizer: diff --git a/astune/default_config/verl/config_auto_convertion_verl.json b/astune/default_config/verl/config_auto_convertion_verl.json index 52f75be5..97cad2ab 100644 --- a/astune/default_config/verl/config_auto_convertion_verl.json +++ b/astune/default_config/verl/config_auto_convertion_verl.json @@ -1,4 +1,6 @@ { + "astune.trainer_common.total_epochs": "trainer.total_epochs", + "astune.trainer_common.val_before_train": "trainer.val_before_train", "astune.trainer_common.n_gpus_per_node": "trainer.n_gpus_per_node", "astune.trainer_common.nnodes": "trainer.nnodes", @@ -12,6 +14,8 @@ "astune.trainer_common.use_kl_loss": "actor_rollout_ref.actor.use_kl_loss", "astune.trainer_common.kl_loss_coef": "actor_rollout_ref.actor.kl_loss_coef", "astune.trainer_common.kl_loss_type": "actor_rollout_ref.actor.kl_loss_type", + "astune.trainer_common.save_freq": "trainer.save_freq", + "astune.trainer_common.test_freq": "trainer.test_freq", "astune.data.max_prompt_length": "data.max_prompt_length", "astune.data.max_response_length": "data.max_response_length", @@ -31,4 +35,4 @@ "astune.model.path": "actor_rollout_ref.model.path", "astune.project_name": "trainer.project_name", "astune.experiment_name": "trainer.experiment_name" -} \ No newline at end of file +} diff --git a/astune/default_config/verl/verl_default.yaml b/astune/default_config/verl/verl_default.yaml index 546ea7ad..9a203352 100644 --- a/astune/default_config/verl/verl_default.yaml +++ b/astune/default_config/verl/verl_default.yaml @@ -75,4 +75,3 @@ actor_rollout_ref: model: use_remove_padding: True enable_gradient_checkpointing: True - diff --git a/astune/main_trinity.py b/astune/main_trinity.py index 6864c830..62e54e0c 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -18,12 +18,16 @@ from trinity.explorer.explorer import Explorer from trinity.manager.state_manager import StateManager from trinity.trainer.trainer import Trainer -from trinity.utils.dlc_utils import is_running, setup_ray_cluster, stop_ray_cluster +from trinity.utils.dlc_utils import ( + is_running, + setup_ray_cluster, + stop_ray_cluster, +) from trinity.utils.log import get_logger from trinity.utils.plugin_loader import load_plugins # register trinity backbone modules -import astune.backbone_trinity.register_flow # noqa: F401 +import astune.backbone.trinity_compat_workflow # noqa: F401 logger = get_logger(__name__) @@ -175,6 +179,7 @@ def run(config_path: str, dlc: bool = False, plugin_dir: str = None): if os.path.exists(".env"): from dotenv import load_dotenv + load_dotenv(".env") atexit.register(lambda: send_train_message("0000")) @@ -182,7 +187,6 @@ def run(config_path: str, dlc: bool = False, plugin_dir: str = None): if plugin_dir: os.environ[PLUGIN_DIRS_ENV_VAR] = plugin_dir - load_plugins() config = load_config(config_path) @@ -305,7 +309,9 @@ def main() -> None: help="Path to the directory containing plugin modules.", ) run_parser.add_argument( - "--dlc", action="store_true", help="Specify when running in Aliyun PAI DLC." + "--dlc", + action="store_true", + help="Specify when running in Aliyun PAI DLC.", ) # studio command diff --git a/astune/main_verl.py b/astune/main_verl.py index 8e618935..93696002 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -30,6 +30,7 @@ from verl.utils.import_utils import load_extern_type from beast_logger import register_logger, print_dict + @hydra.main(config_path="config", config_name="ppo_trainer", version_base=None) def main(config): """Main entry point for PPO training with Hydra configuration management. @@ -52,26 +53,31 @@ def run_ppo(config) -> None: # Check if Ray is not initialized if not ray.is_initialized(): # this is for local ray cluster - runtime_env={ - "env_vars": - { - "TOKENIZERS_PARALLELISM": "true", - "NCCL_DEBUG": "WARN", - "VLLM_LOGGING_LEVEL": "WARN", - "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", - "VLLM_USE_V1": "1", - "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY"), - } + runtime_env = { + "env_vars": { + "TOKENIZERS_PARALLELISM": "true", + "NCCL_DEBUG": "WARN", + "VLLM_LOGGING_LEVEL": "WARN", + "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", + "VLLM_USE_V1": "1", + "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY"), + } } if os.getenv("RAY_record_task_actor_creation_sites"): - runtime_env["env_vars"].update({ - "RAY_record_task_actor_creation_sites": os.getenv("RAY_record_task_actor_creation_sites"), - }) + runtime_env["env_vars"].update( + { + "RAY_record_task_actor_creation_sites": os.getenv( + "RAY_record_task_actor_creation_sites" + ), + } + ) if os.getenv("BEST_LOGGER_WEB_SERVICE_URL"): - runtime_env["env_vars"].update({ - "BEST_LOGGER_WEB_SERVICE_URL": os.getenv("BEST_LOGGER_WEB_SERVICE_URL"), - }) + runtime_env["env_vars"].update( + { + "BEST_LOGGER_WEB_SERVICE_URL": os.getenv("BEST_LOGGER_WEB_SERVICE_URL"), + } + ) print_dict(runtime_env["env_vars"], "runtime_env") ray.init( runtime_env=runtime_env, @@ -90,7 +96,9 @@ def run_ppo(config) -> None: ): from verl.utils.import_utils import is_nvtx_available - assert is_nvtx_available(), "nvtx is not available in CUDA platform. Please 'pip3 install nvtx'" + assert ( + is_nvtx_available() + ), "nvtx is not available in CUDA platform. Please 'pip3 install nvtx'" nsight_options = OmegaConf.to_container(config.trainer.controller_nsight_options) runner = TaskRunner.options(runtime_env={"nsight": nsight_options}).remote() else: @@ -136,7 +144,8 @@ def run(self, config): # Download the checkpoint from HDFS to the local machine. # `use_shm` determines whether to use shared memory, which could lead to faster model loading if turned on local_path = copy_to_local( - config.astune.model.path, use_shm=config.actor_rollout_ref.model.get("use_shm", False) + config.astune.model.path, + use_shm=config.actor_rollout_ref.model.get("use_shm", False), ) # Instantiate the tokenizer and processor. @@ -151,7 +160,10 @@ def run(self, config): if config.actor_rollout_ref.actor.strategy in {"fsdp", "fsdp2"}: assert config.critic.strategy in {"fsdp", "fsdp2"} from verl.single_controller.ray import RayWorkerGroup - from verl.workers.fsdp_workers import ActorRolloutRefWorker, AsyncActorRolloutRefWorker + from verl.workers.fsdp_workers import ( + ActorRolloutRefWorker, + AsyncActorRolloutRefWorker, + ) use_legacy_worker_impl = config.trainer.get("use_legacy_worker_impl", "auto") if use_legacy_worker_impl in ["auto", "enable"]: @@ -175,8 +187,14 @@ def run(self, config): elif config.actor_rollout_ref.actor.strategy == "megatron": assert config.actor_rollout_ref.actor.strategy == config.critic.strategy - from verl.single_controller.ray.megatron import NVMegatronRayWorkerGroup - from verl.workers.megatron_workers import ActorRolloutRefWorker, AsyncActorRolloutRefWorker, CriticWorker + from verl.single_controller.ray.megatron import ( + NVMegatronRayWorkerGroup, + ) + from verl.workers.megatron_workers import ( + ActorRolloutRefWorker, + AsyncActorRolloutRefWorker, + CriticWorker, + ) actor_rollout_cls = ( AsyncActorRolloutRefWorker @@ -188,7 +206,10 @@ def run(self, config): else: raise NotImplementedError - from astune.backbone_others.trainer import ResourcePoolManager, Role + from astune.backbone.native_compat_trainer import ( + ResourcePoolManager, + Role, + ) # Map roles to their corresponding remote worker classes. role_worker_mapping = { @@ -230,24 +251,37 @@ def run(self, config): # Load the reward manager for training and validation. reward_fn = load_reward_manager( - config, tokenizer, num_examine=0, **config.reward_model.get("reward_kwargs", {}) + config, + tokenizer, + num_examine=0, + **config.reward_model.get("reward_kwargs", {}), ) val_reward_fn = load_reward_manager( - config, tokenizer, num_examine=1, **config.reward_model.get("reward_kwargs", {}) + config, + tokenizer, + num_examine=1, + **config.reward_model.get("reward_kwargs", {}), + ) + resource_pool_manager = ResourcePoolManager( + resource_pool_spec=resource_pool_spec, mapping=mapping ) - resource_pool_manager = ResourcePoolManager(resource_pool_spec=resource_pool_spec, mapping=mapping) from verl.utils.dataset.rl_dataset import collate_fn from astune.utils.process_dataset import create_rl_sampler # Create training and validation datasets. - from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + from astune.task_reader import ( + TaskReaderRouter, + task_to_standard_dataset, + ) + task_reader = TaskReaderRouter(config) val_dataset = task_to_standard_dataset(task_reader.get_validation_tasks()) train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from astune.backbone_others.trainer import ASTuneRayPPOTrainer + from astune.backbone.native_compat_trainer import ASTuneRayPPOTrainer + # Initialize the PPO trainer. trainer = ASTuneRayPPOTrainer( config=config, @@ -270,6 +304,5 @@ def run(self, config): trainer.fit() - if __name__ == "__main__": main() diff --git a/astune/main_vllm.py b/astune/main_vllm.py index da813aad..ff595b1b 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -6,23 +6,26 @@ from types import SimpleNamespace from astune.schema.task import Task from beast_logger import register_logger -from astune.parallel_env import ParallelEnvManager +from astune.task_rollout.native_parallel_worker import ParallelEnvManager from astune.utils.sms_agent import send_train_message + class TokenAndProb: def __init__(self, t): # ChatCompletionTokenLogprob(token='token_id:73594', bytes=[96, 96, 96], logprob=-1.9073468138230965e-06, top_logprobs=[]) - self.token_id = int(t.token.split('token_id:')[-1]) + self.token_id = int(t.token.split("token_id:")[-1]) self.logprob = t.logprob try: - self.decoded_string = bytes(t.bytes).decode('utf-8') + self.decoded_string = bytes(t.bytes).decode("utf-8") except: - self.decoded_string = '' + str(t.bytes) + self.decoded_string = "" + str(t.bytes) + -class ChatCompletionScheduler(): +class ChatCompletionScheduler: def __init__(self, url, config): from transformers import AutoTokenizer + self.url = url self.config = config self.tokenizer = AutoTokenizer.from_pretrained(self.config.astune.model.path) @@ -52,13 +55,13 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ model=self.config.astune.model.path, messages=messages, tools=tools, - extra_body=sampling_params + extra_body=sampling_params, ) else: completion = client.chat.completions.create( model=self.config.astune.model.path, messages=messages, - extra_body=sampling_params + extra_body=sampling_params, ) message = completion.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) @@ -66,13 +69,15 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ if "content" not in message: message["content"] = "" - messages.append({ - "role": message["role"], - "request_id":completion.id, - "content": message['content'], - "tool_calls": message.get("tool_calls", None), - "tokens": [TokenAndProb(t) for t in completion.choices[0].logprobs.content] # type: ignore - }) + messages.append( + { + "role": message["role"], + "request_id": completion.id, + "content": message["content"], + "tool_calls": message.get("tool_calls", None), + "tokens": [TokenAndProb(t) for t in completion.choices[0].logprobs.content], # type: ignore + } + ) return messages @@ -83,40 +88,53 @@ def run(config): vllm_port = config.astune.debug.debug_vllm_port # --------- init --------- - async_rollout_manager = ChatCompletionScheduler(config=config, url=f"http://localhost:{vllm_port}/v1") + async_rollout_manager = ChatCompletionScheduler( + config=config, url=f"http://localhost:{vllm_port}/v1" + ) parallel_env = ParallelEnvManager( config=config, async_rollout_manager=async_rollout_manager, max_parallel=max_parallel, max_llm_retries=3, llm_mode="remote", - tokenizer=async_rollout_manager.tokenizer + tokenizer=async_rollout_manager.tokenizer, ) from astune.task_reader import TaskReaderRouter + task_reader = TaskReaderRouter(config) tasks = task_reader.get_validation_tasks() print(tasks[:2]) - cmt = parallel_env.rollout(tasks=tasks[:n_task], mode="sample", epoch='1') # "sample" or "validate" + cmt = parallel_env.rollout( + tasks=tasks[:n_task], mode="sample", epoch="1" + ) # "sample" or "validate" gen_batch_output = parallel_env.to_dataproto(cmt) print("Generated batch output") -@hydra.main(config_path="astune/default_config", config_name="astune_default", version_base=None) +@hydra.main( + config_path="astune/default_config", + config_name="astune_default", + version_base=None, +) def main(config): from omegaconf import OmegaConf + OmegaConf.resolve(config) - print('*' * 20) + print("*" * 20) def companion_launch(): from astune.utils.smart_daemon import LaunchCommandWhenAbsent import torch + print("Launching companion process for async LLM server...") model_path = config.astune.model.path tensor_parallel_size = config.astune.debug.debug_tensor_parallel_size n_avail_gpus = torch.cuda.device_count() if tensor_parallel_size > n_avail_gpus: - print(f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}.") + print( + f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." + ) tensor_parallel_size = n_avail_gpus gpu_memory_utilization = config.actor_rollout_ref.rollout.gpu_memory_utilization max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs @@ -125,32 +143,49 @@ def companion_launch(): vllm_port = config.astune.debug.debug_vllm_port companion = LaunchCommandWhenAbsent( full_argument_list=[ - sys.executable, "-m", + sys.executable, + "-m", f"vllm.entrypoints.cli.main", - f"serve", f"{model_path}", - f"--tensor-parallel-size", f"{tensor_parallel_size}", - f"--dtype", f"auto", + f"serve", + f"{model_path}", + f"--tensor-parallel-size", + f"{tensor_parallel_size}", + f"--dtype", + f"auto", f"--enforce-eager", - f"--gpu-memory-utilization", f"{gpu_memory_utilization}", + f"--gpu-memory-utilization", + f"{gpu_memory_utilization}", f"--disable-custom-all-reduce", - f"--max-num-seqs", f"{max_num_seqs}", - f"--max-model-len", f"{max_model_len}", - f"--load-format", "auto", + f"--max-num-seqs", + f"{max_num_seqs}", + f"--max-model-len", + f"{max_model_len}", + f"--load-format", + "auto", f"--enable-chunked-prefill", f"--enable-auto-tool-choice", - f"--tool-call-parser", "hermes", + f"--tool-call-parser", + "hermes", f"--enable-prefix-caching", - f"--seed", f"{seed}", - f"--port", f"{vllm_port}", + f"--seed", + f"{seed}", + f"--port", + f"{vllm_port}", ], - dir='./', - tag="external_vllm_server" + dir="./", + tag="external_vllm_server", ) - companion.launch(launch_wait_time=1800, success_std_string="Application startup complete", env_dict={**os.environ}) + companion.launch( + launch_wait_time=1800, + success_std_string="Application startup complete", + env_dict={**os.environ}, + ) + companion_launch() run(config) + if __name__ == "__main__": atexit.register(lambda: send_train_message("0000")) main() diff --git a/astune/parallel_env.py b/astune/parallel_env.py deleted file mode 100644 index fe431972..00000000 --- a/astune/parallel_env.py +++ /dev/null @@ -1,758 +0,0 @@ -"""Parallel environment rollout utilities. - -This module contains classes that manage parallel LLM-based environment rollouts -for tasks. Core responsibilities include: - -1. Submitting and monitoring multiple environment worker threads. -2. Dynamically oversampling rollouts and performing early termination when - sufficient statistical confidence is reached. -3. Aggregating and converting collected trajectories into sample objects and - finally into a `DataProto` batch ready for training. -4. Providing progress instrumentation (token generation rate, step buckets). - -None of the implementation logic is modified here; only documentation and -English translations for previously non‑English comments are added. -""" - -import os -import copy -import time -import numpy as np -import torch -import uuid -import asyncio -from concurrent.futures import ThreadPoolExecutor -from typing import Dict, List, Literal, Callable, Any -from urllib.parse import quote -from loguru import logger -from omegaconf import DictConfig -from tensordict import TensorDict -from torch.nn.utils.rnn import pad_sequence -from tqdm import tqdm -from verl import DataProto -from verl.utils.torch_functional import pad_sequence_to_length -from astune.workflow_controller.classic_agentflow import AgentFlow -from astune.workflow_controller.classic_agentflow import BaseAgentFlow -from astune.task_rollout.env_worker import EnvWorker -from astune.schema.task import Task, TaskLaunchCoreArgument -from astune.schema.trajectory import Sample -from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr -from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow -from astune.utils.utils import run_async_coro__no_matter_what -from astune.schema.logprob import TokenAndProb -from transformers.tokenization_utils import PreTrainedTokenizer -from astune.task_rollout.async_llm_bridge import AsyncLlmBridge - -def init_logger(experiment_name): - """Initialize the logger with the given configuration.""" - from beast_logger import register_logger - if 'BEST_LOGGER_INIT' in os.environ: return # prevent re-initialization in ray environment - os.environ['BEST_LOGGER_INIT'] = '1' - from datetime import datetime - final_log_path = os.path.join( "launcher_record", experiment_name, datetime.now().strftime("%Y_%m_%d_%H_%M") ) - os.environ['BEST_LOGGER_PATH'] = final_log_path - non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] - register_logger(mods=["evaluation", "exception"], non_console_mods=non_console_mods, auto_clean_mods=[], base_log_path=final_log_path, debug=False) - - -class StepPrinter(AsyncLlmBridge): - """Utility mixin providing periodic progress / throughput printing. - - Tracks token generation speed and thread step distribution. Intended to be - composed with rollout manager classes that maintain an observation window - (`obs_window`) containing per-thread step, token and stop flags. - """ - - def __init__( - self, - config: DictConfig, - async_rollout_manager, - max_parallel: int, - max_llm_retries: int = 3, - tokenizer: PreTrainedTokenizer = None, # type: ignore - llm_mode="local", - **kwargs - ): - """Initialize the step printer. - - Parameters - ---------- - config : DictConfig - Configuration object containing rollout and experiment settings. - async_rollout_manager : Any - Manager responsible for async LLM interactions. - max_parallel : int - Maximum number of parallel environment worker threads. - max_llm_retries : int, optional - Maximum retries for LLM calls, by default 3. - tokenizer : PreTrainedTokenizer, optional - Tokenizer used for padding and ID conversions. - llm_mode : str, optional - Indicates backend mode (e.g., 'local', 'remote'), default 'local'. - **kwargs : Any - Additional parameters passed through for future extensions. - """ - - init_logger(experiment_name=config.astune.experiment_name) - self.llm_mode = llm_mode - self.config: DictConfig = config - self.async_rollout_manager = async_rollout_manager - self.max_parallel: int = max_parallel - self.max_llm_retries: int = max_llm_retries - self.rollout_n = config.astune.rollout.num_repeat - self.tokenizer = tokenizer - self.pad_token_id = self.tokenizer.pad_token_id - self.current_token = 0 - self.current_global_steps = "NA" - - - def step_status_printer(self, obs_window): - """Print aggregated rollout progress. - - Buckets thread steps into 5-step ranges and shows how many threads are - currently within each bucket plus finished threads. Also reports token - generation speed. - - Parameters - ---------- - obs_window : dict - Shared state tracking 'step', 'token', and 'stop' arrays for each - active (or finished) thread. - """ - # Histogram buckets: obs_window['step'] 0~5 / 5~10 / 10~15 / ... - step_counter = {} - current_token = sum(obs_window['token']) - current_time = time.time() - delta_token = current_token - self.current_token - if delta_token < 0: delta_token = current_token # when next rollout begins, obs_window['token'] should reset - delta_time = current_time - self.current_token_count_time - self.current_token = current_token - self.current_token_count_time = current_time - token_gen_per_sec_str = f"{delta_token/delta_time:.2f} tokens/s" if delta_time > 0 else "N/A" - - for step in obs_window['step']: - if step == -1: - step_counter[(-1, 'terminated')] = step_counter.get((-1, 'terminated'), 0) + 1 - continue - else: - start = (step // 5) * 5 - end = start + 5 - step_counter[(start, end)] = step_counter.get((start, end), 0) + 1 - - step_counter = dict(sorted(step_counter.items(), key=lambda x: x[0][0])) - - print_buf = [] - for (start, end), count in step_counter.items(): - if start != -1: - print_buf += [f"[{start}-{end}]:{count} threads"] - for (start, end), count in step_counter.items(): - if start == -1: - print_buf += [f"[finished]:{count} threads"] - print(f"Rollout progress ({token_gen_per_sec_str}): " + " // ".join(print_buf)) - -class StaticRollout(StepPrinter, AsyncLlmBridge): - """Static (non-dynamic) rollout manager. - - Submits a fixed number of rollout threads per task and waits for all to - finish before collecting results. Provides retry logic for environment - worker execution and aggregates success metrics. - """ - - def rollout_env_worker(self, task: Task, task_batch_index: int, task_tag: str, mode: Literal["sample", "validate"], - task_thread_index: int, obs_window: dict, **kwargs) -> CMTLinear: - """Execute one environment rollout worker. - - Handles environment initialization, LLM sampling parameter construction - (with validation overrides), and robust retry on transient failures. - - Parameters - ---------- - task : Task - The task object to roll out. - task_batch_index : int - Index of the task within the provided batch. - task_tag : str - Human-readable tag identifying task and rollout repetition. - mode : Literal['sample','validate'] - Rollout mode selecting sampling hyperparameters. - task_thread_index : int - Global thread index for obs_window bookkeeping. - obs_window : dict - Shared progress structure updated by the worker. - **kwargs : Any - Forwarded for future extensibility. - - Returns - ------- - CMTLinear - Collected trajectory container for this rollout. - """ - def get_sample_params(): - response_length_eps = 16 # Reserve a few tokens for later handling of special tokens like lm_start. - if self.config.astune.rollout.name == 'vllm': - sampling_params = dict( - n=1, - max_tokens=self.config.astune.rollout.max_response_length_in_one_turn - response_length_eps, - min_tokens=1, # Must output at least 1 token. - temperature=self.config.astune.rollout.temperature, - top_p=self.config.astune.rollout.top_p - ) - else: - sampling_params = dict( - n=1, - max_new_tokens=self.config.astune.rollout.max_response_length_in_one_turn, - temperature=self.config.astune.rollout.temperature, - top_p=self.config.astune.rollout.top_p - ) - - if mode == "validate": - sampling_params["temperature"] = self.config.astune.rollout.val_kwargs.temperature - sampling_params["top_k"] = self.config.astune.rollout.val_kwargs.top_k - sampling_params["top_p"] = self.config.astune.rollout.val_kwargs.top_p - return sampling_params - - - max_retry = 3 - for retry in range(max_retry): - try: - llm_chat_fn = self.get_llm_chat_fn(get_sample_params()) - cmt: CMTBaseAttr = EnvWorker( - task_core_arg=TaskLaunchCoreArgument( - env_type=task.env_type, - task_id=task.task_id, - task_thread_index=task_thread_index, - task_batch_index=task_batch_index, - task_env_uuid=uuid.uuid4().hex, - task_tag=task_tag, - obs_window=obs_window, - llm_chat_fn=llm_chat_fn, - tokenizer=self.tokenizer, - task=task - ), - config=self.config - ).execute() - break - except Exception as e: - if retry < max_retry - 1: - logger.bind(exception=True).exception(f"rollout_env_worker error: {e.args}, retrying {retry + 1}/{max_retry}") - time.sleep(2 ** retry) - else: - logger.bind(exception=True).exception(f"rollout_env_worker failed after {max_retry} retries: {e.args}") - raise e - - return cmt # type: ignore - - - def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[CMTLinear]: - """Run static rollout over a batch of tasks. - - Parameters - ---------- - tasks : List[Task] - Tasks to execute. - mode : Literal['sample','validate'] - Sampling mode; validation forces deterministic-ish params. - epoch : str - Epoch identifier for logging. - - Returns - ------- - List[CMTLinear] - List of collected trajectory containers. - """ - # Step 1: if enable_oversample (handled by DynamicRollout override) - self.current_token_count_time = time.time() - # Step 2: otherwise, use legacy rollout method - cmt_array: List[CMTLinear] = [] - rollout_n = 1 if mode=="validate" else self.rollout_n - obs_window = { - 'step': [0 for _ in range(len(tasks) * rollout_n)], - 'token': [0 for _ in range(len(tasks) * rollout_n)], - 'stop': [False for _ in range(len(tasks) * rollout_n)], - } - with ThreadPoolExecutor(max_workers=self.max_parallel) as executor: - futures = [] - for task_batch_index, task in enumerate(tasks): - for task_rollout_index in range(rollout_n): - task_thread_index = task_batch_index * rollout_n + task_rollout_index - future = executor.submit(self.rollout_env_worker, - task=task, task_batch_index=task_batch_index, - task_tag=f"T{task.task_id}#R{task_rollout_index}", - mode=mode, - task_thread_index=task_thread_index, - obs_window=obs_window) - futures.append(future) - - while any(future.running() for future in futures): - self.step_status_printer(obs_window) - time.sleep(10) - - for future in tqdm(futures, desc=f"epoch{epoch}.collect_rollout"): - # do not fail silently - result = future.result() - cmt_array.append(result) - - task_success_rate = np.mean([cmt.reward_structure.success_rate for cmt in cmt_array]) - for cmt in cmt_array: - cmt.current_batch_success_rate = float(task_success_rate) - - return cmt_array - - -class DynamicRollout(StaticRollout): - """Dynamic rollout supporting oversampling and early termination. - - Extends the static rollout by launching an oversampled set of threads per - task, continuously monitoring reward variance and convergence conditions to - decide when to truncate further sampling. Implements greedy selection to - maximize reward dispersion (std) for training diversity. - """ - - def rollout(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str) -> List[CMTLinear]: - """Dispatch to dynamic or static rollout depending on configuration.""" - if mode=="sample" and (self.rollout_n!=1) and self.config.astune.rollout.enable_oversample: - return self.rollout_dynamic(tasks, mode, epoch) - else: - return super().rollout(tasks, mode, epoch) - - def greedy_max_std_selection(self, samples: List[CMTLinear], n): - """Select samples promoting maximum reward spread. - - Strategy: Group by unique reward values in order, take extremes from - both ends when partial groups would exceed quota, optionally duplicate - selections if fewer unique samples than required, then return sorted by - absolute reward magnitude. - - Parameters - ---------- - samples : List[CMTLinear] - Candidate samples. - n : int - Number of samples to select. - - Returns - ------- - List[CMTLinear] - Selected subset with high reward variance. - """ - if len(samples) < n: - additional_n = n - len(samples) - n = len(samples) - else: - additional_n = 0 - - sorted_samples = sorted(samples, key=lambda cmt: abs(cmt.reward_structure.performance_reward)) - value_array = [cmt.reward_structure.performance_reward for cmt in sorted_samples] - macro_selected_value = [] - macro_selected_index = [] - while len(macro_selected_index) != n: - selected_value = [] - selected_index = [] - for index, value in enumerate(value_array): - if (value not in selected_value) and (index not in macro_selected_index): - selected_value.append(value) - selected_index.append(index) - - if len(selected_value) + len(macro_selected_value) <= n: - macro_selected_value += selected_value - macro_selected_index += selected_index - - elif len(selected_value) + len(macro_selected_value) > n: - preserve_n = n - len(macro_selected_value) - # Select preserve_n samples from both ends of selected_value and selected_index. - pick_left = preserve_n // 2 - pick_right = preserve_n - pick_left - macro_selected_value += selected_value[:pick_left] + selected_value[-pick_right:] - macro_selected_index += selected_index[:pick_left] + selected_index[-pick_right:] - - if additional_n > 0: - # randomly select `additional_n` samples from `macro_selected_index`, then concat to `macro_selected_index` - additional_indices = np.random.choice(macro_selected_index, additional_n, replace=True) - macro_selected_index += additional_indices.tolist() - - selected_samples = [sorted_samples[i] for i in macro_selected_index] - sorted_selected_samples = sorted(selected_samples, key=lambda cmt: abs(cmt.reward_structure.performance_reward)) - return sorted_selected_samples - - - def rollout_dynamic(self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str, allow_sample_num_change=True, allow_force_stop=True) -> List[CMTLinear]: - """Perform dynamic oversampled rollout with adaptive early stopping. - - Launches an oversampled number of rollout threads per task, periodically - evaluates termination conditions (all finished, sufficient diversity, - or confirmation of homogeneity), and force-stops remaining threads by - setting shared stop flags when appropriate. - - Parameters - ---------- - tasks : List[Task] - Tasks to roll out. - mode : Literal['sample','validate'] - Must be 'sample'; 'validate' is delegated to static logic. - epoch : str - Epoch identifier used for logging scope. - allow_sample_num_change : bool, optional - Whether final sample count may change to fit hardware divisibility. - allow_force_stop : bool, optional - Whether unfinished threads can be signaled to halt once criteria - are met. - - Returns - ------- - List[CMTLinear] - Selected trajectories after variance-based filtering / amendment. - """ - cmt_array: List[CMTLinear] = [] - assert mode != "validate" - rollout_n = self.rollout_n - self.current_token_count_time = time.time() - submit_oversample_multiplier = self.config.astune.rollout.submit_oversample_multiplier - rollout_n_oversample = int(rollout_n * submit_oversample_multiplier) - rollout_n_confirm = int(rollout_n * (1 + submit_oversample_multiplier) / 2) - assert rollout_n < rollout_n_confirm < rollout_n_oversample, \ - f"submit_oversample_multiplier is too small, rollout_n={rollout_n}, rollout_n_confirm={rollout_n_confirm}, rollout_n_oversample={rollout_n_oversample}" - - obs_window = { - 'step': [0 for _ in range(len(tasks) * rollout_n_oversample)], - 'stop': [False for _ in range(len(tasks) * rollout_n_oversample)], - 'token': [0 for _ in range(len(tasks) * rollout_n_oversample)], - } - - with ThreadPoolExecutor(max_workers=self.max_parallel) as executor: - # Submit threads - futures = [] - for task_batch_index, task in enumerate(tasks): - task_future_array = [] - for task_rollout_index in range(rollout_n_oversample): - task_thread_index = task_batch_index * rollout_n_oversample + task_rollout_index - future = executor.submit(self.rollout_env_worker, - task=task, - task_batch_index=task_batch_index, - task_tag=f"T{task.task_id}#R{task_rollout_index}", # task_rollout_index=str(task_rollout_index), - mode=mode, - task_thread_index=task_thread_index, - obs_window=obs_window) - task_future_array.append(future) - futures += [task_future_array] - - tic = -1 - # Record results of completed threads - while True: - tic += 1 - can_terminate = [False for _ in futures] - terminate_status = ['running' for _ in futures] - for j, task_future_array in enumerate(futures): - completed_task_futures = [f for f in task_future_array if f.done()] - completed_results = [f.result() for f in completed_task_futures] - completed_results = [cmt for cmt in completed_results if not cmt.discarded] - reward = [cmt.reward_structure.performance_reward for cmt in completed_results] - reward_std = np.std(reward) if reward else 0.0 - all_finished = (len(completed_task_futures) == len(task_future_array)) - # finish condition 1: all oversample tasks are finished - if all_finished: - can_terminate[j] = True - terminate_status[j] = f'all_fin({len(completed_results)}/{reward_std:.2f})' - num_finished = len(completed_task_futures) - task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] - all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) - # all_reward_greater_than_one = all(x >= 1 for x in task_cmd_reward_array) - if not all_equal: - if (num_finished >= rollout_n): - # finish condition 2: more than rollout_n tasks are finished, and, reward are not all equal - can_terminate[j] = True - terminate_status[j] = f'early_end({len(completed_results)}/{reward_std:.2f})' - else: - pass # keep waiting - else: - if num_finished >= rollout_n_confirm: - # finish condition 3: if more than rollout_n_confirm tasks are finished, we can confirm this task is hopeless (or successful for certainty) - can_terminate[j] = True - terminate_status[j] = f'confirm_dummy({len(completed_results)}/{reward_std:.2f})' - # Take actions to stop future rollout - if allow_force_stop: - for k in range(j*rollout_n_oversample, j*rollout_n_oversample + rollout_n_oversample): - obs_window['stop'][k] = True - else: - pass # keep waiting - # check global status - terminate_status = '/'.join(terminate_status) - if all(can_terminate): - logger.info(f"epoch{epoch}.collect_rollout: all tasks finished, exiting loop") - for i, stop_flag in enumerate(obs_window['stop']): obs_window['stop'][i] = True # all must stop now - break - else: - if tic % 10 == 0: - self.step_status_printer(obs_window) # print status every 10*5=50 seconds - logger.info(f"task complete {sum(can_terminate)}/{len(can_terminate)} tasks: {terminate_status}") - time.sleep(5) - # Wait until all threads finish or are forcibly terminated - tic = -1 - while any(f.running() for task_future_array in futures for f in task_future_array): - tic += 1 - if tic % 10 == 0: logger.info('waiting final sync, this will not take long') - time.sleep(5) - - # Check how many threads completed scheduled tasks - task_ineffective_thread_cnt = [] - task_completed_thread_cnt = [] - task_extra_thread_cnt = [] - task_need_amend = 0 - for j, task_future_array in enumerate(futures): - # get number of completed tasks - completed_task_futures = [f for f in task_future_array if f.done()] - completed_results = [f.result() for f in completed_task_futures] - completed_results = [cmt for cmt in completed_results if not cmt.discarded] - task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] - all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) - # Counting - completed_task_cnt = len(completed_results) - if all_equal: - task_need_amend += 1 - task_completed_thread_cnt += [0] - task_extra_thread_cnt += [0] - task_ineffective_thread_cnt += [completed_task_cnt] - else: - task_need_amend += 0 - task_completed_thread_cnt += [completed_task_cnt] - task_extra_thread_cnt += [completed_task_cnt - rollout_n] - task_ineffective_thread_cnt += [0] - - logger.info(f"task_completed_thread_cnt: {task_completed_thread_cnt}") - logger.info(f"task_extra_thread_cnt: {task_extra_thread_cnt}") - - world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes - total_sample = sum(task_completed_thread_cnt) - if allow_sample_num_change and (total_sample > world_size*2): - # Allow sample count changes: we only require divisibility by GPU count. - # add_count = (world_size - total_sample % world_size) # If using an addition strategy, number of samples to add. - add_count = 0 # If using an addition strategy, number of samples to add. - num_task_to_amend = len(futures) # num_task - logger.info(f"allow_sample_num_change policy: world_size: {world_size}, total_sample {total_sample}, add_count: {add_count}, ") - # 选择 extra 最少的task进行补偿 - while add_count != 0: - _task_completed_thread_cnt_find_nonzero_min = [float('inf') if x <=0 else x for x in task_completed_thread_cnt] - min_extra_index = _task_completed_thread_cnt_find_nonzero_min.index(min(_task_completed_thread_cnt_find_nonzero_min)) - task_extra_thread_cnt[min_extra_index] += 1 - task_completed_thread_cnt[min_extra_index] += 1 - add_count -= 1 - # logger.info(f"_task_completed_thread_cnt_find_nonzero_min: {_task_completed_thread_cnt_find_nonzero_min}") - logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") - logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") - else: - # Sample count change not allowed; attempt compensation. - num_task_max_to_amend = sum(task_extra_thread_cnt) // rollout_n - num_task_to_amend = min(num_task_max_to_amend, task_need_amend) - extra_num_thread_required = num_task_to_amend * rollout_n - remove_count = sum(task_extra_thread_cnt) - extra_num_thread_required - logger.info(f"forbid_sample_num_change policy: num_task_max_to_amend: {num_task_max_to_amend}, num_task_to_amend: {num_task_to_amend}, remove_count: {remove_count}, ") - - # 选择 extra 最多的task进行约束 - while remove_count != 0: - max_extra_index = task_extra_thread_cnt.index(max(task_extra_thread_cnt)) - assert task_extra_thread_cnt[max_extra_index] > 0, "task_extra_thread_cnt should be greater than 0" - task_extra_thread_cnt[max_extra_index] -= 1 - task_completed_thread_cnt[max_extra_index] -= 1 - remove_count -= 1 - logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") - logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") - - # 筛选出方差最高的样本 - cmt_array = [] - print_buffer = "" - task_success_rate = [] - for j, task_future_array, avail_extra_cnt in zip(range(len(futures)), futures, task_extra_thread_cnt): - # get number of completed tasks - completed_task_futures = [f for f in task_future_array if f.done()] - completed_results = [f.result() for f in completed_task_futures] - completed_results: List[CMTLinear] = [cmt for cmt in completed_results if not cmt.discarded] - task_cmd_reward_array = [cmt.reward_structure.performance_reward for cmt in completed_results] - success_rate_array = [cmt.reward_structure.success_rate for cmt in completed_results] - task_success_rate += [np.mean(success_rate_array)] - need_amend = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) - if need_amend and (num_task_to_amend > 0): - num_task_to_amend -= 1 - print_buffer += f"/(amend)" - continue - else: - if need_amend: - num_completed = len(completed_results) - num_to_be_selected = rollout_n - else: - num_completed = len(completed_results) - num_to_be_selected = rollout_n + avail_extra_cnt - # assert num_completed >= num_to_be_selected, f"num_completed={num_completed}, num_to_be_selected={num_to_be_selected}" - selected_cmt_array = self.greedy_max_std_selection(completed_results, num_to_be_selected) - cmt_array += selected_cmt_array - print_buffer += f"/({len(selected_cmt_array)})" - if need_amend: print_buffer += "(no-amend)" - logger.info(print_buffer) - - for cmt in cmt_array: - cmt.current_batch_success_rate = np.mean(task_success_rate) - return cmt_array - - - - -class ParallelEnvManager(DynamicRollout): - """High-level manager orchestrating parallel environment rollouts. - - Adds conversion helpers to transform collected trajectories into - `Sample` objects and finally a padded `DataProto` suitable for model - training. - """ - - # TODO: define an extra class for trajectory-dataproto converting. - def to_dataproto(self, cmt_array) -> DataProto: - """Convert trajectories to a `DataProto` batch. - - Pipeline: - 1. Tokenize grouped trajectories into `Sample` objects. - 2. Pad and batch samples into tensors and auxiliary metadata. - """ - # Step 1: Convert trajectories to samples: tokenizing - samples = self.trajectories_to_samples(cmt_array) - - # Step 2: Convert samples to DataProto: padding - dataproto = self.samples_to_dataproto(samples) - - return dataproto - - def trajectories_to_samples(self, cmt_array: List[CMTLinear]) -> List[Sample]: - """Convert a list of trajectory containers into flat `Sample` objects. - - Ensures divisibility of sample count by world size (removing random - excess) for downstream distributed training alignment. - """ - sample_arr_final = [] - CMTLinear.compute_reference_advantage(cmt_array) - for cmt in cmt_array: - try: - sample_arr = cmt.group_tokenize() - except Exception as e: - raise e - finally: - cmt.generate_log(global_step=self.current_global_steps) - if os.environ.get('BEST_LOGGER_PATH', None) and os.environ.get('ASTUNE_DEBUG', None): - logger.success(f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]") - sample_arr_final += sample_arr - - # Step 2: Calculate how many samples need to be removed - if self.config.astune.backbone in ['verl']: - world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes - remainder = len(sample_arr_final) % world_size - if remainder != 0: - import random - remove_indices = random.sample(range(len(sample_arr_final)), remainder) - # Sort in reverse order to avoid index shifting during removal - remove_indices.sort(reverse=True) - for idx in remove_indices: - sample_arr_final.pop(idx) - - # random remove some samples, so that the number of samples is divisible by 8 - return sample_arr_final - - def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: - # Initialize lists to store batched data - prompt_ids, response_ids = [], [] - prompt_attention_mask, response_attention_mask = [], [] - prompt_position_ids, response_position_ids = [], [] - prompt_loss_mask, response_loss_mask = [], [] - messages = [] - # reward_scores = [] # replace with step_reward_scores - step_reward_scores = [] - task_ids = [] - rollout_ids = [] - reference_advantage = [] - - for sample in samples: - # Validate that all fields have the same length - assert len(sample.input_ids) == len(sample.attention_mask) == len(sample.position_ids) == len( - sample.loss_mask), f"Sample {sample.request_id} has mismatched lengths: " \ - f"{len(sample.input_ids)=}, {len(sample.attention_mask)=}, " \ - f"{len(sample.position_ids)=}, {len(sample.loss_mask)=}" - - task_ids.append(sample.task_id) - rollout_ids.append(sample.task_tag) - # Discard samples with prompt length exceeding limit - if len(sample.prompt_ids) > self.config.astune.data.max_prompt_length: - raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") - - # Warn if response is longer than expected (but still include it) - if len(sample.response_ids) > self.config.astune.data.max_response_length: - raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") - - # Append tensors to respective lists - assert len(sample.prompt_ids) != 0 - assert len(sample.response_ids) != 0 - prompt_ids.append(torch.tensor(sample.prompt_ids, dtype=torch.int)) - response_ids.append(torch.tensor(sample.response_ids, dtype=torch.int)) - - prompt_attention_mask.append(torch.tensor(sample.prompt_attention_mask, dtype=torch.int)) - response_attention_mask.append(torch.tensor(sample.response_attention_mask, dtype=torch.int)) - - prompt_position_ids.append(torch.tensor(sample.prompt_position_ids, dtype=torch.int)) - response_position_ids.append(torch.tensor(sample.response_position_ids, dtype=torch.int)) - - prompt_loss_mask.append(torch.tensor(sample.prompt_loss_mask, dtype=torch.int)) - response_loss_mask.append(torch.tensor(sample.response_loss_mask, dtype=torch.int)) - - reference_advantage.append(sample.reference_advantage) - - messages.append({"messages": sample.messages}) - # reward_scores.append(sample.global_reward) - step_reward_scores.append(sample.step_reward) - - max_prompt_length_this_batch = max([p.shape[-1] for p in prompt_ids]) - assert max_prompt_length_this_batch <= self.config.astune.data.max_prompt_length - max_response_length_this_batch = max([p.shape[-1] for p in response_ids]) - assert max_response_length_this_batch <= self.config.astune.data.max_response_length - - # Batch and pad sequences - prompt_ids = pad_sequence(prompt_ids, batch_first=True, padding_value=self.pad_token_id, padding_side="left") - prompt_attention_mask = pad_sequence(prompt_attention_mask, batch_first=True, padding_value=0, padding_side="left") - prompt_position_ids = pad_sequence(prompt_position_ids, batch_first=True, padding_value=0, padding_side="left") - prompt_loss_mask = pad_sequence(prompt_loss_mask, batch_first=True, padding_value=0, padding_side="left") - - prompt_ids = pad_sequence_to_length(prompt_ids, max_prompt_length_this_batch, self.pad_token_id, left_pad=True) - prompt_attention_mask = pad_sequence_to_length(prompt_attention_mask, max_prompt_length_this_batch, 0, left_pad=True) - prompt_position_ids = pad_sequence_to_length(prompt_position_ids, max_prompt_length_this_batch, 0, left_pad=True) - prompt_loss_mask = pad_sequence_to_length(prompt_loss_mask, max_prompt_length_this_batch, 0, left_pad=True) - - response_ids = pad_sequence(response_ids, batch_first=True, padding_value=self.pad_token_id) - response_attention_mask = pad_sequence(response_attention_mask, batch_first=True, padding_value=0) - response_loss_mask = pad_sequence(response_loss_mask, batch_first=True, padding_value=0) - - response_ids = pad_sequence_to_length(response_ids, max_response_length_this_batch, self.pad_token_id) - response_attention_mask = pad_sequence_to_length(response_attention_mask, max_response_length_this_batch, 0) - response_loss_mask = pad_sequence_to_length(response_loss_mask, max_response_length_this_batch, 0) - - delta_position_id = torch.arange(1, response_ids.size(1) + 1, device=response_ids.device).unsqueeze(0).repeat(len(samples), 1) - response_position_ids = prompt_position_ids[:, -1:] + delta_position_id - - # Concatenate prompt and response tensors - input_ids = torch.cat((prompt_ids, response_ids), dim=-1) - attention_mask = torch.cat((prompt_attention_mask, response_attention_mask), dim=-1) - position_ids = torch.cat((prompt_position_ids, response_position_ids), dim=-1) - loss_mask = torch.cat((prompt_loss_mask, response_loss_mask), dim=-1) - - # Construct the batch using TensorDict - batch = TensorDict( - { - "prompts": prompt_ids, - "responses": response_ids, - "input_ids": input_ids, - "attention_mask": attention_mask, - "position_ids": position_ids, - "loss_mask": loss_mask, - }, - batch_size=len(samples), - ) - - return DataProto(batch=batch, non_tensor_batch={ - "task_ids": np.array(task_ids), - "rollout_ids": np.array(rollout_ids), - "messages": np.array(messages), - "reward_scores": np.array(step_reward_scores), - "reference_advantage": np.array(reference_advantage), - }) diff --git a/astune/protocol/agentscope_protocol.py b/astune/protocol/agentscope_protocol.py deleted file mode 100644 index d4b17974..00000000 --- a/astune/protocol/agentscope_protocol.py +++ /dev/null @@ -1,26 +0,0 @@ -from pydantic import BaseModel, Field -from typing import Callable, List, TYPE_CHECKING - -if TYPE_CHECKING: - from agentscope.message import Msg - from astune.workflow_controller.agentscope_flow import ASTuneProxy - -class AgentScopeLearnProtocol(BaseModel): - model_config = {"extra": "allow"} - # Trainer to use; default "trinity". Optional: "astune-trinity". - trainer: str = Field(default="trinity") - # Experiment name - agentflow_name: str = Field(default="agent-flow") - # In multi-agent settings, specify the list of trainable agent target names - trainable_agent_targets: List[str] = Field(default=[]) - # Use dataset provided by the trainer (True: read each query from workflow input; False: AgentScope handles each query) - external_dataset: bool = Field(default=True) - # Use external environment provided by the trainer (True: read environment handle from input; False: AgentScope runs environment and tools) - external_environment: bool = Field(default=True) - # Use external reward provided by the trainer (True: compute reward outside AgentScope after workflow; False: AgentScope computes reward) - external_reward: bool = Field(default=True) - # Other settings - multiturn_token_consolidation: bool = Field(default=True) - - async def agentscope_execute(self, init_messages, astune_proxy: "ASTuneProxy", config)->"ASTuneProxy": - raise NotImplementedError diff --git a/astune/context_manager/cmt_base_attr.py b/astune/schema/extended_msg.py similarity index 51% rename from astune/context_manager/cmt_base_attr.py rename to astune/schema/extended_msg.py index ffecd5b7..6b854f95 100644 --- a/astune/context_manager/cmt_base_attr.py +++ b/astune/schema/extended_msg.py @@ -6,52 +6,38 @@ INVALID_LOG_PROB_VALUE = 0.0 + def find_sublist_indices(large_list, small_list, reverse=False): small_len = len(small_list) if reverse: for i in reversed(range(len(large_list) - small_len + 1)): - if large_list[i: i+small_len] == small_list: + if large_list[i : i + small_len] == small_list: return i for i in range(len(large_list) - small_len + 1): - if large_list[i: i+small_len] == small_list: + if large_list[i : i + small_len] == small_list: return i return -1 -def replace_token_ids(place_holder, replace_with, begin, end, raw_logprob) -> Tuple[List[int], List[int]]: - _begin_index = find_sublist_indices(place_holder, begin) + len(begin) - _end_index = find_sublist_indices(place_holder, end, reverse=True) - - if replace_with[-len(end):] == end: # remove end token - replace_with = replace_with[:-len(end)] - raw_logprob = raw_logprob[:-len(end)] - if replace_with[:len(begin)] == begin: # remove begin token - replace_with = replace_with[len(begin):] - raw_logprob = raw_logprob[len(begin):] - - final = place_holder[:_begin_index] + replace_with + place_holder[_end_index:] - final_logprob = [INVALID_LOG_PROB_VALUE] * _begin_index + raw_logprob + [INVALID_LOG_PROB_VALUE] * (len(place_holder) - _end_index) - return final, final_logprob - class ExtendedMessage: def __init__( - self, - author, - role="assistant", - content="", - token_arr=[], - token_begin_index=-1, - token_end_index=-1, - clip=False, - clip_token_limit=8192, - tokenizer: PreTrainedTokenizer=None, # type: ignore - token_generator="manual", - build_from_uuid="", - tools=[], - tool_calls=[], - token_logprob_arr=[], - ): + self, + author, + role="assistant", + content="", + token_arr=[], + token_begin_index=-1, + token_end_index=-1, + clip=False, + clip_token_limit=8192, + tokenizer: PreTrainedTokenizer = None, # type: ignore + token_generator="manual", + build_from_uuid="", + tools=[], + tool_calls=[], + token_logprob_arr=[], + ): self.author = author self.role = role self.content = content @@ -60,7 +46,6 @@ def __init__( self.token_begin_index = token_begin_index self.token_end_index = token_end_index self.invalid_log_prob_value = INVALID_LOG_PROB_VALUE - # use property to ensure content is safe before use self._content_for_future = "" self._info = "" self.clip = clip @@ -72,30 +57,37 @@ def __init__( if not clip: self.generate_content_for_future(tokenizer=None, clip=False) else: - self.generate_content_for_future(tokenizer=tokenizer, clip=True, clip_token_limit=clip_token_limit) + self.generate_content_for_future( + tokenizer=tokenizer, + clip=True, + clip_token_limit=clip_token_limit, + ) self.eos_token_id = tokenizer.eos_token_id - if token_generator == 'auto': - dummy_msg = [ {"role": "assistant", "content": "dummy text"} ] + if token_generator == "auto": + dummy_msg = [{"role": "assistant", "content": "dummy text"}] try: # completion_token_arr will contain generation_prompt header - auto_tokenize_target = { "role": self.role, "content": self.content_for_future } + auto_tokenize_target = { + "role": self.role, + "content": self.content_for_future, + } if self.tool_calls: - auto_tokenize_target.update({ "tool_calls": self.tool_calls }) + auto_tokenize_target.update({"tool_calls": self.tool_calls}) text_frag_to = tokenizer.apply_chat_template( - dummy_msg + [ auto_tokenize_target ], + dummy_msg + [auto_tokenize_target], tokenize=False, - tools=tools + tools=tools, ) except Exception as e: - raise ValueError(f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}") + raise ValueError( + f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}" + ) self.token_arr, _ = self.get_inc_simple( - text_frag_from=tokenizer.apply_chat_template( - dummy_msg, - tokenize=False, - tools=tools + text_frag_from=tokenizer.apply_chat_template( + dummy_msg, tokenize=False, tools=tools ), - text_frag_to=text_frag_to, - tokenizer=tokenizer + text_frag_to=text_frag_to, + tokenizer=tokenizer, ) @property @@ -107,14 +99,22 @@ def content_for_future(self): self._content_for_future return self._content_for_future - @property def need_training(self): NEED_TRAIN_AUTHORS = ["llm"] - NON_TRAIN_AUTHORS = ["env", "initialization", "user", "memory", "llm(do_not_train)"] - assert (self.author in NEED_TRAIN_AUTHORS) or (self.author in NON_TRAIN_AUTHORS) or (self.author.endswith('(discard)')), f"author {self.author} is not identified" - return (self.author in NEED_TRAIN_AUTHORS) - + NON_TRAIN_AUTHORS = [ + "env", + "initialization", + "user", + "memory", + "llm(do_not_train)", + ] + assert ( + (self.author in NEED_TRAIN_AUTHORS) + or (self.author in NON_TRAIN_AUTHORS) + or (self.author.endswith("(discard)")) + ), f"author {self.author} is not identified" + return self.author in NEED_TRAIN_AUTHORS def generate_content_for_future(self, tokenizer, clip, clip_token_limit=-1): _content: str = self.content @@ -124,18 +124,18 @@ def generate_content_for_future(self, tokenizer, clip, clip_token_limit=-1): if n_token > clip_token_limit: # 8000 > 4000 n_char = len(_content) # 10,000 - eps = 100 # token + eps = 100 # token preserve_percent = (clip_token_limit - eps) / n_token # 3900 / 8000 n_char_to_preserve = int(n_char * preserve_percent) _content = _content[:n_char_to_preserve] + "... truncate ..." self._content_for_future = _content - def get_loss_mask(self, blackout_token_combo): def blackout_specific_token_ids_first_encounter(mask, arr, token_ids): index = find_sublist_indices(arr, token_ids, reverse=False) if index >= 0: - for i in range(index, index+len(token_ids)): mask[i] = 0 + for i in range(index, index + len(token_ids)): + mask[i] = 0 return mask def blackout_everything_after_eos_but_keep_eos(mask, token_arr, eos_token_id): @@ -147,8 +147,14 @@ def blackout_everything_after_eos_but_keep_eos(mask, token_arr, eos_token_id): if self.need_training: msg_token_mask = [1] * len(self.token_arr) - msg_token_mask = blackout_specific_token_ids_first_encounter(msg_token_mask, self.token_arr, blackout_token_combo) - msg_token_mask = blackout_everything_after_eos_but_keep_eos(mask=msg_token_mask, token_arr=self.token_arr, eos_token_id=self.eos_token_id) + msg_token_mask = blackout_specific_token_ids_first_encounter( + msg_token_mask, self.token_arr, blackout_token_combo + ) + msg_token_mask = blackout_everything_after_eos_but_keep_eos( + mask=msg_token_mask, + token_arr=self.token_arr, + eos_token_id=self.eos_token_id, + ) return msg_token_mask else: msg_token_mask = [0] * len(self.token_arr) @@ -164,41 +170,15 @@ def get_inc_simple(self, text_frag_from, text_frag_to, tokenizer): tokenizer_output = tokenizer(text_frag_to, return_tensors="pt", padding=False) input_ids = tokenizer_output["input_ids"][0].tolist() - input_id_increment = input_ids[len(token_ids_acc):] # get the new tokens added in this step + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: overlap_length += 1 - else: break + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: + overlap_length += 1 + else: + break msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" # print(msg) return input_id_increment, msg - -class CMTBaseAttr(object): - - def __init__(self, config, tokenizer): - self.task_batch_index = 'undefined' - self.task_tag = 'undefined' - self.task_id = 'undefined' - self.config = config - self.tokenizer = tokenizer - self.full_context: List[ExtendedMessage] = [] - self.grouped_steps: List[List[ExtendedMessage]] = [] - self.current_context_status = "" - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len - self.max_seq_length: int = max_model_len - max_response_length - self.max_env_output_length: int = self.config.astune.rollout.max_env_len - self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") - self.generated_token_cnt = 0 - - self.terminal_rewards_dict = {} - self.discarded = False - self.is_terminated = False - self.reward_structure: Union[Reward, None] = None - self.context_time_cost = 0 - self.tag = "" - self.current_batch_success_rate:float = -1.0 - self.already_mad_flag = False - self.round_cnt = 0 - - assert self.config.astune.data.max_prompt_length + self.config.astune.data.max_response_length <= max_model_len \ No newline at end of file diff --git a/astune/schema/logprob.py b/astune/schema/logprob.py index 717c7dc5..4552df23 100644 --- a/astune/schema/logprob.py +++ b/astune/schema/logprob.py @@ -4,9 +4,9 @@ # from openai.types.chat.chat_completion import ChatCompletion # from verl import DataProto + class TokenAndProb: def __init__(self, token_id, logprob, decoded_string): self.token_id = token_id self.logprob = logprob self.decoded_string = decoded_string - diff --git a/astune/schema/task.py b/astune/schema/task.py index a45abf6d..3e6f85a5 100644 --- a/astune/schema/task.py +++ b/astune/schema/task.py @@ -1,5 +1,10 @@ from pydantic import BaseModel, Field -from typing import List, Dict, Any +from typing import List, Dict, Any, Union + + +""" +The basic schema for task_reader module +""" class Task(BaseModel): @@ -10,7 +15,12 @@ class Task(BaseModel): metadata: dict = Field(default_factory=dict) -class TaskLaunchCoreArgument(BaseModel): +""" +For workflow execution, include task uuid and gym client if needed +""" + + +class WorkflowTask(BaseModel): env_type: str = Field(default="") task_id: str = Field(default="") task_thread_index: int = Field(default=0) @@ -20,5 +30,16 @@ class TaskLaunchCoreArgument(BaseModel): obs_window: dict = Field(default={}) llm_chat_fn: Any = Field(default=None) tokenizer: Any = Field(default=None) - task: Task = Field(default=None) # type: ignore + task: Task = Field(default=Task()) + gym_env: Any = Field(default=None) # agentscope runtime handle or env service handle + + +""" +workflow output, user should provide as workflow output +""" + +class WorkflowOutput(BaseModel): + reward: Union[float, List[float], None] = Field(default=None) + is_success: Union[bool, None] = Field(default=None) + metadata: Dict[str, Any] = Field(default_factory=dict) diff --git a/astune/schema/trajectory.py b/astune/schema/trajectory.py index 7e93091d..d5b0d7ef 100644 --- a/astune/schema/trajectory.py +++ b/astune/schema/trajectory.py @@ -23,6 +23,7 @@ def performance_reward(self): else: return self.raw_reward + class Trajectory(BaseModel): task_batch_index: int = Field(default=0) task_tag: str = Field(default="") @@ -69,12 +70,14 @@ class Sample(BaseModel): step_reward: float = 0.0 reference_advantage: float = 0.0 - def __init__(self, cmt_tokenized:dict, messages, config, **kwargs): + def __init__(self, cmt_tokenized: dict, messages, config, **kwargs): super().__init__(**kwargs) self.max_prompt_len = config.astune.data.max_prompt_length self.max_response_len = config.astune.data.max_response_length - self.max_model_len = config.astune.data.max_response_length + config.astune.data.max_prompt_length + self.max_model_len = ( + config.astune.data.max_response_length + config.astune.data.max_prompt_length + ) self.input_ids = cmt_tokenized["input_ids"] self.attention_mask = cmt_tokenized["attention_mask"] @@ -105,31 +108,65 @@ def __init__(self, cmt_tokenized:dict, messages, config, **kwargs): def truncate_output_ids(self) -> None: - assert len(self.input_ids) == len(self.attention_mask) == len(self.position_ids) == len(self.loss_mask) - assert len(self.prompt_ids) == len(self.prompt_attention_mask) == len(self.prompt_position_ids) == len(self.prompt_loss_mask) == len(self.prompt_logprobs) - assert len(self.response_ids) == len(self.response_attention_mask) == len(self.response_position_ids) == len(self.response_loss_mask) == len(self.response_logprobs) - assert isinstance(self.input_ids, list) and isinstance(self.prompt_ids, list) and isinstance(self.response_ids, list) + assert ( + len(self.input_ids) + == len(self.attention_mask) + == len(self.position_ids) + == len(self.loss_mask) + ) + assert ( + len(self.prompt_ids) + == len(self.prompt_attention_mask) + == len(self.prompt_position_ids) + == len(self.prompt_loss_mask) + == len(self.prompt_logprobs) + ) + assert ( + len(self.response_ids) + == len(self.response_attention_mask) + == len(self.response_position_ids) + == len(self.response_loss_mask) + == len(self.response_logprobs) + ) + assert ( + isinstance(self.input_ids, list) + and isinstance(self.prompt_ids, list) + and isinstance(self.response_ids, list) + ) truncate_any = False if len(self.prompt_ids) > self.max_prompt_len: truncate_any = True - print(f"-------------------------------------------------------------------------------------------------------") - print(f"Warning: prompt_ids length {len(self.prompt_ids)} exceeds max_prompt_len {self.max_prompt_len}, truncating.") - print(f"-------------------------------------------------------------------------------------------------------") - raise RuntimeError("Prompt length exceeds maximum allowed length. Please adjust the input data.") - self.prompt_ids = self.prompt_ids[-self.max_prompt_len:] - self.prompt_attention_mask = self.prompt_attention_mask[-self.max_prompt_len:] - self.prompt_position_ids = self.prompt_position_ids[-self.max_prompt_len:] - self.prompt_loss_mask = self.prompt_loss_mask[-self.max_prompt_len:] - self.prompt_logprobs = self.prompt_logprobs[-self.max_prompt_len:] - + print( + f"-------------------------------------------------------------------------------------------------------" + ) + print( + f"Warning: prompt_ids length {len(self.prompt_ids)} exceeds max_prompt_len {self.max_prompt_len}, truncating." + ) + print( + f"-------------------------------------------------------------------------------------------------------" + ) + raise RuntimeError( + "Prompt length exceeds maximum allowed length. Please adjust the input data." + ) + self.prompt_ids = self.prompt_ids[-self.max_prompt_len :] + self.prompt_attention_mask = self.prompt_attention_mask[-self.max_prompt_len :] + self.prompt_position_ids = self.prompt_position_ids[-self.max_prompt_len :] + self.prompt_loss_mask = self.prompt_loss_mask[-self.max_prompt_len :] + self.prompt_logprobs = self.prompt_logprobs[-self.max_prompt_len :] if len(self.response_ids) > self.max_response_len: truncate_any = True - print(f"-------------------------------------------------------------------------------------------------------") - print(f"Warning: response_ids length {len(self.response_ids)} exceeds max_response_len {self.max_response_len}, truncating.") - print(f"-------------------------------------------------------------------------------------------------------") + print( + f"-------------------------------------------------------------------------------------------------------" + ) + print( + f"Warning: response_ids length {len(self.response_ids)} exceeds max_response_len {self.max_response_len}, truncating." + ) + print( + f"-------------------------------------------------------------------------------------------------------" + ) self.response_ids = self.response_ids[: self.max_response_len] self.response_attention_mask = self.response_attention_mask[: self.max_response_len] self.response_position_ids = self.response_position_ids[: self.max_response_len] @@ -147,4 +184,4 @@ def discard(self) -> None: """ Discard the experience. """ - raise RuntimeError('Never use this method.') + raise RuntimeError("Never use this method.") diff --git a/astune/task_judge/env_service_as_judge.py b/astune/task_judge/env_service_as_judge.py index 770dd2e2..e99b682f 100644 --- a/astune/task_judge/env_service_as_judge.py +++ b/astune/task_judge/env_service_as_judge.py @@ -1,4 +1,5 @@ from astune.task_judge.judge_base import JudgeBase +from astune.workflow import WorkflowOutput, WorkflowTask class EnvServiceJudge(JudgeBase): @@ -6,13 +7,11 @@ class EnvServiceJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, judge_input_dictionary) -> tuple: + def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raw_reward = 0 - env = judge_input_dictionary['env'] - task_core_arg = judge_input_dictionary['task_core_arg'] - - raw_reward = env.evaluate(task_core_arg.task_env_uuid, params={"sparse": False}) + env = workflow_task.gym_env + raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) if raw_reward >= 1: is_success = True else: @@ -27,4 +26,4 @@ def compute_reward(self, judge_input_dictionary) -> tuple: if self.config.astune.rollout.binary_reward: raw_reward = 1.0 if is_success else 0.0 - return raw_reward, is_success \ No newline at end of file + return raw_reward, is_success diff --git a/astune/task_judge/judge_base.py b/astune/task_judge/judge_base.py index 5d18d9db..05114a48 100644 --- a/astune/task_judge/judge_base.py +++ b/astune/task_judge/judge_base.py @@ -1,11 +1,11 @@ -class JudgeBase(): +from astune.workflow import WorkflowOutput, WorkflowTask + + +class JudgeBase: def __init__(self, config): self.config = config - def compute_reward(self, judge_input_dictionary) -> tuple: - # judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) - # judge_input_dictionary['task_core_arg']: 任务信息(如果里面包含了参考答案,可以从中取出) - # judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) + def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: - raise NotImplementedError \ No newline at end of file + raise NotImplementedError diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index b022c9dc..4f7327f4 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -1,23 +1,25 @@ -from astune.task_judge.judge_base import JudgeBase import re +from astune.workflow import WorkflowOutput, WorkflowTask +from astune.task_judge.judge_base import JudgeBase +from astune.task_rollout.dashscope_llm_bridge import ( + construct_alien_llm_chat_fn, +) + class MathAnswerAsJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, judge_input_dictionary) -> tuple: - # judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) - # judge_input_dictionary['task_core_arg']: 任务信息(如果里面包含了参考答案,可以从中取出) - # judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) - + def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raw_reward = 0 - final_answer = judge_input_dictionary['final_answer'] # 默认没有final_answer,需要在workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 - task_core_arg = judge_input_dictionary['task_core_arg'] - reference_answer = task_core_arg.task.metadata['answer'] - reference_answer = reference_answer.split('####')[-1].strip() + final_answer = workflow_output.metadata[ + "final_answer" + ] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + reference_answer = workflow_task.task.metadata["answer"] + reference_answer = reference_answer.split("####")[-1].strip() - pattern = r'\\boxed\{([^}]*)\}' + pattern = r"\\boxed\{([^}]*)\}" match = re.search(pattern, final_answer) if match: result = match.group(1) @@ -34,30 +36,33 @@ class MathAnswerAndLlmAsJudge(JudgeBase): def __init__(self, config): self.config = config - def compute_reward(self, judge_input_dictionary) -> tuple: + def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raw_reward = 0 + final_answer = workflow_output.metadata[ + "final_answer" + ] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + reference_answer = workflow_task.task.metadata["answer"] + reference_answer = reference_answer.split("####")[-1].strip() - final_answer = judge_input_dictionary['final_answer'] - task_core_arg = judge_input_dictionary['task_core_arg'] - reference_answer = task_core_arg.task.metadata['answer'] - - from astune.context_manager.agentflow_cm.cmt_foreign_llm import construct_alien_llm_chat_fn - alien_llm_chat_fn = construct_alien_llm_chat_fn(self.config) + alien_llm_chat_fn = construct_alien_llm_chat_fn( + alien_llm_model=self.config.astune.task_judge.alien_llm_model, + alien_llm_response_length=self.config.astune.task_judge.alien_llm_response_length, + ) messages = [ { - 'role':'system', - 'content':f'Is my result correct? If correct, say , otherwise say .' + "role": "system", + "content": f"Is my result correct? If correct, say , otherwise say .", }, { - 'role':'user', - 'content':f'Is my result correct?\n\n\n----\nMy result: {final_answer}\n\n\n----\nReal result: {reference_answer}' - } + "role": "user", + "content": f"Is my result correct?\n\n\n----\nMy result: {final_answer}\n\n\n----\nReal result: {reference_answer}", + }, ] res = alien_llm_chat_fn(messages=messages) - if '' in res['content']: + if "" in res["content"]: is_success = True raw_reward = 1.0 else: is_success = False raw_reward = 0.0 - return raw_reward, is_success \ No newline at end of file + return raw_reward, is_success diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index 1155c987..67af181f 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -11,6 +11,7 @@ from astune.task_reader.jsonl_reader import TaskReaderJsonl from astune.task_reader.task_reader_base import TaskReaderBase + class RandomDummyGenerator(TaskReaderBase): def __init__(self, config): @@ -21,16 +22,16 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: # Save the current random state original_state = np.random.get_state() np.random.seed(42) - random_number = [ x for x in range(1000) ] + random_number = [x for x in range(1000)] # shuffle np.random.shuffle(random_number) for idx in random_number: task = Task( - main_query=f'[dummy task @ {idx}]', + main_query=f"[dummy task @ {idx}]", init_messages=[], task_id=str(idx), env_type=f"no_env", - metadata={'random_number': idx}, + metadata={"random_number": idx}, ) tasks.append(task) # Restore the original random state @@ -38,23 +39,23 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: return tasks def get_training_tasks(self) -> List[Task]: - return self._load_dataset_split('dataset_name', 'split') + return self._load_dataset_split("dataset_name", "split") def get_validation_tasks(self) -> List[Task]: - return self._load_dataset_split('dataset_name', 'split') + return self._load_dataset_split("dataset_name", "split") class TaskReaderRouter(TaskReaderBase): def __init__(self, config): super().__init__(config) self.task_reader_type = self.config.astune.task_reader.type - if self.task_reader_type == 'env_service': + if self.task_reader_type == "env_service": self.task_reader = TaskReaderEnvService(config) - elif self.task_reader_type == 'dataset_file': + elif self.task_reader_type == "dataset_file": self.task_reader = TaskReaderJsonl(config) - elif self.task_reader_type == 'huggingface_dat_repo': + elif self.task_reader_type == "huggingface_dat_repo": self.task_reader = TaskReaderHuggingFace(config) - elif self.task_reader_type == 'random_dummy': + elif self.task_reader_type == "random_dummy": self.task_reader = RandomDummyGenerator(config) else: raise ValueError(f"Unsupported task reader type: {self.task_reader_type}") @@ -77,18 +78,18 @@ def task_to_standard_dataset(tasks: List[Task]) -> datasets.Dataset: datasets.Dataset: Hugging Face Dataset containing the tasks. """ data = { - 'task_id': [], - 'main_query': [], - 'init_messages': [], - 'env_type': [], - 'metadata': [], + "task_id": [], + "main_query": [], + "init_messages": [], + "env_type": [], + "metadata": [], } for task in tasks: - data['task_id'].append(task.task_id) - data['main_query'].append(task.main_query) - data['init_messages'].append(task.init_messages) - data['env_type'].append(task.env_type) - data['metadata'].append(task.metadata) + data["task_id"].append(task.task_id) + data["main_query"].append(task.main_query) + data["init_messages"].append(task.init_messages) + data["env_type"].append(task.env_type) + data["metadata"].append(task.metadata) return datasets.Dataset.from_dict(data) diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index c51aa94d..f6ab2dfa 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -4,7 +4,7 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.env_service_client.env_client_ng import EnvClient +from astune.utils.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase @@ -18,15 +18,19 @@ def get_tasks(self, split): env_service_client = EnvClient(base_url=env_url) task_id_array = env_service_client.get_env_profile(env_type, split=split) if len(task_id_array) == 0: - raise ValueError(f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}") + raise ValueError( + f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}" + ) tasks = [ Task( - main_query='[not defined]', + main_query="[not defined]", init_messages=[], task_id=str(task_id), env_type=env_type, metadata={}, - ) for task_id in task_id_array] + ) + for task_id in task_id_array + ] return tasks def get_validation_tasks(self): diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py index da62cbdf..30917a20 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astune/task_reader/hf_dataset_reader.py @@ -4,11 +4,9 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase - class TaskReaderHuggingFace(TaskReaderBase): """ Task reader that reads tasks from Hugging Face datasets. @@ -20,7 +18,6 @@ class TaskReaderHuggingFace(TaskReaderBase): def __init__(self, config): super().__init__(config) - def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: """ Load a dataset split from Hugging Face datasets. @@ -35,7 +32,9 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: try: dataset = datasets.load_dataset(dataset_name, split=split) except Exception as e: - raise ValueError(f"Failed to load dataset '{dataset_name}' with split '{split}': {str(e)}") + raise ValueError( + f"Failed to load dataset '{dataset_name}' with split '{split}': {str(e)}" + ) # if len(dataset) == 0: # raise ValueError(f"No examples found in dataset '{dataset_name}' with split '{split}'") @@ -44,7 +43,7 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: for idx, example in enumerate(dataset): # Create Task object task = Task( - main_query=example['question'], + main_query=example["question"], init_messages=[], # Dataset examples typically don't have init messages task_id=str(idx), env_type=f"no_env", diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index e06158b1..35d16a3a 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -4,12 +4,9 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase - - class TaskReaderJsonl(TaskReaderBase): def __init__(self, config): super().__init__(config) @@ -26,17 +23,17 @@ def _read_jsonl_file(self, file_path): """ tasks = [] try: - with open(file_path, 'r', encoding='utf-8') as f: + with open(file_path, "r", encoding="utf-8") as f: for line in f: if line.strip(): # Skip empty lines task_data = json.loads(line) # Create a Task object from the JSON data task = Task( - main_query=task_data.get('main_query', '[not defined]'), - init_messages=task_data.get('init_messages', []), - task_id=task_data.get('task_id', ''), - env_type=task_data.get('env_type', 'no_env'), - metadata=task_data.get('metadata', {}) + main_query=task_data.get("main_query", "[not defined]"), + init_messages=task_data.get("init_messages", []), + task_id=task_data.get("task_id", ""), + env_type=task_data.get("env_type", "no_env"), + metadata=task_data.get("metadata", {}), ) tasks.append(task) except FileNotFoundError: diff --git a/astune/task_reader/task_reader_base.py b/astune/task_reader/task_reader_base.py index f1e256ef..562e86d9 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astune/task_reader/task_reader_base.py @@ -4,16 +4,14 @@ import datasets from typing import List, Dict, Optional from astune.schema.task import Task -from astune.env_service_client.env_client_ng import EnvClient class TaskReaderBase: def __init__(self, config): self.config = config - def get_training_tasks(self)->List[Task]: + def get_training_tasks(self) -> List[Task]: raise NotImplementedError - def get_validation_tasks(self)->List[Task]: + def get_validation_tasks(self) -> List[Task]: raise NotImplementedError - diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index e84ae7e7..37eb5b02 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -1,5 +1,3 @@ - - from typing import Any, List, Mapping, MutableMapping, Sequence, TypedDict import json @@ -16,7 +14,6 @@ from .connector import LocalSqliteConnectorV1, PhoenixConnector - class Config(TypedDict): base_url: str train_output_path: str @@ -34,6 +31,7 @@ def __init__( ) -> None: super().__init__(config) # config patch + # print("*********", config, "**********") self.config = config.astune.tracing self._connector = LocalSqliteConnectorV1(self.config.get("base_url")) @@ -128,4 +126,4 @@ def get_training_tasks(self) -> List[Task]: return self._train_tasks def get_validation_tasks(self) -> List[Task]: - return self._val_tasks \ No newline at end of file + return self._val_tasks diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index a0a6b57e..5d2cadfa 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -10,6 +10,7 @@ from astune.schema.task import Task + class TracingConnector(Protocol): def load_tasks_from_conversation(self) -> List[Task]: ... @@ -61,24 +62,24 @@ def load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: all_spans.extend(spans) return all_spans - def load_tasks_from_conversation( - self - ) -> List[Task]: + def load_tasks_from_conversation(self) -> List[Task]: all_spans = self.load_spans( - projects_limit=self._projects_limit, spans_limit=self._spans_limit) + projects_limit=self._projects_limit, spans_limit=self._spans_limit + ) all_spans.sort(key=lambda x: datetime.fromisoformat(x["end_time"])) - all_spans = list( - filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) + all_spans = list(filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) qa: list = [] for span in all_spans: inp = json.loads(span["attributes"]["gen_ai.input.messages"]) out = json.loads(span["attributes"]["gen_ai.output.messages"]) if "parts" in inp and "parts" in out: - qa.append({ - "query": inp["parts"][0]["content"], - "answer": out["parts"][0]["content"], - }) + qa.append( + { + "query": inp["parts"][0]["content"], + "answer": out["parts"][0]["content"], + } + ) tasks: List[Task] = [] for item in qa: @@ -141,29 +142,33 @@ class LocalSqliteConnectorV1: def __init__(self, db_path: str) -> None: self._db_path = db_path - assert os.path.exists( - self._db_path), f"DB file {self._db_path} does not exist" + assert os.path.exists(self._db_path), f"DB file {self._db_path} does not exist" def load_tasks_from_conversation(self) -> List[Task]: conn = sqlite3.connect(self._db_path) cursor = conn.cursor() rows = cursor.execute( - "SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() + "SELECT attributes FROM span_table where name='ReActAgent.reply'" + ).fetchall() qa = [] for row in rows: js = json.loads(row[0]) - query = js['input']['kwargs']['msg'] - output = js['output'] if 'output' in js else None + query = js["input"]["kwargs"]["msg"] + output = js["output"] if "output" in js else None if query is not None and output is not None: query = parse_msg_line(query) output = parse_msg_line(output) if query is not None and output is not None: - if query['role']=='user' and output['role']=='assistant': - if query['content'] is not None and output['content'] is not None: + if query["role"] == "user" and output["role"] == "assistant": + if query["content"] is not None and output["content"] is not None: qa.append( - {"query": query['content'], "answer": output['content']}) - + { + "query": query["content"], + "answer": output["content"], + } + ) + conn.close() tasks: List[Task] = [] @@ -182,12 +187,12 @@ def load_tasks_from_conversation(self) -> List[Task]: tasks.append(task) return tasks - + class LocalSqliteConnectorV2: """ A connector that loads tasks from a SQLite database file in new format. - + https://github.com/agentscope-ai/agentscope-studio/pull/40/files#diff-12c7e27505a5171e080133021430d8cae2f4929ce2f4c93bd4ea5a389094224a Args: @@ -203,14 +208,14 @@ class LocalSqliteConnectorV2: def __init__(self, db_path: str) -> None: self._db_path = db_path - assert os.path.exists( - self._db_path), f"DB file {self._db_path} does not exist" + assert os.path.exists(self._db_path), f"DB file {self._db_path} does not exist" def load_tasks_from_conversation(self) -> List[Task]: conn = sqlite3.connect(self._db_path) cursor = conn.cursor() rows = cursor.execute( - "SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() + "SELECT attributes FROM span_table where name='ReActAgent.reply'" + ).fetchall() qa = [] for row in rows: @@ -218,11 +223,13 @@ def load_tasks_from_conversation(self) -> List[Task]: inp = json.loads(js["gen_ai"]["input"]["messages"]) out = json.loads(js["gen_ai"]["output"]["messages"]) if "parts" in inp and "parts" in out: - qa.append({ - "query": inp["parts"][0]["content"], - "answer": out["parts"][0]["content"], - }) - + qa.append( + { + "query": inp["parts"][0]["content"], + "answer": out["parts"][0]["content"], + } + ) + conn.close() tasks: List[Task] = [] @@ -243,4 +250,8 @@ def load_tasks_from_conversation(self) -> List[Task]: return tasks -__all__ = ["LocalSqliteConnectorV1", "LocalSqliteConnectorV2", "PhoenixConnector"] \ No newline at end of file +__all__ = [ + "LocalSqliteConnectorV1", + "LocalSqliteConnectorV2", + "PhoenixConnector", +] diff --git a/astune/task_reader/tracing_reader/filters/factory.py b/astune/task_reader/tracing_reader/filters/factory.py index d6d8a39d..3e7d422a 100644 --- a/astune/task_reader/tracing_reader/filters/factory.py +++ b/astune/task_reader/tracing_reader/filters/factory.py @@ -28,8 +28,7 @@ def _build_single_filter(spec: Mapping[str, Any]) -> Filter: def build_filters(specs: Sequence[Mapping[str, Any]] | None) -> List[Filter]: - """Setup filter chain according to config. - """ + """Setup filter chain according to config.""" if not specs: return [] diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 02f05f07..4482ed23 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -1,9 +1,11 @@ from typing import Iterable, List from astune.schema.task import Task +from astune.task_rollout.dashscope_llm_bridge import ( + construct_alien_llm_chat_fn, +) from ..fn import Fn -from ..llm_client import DashScopeClient from .base import Filter @@ -12,18 +14,18 @@ --- ## 1. Evaluation Goal -Determine whether the given “query-answer” pair is **high-quality data (GOOD)** and provide a score and justification. +Determine whether the given “query-answer” pair is **high-quality data (GOOD)** and provide a score and justification. If it does not meet the criteria, label it as **BAD**. --- ## 2. BAD Criteria (if any are met → BAD) -1. **Missing elements**: The query is empty, the answer is empty, or both are empty. -2. **Non-answer**: The answer contains only acknowledgments such as “Received / OK / Please provide more information,” without substantive content or actionable results. -3. **Irrelevant**: The answer is clearly unrelated to the query. -4. **Process excuses**: The answer mainly describes process issues (“cannot search / rate-limited / captcha / try another device”), **without** providing alternative information, summaries, or next steps. -5. **Self-contradiction or illogical**: The answer contradicts itself or contains major logical inconsistencies. -6. **Safety or compliance violations**: Includes illegal content, hate speech, personal privacy leaks, or other clearly inappropriate material. +1. **Missing elements**: The query is empty, the answer is empty, or both are empty. +2. **Non-answer**: The answer contains only acknowledgments such as “Received / OK / Please provide more information,” without substantive content or actionable results. +3. **Irrelevant**: The answer is clearly unrelated to the query. +4. **Process excuses**: The answer mainly describes process issues (“cannot search / rate-limited / captcha / try another device”), **without** providing alternative information, summaries, or next steps. +5. **Self-contradiction or illogical**: The answer contradicts itself or contains major logical inconsistencies. +6. **Safety or compliance violations**: Includes illegal content, hate speech, personal privacy leaks, or other clearly inappropriate material. 7. **Severe language mismatch**: The answer is in a completely different language from the query in a way that breaks comprehension (e.g., Chinese query but irrelevant and incoherent French reply). --- @@ -46,15 +48,17 @@ def __init__( max_tokens: int = 2048, print_reason: bool = True, ) -> None: - """Filter that evaluates the quality of tasks using LLM. - """ + """Filter that evaluates the quality of tasks using LLM.""" self._print_reason = print_reason - self._llm = DashScopeClient() + self.alien_llm_chat_fn = construct_alien_llm_chat_fn( + alien_llm_model="qwen3-235b-a22b-instruct-2507", + alien_llm_response_length=512, + ) self._fn = Fn( name="evaluate_quality", description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), - llm_client=self._llm, + alien_llm_chat_fn=self.alien_llm_chat_fn, input_schema={ "query": "user query/task", "answer": "assistant answer", @@ -63,7 +67,10 @@ def __init__( "reason": "judgment reason, briefly explain the reason", "result": "GOOD/BAD", }, - sampling_params={"temperature": temperature, "max_tokens": max_tokens}, + sampling_params={ + "temperature": temperature, + "max_tokens": max_tokens, + }, ) def filter(self, tasks: Iterable[Task]) -> List[Task]: diff --git a/astune/task_reader/tracing_reader/fn.py b/astune/task_reader/tracing_reader/fn.py index a4918cfa..027fea18 100644 --- a/astune/task_reader/tracing_reader/fn.py +++ b/astune/task_reader/tracing_reader/fn.py @@ -1,6 +1,5 @@ import re from typing import Any, Dict, List, Union -from .llm_client import DashScopeClient class Fn: @@ -9,13 +8,15 @@ class Fn: It uses LlmClient to execute the task and parses the result using markdown-kv format. """ - def __init__(self, - name: str, - description: str, - llm_client: DashScopeClient, - input_schema: Dict[str, str], - output_schema: Dict[str, str], - sampling_params: Dict[str, Any] = {}): + def __init__( + self, + name: str, + description: str, + alien_llm_chat_fn: Any, + input_schema: Dict[str, str], + output_schema: Dict[str, str], + sampling_params: Dict[str, Any] = {}, + ): """ Initialize the Fn class. @@ -29,7 +30,7 @@ def __init__(self, """ self.name = name self.description = description - self.llm_client = llm_client + self.alien_llm_chat_fn = alien_llm_chat_fn self.input_schema = input_schema self.output_schema = output_schema self.sampling_params = sampling_params or {} @@ -77,7 +78,9 @@ def _build_system_prompt(self) -> str: prompt_parts.append("") # Multiple records instruction - prompt_parts.append("If there are multiple results, use separate records with increasing indices:") + prompt_parts.append( + "If there are multiple results, use separate records with increasing indices:" + ) prompt_parts.append("```markdown") prompt_parts.append("## record 0") prompt_parts.append("name=first_result") @@ -108,11 +111,11 @@ def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, Union[Dict[str, str], List[Dict[str, str]]]: Parsed result as dict or list of dicts """ # Remove code block markers if present - text = re.sub(r'```.*?\n', '', text, flags=re.DOTALL) - text = re.sub(r'```', '', text) + text = re.sub(r"```.*?\n", "", text, flags=re.DOTALL) + text = re.sub(r"```", "", text) # Split by record headers - record_pattern = r'## record \d+' + record_pattern = r"## record \d+" record_sections = re.split(record_pattern, text) # Remove empty sections @@ -122,10 +125,10 @@ def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, for section in record_sections: # Parse key-value pairs kv_dict = {} - lines = section.strip().split('\n') + lines = section.strip().split("\n") for line in lines: - if '=' in line: - key, value = line.split('=', 1) + if "=" in line: + key, value = line.split("=", 1) kv_dict[key.strip()] = value.strip() if kv_dict: # Only add non-empty dictionaries results.append(kv_dict) @@ -135,7 +138,9 @@ def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, return results[0] return results - def _format_input_parameters(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> str: + def _format_input_parameters( + self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]] + ) -> str: """ Format input parameters for the user prompt. @@ -166,7 +171,9 @@ def _format_input_parameters(self, input_data: Union[Dict[str, Any], List[Dict[s else: return f"Input parameters: {input_data}" - def __call__(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> Union[Dict[str, str], List[Dict[str, str]]]: + def __call__( + self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]] + ) -> Union[Dict[str, str], List[Dict[str, str]]]: """ Execute the task with the given parameters. @@ -182,11 +189,11 @@ def __call__(self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]]) -> U # Build messages for LLM messages = [ {"role": "system", "content": self._build_system_prompt()}, - {"role": "user", "content": user_prompt} + {"role": "user", "content": user_prompt}, ] # Call LLM - response = self.llm_client.chat(messages, self.sampling_params) + response = self.alien_llm_chat_fn(messages, self.sampling_params) # Parse and return result - return self._parse_markdown_kv(response) \ No newline at end of file + return self._parse_markdown_kv(response["content"]) diff --git a/astune/task_rollout/__init__.py b/astune/task_rollout/__init__.py new file mode 100644 index 00000000..b718083c --- /dev/null +++ b/astune/task_rollout/__init__.py @@ -0,0 +1 @@ +"""Task rollout helper modules.""" diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 8900bca4..f4efd1f4 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -1,39 +1,48 @@ -import os import copy +import json import time import numpy as np -import torch import uuid -import asyncio -from concurrent.futures import ThreadPoolExecutor -from typing import Dict, List, Literal, Callable, Any +from pydantic import BaseModel +from typing import Dict, List, Literal, Callable, Any, Type from loguru import logger from omegaconf import DictConfig -from tensordict import TensorDict -from torch.nn.utils.rnn import pad_sequence -from tqdm import tqdm -from verl import DataProto -from verl.utils.torch_functional import pad_sequence_to_length -from astune.workflow_controller.classic_agentflow import AgentFlow -from astune.workflow_controller.classic_agentflow import BaseAgentFlow -from astune.task_rollout.env_worker import EnvWorker -from astune.schema.task import Task, TaskLaunchCoreArgument -from astune.schema.trajectory import Sample -from astune.context_manager.cmt_linear import CMTLinear, CMTBaseAttr -from beast_logger import register_logger, print_dict, print_listofdict -from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow -from astune.utils.utils import run_async_coro__no_matter_what +from astune.utils.utils import run_async_coro__no_matter_what, remove_fields +from astune.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode from astune.schema.logprob import TokenAndProb +from agentscope.model import ChatResponse +from agentscope.message import TextBlock, ToolUseBlock +from agentscope._utils._common import _json_loads_with_repair +from transformers.tokenization_utils import PreTrainedTokenizer +from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracking, +) +from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser + class AsyncLlmBridge(object): + def __init__( + self, + config: DictConfig, + async_rollout_manager: Any, + tokenizer: Any, + llm_mode: Literal["local", "remote", "trinity"] = "local", + max_llm_retries: int = 3, + ): + self.config = config + self.async_rollout_manager = async_rollout_manager + self.tokenizer = tokenizer + self.llm_mode = llm_mode + self.max_llm_retries = max_llm_retries def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: + def llm_chat( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, - tools = [], - request_id: str = "" + tools=[], + request_id: str = "", ) -> dict: updated_sampling_params = {} @@ -42,52 +51,90 @@ def llm_chat( if custom_sampling_params: updated_sampling_params.update(custom_sampling_params) - tools = messages[-1].get("tools", None) - for msg in messages: msg.pop("tools", None) - input_messages = copy.deepcopy(messages) request_id = uuid.uuid4().hex - if tools is not None: - prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True, tools=tools) + if tools: + prompt_text = self.tokenizer.apply_chat_template( + input_messages, + add_generation_prompt=True, + tools=tools, + tokenize=False + ) else: - prompt_ids = self.tokenizer.apply_chat_template(input_messages, add_generation_prompt=True, tokenize=True) + prompt_text = self.tokenizer.apply_chat_template( + input_messages, + add_generation_prompt=True, + tokenize=False + ) + prompt_ids = self.tokenizer(prompt_text)["input_ids"] + + _test_if_test_mode('prompt_text', prompt_text, self.config) - final_res = run_async_coro__no_matter_what(self.async_rollout_manager.generate( + final_res = run_async_coro__no_matter_what( + self.async_rollout_manager.generate( request_id=request_id, prompt_ids=prompt_ids, sampling_params=updated_sampling_params, - ) + ), timeout=1200 ) - if self.config.astune.rollout.name == 'vllm': + if self.config.astune.rollout.name == "vllm": token_array = final_res.outputs[0].token_ids - elif self.config.astune.rollout.name == 'sglang': + elif self.config.astune.rollout.name == "sglang": token_array = final_res - decoded_text = self.tokenizer.decode(token_array) # type: ignore + decoded_text = self.tokenizer.decode(token_array) # type: ignore + if self.config.astune.execute_test: + decoded_text = _mock_if_test_mode('mock_decoded_text', decoded_text, self.config) + + if decoded_text.endswith("<|im_end|>"): + decoded_text = decoded_text[: -len("<|im_end|>")] - if decoded_text.endswith('<|im_end|>'): - decoded_text = decoded_text[:-len('<|im_end|>')] + # if tool call + tool_calls = None + if ('' in decoded_text) and ('' in decoded_text) and (not self.config.astune.rollout.agentscope_disable_toolcalls): + tool_parser = Hermes2ProToolParser(self.tokenizer) + parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore + parsed_tool_calls = parsed_tool_calls.model_dump() + _test_if_test_mode('parsed_tool_calls', parsed_tool_calls['tool_calls'], self.config) + model_called = parsed_tool_calls['tools_called'] + if model_called: + tool_calls = parsed_tool_calls['tool_calls'] + is_bad_toolcall = False + for i in range(len(tool_calls)): + if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: + expect_dict = json.loads(tool_calls[i]['function']['arguments']) + if not isinstance(expect_dict, dict): + from vsdb import bp; bp("UPUP5") + is_bad_toolcall = True + if is_bad_toolcall: + tool_calls = None + decoded_text = decoded_text + else: + decoded_text = parsed_tool_calls['content'] + if decoded_text is None: + decoded_text = "" return { "role": "assistant", "request_id": request_id, "content": decoded_text, + "tool_calls": tool_calls, "tokens": [ TokenAndProb( token_id=token, logprob=-1, - decoded_string=self.tokenizer.decode(token) + decoded_string=self.tokenizer.decode(token), ) - for token in token_array # type: ignore - ] + for token in token_array # type: ignore + ], } def llm_chat_remote( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, - tools = [], - request_id: str = "" + tools=[], + request_id: str = "", ) -> dict: updated_sampling_params = {} @@ -104,59 +151,61 @@ def llm_chat_remote( messages=input_messages, sampling_params=updated_sampling_params, tools=tools, - request_id=request_id + request_id=request_id, ) break except Exception as e: logger.bind(exception=True).exception(f"rollout_server.{i} error: {e.args}") time.sleep(i + 1) - return output_message[-1] # type: ignore - - + return output_message[-1] # type: ignore def llm_chat_trinity( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, - tools = [], - request_id: str = "" + tools=[], + request_id: str = "", ) -> dict: - async def main(model_client): + async def main(): updated_sampling_params = {} if sampling_params: updated_sampling_params.update(sampling_params) if custom_sampling_params: updated_sampling_params.update(custom_sampling_params) - updated_sampling_params.pop('min_tokens') + updated_sampling_params.pop("min_tokens") if tools: - response = await model_client.chat.completions.create( - model=model_client.model_path, + response = await self.async_rollout_manager.chat.completions.create( + model=self.async_rollout_manager.model_path, messages=messages, logprobs=True, tools=tools, top_logprobs=0, - **updated_sampling_params + **updated_sampling_params, ) else: - response = await model_client.chat.completions.create( - model=model_client.model_path, + response = await self.async_rollout_manager.chat.completions.create( + model=self.async_rollout_manager.model_path, messages=messages, logprobs=True, top_logprobs=0, - **updated_sampling_params + **updated_sampling_params, ) return response - assert hasattr(self, 'trinity_llm_model_client'), "trinity_llm_model_client is not set in AsyncLlmBridge" - response = run_async_coro__no_matter_what(main(self.trinity_llm_model_client)) # type: ignore - + response = run_async_coro__no_matter_what(main(), timeout=1200) # type: ignore + # from vsdb import bp; bp("TRR") + prompt_text = self.tokenizer.decode(response.model_extra['prompt_token_ids']) content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) if content is None: content = "" + if ('' in content) and (not message.get("tool_calls", None)): + # logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") + logger.warning(f"Bad toolcall discovered: {content}") + return { "role": "assistant", "request_id": response.id, @@ -166,13 +215,13 @@ async def main(model_client): TokenAndProb( token_id=token, logprob=tokenlogprob.logprob, - decoded_string=tokenlogprob.token + decoded_string=tokenlogprob.token, ) for tokenlogprob, token in zip( response.choices[0].logprobs.content, - response.choices[0].token_ids + response.choices[0].token_ids, ) - ] + ], } if self.llm_mode == "remote": @@ -183,3 +232,115 @@ async def main(model_client): return llm_chat +class LlmProxyForAgentScope(object): + """ + An essential wrapper to connect AsyncLlmBridge with AgentScope + + User_Agentscope_Workflow <-> AsyncLlmBridge <-> Context Tracker. + """ + + def __init__( + self, + llm_chat_fn, + tokenizer: PreTrainedTokenizer, + context_tracker: MultiAgentContextTracking, + config, + ) -> None: + self.context_tracker = context_tracker + self.llm_chat_fn = llm_chat_fn + self.tokenizer = tokenizer + self.config = config + + async def __call__( + self, + messages: List[dict], + tools: List = [], + tool_choice: str = "auto", + structured_model=None, + **kwargs, + ) -> ChatResponse: + + # prepare context tracker, check context safety + context_safe, info, converted_message, custom_sampling_params, tools = ( + self.context_tracker.step_prepare(messages, tools) + ) + if not context_safe: + logger.warning(f"[{info}] detected. Current token count exceeds the limit.") + self.context_tracker.context_overflow = True + return ChatResponse( + content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] + ) + # run llm inference ✨ + # from vsdb import bp; bp("TOOL_CALL_PARSE5") + llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) + + # begin context tracking + self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) + + # parse response + response = await self._parse_dashscope_generation_response( + llm_output, structured_model=structured_model + ) + return response + + # copied from AgentScope's DashScopeChatModule + async def _parse_dashscope_generation_response( + self, + message, + structured_model: Type[BaseModel] | None = None, + ) -> ChatResponse: + + content_blocks: List[TextBlock | ToolUseBlock] = [] + content = message.get("content") + metadata: dict | None = None + + if content not in [ + None, + "", + [], + ]: + if isinstance(content, list): + for item in content: + if isinstance(item, dict) and "text" in item: + content_blocks.append( + TextBlock( + type="text", + text=item["text"], + ), + ) + else: + content_blocks.append( + TextBlock( + type="text", + text=content, + ), + ) + + if message.get("tool_calls"): + for tool_call in message["tool_calls"]: + + input_ = _json_loads_with_repair( + tool_call["function"].get( + "arguments", + "{}", + ) + or "{}", + ) + content_blocks.append( + ToolUseBlock( + type="tool_use", + name=tool_call["function"]["name"], + input=input_, # type: ignore + id=tool_call["id"], + ), + ) + + if structured_model: + metadata = input_ # type: ignore + + parsed_response = ChatResponse( + content=content_blocks, + metadata=metadata, + ) + + return parsed_response diff --git a/astune/context_manager/agentflow_cm/cmt_foreign_llm.py b/astune/task_rollout/dashscope_llm_bridge.py similarity index 65% rename from astune/context_manager/agentflow_cm/cmt_foreign_llm.py rename to astune/task_rollout/dashscope_llm_bridge.py index aa4cc24b..b69859a2 100644 --- a/astune/context_manager/agentflow_cm/cmt_foreign_llm.py +++ b/astune/task_rollout/dashscope_llm_bridge.py @@ -5,20 +5,28 @@ from openai import OpenAI from loguru import logger -def construct_alien_llm_chat_fn(config, *args): - def alien_llm_chat_fn(messages, request_id=""): + +def construct_alien_llm_chat_fn(alien_llm_model, alien_llm_response_length): + def alien_llm_chat_fn(messages, sampling_params_override={}, request_id=""): max_try = 4 - alien_model_name = config.astune.context_manager.alien_llm_model - alien_model_response_length = config.astune.context_manager.alien_llm_response_length + alien_model_name = alien_llm_model + alien_model_response_length = alien_llm_response_length - if os.environ.get("DASHSCOPE_API_KEY") is None or os.environ.get("DASHSCOPE_API_KEY_BACKUP") is None: - raise RuntimeError(dedent(""" + if ( + os.environ.get("DASHSCOPE_API_KEY") is None + or os.environ.get("DASHSCOPE_API_KEY_BACKUP") is None + ): + raise RuntimeError( + dedent( + """ Please set the DASHSCOPE_API_KEY and DASHSCOPE_API_KEY_BACKUP environment variables. You can get the API keys from https://www.dashscope.com/. Example: export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' - """)) + """ + ) + ) regular_key_list = os.environ.get("DASHSCOPE_API_KEY") backup_key_list = os.environ.get("DASHSCOPE_API_KEY_BACKUP") @@ -31,15 +39,14 @@ def alien_llm_chat_fn(messages, request_id=""): else: backup_key_list = [] - for n_try in range(max_try): try: if n_try < max_try // 2: - api_key=random.choice(regular_key_list) + api_key = random.choice(regular_key_list) elif n_try == max_try // 2: - api_key=random.choice(backup_key_list) + api_key = random.choice(backup_key_list) else: - api_key=random.choice(regular_key_list + backup_key_list) + api_key = random.choice(regular_key_list + backup_key_list) client = OpenAI( api_key=api_key, base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", @@ -47,19 +54,24 @@ def alien_llm_chat_fn(messages, request_id=""): sampling_params = dict( n=1, max_completion_tokens=alien_model_response_length, + temperature=0.0, ) - sampling_params["temperature"] = 0 + sampling_params.update(sampling_params_override) completion = client.chat.completions.create( model=alien_model_name, messages=messages, - extra_body=sampling_params + extra_body=sampling_params, ) - message = completion.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) - if "content" not in message: message["content"] = "" - return {"role": message["role"], "content": message['content']} + message = completion.choices[0].message.model_dump( + exclude_unset=True, exclude_none=True + ) + if "content" not in message: + message["content"] = "" + return {"role": message["role"], "content": message["content"]} except Exception as e: logger.bind(exception=True).exception(f"Error calling alien llm: {e}") time.sleep(5) print(f"Error calling alien llm: {e}, retrying...") raise RuntimeError(f"Failed to get response from alien llm after {max_try} attempts") + return alien_llm_chat_fn diff --git a/astune/task_rollout/env_worker.py b/astune/task_rollout/env_worker.py deleted file mode 100644 index 3b6c498e..00000000 --- a/astune/task_rollout/env_worker.py +++ /dev/null @@ -1,129 +0,0 @@ -from loguru import logger -from typing import List, Union -from omegaconf import DictConfig -from astune.workflow_controller.classic_agentflow import AgentFlow -from astune.workflow_controller.classic_agentflow import BaseAgentFlow -from astune.workflow_controller.agentscope_flow import AgentScopeWorkflow -from astune.context_manager.cmt_linear import CMTLinear -from astune.env_service_client.env_client_ng import EnvClient as EnvClientNg - -class EnvWorker(object): - - def __init__(self, task_core_arg, config: DictConfig): - self.config = config - - if config.astune.task_reader.type == 'env_service': - url = config.astune.task_reader.env_service.env_url - env_type = config.astune.task_reader.env_service.env_type - self.env = EnvClientNg(base_url=url) - self.env_params = {} - self.env_type: str = env_type - else: - self.env = None - - self.task_core_arg = task_core_arg - self.task_id: str = task_core_arg.task_id - self.tokenizer = task_core_arg.tokenizer - self.llm_chat_fn = task_core_arg.llm_chat_fn - self.obs_window = task_core_arg.obs_window - - - def execute(self) -> CMTLinear: - """Choose between classic `AgentFlow` controller and `AgentScopeWorkflow` controller - """ - - # >>>>>>>>>>>>>> create - init_messages = self._initialize_environment_and_messages() - - # >>>>>>>>>>>>>> simulate - try: - if not self.config.astune.rollout.use_agentscope_protocol: - agent_flow: BaseAgentFlow = AgentFlow(llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, config=self.config) - else: - agent_flow: BaseAgentFlow = AgentScopeWorkflow(llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, config=self.config) - cmt = agent_flow.execute( - init_messages=init_messages, - env=self.env, # type:ignore || self.env: Union[EnvClient, EnvClientNg] - task_core_arg=self.task_core_arg - ) - except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.agent_flow~ error={e.args}") - if self.env: self.env.release_instance(self.task_core_arg.task_env_uuid) - raise e - - cmt.task_batch_index = self.task_core_arg.task_batch_index - cmt.task_tag = self.task_core_arg.task_tag - cmt.task_id = self.task_id - - # >>>>>>>>>>>>>> destory - try: - if self.env: self.env.release_instance(self.task_core_arg.task_env_uuid) - except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.release_instance~ error={e.args}") - raise e - - return cmt - - - def _initialize_environment_and_messages(self) -> List[dict]: - """ - Initialize environment instance and setup initial messages. - - Returns: - List[dict]: Initial messages for the agent flow - - Raises: - Exception: If environment creation fails or required task data is missing - """ - if self.config.astune.task_reader.type == 'env_service': - if self.env is None: - raise ValueError("Environment client is None but env_service type is specified") - try: - init_response = self.env.create_instance( - env_type=self.env_type, - task_id=self.task_id, - instance_id=self.task_core_arg.task_env_uuid, - params=self.env_params - ) - state_message: dict = init_response["state"] - _, init_messages = self._get_init_messages(state_message) - except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.create_instance~ error={e.args}") - if self.env is not None: - self.env.release_instance(self.task_core_arg.task_env_uuid) - raise e - else: - task = self.task_core_arg.task - if task.init_messages: - init_messages = task.init_messages - else: - assert task.main_query, "You must provide init_messages or main_query in task." - init_messages = [{"role": "user", "content": task.main_query}] - - return init_messages - - - def _get_init_messages(self, state_message) -> tuple: - """ - Process state_message to extract query and init_messages. - - Args: - state_message (Union[dict, list]): The state message to process - - Returns: - tuple: (query, init_messages) where query is a string and init_messages is a list - - Raises: - ValueError: If state_message is neither dict nor list - """ - if isinstance(state_message, dict): - query = state_message["content"] - init_messages = [state_message] - elif isinstance(state_message, list): - assert isinstance(state_message[0], dict) - query = state_message[-1]["content"] - init_messages = state_message - else: - raise ValueError(f"state_message should be dict or list, but got {type(state_message)}") - - return query, init_messages diff --git a/astune/task_rollout/native_parallel_worker.py b/astune/task_rollout/native_parallel_worker.py new file mode 100644 index 00000000..ad08d5f7 --- /dev/null +++ b/astune/task_rollout/native_parallel_worker.py @@ -0,0 +1,587 @@ +"""Parallel environment rollout orchestration utilities.""" + +import os +import time +from concurrent.futures import ThreadPoolExecutor +from typing import List, Literal +from urllib.parse import quote + +import numpy as np +import torch +from loguru import logger +from tensordict import TensorDict +from torch.nn.utils.rnn import pad_sequence +from tqdm import tqdm +from verl import DataProto +from verl.utils.torch_functional import pad_sequence_to_length + +from astune.context_tracker.basic_tracker import BasicContextTracker +from astune.schema.task import Task +from astune.schema.trajectory import Sample +from astune.task_rollout.single_worker import BaseParallelEnv + + +class StepPrinter(BaseParallelEnv): + """Utility mixin providing periodic progress / throughput printing.""" + + def step_status_printer(self, obs_window): + # Histogram buckets: obs_window['step'] 0~5 / 5~10 / 10~15 / ... + step_counter = {} + current_token = sum(obs_window["token"]) + current_time = time.time() + delta_token = current_token - self.current_token + if delta_token < 0: + delta_token = current_token + delta_time = current_time - self.current_token_count_time + self.current_token = current_token + self.current_token_count_time = current_time + token_gen_per_sec_str = ( + f"{delta_token/delta_time:.2f} tokens/s" if delta_time > 0 else "N/A" + ) + + for step in obs_window["step"]: + if step == -1: + step_counter[(-1, "terminated")] = step_counter.get((-1, "terminated"), 0) + 1 + continue + else: + start = (step // 5) * 5 + end = start + 5 + step_counter[(start, end)] = step_counter.get((start, end), 0) + 1 + + step_counter = dict(sorted(step_counter.items(), key=lambda x: x[0][0])) + + print_buf = [] + for (start, end), count in step_counter.items(): + if start != -1: + print_buf += [f"[{start}-{end}]:{count} threads"] + for (start, end), count in step_counter.items(): + if start == -1: + print_buf += [f"[finished]:{count} threads"] + print(f"Rollout progress ({token_gen_per_sec_str}): " + " // ".join(print_buf)) + + +class StaticRollout(StepPrinter): + """Static (non-dynamic) rollout manager.""" + + def rollout( + self, + tasks: List[Task], + mode: Literal["sample", "validate"], + epoch: str, + ) -> List[BasicContextTracker]: + self.current_token_count_time = time.time() + cmt_array: List[BasicContextTracker] = [] + rollout_n = 1 if mode == "validate" else self.rollout_n + obs_window = { + "step": [0 for _ in range(len(tasks) * rollout_n)], + "token": [0 for _ in range(len(tasks) * rollout_n)], + "stop": [False for _ in range(len(tasks) * rollout_n)], + } + with ThreadPoolExecutor(max_workers=self.max_parallel) as executor: + futures = [] + for task_batch_index, task in enumerate(tasks): + for task_rollout_index in range(rollout_n): + task_thread_index = task_batch_index * rollout_n + task_rollout_index + future = executor.submit( + self.rollout_env_worker, + task=task, + task_batch_index=task_batch_index, + task_tag=f"T{task.task_id}#R{task_rollout_index}", + mode=mode, + task_thread_index=task_thread_index, + obs_window=obs_window, + ) + futures.append(future) + + while True: + if not any(future.running() for future in futures): + break + if any(future.exception() for future in futures): + executor.shutdown(wait=False, cancel_futures=True) + for f in futures: + if not f.done(): f.cancel() + raise RuntimeError("One of the rollout threads has encountered an exception.") + self.step_status_printer(obs_window) + time.sleep(10) + + for future in tqdm(futures, desc=f"epoch{epoch}.collect_rollout"): + result = future.result() + cmt_array.append(result) + + task_success_rate = np.mean([cmt.reward_structure.success_rate for cmt in cmt_array]) + for cmt in cmt_array: + cmt.current_batch_success_rate = float(task_success_rate) + + return cmt_array + + +class DynamicRollout(StaticRollout): + """Dynamic rollout supporting oversampling and early termination.""" + + def rollout( + self, + tasks: List[Task], + mode: Literal["sample", "validate"], + epoch: str, + ) -> List[BasicContextTracker]: + if ( + mode == "sample" + and (self.rollout_n != 1) + and self.config.astune.rollout.enable_oversample + ): + return self.rollout_dynamic(tasks, mode, epoch) + else: + return super().rollout(tasks, mode, epoch) + + def greedy_max_std_selection(self, samples: List[BasicContextTracker], n): + if len(samples) < n: + additional_n = n - len(samples) + n = len(samples) + else: + additional_n = 0 + + sorted_samples = sorted( + samples, + key=lambda cmt: abs(cmt.reward_structure.performance_reward), + ) + value_array = [cmt.reward_structure.performance_reward for cmt in sorted_samples] + macro_selected_value = [] + macro_selected_index = [] + while len(macro_selected_index) != n: + selected_value = [] + selected_index = [] + for index, value in enumerate(value_array): + if (value not in selected_value) and (index not in macro_selected_index): + selected_value.append(value) + selected_index.append(index) + + if len(selected_value) + len(macro_selected_value) <= n: + macro_selected_value += selected_value + macro_selected_index += selected_index + + elif len(selected_value) + len(macro_selected_value) > n: + preserve_n = n - len(macro_selected_value) + pick_left = preserve_n // 2 + pick_right = preserve_n - pick_left + macro_selected_value += selected_value[:pick_left] + selected_value[-pick_right:] + macro_selected_index += selected_index[:pick_left] + selected_index[-pick_right:] + + if additional_n > 0: + additional_indices = np.random.choice(macro_selected_index, additional_n, replace=True) + macro_selected_index += additional_indices.tolist() + + selected_samples = [sorted_samples[i] for i in macro_selected_index] + sorted_selected_samples = sorted( + selected_samples, + key=lambda cmt: abs(cmt.reward_structure.performance_reward), + ) + return sorted_selected_samples + + def rollout_dynamic( + self, + tasks: List[Task], + mode: Literal["sample", "validate"], + epoch: str, + allow_sample_num_change=True, + allow_force_stop=True, + ) -> List[BasicContextTracker]: + cmt_array: List[BasicContextTracker] = [] + assert mode != "validate" + rollout_n = self.rollout_n + self.current_token_count_time = time.time() + submit_oversample_multiplier = self.config.astune.rollout.submit_oversample_multiplier + rollout_n_oversample = int(rollout_n * submit_oversample_multiplier) + rollout_n_confirm = int(rollout_n * (1 + submit_oversample_multiplier) / 2) + assert ( + rollout_n < rollout_n_confirm < rollout_n_oversample + ), f"submit_oversample_multiplier is too small, rollout_n={rollout_n}, rollout_n_confirm={rollout_n_confirm}, rollout_n_oversample={rollout_n_oversample}" + + obs_window = { + "step": [0 for _ in range(len(tasks) * rollout_n_oversample)], + "stop": [False for _ in range(len(tasks) * rollout_n_oversample)], + "token": [0 for _ in range(len(tasks) * rollout_n_oversample)], + } + + with ThreadPoolExecutor(max_workers=self.max_parallel) as executor: + futures = [] + for task_batch_index, task in enumerate(tasks): + task_future_array = [] + for task_rollout_index in range(rollout_n_oversample): + task_thread_index = task_batch_index * rollout_n_oversample + task_rollout_index + future = executor.submit( + self.rollout_env_worker, + task=task, + task_batch_index=task_batch_index, + task_tag=f"T{task.task_id}#R{task_rollout_index}", + mode=mode, + task_thread_index=task_thread_index, + obs_window=obs_window, + ) + task_future_array.append(future) + futures += [task_future_array] + + tic = -1 + while True: + tic += 1 + can_terminate = [False for _ in futures] + terminate_status = ["running" for _ in futures] + for j, task_future_array in enumerate(futures): + completed_task_futures = [f for f in task_future_array if f.done()] + completed_results = [f.result() for f in completed_task_futures] + completed_results = [cmt for cmt in completed_results if not cmt.discarded] + reward = [cmt.reward_structure.performance_reward for cmt in completed_results] + reward_std = np.std(reward) if reward else 0.0 + all_finished = len(completed_task_futures) == len(task_future_array) + if all_finished: + can_terminate[j] = True + terminate_status[j] = f"all_fin({len(completed_results)}/{reward_std:.2f})" + num_finished = len(completed_task_futures) + task_cmd_reward_array = [ + cmt.reward_structure.performance_reward for cmt in completed_results + ] + all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) + if not all_equal: + if num_finished >= rollout_n: + can_terminate[j] = True + terminate_status[j] = ( + f"early_end({len(completed_results)}/{reward_std:.2f})" + ) + else: + pass + else: + if num_finished >= rollout_n_confirm: + can_terminate[j] = True + terminate_status[j] = ( + f"confirm_dummy({len(completed_results)}/{reward_std:.2f})" + ) + if allow_force_stop: + for k in range( + j * rollout_n_oversample, + j * rollout_n_oversample + rollout_n_oversample, + ): + obs_window["stop"][k] = True + else: + pass + terminate_status = "/".join(terminate_status) + if all(can_terminate): + logger.info(f"epoch{epoch}.collect_rollout: all tasks finished, exiting loop") + for i, stop_flag in enumerate(obs_window["stop"]): + obs_window["stop"][i] = True + break + else: + if tic % 10 == 0: + self.step_status_printer(obs_window) + logger.info( + f"task complete {sum(can_terminate)}/{len(can_terminate)} tasks: {terminate_status}" + ) + time.sleep(5) + tic = -1 + while any(f.running() for task_future_array in futures for f in task_future_array): + tic += 1 + if tic % 10 == 0: + logger.info("waiting final sync, this will not take long") + time.sleep(5) + + task_ineffective_thread_cnt = [] + task_completed_thread_cnt = [] + task_extra_thread_cnt = [] + task_need_amend = 0 + for j, task_future_array in enumerate(futures): + completed_task_futures = [f for f in task_future_array if f.done()] + completed_results = [f.result() for f in completed_task_futures] + completed_results = [cmt for cmt in completed_results if not cmt.discarded] + task_cmd_reward_array = [ + cmt.reward_structure.performance_reward for cmt in completed_results + ] + all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) + completed_task_cnt = len(completed_results) + if all_equal: + task_need_amend += 1 + task_completed_thread_cnt += [0] + task_extra_thread_cnt += [0] + task_ineffective_thread_cnt += [completed_task_cnt] + else: + task_need_amend += 0 + task_completed_thread_cnt += [completed_task_cnt] + task_extra_thread_cnt += [completed_task_cnt - rollout_n] + task_ineffective_thread_cnt += [0] + + logger.info(f"task_completed_thread_cnt: {task_completed_thread_cnt}") + logger.info(f"task_extra_thread_cnt: {task_extra_thread_cnt}") + + world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes + total_sample = sum(task_completed_thread_cnt) + if allow_sample_num_change and (total_sample > world_size * 2): + add_count = 0 + num_task_to_amend = len(futures) + logger.info( + f"allow_sample_num_change policy: world_size: {world_size}, total_sample {total_sample}, add_count: {add_count}, " + ) + while add_count != 0: + _task_completed_thread_cnt_find_nonzero_min = [ + float("inf") if x <= 0 else x for x in task_completed_thread_cnt + ] + min_extra_index = _task_completed_thread_cnt_find_nonzero_min.index( + min(_task_completed_thread_cnt_find_nonzero_min) + ) + task_extra_thread_cnt[min_extra_index] += 1 + task_completed_thread_cnt[min_extra_index] += 1 + add_count -= 1 + logger.info( + f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}" + ) + logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") + else: + num_task_max_to_amend = sum(task_extra_thread_cnt) // rollout_n + num_task_to_amend = min(num_task_max_to_amend, task_need_amend) + extra_num_thread_required = num_task_to_amend * rollout_n + remove_count = sum(task_extra_thread_cnt) - extra_num_thread_required + logger.info( + f"forbid_sample_num_change policy: num_task_max_to_amend: {num_task_max_to_amend}, num_task_to_amend: {num_task_to_amend}, remove_count: {remove_count}, " + ) + + while remove_count != 0: + max_extra_index = task_extra_thread_cnt.index(max(task_extra_thread_cnt)) + assert ( + task_extra_thread_cnt[max_extra_index] > 0 + ), "task_extra_thread_cnt should be greater than 0" + task_extra_thread_cnt[max_extra_index] -= 1 + task_completed_thread_cnt[max_extra_index] -= 1 + remove_count -= 1 + logger.info( + f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}" + ) + logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") + + cmt_array = [] + print_buffer = "" + task_success_rate = [] + for j, task_future_array, avail_extra_cnt in zip( + range(len(futures)), futures, task_extra_thread_cnt + ): + completed_task_futures = [f for f in task_future_array if f.done()] + completed_results = [f.result() for f in completed_task_futures] + completed_results = [cmt for cmt in completed_results if not cmt.discarded] + task_cmd_reward_array = [ + cmt.reward_structure.performance_reward for cmt in completed_results + ] + success_rate_array = [ + cmt.reward_structure.success_rate for cmt in completed_results + ] + task_success_rate += [np.mean(success_rate_array)] + need_amend = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) + if need_amend and (num_task_to_amend > 0): + num_task_to_amend -= 1 + print_buffer += f"/(amend)" + continue + else: + if need_amend: + num_completed = len(completed_results) + num_to_be_selected = rollout_n + else: + num_completed = len(completed_results) + num_to_be_selected = rollout_n + avail_extra_cnt + selected_cmt_array = self.greedy_max_std_selection( + completed_results, num_to_be_selected + ) + cmt_array += selected_cmt_array + print_buffer += f"/({len(selected_cmt_array)})" + if need_amend: + print_buffer += "(no-amend)" + logger.info(print_buffer) + + for cmt in cmt_array: + cmt.current_batch_success_rate = np.mean(task_success_rate) + return cmt_array + + +class ParallelEnvManager(DynamicRollout): + """High-level manager orchestrating rollouts and batch conversion.""" + + def to_dataproto(self, cmt_array) -> DataProto: + samples = self.trajectories_to_samples(cmt_array) + dataproto = self.samples_to_dataproto(samples) + return dataproto + + def trajectories_to_samples(self, cmt_array: List[BasicContextTracker]) -> List[Sample]: + sample_arr_final = [] + BasicContextTracker.compute_reference_advantage(cmt_array) + for cmt in cmt_array: + try: + sample_arr = cmt.group_tokenize() + except Exception as e: + raise e + finally: + cmt.generate_log(global_step=self.current_global_steps) + if os.environ.get("BEST_LOGGER_PATH", None) and os.environ.get( + "ASTUNE_DEBUG", None + ): + logger.success( + f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]" + ) + sample_arr_final += sample_arr + + if self.config.astune.backbone in ["verl"]: + world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes + remainder = len(sample_arr_final) % world_size + if remainder != 0: + import random + + remove_indices = random.sample(range(len(sample_arr_final)), remainder) + remove_indices.sort(reverse=True) + for idx in remove_indices: + sample_arr_final.pop(idx) + + return sample_arr_final + + def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: + prompt_ids, response_ids = [], [] + prompt_attention_mask, response_attention_mask = [], [] + prompt_position_ids, response_position_ids = [], [] + prompt_loss_mask, response_loss_mask = [], [] + messages = [] + step_reward_scores = [] + task_ids = [] + rollout_ids = [] + reference_advantage = [] + + for sample in samples: + assert ( + len(sample.input_ids) + == len(sample.attention_mask) + == len(sample.position_ids) + == len(sample.loss_mask) + ), f"Sample {sample.request_id} has mismatched lengths: {len(sample.input_ids)=}, {len(sample.attention_mask)=}, {len(sample.position_ids)=}, {len(sample.loss_mask)=}" + + task_ids.append(sample.task_id) + rollout_ids.append(sample.task_tag) + if len(sample.prompt_ids) > self.config.astune.data.max_prompt_length: + raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") + + if len(sample.response_ids) > self.config.astune.data.max_response_length: + raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") + + assert len(sample.prompt_ids) != 0 + assert len(sample.response_ids) != 0 + prompt_ids.append(torch.tensor(sample.prompt_ids, dtype=torch.int)) + response_ids.append(torch.tensor(sample.response_ids, dtype=torch.int)) + + prompt_attention_mask.append( + torch.tensor(sample.prompt_attention_mask, dtype=torch.int) + ) + response_attention_mask.append( + torch.tensor(sample.response_attention_mask, dtype=torch.int) + ) + + prompt_position_ids.append(torch.tensor(sample.prompt_position_ids, dtype=torch.int)) + response_position_ids.append( + torch.tensor(sample.response_position_ids, dtype=torch.int) + ) + + prompt_loss_mask.append(torch.tensor(sample.prompt_loss_mask, dtype=torch.int)) + response_loss_mask.append(torch.tensor(sample.response_loss_mask, dtype=torch.int)) + + reference_advantage.append(sample.reference_advantage) + + messages.append({"messages": sample.messages}) + step_reward_scores.append(sample.step_reward) + + max_prompt_length_this_batch = max([p.shape[-1] for p in prompt_ids]) + assert max_prompt_length_this_batch <= self.config.astune.data.max_prompt_length + max_response_length_this_batch = max([p.shape[-1] for p in response_ids]) + assert max_response_length_this_batch <= self.config.astune.data.max_response_length + + prompt_ids = pad_sequence( + prompt_ids, + batch_first=True, + padding_value=self.pad_token_id, + padding_side="left", + ) + prompt_attention_mask = pad_sequence( + prompt_attention_mask, + batch_first=True, + padding_value=0, + padding_side="left", + ) + prompt_position_ids = pad_sequence( + prompt_position_ids, + batch_first=True, + padding_value=0, + padding_side="left", + ) + prompt_loss_mask = pad_sequence( + prompt_loss_mask, + batch_first=True, + padding_value=0, + padding_side="left", + ) + + prompt_ids = pad_sequence_to_length( + prompt_ids, + max_prompt_length_this_batch, + self.pad_token_id, + left_pad=True, + ) + prompt_attention_mask = pad_sequence_to_length( + prompt_attention_mask, + max_prompt_length_this_batch, + 0, + left_pad=True, + ) + prompt_position_ids = pad_sequence_to_length( + prompt_position_ids, max_prompt_length_this_batch, 0, left_pad=True + ) + prompt_loss_mask = pad_sequence_to_length( + prompt_loss_mask, max_prompt_length_this_batch, 0, left_pad=True + ) + + response_ids = pad_sequence(response_ids, batch_first=True, padding_value=self.pad_token_id) + response_attention_mask = pad_sequence( + response_attention_mask, batch_first=True, padding_value=0 + ) + response_loss_mask = pad_sequence(response_loss_mask, batch_first=True, padding_value=0) + + response_ids = pad_sequence_to_length( + response_ids, max_response_length_this_batch, self.pad_token_id + ) + response_attention_mask = pad_sequence_to_length( + response_attention_mask, max_response_length_this_batch, 0 + ) + response_loss_mask = pad_sequence_to_length( + response_loss_mask, max_response_length_this_batch, 0 + ) + + delta_position_id = ( + torch.arange(1, response_ids.size(1) + 1, device=response_ids.device) + .unsqueeze(0) + .repeat(len(samples), 1) + ) + response_position_ids = prompt_position_ids[:, -1:] + delta_position_id + + input_ids = torch.cat((prompt_ids, response_ids), dim=-1) + attention_mask = torch.cat((prompt_attention_mask, response_attention_mask), dim=-1) + position_ids = torch.cat((prompt_position_ids, response_position_ids), dim=-1) + loss_mask = torch.cat((prompt_loss_mask, response_loss_mask), dim=-1) + + batch = TensorDict( + { + "prompts": prompt_ids, + "responses": response_ids, + "input_ids": input_ids, + "attention_mask": attention_mask, + "position_ids": position_ids, + "loss_mask": loss_mask, + }, + batch_size=len(samples), + ) + + return DataProto( + batch=batch, + non_tensor_batch={ + "task_ids": np.array(task_ids), + "rollout_ids": np.array(rollout_ids), + "messages": np.array(messages), + "reward_scores": np.array(step_reward_scores), + "reference_advantage": np.array(reference_advantage), + }, + ) diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py new file mode 100644 index 00000000..d27f239a --- /dev/null +++ b/astune/task_rollout/resource_keeper.py @@ -0,0 +1,188 @@ +from loguru import logger +from typing import List, Union +from omegaconf import DictConfig +from typing import Any, Dict, Tuple, Union, Callable +from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astune.schema.task import Task, WorkflowTask +from beast_logger import print_dict + +class ResourceKeeper(object): + """ + TODO: integrate with A.S. Runtime + """ + + def __init__(self, workflow_task: WorkflowTask, config: DictConfig): + self.workflow_task = workflow_task + self.config = config + + def __enter__(self): + self.config = self.config + self.workflow_task = self.workflow_task + self.task_id: str = self.workflow_task.task_id + self.tokenizer = self.workflow_task.tokenizer + self.llm_chat_fn = self.workflow_task.llm_chat_fn + self.obs_window = self.workflow_task.obs_window + if self.config.astune.task_reader.type == "env_service": + url = self.config.astune.task_reader.env_service.env_url + env_type = self.config.astune.task_reader.env_service.env_type + self.env = EnvClientNg(base_url=url) + self.env_params = {} + self.env_type: str = env_type + else: + self.env = None + return self + + def __exit__(self, exc_type, exc_value, traceback): + try: + if self.env: + self.env.release_instance(self.workflow_task.task_env_uuid) + except Exception as e: + logger.bind(exception=True).exception( + f"encounter exception in env_worker.release_instance~ error={e.args}" + ) + raise e + + + def prepare(self): + """ + Prepare the environment and initial messages for the workflow task. + + Returns: + WorkflowTask: The updated workflow task with initialized environment and messages. + """ + init_messages = self._initialize_environment_and_messages() + self.workflow_task.task.init_messages = init_messages + self.workflow_task.gym_env = self.generate_gym_env( + self.env, + self.workflow_task.task_env_uuid, + self.workflow_task.task_thread_index, + self.workflow_task.obs_window + ) + + return self.workflow_task + + + def _initialize_environment_and_messages(self) -> List[dict]: + """ + Initialize environment instance and setup initial messages. + + Returns: + List[dict]: Initial messages for the agent flow + + Raises: + Exception: If environment creation fails or required task data is missing + """ + + if self.config.astune.task_reader.type == 'env_service': + if self.env is None: + raise ValueError("Environment client is None but env_service type is specified") + try: + init_response = self.env.create_instance( + env_type=self.env_type, + task_id=self.task_id, + instance_id=self.workflow_task.task_env_uuid, + params=self.env_params + ) + state_message: dict = init_response["state"] + _, init_messages = self._get_init_messages(state_message) + except Exception as e: + logger.bind(exception=True).exception(f"encounter exception in env_worker.create_instance~ error={e.args}") + if self.env is not None: + self.env.release_instance(self.workflow_task.task_env_uuid) + raise e + else: + task = self.workflow_task.task + if task.init_messages: + init_messages = task.init_messages + else: + assert task.main_query, "You must provide init_messages or main_query in task." + init_messages = [{"role": "user", "content": task.main_query}] + + return init_messages + + + def _get_init_messages(self, state_message) -> tuple: + """ + Process state_message to extract query and init_messages. + + Args: + state_message (Union[dict, list]): The state message to process + + Returns: + tuple: (query, init_messages) where query is a string and init_messages is a list + + Raises: + ValueError: If state_message is neither dict nor list + """ + if isinstance(state_message, dict): + query = state_message["content"] + init_messages = [state_message] + elif isinstance(state_message, list): + assert isinstance(state_message[0], dict) + query = state_message[-1]["content"] + init_messages = state_message + else: + raise ValueError(f"state_message should be dict or list, but got {type(state_message)}") + + return query, init_messages + + + def generate_gym_env( + self, env_client: Any, task_env_uuid: str, task_thread_index: int, obs_window: Dict + ) -> "BaseGymEnv": + return BaseGymEnv(env_client, task_env_uuid, task_thread_index, obs_window) + + + + +class BaseGymEnv(object): + """ + TODO: integrate with A.S. Runtime + """ + + + def __init__( + self, env_client: EnvClientNg, task_env_uuid: str, task_thread_index: int, obs_window: Dict + ): + self.env_client = env_client + self.task_thread_index = task_thread_index + self.obs_window = obs_window + self.task_env_uuid = task_env_uuid + + def step(self, action: dict) -> Tuple[str, float, bool, dict]: + # fix agentscope output + if not isinstance(action['content'], str): + # assert isinstance(action['content'], list) + # assert len(action['content']) == 1 + # assert isinstance(action['content'][0], dict) + # assert 'type' in action['content'][0] + # assert 'text' in action['content'][0] + try: + action['content'] = action['content'][0]['text'] + except: + logger.exception(f"Failed to parse action content from agentscope output. {action['content']}") + action['content'] = str(action['content']) + + self.obs_window["step"][self.task_thread_index] += 1 + env_output = self.env_client.step( + instance_id=self.task_env_uuid, + action=action, + ) + obs = "" + assert isinstance(env_output, dict) + if ("content" not in env_output["state"]) and ("error" in env_output["state"]): + obs = f"[Error from environment: {env_output['error']}]" + elif env_output["state"]["content"] == "": + obs = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." + else: + obs = env_output["state"]["content"] + reward = 0 + info = {} + terminate = env_output["is_terminated"] + return obs, reward, terminate, info + + def reset(self) -> str: + raise RuntimeError("Reset is not supported") + + def evaluate(self, task_env_uuid, params): + return self.env_client.evaluate(task_env_uuid, params) diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py new file mode 100644 index 00000000..6cef2502 --- /dev/null +++ b/astune/task_rollout/single_worker.py @@ -0,0 +1,137 @@ +"""Single worker primitives for environment rollouts.""" + +import os +import time +import uuid +from functools import wraps +from typing import Any, Callable, Literal, Optional, TypeVar, List, Union + +from loguru import logger +from omegaconf import DictConfig +from transformers.tokenization_utils import PreTrainedTokenizer + +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + TrackerAttr, +) +from astune.schema.task import Task, WorkflowTask +from astune.task_rollout.async_llm_bridge import AsyncLlmBridge +from astune.task_rollout.resource_keeper import ResourceKeeper +from astune.utils.logger import init_parallel_rollout_logger +from astune.utils.sample import get_sample_params +from loguru import logger +from omegaconf import DictConfig +from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner +from astune.task_runner.agentscope_runner import AgentScopeRunner +from astune.context_tracker.basic_tracker import BasicContextTracker +from astune.utils.testing_utils import GoodbyeException, TestFailException +from astune.utils.env_service_client.env_client_ng import ( + EnvClient as EnvClientNg, +) +from astune.utils.retry import retry_with_backoff + + +class BaseParallelEnv: + + def __init__( + self, + config: DictConfig, + async_rollout_manager, + max_parallel: int, + max_llm_retries: int = 3, + tokenizer: PreTrainedTokenizer = None, # type: ignore + llm_mode: Literal["local", "remote", "trinity"] = "local", + **kwargs, + ): + """Initialize common rollout state and helpers. + + Parameters + ---------- + config : DictConfig + Configuration object containing rollout and experiment settings. + async_rollout_manager : Any + Manager responsible for async LLM interactions. + max_parallel : int + Maximum number of parallel environment worker threads. + max_llm_retries : int, optional + Maximum retries for LLM calls, by default 3. + tokenizer : PreTrainedTokenizer, optional + Tokenizer used for padding and ID conversions. + llm_mode : Literal["local", "remote", "trinity"], optional + Indicates backend mode (e.g., 'local', 'remote'), default 'local'. + **kwargs : Any + Additional parameters passed through for future extensions. + """ + + init_parallel_rollout_logger(experiment_name=config.astune.experiment_name) + self.llm_mode: Literal["local", "remote", "trinity"] = llm_mode + self.config: DictConfig = config + self.async_rollout_manager = async_rollout_manager + self.max_parallel: int = max_parallel + self.max_llm_retries: int = max_llm_retries + self.rollout_n = config.astune.rollout.num_repeat + self.tokenizer = tokenizer + self.pad_token_id = self.tokenizer.pad_token_id + self.current_token = 0 + self.current_global_steps = "NA" + self.async_llm_bridge = AsyncLlmBridge( + config=config, + async_rollout_manager=async_rollout_manager, + tokenizer=tokenizer, + llm_mode=llm_mode, + max_llm_retries=max_llm_retries, + ) + + @retry_with_backoff(max_retry_attr="max_llm_retries") + def rollout_env_worker( + self, + task: Task, + task_batch_index: int, + task_tag: str, + mode: Literal["sample", "validate"], + task_thread_index: int, + obs_window: dict, + **kwargs, + ) -> BasicContextTracker: + """Execute one environment rollout worker. + + Handles environment initialization, LLM sampling parameter construction + (with validation overrides), and robust retry on transient failures. + """ + sampling_params = get_sample_params(mode, self.config) + llm_chat_fn = self.async_llm_bridge.get_llm_chat_fn(sampling_params=sampling_params) + + workflow_task = WorkflowTask( + env_type=task.env_type, + task_id=task.task_id, + task_thread_index=task_thread_index, + task_batch_index=task_batch_index, + task_env_uuid=uuid.uuid4().hex, + task_tag=task_tag, + obs_window=obs_window, + llm_chat_fn=llm_chat_fn, + tokenizer=self.tokenizer, + task=task, + ) + + with ResourceKeeper(workflow_task, config=self.config) as resource_keeper: + try: + workflow_task = resource_keeper.prepare() + Runner = AgentScopeRunner if self.config.astune.rollout.use_agentscope_protocol else AgentRunner + agent_runner: AgentScopeRunner = Runner(llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, config=self.config) # type:ignore + cmt = agent_runner.execute( + workflow_task=workflow_task, + ) + except GoodbyeException as e: + logger.success(f"env_worker.agent_flow completed with GoodbyeException: {e.args}") + raise e + except TestFailException as e: + logger.error(f"env_worker.agent_flow failed with TestFailException: {e.args}") + raise e + except Exception as e: + logger.bind(exception=True).exception( + f"encounter exception in env_worker.agent_flow error={e.args}" + ) + raise e + + return cmt diff --git a/astune/task_runner/__init__.py b/astune/task_runner/__init__.py new file mode 100644 index 00000000..e152111b --- /dev/null +++ b/astune/task_runner/__init__.py @@ -0,0 +1,41 @@ +from astune.context_tracker.basic_tracker import BasicContextTracker +from typing import Any, Dict, Tuple, Union, Callable +from astune.task_judge.judge_base import JudgeBase +from astune.utils.dynamic_import import dynamic_import +from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg + + +class BaseAgentRunner(object): + + def __init__(self, llm_chat_fn: Callable, tokenizer: Any, config, **kwargs): + self.tokenizer = tokenizer + self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") + self.response_template_ids = self.tokenizer.encode("<|im_start|>assistant\n") + self.cmt: Union[BasicContextTracker, Any, None] = None + self.alien_llm_chat_fn: Union[Callable, None] = None + self.llm_chat_fn: Callable = llm_chat_fn + self.config = config + self.max_steps: int = self.config.astune.rollout.multi_turn.max_steps + self.max_model_len: int = self.config.astune.rollout.max_model_len + self.max_env_len: int = self.config.astune.rollout.max_env_len + + def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task): + + def should_interrupt_fn() -> bool: + if (obs_window["stop"] is not None) and obs_window["stop"][ + task_thread_index + ]: # Check if the thread should stop (because other threads have completed, making this thread useless) + return True + return False + + def generated_token_callback_fn(token_array): + obs_window["token"][task_thread_index] += len(token_array) + + return { + "should_interrupt_fn": should_interrupt_fn, + "generated_token_callback_fn": generated_token_callback_fn, + } + + def get_judge(self) -> JudgeBase: + judge_protocol = self.config.astune.task_judge.judge_protocol + return dynamic_import(judge_protocol)(self.config) # type: ignore diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py new file mode 100644 index 00000000..c9b206a0 --- /dev/null +++ b/astune/task_runner/agentscope_runner.py @@ -0,0 +1,92 @@ +import threading +import importlib +import torch +import copy +import asyncio +from astune import ModelTuner, Workflow, WorkflowOutput +from astune.utils.env_service_client.env_client import EnvClient +from astune.task_runner import BaseAgentRunner +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + ExtendedMessage, + replace_token_ids, + BasicContextTracker, +) +from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracking, +) +from astune.schema.trajectory import Reward, Trajectory +from astune.schema.trajectory import Sample, Reward +from astune.schema.task import Task, WorkflowTask +from astune.utils.dynamic_import import dynamic_import +from typing import Any, Dict, List, Union, Tuple + + +class AgentScopeRunner(BaseAgentRunner): + + def execute(self, workflow_task: WorkflowTask) -> BasicContextTracker: + obs_window = workflow_task.obs_window + task_thread_index = workflow_task.task_thread_index + task_batch_index = workflow_task.task_batch_index + task_tag = workflow_task.task_tag + task_id = workflow_task.task_id + + workflow_import = self.config.astune.rollout.agentscope_learn_protocol + workflow_cls = dynamic_import(workflow_import) + agentscope_workflow: Workflow = workflow_cls(name="astune-trinity") + + hooks = self.agentscope_runner_hooks( + obs_window=obs_window, + task_thread_index=task_thread_index, + workflow_task=workflow_task, + ) + context_tracker = MultiAgentContextTracking( + llm_chat_fn=self.llm_chat_fn, + tokenizer=self.tokenizer, + config=self.config, + task_batch_index=task_batch_index, + task_tag=task_tag, + task_id=task_id, + **hooks + ) + m_tuner = ModelTuner( + context_tracker=context_tracker, + llm_chat_fn=self.llm_chat_fn, + tokenizer=self.tokenizer, + agentscope_workflow=agentscope_workflow, + config=self.config, + ) + + workflow_output: WorkflowOutput = asyncio.run( + agentscope_workflow.agentscope_execute(workflow_task, m_tuner) + ) + if workflow_output.reward is not None: + raw_reward, is_success = ( + workflow_output.reward, + workflow_output.is_success, + ) + else: + raw_reward, is_success = self.get_judge().compute_reward(workflow_task, workflow_output) + workflow_task.gym_env = None # clear gym env client reference to avoid serialization issue + + assert not isinstance( + raw_reward, list + ), "ASTune will support step reward in future versions." + + # register reward + reward = Reward( + raw_reward=raw_reward, + raw_step_reward=None, + success_rate=1.0 if is_success else 0.0, + madness=0, + description="", + ) + context_tracker.process_reward(reward) + # generate token before merging + context_tracker.remove_last_context() + context_tracker.task_id = task_id + context_tracker.task_tag = task_tag + context_tracker.group_merge() + # after merging, process and align reward again + context_tracker.process_reward(reward) + return context_tracker diff --git a/astune/workflow_controller/classic_agentflow.py b/astune/task_runner/classic_runner.py similarity index 57% rename from astune/workflow_controller/classic_agentflow.py rename to astune/task_runner/classic_runner.py index 9b3a5989..d8b941ba 100644 --- a/astune/workflow_controller/classic_agentflow.py +++ b/astune/task_runner/classic_runner.py @@ -1,48 +1,52 @@ -import time import os +import time +import threading from loguru import logger -from astune.env_service_client.env_client import EnvClient +from astune.utils.env_service_client.env_client import EnvClient from astune.utils.utils import convert_tool_to_user_message from astune.schema.trajectory import Reward -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.context_manager.agentflow_cm.cmt_linear_think import LinearThinkCMT -from astune.context_manager.agentflow_cm.cmt_context_clip import SelfContextClipCMT -from astune.context_manager.agentflow_cm.cmt_sliding_window import SlidingWindowCMT -from astune.workflow_controller.basic_agentflow import BaseAgentFlow +from astune.context_tracker.basic_tracker import ( + BasicContextTracker, + ExtendedMessage, +) +from astune.task_runner import BaseAgentRunner from typing import Any, Dict, List, Union, Callable from beast_logger import print_listofdict -import threading - -log_generate_lock = threading.Lock() - -class AgentFlow(BaseAgentFlow): +class AgentRunner(BaseAgentRunner): def __init__(self, **kwargs): super().__init__(**kwargs) - self.use_step_reward_from_env: bool = self.config.astune.rollout.get("use_step_reward_from_env", False) + self.use_step_reward_from_env: bool = self.config.astune.rollout.get( + "use_step_reward_from_env", False + ) self.step_reward = [] - - def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> CMTLinear: - obs_window = task_core_arg.obs_window - task_thread_index = task_core_arg.task_thread_index + def execute(self, workflow_task) -> BasicContextTracker: + obs_window = workflow_task.obs_window + task_thread_index = workflow_task.task_thread_index + init_messages = workflow_task.init_messages + env = workflow_task.gym_env # 1. 🚀 Initialize messages - if self.config.astune.context_manager.context_manager_type == "linear": - self.cmt = CMTLinear(self.config, self.tokenizer) - elif self.config.astune.context_manager.context_manager_type == "linear_think": - self.cmt = LinearThinkCMT(self.config, self.tokenizer) - elif self.config.astune.context_manager.context_manager_type == "context_selfclip": - self.cmt = SelfContextClipCMT(self.config, self.tokenizer, self.llm_chat_fn) - elif self.config.astune.context_manager.context_manager_type == "sliding_window": - self.cmt = SlidingWindowCMT(self.config, self.tokenizer, self.llm_chat_fn) + if self.config.astune.context_tracker.context_tracker_type == "linear": + self.cmt = BasicContextTracker(self.config, self.tokenizer) + # elif self.config.astune.context_tracker.context_tracker_type == "linear_think": + # self.cmt = LinearThinkCMT(self.config, self.tokenizer) + # elif self.config.astune.context_tracker.context_tracker_type == "context_selfclip": + # self.cmt = SelfContextClipCMT(self.config, self.tokenizer, self.llm_chat_fn) + # elif self.config.astune.context_tracker.context_tracker_type == "sliding_window": + # self.cmt = SlidingWindowCMT(self.config, self.tokenizer, self.llm_chat_fn) else: - raise ValueError(f"Unsupported context template: {self.config.astune.context_manager.context_manager_type}") + raise ValueError( + f"Unsupported context template: {self.config.astune.context_tracker.context_tracker_type}" + ) - assert not (self.config.astune.rollout.force_think and self.config.astune.rollout.force_no_think), "Cannot force both think and no_think" + assert not ( + self.config.astune.rollout.force_think and self.config.astune.rollout.force_no_think + ), "Cannot force both think and no_think" add_nothink = self.config.astune.rollout.force_no_think self.cmt.save_init_input(init_messages, add_nothink) @@ -50,8 +54,10 @@ def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> C request_id: str = "" for act_step in range(self.max_steps): # 2. 🔄 Update thread progress - obs_window['step'][task_thread_index] = act_step - if (obs_window['stop'] is not None) and obs_window['stop'][task_thread_index]: # Check if the thread should obs_window['stop'] (because other threads have completed, making this thread useless) + obs_window["step"][task_thread_index] = act_step + if (obs_window["stop"] is not None) and obs_window["stop"][ + task_thread_index + ]: # Check if the thread should obs_window['stop'] (because other threads have completed, making this thread useless) self.cmt.discarded = True break @@ -59,35 +65,48 @@ def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> C try: step_input_message_arr = self.cmt.prepare_next_llm_context() except Exception as e: - print_listofdict(self.cmt.to_role_content(self.cmt.full_context), mod='exception', header="Before Crash") + print_listofdict( + self.cmt.to_role_content(self.cmt.full_context), + mod="exception", + header="Before Crash", + ) raise e # 4. ⚠️ check token overflow is_safe, info = self.cmt.check_context_token_num_safe(step_input_message_arr) if not is_safe: - logger.warning(f"[{info}] detected at step {act_step}. Current token count exceeds the limit.") + logger.warning( + f"[{info}] detected at step {act_step}. Current token count exceeds the limit." + ) self.cmt.is_terminated = True break # 5. 🤖 call llm llm_output = self.llm_chat_fn(step_input_message_arr, request_id=request_id) - if (obs_window['stop'] is not None) and obs_window['stop'][task_thread_index]: # Check if the thread should obs_window['stop'] (because other threads have completed, making this thread useless) + if (obs_window["stop"] is not None) and obs_window["stop"][ + task_thread_index + ]: # Check if the thread should obs_window['stop'] (because other threads have completed, making this thread useless) self.cmt.discarded = True break # 6. 💾 save llm output self.cmt.save_llm_output(llm_output, input_msg_ref=step_input_message_arr) - obs_window['token'][task_thread_index] += self.cmt.generated_token_cnt + obs_window["token"][task_thread_index] += self.cmt.generated_token_cnt # 7. 🌍 world interaction try: env_output = env.step( - instance_id=task_core_arg.task_env_uuid, - action={"content": self.cmt.prepare_world_interaction(), "role": "assistant"}, - params={"step_skip_action": self.config.astune.rollout.step_skip_action} + instance_id=workflow_task.task_env_uuid, + action={ + "content": self.cmt.prepare_world_interaction(), + "role": "assistant", + }, + params={"step_skip_action": self.config.astune.rollout.step_skip_action}, ) if env_output["state"]["role"] == "tool": - env_output["state"] = convert_tool_to_user_message(env_output["state"], self.tokenizer, format="qwen") + env_output["state"] = convert_tool_to_user_message( + env_output["state"], self.tokenizer, format="qwen" + ) # if self.console_debug_mode: # if isinstance(env_output["state"], dict): # print_listofdict( @@ -107,8 +126,8 @@ def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> C # 8. 📥 save environment output state = env_output["state"] - state.pop('tool_calls', None) - self.cmt.save_env_output(state, input_msg_ref=step_input_message_arr, add_nothink=add_nothink) + state.pop("tool_calls", None) # type: ignore + self.cmt.save_env_output(state, input_msg_ref=step_input_message_arr, add_nothink=add_nothink) # type: ignore self.cmt.round_cnt += 1 if self.use_step_reward_from_env: self.step_reward += [env_output["reward"]] @@ -119,9 +138,9 @@ def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> C break self.cmt.ensure_terminate_rollout_stage() - obs_window['step'][task_thread_index] = -1 + obs_window["step"][task_thread_index] = -1 raw_reward = 0 - raw_reward = env.evaluate(task_core_arg.task_env_uuid, params={"sparse": False}) + raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) if raw_reward >= 1: success_rate = 1.0 else: @@ -135,22 +154,22 @@ def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg) -> C if self.config.astune.rollout.binary_reward: raw_reward = success_rate self.cmt.process_reward( - reward_structure = Reward( + reward_structure=Reward( raw_reward=raw_reward, raw_step_reward=None, success_rate=success_rate, madness=0, - description="Success=1, Failure=0" + description="Success=1, Failure=0", ) ) else: self.cmt.process_reward( - reward_structure = Reward( + reward_structure=Reward( raw_reward=raw_reward, raw_step_reward=self.step_reward, success_rate=success_rate, madness=0, - description="Step Reward from Environment" + description="Step Reward from Environment", ) ) diff --git a/astune/tuner.py b/astune/tuner.py new file mode 100644 index 00000000..b3922bf6 --- /dev/null +++ b/astune/tuner.py @@ -0,0 +1,189 @@ +from loguru import logger +from typing import Literal, Any, TYPE_CHECKING, Type +from pydantic import BaseModel, Field +from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope +from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracking, +) +from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel +from agentscope._utils._common import ( + _json_loads_with_repair, + _create_tool_from_base_model, +) + +if TYPE_CHECKING: + from astune import Workflow + + +class Agent2Proxy(DashScopeChatModel): + """ + Handler for **NAMED** agent trainning targets. + It stores the target name, and a reference to the ModelTuner. + When request comes, it switches between default model (dashscope or openai models) and ModelTuner + """ + + def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase): + self.name = name + self.tuner = tuner + self.default_model = default_model + super().__init__( + model_name="astune", + api_key="dummy-api-key", + stream=False, + ) + + def __call__(self, *args, **kwargs): + if self.tuner.is_trainable(self.name): + # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, + # and self.name is not in it, use default model + return self.default_model(*args, **kwargs) + else: + # [TRAIN] + return self.tuner(*args, **kwargs) + + +class ModelTuner(DashScopeChatModel): + """ + ModelTuner for Agentscope workflow. + It keeps record of all registered agent types (by their target names), + And when request comes, it calls `self.llm_proxy` to handle the request. + """ + + def __init__( + self, + config, + context_tracker: MultiAgentContextTracking, + agentscope_workflow: "Workflow", + **kwargs, + ) -> None: + self.config = config + self.context_tracker = context_tracker + self.agentscope_workflow = agentscope_workflow + self.target2proxy_registry: dict[str, Agent2Proxy] = {} + self.llm_proxy = LlmProxyForAgentScope( + context_tracker=context_tracker, config=config, **kwargs + ) + super().__init__( + model_name="astune", + api_key="dummy-api-key", + stream=False, + ) + + def register_model(self, target_name: str, default_model: ChatModelBase) -> Agent2Proxy: + """Register an agent type. + Args: + target_name (`str`): + The name to register the agent type under. + default_model (`ChatModelBase`): + The model to use when you are NOT training this agent type. + Returns: + Agent2Proxy: + The agent type instance corresponding to the provided name. + """ + if target_name in self.target2proxy_registry: + logger.warning( + f"Agent proxy `{target_name}` is already registered. Overwriting `default_model`." + ) + self.target2proxy_registry[target_name] = Agent2Proxy(target_name, self, default_model) + return self.get_model(target_name) + + def get_model(self, target_name: str) -> Agent2Proxy: + """Get the proxy instance by target_name. + Args: + target_name (`str`): + The name of the agent proxy to retrieve. + Returns: + Agent2Proxy: + The agent proxy corresponding to the provided target_name. + """ + if target_name not in self.target2proxy_registry: + raise ValueError(f"Agent proxy '{target_name}' is not registered.") + else: + return self.target2proxy_registry[target_name] + + async def __call__( + self, + messages: list[dict[str, Any]], + tools: list[dict] | None = None, + tool_choice: Literal["auto", "none", "any", "required"] | str | None = None, + structured_model: Type[BaseModel] | None = None, + **kwargs: Any, + ) -> ChatResponse: + + # For qvq and qwen-vl models, the content field cannot be `None` or + # `[{"text": None}]`, so we need to convert it to an empty list. + if self.model_name.startswith("qvq") or "-vl" in self.model_name: + raise NotImplementedError("Not implemented for qvq and qwen-vl models yet.") + + kwargs = { + "messages": messages, + "model": self.model_name, + "stream": self.stream, + **self.generate_kwargs, + **kwargs, + "result_format": "message", + # In agentscope, the `incremental_output` must be `True` when + # `self.stream` is True + "incremental_output": self.stream, + } + + if tools: + kwargs["tools"] = self._format_tools_json_schemas(tools) + + if tool_choice: + self._validate_tool_choice(tool_choice, tools) + kwargs["tool_choice"] = self._format_tool_choice(tool_choice) + + if self.enable_thinking is not None and "enable_thinking" not in kwargs: + kwargs["enable_thinking"] = self.enable_thinking + + if structured_model: + if tools or tool_choice: + logger.warning( + "structured_model is provided. Both 'tools' and " + "'tool_choice' parameters will be overridden and " + "ignored. The model will only perform structured output " + "generation without calling any other tools.", + ) + format_tool = _create_tool_from_base_model(structured_model) + kwargs["tools"] = self._format_tools_json_schemas( + [format_tool], + ) + kwargs["tool_choice"] = self._format_tool_choice( + format_tool["function"]["name"], + ) + + # call llm model ✨ + response_gen = await self.llm_proxy( + api_key=self.api_key, + structured_model=structured_model, + **kwargs, + ) + + # Return the AsyncGenerator directly + return response_gen + + def is_trainable(self, target_name) -> bool: + if not self.agentscope_workflow.trainable_targets: + # always assume trainable when user has never changed trainable_targets + return True + if target_name in self.agentscope_workflow.trainable_targets: + return True + else: + return False + + def get_llm_proxy(self) -> LlmProxyForAgentScope: + """Get the LlmProxyForAgentScope instance. + Returns: + LlmProxyForAgentScope: + The LlmProxyForAgentScope instance used by the ModelTuner. + """ + return self.llm_proxy + + def get_context_tracker(self) -> MultiAgentContextTracking: + """Get the context tracker instance. + Returns: + LlmProxyForAgentScope: + The context tracker instance used by the ModelTuner. + """ + return self.context_tracker diff --git a/astune/utils/analysis_time_cost.py b/astune/utils/analysis_time_cost.py index 0db25fdc..69e4d172 100644 --- a/astune/utils/analysis_time_cost.py +++ b/astune/utils/analysis_time_cost.py @@ -36,15 +36,19 @@ def time_cost_analysis(file_path: str): for k, v in sorted(result_time.items(), key=lambda x: x[0]): len_list = result_len[k] - print(f"act_step={k} time_cost={sum(v) / len(v):.2f} " - f"count={len(v)} " - f"len={sum(len_list) / len(len_list):.2f} " - f"efficient={sum(v) * 1000 / sum(len_list):.2f}") - - print(f"time_cost={sum(all_time) / len(all_time):.2f} " - f"count={len(all_time)} " - f"len={sum(all_len) / len(all_len):.2f} " - f"efficient={sum(all_time) * 1000 / sum(all_len):.2f}") + print( + f"act_step={k} time_cost={sum(v) / len(v):.2f} " + f"count={len(v)} " + f"len={sum(len_list) / len(len_list):.2f} " + f"efficient={sum(v) * 1000 / sum(len_list):.2f}" + ) + + print( + f"time_cost={sum(all_time) / len(all_time):.2f} " + f"count={len(all_time)} " + f"len={sum(all_len) / len(all_len):.2f} " + f"efficient={sum(all_time) * 1000 / sum(all_len):.2f}" + ) if __name__ == "__main__": diff --git a/astune/utils/async_http_client.py b/astune/utils/async_http_client.py index 3b1eaa01..e480e844 100644 --- a/astune/utils/async_http_client.py +++ b/astune/utils/async_http_client.py @@ -9,7 +9,10 @@ class AsyncHttpClient(BaseModel): url: str = Field(default="") - keep_alive: bool = Field(default=False, description="if true, use session to keep long connection") + keep_alive: bool = Field( + default=False, + description="if true, use session to keep long connection", + ) timeout: int = Field(default=300, description="request timeout, second") return_default_if_error: bool = Field(default=True) @@ -45,27 +48,40 @@ def return_default(self, **kwargs) -> Any: return None async def request( - self, - data: str | Any = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs, + self, + data: str | Any = None, + json_data: dict = None, + headers: dict = None, + http_enum: str = "post", + **kwargs, ) -> Any: retry_sleep_time = self.retry_sleep_time method = http_enum for i in range(self.retry_max_count): try: - response = await self._client.request(method=method, url=self.url, data=data, json=json_data, - headers=headers) - - result = self.parse_result(response=response, data=data, json_data=json_data, headers=headers, - http_enum=http_enum, **kwargs) + response = await self._client.request( + method=method, + url=self.url, + data=data, + json=json_data, + headers=headers, + ) + + result = self.parse_result( + response=response, + data=data, + json_data=json_data, + headers=headers, + http_enum=http_enum, + **kwargs, + ) return result except Exception as e: - logger.exception(f"{self.__class__.__name__} {i}th request failed with args={e.args}") + logger.exception( + f"{self.__class__.__name__} {i}th request failed with args={e.args}" + ) if i == self.retry_max_count - 1: if self.return_default_if_error: diff --git a/astune/utils/cleaner.py b/astune/utils/cleaner.py index 815f0977..4c1ae7cf 100644 --- a/astune/utils/cleaner.py +++ b/astune/utils/cleaner.py @@ -1,4 +1,3 @@ - import subprocess import argparse import shutil @@ -7,7 +6,10 @@ import os import shlex -def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grace_seconds: float = 1.0): + +def fast_kill_by_keyword_bash( + keyword: str, exclude_substrings=["vscode"], grace_seconds: float = 1.0 +): """Use bash pipelines to kill processes matching keyword quickly. - Filters out processes containing any exclude_substrings @@ -26,7 +28,12 @@ def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grac ) try: - res = subprocess.run(["bash", "-lc", pid_list_cmd], capture_output=True, text=True, check=False) + res = subprocess.run( + ["bash", "-lc", pid_list_cmd], + capture_output=True, + text=True, + check=False, + ) pids = [pid for pid in res.stdout.split() if pid.isdigit()] except Exception as e: print(f"Failed to list PIDs via bash: {e}") @@ -39,7 +46,12 @@ def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grac f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" ) try: - res2 = subprocess.run(["bash", "-lc", ps_pid_cmd], capture_output=True, text=True, check=False) + res2 = subprocess.run( + ["bash", "-lc", ps_pid_cmd], + capture_output=True, + text=True, + check=False, + ) pids = [pid for pid in res2.stdout.split() if pid.isdigit()] except Exception as e: print(f"Failed to list PIDs via ps/grep: {e}") @@ -51,11 +63,17 @@ def _fast_kill_by_keyword_bash(keyword: str, exclude_substrings=["vscode"], grac pid_args = " ".join(pids) try: # Send TERM to all in one call - subprocess.run(["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], check=False) + subprocess.run( + ["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], + check=False, + ) time.sleep(grace_seconds) # Escalate with KILL once; ignore failures for already-exited PIDs - subprocess.run(["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], check=False) + subprocess.run( + ["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], + check=False, + ) except Exception as e: print(f"Error issuing kill commands: {e}") - return [int(p) for p in pids] \ No newline at end of file + return [int(p) for p in pids] diff --git a/astune/utils/color_hsl.py b/astune/utils/color_hsl.py index 0e1f20d7..7f088e92 100644 --- a/astune/utils/color_hsl.py +++ b/astune/utils/color_hsl.py @@ -1,5 +1,6 @@ import colorsys + def adjust_color_hsl(base_color, logprob): """ 使用HSL颜色空间根据logprob调整颜色饱和度 diff --git a/astune/utils/compute_madness.py b/astune/utils/compute_madness.py index 9bc22681..96f321ba 100644 --- a/astune/utils/compute_madness.py +++ b/astune/utils/compute_madness.py @@ -1,56 +1,58 @@ import re from functools import cache -# 各白名单类别对应正则片段 +# Regex fragments for each whitelist category WHITE_LIST_REGEX_PARTS = { - # 常见符号 - 'common_symbols': '‘’“”–—…•™©®°±µ′″℉℃·×', - # 中文标点 - 'chinese_punct': ',。!?、;:“”‘’()【】《》()——……「」『』', - # emoji 范围 - 'emoji': ( - '\U0001F300-\U0001F5FF' - '\U0001F600-\U0001F64F' - '\U0001F680-\U0001F6FF' - '\U0001F700-\U0001F77F' - '\U0001F780-\U0001F7FF' - '\U0001F800-\U0001F8FF' - '\U0001F900-\U0001F9FF' - '\U0001FA00-\U0001FA6F' - '\U0001FA70-\U0001FAFF' - '\u2702-\u27B0' - '\u24C2-\U0001F251' + # Common symbols + "common_symbols": "‘’“”–—…•™©®°±µ′″℉℃·×", + # Chinese punctuation + "chinese_punct": ",。!?、;:“”‘’()【】《》()——……「」『』", + # Emoji ranges + "emoji": ( + "\U0001F300-\U0001F5FF" + "\U0001F600-\U0001F64F" + "\U0001F680-\U0001F6FF" + "\U0001F700-\U0001F77F" + "\U0001F780-\U0001F7FF" + "\U0001F800-\U0001F8FF" + "\U0001F900-\U0001F9FF" + "\U0001FA00-\U0001FA6F" + "\U0001FA70-\U0001FAFF" + "\u2702-\u27B0" + "\u24C2-\U0001F251" ), - # 中文字符 - 'chinese': ( - '\u4E00-\u9FFF' - '\u3400-\u4DBF' - '\U00020000-\U0002A6DF' - '\U0002A700-\U0002B73F' - '\U0002B740-\U0002B81F' - '\U0002B820-\U0002CEAF' - '\uF900-\uFAFF' - '\U0002F800-\U0002FA1F' + # Chinese characters + "chinese": ( + "\u4E00-\u9FFF" + "\u3400-\u4DBF" + "\U00020000-\U0002A6DF" + "\U0002A700-\U0002B73F" + "\U0002B740-\U0002B81F" + "\U0002B820-\U0002CEAF" + "\uF900-\uFAFF" + "\U0002F800-\U0002FA1F" ), } @cache def build_pattern(white_list): - """根据白名单类别构造正则""" - allowed_parts = ['\x00-\x7F'] # 所有 ASCII + """Build a regex based on the provided whitelist categories.""" + allowed_parts = ["\x00-\x7F"] # All ASCII for name in white_list: if name in WHITE_LIST_REGEX_PARTS: allowed_parts.append(WHITE_LIST_REGEX_PARTS[name]) - # 把允许的范围合并为一个字符类,并用反向类匹配“不被允许的字符” - allowed_class = ''.join(allowed_parts) - pattern = f'[^{allowed_class}]' # 匹配 不允许 的字符 + # Merge allowed ranges into one character class, then use a negated class to match disallowed characters + allowed_class = "".join(allowed_parts) + pattern = f'[^{allowed_class}]' # Match disallowed characters return re.compile(pattern) -def has_non_ascii(text, white_list=('common_symbols', 'emoji', 'chinese', 'chinese_punct')): + +def has_non_ascii(text, white_list=("common_symbols", "emoji", "chinese", "chinese_punct")): pattern = build_pattern(white_list) return bool(pattern.search(text)) + def has_repeat(token, remember_n_words=5, patience_max=10): record_words = [] patience = patience_max @@ -66,19 +68,19 @@ def has_repeat(token, remember_n_words=5, patience_max=10): return True return False -def compute_string_madness(completion, detail=False, checklist=['nonsense'])->float: + +def compute_string_madness(completion, detail=False, checklist=["nonsense"]) -> float: all_reward = 0.0 - if ('nonsense' in checklist) and ('non_ascii' in checklist): + if ("nonsense" in checklist) and ("non_ascii" in checklist): all_reward += compute_string_madness_char(completion, detail=detail) - elif ('nonsense' in checklist) and ('non_ascii' not in checklist): + elif ("nonsense" in checklist) and ("non_ascii" not in checklist): all_reward += compute_string_madness_char(completion, detail=detail, skip_non_ascii=True) - if "format_type_1" in checklist: all_reward += compute_string_madness_format(completion, detail=detail, format_type="type_1") return all_reward -def compute_string_madness_format(completion, format_type)->float: +def compute_string_madness_format(completion, detail, format_type)->float: if format_type == "type_1": """ @@ -89,7 +91,7 @@ def compute_string_madness_format(completion, format_type)->float: ``` """ - # 检查 标签是否成对出现,且只出现一次 + # Check that and appear exactly once and in order if not completion.strip().startswith(r""): # print("not start with ") return -1.0 @@ -100,9 +102,11 @@ def compute_string_madness_format(completion, format_type)->float: # print("think tag order wrong") return -1.0 # remove think part - think_part = completion[completion.index(r""):completion.index(r"")+len(r"")] + think_part = completion[ + completion.index(r"") : completion.index(r"") + len(r"") + ] rest_part = completion.replace(think_part, "") - # 检查 ```python 和 ``` 是否成对出现,且只出现一次 + # Check that ```python and ``` appear exactly once and in order if not rest_part.strip().startswith(r"```python"): # print("not start with ```python") return -1.0 @@ -120,14 +124,14 @@ def compute_string_madness_format(completion, format_type)->float: raise NotImplementedError(f"format_type {format_type} not implemented") -def compute_string_madness_char(completion, detail=False, skip_non_ascii=False)->float: +def compute_string_madness_char(completion, detail=False, skip_non_ascii=False) -> float: if detail: result = { - 'has_non_ascii': has_non_ascii(completion), - 'has_repeat': has_repeat(completion.split(), remember_n_words=5, patience_max=10), - 'has_repeat_x': has_repeat(completion, remember_n_words=4, patience_max=200), - 'has_wrong_sp_token': '<|im_start|>' in completion, + "has_non_ascii": has_non_ascii(completion), + "has_repeat": has_repeat(completion.split(), remember_n_words=5, patience_max=10), + "has_repeat_x": has_repeat(completion, remember_n_words=4, patience_max=200), + "has_wrong_sp_token": "<|im_start|>" in completion, # 'non_ascii': {ch for ch in completion if ord(ch) > 127} } if has_non_ascii(completion): @@ -138,7 +142,7 @@ def compute_string_madness_char(completion, detail=False, skip_non_ascii=False)- print(result) return result - if '<|im_start|>' in completion: + if "<|im_start|>" in completion: return -1.0 if skip_non_ascii: @@ -153,6 +157,7 @@ def compute_string_madness_char(completion, detail=False, skip_non_ascii=False)- return 0 + def repetition_penalty_reward_scalar_debug(completion): for i in range(len(completion)): p = completion[:i] @@ -161,8 +166,9 @@ def repetition_penalty_reward_scalar_debug(completion): return completion return "" + if __name__ == "__main__": - # 测试示例 + # Test examples # print(compute_string_madness("Hello world!")) # 0 # print(compute_string_madness("Hello world! 😄")) # 0 # print(compute_string_madness("Hello world! Hello world!")) # -1.0 @@ -338,7 +344,7 @@ def has_non_ascii(text): movie_titles.append(line.strip()) print(movie_titles) ```<|im_end|> - """, detail=True) == -1 # too many `line.startswith` + """) == -1 # too many `line.startswith` # part 2 assert compute_string_madness_format( @@ -350,6 +356,7 @@ def has_non_ascii(text): print(login_result) ``` """, + detail=False, format_type="type_1" ) == 0.0 @@ -366,6 +373,7 @@ def has_non_ascii(text): print(profile) ``` """, + detail=False, format_type="type_1" ) == -1.0 @@ -399,6 +407,7 @@ def has_non_ascii(text): {12, 14, 8, 36, 23, 25, 28, 33, 2, 9, 11, 18} ``` """, + detail=False, format_type="type_1" ) == -1.0 diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index b204f7dd..b25ee429 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -1,9 +1,18 @@ import os +import shutil +import time +import yaml +from loguru import logger from hydra import initialize, compose from omegaconf import DictConfig +from best_logger import print_dict + def read_astune_config(yaml_fp): - yaml_fp = os.path.relpath(yaml_fp, os.path.dirname(__file__)) # do not try to understand this line, hydra is too weird + """Load a Hydra configuration relative to this module.""" + yaml_fp = os.path.relpath( + yaml_fp, os.path.dirname(__file__) + ) # do not try to understand this line, hydra is too weird def load_hydra_config(config_path: str, config_name: str) -> DictConfig: with initialize(config_path=config_path, version_base=None): @@ -14,8 +23,226 @@ def load_hydra_config(config_path: str, config_name: str) -> DictConfig: file_name = os.path.basename(yaml_fp) return load_hydra_config(config_path=dir_path, config_name=file_name) + + def dump_yaml_config(cfg: DictConfig, yaml_fp: str): + """Persist the provided OmegaConf config to ``yaml_fp``.""" from omegaconf import OmegaConf - with open(yaml_fp, 'w') as f: + + with open(yaml_fp, "w") as f: OmegaConf.save(cfg, f) - return yaml_fp \ No newline at end of file + return yaml_fp + + + + +def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone): + """Align configuration values based on a conversion map. + + Parameters + ---------- + from_config_fp : str + Source YAML path to read values from. + to_config_fp : str + Destination YAML path that is updated in place. + convertion_json_fg : str + JSON path mapping dotted keys between configs. + backbone : str + Backbone identifier used for framework-specific alignment. + """ + # read yaml files + with open(from_config_fp, "r") as file: + from_config = yaml.safe_load(file) + with open(to_config_fp, "r") as file: + to_config = yaml.safe_load(file) + + # read convertion json + import json + + with open(convertion_json_fg, "r") as file: + convertion_json = json.load(file) + + logger.success("----------------------------------------------------") + + if ("trinity" in from_config) and backbone == "trinity": + trinity_config = from_config["trinity"] + + def recursive_copy(src_dict, dst_dict, parent_key=""): + for key, value in src_dict.items(): + full_key = f"{parent_key}.{key}" if parent_key else key + if isinstance(value, dict): + if key not in dst_dict: + dst_dict[key] = {} + recursive_copy(value, dst_dict[key], full_key) + else: + dst_dict[key] = value + logger.info( + f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]" + ) + + recursive_copy(trinity_config, to_config) + + logger.success("----------------------------------------------------") + time.sleep(1) + + for from_key, to_keys in convertion_json.items(): + # get value from from_config + keys = from_key.split(".") + value = from_config + for key in keys: + value = value.get(key, None) + if value is None: + break + if value is None: + logger.warning( + f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_keys}" + ) + continue + + to_keys = to_keys if isinstance(to_keys, list) else [to_keys] + for to_key in to_keys: + keys = to_key.split(".") + sub_config = to_config + for key in keys[:-1]: + if key not in sub_config: + sub_config[key] = {} + sub_config = sub_config[key] + sub_config[keys[-1]] = value + logger.success( + f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]" + ) + + logger.success("----------------------------------------------------") + time.sleep(1) + + # save to_config_fp + with open(to_config_fp, "w") as file: + yaml.dump(to_config, file) + # logger.success(f"Saved aligned configuration to {to_config_fp}") + print_dict({ + "Note": f"Saved aligned configuration to {to_config_fp}" + }) + + +def read_astune_hierarchical_config(yaml_fp, exp_name, backbone, write_to=None): + with open(yaml_fp, "r") as file: + config = yaml.safe_load(file) + config["astune"]["experiment_name"] = exp_name + config["astune"]["backbone"] = backbone + # remove extra config of verl for trinity + if backbone == "debug": + config["defaults"].remove("ppo_trainer") + config["defaults"].remove("trinity_default") + config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") + config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") + # remove extra config of verl for trinity + if backbone == "trinity": + config["defaults"].remove("ppo_trainer") + config["defaults"].remove("verl_default") + config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") + config["hydra"]["searchpath"].remove("file://astune/default_config/verl") + # remove extra config of trinity for verl + if backbone == "verl": # or args.backbone == "debug" + config["defaults"].remove("trinity_default") + config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") + if write_to: + with open(write_to, "w") as file: + yaml.dump(config, file) + return config + +def expand_astune_hierarchical_config(config, write_to=None): + # create temp yaml file + import tempfile + with tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".yaml") as temp_yaml: + yaml_path = temp_yaml.name + with open(yaml_path, "w") as file: + yaml.dump(config, file) + full_config = read_astune_config(yaml_path) + yaml_path = dump_yaml_config(full_config, yaml_fp=yaml_path) + # put inherit info back + with open(yaml_path, "r") as file: + config_final = yaml.safe_load(file) + config_final["defaults"] = config["defaults"] + config_final["hydra"] = config["hydra"] + + if write_to: + with open(write_to, "w") as file: + yaml.dump(config_final, file) + + return config_final + + + +def prepare_experiment_config(yaml_path, exp_dir, backbone): + """ + Prepare experiment configuration by reading YAML, setting up backup directories, + and copying necessary files for the experiment. + + Args: + yaml_path: Path to the YAML configuration file + exp_dir: Directory where experiment artifacts and backups should be stored + backbone: Backbone identifier that controls config munging + + Returns: + tuple: (yaml_backup_dst, exe_exp_base, exp_name, config_final) + """ + assert yaml_path.endswith(".yaml"), "Configuration file must be a YAML file" + exp_base = os.path.dirname(yaml_path) + + if not os.path.exists(exp_base): + raise FileNotFoundError(f"Configuration file not found: {exp_base}") + + ## 0. read yaml & get experiment_name + with open(yaml_path, "r") as file: + config = yaml.safe_load(file) + exp_name = config.get("astune").get("experiment_name") + if exp_name is None or exp_name == "read_yaml_name": + if exp_name is not None: + exp_name = exp_name.replace("|", "-") + exp_name = os.path.basename(yaml_path).replace(".yaml", "") + else: + exp_name = exp_name.replace("|", "-") + + backup_dir = os.path.join(exp_dir, exp_name, "backup") + yaml_backup_dst = os.path.join(exp_dir, exp_name, "yaml_backup.yaml") + exe_exp_base = os.path.dirname(yaml_backup_dst) + logger.info("----------------------------------------") + logger.info(f"Experiment Name: {exp_name}") + logger.info(f"Experiment Backup Dir: {backup_dir}") + logger.info(f"Experiment Yaml Dir: {yaml_backup_dst}") + logger.info("----------------------------------------") + + ## 1. check exp_base/backup exist + if not os.path.exists(backup_dir): + os.makedirs(backup_dir) + else: + total_seconds = 5 + for i in range(total_seconds): + logger.warning( + f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." + ) + time.sleep(1) + + ## 2. copy files to backup + BACK_TARGETS = os.environ.get("BACK_TARGETS", "").split(",") + BACK_TARGETS = [p for p in BACK_TARGETS if os.path.exists(p)] + + for backup_target in BACK_TARGETS: + logger.info( + f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}" + ) + shutil.copytree( + backup_target, + os.path.join(backup_dir, os.path.basename(backup_target)), + dirs_exist_ok=True, + ) + + ## 3. copy yaml to backup + yaml_backup_src = yaml_path + shutil.copyfile(yaml_backup_src, yaml_backup_dst) + + ## 4. edit new yaml + config = read_astune_hierarchical_config(yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst) + config_final = expand_astune_hierarchical_config(config, write_to=yaml_backup_dst) + + return yaml_backup_dst, exe_exp_base, exp_name, config_final diff --git a/astune/utils/dynamic_import.py b/astune/utils/dynamic_import.py new file mode 100644 index 00000000..63ae8cd7 --- /dev/null +++ b/astune/utils/dynamic_import.py @@ -0,0 +1,7 @@ +import importlib + + +def dynamic_import(module_class_str: str): + module_, class_ = module_class_str.split("->") + protocol_cls = getattr(importlib.import_module(module_), class_) + return protocol_cls diff --git a/astune/context_manager/agentflow_cm/cmt_memory.py b/astune/utils/env_service_client/__init__.py similarity index 100% rename from astune/context_manager/agentflow_cm/cmt_memory.py rename to astune/utils/env_service_client/__init__.py diff --git a/astune/env_service_client/em_client.py b/astune/utils/env_service_client/em_client.py similarity index 78% rename from astune/env_service_client/em_client.py rename to astune/utils/env_service_client/em_client.py index a6898449..eb3c2120 100644 --- a/astune/env_service_client/em_client.py +++ b/astune/utils/env_service_client/em_client.py @@ -11,17 +11,22 @@ class EMClient(HttpClient): base_url: str = Field(default="http://localhost:8001") - timeout: int = Field(default=1200 , description="request timeout, second") - - def call_context_generator(self, trajectory: Trajectory, retrieve_top_k: int = 1, workspace_id: str = "default", - **kwargs) -> str: + timeout: int = Field(default=1200, description="request timeout, second") + + def call_context_generator( + self, + trajectory: Trajectory, + retrieve_top_k: int = 1, + workspace_id: str = "default", + **kwargs + ) -> str: start_time = time.time() self.url = self.base_url + "/context_generator" json_data = { "trajectory": trajectory.model_dump(), "retrieve_top_k": retrieve_top_k, "workspace_id": workspace_id, - "metadata": kwargs + "metadata": kwargs, } response = self.request(json_data=json_data, headers={"Content-Type": "application/json"}) if response is None: @@ -40,14 +45,16 @@ def func(): return await loop.run_in_executor(executor=executor, func=func) - def call_summarizer(self, trajectories: List[Trajectory], workspace_id: str = "default", **kwargs): + def call_summarizer( + self, trajectories: List[Trajectory], workspace_id: str = "default", **kwargs + ): start_time = time.time() self.url = self.base_url + "/summarizer" json_data = { "trajectories": [x.model_dump() for x in trajectories], "workspace_id": workspace_id, - "metadata": kwargs + "metadata": kwargs, } response = self.request(json_data=json_data, headers={"Content-Type": "application/json"}) if response is None: @@ -69,22 +76,17 @@ def main(): client = EMClient() traj = Trajectory( steps=[ - { - "role": "user", - "content": "What is the capital of France?" - }, - { - "role": "assistant", - "content": "Paris" - } + {"role": "user", "content": "What is the capital of France?"}, + {"role": "assistant", "content": "Paris"}, ], query="What is the capital of France?", - reward=Reward(outcome=1.0) + reward=Reward(outcome=1.0), ) workspace_id = "w_agent_enhanced" print(client.call_summarizer(trajectories=[traj], workspace_id=workspace_id)) print(client.call_context_generator(traj, retrieve_top_k=3, workspace_id=workspace_id)) + if __name__ == "__main__": main() diff --git a/astune/env_service_client/env_client.py b/astune/utils/env_service_client/env_client.py similarity index 89% rename from astune/env_service_client/env_client.py rename to astune/utils/env_service_client/env_client.py index 656acc62..56656537 100644 --- a/astune/env_service_client/env_client.py +++ b/astune/utils/env_service_client/env_client.py @@ -46,9 +46,7 @@ def get_task_ids( ) return response["data"] - def get_tools_info( - self, instance_id: str, messages: Dict = {}, params: Dict = {} - ) -> float: + def get_tools_info(self, instance_id: str, messages: Dict = {}, params: Dict = {}) -> float: """获取环境信息""" response = self._make_request( endpoint="get_info", @@ -59,7 +57,11 @@ def get_tools_info( return response["data"] def create_instance( - self, env_type: str, task_id: str, instance_id: str = None, params: Dict = None + self, + env_type: str, + task_id: str, + instance_id: str = None, + params: Dict = None, ) -> dict: """创建环境实例""" response = self._make_request( @@ -74,13 +76,14 @@ def create_instance( def step(self, instance_id: str, action: Dict = {}, params: Dict = {}) -> dict: """执行环境步骤""" response = self._make_request( - endpoint="step", instance_id=instance_id, messages=action, params=params + endpoint="step", + instance_id=instance_id, + messages=action, + params=params, ) return response["data"] - def evaluate( - self, instance_id: str, messages: Dict = {}, params: Dict = {} - ) -> float: + def evaluate(self, instance_id: str, messages: Dict = {}, params: Dict = {}) -> float: """评估环境实例""" response = self._make_request( endpoint="evaluate", diff --git a/astune/env_service_client/env_client_ng.py b/astune/utils/env_service_client/env_client_ng.py similarity index 77% rename from astune/env_service_client/env_client_ng.py rename to astune/utils/env_service_client/env_client_ng.py index c4e456f8..e53dc3ac 100644 --- a/astune/env_service_client/env_client_ng.py +++ b/astune/utils/env_service_client/env_client_ng.py @@ -7,7 +7,9 @@ import os from datetime import datetime -LOG_PATH = os.environ.get('CLIENT_LOG_PATH', "/mnt/data/eric.czq/rl_log/error.out") +LOG_PATH = os.environ.get("CLIENT_LOG_PATH", "/mnt/data/eric.czq/rl_log/error.out") + + # map_env_type = { # 'appworld2': 'appworld', # } @@ -21,6 +23,7 @@ def safe_log(msg: str): except Exception: pass # 防止日志写失败影响RL主进程 + def retry_call( fn: Callable, max_retry: int = 3, @@ -29,29 +32,36 @@ def retry_call( fail_return: Any = None, err_prefix: str = "", instance_id: str = "", - action_name: str = "" + action_name: str = "", ): last_exception = None for i in range(max_retry): try: res = fn() - if i>0: - safe_log(f"{err_prefix} {action_name} [instance={instance_id}] succeed at try {i+1}/{max_retry}") + if i > 0: + safe_log( + f"{err_prefix} {action_name} [instance={instance_id}] succeed at try {i+1}/{max_retry}" + ) return res except Exception as e: last_exception = e - safe_log(f"{err_prefix} {action_name} [instance={instance_id}] retry {i+1}/{max_retry} failed: {e}") + safe_log( + f"{err_prefix} {action_name} [instance={instance_id}] retry {i+1}/{max_retry} failed: {e}" + ) if i + 1 == max_retry: - safe_log(f"{err_prefix} {action_name} [instance={instance_id}] max retries exceeded, fallback used.") + safe_log( + f"{err_prefix} {action_name} [instance={instance_id}] max retries exceeded, fallback used." + ) return fail_return wait = random.uniform(min_backoff, max_backoff) time.sleep(wait) return fail_return + class EnvClient: def __init__(self, base_url: str = "http://localhost:8000"): self.base_url = base_url.rstrip("/") - self.timeout = 150.0+random.uniform(50, 200) + self.timeout = 150.0 + random.uniform(50, 200) def _make_request( self, @@ -80,16 +90,14 @@ def _make_request( safe_log( f"[{endpoint}] _make_request failed (instance={instance_id}): {e}, data: {data}" ) - raise Exception( - f"Request failed: {str(e)}, data: {data}" - ) + raise Exception(f"Request failed: {str(e)}, data: {data}") def get_env_profile( self, env_type: str, split: str = "train", params: Optional[dict] = None, - max_retry: int = 3 + max_retry: int = 3, ) -> List[str]: def call(): # 使用新的变量名,避免修改外部参数 @@ -111,11 +119,15 @@ def call(): max_retry=max_retry, fail_return=[], err_prefix="[get_env_profile]", - action_name="get_env_profile" + action_name="get_env_profile", ) def get_tools_info( - self, instance_id: str, messages: Dict = {}, params: Dict = {}, max_retry: int = 3 + self, + instance_id: str, + messages: Dict = {}, + params: Dict = {}, + max_retry: int = 3, ) -> Any: def call(): response = self._make_request( @@ -125,13 +137,14 @@ def call(): params=params, ) return response.get("data", None) + return retry_call( call, max_retry=max_retry, fail_return=None, err_prefix=f"[get_tools_info]", instance_id=instance_id, - action_name="get_tools_info" + action_name="get_tools_info", ) def create_instance( @@ -140,15 +153,27 @@ def create_instance( task_id: str, instance_id: Optional[str] = None, params: Optional[Dict] = None, - max_retry: int = 3 + max_retry: int = 3, ) -> dict: fallback = { - "state": [{"role": "system", "content": "create query failed, this is a empty task."}, - {"role": "user", "content": "create failed, this is a empty task,please close this task."}], + "state": [ + { + "role": "system", + "content": "create query failed, this is a empty task.", + }, + { + "role": "user", + "content": "create failed, this is a empty task,please close this task.", + }, + ], "reward": 0, "is_terminated": False, - "info": {"instance_id": instance_id or "", "task_id": task_id or ""}, + "info": { + "instance_id": instance_id or "", + "task_id": task_id or "", + }, } + def call(): # if env_type in map_env_type: env_type = map_env_type[env_type] r = self._make_request( @@ -159,13 +184,14 @@ def call(): params=params, ) return r["data"] + return retry_call( call, max_retry=max_retry, fail_return=fallback, err_prefix=f"[create_instance]", instance_id=instance_id, - action_name="create_instance" + action_name="create_instance", ) def step( @@ -176,28 +202,35 @@ def step( max_retry: int = 3, ) -> dict: fallback = { - "state": [{"role": "assistant", "content": "Step failed (timeout or exception),please retry"}], + "state": [ + { + "role": "assistant", + "content": "Step failed (timeout or exception),please retry", + } + ], "reward": 0, "is_terminated": False, "info": {"instance_id": instance_id or "", "task_id": ""}, } + def call(): resp = self._make_request( endpoint="step", instance_id=instance_id, messages=action, - params=params + params=params, ) return resp["data"] + res = retry_call( call, max_retry=max_retry, fail_return=fallback, err_prefix=f"[step]", instance_id=instance_id, - action_name="step" + action_name="step", ) - res['state'] = res['state'][0] + res["state"] = res["state"][0] return res def evaluate( @@ -215,41 +248,44 @@ def call(): params=params, ) return resp.get("data", 0.0) + return retry_call( call, max_retry=max_retry, fail_return=0.0, err_prefix=f"[evaluate]", instance_id=instance_id, - action_name="evaluate" + action_name="evaluate", ) def release_instance(self, instance_id: str, max_retry: int = 3) -> bool: def call(): resp = self._make_request(endpoint="release", instance_id=instance_id) return resp.get("success", False) + return retry_call( call, max_retry=max_retry, fail_return=False, err_prefix=f"[release_instance]", instance_id=instance_id, - action_name="release_instance" + action_name="release_instance", ) -# 使用示例 + +# Usage example def main(): client = EnvClient() env_type = "appworld" - # 获取任务列表 + # Get the task list task_ids = client.get_env_profile(env_type) print(f"Available tasks: {task_ids}") - # 创建实例 + # Create an instance task_id = task_ids[0] if task_ids else None if not task_id: - print("任务列表为空,无法创建实例!") + print("Task list is empty; cannot create an instance!") return init_response = client.create_instance(env_type, task_id) print("init state", init_response) @@ -257,16 +293,16 @@ def main(): query = init_response.get("state", []) print(f"Created instance {instance_id} with query: {query}") - # 执行动作 + # Execute an action action = {"role": "assistant", "content": "print('hello appworld!!')"} result = client.step(instance_id, action) print(f"Step result: {result}") - # 评估 + # Evaluate score = client.evaluate(instance_id) print(f"Evaluation score: {score}") - # 释放实例 + # Release the instance success = client.release_instance(instance_id) print(f"Instance released: {success}") diff --git a/astune/utils/http_client.py b/astune/utils/http_client.py index 53639f58..9a8d7f54 100644 --- a/astune/utils/http_client.py +++ b/astune/utils/http_client.py @@ -9,7 +9,10 @@ class HttpClient(BaseModel): url: str = Field(default="") - keep_alive: bool = Field(default=False, description="if true, use session to keep long connection") + keep_alive: bool = Field( + default=False, + description="if true, use session to keep long connection", + ) timeout: int = Field(default=300, description="request timeout, second") return_default_if_error: bool = Field(default=True) @@ -38,28 +41,34 @@ def close(self): if isinstance(self._client, requests.Session): self._client.close() - def _request(self, - data: str = None, - json_data: dict = None, - headers: dict = None, - stream: bool = False, - http_enum: str = "post"): + def _request( + self, + data: str = None, + json_data: dict = None, + headers: dict = None, + stream: bool = False, + http_enum: str = "post", + ): if http_enum == "post": - response: requests.Response = self._client.post(url=self.url, - data=data, - json=json_data, - headers=headers, - stream=stream, - timeout=self.timeout) + response: requests.Response = self._client.post( + url=self.url, + data=data, + json=json_data, + headers=headers, + stream=stream, + timeout=self.timeout, + ) elif http_enum == "get": - response: requests.Response = self._client.get(url=self.url, - data=data, - json=json_data, - headers=headers, - stream=stream, - timeout=self.timeout) + response: requests.Response = self._client.get( + url=self.url, + data=data, + json=json_data, + headers=headers, + stream=stream, + timeout=self.timeout, + ) else: raise NotImplementedError @@ -75,27 +84,38 @@ def parse_result(self, response: requests.Response | Any = None, **kwargs): def return_default(self, **kwargs): return None - def request(self, - data: str | Any = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs): + def request( + self, + data: str | Any = None, + json_data: dict = None, + headers: dict = None, + http_enum: str = "post", + **kwargs, + ): retry_sleep_time = self.retry_sleep_time for i in range(self.retry_max_count): try: - response = self._request(data=data, json_data=json_data, headers=headers, http_enum=http_enum) - result = self.parse_result(response=response, - data=data, - json_data=json_data, - headers=headers, - http_enum=http_enum, - **kwargs) + response = self._request( + data=data, + json_data=json_data, + headers=headers, + http_enum=http_enum, + ) + result = self.parse_result( + response=response, + data=data, + json_data=json_data, + headers=headers, + http_enum=http_enum, + **kwargs, + ) return result except Exception as e: - logger.exception(f"{self.__class__.__name__} {i}th request failed with args={e.args}") + logger.exception( + f"{self.__class__.__name__} {i}th request failed with args={e.args}" + ) if i == self.retry_max_count - 1: if self.return_default_if_error: @@ -108,36 +128,44 @@ def request(self, return None - def request_stream(self, - data: str = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs): + def request_stream( + self, + data: str = None, + json_data: dict = None, + headers: dict = None, + http_enum: str = "post", + **kwargs, + ): retry_sleep_time = self.retry_sleep_time for i in range(self.retry_max_count): try: - response = self._request(data=data, - json_data=json_data, - headers=headers, - stream=True, - http_enum=http_enum) + response = self._request( + data=data, + json_data=json_data, + headers=headers, + stream=True, + http_enum=http_enum, + ) request_context = {} for iter_idx, line in enumerate(response.iter_lines()): - yield self.parse_result(line=line, - request_context=request_context, - index=iter_idx, - data=data, - json_data=json_data, - headers=headers, - http_enum=http_enum, - **kwargs) + yield self.parse_result( + line=line, + request_context=request_context, + index=iter_idx, + data=data, + json_data=json_data, + headers=headers, + http_enum=http_enum, + **kwargs, + ) return None except Exception as e: - logger.exception(f"{self.__class__.__name__} {i}th request failed with args={e.args}") + logger.exception( + f"{self.__class__.__name__} {i}th request failed with args={e.args}" + ) if i == self.retry_max_count - 1: if self.return_default_if_error: diff --git a/astune/utils/launch_utils.py b/astune/utils/launch_utils.py new file mode 100644 index 00000000..efbf6209 --- /dev/null +++ b/astune/utils/launch_utils.py @@ -0,0 +1,155 @@ +import subprocess +import argparse +import shutil +import yaml +import time +import sys +import os +from loguru import logger +from beast_logger import print_dict +from astune.utils.config_utils import align_parameters +from astune.utils.smart_daemon import LaunchCommandWhenAbsent + +def launch_logview(exp_name=None): + """ + Launch the log viewer service and open the web browser to view logs. + + Args: + exp_name: Optional experiment name. If not provided, "default_experiment" is used. + """ + companion = LaunchCommandWhenAbsent( + full_argument_list=[ + sys.executable, + "-m", + "web_display.start_web", + ], + dir="./", + tag="logview", + ) + companion.launch( + launch_wait_time=1800, + success_std_string="Uvicorn running on", + env_dict={}, + ) + try: + import webbrowser + time.sleep(2.5) + webbrowser.open("http://127.0.0.1:8181/") + except Exception as e: + logger.error(f"Error opening web browser: {e}") + pass + + +def start_ray_service(args, env): + """ + Start a Ray service with appropriate configuration. + + Args: + args: Command line arguments containing debug settings + """ + # 获取当前 Python 解释器目录 + python_dir = os.path.dirname(sys.executable) + ray_path = os.path.join(python_dir, 'ray') + companion = LaunchCommandWhenAbsent( + full_argument_list=[f"{ray_path} start --head --block"], + dir="./", + tag="ray_service", + use_pty=True, + ) + companion.launch( + launch_wait_time=1800, + success_std_string="Ray runtime started", + env_dict=env, + ) + + + +def execute_training_process( + args, + backbone_target, + yaml_backup_dst, + exe_exp_base, + exe_yaml_path, + env, + exp_config, +): + """ + Execute the training process based on the specified backbone and configuration. + + Args: + args: Command line arguments + backbone_target: The Python module to execute + yaml_backup_dst: Path to the YAML configuration backup + exe_exp_base: Base path for experiment execution + exe_yaml_path: Path to the YAML configuration file + env: Environment variables dictionary + """ + + # Fixed config asset locations + TRINITY_BOOT_YAML = \ + "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED + TRINITY_CONFIG_AUTO_CONVERSION = \ + "astune/default_config/trinity/config_auto_convertion_trinity.json" + VERL_CONFIG_AUTO_CONVERSION = \ + "astune/default_config/verl/config_auto_convertion_verl.json" + + + # let's begin the training process + if args.backbone == "trinity": + # replace boot yaml + redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + "/trinity_launch.yaml" + shutil.copyfile(TRINITY_BOOT_YAML, redirect_trinity_boot_yaml) + align_parameters( + yaml_backup_dst, + redirect_trinity_boot_yaml, + TRINITY_CONFIG_AUTO_CONVERSION, + args.backbone, + ) + cmd = [ + sys.executable, + "-m", + backbone_target, + "run", + "--config", + redirect_trinity_boot_yaml, + ] + else: + align_parameters( + yaml_backup_dst, + yaml_backup_dst, + VERL_CONFIG_AUTO_CONVERSION, + args.backbone, + ) + cmd = [ + sys.executable, + "-m", + backbone_target, + "--config-path", + os.path.abspath(exe_exp_base), + "--config-name", + os.path.basename(exe_yaml_path), + ] + + if args.with_logview: + env.update( + { + "BEST_LOGGER_WEB_SERVICE_URL": os.environ.get( + "BEST_LOGGER_WEB_SERVICE_URL", "http://127.0.0.1:8181/" + ) + } + ) + + try: + logger.info(f"Running command: {' '.join(cmd)}") + print_dict({ + "Running Command": ' '.join(cmd), + "Experiment Base": exe_exp_base, + "YAML Config": exe_yaml_path, + }) + subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) + except subprocess.CalledProcessError as e: + logger.error(f"Error running subprocess: {e}") + sys.exit(1) + except Exception as e: + logger.error(f"Unexpected error: {e}") + sys.exit(1) diff --git a/astune/utils/logger.py b/astune/utils/logger.py new file mode 100644 index 00000000..37da6ae8 --- /dev/null +++ b/astune/utils/logger.py @@ -0,0 +1,26 @@ +import os + + +def init_parallel_rollout_logger(experiment_name): + """Initialize the logger with the given configuration.""" + from beast_logger import register_logger + + if "BEST_LOGGER_INIT" in os.environ: + return # prevent re-initialization in ray environment + os.environ["BEST_LOGGER_INIT"] = "1" + from datetime import datetime + + final_log_path = os.path.join( + "launcher_record", + experiment_name, + datetime.now().strftime("%Y_%m_%d_%H_%M"), + ) + os.environ["BEST_LOGGER_PATH"] = final_log_path + non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] + register_logger( + mods=["evaluation", "exception"], + non_console_mods=non_console_mods, + auto_clean_mods=[], + base_log_path=final_log_path, + debug=False, + ) diff --git a/astune/utils/markdown_parser.py b/astune/utils/markdown_parser.py index 2a2667d2..1ad79a5c 100644 --- a/astune/utils/markdown_parser.py +++ b/astune/utils/markdown_parser.py @@ -1,7 +1,12 @@ def read_markdown_and_extract_sections( markdown_text, - expected_sections=["current step", "previous instruction code", "relevant environment feedback", "next-step instruction code"], - default_placeholder="❌ not available." + expected_sections=[ + "current step", + "previous instruction code", + "relevant environment feedback", + "next-step instruction code", + ], + default_placeholder="❌ not available.", ): sections = {} # if not isinstance(markdown_text, str): @@ -34,5 +39,8 @@ def read_markdown_and_extract_sections( else: find_no_expected_sections = False - - return section_to_return, find_all_expected_sections, find_no_expected_sections + return ( + section_to_return, + find_all_expected_sections, + find_no_expected_sections, + ) diff --git a/astune/utils/message.py b/astune/utils/message.py index a80ad546..03ed6d2a 100644 --- a/astune/utils/message.py +++ b/astune/utils/message.py @@ -1,12 +1,21 @@ import requests, os + def send_train_message(message: str): - # 发送短信汇报训练进程 - assert len(message) < 64, f"Message too long: {(message)}" - if os.getenv("ALIYUN_SMS_SERVICE"): - try: requests.post( - json={"phone_numbers": "18810508767", "server_code": "DLC", "error": message, "error_level": "无"}, - url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), - headers={"Content-Type": "application/json"} - ) - except Exception as e: print(f"Failed to send sms: {e}") \ No newline at end of file + pass + # # 发送短信汇报训练进程 + # assert len(message) < 64, f"Message too long: {(message)}" + # if os.getenv("ALIYUN_SMS_SERVICE"): + # try: + # requests.post( + # json={ + # "phone_numbers": "18810508767", + # "server_code": "DLC", + # "error": message, + # "error_level": "无", + # }, + # url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), + # headers={"Content-Type": "application/json"}, + # ) + # except Exception as e: + # print(f"Failed to send sms: {e}") diff --git a/astune/utils/model_merger.py b/astune/utils/model_merger.py index ec3983c1..9ca16f35 100644 --- a/astune/utils/model_merger.py +++ b/astune/utils/model_merger.py @@ -100,7 +100,9 @@ def __init__(self, config: ModelMergerConfig): self.hf_model_config_path = config.hf_model_config_path if config.hf_model_path: - print("Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. ") + print( + "Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. " + ) self.hf_model_config_path = config.hf_model_path self.model_config = AutoConfig.from_pretrained(self.hf_model_config_path) @@ -124,9 +126,13 @@ def patch_model_generation_config(self, model): """ if model.can_generate(): try: - model.generation_config = GenerationConfig.from_pretrained(self.hf_model_config_path) + model.generation_config = GenerationConfig.from_pretrained( + self.hf_model_config_path + ) except OSError: - print(f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config.") + print( + f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config." + ) return model def save_lora_adapter(self, state_dict: dict[str, torch.Tensor]): @@ -166,18 +172,30 @@ def save_lora_adapter(self, state_dict: dict[str, torch.Tensor]): "target_modules": list(target_modules), } peft_config = peft.LoraConfig(**peft_dict).to_dict() - peft_config["task_type"] = peft_config["task_type"].value if peft_config["task_type"] else None - peft_config["peft_type"] = peft_config["peft_type"].value if peft_config["peft_type"] else None + peft_config["task_type"] = ( + peft_config["task_type"].value if peft_config["task_type"] else None + ) + peft_config["peft_type"] = ( + peft_config["peft_type"].value if peft_config["peft_type"] else None + ) peft_config["target_modules"] = list(peft_config["target_modules"]) lora_path = os.path.join(self.config.target_dir, "lora_adapter") os.makedirs(lora_path, exist_ok=True) - with open(os.path.join(lora_path, "adapter_config.json"), "w", encoding="utf-8") as f: + with open( + os.path.join(lora_path, "adapter_config.json"), + "w", + encoding="utf-8", + ) as f: json.dump(peft_config, f, ensure_ascii=False, indent=4) save_file(lora_params, os.path.join(lora_path, "adapter_model.safetensors")) for name in list(state_dict.keys()): - key = name.replace("base_model.model.", "").replace(".base_layer.weight", ".weight").replace(".base_layer.bias", ".bias") + key = ( + name.replace("base_model.model.", "") + .replace(".base_layer.weight", ".weight") + .replace(".base_layer.bias", ".bias") + ) state_dict[key] = state_dict.pop(name) return lora_path @@ -211,8 +229,16 @@ def upload_to_huggingface(self): from huggingface_hub import HfApi api = HfApi() - api.create_repo(repo_id=self.config.hf_upload_path, private=self.config.private, exist_ok=True) - api.upload_folder(folder_path=self.config.target_dir, repo_id=self.config.hf_upload_path, repo_type="model") + api.create_repo( + repo_id=self.config.hf_upload_path, + private=self.config.private, + exist_ok=True, + ) + api.upload_folder( + folder_path=self.config.target_dir, + repo_id=self.config.hf_upload_path, + repo_type="model", + ) @abstractmethod def merge_and_save(self): @@ -226,12 +252,20 @@ def _get_world_size(self) -> int: match = re.match(r"model_world_size_(\d+)_rank_0\.pt", filename) if match: return int(match.group(1)) - raise FileNotFoundError(f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}") + raise FileNotFoundError( + f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}" + ) def _load_rank_zero_state_dict(self, world_size: int) -> dict: - return torch.load(Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", map_location="cpu", weights_only=False) + return torch.load( + Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", + map_location="cpu", + weights_only=False, + ) - def _extract_device_mesh_info(self, state_dict: dict, world_size: int) -> tuple[np.ndarray, tuple[str, ...]]: + def _extract_device_mesh_info( + self, state_dict: dict, world_size: int + ) -> tuple[np.ndarray, tuple[str, ...]]: """ Retrieves sharding information (device_mesh, mesh_dim_names) from a DTensor in the state_dict. If no DTensor is found, infers a simple FSDP mesh based on world_size. @@ -251,9 +285,14 @@ def _extract_device_mesh_info(self, state_dict: dict, world_size: int) -> tuple[ return mesh, mesh_dim_names - def _calculate_shard_configuration(self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...]) -> tuple[int, tuple[int, ...]]: + def _calculate_shard_configuration( + self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...] + ) -> tuple[int, tuple[int, ...]]: """Calculates the total number of shards and the shape of the device mesh.""" - assert mesh_dim_names in (("fsdp",), ("ddp", "fsdp")), f"Unsupported mesh_dim_names {mesh_dim_names}" + assert mesh_dim_names in ( + ("fsdp",), + ("ddp", "fsdp"), + ), f"Unsupported mesh_dim_names {mesh_dim_names}" if "tp" in mesh_dim_names: # TODO: "tp" is not supported yet due to the above assert @@ -265,7 +304,9 @@ def _calculate_shard_configuration(self, mesh: np.ndarray, mesh_dim_names: tuple return total_shards, mesh_shape - def _merge_by_placement(self, tensors: list[torch.Tensor], placement: Placement) -> torch.Tensor: + def _merge_by_placement( + self, tensors: list[torch.Tensor], placement: Placement + ) -> torch.Tensor: """Merges a list of tensors based on their DTensor placement""" if placement.is_replicate(): return tensors[0] @@ -276,18 +317,33 @@ def _merge_by_placement(self, tensors: list[torch.Tensor], placement: Placement) raise NotImplementedError(f"Unsupported placement: {placement}") - def _load_and_merge_state_dicts(self, world_size: int, total_shards: int, mesh_shape: tuple[int, ...], mesh_dim_names: tuple[str, ...]) -> dict[str, torch.Tensor]: + def _load_and_merge_state_dicts( + self, + world_size: int, + total_shards: int, + mesh_shape: tuple[int, ...], + mesh_dim_names: tuple[str, ...], + ) -> dict[str, torch.Tensor]: model_state_dict_lst = [None] * total_shards def process_one_shard(rank: int, model_state_dict_lst: list): - model_path = Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" + model_path = ( + Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" + ) state_dict = torch.load(model_path, map_location="cpu", weights_only=False) model_state_dict_lst[rank] = state_dict return state_dict with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [executor.submit(process_one_shard, rank, model_state_dict_lst) for rank in range(total_shards)] - for future in tqdm(futures, desc=f"Loading {total_shards} FSDP shards", total=total_shards): + futures = [ + executor.submit(process_one_shard, rank, model_state_dict_lst) + for rank in range(total_shards) + ] + for future in tqdm( + futures, + desc=f"Loading {total_shards} FSDP shards", + total=total_shards, + ): future.result() # Merge state dicts from all shards @@ -347,7 +403,9 @@ def merge_and_save(self): total_shards, mesh_shape = self._calculate_shard_configuration(mesh, mesh_dim_names) print(f"Processing model shards with {total_shards} {mesh_shape} in total") - merged_state_dict = self._load_and_merge_state_dicts(world_size, total_shards, mesh_shape, mesh_dim_names) + merged_state_dict = self._load_and_merge_state_dicts( + world_size, total_shards, mesh_shape, mesh_dim_names + ) if self.config.operation == "test": if not self.config.test_hf_dir: @@ -363,7 +421,9 @@ def merge_and_save(self): def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): auto_model_class = self.get_transformers_auto_model_class() - hf_model = auto_model_class.from_pretrained(self.config.test_hf_dir, torch_dtype=torch.bfloat16) + hf_model = auto_model_class.from_pretrained( + self.config.test_hf_dir, torch_dtype=torch.bfloat16 + ) hf_state_dict = hf_model.state_dict() del hf_model @@ -371,28 +431,40 @@ def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): collected_keys = set(state_dict.keys()) missing_keys = hf_model_keys - collected_keys - assert len(missing_keys) == 0, f"Missing keys in collected state dict: {list(sorted(missing_keys))}" + assert ( + len(missing_keys) == 0 + ), f"Missing keys in collected state dict: {list(sorted(missing_keys))}" extra_keys = collected_keys - hf_model_keys - assert len(extra_keys) == 0, f"Extra keys in collected state dict: {list(sorted(extra_keys))}" + assert ( + len(extra_keys) == 0 + ), f"Extra keys in collected state dict: {list(sorted(extra_keys))}" for key in hf_model_keys: hf_shape = hf_state_dict[key].shape collected_shape = state_dict[key].shape - assert hf_shape == collected_shape, f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" + assert ( + hf_shape == collected_shape + ), f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" hf_dtype = hf_state_dict[key].dtype collected_dtype = state_dict[key].dtype - assert hf_dtype == collected_dtype, f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" + assert ( + hf_dtype == collected_dtype + ), f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" torch.testing.assert_close(hf_state_dict[key], state_dict[key], atol=1e-6, rtol=1e-6) - print("FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager.") + print( + "FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager." + ) class MegatronModelMerger(BaseModelMerger): def __init__(self, config: ModelMergerConfig): - from verl.utils.megatron_utils import get_hf_config_and_tokenizer_checkpoint_path + from verl.utils.megatron_utils import ( + get_hf_config_and_tokenizer_checkpoint_path, + ) config.hf_model_config_path = get_hf_config_and_tokenizer_checkpoint_path(config.local_dir) super().__init__(config) @@ -457,13 +529,22 @@ def _check_megatron_checkpoint_path(self, model_path: str) -> tuple[list[str], i pp_size = 0 sharded_dirs = sorted(os.listdir(model_path)) for sharded_dir in sharded_dirs: - assert "model.pt" in os.listdir(Path(model_path) / sharded_dir), f"model.pt not found in {sharded_dir}" + assert "model.pt" in os.listdir( + Path(model_path) / sharded_dir + ), f"model.pt not found in {sharded_dir}" tp_rank, pp_rank = self._get_tp_pp_rank_from_sharded_dir(sharded_dir) tp_size = max(tp_size, tp_rank + 1) pp_size = max(pp_size, pp_rank + 1) return sharded_dirs, tp_size, pp_size - def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: PretrainedConfig, tp_size: int, is_value_model: bool = False) -> Union[torch.Tensor, list[torch.Tensor]]: + def _merge_across_tp( + self, + key: str, + tp_data: list[torch.Tensor], + config: PretrainedConfig, + tp_size: int, + is_value_model: bool = False, + ) -> Union[torch.Tensor, list[torch.Tensor]]: if "linear_fc1.weight" in key: # if the tensor is gate and proj gate_lst = [] @@ -485,7 +566,11 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra num_q_per_kv = config.num_attention_heads // config.num_key_value_heads assert tp_data[0].shape[0] % (num_q_per_kv + 2) == 0 kv_size_per_tp = tp_data[0].shape[0] // (num_q_per_kv + 2) - split_size = [kv_size_per_tp * num_q_per_kv, kv_size_per_tp, kv_size_per_tp] + split_size = [ + kv_size_per_tp * num_q_per_kv, + kv_size_per_tp, + kv_size_per_tp, + ] for infer_param in tp_data: num_query_groups_per_partition = config.num_key_value_heads // tp_size @@ -504,7 +589,12 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra k = torch.cat(k_lst, dim=0) v = torch.cat(v_lst, dim=0) return [q, k, v] - elif "layer_norm" in key or "layernorm" in key or "router" in key or ("output_layer" in key and is_value_model): + elif ( + "layer_norm" in key + or "layernorm" in key + or "router" in key + or ("output_layer" in key and is_value_model) + ): return tp_data[0] else: dim = 0 @@ -512,7 +602,13 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra dim = 1 return torch.cat(tp_data, dim=dim) - def _load_state_dicts(self, model_ckpt_path: str, sharded_dirs: list[str], tp_size: int, pp_size: int) -> list[list[dict]]: + def _load_state_dicts( + self, + model_ckpt_path: str, + sharded_dirs: list[str], + tp_size: int, + pp_size: int, + ) -> list[list[dict]]: model_state_dict_lst = [[None for _ in range(tp_size)] for _ in range(pp_size)] def _process_one_megatron_shard(sharded_dir: str): @@ -522,8 +618,15 @@ def _process_one_megatron_shard(sharded_dir: str): model_state_dict_lst[pp_rank][tp_rank] = state_dict with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [executor.submit(_process_one_megatron_shard, sharded_dir) for sharded_dir in sharded_dirs] - for future in tqdm(futures, desc=f"Loading {len(sharded_dirs)} Megatron shards", total=len(sharded_dirs)): + futures = [ + executor.submit(_process_one_megatron_shard, sharded_dir) + for sharded_dir in sharded_dirs + ] + for future in tqdm( + futures, + desc=f"Loading {len(sharded_dirs)} Megatron shards", + total=len(sharded_dirs), + ): future.result() return model_state_dict_lst @@ -536,7 +639,9 @@ def _check_megatron_state_key(self, key: str) -> bool: Shall not use key starts with "model." """ if key.startswith("model."): - raise ValueError(f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder/embedding/output_layer' in TransformerLayer.") + raise ValueError( + f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder/embedding/output_layer' in TransformerLayer." + ) skip_checking_keys = ["embedding.word_embeddings", "output_layer"] for skip_key in skip_checking_keys: @@ -546,9 +651,16 @@ def _check_megatron_state_key(self, key: str) -> bool: # Exclude extra state keys if not key.startswith("decoder"): - raise ValueError(f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder' in TransformerLayer.") - - def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: int, pp_size: int) -> dict[str, torch.Tensor]: + raise ValueError( + f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder' in TransformerLayer." + ) + + def _merge_state_dicts( + self, + model_state_dict_lst: list[list[dict]], + tp_size: int, + pp_size: int, + ) -> dict[str, torch.Tensor]: state_dict = {} vpp_size = len(model_state_dict_lst[0][0]) layers_cum = 0 @@ -566,7 +678,9 @@ def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: in self._check_megatron_state_key(key) hf_name = self._replace_name(key, self.params_mapping) - assert hf_name is not None, f"Failed to convert layer name [{key}] from megatron to huggingface." + assert ( + hf_name is not None + ), f"Failed to convert layer name [{key}] from megatron to huggingface." if "model.layers." in hf_name: local_layer_no = int(hf_name.split(".")[2]) layers_handled = max(local_layer_no, layers_handled) @@ -575,10 +689,22 @@ def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: in new_key_list[2] = str(global_layer_no) hf_name = ".".join(new_key_list) else: - warnings.warn(f"hf_name {hf_name} will not be fixed with layer number", stacklevel=2) - - tp_data = [model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] for tp_rank in range(tp_size)] - merged = self._merge_across_tp(key, tp_data, self.model_config, tp_size, self.config.is_value_model) + warnings.warn( + f"hf_name {hf_name} will not be fixed with layer number", + stacklevel=2, + ) + + tp_data = [ + model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] + for tp_rank in range(tp_size) + ] + merged = self._merge_across_tp( + key, + tp_data, + self.model_config, + tp_size, + self.config.is_value_model, + ) if not isinstance(merged, list): state_dict[hf_name] = merged @@ -590,7 +716,9 @@ def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: in # split gate up state_dict[hf_name.replace("gate_up", "gate")] = merged[0] state_dict[hf_name.replace("gate_up", "up")] = merged[1] - print(f"converted {key} to {hf_name} with shape {merged.shape if isinstance(merged, torch.Tensor) else [t.shape for t in merged]}") + print( + f"converted {key} to {hf_name} with shape {merged.shape if isinstance(merged, torch.Tensor) else [t.shape for t in merged]}" + ) layers_cum += layers_handled + 1 # zero based @@ -601,9 +729,13 @@ def merge_and_save(self): model_ckpt_path = get_model_checkpoint_path(self.config.local_dir) sharded_dirs, tp_size, pp_size = self._check_megatron_checkpoint_path(model_ckpt_path) - print(f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}") + print( + f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}" + ) - model_state_dict_lst = self._load_state_dicts(model_ckpt_path, sharded_dirs, tp_size, pp_size) + model_state_dict_lst = self._load_state_dicts( + model_ckpt_path, sharded_dirs, tp_size, pp_size + ) merged_state_dict = self._merge_state_dicts(model_state_dict_lst, tp_size, pp_size) del model_state_dict_lst @@ -653,22 +785,77 @@ def _replace_name(self, megatron_name: str, name_mapping: dict[str, str]) -> str def main(): parser = argparse.ArgumentParser(description="verl model merger") - subparsers = parser.add_subparsers(dest="operation", required=True, help="Specify 'merge' or 'test' operation.") + subparsers = parser.add_subparsers( + dest="operation", + required=True, + help="Specify 'merge' or 'test' operation.", + ) base_op_parser = argparse.ArgumentParser(add_help=False) - base_op_parser.add_argument("--backend", type=str, required=True, choices=["fsdp", "megatron"], help="The backend of the model") - base_op_parser.add_argument("--local_dir", type=str, required=True, help="Path to the saved model checkpoints") - base_op_parser.add_argument("--hf_model_path", type=str, default=None, help="(Deprecated) Path to the original Hugging Face model for config.") - base_op_parser.add_argument("--tie-word-embedding", action="store_true", help="Whether to tie word embedding weights (currently only Megatron supported)") - base_op_parser.add_argument("--is-value-model", action="store_true", help="Whether the model is a value model (currently only Megatron supported)") - - merge_parser = subparsers.add_parser("merge", parents=[base_op_parser], help="Merge model checkpoints and save.") - merge_parser.add_argument("--target_dir", default="tmp", type=str, help="Directory to save the merged huggingface model") - merge_parser.add_argument("--hf_upload_path", default=None, type=str, help="Hugging Face repository ID to upload the model") - merge_parser.add_argument("--private", action="store_true", help="Whether to upload the model to a private Hugging Face repository") - - test_parser = subparsers.add_parser("test", parents=[base_op_parser], help="Test merged model against a reference Hugging Face model") - test_parser.add_argument("--test_hf_dir", type=str, required=True, help="Path to the reference Hugging Face model directory for testing") + base_op_parser.add_argument( + "--backend", + type=str, + required=True, + choices=["fsdp", "megatron"], + help="The backend of the model", + ) + base_op_parser.add_argument( + "--local_dir", + type=str, + required=True, + help="Path to the saved model checkpoints", + ) + base_op_parser.add_argument( + "--hf_model_path", + type=str, + default=None, + help="(Deprecated) Path to the original Hugging Face model for config.", + ) + base_op_parser.add_argument( + "--tie-word-embedding", + action="store_true", + help="Whether to tie word embedding weights (currently only Megatron supported)", + ) + base_op_parser.add_argument( + "--is-value-model", + action="store_true", + help="Whether the model is a value model (currently only Megatron supported)", + ) + + merge_parser = subparsers.add_parser( + "merge", + parents=[base_op_parser], + help="Merge model checkpoints and save.", + ) + merge_parser.add_argument( + "--target_dir", + default="tmp", + type=str, + help="Directory to save the merged huggingface model", + ) + merge_parser.add_argument( + "--hf_upload_path", + default=None, + type=str, + help="Hugging Face repository ID to upload the model", + ) + merge_parser.add_argument( + "--private", + action="store_true", + help="Whether to upload the model to a private Hugging Face repository", + ) + + test_parser = subparsers.add_parser( + "test", + parents=[base_op_parser], + help="Test merged model against a reference Hugging Face model", + ) + test_parser.add_argument( + "--test_hf_dir", + type=str, + required=True, + help="Path to the reference Hugging Face model directory for testing", + ) args = parser.parse_args() diff --git a/astune/utils/n_gram.py b/astune/utils/n_gram.py index 6567d8ef..dc03635f 100644 --- a/astune/utils/n_gram.py +++ b/astune/utils/n_gram.py @@ -1,10 +1,11 @@ import re + def preserve_chinese(text): # 使用正则表达式匹配所有中文字符 - chinese_chars = re.findall(r'[\u4e00-\u9fff]', text) + chinese_chars = re.findall(r"[\u4e00-\u9fff]", text) # 将匹配到的中文字符拼接成一个字符串 - return ''.join(chinese_chars) + return "".join(chinese_chars) def get_repetition_penalty_reward(ngram_size: int, max_penalty: float): @@ -19,15 +20,14 @@ def get_repetition_penalty_reward(ngram_size: int, max_penalty: float): if max_penalty > 0: raise ValueError(f"max_penalty {max_penalty} should not be positive") - def zipngram_chinese(text: str, ngram_size: int): import jieba + text = preserve_chinese(text) seg_list = list(jieba.cut(text)) # print(seg_list) return zip(*[seg_list[i:] for i in range(ngram_size)]) - def repetition_penalty_reward(completions, **kwargs) -> float: """ reward function the penalizes repetitions @@ -78,7 +78,7 @@ def repetition_penalty_reward(completions, **kwargs) -> float: { "content": "今天,一则消息在科技圈热传——据外媒报道,在近日向白宫提交的一项政策建议中,OpenAI对DeepSeek进行了十分露骨的攻击。一边称DeepSeek是“另一个华为”,是“国家补贴”“国家控制”的,会受中国指示“操纵其模型以造成损害”,一边强烈呼吁对该机构及类似机构开发的中国AI模型实施禁令。OpenAI的提案并非临时起意。今年1月,特朗普撤销了此前美国AI行政命令《安全、可靠和值得信赖的人工智能开发与使用》,随后签署了一项新的行政命令,宣布“美国的政策是维持并提升全球人工智能领域的主导地位”,并要求在180天内提交一份AI行动计划。无独有偶,美国另一家AI巨头Anthropic也强烈建议政府加强AI领域出口管制。它们显然都是瞄准了这一计划,想要以“技术话语权”换取“政策制定话语权”。事实上,以妖魔化外国竞争对手说事,博得政府支持最大化,是美国科技公司的惯用伎俩。但如此情绪激烈、赤裸裸地迎合美国“零和博弈”的政治逻辑,高调呼吁“抵制”“封禁”某家外国公司,多少还是过于难看。更可笑的是,这些话还出自自诩“开放”的OpenAI之口。OpenAI曾是开源的代名词,GPT-2的全面开放一度被视为行业标杆。但自GPT-3起,这家公司就选择筑起闭源高墙,更通过API订阅制赚得盆满钵满。本以为,DeepSeek掀起的AI行业普惠与效率革命,会让美国AI公司反思自己的路径选择。但如今来看,科技霸权主义对美国政治、美国科技企业的毒害远比我们想象的大得多。“层层封锁,封不住孤勇者。”不管出于什么心态,美国AI公司或许是忘了DeepSeek是怎么“逆袭”的了。近些年,美国政府为了压制中国人工智能的发展,动作不断,先是禁止AI芯片霸主英伟达向中国出口高端AI芯片,后又推动AI大模型霸主OpenAI停止向中国开放。这种情况下,即便对中国AI发展最为乐观的人也不敢想象——硬件性能无法做到最优,那就卷架构、卷工程,最终竟能“柳暗花明又一村”,让美国精心堆砌的人工智能高墙濒临坍塌。OpenAI将DeepSeek比作华为,怕是也忘了,几乎体验过美国所有打压、制裁手段的华为,如今已然是“轻舟已过万重山”。就如华为创始人任正非所说的,无论美国再怎么打压,华为也不恨美国。华为原来就像羊,慢慢吃草,变得很胖;美国是狼,狼一追羊就跑,减肥了就有战斗力。从更大范围看,于封锁中坚定自主创新、国产自研的心气与斗志,一直都是中国科技发展独特的“孤勇叙事”。至于迟迟丢不掉霸权逻辑者,在封闭、狭隘的创新环境里打转转,所谓的技术领先优势又能保持多久呢?最为讽刺的是,在提案中OpenAI还在唱“推广民主AI”“确保AI发展惠及所有人”的高调。试问,打压他国AI技术发展,到底“民主”在哪?“普惠”在哪?更何况,DeepSeek坚定走开源之路,极大促进了全球AI行业的合作交流,正让“AI人人可用”的理想不再遥不可及。“闭源”打压“开源”,还好意思抢占道德高地,不得不说,美国科技精英玩起政治双标那套来,也很溜。管中窥豹,可见一斑。马斯克曾言辞激烈地抨击OpenAI:“封闭”且“贪婪”。而这,形容的何尝不是当下的美国呢?" } - ] + ], ] rewards = reward_fn(completions) print(ngram_size, rewards) diff --git a/astune/utils/process_dataset.py b/astune/utils/process_dataset.py index 721d8cc6..1ddf3f02 100644 --- a/astune/utils/process_dataset.py +++ b/astune/utils/process_dataset.py @@ -16,135 +16,16 @@ import time import datasets from datasets import Dataset +from omegaconf import DictConfig from torch.utils.data import Dataset as TorchDataset from torch.utils.data import RandomSampler, SequentialSampler - -from verl.utils.dataset.rl_dataset import RLHFDataset from verl.utils.import_utils import load_extern_type from verl.experimental.dataset.sampler import AbstractSampler - - from typing import List, Optional, Union, Dict, Any -from transformers.processing_utils import ProcessorMixin -from omegaconf import DictConfig - - -class EnvServiceDataset(RLHFDataset): - """Dataset class that handles environment service data loading and processing.""" - - def __init__(self, - data_files: List[str], - tokenizer, - processor: Optional[ProcessorMixin], - config: DictConfig, - env_config: Optional[DictConfig] = None): - """Initialize the EnvServiceDataset. - - Args: - data_files: List of data file paths - tokenizer: The tokenizer to use - processor: The processor to use for multimodal data - config: Configuration for dataset - env_config: Configuration for environment service - """ - self.config = config - self.env_config = env_config or {} - super().__init__(data_files, tokenizer, config, processor) - - def _read_files_and_tokenize(self): - env_url = self.env_config.env_url - env_type = self.env_config.env_type - dataframes = [] - - from astune.env_service_client.env_client_ng import EnvClient - for parquet_file in self.data_files: - # read parquet files and cache - if 'train(read_from_env_service)' in parquet_file: - split = 'train' - elif 'val(read_from_env_service)' in parquet_file: - split = 'test' - split = 'dev' # or test_normal - else: - raise ValueError(f"Unsupported split: {parquet_file}") - env_service_client = EnvClient(base_url=env_url) - task_id_array = env_service_client.get_env_profile(env_type, split=split) - if len(task_id_array) == 0: - raise ValueError(f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}") - data = { - 'data_source': [env_type for task_id in task_id_array], - 'prompt': ['not available' for task_id in task_id_array], - 'reward_model': [{} for task_id in task_id_array], - 'extras': [{'task_id': task_id} for task_id in task_id_array], - } - dataframe = Dataset.from_dict(data) - dataframes.append(dataframe) - - self.dataframe: datasets.Dataset = datasets.concatenate_datasets(dataframes) - print(f"dataset len: {len(self.dataframe)}") - self.dataframe = self.maybe_filter_out_long_prompts(self.dataframe) - - -def create_rl_dataset( - data_paths: List[str], - data_config: DictConfig, - tokenizer, - processor: Optional[ProcessorMixin], - is_train: bool = True, - env_config: Optional[DictConfig] = None -) -> TorchDataset: - """Create a dataset. - - Arguments: - data_paths: List of paths to data files. - data_config: The data config. - tokenizer (Tokenizer): The tokenizer. - processor (Processor): The processor. - is_train (bool): Whether this is for training or validation. - env_config: Environment configuration. - - Returns: - dataset (Dataset): The dataset. - """ - - # Check if a custom dataset class is specified in the data configuration - # and if the path to the custom class is provided - if "custom_cls" in data_config and data_config.custom_cls.get("path", None) is not None: - # Dynamically load the custom dataset class - dataset_cls = load_extern_type(data_config.custom_cls.path, data_config.custom_cls.name) - # Verify that the custom dataset class inherits from torch.utils.data.Dataset - if not issubclass(dataset_cls, TorchDataset): - raise TypeError( - f"The custom dataset class '{data_config.custom_cls.name}' from " - f"'{data_config.custom_cls.path}' must inherit from torch.utils.data.Dataset" - ) - - elif "datagen" in data_config and data_config.datagen.get("path", None) is not None and is_train: - # If a data generation strategy is specified, use the DynamicGenDataset class - from verl.utils.dataset.dynamicgen_dataset import DynamicGenDataset - dataset_cls = DynamicGenDataset - print("Using DynamicGenDataset for data generation.") - - else: - # Use EnvServiceDataset - dataset_cls = EnvServiceDataset - print(f"Using dataset class: {dataset_cls.__name__}") - - # Instantiate the dataset using the determined dataset class - print('using', dataset_cls) - dataset = dataset_cls( - data_files=data_paths, - tokenizer=tokenizer, - processor=processor, - config=data_config, - env_config=env_config, - ) - - return dataset def create_rl_sampler( - data_config: DictConfig, - dataset: TorchDataset + data_config: DictConfig, dataset: TorchDataset ) -> Union[RandomSampler, SequentialSampler, AbstractSampler]: """Create a sampler for the dataset. diff --git a/astune/utils/process_manager.py b/astune/utils/process_manager.py index 3f619074..b19f9e2c 100644 --- a/astune/utils/process_manager.py +++ b/astune/utils/process_manager.py @@ -50,7 +50,12 @@ def kill_process_with_keyword(keyword: str, exclude_substrings=None, grace_secon ) try: - res = subprocess.run(["bash", "-lc", pid_list_cmd], capture_output=True, text=True, check=False) + res = subprocess.run( + ["bash", "-lc", pid_list_cmd], + capture_output=True, + text=True, + check=False, + ) pids = [pid for pid in res.stdout.split() if pid.isdigit()] except Exception as e: print(f"Failed to list PIDs via bash: {e}") @@ -63,7 +68,12 @@ def kill_process_with_keyword(keyword: str, exclude_substrings=None, grace_secon f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" ) try: - res2 = subprocess.run(["bash", "-lc", ps_pid_cmd], capture_output=True, text=True, check=False) + res2 = subprocess.run( + ["bash", "-lc", ps_pid_cmd], + capture_output=True, + text=True, + check=False, + ) pids = [pid for pid in res2.stdout.split() if pid.isdigit()] except Exception as e: print(f"Failed to list PIDs via ps/grep: {e}") @@ -75,11 +85,17 @@ def kill_process_with_keyword(keyword: str, exclude_substrings=None, grace_secon pid_args = " ".join(pids) try: # Send TERM to all in one call - subprocess.run(["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], check=False) + subprocess.run( + ["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], + check=False, + ) time.sleep(grace_seconds) # Escalate with KILL once; ignore failures for already-exited PIDs - subprocess.run(["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], check=False) + subprocess.run( + ["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], + check=False, + ) except Exception as e: print(f"Error issuing kill commands: {e}") - return [int(p) for p in pids] \ No newline at end of file + return [int(p) for p in pids] diff --git a/astune/utils/pty.py b/astune/utils/pty.py index b6dbcbf2..e6704b5c 100644 --- a/astune/utils/pty.py +++ b/astune/utils/pty.py @@ -1,84 +1,88 @@ import os import pty +import base64 + + def run_command_with_pty(cmd, working_dir, env_dict): """ - 使用伪终端运行命令,并将输出写入日志文件。 + Run a command in a pseudo-terminal (PTY) and stream output to stdout. - 参数: - cmd (list): 要运行的命令(如 ["ls", "-l"])。 - working_dir (str): 工作目录。 - env_dict (dict): 环境变量字典。 + Args: + cmd (list): Command to run (e.g., ["ls", "-l"]). + working_dir (str): Working directory. + env_dict (dict): Environment variables dictionary. """ - # 保存原始环境变量 + # Save original environment and directory original_env = os.environ.copy() original_dir = os.getcwd() try: - # 切换到指定工作目录 + # Change to the target working directory os.chdir(working_dir) - # 更新环境变量 + # Update environment variables for key, value in env_dict.items(): os.environ[key] = value - # # 打开日志文件以追加模式写入 + # # Open a log file in append mode (optional) # with open(log_file, 'a') as log_f: - # 定义主设备读取回调函数 + # Define master device read callback def master_read(fd): try: - # 从主设备读取数据 + # Read data from PTY master data = os.read(fd, 1024) except OSError: return b"" if data: - # 将数据写入日志文件 + # Write data to log file # log_f.write(data.decode()) # log_f.flush() - # 同时打印到标准输出(可选) + # Also print to stdout (optional) print(data.decode(), end="") return data - # 定义标准输入读取回调函数 + # Define stdin read callback def stdin_read(fd): - # 如果不需要从标准输入读取数据,直接返回空字节 + # Return empty bytes if no stdin input is needed return b"" - # 使用 pty.spawn 分配伪终端并运行命令 + # Spawn a PTY and run the command pty.spawn(cmd, master_read, stdin_read) finally: - # 恢复原始工作目录 + # Restore original working directory os.chdir(original_dir) - # 恢复原始环境变量 + # Restore original environment variables os.environ.clear() os.environ.update(original_env) -import base64 -# 将字符串转换为 Base64 +# Convert string to Base64 def string_to_base64(s): - # 首先将字符串编码为字节 - s_bytes = s.encode('utf-8') - # 将字节转换为 base64 + # First, encode the string to bytes + s_bytes = s.encode("utf-8") + # Convert bytes to base64 base64_bytes = base64.b64encode(s_bytes) - # 将 base64 字节转换回字符串 - base64_string = base64_bytes.decode('utf-8') + # Convert base64 bytes back to string + base64_string = base64_bytes.decode("utf-8") return base64_string -# 将 Base64 转换回字符串 + +# Convert Base64 back to string def base64_to_string(b): - # 将 base64 字符串转换为字节 - base64_bytes = b.encode('utf-8') - # 解码 base64 字节 + # Convert base64 string to bytes + base64_bytes = b.encode("utf-8") + # Decode base64 bytes message_bytes = base64.b64decode(base64_bytes) - # 将字节转换回字符串 - message = message_bytes.decode('utf-8') + # Convert bytes back to string + message = message_bytes.decode("utf-8") return message + def pty_wrapper( cmd: list[str], dir: str, @@ -86,19 +90,47 @@ def pty_wrapper( ): run_command_with_pty(cmd, working_dir=dir, env_dict=env_dict) + def pty_wrapper_final(human_cmd, dir, env_dict): print("[pty]: ", human_cmd) pty_wrapper(["/bin/bash", "-c", human_cmd], dir, env_dict) +def pty_launch(service_name: str, success_std_string="Starting server on"): + from astune.utils.smart_daemon import LaunchCommandWhenAbsent + service_path = os.environ.get(f"{service_name.upper()}_PATH") + service_script = os.environ.get(f"{service_name.upper()}_SCRIPT") + if service_path is None or service_script is None: + raise ValueError(f"Environment variables for {service_name} not properly set.") + companion = LaunchCommandWhenAbsent( + full_argument_list=[service_script], + dir=service_path, + tag="appworld_env_service", + use_pty=True, + ) + companion.launch( + launch_wait_time=1800, + success_std_string=success_std_string, + ) + + + + if __name__ == "__main__": import argparse import json - parser = argparse.ArgumentParser(description="Run a shell command in a PTY with logging and custom env.") + parser = argparse.ArgumentParser( + description="Run a shell command in a PTY with logging and custom env." + ) parser.add_argument("--human-cmd", type=str, help="Shell command to run (as a string)") parser.add_argument("--dir", type=str, default=".", help="Working directory") - parser.add_argument("--env", type=str, default="{}", help="Environment variables as JSON string, e.g. '{\"KEY\":\"VAL\"}'") + parser.add_argument( + "--env", + type=str, + default="{}", + help='Environment variables as JSON string, e.g. \'{"KEY":"VAL"}\'', + ) args = parser.parse_args() @@ -107,8 +139,10 @@ def pty_wrapper_final(human_cmd, dir, env_dict): if not isinstance(env_dict, dict): raise ValueError except Exception: - print("--env must be a valid JSON object string, e.g. '{\"KEY\":\"VAL\"}'. But get:", args.env) + print( + '--env must be a valid JSON object string, e.g. \'{"KEY":"VAL"}\'. But get:', + args.env, + ) exit(1) pty_wrapper_final(base64_to_string(args.human_cmd), args.dir, env_dict) - diff --git a/astune/utils/retry.py b/astune/utils/retry.py new file mode 100644 index 00000000..9fe68d58 --- /dev/null +++ b/astune/utils/retry.py @@ -0,0 +1,52 @@ +import time +from functools import wraps +from typing import Any, Callable, Literal, Optional, TypeVar +from astune.utils.testing_utils import GoodbyeException, TestFailException +from loguru import logger + +T = TypeVar("T") + + +def retry_with_backoff( + max_retry: int = 3, + backoff_fn: Optional[Callable[[int], float]] = None, + max_retry_attr: Optional[str] = None, +) -> Callable[[Callable[..., T]], Callable[..., T]]: + """Retry decorator with exponential backoff and structured logging.""" + + def decorator(func: Callable[..., T]) -> Callable[..., T]: + @wraps(func) + def wrapper(*args: Any, **kwargs: Any) -> T: + target_max_retry = max_retry + if max_retry_attr and args: + candidate = getattr(args[0], max_retry_attr, None) + if isinstance(candidate, int) and candidate > 0: + target_max_retry = candidate + if target_max_retry < 1: + target_max_retry = 1 + + for attempt in range(target_max_retry): + try: + return func(*args, **kwargs) + except GoodbyeException as exc: # noqa: BLE001 + raise exc + except TestFailException as exc: # noqa: BLE001 + raise exc + except Exception as exc: # noqa: BLE001 + if attempt < target_max_retry - 1: + logger.bind(exception=True).exception( + f"{func.__name__} error: {exc.args}, retrying {attempt + 1}/{target_max_retry}" + ) + sleep_seconds = backoff_fn(attempt) if backoff_fn else 2**attempt + time.sleep(sleep_seconds) + else: + logger.bind(exception=True).exception( + f"{func.__name__} failed after {target_max_retry} retries: {exc.args}" + ) + raise + + raise RuntimeError("retry_with_backoff exhausted attempts") + + return wrapper + + return decorator diff --git a/astune/utils/robust_dashscope.py b/astune/utils/robust_dashscope.py index 53d4bda6..a529a171 100644 --- a/astune/utils/robust_dashscope.py +++ b/astune/utils/robust_dashscope.py @@ -6,6 +6,7 @@ from loguru import logger from agentscope.model import DashScopeChatModel + class RobustDashScopeChatModel(DashScopeChatModel): """ A robust version of DashScopeChatModel that includes retry logic and multiple API key handling. @@ -15,19 +16,17 @@ class RobustDashScopeChatModel(DashScopeChatModel): 3. Error handling with appropriate logging """ - def __init__( - self, - model_name="qwen3-max", - stream=False, - max_try=4, - **kwargs - ): + def __init__(self, model_name="qwen3-max", stream=False, max_try=4, **kwargs): # Check for environment variables self._check_env_variables() # Parse API keys from environment variables self.regular_key_list = os.environ.get("DASHSCOPE_API_KEY", "").split("|") - self.backup_key_list = os.environ.get("DASHSCOPE_API_KEY_BACKUP", "").split("|") if os.environ.get("DASHSCOPE_API_KEY_BACKUP") else [] + self.backup_key_list = ( + os.environ.get("DASHSCOPE_API_KEY_BACKUP", "").split("|") + if os.environ.get("DASHSCOPE_API_KEY_BACKUP") + else [] + ) api_key = random.choice(self.regular_key_list) @@ -35,25 +34,31 @@ def __init__( self.max_try = max_try # Initialize the parent class - super().__init__( - api_key=api_key, - model_name=model_name, - stream=stream, - **kwargs - ) + super().__init__(api_key=api_key, model_name=model_name, stream=stream, **kwargs) def _check_env_variables(self): """Check if required environment variables are set.""" if os.environ.get("DASHSCOPE_API_KEY") is None: - raise RuntimeError(dedent(""" + raise RuntimeError( + dedent( + """ Please set the DASHSCOPE_API_KEY environment variable. You can get the API keys from https://www.dashscope.com/. Example: export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' (optional) - """)) + """ + ) + ) - async def __call__(self, messages, tools=None, tool_choice=None, structured_model=None, **kwargs): + async def __call__( + self, + messages, + tools=None, + tool_choice=None, + structured_model=None, + **kwargs, + ): """ Override the __call__ method to add retry logic and API key rotation. @@ -89,7 +94,7 @@ async def __call__(self, messages, tools=None, tool_choice=None, structured_mode tools=tools, tool_choice=tool_choice, structured_model=structured_model, - **kwargs + **kwargs, ) return response @@ -99,4 +104,6 @@ async def __call__(self, messages, tools=None, tool_choice=None, structured_mode print(f"Error calling DashScope API: {e}, retrying ({n_try + 1}/{self.max_try})...") # If all attempts fail - raise RuntimeError(f"Failed to get response from DashScope API after {self.max_try} attempts") + raise RuntimeError( + f"Failed to get response from DashScope API after {self.max_try} attempts" + ) diff --git a/astune/utils/sample.py b/astune/utils/sample.py new file mode 100644 index 00000000..25438fa1 --- /dev/null +++ b/astune/utils/sample.py @@ -0,0 +1,25 @@ +def get_sample_params(mode, config): + response_length_eps = ( + 16 # Reserve a few tokens for later handling of special tokens like lm_start. + ) + if config.astune.rollout.name == "vllm": + sampling_params = dict( + n=1, + max_tokens=config.astune.rollout.max_response_length_in_one_turn - response_length_eps, + min_tokens=1, # Must output at least 1 token. + temperature=config.astune.rollout.temperature, + top_p=config.astune.rollout.top_p, + ) + else: + sampling_params = dict( + n=1, + max_new_tokens=config.astune.rollout.max_response_length_in_one_turn, + temperature=config.astune.rollout.temperature, + top_p=config.astune.rollout.top_p, + ) + + if mode == "validate": + sampling_params["temperature"] = config.astune.rollout.val_kwargs.temperature + sampling_params["top_k"] = config.astune.rollout.val_kwargs.top_k + sampling_params["top_p"] = config.astune.rollout.val_kwargs.top_p + return sampling_params diff --git a/astune/utils/smart_daemon.py b/astune/utils/smart_daemon.py index 36b91bf7..d30e9593 100644 --- a/astune/utils/smart_daemon.py +++ b/astune/utils/smart_daemon.py @@ -9,6 +9,8 @@ from loguru import logger from pathlib import Path from typing import Optional, Tuple, List +from beast_logger import print_dict + class LaunchWhenAbsent: """ @@ -16,7 +18,15 @@ class LaunchWhenAbsent: If the script is already running, it will skip launching unless force_restart is True. """ - def __init__(self, script_path: str, argument_list: List[str] = None, exe: str = None, dir = None, tag='', use_pty=False): + def __init__( + self, + script_path: str, + argument_list: List[str] = None, + exe: str = None, + dir=None, + tag="", + use_pty=False, + ): """ Initialize with the path to the Python script to be launched. @@ -41,14 +51,14 @@ def __init__(self, script_path: str, argument_list: List[str] = None, exe: str = full_argument_list = [self.script_path] + self.argument_list hash_items = full_argument_list + [str(self.dir), str(exe)] - self.script_hash = hashlib.md5(''.join(hash_items).encode()).hexdigest()[:8] + self.script_hash = hashlib.md5("".join(hash_items).encode()).hexdigest()[:8] # Prepare command with hash ID marker if self.use_pty: assert len(full_argument_list) == 1 - self.cmd = [self.exe + " " + full_argument_list[0]] + self.cmd = [self.exe + " " + full_argument_list[0]] else: - self.cmd = ['nohup'] + [self.exe] + full_argument_list + self.cmd = ["nohup"] + [self.exe] + full_argument_list log_dir = Path("launcher_record/companion_logs/companion") log_dir.mkdir(parents=True, exist_ok=True) @@ -61,8 +71,9 @@ def __init__(self, script_path: str, argument_list: List[str] = None, exe: str = self.logger_file = log_dir / f"{base_log_name}.log" self.pgid = None - - def _is_script_running(self) -> Tuple[bool, Optional[psutil.Process], Optional[int]]: + def _is_script_running( + self, + ) -> Tuple[bool, Optional[psutil.Process], Optional[int]]: """ Check if the script is already running by looking for its unique hash ID in process command lines. @@ -76,7 +87,7 @@ def _is_script_running(self) -> Tuple[bool, Optional[psutil.Process], Optional[i if not self.pgid_file.exists(): return False, None, None else: - with open(self.pgid_file, 'r') as f_pgid: + with open(self.pgid_file, "r") as f_pgid: pgid = int(f_pgid.read().strip()) # Check if the process group ID is still running, if true, psutil is_running, proc = self.is_pgid_running(pgid) @@ -89,9 +100,15 @@ def _is_script_running(self) -> Tuple[bool, Optional[psutil.Process], Optional[i return False, None, None def is_pgid_running(self, pgid): - for proc in psutil.process_iter(['pid']): + # Treat zombie processes as not running to avoid false positives. + for proc in psutil.process_iter(["pid", "status"]): try: + if proc.info.get("status") == psutil.STATUS_ZOMBIE: + continue if os.getpgid(proc.pid) == pgid: + # Double-check status to avoid races where the cached info is missing. + if proc.status() == psutil.STATUS_ZOMBIE: + continue return True, proc except (psutil.NoSuchProcess, ProcessLookupError): continue @@ -136,7 +153,23 @@ def shutdown(self): if self.pgid: self._kill_existing_process_group(self.pgid) - def launch(self, force_restart: bool = False, launch_wait_time: int = 30, success_std_string: str = None, env_dict = {}): + def kill_self(self): + """Force terminate this launcher instance if it's running.""" + is_running, _, pgid = self._is_script_running() + if not is_running or pgid is None: + logger.info("No running process group found for this launcher") + return False + self.pgid = pgid + self._kill_existing_process_group(pgid) + return True + + def launch( + self, + force_restart: bool = False, + launch_wait_time: int = 30, + success_std_string: str = None, + env_dict={}, + ): """ Launch the script if it's not running, or restart it if force_restart is True. @@ -153,7 +186,9 @@ def launch(self, force_restart: bool = False, launch_wait_time: int = 30, succes logger.warning(f"Force restarting") self._kill_existing_process_group(pgid) else: - logger.success(f"Script is already running, skipping launch. pgid: {pgid}. Command [{' '.join(self.cmd)}]") + logger.success( + f"Script is already running, skipping launch. pgid: {pgid}. Command [{' '.join(self.cmd)}]" + ) return try: # Set up process creation flags and environment @@ -164,26 +199,31 @@ def launch(self, force_restart: bool = False, launch_wait_time: int = 30, succes # Open log file log_file = self.logger_file - if os.name == 'nt': # Windows + if os.name == "nt": # Windows # DETACHED_PROCESS flag raise NotImplementedError("Windows support is not implemented yet.") else: # Unix-like systems # Use nohup and redirect output - logger.warning("\nlaunching: " + " ".join(self.cmd)) - logger.warning(f"\nlogging to {log_file}\n") + print_dict({ + "Action": "Launching command", + "Command": " ".join(self.cmd), + "LogFile": str(log_file), + }) + # logger.warning("\nlaunching: " + " ".join(self.cmd)) + # logger.warning(f"\nlogging to {log_file}\n") # Open log file if log_file.exists(): os.remove(log_file) if not self.use_pty: - f = open(log_file, 'a') + f = open(log_file, "a") proc = subprocess.Popen( self.cmd, stdout=f, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL, cwd=self.dir, - env={'ScriptHash': self.script_hash, **env_dict}, - start_new_session=True # Start new session + env={"ScriptHash": self.script_hash, **env_dict}, + start_new_session=True, # Start new session ) f.close() # Close append handle pgid = os.getpgid(proc.pid) @@ -191,48 +231,51 @@ def launch(self, force_restart: bool = False, launch_wait_time: int = 30, succes import base64 def string_to_base64(s): - # 首先将字符串编码为字节 - s_bytes = s.encode('utf-8') - # 将字节转换为 base64 + # First, encode the string to bytes + s_bytes = s.encode("utf-8") + # Then convert bytes to base64 base64_bytes = base64.b64encode(s_bytes) - # 将 base64 字节转换回字符串 - base64_string = base64_bytes.decode('utf-8') + # Finally, convert base64 bytes back to string + base64_string = base64_bytes.decode("utf-8") return base64_string - f = open(log_file, 'a') + f = open(log_file, "a") converted_cmd = [ - sys.executable, - "-m", - "astune.utils.pty", - "--human-cmd", f"'{string_to_base64(self.cmd[0])}'", - "--dir", self.dir, - "--env", json.dumps(env_dict), - ] - print('running pty command:', ' '.join(converted_cmd)) + sys.executable, + "-m", + "astune.utils.pty", + "--human-cmd", + f"'{string_to_base64(self.cmd[0])}'", + "--dir", + self.dir, + "--env", + json.dumps(env_dict), + ] + print("running pty command:", " ".join(converted_cmd)) proc = subprocess.Popen( converted_cmd, stdout=f, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL, cwd="./", - env={'ScriptHash': self.script_hash, **env_dict}, - start_new_session=True # Start new session + env={"ScriptHash": self.script_hash, **env_dict}, + start_new_session=True, # Start new session ) f.close() # Close append handle pgid = os.getpgid(proc.pid) # write pgid to {log_file}.pgid - with open(self.pgid_file, 'w') as f_pgid: + with open(self.pgid_file, "w") as f_pgid: f_pgid.write(str(pgid)) # Monitor log file for success string or timeout start_time = time.time() f_read = "" previous_r_print = False - with open(log_file, 'r') as f: + with open(log_file, "r") as f: while time.time() - start_time < launch_wait_time: f_read_ = f.read() - inc_read = f_read_[len(f_read):] + inc_read = f_read_[len(f_read) :] f_read = f_read_ # Update f_read to the latest content if success_std_string: # Move to end of file and read new content @@ -241,32 +284,49 @@ def string_to_base64(s): break time.sleep(1) remaining = int(launch_wait_time - (time.time() - start_time)) - f_read_trim = inc_read.replace('\n', ' ') + f_read_trim = inc_read.replace("\n", " ") if f_read_trim: - if previous_r_print: print('') - print(f"Waiting for process launch... {remaining}s remaining ({f_read_trim})") + if previous_r_print: + print("") + print( + f"Waiting for process launch [PGID {pgid}, PID {proc.pid}]... {remaining}s remaining ({f_read_trim})" + ) previous_r_print = False else: - print(f"\rWaiting for process launch... {remaining}s remaining", end='', flush=True) + print( + f"\rWaiting for process launch [PGID {pgid}, PID {proc.pid}]... {remaining}s remaining", + end="", + flush=True, + ) previous_r_print = True if remaining % 10 == 0: is_running, proc = self.is_pgid_running(pgid) if not is_running: - raise RuntimeError(f"Process with PGID {pgid} is not running, cannot confirm launch") + raise RuntimeError( + f"Process with PGID {pgid} is not running, cannot confirm launch" + ) else: if success_std_string: - raise TimeoutError(f"Process did not output success string '{success_std_string}' within {launch_wait_time} seconds") + raise TimeoutError( + f"Process did not output success string '{success_std_string}' within {launch_wait_time} seconds" + ) logger.success(f"Successfully launched {self.cmd} with PID {proc.pid}") + print_dict({ + "Result": "Successfully launched", + "Command": " ".join(self.cmd), + "PID": proc.pid, + }) except Exception as e: logging.error(f"Error launching script: {e}") - raise + raise e + class LaunchCommandWhenAbsent(LaunchWhenAbsent): - def __init__(self, full_argument_list: List[str], dir = None, tag = "", use_pty=False): + def __init__(self, full_argument_list: List[str], dir=None, tag="", use_pty=False): if not dir: self.dir = os.getcwd() else: @@ -277,15 +337,15 @@ def __init__(self, full_argument_list: List[str], dir = None, tag = "", use_pty= full_argument_list_compute_hash = full_argument_list.copy() if full_argument_list_compute_hash[0] == sys.executable: - full_argument_list_compute_hash[0] = 'python' + full_argument_list_compute_hash[0] = "python" hash_items = full_argument_list_compute_hash + [str(self.dir)] - self.script_hash = hashlib.md5(''.join(hash_items).encode()).hexdigest()[:8] + self.script_hash = hashlib.md5("".join(hash_items).encode()).hexdigest()[:8] if self.use_pty: assert len(full_argument_list) == 1 self.cmd = full_argument_list else: - self.cmd = ['nohup'] + full_argument_list + self.cmd = ["nohup"] + full_argument_list # raise ValueError(self.script_hash) log_dir = Path("launcher_record/companion_logs/companion") diff --git a/astune/utils/sms_agent.py b/astune/utils/sms_agent.py index 8189ceea..e402c225 100644 --- a/astune/utils/sms_agent.py +++ b/astune/utils/sms_agent.py @@ -1,11 +1,28 @@ def send_train_message(message: str): - import requests, os, dotenv - dotenv.load_dotenv() - phone_numbers = os.getenv("PHONE_NUMBERS", None) - print("trying to send sms to:", phone_numbers) - if phone_numbers: - try: - assert len(message) < 15, f"message is limit to 15 characters! Current length: {len(message)}." - requests.post(json={"phone_numbers": phone_numbers, "server_code": "DLC", "error": message, "error_level": "wbb1u1g0dte2n"}, url=os.getenv("ALIYUN_SMS_SERVICE", "http://cloud-6.agent-matrix.com:12337/send-sms/"), headers={"Content-Type": "application/json"}) - except Exception as e: - print(f"Failed to send sms: {e}") + pass + + # import requests, os, dotenv + + # dotenv.load_dotenv() + # phone_numbers = os.getenv("PHONE_NUMBERS", None) + # print("trying to send sms to:", phone_numbers) + # if phone_numbers: + # try: + # assert ( + # len(message) < 15 + # ), f"message is limit to 15 characters! Current length: {len(message)}." + # requests.post( + # json={ + # "phone_numbers": phone_numbers, + # "server_code": "DLC", + # "error": message, + # "error_level": "wbb1u1g0dte2n", + # }, + # url=os.getenv( + # "ALIYUN_SMS_SERVICE", + # "http://cloud-6.agent-matrix.com:12337/send-sms/", + # ), + # headers={"Content-Type": "application/json"}, + # ) + # except Exception as e: + # print(f"Failed to send sms: {e}") diff --git a/astune/utils/testing_utils.py b/astune/utils/testing_utils.py new file mode 100644 index 00000000..34eadddc --- /dev/null +++ b/astune/utils/testing_utils.py @@ -0,0 +1,24 @@ +from astune.utils.dynamic_import import dynamic_import + +def get_test_lambda(test_name): + test_cls = dynamic_import(test_name)() + print('using test lambda:', test_name) + return test_cls + +def _test_if_test_mode(key, value, config): + if not config.astune.execute_test: return + if config.astune.execute_test == 'do_not_test': return + test_lambda = get_test_lambda(config.astune.execute_testing_lambda) + return test_lambda(key, value) + +def _mock_if_test_mode(key, value, config): + if not config.astune.execute_test: return value + if config.astune.execute_test == 'do_not_test': return value + test_lambda = get_test_lambda(config.astune.execute_testing_lambda) + return test_lambda.mock(key) + +class GoodbyeException(Exception): + pass + +class TestFailException(Exception): + pass \ No newline at end of file diff --git a/astune/utils/utils.py b/astune/utils/utils.py index 3a6a56af..446f8a14 100644 --- a/astune/utils/utils.py +++ b/astune/utils/utils.py @@ -1,5 +1,8 @@ from typing import Any, List, Dict import asyncio +import copy +import concurrent.futures + # apply chat_template to a message, and then convert back to message def convert_tool_to_user_message(tool_message, tokenizer, format="qwen"): @@ -7,15 +10,15 @@ def convert_tool_to_user_message(tool_message, tokenizer, format="qwen"): if tool_message["role"] == "user": return tool_message - elif tool_message["role"] == "tool" and len(tool_message["tool_calls"])>0: - assert len(tool_message["tool_calls"])==1 + elif tool_message["role"] == "tool" and len(tool_message["tool_calls"]) > 0: + assert len(tool_message["tool_calls"]) == 1 return { "role": "user", - "content": str(tool_message["tool_calls"][0]['result']) + "content": str(tool_message["tool_calls"][0]["result"]), } -def run_async_coro__no_matter_what(coro): +def run_async_coro__no_matter_what(coro, timeout: int = 3600) -> Any: try: asyncio.get_running_loop() in_loop = True @@ -24,19 +27,20 @@ def run_async_coro__no_matter_what(coro): if not in_loop: final_res = asyncio.run(coro) else: - import threading - _res_holder = {} - _exc_holder = {} - def _run(): + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit(asyncio.run, coro) try: - _res_holder["res"] = asyncio.run(coro) - except Exception as _e: - _exc_holder["exc"] = _e + final_res = future.result(timeout=timeout) + except concurrent.futures.TimeoutError: + future.cancel() + raise + except Exception as e: + raise + return final_res + - _t = threading.Thread(target=_run, daemon=True) - _t.start() - _t.join() - if "exc" in _exc_holder: - raise _exc_holder["exc"] - final_res = _res_holder["res"] - return final_res \ No newline at end of file +def remove_fields(d: Dict, fields: List[str]) -> Dict: + d = copy.deepcopy(d) + for field in fields: + d.pop(field.strip(), None) + return d diff --git a/astune/workflow.py b/astune/workflow.py new file mode 100644 index 00000000..cfeed988 --- /dev/null +++ b/astune/workflow.py @@ -0,0 +1,107 @@ +from typing import List +from pydantic import BaseModel, Field +from astune import ModelTuner +from astune.schema.task import WorkflowTask, WorkflowOutput + + +class Workflow(BaseModel): + + model_config = {"extra": "allow"} + name: str = Field(default="default_workflow", description="Name of the workflow.") + trainable_targets: List[str] = Field(default=[], description="List of agents to be fine-tuned.") + + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: + """Run the workflow on a given task.""" + raise NotImplementedError + + +""" +How to define a trainable workflow 🚀: + +1. Single agent scenario 🤖: + + Simply set `model` argument to `model_tuner` when initializing your agent. + This is a helpful example when you: + - 🌟 Know exactly which agents should be trained, or the number of agents are small; + - ✨ Already finished basic debugging of your workflow using a fixed model such as qwen-max; + - 🎇 Do not requires changing which agents to be trained on the fly. + + ----- EXAMPLE ----- + + - Suppose you have a react agent that looks like this: + + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=DashScopeChatModel(model='qwen-max'), + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), + ) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg, structured_model=FinalResult) + final_answer = extract_final_answer(result) + + + - Then all you have to do is to wrap it in a workflow class: + + [+] class ExampleMathLearn(Workflow): + [+] name: str = "math_agent_workflow" + [+] async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + [ ] from agentscope.agent import ReActAgent + [ ] from agentscope.formatter import DashScopeChatFormatter + [ ] from agentscope.memory import InMemoryMemory + [ ] from agentscope.tool import Toolkit, execute_python_code + [ ] self.toolkit = Toolkit() + [ ] self.toolkit.register_tool_function(execute_python_code) + [ ] self.agent = ReActAgent( + [ ] name="math_react_agent", + [ ] sys_prompt=system_prompt, + [-] model=DashScopeChatModel(model='qwen-max'), + [+] model=model_tuner, + [ ] formatter=DashScopeChatFormatter(), + [ ] toolkit=self.toolkit, + [ ] memory=InMemoryMemory(), + [ ] ) + [+] query = task.task.main_query + [ ] msg = Msg("user", query, role="user") + [ ] result = await self.agent.reply(msg, structured_model=FinalResult) + [ ] final_answer = extract_final_answer(result) + [+] return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + + +2. Multi-agent scenario 🤝: + + Use `register_model` method of `ModelTuner` to register different agent targets. + This is extremely helpful when you want to + - 🌟 Achieve fine-grained control over which agents to be fine-tuned; + - ✨ Define what model agents should use when they are NOT being tuned; + - ⚡ Change which trainable agent targets on the fly without modifying the workflow code. + + ----- EXAMPLE ----- + + [ ] roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] + [ ] players = [] + [ ] for i, role in enumerate(roles): + [ ] default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) + [ ] default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) + [ ] chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys # 🌟 + [ ] players += [ReActAgent( + [ ] name=f"Player{i + 1}", + [ ] sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), + [-] model=chosen_model, + [+] model=model_tuner.register_model(role, default_model=chosen_model), + [ ] formatter=OpenAIMultiAgentFormatter(), + [ ] )] + + + +""" diff --git a/astune/workflow_controller/agentscope_flow.py b/astune/workflow_controller/agentscope_flow.py deleted file mode 100644 index 99467196..00000000 --- a/astune/workflow_controller/agentscope_flow.py +++ /dev/null @@ -1,105 +0,0 @@ -import threading -import importlib -import torch -import copy -import asyncio -from astune.env_service_client.env_client import EnvClient -from astune.workflow_controller.basic_agentflow import BaseAgentFlow -from astune.schema.trajectory import Reward, Trajectory -from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage, replace_token_ids, CMTLinear -from astune.schema.trajectory import Sample, Reward -from typing import Any, Dict, List, Union, Tuple -from astune.context_manager.agentscope_cm.cmt_agentscope import ASTuneProxy -from astune.schema.task import Task, TaskLaunchCoreArgument - -log_generate_lock = threading.Lock() - -class AgentScopeWorkflow(BaseAgentFlow): - - def execute(self, init_messages: List[dict], env: EnvClient, task_core_arg: TaskLaunchCoreArgument) -> CMTLinear: - obs_window = task_core_arg.obs_window - task_thread_index = task_core_arg.task_thread_index - task_batch_index = task_core_arg.task_batch_index - task_tag = task_core_arg.task_tag - task_id = task_core_arg.task_id - - # fetch learn protocol - protocol = self.config.astune.rollout.agentscope_learn_protocol - module_, class_ = protocol.split('->') - protocol_cls: AgentScopeLearnProtocol = getattr(importlib.import_module(module_), class_) - agentscope_protocol = protocol_cls(trainer='astune-trinity', agentflow_name='appworld') # type: ignore - - def env_step_fn(action: dict) -> Tuple[str, float, bool, dict]: - obs_window['step'][task_thread_index] += 1 - env_output = env.step( - instance_id=task_core_arg.task_env_uuid, - action=action, - ) - obs = "" - assert isinstance(env_output, dict) - if ('content' not in env_output["state"]) and ('error' in env_output["state"]): - obs = f"[Error from environment: {env_output['error']}]" - elif (env_output["state"]['content']==""): - obs = 'Warning: the environment does not provide any feedback, please provide valid inpu and try again.' - else: - obs = env_output["state"]['content'] - reward = 0 - info = {} - terminate = env_output["is_terminated"] - return obs, reward, terminate, info - def should_interrupt_fn() -> bool: - if (obs_window['stop'] is not None) and obs_window['stop'][task_thread_index]: # Check if the thread should stop (because other threads have completed, making this thread useless) - return True - return False - def generated_token_callback_fn(token_array): - with log_generate_lock: - obs_window['token'][task_thread_index] += len(token_array) - - astune_proxy = ASTuneProxy( - llm_chat_fn=self.llm_chat_fn, - tokenizer=self.tokenizer, - config=self.config, - model_name='astune-proxy', - api_key='dummy-api-key', - task_batch_index=task_batch_index, - task_tag=task_tag, - task_id=task_id, - env_step_fn=env_step_fn, - should_interrupt_fn=should_interrupt_fn, - generated_token_callback_fn=generated_token_callback_fn, - ) - - astune_proxy.update_agentscope_input_dictionary(task_core_arg=task_core_arg) - astune_proxy = asyncio.run(agentscope_protocol.agentscope_execute(init_messages, astune_proxy, self.config)) - astune_proxy.update_judge_input_dictionary(task_core_arg=task_core_arg) - astune_proxy.update_judge_input_dictionary(env=env) - astune_proxy.update_judge_input_dictionary(grouped_steps=astune_proxy.grouped_steps) - judge_input_dictionary = astune_proxy.get_judge_input_dictionary() - - # get reward - if 'raw_reward' in judge_input_dictionary and 'is_success' in judge_input_dictionary: - raw_reward = judge_input_dictionary['raw_reward'] - is_success = judge_input_dictionary['is_success'] - else: - raw_reward, is_success = astune_proxy.get_judge().compute_reward(judge_input_dictionary) - - # evaluate - reward = Reward( - raw_reward=raw_reward, - raw_step_reward=None, - success_rate=1.0 if is_success else 0.0, - madness=0, - description="" - ) - astune_proxy.process_reward(reward) - - # generate token before merging - astune_proxy.remove_last_context() - astune_proxy.task_id = task_id - astune_proxy.task_tag = task_tag - astune_proxy.group_merge() - astune_proxy.process_reward(reward) - return astune_proxy - - diff --git a/astune/workflow_controller/basic_agentflow.py b/astune/workflow_controller/basic_agentflow.py deleted file mode 100644 index 1185cf8e..00000000 --- a/astune/workflow_controller/basic_agentflow.py +++ /dev/null @@ -1,22 +0,0 @@ -from astune.context_manager.cmt_linear import CMTLinear, ExtendedMessage -from astune.context_manager.agentflow_cm.cmt_linear_think import LinearThinkCMT -from typing import Any, Dict, List, Union, Callable - -class BaseAgentFlow(object): - - def __init__(self, - llm_chat_fn: Callable, - tokenizer: Any, - config, - **kwargs): - self.tokenizer = tokenizer - self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") - self.response_template_ids = self.tokenizer.encode("<|im_start|>assistant\n") - self.cmt: Union[CMTLinear, LinearThinkCMT, Any, None] = None - self.alien_llm_chat_fn: Union[Callable, None] = None - self.llm_chat_fn: Callable = llm_chat_fn - self.config = config - # self.console_debug_mode: bool = False - self.max_steps: int = self.config.astune.rollout.multi_turn.max_steps - self.max_model_len: int = self.config.astune.rollout.max_model_len - self.max_env_len: int = self.config.astune.rollout.max_env_len \ No newline at end of file diff --git a/astune_tests/__init__.py b/astune_tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/astune_tests/test_apply_chat_template.py b/astune_tests/test_apply_chat_template.py new file mode 100644 index 00000000..e69de29b diff --git a/astune_tests/test_apply_chat_template/__init__.py b/astune_tests/test_apply_chat_template/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/astune_tests/test_apply_chat_template/agentscope_for_test.py b/astune_tests/test_apply_chat_template/agentscope_for_test.py new file mode 100644 index 00000000..40d45b04 --- /dev/null +++ b/astune_tests/test_apply_chat_template/agentscope_for_test.py @@ -0,0 +1,97 @@ +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from astune.utils.testing_utils import GoodbyeException, TestFailException +from agentscope.message import Msg +from pydantic import BaseModel, Field +from loguru import logger +from beast_logger import print_dict + +def extract_final_answer(result) -> str: + """Extract the final answer from the agent's response.""" + try: + if ( + hasattr(result, "metadata") + and isinstance(result.metadata, dict) + and "result" in result.metadata + ): + return result.metadata["result"] + if hasattr(result, "content"): + if isinstance(result.content, dict) and "result" in result.content: + return result.content["result"] + return str(result.content) + return str(result) + except Exception as e: + logger.warning(f"Extract final answer error: {e}. Raw: {result}") + return str(result) + + +class FinalResult(BaseModel): + result: str = Field( + description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" + ) + + +system_prompt = """ +You are an agent specialized in solving math problems with tools. +Please solve the math problem given to you. +You can write and execute Python code to perform calculation or verify your answer. +You should return your final answer within \\boxed{{}}. +""" + + +class ExampleMathLearn(Workflow): + + name: str = "math_agent_workflow" + + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + + query = "A robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?" + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=model_tuner, + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg, structured_model=FinalResult) + final_answer = extract_final_answer(result) + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + + +class TEST_LAMBDA(object): + def __init__(self): + pass + + def __call__(self, key, value): + if key == "prompt_text": + expected = '<|im_start|>system\n\nYou are an agent specialized in solving math problems with tools.\nPlease solve the math problem given to you.\nYou can write and execute Python code to perform calculation or verify your answer.\nYou should return your final answer within \\boxed{{}}.\n\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n\n{"type": "function", "function": {"name": "execute_python_code", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}, "description": "Execute the given python code in a temp file and capture the return\\n\\ncode, standard output and error. Note you must `print` the output to get\\nthe result, and the tmp file will be removed right after the execution."}}\n{"type": "function", "function": {"name": "generate_response", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\\\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}, "description": "Generate a response. Note only the input argument `response` is\\n\\nvisible to the others, you should include all the necessary\\ninformation in the `response` argument."}}\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{"name": , "arguments": }\n<|im_end|>\n<|im_start|>user\nA robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?<|im_end|>\n<|im_start|>assistant\n' + if value != expected: + print_dict({ + "expected": expected, + "value": value, + "key": key, + }) + raise TestFailException("Prompt text does not match expected value.") + elif key == "parsed_tool_calls": + if len(value) > 0: + raise GoodbyeException("Test passed!") + else: + raise TestFailException("No tool calls parsed when some were expected.") + else: + raise TestFailException(f"Unrecognized test key: {key}") + + def mock(self, key): + if key == "mock_decoded_text": + return 'To find the total number of bolts needed for the robe, we need to add the number of blue fiber bolts to the number of white fiber bolts. According to the problem, a robe takes 2 bolts of blue fiber and half that much white fiber. Therefore, the number of white fiber bolts is half of 2, which is 1. \n\nLet\'s calculate the total number of bolts.\n\n{"name": "execute_python_code", "arguments": {"code": "blue_fiber_bolts = 2\\nwhite_fiber_bolts = blue_fiber_bolts / 2\\ntotal_bolts = blue_fiber_bolts + white_fiber_bolts\\ntotal_bolts"}}\n\nresponse = "The total number of bolts needed for the robe is {}."\nresult = "\\\\boxed{3}"\n\n{"name": "generate_response", "arguments": {"response": "The total number of bolts needed for the robe is 3.", "result": "\\\\boxed{3}"}}\n<|im_end|>' + else: + raise TestFailException(f"Unrecognized mock key: {key}") \ No newline at end of file diff --git a/astune_tests/test_apply_chat_template/test.yaml b/astune_tests/test_apply_chat_template/test.yaml new file mode 100644 index 00000000..28ccf3e7 --- /dev/null +++ b/astune_tests/test_apply_chat_template/test.yaml @@ -0,0 +1,51 @@ +# ------------------ 主要配置 ------------------ +astune: + project_name: test + experiment_name: test_apply_chat_template_01 + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + huggingface_dat_repo: + dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' + training_split: "train" + validation_split: "test" + + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + agentscope_learn_protocol: "astune_tests.test_apply_chat_template.agentscope_for_test->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 1.0 + max_env_worker: 1 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + trainer_common: + total_epochs: 1 + num_repeat: 2 + train_batch_size: 8 + + execute_test: "test_apply_chat_template_01" # DO NOT EDIT, FOR TESTING PURPOSE ONLY + execute_testing_lambda: "astune_tests.test_apply_chat_template.agentscope_for_test->TEST_LAMBDA" # ✨✨✨✨ 编写并选择Agent + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ diff --git a/astune_tests/test_tracing.py b/astune_tests/test_tracing.py new file mode 100644 index 00000000..53b843a2 --- /dev/null +++ b/astune_tests/test_tracing.py @@ -0,0 +1,42 @@ +import json +from pathlib import Path +from typing import List + +import pytest + +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task + + +@pytest.fixture +def config(tmp_path: Path) -> dict: + return { + "astune": { + "base_url": ".trash/database.sqlite", + "train_output_path": str(tmp_path / "tasks.jsonl"), + } + } + + +reader = TracingReader(config) # type: ignore +reader._connector = connector # type: ignore[attr-defined] +reader._filters = [flt] # type: ignore[attr-defined] + +result = reader.get_training_tasks() + +# connector should be called once +assert connector.called == 1 + +# filter should receive all new tasks +assert flt.last_input == tasks + +# returned tasks should be exactly the filtered ones +assert result == tasks + +# file should be created with one json per line +out_path = Path(config["train_output_path"]) +assert out_path.exists() +with out_path.open("r", encoding="utf-8") as f: + lines = [json.loads(line) for line in f if line.strip()] +assert len(lines) == 2 +assert {obj["metadata"]["qa_hash"] for obj in lines} == {"h1", "h2"} diff --git a/astune_tests/test_tracing_reader.py b/astune_tests/test_tracing_reader.py new file mode 100644 index 00000000..d94c5798 --- /dev/null +++ b/astune_tests/test_tracing_reader.py @@ -0,0 +1,149 @@ +import pytest +from pathlib import Path +from typing import List +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task + + +class DummyConnector: + def __init__(self, tasks: List[Task]): + self._tasks = tasks + self.called = 0 + + def load_tasks_from_conversation( + self, projects_limit: int = 100, spans_limit: int = 100 + ) -> List[Task]: + self.called += 1 + return self._tasks + + +class DummyFilter: + def __init__(self, kept: List[Task]): + self._kept = kept + self.last_input: List[Task] | None = None + + def filter(self, tasks: List[Task]) -> List[Task]: + self.last_input = list(tasks) + return self._kept + + +def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: + metadata = {"answer": answer} + if qa_hash is not None: + metadata["qa_hash"] = qa_hash + return Task( + main_query=query, + task_id="tid", + env_type="env", + metadata=metadata, + ) + + +# @pytest.fixture +# def config(tmp_path: Path) -> dict: +# from astune.utils.config_utils import read_astune_config +# return read_astune_config('tutorial/example_math_agent/math_agent.yaml') # type: ignore + + +# def test_get_training_tasks_new_file(config: dict): +# from types import SimpleNamespace +# from astune.task_reader.tracing_reader import TracingReader, Config +# from astune.schema.task import Task +# from dotenv import load_dotenv; load_dotenv() + +# # t=SimpleNamespace() +# # t.astune=SimpleNamespace() + +# tr=TracingReader(config) +# print(tr.get_training_tasks()) + + +# prepare tests/database.sqlite from agentscope first + +import json +from pathlib import Path +from types import SimpleNamespace +from typing import List + +import pytest + +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task + + +@pytest.fixture +def config(tmp_path: Path) -> SimpleNamespace: + a = SimpleNamespace() + a.astune = SimpleNamespace() + a.astune.tracing = { + "base_url": "./.trash/database.sqlite", + "train_output_path": str(tmp_path / "tasks.jsonl"), + "filters": [], + } + return a + + +@pytest.fixture +def config_with_filter(tmp_path: Path) -> SimpleNamespace: + a = SimpleNamespace() + a.astune = SimpleNamespace() + a.astune.tracing = { + "base_url": "./.trash/database.sqlite", + "train_output_path": str(tmp_path / "tasks.jsonl"), + "filters": [ + { + "type": "llm_evaluate", + "enabled": True, + "params": { + "custom_rubrics": "If the answer claims that it has written the output to a file, consider it an invalid response.", + "temperature": 0.5, + "max_tokens": 2048, + "print_reason": False, + }, + } + ], + } + return a + + +def test_get_training_tasks_new_file(config: SimpleNamespace): + from dotenv import load_dotenv + + load_dotenv() + # prepare tasks returned from connector + reader = TracingReader(config, train_ratio=0.7) # type: ignore + + result = reader.get_training_tasks() + # the number of tasks in tests/database.sqlite + assert len(result) == int(7 * 0.7) + + # file should be created with one json per line + out_path = Path(config.astune.tracing["train_output_path"]) + assert out_path.exists() + with out_path.open("r", encoding="utf-8") as f: + lines = [json.loads(line) for line in f if line.strip()] + assert len(lines) == 7 # the number of tasks in tests/database.sqlite + + +def test_get_training_tasks_with_filter( + config_with_filter: SimpleNamespace, config: SimpleNamespace +): + from dotenv import load_dotenv + + load_dotenv() + reader = TracingReader(config_with_filter) # type: ignore + + result = reader.get_training_tasks() + assert len(result) < int(7 * 0.7) + + reader_full = TracingReader(config) + result_full = reader_full.get_training_tasks() + + # find the diff + delta = [] + for task in result_full: + if task not in result: + delta.append(task) + + assert len(delta) > 1 + print("these tasks are filtered:", delta) diff --git a/astune_tests/test_utils/read_config_from_yaml.py b/astune_tests/test_utils/read_config_from_yaml.py new file mode 100644 index 00000000..b6bd8d9a --- /dev/null +++ b/astune_tests/test_utils/read_config_from_yaml.py @@ -0,0 +1,6 @@ +def read_yaml_config(file_path: str) -> dict: + import yaml + + with open(file_path, "r") as file: + config = yaml.safe_load(file) + return config diff --git a/documents/tokenizer_nodes.md b/documents/tokenizer_nodes.md index 798e7170..287106ab 100644 --- a/documents/tokenizer_nodes.md +++ b/documents/tokenizer_nodes.md @@ -129,4 +129,4 @@ sold half as many clips in May. How many clips did Natalia sell altogether in April and May? <|im_end|> <|im_start|>assistant -``` \ No newline at end of file +``` diff --git a/documents/vllm_tokenizer.py b/documents/vllm_tokenizer.py index 73ffc906..c333415f 100644 --- a/documents/vllm_tokenizer.py +++ b/documents/vllm_tokenizer.py @@ -245,9 +245,7 @@ def test_parse_chat_messages_single_image( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(mm_data, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) @@ -279,9 +277,7 @@ def test_parse_chat_messages_single_image_with_uuid( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(mm_data, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) @@ -311,9 +307,7 @@ def test_parse_chat_messages_single_empty_image_with_uuid( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(mm_data, 1, skipped_image_indices=[0]) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) @@ -346,9 +340,7 @@ def test_parse_chat_messages_single_image_with_bad_uuid_format( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(mm_data, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) @@ -511,9 +503,7 @@ async def test_parse_chat_messages_single_image_with_uuid_async( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(await mm_future, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) @@ -544,9 +534,7 @@ async def test_parse_chat_messages_empty_image_with_uuid_async( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(await mm_future, 1, skipped_image_indices=[0]) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) @@ -715,7 +703,10 @@ def test_parse_chat_messages_empty_system( ) assert conversation == [ {"role": "system", "content": [{"type": "text", "text": ""}]}, - {"role": "user", "content": [{"type": "text", "text": "Who are you?"}]}, + { + "role": "user", + "content": [{"type": "text", "text": "Who are you?"}], + }, ] @@ -740,9 +731,7 @@ async def test_parse_chat_messages_single_image_async( content_format="string", ) - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in the image?"} - ] + assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] _assert_mm_data_is_image_input(await mm_future, 1) _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) @@ -821,7 +810,11 @@ def test_parse_chat_messages_empty_image_embeds_with_uuid( { "role": "user", "content": [ - {"type": "image_embeds", "image_embeds": None, "uuid": uuid}, + { + "type": "image_embeds", + "image_embeds": None, + "uuid": uuid, + }, {"type": "text", "text": "What's in this image?"}, ], } @@ -854,7 +847,11 @@ async def test_parse_chat_messages_empty_image_embeds_with_uuid_async( { "role": "user", "content": [ - {"type": "image_embeds", "image_embeds": None, "uuid": uuid}, + { + "type": "image_embeds", + "image_embeds": None, + "uuid": uuid, + }, {"type": "text", "text": "What's in this image?"}, ], } @@ -1128,7 +1125,10 @@ def test_parse_chat_messages_rejects_too_many_images_in_one_message( "type": "image_url", "image_url": {"url": image_url}, }, - {"type": "text", "text": "What's in these images?"}, + { + "type": "text", + "text": "What's in these images?", + }, ], } ], @@ -1547,7 +1547,10 @@ def test_parse_chat_messages_multiple_modals_with_uuids_multiple_messages_interl _assert_mm_data_inputs(mm_data, {"image": 2, "video": 1, "audio": 1}) _assert_mm_uuids( - mm_uuids, 2, modality="image", expected_uuids=["image_123", "image_123"] + mm_uuids, + 2, + modality="image", + expected_uuids=["image_123", "image_123"], ) _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=["audio_123"]) @@ -1623,7 +1626,10 @@ def test_parse_chat_messages_multiple_modals_with_uuids_multiple_empty_media_mes skipped_media_indices={"image": [0, 1], "video": [0], "audio": [0]}, ) _assert_mm_uuids( - mm_uuids, 2, modality="image", expected_uuids=["image_123", "image_123"] + mm_uuids, + 2, + modality="image", + expected_uuids=["image_123", "image_123"], ) _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=["audio_123"]) @@ -1864,9 +1870,7 @@ def test_resolve_hf_chat_template_kwargs(sample_json_schema, model, expected_kwa tools=tools, model_config=model_config, ) - with pytest.raises( - ValueError, match="Found unexpected chat template kwargs from request" - ): + with pytest.raises(ValueError, match="Found unexpected chat template kwargs from request"): # should raise error if `chat_template_kwargs` contains # `chat_template` or `tokenize` resolve_chat_template_kwargs( @@ -1889,9 +1893,11 @@ def test_resolve_hf_chat_template_kwargs(sample_json_schema, model, expected_kwa hf_base_params = _get_hf_base_chat_template_params() # Verify common HF parameters are in the base class - assert {"add_generation_prompt", "tools", "continue_final_message"}.issubset( - hf_base_params - ), f"Expected HF base params not found in {hf_base_params}" + assert { + "add_generation_prompt", + "tools", + "continue_final_message", + }.issubset(hf_base_params), f"Expected HF base params not found in {hf_base_params}" # Test with a mock tokenizer that uses **kwargs (like Kimi K2) class MockTokenizerWithKwargs: @@ -2093,9 +2099,7 @@ def test_resolve_content_format_examples(template_path, expected_format): assert resolved_format == expected_format -def test_parse_chat_messages_include_thinking_chunk( - mistral_model_config, mistral_tokenizer -): +def test_parse_chat_messages_include_thinking_chunk(mistral_model_config, mistral_tokenizer): messages = [ { "role": "system", @@ -2184,9 +2188,7 @@ def test_apply_mistral_chat_template_thinking_chunk(): }, {"role": "user", "content": "Thanks, what is 3+3?"}, ] - mistral_tokenizer = MistralTokenizer.from_pretrained( - "mistralai/Magistral-Small-2509" - ) + mistral_tokenizer = MistralTokenizer.from_pretrained("mistralai/Magistral-Small-2509") tokens_ids = apply_mistral_chat_template( mistral_tokenizer, messages, chat_template=None, tools=None @@ -2234,8 +2236,7 @@ def test_parse_chat_messages_single_empty_audio_with_uuid( assert conversation == [ { "role": "user", - "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " - "audio say?", + "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " "audio say?", } ] _assert_mm_data_inputs(mm_data, {"audio": 1}) @@ -2270,9 +2271,8 @@ async def test_parse_chat_messages_single_empty_audio_with_uuid_async( assert conversation == [ { "role": "user", - "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " - "audio say?", + "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " "audio say?", } ] _assert_mm_data_inputs(await mm_future, {"audio": 1}) - _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[audio_uuid]) \ No newline at end of file + _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[audio_uuid]) diff --git a/launcher.py b/launcher.py index 85601a53..0840b4a4 100644 --- a/launcher.py +++ b/launcher.py @@ -6,82 +6,95 @@ import sys import os from loguru import logger -from dotenv import load_dotenv; load_dotenv() -from astune.utils.cleaner import _fast_kill_by_keyword_bash +from astune.utils.pty import pty_launch +from astune.utils.cleaner import fast_kill_by_keyword_bash from astune.utils.smart_daemon import LaunchCommandWhenAbsent -from astune.utils.config_utils import read_astune_config, dump_yaml_config +from astune.utils.config_utils import prepare_experiment_config +from astune.utils.launch_utils import start_ray_service, launch_logview, execute_training_process +from dotenv import load_dotenv +load_dotenv() def parse_args(): - parser = argparse.ArgumentParser(description='BA Launcher') - - parser.add_argument('--backbone', + parser = argparse.ArgumentParser(description="BA Launcher") + parser.add_argument( + "--backbone", type=str, default="trinity", required=False, - help='verl or trinity or debug' + help="verl or trinity or debug", ) - parser.add_argument('--conf', + parser.add_argument( + "--conf", type=str, default="", required=False, - help='Path to configuration file' + help="Path to configuration file", ) - parser.add_argument('--db', + parser.add_argument( + "--exp-dir", type=str, - default="", + default="launcher_record", required=False, - help='Path to configuration file' + help="Path to experiment directory", ) - parser.add_argument('--with-exp-maker', - action='store_true', - default=False, - help='Launch exp maker' - ) - parser.add_argument('--with-ray', - action='store_true', - default=False, - help='Launch ray' + parser.add_argument( + "--db", + type=str, + default="", + required=False, + help="Path to configuration file", ) - parser.add_argument('--with-appworld', - action='store_true', + parser.add_argument( + "--with-exp-maker", + action="store_true", default=False, - help='Launch appworld' + help="Launch exp maker", ) - parser.add_argument('--with-webshop', - action='store_true', + parser.add_argument("--with-ray", action="store_true", default=False, help="Launch ray") + parser.add_argument( + "--with-appworld", + action="store_true", default=False, - help='Launch webshop' + help="Launch appworld", ) - parser.add_argument('--with-bfcl', - action='store_true', + parser.add_argument( + "--with-webshop", + action="store_true", default=False, - help='Launch bfcl' + help="Launch webshop", ) - parser.add_argument('--with-logview', - action='store_true', + parser.add_argument("--with-bfcl", action="store_true", default=False, help="Launch bfcl") + parser.add_argument( + "--with-logview", + action="store_true", default=False, - help='Launch logview' + help="Launch logview", ) - parser.add_argument('--with-crafters', - action='store_true', + parser.add_argument( + "--with-crafters", + action="store_true", default=False, - help='Launch Crafters Env Simulation' + help="Launch Crafters Env Simulation", ) - parser.add_argument('--reboot', - action='store_true', + parser.add_argument( + "--dry-run", + action="store_true", default=False, - help='reboot flag' + help="Skip launching services and training (test/smoke mode)", ) - parser.add_argument('--kill', + parser.add_argument("--reboot", action="store_true", default=False, help="reboot flag") + parser.add_argument( + "--kill", type=str, default="", required=False, - help='list of keywords for killing processes' + help="list of keywords for killing processes", ) - return parser.parse_args() + + def check_debugpy_version(): try: import debugpy @@ -91,9 +104,9 @@ def check_debugpy_version(): "Ray Debugpy Debugger will not work without 'debugpy>=1.8.0' installed. " "Install this module using 'pip install debugpy>=1.8.0'" ) - version = getattr(debugpy, '__version__', '0.0.0') + version = getattr(debugpy, "__version__", "0.0.0") from packaging import version as packaging_version - if packaging_version.parse(version) < packaging_version.parse('1.8.0'): + if packaging_version.parse(version) < packaging_version.parse("1.8.0"): raise RuntimeError( f"debugpy version {version} is too old. " "Ray Debugpy Debugger requires 'debugpy>=1.8.0'. " @@ -102,299 +115,15 @@ def check_debugpy_version(): logger.info(f"✓ debugpy version {version} meets requirement (>=1.8.0)") -def pty_launch(service_name: str, success_std_string="Starting server on"): - service_path = os.environ.get(f'{service_name.upper()}_PATH') - service_script = os.environ.get(f'{service_name.upper()}_SCRIPT') - if service_path is None or service_script is None: - raise ValueError(f"Environment variables for {service_name} not properly set.") - companion = LaunchCommandWhenAbsent( - full_argument_list=[service_script], - dir=service_path, - tag="appworld_env_service", - use_pty=True - ) - companion.launch( - launch_wait_time=1800, - success_std_string=success_std_string, - ) - -def prepare_experiment_config(yaml_path, args): - """ - Prepare experiment configuration by reading YAML, setting up backup directories, - and copying necessary files for the experiment. - - Args: - yaml_path: Path to the YAML configuration file - args: Command line arguments - - Returns: - tuple: (yaml_backup_dst, exe_exp_base, exe_yaml_path, exp_name) - """ - assert yaml_path.endswith('.yaml'), "Configuration file must be a YAML file" - exp_base = os.path.dirname(yaml_path) - - if not os.path.exists(exp_base): - raise FileNotFoundError(f"Configuration file not found: {exp_base}") - - ## 0. read yaml (get astune.experiment_name) - with open(yaml_path, 'r') as file: - config = yaml.safe_load(file) - exp_name = config.get('astune').get('experiment_name') - if exp_name is None or exp_name == 'read_yaml_name': - if exp_name is not None: exp_name = exp_name.replace('|', '-') - exp_name = os.path.basename(yaml_path).replace('.yaml', '') - else: - exp_name = exp_name.replace('|', '-') - - logger.info('----------------------------------------') - backup_dir = os.path.join('launcher_record', exp_name, 'backup') - yaml_backup_dst = os.path.join('launcher_record', exp_name, 'yaml_backup.yaml') - exe_yaml_path = yaml_backup_dst - exe_exp_base = os.path.dirname(yaml_backup_dst) - logger.info(f'Experiment Name: {exp_name}') - logger.info(f'Experiment Backup Dir: {backup_dir}') - logger.info(f'Experiment Yaml Dir: {yaml_backup_dst}') - logger.info('----------------------------------------') - time.sleep(2) - - ## 1. check exp_base/backup exist - if not os.path.exists(backup_dir): - os.makedirs(backup_dir) - else: - total_seconds = 5 - for i in range(total_seconds): - logger.warning(f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds...") - time.sleep(1) - - ## 2. copy files to backup - BACK_TARGETS = os.environ.get('BACK_TARGETS', '').split(',') - BACK_TARGETS = [p for p in BACK_TARGETS if os.path.exists(p)] - - for backup_target in BACK_TARGETS: - logger.info(f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}") - shutil.copytree(backup_target, os.path.join(backup_dir, os.path.basename(backup_target)), dirs_exist_ok=True) - - ## 3. copy yaml to backup - yaml_backup_src = yaml_path - shutil.copyfile(yaml_backup_src, yaml_backup_dst) - - ## 4. edit new yaml - yaml_path = yaml_backup_dst - with open(yaml_path, 'r') as file: - config = yaml.safe_load(file) - config['astune']['experiment_name'] = exp_name - config['astune']['backbone'] = args.backbone - - # remove extra config of verl for trinity - if args.backbone == "debug": - config['defaults'].remove('ppo_trainer') - config['defaults'].remove('trinity_default') - config['hydra']['searchpath'].remove('file://astune/default_config/trinity') - config['hydra']['searchpath'].remove('file://external/verl/verl/trainer/config') - # remove extra config of verl for trinity - if args.backbone == "trinity": - config['defaults'].remove('ppo_trainer') - config['defaults'].remove('verl_default') - config['hydra']['searchpath'].remove('file://external/verl/verl/trainer/config') - config['hydra']['searchpath'].remove('file://astune/default_config/verl') - # remove extra config of trinity for verl - if args.backbone == "verl": # or args.backbone == "debug" - config['defaults'].remove('trinity_default') - config['hydra']['searchpath'].remove('file://astune/default_config/trinity') - # yaml dump - with open(yaml_path, 'w') as file: - yaml.dump(config, file) - - # read everything - full_config = read_astune_config(yaml_path) - yaml_path = full_config_path = dump_yaml_config(full_config, yaml_fp=yaml_path) - - - # put inherit info back - with open(yaml_path, 'r') as file: - config_final = yaml.safe_load(file) - config_final['defaults'] = config['defaults'] - config_final['hydra'] = config['hydra'] - - # write inherit info back - with open(yaml_path, 'w') as file: - yaml.dump(config_final, file) - - return yaml_path, exe_exp_base, exe_yaml_path, exp_name, config - -def launch_logview(exp_name=None): - """ - Launch the log viewer service and open the web browser to view logs. - - Args: - exp_name: Optional experiment name. If not provided, "default_experiment" is used. - """ - companion = LaunchCommandWhenAbsent( - full_argument_list=[ - sys.executable, - '-m', - 'web_display.start_web', - ], - dir='./', - tag="logview" - ) - companion.launch(launch_wait_time=1800, success_std_string="Uvicorn running on", env_dict={}) - time.sleep(2.5) - try: - import webbrowser - from datetime import datetime - # Use default experiment name if not set - webbrowser.open("http://127.0.0.1:8181/") - except Exception as e: - logger.error(f"Error opening web browser: {e}") - pass - -def start_ray_service(args, env): - """ - Start a Ray service with appropriate configuration. - - Args: - args: Command line arguments containing debug settings - """ - companion = LaunchCommandWhenAbsent( - full_argument_list=[ - f"source ./.venv/bin/activate && ray start --head --block" - ], - dir='./', - tag="ray_service", - use_pty=True - ) - companion.launch( - launch_wait_time=1800, - success_std_string="Ray runtime started", - env_dict=env, - ) - -import yaml - -def align_parameters(from_config_fp, to_config_fp, convertion_json_fg): - # read yaml files - with open(from_config_fp, 'r') as file: - from_config = yaml.safe_load(file) - with open(to_config_fp, 'r') as file: - to_config = yaml.safe_load(file) - # read convertion json - import json - with open(convertion_json_fg, 'r') as file: - convertion_json = json.load(file) - - logger.success("----------------------------------------------------") - - for from_key, to_keys in convertion_json.items(): - # get value from from_config - keys = from_key.split('.') - value = from_config - for key in keys: - value = value.get(key, None) - if value is None: - break - if value is None: - logger.warning(f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_keys}") - continue - - to_keys = to_keys if isinstance(to_keys, list) else [to_keys] - for to_key in to_keys: - keys = to_key.split('.') - sub_config = to_config - for key in keys[:-1]: - if key not in sub_config: - sub_config[key] = {} - sub_config = sub_config[key] - sub_config[keys[-1]] = value - logger.success(f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]") - time.sleep(0.1) - - logger.success("----------------------------------------------------") - - if 'trinity' in from_config: - trinity_config = from_config['trinity'] - def recursive_copy(src_dict, dst_dict, parent_key=""): - for key, value in src_dict.items(): - full_key = f"{parent_key}.{key}" if parent_key else key - if isinstance(value, dict): - if key not in dst_dict: - dst_dict[key] = {} - recursive_copy(value, dst_dict[key], full_key) - else: - dst_dict[key] = value - logger.info(f"[Note]: Aligned parameter from [trinity.{full_key}] to [{full_key}] with value: [{value}]") - recursive_copy(trinity_config, to_config) - - logger.success("----------------------------------------------------") - - - # save to_config_fp - with open(to_config_fp, 'w') as file: - yaml.dump(to_config, file) - logger.success(f"Saved aligned configuration to {to_config_fp}") - - - - -def execute_training_process(args, backbone_target, yaml_backup_dst, exe_exp_base, exe_yaml_path, env, exp_config): - """ - Execute the training process based on the specified backbone and configuration. - - Args: - args: Command line arguments - backbone_target: The Python module to execute - yaml_backup_dst: Path to the YAML configuration backup - exe_exp_base: Base path for experiment execution - exe_yaml_path: Path to the YAML configuration file - env: Environment variables dictionary - """ - # let's begin the training process - if args.backbone == "trinity": - # replace boot yaml - trinity_boot_yaml = "astune/default_config/trinity/trinity_launch.yaml" # THIS ONE IS READ ONLY, and ALWAYS FIXED - redirect_trinity_boot_yaml = os.path.dirname(yaml_backup_dst) + '/trinity_launch.yaml' - shutil.copyfile(trinity_boot_yaml, redirect_trinity_boot_yaml) - align_parameters(yaml_backup_dst, redirect_trinity_boot_yaml, 'astune/default_config/trinity/config_auto_convertion_trinity.json') - cmd = [ - sys.executable, - '-m', backbone_target, - 'run', '--config', redirect_trinity_boot_yaml - ] - else: - align_parameters(yaml_backup_dst, yaml_backup_dst, 'astune/default_config/verl/config_auto_convertion_verl.json') - cmd = [ - sys.executable, - '-m', backbone_target, - '--config-path', os.path.abspath(exe_exp_base), - '--config-name', os.path.basename(exe_yaml_path), - ] - - if args.with_logview: - env.update({ - 'BEST_LOGGER_WEB_SERVICE_URL': - os.environ.get('BEST_LOGGER_WEB_SERVICE_URL', 'http://127.0.0.1:8181/') - }) - - try: - logger.info(f"Running command: {' '.join(cmd)}") - subprocess.run(cmd, check=True, cwd=os.path.abspath('./'), env=env) - except subprocess.CalledProcessError as e: - logger.error(f"Error running subprocess: {e}") - sys.exit(1) - except Exception as e: - logger.error(f"Unexpected error: {e}") - sys.exit(1) - - def main(): args = parse_args() # Handle kill-keywords argument if provided if args.kill: logger.info(f"Killing processes matching keywords: {args.kill}") - for keyword in args.kill.split('|'): + for keyword in args.kill.split("|"): logger.info(f"Killing processes matching keyword: {keyword}") - killed_pids = _fast_kill_by_keyword_bash(keyword) + killed_pids = fast_kill_by_keyword_bash(keyword) if killed_pids: logger.success(f"Successfully killed processes with PIDs: {killed_pids}") else: @@ -405,7 +134,6 @@ def main(): backbone_target = "astune.main_trinity" # Default to trinity main_yaml_fp = None exe_exp_base = None - exe_yaml_path = None exp_name = None env = os.environ.copy() @@ -417,22 +145,30 @@ def main(): backbone_target = "astune.main_trinity" exp_config = None + exp_dir = args.exp_dir or "launcher_record" if args.conf: yaml_path = args.conf - main_yaml_fp, exe_exp_base, exe_yaml_path, exp_name, exp_config = prepare_experiment_config(yaml_path, args) + ( + main_yaml_fp, + exe_exp_base, + exp_name, + exp_config, + ) = prepare_experiment_config(yaml_path, exp_dir, args.backbone) if args.db: env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.db env["RAY_record_task_actor_creation_sites"] = "true" + assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") + assert exp_config["astune"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": - env['ASTUNE_CONFIG_REDIRECT'] = main_yaml_fp # type: ignore + env["ASTUNE_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore if args.backbone == "debug": - env['ASTUNE_DEBUG'] = '1' # type: ignore + env["ASTUNE_DEBUG"] = "1" # type: ignore if args.with_ray: start_ray_service(args, env) @@ -455,8 +191,27 @@ def main(): if args.with_logview: launch_logview(exp_name) - if args.conf and main_yaml_fp and exe_exp_base and exe_yaml_path: - execute_training_process(args, backbone_target, main_yaml_fp, exe_exp_base, exe_yaml_path, env, exp_config) + if args.conf and main_yaml_fp and exe_exp_base and exp_config: + if args.dry_run: + logger.info("Dry-run enabled: skipping training process launch.") + return { + "yaml": main_yaml_fp, + "exp_base": exe_exp_base, + "exp_yaml_name": os.path.basename(main_yaml_fp), + "exp_name": exp_config.get("astune", {}).get("experiment_name"), + } + else: + execute_training_process( + args, + backbone_target, + main_yaml_fp, + exe_exp_base, + main_yaml_fp, + env, + exp_config, + ) + + if __name__ == "__main__": check_debugpy_version() diff --git a/launcher/werewolves_agent/git-rpg-agentscope.yaml b/launcher/werewolves_agent/git-rpg-agentscope.yaml deleted file mode 100644 index 5787a9f3..00000000 --- a/launcher/werewolves_agent/git-rpg-agentscope.yaml +++ /dev/null @@ -1,47 +0,0 @@ -# ------------------ 主要配置 ------------------ -astune: - task_reader: - type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` - - task_judge: - # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: null - - model: - # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - - rollout: - agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 6 - - debug: - debug_max_parallel: 1 - debug_first_n_tasks: 1 - - data: - max_prompt_length: 15000 - max_response_length: 3000 - train_batch_size: 32 - -trinity: - algorithm: - repeat_times: 6 - buffer: - train_batch_size: 42 - -# ------------------ 不需要修改 ------------------ -hydra: - searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only - - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only - -# ------------------ 不需要修改 ------------------ -defaults: - - ppo_trainer # verl inherit 1/2 - - verl_default # verl inherit 2/2 - - trinity_default # trinity inherit 1/1 - - astune_default - - _self_ diff --git a/pyrightconfig.json b/pyrightconfig.json index bfc3649e..c22f6296 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -1,10 +1,11 @@ { - "logLevel": "Trace", + "logLevel": "Debug", "include": [ "astune/**/*.py", "external/trinity/**/*.py", + "external/verl/**/*.py", // ".venv/lib/python3.10/site-packages/**/*.py", - ".venv/lib/python3.10/site-packages/agentscope/**/*.py" + // ".venv/lib/python3.10/site-packages/agentscope/**/*.py" ], "exclude": [ "node_modules", @@ -17,10 +18,10 @@ "outputs", "wanlog", "wandb", - "dist", + "dist" // "**/.vscode-server", // "**/__pycache__", // "**/*.log", - "**/*" + // "**/*" ] -} \ No newline at end of file +} diff --git a/scripts/converter_hf_to_mcore.py b/scripts/converter_hf_to_mcore.py index 897b0f8a..e7061083 100644 --- a/scripts/converter_hf_to_mcore.py +++ b/scripts/converter_hf_to_mcore.py @@ -22,7 +22,9 @@ from megatron.core import parallel_state as mpu from megatron.core.dist_checkpointing.serialization import StrictHandling from megatron.core.models.gpt.gpt_model import ModelType -from megatron.core.tensor_parallel.random import model_parallel_cuda_manual_seed +from megatron.core.tensor_parallel.random import ( + model_parallel_cuda_manual_seed, +) from transformers import AutoConfig, AutoModelForCausalLM from verl.models.mcore import hf_to_mcore_config @@ -31,11 +33,29 @@ def _init_args(): parser = argparse.ArgumentParser() - parser.add_argument("--hf_model_path", type=str, required=True, help="The path for the huggingface model") - parser.add_argument("--output_path", type=str, required=True, help="The path for the output mcore model") - parser.add_argument("--use_cpu_initialization", action="store_true", help="Whether to use cpu initialization") + parser.add_argument( + "--hf_model_path", + type=str, + required=True, + help="The path for the huggingface model", + ) + parser.add_argument( + "--output_path", + type=str, + required=True, + help="The path for the output mcore model", + ) + parser.add_argument( + "--use_cpu_initialization", + action="store_true", + help="Whether to use cpu initialization", + ) parser.add_argument("--test", action="store_true", help="Whether to test the conversion") - parser.add_argument("--trust_remote_code", action="store_true", help="Whether to trust remote code") + parser.add_argument( + "--trust_remote_code", + action="store_true", + help="Whether to trust remote code", + ) args = parser.parse_args() return args @@ -75,7 +95,9 @@ def test_conversion(megatron_model_provider, tfconfig, output_path, model): dut_data = dut_state_dict[name].data if name in ref_state_dict: ref_data = ref_state_dict[name].data - assert dut_data.shape == ref_state_dict.shape, f"{name=} {dut_data.shape=} {ref_data.shape=}" + assert ( + dut_data.shape == ref_state_dict.shape + ), f"{name=} {dut_data.shape=} {ref_data.shape=}" assert (dut_data == ref_data).all(), f"{name} is not equal" print(f"{name} is equal") else: @@ -102,14 +124,22 @@ def convert_checkpoint_from_transformers_to_megatron(hf_model, model, hf_config) head_dim = getattr(hf_config, "head_dim", hidden_dim // num_attention_heads) if num_attention_heads != num_key_value_heads: print("[WARNING] Converting GQA model") - has_qkv_bias = getattr(hf_config, "qkv_bias", False) or getattr(hf_config, "attention_bias", False) + has_qkv_bias = getattr(hf_config, "qkv_bias", False) or getattr( + hf_config, "attention_bias", False + ) has_share_expert = getattr(hf_config, "shared_expert_intermediate_size", None) with torch.no_grad(): model.embedding.word_embeddings.weight.copy_(hf_model.model.embed_tokens.weight) for layer, hf_layer in zip(model.decoder.layers, hf_model.model.layers): layer.self_attention.linear_qkv.layer_norm_weight.copy_(hf_layer.input_layernorm.weight) - q = hf_layer.self_attn.q_proj.weight.view([num_key_value_heads, head_dim * num_attention_heads // num_key_value_heads, -1]) + q = hf_layer.self_attn.q_proj.weight.view( + [ + num_key_value_heads, + head_dim * num_attention_heads // num_key_value_heads, + -1, + ] + ) k = hf_layer.self_attn.k_proj.weight.view([num_key_value_heads, head_dim, -1]) v = hf_layer.self_attn.v_proj.weight.view([num_key_value_heads, head_dim, -1]) qkv = torch.cat([q, k, v], dim=1).view(-1, hidden_dim).contiguous() @@ -134,13 +164,22 @@ def convert_checkpoint_from_transformers_to_megatron(hf_model, model, hf_config) for idx, hf_expert in enumerate(hf_layer.mlp.experts): fc1_weight = torch.cat([hf_expert.gate_proj.weight, hf_expert.up_proj.weight]) layer.mlp.experts.linear_fc1._parameters[f"weight{idx}"].copy_(fc1_weight) - layer.mlp.experts.linear_fc2._parameters[f"weight{idx}"].copy_(hf_expert.down_proj.weight) + layer.mlp.experts.linear_fc2._parameters[f"weight{idx}"].copy_( + hf_expert.down_proj.weight + ) if has_share_expert: layer.mlp.shared_experts.gate_weight.copy_(hf_layer.mlp.shared_expert_gate.weight) - shared_fc1_weight = torch.cat([hf_layer.mlp.shared_expert.gate_proj.weight, hf_layer.mlp.shared_expert.up_proj.weight]) + shared_fc1_weight = torch.cat( + [ + hf_layer.mlp.shared_expert.gate_proj.weight, + hf_layer.mlp.shared_expert.up_proj.weight, + ] + ) layer.mlp.shared_experts.linear_fc1.weight.copy_(shared_fc1_weight) - layer.mlp.shared_experts.linear_fc2.weight.copy_(hf_layer.mlp.shared_expert.down_proj.weight) + layer.mlp.shared_experts.linear_fc2.weight.copy_( + hf_layer.mlp.shared_expert.down_proj.weight + ) model.decoder.final_layernorm.weight.copy_(hf_model.model.norm.weight) model.output_layer.weight.copy_(hf_model.lm_head.weight) @@ -157,7 +196,9 @@ def safe_copy( ): if not skip_dtype_assert: if src_tensor.dtype != dst_tensor.dtype: - raise ValueError(f"Get source dtype {src_tensor.dtype}, but target dtype {dst_tensor.dtype}") + raise ValueError( + f"Get source dtype {src_tensor.dtype}, but target dtype {dst_tensor.dtype}" + ) assert src_tensor.shape == dst_tensor.shape dst_tensor.data.copy_(src_tensor.data) return src_tensor.numel() @@ -172,22 +213,39 @@ def safe_copy( else: layer.self_attention.linear_q_down_proj.weight.copy_(hf_layer.self_attn.q_a_proj.weight) layer.self_attention.linear_q_up_proj.weight.copy_(hf_layer.self_attn.q_b_proj.weight) - layer.self_attention.linear_q_up_proj.layer_norm_weight.copy_(hf_layer.self_attn.q_a_layernorm.weight) + layer.self_attention.linear_q_up_proj.layer_norm_weight.copy_( + hf_layer.self_attn.q_a_layernorm.weight + ) - layer.self_attention.linear_kv_down_proj.weight.copy_(hf_layer.self_attn.kv_a_proj_with_mqa.weight) + layer.self_attention.linear_kv_down_proj.weight.copy_( + hf_layer.self_attn.kv_a_proj_with_mqa.weight + ) layer.self_attention.linear_kv_up_proj.weight.copy_(hf_layer.self_attn.kv_b_proj.weight) - layer.self_attention.linear_kv_up_proj.layer_norm_weight.copy_(hf_layer.self_attn.kv_a_layernorm.weight) + layer.self_attention.linear_kv_up_proj.layer_norm_weight.copy_( + hf_layer.self_attn.kv_a_layernorm.weight + ) layer.self_attention.linear_proj.weight.copy_(hf_layer.self_attn.o_proj.weight) if not hasattr(layer.mlp, "router"): layer.mlp.linear_fc1.layer_norm_weight.copy_(hf_layer.post_attention_layernorm.weight) - layer.mlp.linear_fc1.weight.copy_(torch.cat([hf_layer.mlp.gate_proj.weight, hf_layer.mlp.up_proj.weight])) + layer.mlp.linear_fc1.weight.copy_( + torch.cat( + [ + hf_layer.mlp.gate_proj.weight, + hf_layer.mlp.up_proj.weight, + ] + ) + ) layer.mlp.linear_fc2.weight.copy_(hf_layer.mlp.down_proj.weight) else: layer.mlp.router.weight.copy_(hf_layer.mlp.gate.weight) # NOTE: the e_score_correction_bias in mcore model will be initialized with bfloat16 and \ # recover to fp32 in the first forward. There is always a diff in the bias between two models (~0.3%) - safe_copy(hf_layer.mlp.gate.e_score_correction_bias, layer.mlp.router.expert_bias, skip_dtype_assert=True) + safe_copy( + hf_layer.mlp.gate.e_score_correction_bias, + layer.mlp.router.expert_bias, + skip_dtype_assert=True, + ) if tfconfig.moe_grouped_gemm: for i, hf_expert in enumerate(hf_layer.mlp.experts): fc1_weight = torch.cat([hf_expert.gate_proj.weight, hf_expert.up_proj.weight]) @@ -202,16 +260,29 @@ def safe_copy( expert.linear_fc1.weight.copy_(fc1_weight) expert.linear_fc2.weight.copy_(hf_expert.down_proj.weight) layer.pre_mlp_layernorm.weight.copy_(hf_layer.post_attention_layernorm.weight) - shared_fc1_weight = torch.cat([hf_layer.mlp.shared_experts.gate_proj.weight, hf_layer.mlp.shared_experts.up_proj.weight]) + shared_fc1_weight = torch.cat( + [ + hf_layer.mlp.shared_experts.gate_proj.weight, + hf_layer.mlp.shared_experts.up_proj.weight, + ] + ) layer.mlp.shared_experts.linear_fc1.weight.copy_(shared_fc1_weight) - layer.mlp.shared_experts.linear_fc2.weight.copy_(hf_layer.mlp.shared_experts.down_proj.weight) + layer.mlp.shared_experts.linear_fc2.weight.copy_( + hf_layer.mlp.shared_experts.down_proj.weight + ) model.decoder.final_layernorm.weight.copy_(hf_model.model.norm.weight) if not hf_config.tie_word_embeddings: model.output_layer.weight.copy_(hf_model.lm_head.weight) -def convert_hf_to_mcore(hf_model_path, output_path, use_cpu_initialization=False, test=False, trust_remote_code=False): +def convert_hf_to_mcore( + hf_model_path, + output_path, + use_cpu_initialization=False, + test=False, + trust_remote_code=False, +): os.makedirs(output_path, exist_ok=True) if len(os.listdir(output_path)) > 0 and not test: print(f"Output path {output_path} is not empty, skipping conversion") @@ -266,19 +337,27 @@ def megatron_model_provider(pre_process, post_process): warnings.simplefilter("ignore") # init hf model - hf_model = AutoModelForCausalLM.from_pretrained(hf_model_path, torch_dtype=torch.bfloat16, trust_remote_code=trust_remote_code) + hf_model = AutoModelForCausalLM.from_pretrained( + hf_model_path, + torch_dtype=torch.bfloat16, + trust_remote_code=trust_remote_code, + ) hf_state_dict = hf_model.state_dict() # load hf state dict to megatron model if "Qwen2MoeForCausalLM" in hf_config.architectures: convert_checkpoint_from_transformers_to_megatron(hf_model, model[0].module, hf_config) elif "DeepseekV3ForCausalLM" in hf_config.architectures: - convert_checkpoint_from_transformers_to_megatron_dpskv3(hf_model, model[0].module, hf_config, tfconfig=tfconfig) + convert_checkpoint_from_transformers_to_megatron_dpskv3( + hf_model, model[0].module, hf_config, tfconfig=tfconfig + ) elif "Qwen3MoeForCausalLM" in hf_config.architectures: convert_checkpoint_from_transformers_to_megatron(hf_model, model[0].module, hf_config) else: assert not use_cpu_initialization, "use_cpu_initialization is only supported for MoE model" - from verl.models.mcore.loader import load_state_dict_to_megatron_gptmodel + from verl.models.mcore.loader import ( + load_state_dict_to_megatron_gptmodel, + ) load_state_dict_to_megatron_gptmodel( state_dict=hf_state_dict, @@ -293,11 +372,22 @@ def megatron_model_provider(pre_process, post_process): # save megatron model if len(os.listdir(output_path)) == 0: - dist_checkpointing.save(megatron_state_dict, output_path, sharded_strategy=None, async_sharded_save=False) + dist_checkpointing.save( + megatron_state_dict, + output_path, + sharded_strategy=None, + async_sharded_save=False, + ) if test: test_conversion(megatron_model_provider, tfconfig, output_path, model) if __name__ == "__main__": args = _init_args() - convert_hf_to_mcore(args.hf_model_path, args.output_path, args.use_cpu_initialization, args.test, args.trust_remote_code) + convert_hf_to_mcore( + args.hf_model_path, + args.output_path, + args.use_cpu_initialization, + args.test, + args.trust_remote_code, + ) diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py new file mode 100644 index 00000000..b0e4962d --- /dev/null +++ b/scripts/deploy_model.py @@ -0,0 +1,76 @@ +import argparse +import torch +import os +import sys + +sys.path.append(os.getcwd()) +from astune.utils.smart_daemon import LaunchCommandWhenAbsent + + +parser = argparse.ArgumentParser(description="deploy Hugging Face model") +parser.add_argument( + "--target", + default="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", + type=str, + help="要下载的数据集仓库名称", +) +parser.add_argument("--port", default="2888", type=str, help="端口") +args = parser.parse_args() + + +def companion_launch(): + + print("Launching companion process for async LLM server...") + model_path = args.target + n_avail_gpus = torch.cuda.device_count() + tensor_parallel_size = n_avail_gpus + if tensor_parallel_size > n_avail_gpus: + print( + f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." + ) + tensor_parallel_size = n_avail_gpus + gpu_memory_utilization = 0.95 + # max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs + # max_model_len = config.astune.rollout.max_model_len + # seed = config.astune.debug.debug_vllm_seed + # vllm_port = config.astune.debug.debug_vllm_port + vllm_port = args.port + companion = LaunchCommandWhenAbsent( + full_argument_list=[ + sys.executable, + "-m", + f"vllm.entrypoints.cli.main", + f"serve", + f"{model_path}", + f"--tensor-parallel-size", + f"{tensor_parallel_size}", + f"--dtype", + f"auto", + f"--enforce-eager", + f"--gpu-memory-utilization", + f"{gpu_memory_utilization}", + f"--disable-custom-all-reduce", + # f"--max-num-seqs", f"{max_num_seqs}", + # f"--max-model-len", f"{max_model_len}", + f"--load-format", + "auto", + f"--enable-chunked-prefill", + f"--enable-auto-tool-choice", + f"--tool-call-parser", + "hermes", + f"--enable-prefix-caching", + # f"--seed", f"{seed}", + f"--port", + f"{vllm_port}", + ], + dir="./", + tag="api_vllm_server", + ) + companion.launch( + launch_wait_time=1800, + success_std_string="Application startup complete", + env_dict={**os.environ}, + ) + + +companion_launch() diff --git a/scripts/diagnose.py b/scripts/diagnose.py index 174b1f9b..b9fe2343 100644 --- a/scripts/diagnose.py +++ b/scripts/diagnose.py @@ -64,7 +64,11 @@ def test_connection(name, url, timeout=10): print("Error open {}: {}, {}, DNS finished in {} sec.".format(name, url, e, dns_elapsed)) return load_elapsed = time.time() - start - print("Timing for {}: {}, DNS: {:.4f} sec, LOAD: {:.4f} sec.".format(name, url, dns_elapsed, load_elapsed)) + print( + "Timing for {}: {}, DNS: {:.4f} sec, LOAD: {:.4f} sec.".format( + name, url, dns_elapsed, load_elapsed + ) + ) def check_python(): @@ -88,7 +92,12 @@ def check_pip(): def _get_current_git_commit(): try: - result = subprocess.run(["git", "rev-parse", "HEAD"], capture_output=True, text=True, check=True) + result = subprocess.run( + ["git", "rev-parse", "HEAD"], + capture_output=True, + text=True, + check=True, + ) return result.stdout.strip() except subprocess.CalledProcessError as e: print(f"Error running git command: {e.stderr.strip()}") @@ -162,7 +171,10 @@ def check_network(args): else: import warnings - warnings.warn("Region {} do not need specific test, please refer to global sites.".format(r), stacklevel=2) + warnings.warn( + "Region {} do not need specific test, please refer to global sites.".format(r), + stacklevel=2, + ) for name, url in URLS.items(): test_connection(name, url, args.timeout) @@ -170,7 +182,13 @@ def check_network(args): def check_environment(): print("----------Environment----------") for k, v in os.environ.items(): - if k.startswith("VERL_") or k.startswith("OMP_") or k.startswith("KMP_") or k == "CC" or k == "CXX": + if ( + k.startswith("VERL_") + or k.startswith("OMP_") + or k.startswith("KMP_") + or k == "CC" + or k == "CXX" + ): print('{}="{}"'.format(k, v)) @@ -192,7 +210,10 @@ def check_cuda_versions(): import subprocess nvcc_output = subprocess.check_output(["nvcc", "--version"]).decode("utf-8") - cuda_compiler_version = next((line for line in nvcc_output.splitlines() if "release" in line), None) + cuda_compiler_version = next( + (line for line in nvcc_output.splitlines() if "release" in line), + None, + ) if cuda_compiler_version: print(f"CUDA Compiler : {cuda_compiler_version.strip()}") else: @@ -219,7 +240,11 @@ def _get_gpu_info(): """ try: result = subprocess.run( - ["nvidia-smi", "--query-gpu=gpu_name,memory.total", "--format=csv,noheader,nounits"], + [ + "nvidia-smi", + "--query-gpu=gpu_name,memory.total", + "--format=csv,noheader,nounits", + ], capture_output=True, text=True, check=True, @@ -247,7 +272,11 @@ def _get_system_info(): """ cpu_memory = _get_cpu_memory() gpu_count, gpu_info = _get_gpu_info() - return {"cpu_memory": cpu_memory, "gpu_count": gpu_count, "gpu_info": gpu_info} + return { + "cpu_memory": cpu_memory, + "gpu_count": gpu_count, + "gpu_info": gpu_info, + } def check_system_info(): @@ -268,7 +297,12 @@ def parse_args(): ) choices = ["python", "pip", "verl", "system", "os", "environment"] for choice in choices: - parser.add_argument("--" + choice, default=1, type=int, help="Diagnose {}.".format(choice)) + parser.add_argument( + "--" + choice, + default=1, + type=int, + help="Diagnose {}.".format(choice), + ) parser.add_argument("--network", default=0, type=int, help="Diagnose network.") parser.add_argument("--hardware", default=0, type=int, help="Diagnose hardware.") parser.add_argument( @@ -278,7 +312,12 @@ def parse_args(): help="Additional sites in which region(s) to test. \ Specify 'cn' for example to test mirror sites in China.", ) - parser.add_argument("--timeout", default=10, type=int, help="Connection test timeout threshold, 0 to disable.") + parser.add_argument( + "--timeout", + default=10, + type=int, + help="Connection test timeout threshold, 0 to disable.", + ) args = parser.parse_args() return args diff --git a/scripts/download_dataset.py b/scripts/download_dataset.py index 4ab8d45e..26805221 100644 --- a/scripts/download_dataset.py +++ b/scripts/download_dataset.py @@ -1,40 +1,57 @@ -import os; os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 必须放在第一行 +import os + +os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # 必须放在第一行 import argparse import glob import time from huggingface_hub import snapshot_download -parser = argparse.ArgumentParser(description='download Hugging Face dataset') -parser.add_argument('--target', default='openai/gsm8k', type=str, help='要下载的数据集仓库名称') -parser.add_argument('--path', default='/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k', type=str, help='路径到下载的本地目录') +parser = argparse.ArgumentParser(description="download Hugging Face dataset") +parser.add_argument("--target", default="openai/gsm8k", type=str, help="要下载的数据集仓库名称") +parser.add_argument( + "--path", + default="/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k", + type=str, + help="路径到下载的本地目录", +) args = parser.parse_args() -snapshot_download(repo_id=args.target, repo_type="dataset", local_dir=args.path, resume_download=True) +snapshot_download( + repo_id=args.target, + repo_type="dataset", + local_dir=args.path, + resume_download=True, +) time.sleep(2) from beast_logger import print_list + downloaded = [] -for item in glob.glob(os.path.join(args.path, '**', '*')): +for item in glob.glob(os.path.join(args.path, "**", "*")): downloaded += [os.path.abspath(item)] -print_list(downloaded, header='downloaded files') +print_list(downloaded, header="downloaded files") + def display_dataset(dataset_name, dataset_iter, header): from beast_logger import print_listofdict + data = [] for sample in dataset_iter: s = dict(sample) data.append(s) print_listofdict(data[:5], header=header) + try: import datasets - dataset_iter = datasets.load_dataset(args.path, name='main', split='train') - display_dataset(args.target, dataset_iter, header='train') - dataset_iter = datasets.load_dataset(args.path, name='main', split='test') - display_dataset(args.target, dataset_iter, header='test') + + dataset_iter = datasets.load_dataset(args.path, name="main", split="train") + display_dataset(args.target, dataset_iter, header="train") + dataset_iter = datasets.load_dataset(args.path, name="main", split="test") + display_dataset(args.target, dataset_iter, header="test") except Exception as e: print(f"Error loading dataset {args.target}: {e}") -# python -m scripts.download_dataset --path='/root/data/gsm8k' --target='openai/gsm8k' \ No newline at end of file +# python -m scripts.download_dataset --path='/root/data/gsm8k' --target='openai/gsm8k' diff --git a/scripts/download_model.py b/scripts/download_model.py index 30dcdec7..79f74668 100644 --- a/scripts/download_model.py +++ b/scripts/download_model.py @@ -1,13 +1,13 @@ - ms = input("modelscope ? (Y/n)") -if ms == "Y" or ms =="y": +if ms == "Y" or ms == "y": from modelscope import snapshot_download from loguru import logger + cache_dir = input("model path ( /mnt/data/model_cache/modelscope/hub/Qwen ): ").strip() if not cache_dir: - cache_dir = '/mnt/data/model_cache/modelscope/hub/Qwen' + cache_dir = "/mnt/data/model_cache/modelscope/hub/Qwen" res = snapshot_download(input("model name: ").strip(), cache_dir=cache_dir) logger.success(res) @@ -15,9 +15,10 @@ import os import subprocess - os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' + + os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" repo_name = input("model name: ").strip() - command = ['huggingface-cli', 'download', '--resume-download', repo_name] + command = ["huggingface-cli", "download", "--resume-download", repo_name] process = subprocess.run(command, env=os.environ, check=True) if process.returncode == 0: print(f"成功下载 {repo_name}") @@ -25,4 +26,4 @@ print(f"下载 {repo_name} 失败") # python -m scripts.download_model -# Qwen/Qwen3-0.6B \ No newline at end of file +# Qwen/Qwen3-0.6B diff --git a/scripts/model_merger.py b/scripts/model_merger.py index 3bd25cae..581cb214 100644 --- a/scripts/model_merger.py +++ b/scripts/model_merger.py @@ -99,7 +99,9 @@ def __init__(self, config: ModelMergerConfig): self.hf_model_config_path = config.hf_model_config_path if config.hf_model_path: - print("Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. ") + print( + "Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. " + ) self.hf_model_config_path = config.hf_model_path self.model_config = AutoConfig.from_pretrained(self.hf_model_config_path) @@ -123,9 +125,13 @@ def patch_model_generation_config(self, model): """ if model.can_generate(): try: - model.generation_config = GenerationConfig.from_pretrained(self.hf_model_config_path) + model.generation_config = GenerationConfig.from_pretrained( + self.hf_model_config_path + ) except OSError: - print(f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config.") + print( + f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config." + ) return model def save_hf_model_and_tokenizer(self, state_dict: dict[str, torch.Tensor]): @@ -153,8 +159,16 @@ def upload_to_huggingface(self): from huggingface_hub import HfApi api = HfApi() - api.create_repo(repo_id=self.config.hf_upload_path, private=self.config.private, exist_ok=True) - api.upload_folder(folder_path=self.config.target_dir, repo_id=self.config.hf_upload_path, repo_type="model") + api.create_repo( + repo_id=self.config.hf_upload_path, + private=self.config.private, + exist_ok=True, + ) + api.upload_folder( + folder_path=self.config.target_dir, + repo_id=self.config.hf_upload_path, + repo_type="model", + ) @abstractmethod def merge_and_save(self): @@ -168,12 +182,20 @@ def _get_world_size(self) -> int: match = re.match(r"model_world_size_(\d+)_rank_0\.pt", filename) if match: return int(match.group(1)) - raise FileNotFoundError(f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}") + raise FileNotFoundError( + f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}" + ) def _load_rank_zero_state_dict(self, world_size: int) -> dict: - return torch.load(Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", map_location="cpu", weights_only=False) + return torch.load( + Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", + map_location="cpu", + weights_only=False, + ) - def _extract_device_mesh_info(self, state_dict: dict, world_size: int) -> tuple[np.ndarray, tuple[str, ...]]: + def _extract_device_mesh_info( + self, state_dict: dict, world_size: int + ) -> tuple[np.ndarray, tuple[str, ...]]: """ Retrieves sharding information (device_mesh, mesh_dim_names) from a DTensor in the state_dict. If no DTensor is found, infers a simple FSDP mesh based on world_size. @@ -193,9 +215,14 @@ def _extract_device_mesh_info(self, state_dict: dict, world_size: int) -> tuple[ return mesh, mesh_dim_names - def _calculate_shard_configuration(self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...]) -> tuple[int, tuple[int, ...]]: + def _calculate_shard_configuration( + self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...] + ) -> tuple[int, tuple[int, ...]]: """Calculates the total number of shards and the shape of the device mesh.""" - assert mesh_dim_names in (("fsdp",), ("ddp", "fsdp")), f"Unsupported mesh_dim_names {mesh_dim_names}" + assert mesh_dim_names in ( + ("fsdp",), + ("ddp", "fsdp"), + ), f"Unsupported mesh_dim_names {mesh_dim_names}" if "tp" in mesh_dim_names: # TODO: "tp" is not supported yet due to the above assert @@ -207,7 +234,9 @@ def _calculate_shard_configuration(self, mesh: np.ndarray, mesh_dim_names: tuple return total_shards, mesh_shape - def _merge_by_placement(self, tensors: list[torch.Tensor], placement: Placement) -> torch.Tensor: + def _merge_by_placement( + self, tensors: list[torch.Tensor], placement: Placement + ) -> torch.Tensor: """Merges a list of tensors based on their DTensor placement""" if placement.is_replicate(): return tensors[0] @@ -218,18 +247,33 @@ def _merge_by_placement(self, tensors: list[torch.Tensor], placement: Placement) raise NotImplementedError(f"Unsupported placement: {placement}") - def _load_and_merge_state_dicts(self, world_size: int, total_shards: int, mesh_shape: tuple[int, ...], mesh_dim_names: tuple[str, ...]) -> dict[str, torch.Tensor]: + def _load_and_merge_state_dicts( + self, + world_size: int, + total_shards: int, + mesh_shape: tuple[int, ...], + mesh_dim_names: tuple[str, ...], + ) -> dict[str, torch.Tensor]: model_state_dict_lst = [None] * total_shards def process_one_shard(rank: int, model_state_dict_lst: list): - model_path = Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" + model_path = ( + Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" + ) state_dict = torch.load(model_path, map_location="cpu", weights_only=False) model_state_dict_lst[rank] = state_dict return state_dict with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [executor.submit(process_one_shard, rank, model_state_dict_lst) for rank in range(total_shards)] - for future in tqdm(futures, desc=f"Loading {total_shards} FSDP shards", total=total_shards): + futures = [ + executor.submit(process_one_shard, rank, model_state_dict_lst) + for rank in range(total_shards) + ] + for future in tqdm( + futures, + desc=f"Loading {total_shards} FSDP shards", + total=total_shards, + ): future.result() # Merge state dicts from all shards @@ -289,7 +333,9 @@ def merge_and_save(self): total_shards, mesh_shape = self._calculate_shard_configuration(mesh, mesh_dim_names) print(f"Processing model shards with {total_shards} {mesh_shape} in total") - merged_state_dict = self._load_and_merge_state_dicts(world_size, total_shards, mesh_shape, mesh_dim_names) + merged_state_dict = self._load_and_merge_state_dicts( + world_size, total_shards, mesh_shape, mesh_dim_names + ) if self.config.operation == "test": if not self.config.test_hf_dir: @@ -305,7 +351,9 @@ def merge_and_save(self): def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): auto_model_class = self.get_transformers_auto_model_class() - hf_model = auto_model_class.from_pretrained(self.config.test_hf_dir, torch_dtype=torch.bfloat16) + hf_model = auto_model_class.from_pretrained( + self.config.test_hf_dir, torch_dtype=torch.bfloat16 + ) hf_state_dict = hf_model.state_dict() del hf_model @@ -313,28 +361,40 @@ def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): collected_keys = set(state_dict.keys()) missing_keys = hf_model_keys - collected_keys - assert len(missing_keys) == 0, f"Missing keys in collected state dict: {list(sorted(missing_keys))}" + assert ( + len(missing_keys) == 0 + ), f"Missing keys in collected state dict: {list(sorted(missing_keys))}" extra_keys = collected_keys - hf_model_keys - assert len(extra_keys) == 0, f"Extra keys in collected state dict: {list(sorted(extra_keys))}" + assert ( + len(extra_keys) == 0 + ), f"Extra keys in collected state dict: {list(sorted(extra_keys))}" for key in hf_model_keys: hf_shape = hf_state_dict[key].shape collected_shape = state_dict[key].shape - assert hf_shape == collected_shape, f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" + assert ( + hf_shape == collected_shape + ), f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" hf_dtype = hf_state_dict[key].dtype collected_dtype = state_dict[key].dtype - assert hf_dtype == collected_dtype, f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" + assert ( + hf_dtype == collected_dtype + ), f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" torch.testing.assert_close(hf_state_dict[key], state_dict[key], atol=1e-6, rtol=1e-6) - print("FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager.") + print( + "FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager." + ) class MegatronModelMerger(BaseModelMerger): def __init__(self, config: ModelMergerConfig): - from verl.utils.megatron_utils import get_hf_config_and_tokenizer_checkpoint_path + from verl.utils.megatron_utils import ( + get_hf_config_and_tokenizer_checkpoint_path, + ) config.hf_model_config_path = get_hf_config_and_tokenizer_checkpoint_path(config.local_dir) super().__init__(config) @@ -355,13 +415,22 @@ def _check_megatron_checkpoint_path(self, model_path: str) -> tuple[list[str], i pp_size = 0 sharded_dirs = sorted(os.listdir(model_path)) for sharded_dir in sharded_dirs: - assert "model.pt" in os.listdir(Path(model_path) / sharded_dir), f"model.pt not found in {sharded_dir}" + assert "model.pt" in os.listdir( + Path(model_path) / sharded_dir + ), f"model.pt not found in {sharded_dir}" tp_rank, pp_rank = self._get_tp_pp_rank_from_sharded_dir(sharded_dir) tp_size = max(tp_size, tp_rank + 1) pp_size = max(pp_size, pp_rank + 1) return sharded_dirs, tp_size, pp_size - def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: PretrainedConfig, tp_size: int, is_value_model: bool = False) -> torch.Tensor | list[torch.Tensor]: + def _merge_across_tp( + self, + key: str, + tp_data: list[torch.Tensor], + config: PretrainedConfig, + tp_size: int, + is_value_model: bool = False, + ) -> torch.Tensor | list[torch.Tensor]: if "linear_fc1.weight" in key: # if the tensor is gate and proj gate_lst = [] @@ -384,7 +453,11 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra num_q_per_kv = config.num_attention_heads // config.num_key_value_heads assert tp_data[0].shape[0] % (num_q_per_kv + 2) == 0 kv_size_per_tp = tp_data[0].shape[0] // (num_q_per_kv + 2) - split_size = [kv_size_per_tp * num_q_per_kv, kv_size_per_tp, kv_size_per_tp] + split_size = [ + kv_size_per_tp * num_q_per_kv, + kv_size_per_tp, + kv_size_per_tp, + ] for infer_param in tp_data: num_query_groups_per_partition = config.num_key_value_heads // tp_size @@ -412,7 +485,13 @@ def _merge_across_tp(self, key: str, tp_data: list[torch.Tensor], config: Pretra dim = 1 return torch.cat(tp_data, dim=dim) - def _load_state_dicts(self, model_ckpt_path: str, sharded_dirs: list[str], tp_size: int, pp_size: int) -> list[list[dict]]: + def _load_state_dicts( + self, + model_ckpt_path: str, + sharded_dirs: list[str], + tp_size: int, + pp_size: int, + ) -> list[list[dict]]: model_state_dict_lst = [[None for _ in range(tp_size)] for _ in range(pp_size)] def _process_one_megatron_shard(sharded_dir: str): @@ -422,13 +501,25 @@ def _process_one_megatron_shard(sharded_dir: str): model_state_dict_lst[pp_rank][tp_rank] = state_dict with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [executor.submit(_process_one_megatron_shard, sharded_dir) for sharded_dir in sharded_dirs] - for future in tqdm(futures, desc=f"Loading {len(sharded_dirs)} Megatron shards", total=len(sharded_dirs)): + futures = [ + executor.submit(_process_one_megatron_shard, sharded_dir) + for sharded_dir in sharded_dirs + ] + for future in tqdm( + futures, + desc=f"Loading {len(sharded_dirs)} Megatron shards", + total=len(sharded_dirs), + ): future.result() return model_state_dict_lst - def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: int, pp_size: int) -> dict[str, torch.Tensor]: + def _merge_state_dicts( + self, + model_state_dict_lst: list[list[dict]], + tp_size: int, + pp_size: int, + ) -> dict[str, torch.Tensor]: state_dict = {} vpp_size = len(model_state_dict_lst[0][0]) layers_cum = 0 @@ -453,8 +544,17 @@ def _merge_state_dicts(self, model_state_dict_lst: list[list[dict]], tp_size: in new_key_list[2] = str(global_layer_no) new_key = ".".join(new_key_list) - tp_data = [model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] for tp_rank in range(tp_size)] - merged = self._merge_across_tp(new_key, tp_data, self.model_config, tp_size, self.config.is_value_model) + tp_data = [ + model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] + for tp_rank in range(tp_size) + ] + merged = self._merge_across_tp( + new_key, + tp_data, + self.model_config, + tp_size, + self.config.is_value_model, + ) if not isinstance(merged, list): state_dict[new_key] = merged @@ -476,9 +576,13 @@ def merge_and_save(self): model_ckpt_path = get_model_checkpoint_path(self.config.local_dir) sharded_dirs, tp_size, pp_size = self._check_megatron_checkpoint_path(model_ckpt_path) - print(f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}") + print( + f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}" + ) - model_state_dict_lst = self._load_state_dicts(model_ckpt_path, sharded_dirs, tp_size, pp_size) + model_state_dict_lst = self._load_state_dicts( + model_ckpt_path, sharded_dirs, tp_size, pp_size + ) merged_state_dict = self._merge_state_dicts(model_state_dict_lst, tp_size, pp_size) del model_state_dict_lst @@ -502,14 +606,26 @@ def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): params_mapping = [ # (megatron core gpt model name, vllm model name) - ("self_attention.linear_qkv.layer_norm_weight", "input_layernorm.weight"), - ("self_attention.linear_qkv.layer_norm_bias", "input_layernorm.bias"), + ( + "self_attention.linear_qkv.layer_norm_weight", + "input_layernorm.weight", + ), + ( + "self_attention.linear_qkv.layer_norm_bias", + "input_layernorm.bias", + ), ("embedding.word_embeddings", "model.embed_tokens"), ("self_attention.linear_qkv", "self_attn.qkv_proj"), ("self_attention.linear_proj", "self_attn.o_proj"), ("pre_mlp_layernorm", "post_attention_layernorm"), - ("mlp.linear_fc1.layer_norm_weight", "post_attention_layernorm.weight"), - ("mlp.linear_fc1.layer_norm_bias", "post_attention_layernorm.bias"), + ( + "mlp.linear_fc1.layer_norm_weight", + "post_attention_layernorm.weight", + ), + ( + "mlp.linear_fc1.layer_norm_bias", + "post_attention_layernorm.bias", + ), ("mlp.linear_fc1", "mlp.gate_up_proj"), ("mlp.linear_fc2", "mlp.down_proj"), ("decoder.final_layernorm", "model.norm"), @@ -540,7 +656,10 @@ def _replace_name(self, megatron_name: str, name_mapping: list[tuple[str, str]]) if "layers" in megatron_name: # deal with decoder layers megatron_name = megatron_name.replace("decoder", "model") megatron_name_list = megatron_name.split(".") - if "layer_norm_weight" in megatron_name_list or "layer_norm_bias" in megatron_name_list: + if ( + "layer_norm_weight" in megatron_name_list + or "layer_norm_bias" in megatron_name_list + ): param_name_list = megatron_name_list[:3] param_name_list.append(v_name) param_name = ".".join(param_name_list) @@ -559,22 +678,77 @@ def _replace_name(self, megatron_name: str, name_mapping: list[tuple[str, str]]) def main(): parser = argparse.ArgumentParser(description="verl model merger") - subparsers = parser.add_subparsers(dest="operation", required=True, help="Specify 'merge' or 'test' operation.") + subparsers = parser.add_subparsers( + dest="operation", + required=True, + help="Specify 'merge' or 'test' operation.", + ) base_op_parser = argparse.ArgumentParser(add_help=False) - base_op_parser.add_argument("--backend", type=str, required=True, choices=["fsdp", "megatron"], help="The backend of the model") - base_op_parser.add_argument("--local_dir", type=str, required=True, help="Path to the saved model checkpoints") - base_op_parser.add_argument("--hf_model_path", type=str, default=None, help="(Deprecated) Path to the original Hugging Face model for config.") - base_op_parser.add_argument("--tie-word-embedding", action="store_true", help="Whether to tie word embedding weights (currently only Megatron supported)") - base_op_parser.add_argument("--is-value-model", action="store_true", help="Whether the model is a value model (currently only Megatron supported)") - - merge_parser = subparsers.add_parser("merge", parents=[base_op_parser], help="Merge model checkpoints and save.") - merge_parser.add_argument("--target_dir", default="tmp", type=str, help="Directory to save the merged huggingface model") - merge_parser.add_argument("--hf_upload_path", default=None, type=str, help="Hugging Face repository ID to upload the model") - merge_parser.add_argument("--private", action="store_true", help="Whether to upload the model to a private Hugging Face repository") - - test_parser = subparsers.add_parser("test", parents=[base_op_parser], help="Test merged model against a reference Hugging Face model") - test_parser.add_argument("--test_hf_dir", type=str, required=True, help="Path to the reference Hugging Face model directory for testing") + base_op_parser.add_argument( + "--backend", + type=str, + required=True, + choices=["fsdp", "megatron"], + help="The backend of the model", + ) + base_op_parser.add_argument( + "--local_dir", + type=str, + required=True, + help="Path to the saved model checkpoints", + ) + base_op_parser.add_argument( + "--hf_model_path", + type=str, + default=None, + help="(Deprecated) Path to the original Hugging Face model for config.", + ) + base_op_parser.add_argument( + "--tie-word-embedding", + action="store_true", + help="Whether to tie word embedding weights (currently only Megatron supported)", + ) + base_op_parser.add_argument( + "--is-value-model", + action="store_true", + help="Whether the model is a value model (currently only Megatron supported)", + ) + + merge_parser = subparsers.add_parser( + "merge", + parents=[base_op_parser], + help="Merge model checkpoints and save.", + ) + merge_parser.add_argument( + "--target_dir", + default="tmp", + type=str, + help="Directory to save the merged huggingface model", + ) + merge_parser.add_argument( + "--hf_upload_path", + default=None, + type=str, + help="Hugging Face repository ID to upload the model", + ) + merge_parser.add_argument( + "--private", + action="store_true", + help="Whether to upload the model to a private Hugging Face repository", + ) + + test_parser = subparsers.add_parser( + "test", + parents=[base_op_parser], + help="Test merged model against a reference Hugging Face model", + ) + test_parser.add_argument( + "--test_hf_dir", + type=str, + required=True, + help="Path to the reference Hugging Face model directory for testing", + ) args = parser.parse_args() diff --git a/scripts/requirements_verl.txt b/scripts/requirements_verl.txt index 4df897ba..68fc0024 100644 --- a/scripts/requirements_verl.txt +++ b/scripts/requirements_verl.txt @@ -293,4 +293,4 @@ xgrammar==0.1.21 xxhash==3.5.0 yarl==1.22.0 zipp==3.23.0 -debugpy>=1.8.0 \ No newline at end of file +debugpy>=1.8.0 diff --git a/scripts/tar_and_copy.sh b/scripts/tar_and_copy.sh index 9cf1a591..7fb3231d 100755 --- a/scripts/tar_and_copy.sh +++ b/scripts/tar_and_copy.sh @@ -1,4 +1,4 @@ cd ../ gtar -cvzf ASTune.tar.gz ASTune #scp ASTune.tar.gz jinli.yl@11.160.132.45:/home/jinli.yl/jinli_mnt2/workspace/ -scp -P 1016 ASTune.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ \ No newline at end of file +scp -P 1016 ASTune.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ diff --git a/scripts/untar.sh b/scripts/untar.sh index c8a7c8af..9ca67474 100644 --- a/scripts/untar.sh +++ b/scripts/untar.sh @@ -1 +1 @@ -rm -rf ASTune && tar -xzvf ASTune.tar.gz \ No newline at end of file +rm -rf ASTune && tar -xzvf ASTune.tar.gz diff --git a/setup.py b/setup.py index 58f29f5a..87add39e 100644 --- a/setup.py +++ b/setup.py @@ -4,4 +4,4 @@ name="astune", # Change this to your package name version="0.1.0", packages=find_packages(), -) \ No newline at end of file +) diff --git a/test_launcher.py b/test_launcher.py new file mode 100644 index 00000000..f2051aab --- /dev/null +++ b/test_launcher.py @@ -0,0 +1,34 @@ +import os +import subprocess +import sys +from beast_logger import print_dict + +TEST_TARGET = "astune_tests/test_apply_chat_template/test.yaml" +cmd = [sys.executable, "launcher.py", "--conf", TEST_TARGET, "--backbone", "verl"] + +from astune.utils.smart_daemon import LaunchCommandWhenAbsent +service_path = os.path.dirname(__file__) +companion = LaunchCommandWhenAbsent( + full_argument_list=cmd, + dir=service_path, + tag="appworld_env_service", +) +test_successful = False +try: + companion.launch( + launch_wait_time=1800, + success_std_string="GoodbyeException", + env_dict=os.environ, + ) + test_successful = True +except Exception as e: + test_successful = False + print(f"Error launching companion: {e}") + sys.exit(1) +finally: + companion.kill_self() + +print_dict({ + "TestTarget": TEST_TARGET, + "TestSuccessful": test_successful, +}) diff --git a/tutorial/appworld.py b/tutorial/appworld.py deleted file mode 100644 index de536670..00000000 --- a/tutorial/appworld.py +++ /dev/null @@ -1,44 +0,0 @@ -from astune.workflow_controller.agentscope_flow import ASTuneProxy -from agentscope.message import Msg -from pydantic import BaseModel, Field -from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol - -class ExampleAgentScopeLearnProtocol(AgentScopeLearnProtocol): - - trainer: str = Field(default="astune-trinity") - - async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config): - from agentscope.agent import ReActAgent - from agentscope.formatter import DashScopeChatFormatter - from agentscope.memory import InMemoryMemory - - if len(init_messages) >= 2: first_msg, init_messages = init_messages[0], init_messages[1:] - else: first_msg = {"content": "You're a helpful assistant."} - interaction_message = [] - for msg in init_messages: - interaction_message.append(Msg(name=msg.get("name", "user"), content=msg.get("content", ""), role=msg.get("role", "user"))) - - agent = ReActAgent( - name="Qwen", - sys_prompt=first_msg['content'], - model=astune_proxy, # type: ignore - formatter=DashScopeChatFormatter(), - memory=InMemoryMemory(), - toolkit=None, - print_hint_msg=False, - ) - agent.set_console_output_enabled(False) - - for _ in range(config.astune.rollout.multi_turn.max_steps): - # agentscope deal with interaction message - reply_message = await agent(interaction_message) - # env service protocol - obs, _, terminate, _ = astune_proxy.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) - # generate new message from env output - interaction_message = Msg(name="env", content=obs, role="user") - # is terminated? - if terminate: break - if astune_proxy.context_overflow: break - - return astune_proxy - diff --git a/tutorial/appworld.md b/tutorial/example_appworld/appworld.md similarity index 83% rename from tutorial/appworld.md rename to tutorial/example_appworld/appworld.md index cf132446..4db6276a 100644 --- a/tutorial/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -27,7 +27,7 @@ for _ in range(config.astune.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol - obs, _, terminate, _ = astune_proxy.env_step_fn(action={"content": reply_message.content, "role": "assistant"}) + obs, _, terminate, _ = astune_proxy.gym_step(action={"content": reply_message.content, "role": "assistant"}) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? @@ -37,7 +37,7 @@ for _ in range(config.astune.rollout.multi_turn.max_steps): ``` - 其中,使用了 astune_proxy 与 agentscope runtime 环境交互的一些接口如下: - - `astune_proxy.env_step_fn` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 + - `astune_proxy.gym_step` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 - `astune_proxy.context_overflow` 查询当前的context窗口是否token溢出 ### 3. 准备Judge (奖励模块) @@ -50,12 +50,12 @@ Judge的返回值: raw_reward, is_success ### 4. 测试 -4.1 复制并修改 [launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml](../launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 +4.1 复制并修改 [tutorial/example_appworld/appworld.yaml](../tutorial/example_appworld/appworld.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 astune.task_reader) -2. 定义 AgentScopeWorkflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/appworld.py` 的`ExampleAgentScopeLearnProtocol` 类 - - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.appworld->ExampleAgentScopeLearnProtocol` + - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol` 3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) - 填写 astune.task_judge.judge_protocol=`astune.task_judge.env_service_as_judge->EnvServiceJudge` 4. 指定模型(对应配置字段 astune.model.path ) @@ -73,7 +73,7 @@ astune: rollout: # ✨✨✨✨ 编写并选择Agent use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol agentscope_disable_toolcalls: True debug: debug_max_parallel: 1 @@ -84,7 +84,7 @@ astune: 4.2 全链路调试(脱离ray快速调试:--backbone='debug') ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) -clear && python launcher.py --conf launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml --backbone='debug' --with-logview +clear && python launcher.py --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: @@ -115,7 +115,7 @@ clear && python launcher.py --conf launcher/appworld_linear_base/git-appworld-qw 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' +python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ``` diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py new file mode 100644 index 00000000..d4df9256 --- /dev/null +++ b/tutorial/example_appworld/appworld.py @@ -0,0 +1,59 @@ +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from agentscope.message import Msg +from pydantic import Field + + +class ExampleAgentScopeLearnProtocol(Workflow): + + trainer: str = Field(default="astune-trinity") + + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + + init_messages = workflow_task.task.init_messages + if len(init_messages) >= 2: + first_msg, init_messages = init_messages[0], init_messages[1:] + else: + first_msg = {"content": "You're a helpful assistant."} + interaction_message = [] + for msg in init_messages: + interaction_message.append( + Msg( + name=msg.get("name", "user"), + content=msg.get("content", ""), + role=msg.get("role", "user"), + ) + ) + + agent = ReActAgent( + name="Qwen", + sys_prompt=first_msg["content"], + model=model_tuner, + formatter=DashScopeChatFormatter(), + memory=InMemoryMemory(), + toolkit=None, + print_hint_msg=False, + ) + agent.set_console_output_enabled(False) + env = workflow_task.gym_env + step = 0 + for step in range(model_tuner.config.astune.rollout.multi_turn.max_steps): + # agentscope deal with interaction message + reply_message = await agent(interaction_message) + # env service protocol + obs, _, terminate, _ = env.step( + action={"content": reply_message.content, "role": "assistant"} + ) + # generate new message from env output + interaction_message = Msg(name="env", content=obs, role="user") + # is terminated? + if terminate: + break + if model_tuner.get_context_tracker().context_overflow: + break + + return WorkflowOutput(reward=None, metadata={"total_step": step}) diff --git a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml b/tutorial/example_appworld/appworld.yaml similarity index 89% rename from launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml rename to tutorial/example_appworld/appworld.yaml index 1d0a7083..f67496cf 100644 --- a/launcher/appworld_linear_base/git-appworld-qwen2-agentscope-bz32-tp4-linear.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -1,6 +1,6 @@ # ------------------ 主要配置 ------------------ astune: - project_name: appworld_astune + project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 @@ -11,7 +11,7 @@ astune: rollout: # ✨✨✨✨ 编写并选择Agent use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.appworld->ExampleAgentScopeLearnProtocol + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol agentscope_disable_toolcalls: True debug: debug_max_parallel: 1 diff --git a/tutorial/math_agent.md b/tutorial/example_math_agent/math_agent.md similarity index 95% rename from tutorial/math_agent.md rename to tutorial/example_math_agent/math_agent.md index 3da07e0c..5099e748 100644 --- a/tutorial/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -69,7 +69,7 @@ Judge的输入参数包含: ```python judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) -judge_input_dictionary['task_core_arg']: 任务信息(如果里面包含了参考答案,可以从中取出) +judge_input_dictionary['workflow_task']: 任务信息(如果里面包含了参考答案,可以从中取出) judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 ``` @@ -80,10 +80,10 @@ Judge的返回值: raw_reward, is_success ### 4. 测试 -4.1 复制并修改 [launcher/math_agent/git-math-agentscope.yaml](../launcher/math_agent/git-math-agentscope.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 +4.1 复制并修改 [tutorial/example_math_agent/math_agent.yaml](../tutorial/example_math_agent/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 astune.task_reader) -2. 定义 AgentScopeWorkflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.math_agent->ExampleMathLearn` 3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) @@ -111,7 +111,7 @@ astune: ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) clear && \ -python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='debug' --with-logview +python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: ```json @@ -140,7 +140,7 @@ python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbon 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf launcher/math_agent/git-math-agentscope.yaml --backbone='trinity' --with-ray +python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` @@ -174,4 +174,4 @@ INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ### 6. 参考训练曲线 点击链接打开训练曲线: -https://swanlab.cn/@binaryhusky/public/runs/96arcunrxlezdmcvmcdob/chart \ No newline at end of file +https://swanlab.cn/@binaryhusky/public/runs/96arcunrxlezdmcvmcdob/chart diff --git a/tutorial/math_agent.py b/tutorial/example_math_agent/math_agent.py similarity index 64% rename from tutorial/math_agent.py rename to tutorial/example_math_agent/math_agent.py index b531e459..3c294f15 100644 --- a/tutorial/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -1,9 +1,9 @@ -from astune.workflow_controller.agentscope_flow import ASTuneProxy +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from pydantic import BaseModel, Field -from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol from loguru import logger + def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" try: @@ -25,41 +25,44 @@ def extract_final_answer(result) -> str: class FinalResult(BaseModel): result: str = Field( - description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" + description=r"Your solution of the given math problem. Put your final answer in boxed format, e.g., \boxed{42}" ) + system_prompt = """ -You are an agent specialized in solving math problems with tools. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. You should return your final answer within \\boxed{{}}. +You are an agent specialized in solving math problems with tools. +Please solve the math problem given to you. +You can write and execute Python code to perform calculation or verify your answer. +You should return your final answer within \\boxed{{}}. """ -class ExampleMathLearn(AgentScopeLearnProtocol): - trainer: str = Field(default="astune-trinity") +class ExampleMathLearn(Workflow): - async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config): + name: str = "math_agent_workflow" + + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory - from agentscope.agent import ReActAgent - from agentscope.memory import InMemoryMemory from agentscope.tool import Toolkit, execute_python_code - query = init_messages[-1]['content'] - + query = workflow_task.task.main_query self.toolkit = Toolkit() self.toolkit.register_tool_function(execute_python_code) self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=astune_proxy, # type: ignore + model=model_tuner, formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), + max_iters=4, ) + self.agent.set_console_output_enabled(False) msg = Msg("user", query, role="user") result = await self.agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) - astune_proxy.update_judge_input_dictionary(final_answer=final_answer) - - return astune_proxy - + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) diff --git a/launcher/math_agent/git-math-agentscope.yaml b/tutorial/example_math_agent/math_agent.yaml similarity index 69% rename from launcher/math_agent/git-math-agentscope.yaml rename to tutorial/example_math_agent/math_agent.yaml index 0a7ab36f..59c77e5c 100644 --- a/launcher/math_agent/git-math-agentscope.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -1,5 +1,6 @@ # ------------------ 主要配置 ------------------ astune: + project_name: example_math_agent task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` # 如果选择 `huggingface_dat_repo` 以下配置生效 @@ -17,17 +18,30 @@ astune: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent + agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 0.7 + max_env_worker: 256 + num_repeat: 8 + agent_madness_reward: -1.0 + tensor_model_parallel_size: 4 + max_num_seqs: 256 + multi_turn: + max_sample_per_task: 4 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" + data: + train_batch_size: 120 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 -trinity: - algorithm: - repeat_times: 6 - buffer: - train_batch_size: 180 + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + # ------------------ 不需要修改 ------------------ hydra: diff --git a/tutorial/werewolves/game.py b/tutorial/example_werewolves/game.py similarity index 95% rename from tutorial/werewolves/game.py rename to tutorial/example_werewolves/game.py index 1a3d1519..6038f3cf 100644 --- a/tutorial/werewolves/game.py +++ b/tutorial/example_werewolves/game.py @@ -3,7 +3,7 @@ """A werewolf game implemented by agentscope.""" import numpy as np -from tutorial.werewolves.utils import ( +from tutorial.example_werewolves.utils import ( majority_vote, names_to_str, EchoAgent, @@ -11,7 +11,7 @@ MAX_DISCUSSION_ROUND, Players, ) -from tutorial.werewolves.structured_model import ( +from tutorial.example_werewolves.structured_model import ( DiscussionModel, get_vote_model, get_poison_model, @@ -19,10 +19,10 @@ get_seer_model, get_hunter_model, ) -# from tutorial.werewolves.prompt import EnglishPrompts as Prompts +from tutorial.example_werewolves.prompt import EnglishPrompts as Prompts # Uncomment the following line to use Chinese prompts -from tutorial.werewolves.prompt import ChinesePrompts as Prompts +# from tutorial.example_werewolves.prompt import ChinesePrompts as Prompts from loguru import logger from agentscope.agent import ReActAgent @@ -34,6 +34,7 @@ moderator = EchoAgent() +moderator.set_console_output_enabled(False) async def hunter_stage( @@ -176,8 +177,7 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # Has poison potion and hasn't used the healing potion if poison and not ( - msg_witch_resurrect - and msg_witch_resurrect.metadata["resurrect"] + msg_witch_resurrect and msg_witch_resurrect.metadata["resurrect"] ): msg_witch_poison = await agent( await moderator( @@ -221,10 +221,7 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # Hunter's turn for agent in players.hunter: # If killed and not by witch's poison - if ( - killed_player == agent.name - and poisoned_player != agent.name - ): + if killed_player == agent.name and poisoned_player != agent.name: shot_player = await hunter_stage(agent, players) # Update alive players @@ -347,7 +344,7 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # ) alive_wolves = players.werewolves - good_guy_win = (len(alive_wolves) == 0) + good_guy_win = len(alive_wolves) == 0 logger.warning(f"**********************************") logger.warning(f"Good guy win: {good_guy_win}, alive werewolves: {alive_wolves}") - return good_guy_win \ No newline at end of file + return good_guy_win diff --git a/tutorial/werewolves/prompt.py b/tutorial/example_werewolves/prompt.py similarity index 83% rename from tutorial/werewolves/prompt.py rename to tutorial/example_werewolves/prompt.py index f33986fc..c3c3472e 100644 --- a/tutorial/werewolves/prompt.py +++ b/tutorial/example_werewolves/prompt.py @@ -31,13 +31,10 @@ class EnglishPrompts: to_wolves_vote = "[WEREWOLVES ONLY] Which player do you vote to kill?" to_wolves_res = ( - "[WEREWOLVES ONLY] The voting result is {}. So you have chosen to " - "eliminate {}." + "[WEREWOLVES ONLY] The voting result is {}. So you have chosen to " "eliminate {}." ) - to_all_witch_turn = ( - "Witch's turn, witch open your eyes and decide your action tonight..." - ) + to_all_witch_turn = "Witch's turn, witch open your eyes and decide your action tonight..." to_witch_resurrect = ( "[WITCH ONLY] {witch_name}, you're the witch, and tonight {dead_name} " "is eliminated. You can resurrect him/her by using your healing " @@ -46,12 +43,8 @@ class EnglishPrompts: "resurrect {dead_name}? Give me your reason and decision." ) - to_witch_resurrect_no = ( - "[WITCH ONLY] The witch has chosen not to resurrect the player." - ) - to_witch_resurrect_yes = ( - "[WITCH ONLY] The witch has chosen to resurrect the player." - ) + to_witch_resurrect_no = "[WITCH ONLY] The witch has chosen not to resurrect the player." + to_witch_resurrect_yes = "[WITCH ONLY] The witch has chosen to resurrect the player." to_witch_poison = ( "[WITCH ONLY] {witch_name}, as a witch, you have a one-time-use " @@ -60,8 +53,7 @@ class EnglishPrompts: ) to_all_seer_turn = ( - "Seer's turn, seer open your eyes and check one player's identity " - "tonight..." + "Seer's turn, seer open your eyes and check one player's identity " "tonight..." ) to_seer = ( @@ -69,9 +61,7 @@ class EnglishPrompts: "tonight. Who do you want to check? Give me your reason and decision." ) - to_seer_result = ( - "[SEER ONLY] You've checked {agent_name}, and the result is: {role}." - ) + to_seer_result = "[SEER ONLY] You've checked {agent_name}, and the result is: {role}." to_hunter = ( "[HUNTER ONLY] {name}, as the hunter you're eliminated tonight. You " @@ -79,9 +69,7 @@ class EnglishPrompts: "not to use this ability. Give me your reason and decision." ) - to_all_hunter_shoot = ( - "The hunter has chosen to shoot {} down with him/herself." - ) + to_all_hunter_shoot = "The hunter has chosen to shoot {} down with him/herself." to_all_day = ( "The day is coming, all players open your eyes. Last night, " @@ -133,7 +121,9 @@ class ChinesePrompts: to_dead_player = "{}, 你已被淘汰。现在你可以向所有存活玩家发表最后的遗言。" - to_all_new_game = "新的一局游戏开始,参与玩家包括:{}。现在为每位玩家重新随机分配身份,并私下告知各自身份。" + to_all_new_game = ( + "新的一局游戏开始,参与玩家包括:{}。现在为每位玩家重新随机分配身份,并私下告知各自身份。" + ) to_all_night = "天黑了,请所有人闭眼。狼人请睁眼,选择今晚要淘汰的一名玩家..." @@ -156,11 +146,15 @@ class ChinesePrompts: to_witch_resurrect_no = "[仅女巫可见] 女巫选择不救该玩家。" to_witch_resurrect_yes = "[仅女巫可见] 女巫选择救活该玩家。" - to_witch_poison = "[仅女巫可见] {witch_name},你有一瓶一次性毒药,今晚要使用吗?请给出理由和决定。" + to_witch_poison = ( + "[仅女巫可见] {witch_name},你有一瓶一次性毒药,今晚要使用吗?请给出理由和决定。" + ) to_all_seer_turn = "轮到预言家行动,预言家请睁眼并查验一名玩家身份..." - to_seer = "[仅预言家可见] {}, 你是预言家,今晚可以查验一名玩家身份。你要查谁?请给出理由和决定。" + to_seer = ( + "[仅预言家可见] {}, 你是预言家,今晚可以查验一名玩家身份。你要查谁?请给出理由和决定。" + ) to_seer_result = "[仅预言家可见] 你查验了{agent_name},结果是:{role}。" @@ -184,8 +178,10 @@ class ChinesePrompts: "本局所有玩家真实身份为:{true_roles}" ) - to_all_village_win = "所有狼人已被淘汰。游戏结束,村民获胜🏘️🎉!本局所有玩家真实身份为:{true_roles}" + to_all_village_win = ( + "所有狼人已被淘汰。游戏结束,村民获胜🏘️🎉!本局所有玩家真实身份为:{true_roles}" + ) to_all_continue = "游戏继续。" - to_all_reflect = "游戏结束。现在每位玩家可以对自己的表现进行反思。注意每位玩家只有一次发言机会,且反思内容仅自己可见。" \ No newline at end of file + to_all_reflect = "游戏结束。现在每位玩家可以对自己的表现进行反思。注意每位玩家只有一次发言机会,且反思内容仅自己可见。" diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py new file mode 100644 index 00000000..2b97288a --- /dev/null +++ b/tutorial/example_werewolves/start.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +# flake8: noqa: E501 + +"""The main entry point for the werewolf game.""" + +import os +import numpy as np +import dotenv + +dotenv.load_dotenv() +from textwrap import dedent +from loguru import logger +from tutorial.example_werewolves.game import werewolves_game +from agentscope.agent import ReActAgent +from agentscope.formatter import OpenAIMultiAgentFormatter, DashScopeMultiAgentFormatter +from agentscope.model import OpenAIChatModel, DashScopeChatModel +from pydantic import BaseModel, Field +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput + + +def get_official_agent_prompt(name) -> str: + system_prompt = dedent( + f""" + You're a werewolf game player named {name}. + + # YOUR TARGET + Your target is to win the game with your teammates as much as possible. + + # GAME RULES + - In werewolf game, players are divided into three werewolves, three villagers, one seer, one hunter and one witch. + - Werewolves: kill one player each night, and must hide identity during the day. + - Villagers: ordinary players without special abilities, try to identify and eliminate werewolves. + - Seer: A special villager who can check one player's identity each night. + - Witch: A special villager with two one-time-use potions: a healing potion to save a player from being killed at night, and a poison to eliminate one player at night. + - Hunter: A special villager who can take one player down with them when they are eliminated. + - The game alternates between night and day phases until one side wins: + - Night Phase + - Werewolves choose one victim + - Seer checks one player's identity + - Witch decides whether to use potions + - Moderator announces who died during the night + - Day Phase + - All players discuss and vote to eliminate one suspected player + + # GAME GUIDANCE + - Try your best to win the game with your teammates, tricks, lies, and deception are all allowed, e.g. pretending to be a different role. + - During discussion, don't be political, be direct and to the point. + - The day phase voting provides important clues. For example, the werewolves may vote together, attack the seer, etc. + ## GAME GUIDANCE FOR WEREWOLF + - Seer is your greatest threat, who can check one player's identity each night. Analyze players' speeches, find out the seer and eliminate him/her will greatly increase your chances of winning. + - In the first night, making random choices is common for werewolves since no information is available. + - Pretending to be other roles (seer, witch or villager) is a common strategy to hide your identity and mislead other villagers in the day phase. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR SEER + - Seer is very important to villagers, exposing yourself too early may lead to being targeted by werewolves. + - Your ability to check one player's identity is crucial. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR WITCH + - Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected werewolves. + - The outcome of the night phase provides important clues. For example, if the dead player is hunter, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR HUNTER + - Using your ability in day phase will expose your role (since only hunter can take one player down) + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, etc. Use this information to adjust your strategy. + ## GAME GUIDANCE FOR VILLAGER + - Protecting special villagers, especially the seer, is crucial for your team's success. + - Werewolves may pretend to be the seer. Be cautious and don't trust anyone easily. + - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. + + # NOTE + - [IMPORTANT] DO NOT make up any information that is not provided by the moderator or other players. + - This is a TEXT-based game, so DO NOT use or make up any non-textual information. + - Always critically reflect on whether your evidence exist, and avoid making assumptions. + - Your response should be specific and concise, provide clear reason and avoid unnecessary elaboration. + - Generate your one-line response by using the `generate_response` function. + - Don't repeat the others' speeches.""" + ) + return system_prompt + + +class ExampleWerewolves(Workflow): + + trainer: str = Field(default="astune-trinity") + trainable_targets: list = Field( + default=["werewolf"], description="List of agents to be fine-tuned." + ) + + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: + + # ensure trainable targets is legal + if "werewolf" in self.trainable_targets: + assert len(self.trainable_targets) == 1, "Cannot train hostile roles simultaneously." + else: + assert len(self.trainable_targets) != 0, "No trainable targets specified." + + # make and shuffle roles (fix random seed for reproducibility) + roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] + task_id = workflow_task.task.metadata["random_number"] + np.random.seed(int(task_id)) + np.random.shuffle(roles) + + # initialize agents + players = [] + for i, role in enumerate(roles): + # default_model = OpenAIChatModel( + # model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", + # stream=False, + # client_args={"base_url": "http://22.16.118.255:2888/v1"}, + # api_key="1234", + # ) + default_model = DashScopeChatModel( + model_name="qwen-max", + api_key=os.environ.get("DASHSCOPE_API_KEY", "your-dashscope-api-key"), + stream=False + ) + agent = ReActAgent( + name=f"Player{i + 1}", + sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), + model=model_tuner.register_model(role, default_model=default_model), + # formatter=OpenAIMultiAgentFormatter(), + formatter=DashScopeMultiAgentFormatter(), + ) + agent.set_console_output_enabled(False) + players += [agent] + + # reward condition + good_guy_win = await werewolves_game(players, roles) + raw_reward = 0 + is_success = False + if (good_guy_win and self.trainable_targets[0] != "werewolf") or ( + not good_guy_win and self.trainable_targets[0] == "werewolf" + ): + raw_reward = 1 + is_success = True + + # check + logger.warning(f"Raw reward: {raw_reward}") + logger.warning(f"Is success: {is_success}") + + return WorkflowOutput(reward=raw_reward, is_success=is_success) diff --git a/tutorial/werewolves/structured_model.py b/tutorial/example_werewolves/structured_model.py similarity index 76% rename from tutorial/werewolves/structured_model.py rename to tutorial/example_werewolves/structured_model.py index 2e161cca..4764816e 100644 --- a/tutorial/werewolves/structured_model.py +++ b/tutorial/example_werewolves/structured_model.py @@ -44,12 +44,12 @@ class WitchPoisonModel(BaseModel): poison: bool = Field( description="Do you want to use the poison potion", ) - name: Literal[ # type: ignore - tuple(_.name for _ in agents) - ] | None = Field( - description="The name of the player you want to poison, if you " - "don't want to poison anyone, just leave it empty", - default=None, + name: Literal[tuple(_.name for _ in agents)] | None = ( # type: ignore + Field( + description="The name of the player you want to poison, if you " + "don't want to poison anyone, just leave it empty", + default=None, + ) ) return WitchPoisonModel @@ -77,12 +77,12 @@ class HunterModel(BaseModel): shoot: bool = Field( description="Whether you want to use the shooting ability or not", ) - name: Literal[ # type: ignore - tuple(_.name for _ in agents) - ] | None = Field( - description="The name of the player you want to shoot, if you " - "don't want to the ability, just leave it empty", - default=None, + name: Literal[tuple(_.name for _ in agents)] | None = ( # type: ignore + Field( + description="The name of the player you want to shoot, if you " + "don't want to the ability, just leave it empty", + default=None, + ) ) - return HunterModel \ No newline at end of file + return HunterModel diff --git a/tutorial/werewolves/utils.py b/tutorial/example_werewolves/utils.py similarity index 92% rename from tutorial/werewolves/utils.py rename to tutorial/example_werewolves/utils.py index ed89ee7b..a3c39e16 100644 --- a/tutorial/werewolves/utils.py +++ b/tutorial/example_werewolves/utils.py @@ -5,7 +5,7 @@ import numpy as np -from tutorial.werewolves.prompt import EnglishPrompts as Prompts +from tutorial.example_werewolves.prompt import EnglishPrompts as Prompts from agentscope.message import Msg from agentscope.agent import ReActAgent, AgentBase @@ -124,18 +124,12 @@ def update_players(self, dead_players: list[ReActAgent]) -> None: dead_players (`list[ReActAgent]`): A list of dead players to be removed. """ - self.werewolves = [ - _ for _ in self.werewolves if _.name not in dead_players - ] - self.villagers = [ - _ for _ in self.villagers if _.name not in dead_players - ] + self.werewolves = [_ for _ in self.werewolves if _.name not in dead_players] + self.villagers = [_ for _ in self.villagers if _.name not in dead_players] self.seer = [_ for _ in self.seer if _.name not in dead_players] self.hunter = [_ for _ in self.hunter if _.name not in dead_players] self.witch = [_ for _ in self.witch if _.name not in dead_players] - self.current_alive = [ - _ for _ in self.current_alive if _.name not in dead_players - ] + self.current_alive = [_ for _ in self.current_alive if _.name not in dead_players] def print_roles(self) -> None: """Print the roles of all players.""" @@ -165,4 +159,4 @@ def check_winning(self) -> str | None: return Prompts.to_all_village_win.format( true_roles=true_roles, ) - return None \ No newline at end of file + return None diff --git a/tutorial/werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md similarity index 83% rename from tutorial/werewolves/werewolves.md rename to tutorial/example_werewolves/werewolves.md index 6395defe..a3c1f83e 100644 --- a/tutorial/werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -9,14 +9,14 @@ ```python class ExampleWerewolves(AgentScopeLearnProtocol): trainer: str = Field(default="astune-trinity") - async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config) -> ASTuneProxy: + async def agentscope_execute(self, init_messages, astune_proxy: ModelTuner, config) -> WorkflowOutput: train_which_role = "witch" roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] # Set random seed for reproducibility - task_core_arg = astune_proxy.get_agentscope_input_dictionary()[task_core_arg] - task_id = task_core_arg.task.task_id + workflow_task = astune_proxy.get_agentscope_input_dictionary()[workflow_task] + task_id = workflow_task.task.task_id np.random.seed(int(task_id)) np.random.shuffle(roles) @@ -35,7 +35,7 @@ ### 2. 测试 -- 复制并修改 [launcher/werewolves_agent/git-rpg-agentscope.yaml](../launcher/werewolves_agent/git-rpg-agentscope.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 +- 复制并修改 [tutorial/example_werewolves/werewolves.yaml](../tutorial/example_werewolves/werewolves.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 ```yaml astune: task_reader: @@ -47,14 +47,14 @@ # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolvesLearn # ✨✨✨✨ 编写并选择Agent + agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent ``` - 全链路调试(脱离ray快速调试:--backbone='debug') ```bash # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) - python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf launcher/werewolves_agent/git-rpg-agentscope.yaml --backbone='debug' --with-logview + python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: @@ -71,7 +71,7 @@ "console": "integratedTerminal", "args": [ "--backbone", "debug", - "--conf", "launcher/werewolves_agent/git-rpg-agentscope.yaml" + "--conf", "tutorial/example_werewolves/werewolves.yaml" ], "env": { } @@ -85,7 +85,7 @@ ```bash # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ - python launcher.py --conf launcher/werewolves_agent/git-rpg-agentscope.yaml --backbone='trinity' --with-ray + python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray ``` diff --git a/tutorial/werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml similarity index 72% rename from tutorial/werewolves/werewolves.yaml rename to tutorial/example_werewolves/werewolves.yaml index 5787a9f3..88bdeaf9 100644 --- a/tutorial/werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -1,5 +1,6 @@ # ------------------ 主要配置 ------------------ astune: + project_name: example_werewolves task_reader: type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` @@ -12,23 +13,23 @@ astune: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_learn_protocol: tutorial.werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 6 + agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent + num_repeat: 4 + agent_madness_reward: 0.0 + temperature: 0.3 + tensor_model_parallel_size: 4 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 data: - max_prompt_length: 15000 - max_response_length: 3000 - train_batch_size: 32 - -trinity: - algorithm: - repeat_times: 6 - buffer: - train_batch_size: 42 + max_prompt_length: 9000 + max_response_length: 9000 + train_batch_size: 8 + + trainer_common: + val_before_train: False # ------------------ 不需要修改 ------------------ hydra: diff --git a/tutorial/werewolves/start.py b/tutorial/werewolves/start.py deleted file mode 100644 index b179d551..00000000 --- a/tutorial/werewolves/start.py +++ /dev/null @@ -1,144 +0,0 @@ -# -*- coding: utf-8 -*- -# flake8: noqa: E501 -"""The main entry point for the werewolf game.""" -import asyncio -import os -import numpy as np -from loguru import logger -import dotenv; dotenv.load_dotenv() -from tutorial.werewolves.game import werewolves_game -from agentscope.agent import ReActAgent -from agentscope.formatter import DashScopeMultiAgentFormatter -from agentscope.model import DashScopeChatModel -from agentscope.session import JSONSession -from astune.workflow_controller.agentscope_flow import ASTuneProxy -from agentscope.message import Msg -from pydantic import BaseModel, Field -from astune.protocol.agentscope_protocol import AgentScopeLearnProtocol -# astune/utils/robust_dashscope.py -from astune.utils.robust_dashscope import RobustDashScopeChatModel - -def get_official_agents(name: str, role: str, train_which_role: str, astune_proxy: ASTuneProxy) -> ReActAgent: - """Get the official werewolves game agents.""" - agent = ReActAgent( - name=name, - sys_prompt=f"""You're a werewolf game player named {name}. - -# YOUR TARGET -Your target is to win the game with your teammates as much as possible. - -# GAME RULES -- In werewolf game, players are divided into three werewolves, three villagers, one seer, one hunter and one witch. - - Werewolves: kill one player each night, and must hide identity during the day. - - Villagers: ordinary players without special abilities, try to identify and eliminate werewolves. - - Seer: A special villager who can check one player's identity each night. - - Witch: A special villager with two one-time-use potions: a healing potion to save a player from being killed at night, and a poison to eliminate one player at night. - - Hunter: A special villager who can take one player down with them when they are eliminated. -- The game alternates between night and day phases until one side wins: - - Night Phase - - Werewolves choose one victim - - Seer checks one player's identity - - Witch decides whether to use potions - - Moderator announces who died during the night - - Day Phase - - All players discuss and vote to eliminate one suspected player - -# GAME GUIDANCE -- Try your best to win the game with your teammates, tricks, lies, and deception are all allowed, e.g. pretending to be a different role. -- During discussion, don't be political, be direct and to the point. -- The day phase voting provides important clues. For example, the werewolves may vote together, attack the seer, etc. -## GAME GUIDANCE FOR WEREWOLF -- Seer is your greatest threat, who can check one player's identity each night. Analyze players' speeches, find out the seer and eliminate him/her will greatly increase your chances of winning. -- In the first night, making random choices is common for werewolves since no information is available. -- Pretending to be other roles (seer, witch or villager) is a common strategy to hide your identity and mislead other villagers in the day phase. -- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. -## GAME GUIDANCE FOR SEER -- Seer is very important to villagers, exposing yourself too early may lead to being targeted by werewolves. -- Your ability to check one player's identity is crucial. -- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. -## GAME GUIDANCE FOR WITCH -- Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected werewolves. -- The outcome of the night phase provides important clues. For example, if the dead player is hunter, etc. Use this information to adjust your strategy. -## GAME GUIDANCE FOR HUNTER -- Using your ability in day phase will expose your role (since only hunter can take one player down) -- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, etc. Use this information to adjust your strategy. -## GAME GUIDANCE FOR VILLAGER -- Protecting special villagers, especially the seer, is crucial for your team's success. -- Werewolves may pretend to be the seer. Be cautious and don't trust anyone easily. -- The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. - -# NOTE -- [IMPORTANT] DO NOT make up any information that is not provided by the moderator or other players. -- This is a TEXT-based game, so DO NOT use or make up any non-textual information. -- Always critically reflect on whether your evidence exist, and avoid making assumptions. -- Your response should be specific and concise, provide clear reason and avoid unnecessary elaboration. -- Generate your one-line response by using the `generate_response` function. -- Don't repeat the others' speeches.""", - model=RobustDashScopeChatModel( - model_name="qwen3-max", - max_try=4, - stream=False - ) if role != train_which_role else astune_proxy, # type: ignore - formatter=DashScopeMultiAgentFormatter(), - ) - return agent - - -async def main() -> None: - """The main entry point for the werewolf game.""" - - # Uncomment the following lines if you want to use Agentscope Studio - # to visualize the game process. - # import agentscope - # agentscope.init( - # studio_url="http://localhost:3000", - # project="werewolf_game", - # ) - - # Prepare 9 players, you can change their names here - players = [get_official_agents(f"Player{_ + 1}") for _ in range(9)] - - # Note: You can replace your own agents here, or use all your own agents - - # Load states from a previous checkpoint - session = JSONSession(save_dir="./checkpoints") - await session.load_session_state( - session_id="players_checkpoint", - **{player.name: player for player in players}, - ) - - await werewolves_game(players) - - # Save the states to a checkpoint - await session.save_session_state( - session_id="players_checkpoint", - **{player.name: player for player in players}, - ) - - -class ExampleWerewolves(AgentScopeLearnProtocol): - - trainer: str = Field(default="astune-trinity") - - async def agentscope_execute(self, init_messages, astune_proxy: ASTuneProxy, config) -> ASTuneProxy: - - train_which_role = "witch" - - roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] - - # Set random seed for reproducibility - task_core_arg = astune_proxy.get_agentscope_input_dictionary()["task_core_arg"] - task_id = task_core_arg.task.metadata['random_number'] - - np.random.seed(int(task_id)) - np.random.shuffle(roles) - - players = [get_official_agents(f"Player{x + 1}", roles[x], train_which_role, astune_proxy) for x in range(9)] - - good_guy_win = await werewolves_game(players, roles) - raw_reward = 1 if (good_guy_win and train_which_role != "werewolf") or (not good_guy_win and train_which_role == "werewolf") else 0 - logger.warning(f"Raw reward: {raw_reward}") - astune_proxy.update_judge_input_dictionary(raw_reward = raw_reward) - astune_proxy.update_judge_input_dictionary(is_success = (raw_reward == 1)) - return astune_proxy - diff --git a/vsdb.py b/vsdb.py index 17144a46..1c3a18cd 100644 --- a/vsdb.py +++ b/vsdb.py @@ -10,98 +10,101 @@ https://docs.ray.io/en/latest/ray-observability/ray-distributed-debugger.html """ + def vscode_conditional_breakpoint(tag=None, once=True): - """ - Conditionally set a breakpoint for VSCode debugging with Ray distributed systems. - - This function provides a smart breakpoint mechanism that respects environment - variables and can be configured to trigger only once or multiple times based on - debug tags. It's designed to work with Ray's post-mortem debugging feature. - - Args: - tag (str, optional): A debug tag to conditionally trigger the breakpoint. - If provided, the breakpoint will only trigger if this tag is present - in the DEBUG_TAGS environment variable (pipe-separated list). - If None, the breakpoint behavior depends only on the `once` parameter. - Defaults to None. - - once (bool, optional): Whether the breakpoint should only trigger once - per tag/session. If True, uses environment variables to track if - the breakpoint has already been hit. If False, the breakpoint will - trigger every time the function is called (subject to other conditions). - Defaults to True. - - Returns: - None: This function doesn't return any value. It either triggers a - breakpoint or returns silently. - - Environment Variables: - RAY_DEBUG_POST_MORTEM: Must be set to enable any breakpoint functionality. - If not set, the function returns immediately without doing anything. - - DEBUG_TAGS: Pipe-separated list of debug tags (e.g., "tag1|tag2|tag3"). - Only required when using the `tag` parameter. The breakpoint will - only trigger if the provided tag is found in this list. - - HIT_BREAKPOINT_REC_{tag}: Automatically created environment variables - to track whether a specific tagged breakpoint has already been hit - when `once=True`. These are internal tracking variables. - - Examples: - # Simple breakpoint that triggers once - vscode_conditional_breakpoint(tag="training") - - # Breakpoint that triggers every time - vscode_conditional_breakpoint(tag="training", once=False) - - # Tagged breakpoint (requires DEBUG_TAGS="training|validation") - vscode_conditional_breakpoint(tag="training") - - # Tagged breakpoint that can trigger multiple times - vscode_conditional_breakpoint(tag="validation", once=False) - - Note: - This function is designed to work with Ray's distributed debugging - capabilities and the VSCode Ray Distributed Debugger extension. - Make sure RAY_DEBUG_POST_MORTEM=1 is set in your environment. - """ - - env_tag = f'HIT_BREAKPOINT_REC_{tag}' - if not os.getenv('RAY_DEBUG_POST_MORTEM'): return - if tag is None: - if once: - if os.getenv(env_tag, "") != "1": - os.environ[env_tag] = "1" - breakpoint() - return - else: - breakpoint() - return - else: - debug_tags = os.getenv('DEBUG_TAGS', '').split('|') - if tag in debug_tags: - if once: + """ + Conditionally set a breakpoint for VSCode debugging with Ray distributed systems. + + This function provides a smart breakpoint mechanism that respects environment + variables and can be configured to trigger only once or multiple times based on + debug tags. It's designed to work with Ray's post-mortem debugging feature. + + Args: + tag (str, optional): A debug tag to conditionally trigger the breakpoint. + If provided, the breakpoint will only trigger if this tag is present + in the DEBUG_TAGS environment variable (pipe-separated list). + If None, the breakpoint behavior depends only on the `once` parameter. + Defaults to None. + + once (bool, optional): Whether the breakpoint should only trigger once + per tag/session. If True, uses environment variables to track if + the breakpoint has already been hit. If False, the breakpoint will + trigger every time the function is called (subject to other conditions). + Defaults to True. + + Returns: + None: This function doesn't return any value. It either triggers a + breakpoint or returns silently. + + Environment Variables: + RAY_DEBUG_POST_MORTEM: Must be set to enable any breakpoint functionality. + If not set, the function returns immediately without doing anything. + + DEBUG_TAGS: Pipe-separated list of debug tags (e.g., "tag1|tag2|tag3"). + Only required when using the `tag` parameter. The breakpoint will + only trigger if the provided tag is found in this list. + + HIT_BREAKPOINT_REC_{tag}: Automatically created environment variables + to track whether a specific tagged breakpoint has already been hit + when `once=True`. These are internal tracking variables. + + Examples: + # Simple breakpoint that triggers once + vscode_conditional_breakpoint(tag="training") + + # Breakpoint that triggers every time + vscode_conditional_breakpoint(tag="training", once=False) + + # Tagged breakpoint (requires DEBUG_TAGS="training|validation") + vscode_conditional_breakpoint(tag="training") + + # Tagged breakpoint that can trigger multiple times + vscode_conditional_breakpoint(tag="validation", once=False) + + Note: + This function is designed to work with Ray's distributed debugging + capabilities and the VSCode Ray Distributed Debugger extension. + Make sure RAY_DEBUG_POST_MORTEM=1 is set in your environment. + """ + + env_tag = f"HIT_BREAKPOINT_REC_{tag}" + if not os.getenv("RAY_DEBUG_POST_MORTEM"): + return + if tag is None: + if once: if os.getenv(env_tag, "") != "1": - os.environ[env_tag] = "1" - breakpoint() - return - else: + os.environ[env_tag] = "1" + breakpoint() + return + else: breakpoint() return + else: + debug_tags = os.getenv("DEBUG_TAGS", "").split("|") + if tag in debug_tags: + if once: + if os.getenv(env_tag, "") != "1": + os.environ[env_tag] = "1" + breakpoint() + return + else: + breakpoint() + return def objdump(obj, file="objdump.tmp"): - with open(file, "wb+") as f: - pickle.dump(obj, f) - return + with open(file, "wb+") as f: + pickle.dump(obj, f) + return def objload(file="objdump.tmp"): - import os - if not os.path.exists(file): - return - with open(file, "rb") as f: - return pickle.load(f) + import os + + if not os.path.exists(file): + return + with open(file, "rb") as f: + return pickle.load(f) bp = vscode_conditional_breakpoint From 9d74192e435946baf1860ea2cb351a7b7dc7a425 Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Tue, 25 Nov 2025 10:25:13 +0800 Subject: [PATCH 153/462] move document reader to task reader --- .../task_reader/document_reader/doc_reader.py | 51 +++++++++++++++++++ .../document_reader/document_reader_base.py | 13 +++++ 2 files changed, 64 insertions(+) create mode 100644 astune/task_reader/document_reader/doc_reader.py create mode 100644 astune/task_reader/document_reader/document_reader_base.py diff --git a/astune/task_reader/document_reader/doc_reader.py b/astune/task_reader/document_reader/doc_reader.py new file mode 100644 index 00000000..a82262aa --- /dev/null +++ b/astune/task_reader/document_reader/doc_reader.py @@ -0,0 +1,51 @@ +import uuid +from typing import Dict, List +from astune.schema.document import Document +from astune.task_reader.document_reader.document_reader_base import DocReaderBase +from unstructured.partition.auto import partition + +class DocReader(DocReaderBase): + """ + Document reader parses them into Document objects, and optionally returns raw text content. + """ + def __init__(self, config): + super().__init__(config) + + + def load_document(self, source: str, languages=['eng']) -> str: + """ + Load text from a file. + + Args: + source (str): Path to the file. + + Returns: + str: Merged text from all pages. + """ + text_pages = [] + try: + text_pages = partition(source, languages=languages) + except Exception as e: + raise RuntimeError(f"Failed to partition file: {e}") + + if not text_pages: + raise ValueError(f"No extractable text found in file: {source}") + + text = "\n\n".join([str(sub) for sub in text_pages]) + return text + + + def _parser_document(self, raw_document: str) -> Document: + + return Document( + doc_id=str(uuid.uuid4()), + content=raw_document, + metadata={} + ) + + + def get_document(self) -> Document: + file_path = self.config.astune.document_reader.document_path + raw_doc = self.load_document(file_path, languages=self.config.astune.document_reader.languages) + return self._parser_document(raw_doc) + diff --git a/astune/task_reader/document_reader/document_reader_base.py b/astune/task_reader/document_reader/document_reader_base.py new file mode 100644 index 00000000..26ac69a8 --- /dev/null +++ b/astune/task_reader/document_reader/document_reader_base.py @@ -0,0 +1,13 @@ +import json +import uuid +import datasets +from typing import List, Dict, Optional +from astune.schema.document import Document + + +class DocReaderBase: + def __init__(self, config): + self.config = config + + def get_document(self, file_path: str) -> Document: + raise NotImplementedError From 5957fe04c0cbc1e5ebd55e5cc4abf390de41e1e4 Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Tue, 25 Nov 2025 10:31:30 +0800 Subject: [PATCH 154/462] delete redundant document reader --- astune/document_reader/doc_reader.py | 51 ------------------- .../document_reader/document_reader_base.py | 13 ----- 2 files changed, 64 deletions(-) delete mode 100644 astune/document_reader/doc_reader.py delete mode 100644 astune/document_reader/document_reader_base.py diff --git a/astune/document_reader/doc_reader.py b/astune/document_reader/doc_reader.py deleted file mode 100644 index 9ce4cb43..00000000 --- a/astune/document_reader/doc_reader.py +++ /dev/null @@ -1,51 +0,0 @@ -import uuid -from typing import Dict, List -from astune.schema.document import Document -from astune.document_reader.document_reader_base import DocReaderBase -from unstructured.partition.auto import partition - -class DocReader(DocReaderBase): - """ - Document reader parses them into Document objects, and optionally returns raw text content. - """ - def __init__(self, config): - super().__init__(config) - - - def load_document(self, source: str, languages=['eng']) -> str: - """ - Load text from a file. - - Args: - source (str): Path to the file. - - Returns: - str: Merged text from all pages. - """ - text_pages = [] - try: - text_pages = partition(source, languages=languages) - except Exception as e: - raise RuntimeError(f"Failed to partition file: {e}") - - if not text_pages: - raise ValueError(f"No extractable text found in file: {source}") - - text = "\n\n".join([str(sub) for sub in text_pages]) - return text - - - def _parser_document(self, raw_document: str) -> Document: - - return Document( - doc_id=str(uuid.uuid4()), - content=raw_document, - metadata={} - ) - - - def get_document(self) -> Document: - file_path = self.config.astune.document_reader.document_path - raw_doc = self.load_document(file_path, languages=self.config.astune.document_reader.languages) - return self._parser_document(raw_doc) - diff --git a/astune/document_reader/document_reader_base.py b/astune/document_reader/document_reader_base.py deleted file mode 100644 index 26ac69a8..00000000 --- a/astune/document_reader/document_reader_base.py +++ /dev/null @@ -1,13 +0,0 @@ -import json -import uuid -import datasets -from typing import List, Dict, Optional -from astune.schema.document import Document - - -class DocReaderBase: - def __init__(self, config): - self.config = config - - def get_document(self, file_path: str) -> Document: - raise NotImplementedError From 73a04f841d42736837fc08e265f950f74250ac89 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Tue, 25 Nov 2025 11:25:00 +0800 Subject: [PATCH 155/462] add pre-commit --- .pre-commit-config.yaml | 51 +++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a27a39cf..87cae9bc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,40 @@ repos: -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml -# - repo: https://github.com/psf/black-pre-commit-mirror -# rev: 24.1.1 -# hooks: -# - id: black -# language_version: python3.10 -# args: ["--line-length=100"] + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - id: check-ast + - id: check-json + - id: check-merge-conflict + - id: detect-private-key + - repo: https://github.com/psf/black + rev: 23.7.0 + hooks: + - id: black + language_version: python3.10 + args: [--line-length=100] + + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + args: ["--profile", "black", "--filter-files"] + + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.7.0 + hooks: + - id: mypy + args: [ + --ignore-missing-imports, + --disable-error-code=var-annotated, + --disable-error-code=union-attr, + --disable-error-code=assignment, + --disable-error-code=attr-defined, + --disable-error-code=import-untyped, + --disable-error-code=truthy-function, + --follow-imports=skip, + --explicit-package-bases, + ] From d87460627907b162b6ee16973d1d8078349f60c3 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 11:27:22 +0800 Subject: [PATCH 156/462] chore: remove tracing configuration from example_math_agent Former-commit-id: 0848199bd0c55c001519cd7b3bed4f57d9cacd3f --- tutorial/example_math_agent/math_agent.yaml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index d1cd5573..a5757be0 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -8,22 +8,6 @@ astune: dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' training_split: "train" validation_split: "test" - - # example - tracing: - base_url: http://phoenix:port - train_output_path: /path/to/tasks.jsonl - filters: - - type: llm_evaluate - enabled: true - params: - custom_rubrics: "1. 如果 answer 声称将答案写入了文件,请判定为有实质性的回答。" - temperature: 0.5 - max_tokens: 2048 - print_reason: false - - - task_judge: # ✨✨✨✨ 编写并选择评价函数 From a5fd0782928eef0ccc582e1ed7e969cd4a717861 Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Tue, 25 Nov 2025 11:36:02 +0800 Subject: [PATCH 157/462] update test_data_generator yaml --- test_data_generator.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test_data_generator.yaml b/test_data_generator.yaml index 5a6a71ec..fc80d1b5 100644 --- a/test_data_generator.yaml +++ b/test_data_generator.yaml @@ -22,9 +22,9 @@ astune: data_generator: llm_model: gpt-4o-2024-11-20 llm_response_length: 8192 - task_augment: + task_augmentor: - knowledge_augment: + knowledge_augmentor: n: 10 # 文档生成query 的数量 From 3e065564f9687bc8497f055a21b9696f75d9d7ec Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Tue, 25 Nov 2025 11:36:14 +0800 Subject: [PATCH 158/462] simplify unittest --- .github/workflows/unittest.yaml | 38 +-------------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/.github/workflows/unittest.yaml b/.github/workflows/unittest.yaml index 3a715896..d6703d52 100644 --- a/.github/workflows/unittest.yaml +++ b/.github/workflows/unittest.yaml @@ -48,28 +48,10 @@ jobs: working-directory: astune-${{ github.run_id }} run: | COMMENT="${{ github.event.comment.body }}" - if [[ "$COMMENT" == "/unittest-all"* ]]; then - echo "type=all" >> $GITHUB_OUTPUT - elif [[ "$COMMENT" == "/unittest-diff"* ]]; then - echo "type=diff" >> $GITHUB_OUTPUT - elif [[ "$COMMENT" =~ ^/unittest-module-(.+)$ ]]; then - MODULE=$(echo "$COMMENT" | sed -n 's/\/unittest-module-\(.*\)/\1/p') - echo "type=module" >> $GITHUB_OUTPUT - echo "module=$MODULE" >> $GITHUB_OUTPUT - else + if [[ "$COMMENT" == "/unittest"* ]]; then echo "type=all" >> $GITHUB_OUTPUT fi - - name: Get changed modules (for diff) - if: steps.test_type.outputs.type == 'diff' - id: diff - working-directory: astune-${{ github.run_id }} - run: | - git fetch origin main - git diff --name-only origin/main...HEAD > changed_files.txt - awk -F/ '/^(astune)\// {print $2}' changed_files.txt | sort | uniq > changed_modules.txt - awk '{print "tests/"$1}' changed_modules.txt > test_dirs.txt - - name: Run unittest working-directory: astune-${{ github.run_id }}/.github/workflows/docker run: | @@ -77,24 +59,6 @@ jobs: if [ "$TYPE" = "all" ]; then echo "tests_run=true" >> $GITHUB_ENV docker compose exec astune-node-1 pytest tests -v -s --ctrf report.json - elif [ "$TYPE" = "diff" ]; then - if [ -s ../../../test_dirs.txt ]; then - echo "tests_run=true" >> $GITHUB_ENV - TEST_DIRS=$(cat ../../../test_dirs.txt | xargs) - docker compose exec astune-node-1 pytest $TEST_DIRS -v -s --ctrf report.json - else - echo "No changed modules detected, skipping tests." - echo "tests_run=false" >> $GITHUB_ENV - fi - elif [ "$TYPE" = "module" ]; then - MODULE="${{ steps.test_type.outputs.module }}" - if [ -n "$MODULE" ]; then - echo "tests_run=true" >> $GITHUB_ENV - docker compose exec astune-node-1 pytest tests/$MODULE -v -s --ctrf report.json - else - echo "No module specified, skipping tests." - echo "tests_run=false" >> $GITHUB_ENV - fi fi - name: Convert report.json time to ms From 13ff54823467b6b9c53915ea389c6c194bf63ab3 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 11:52:50 +0800 Subject: [PATCH 159/462] fix: update trace_feedback_training.yaml configuration; enhance rollout parameters and clean up structure Former-commit-id: 816b02ff877927faa67bdd0d4051287e075f9120 --- .../trace_feedback_training.yaml | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tutorial/trace_feedback_training/trace_feedback_training.yaml b/tutorial/trace_feedback_training/trace_feedback_training.yaml index 244737be..a151519e 100644 --- a/tutorial/trace_feedback_training/trace_feedback_training.yaml +++ b/tutorial/trace_feedback_training/trace_feedback_training.yaml @@ -1,21 +1,37 @@ # ------------------ 主要配置 ------------------ astune: + project_name: example_feedback_training task_reader: type: tracing task_judge: + # ✨✨✨✨ 编写并选择评价函数 judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge model: + # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: agentscope_learn_protocol: tutorial.trace_feedback_training.train->ExampleTracingFeedbackTrain + temperature: 0.7 + max_env_worker: 256 + num_repeat: 8 + agent_madness_reward: -1.0 + tensor_model_parallel_size: 4 + max_num_seqs: 256 + multi_turn: + max_sample_per_task: 4 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" + data: + train_batch_size: 240 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 - + tracing: base_url: ./tutorial/trace_feedback_training/database.sqlite train_output_path: ./tutorial/trace_feedback_training/tasks.jsonl @@ -31,11 +47,6 @@ astune: temperature: 0.5 print_reason: false -trinity: - algorithm: - repeat_times: 6 - buffer: - train_batch_size: 180 # remove swanlab logger trainer: From 0721f05e6bade660d46a5fb917991ed1088ca677 Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Nov 2025 11:53:21 +0800 Subject: [PATCH 160/462] fix: multi-threading support to LLM filter --- astune/default_config/astune_default.yaml | 1 + .../filters/llm_evaluate_filter.py | 30 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index f468d0ca..a830a1d5 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -134,6 +134,7 @@ astune: custom_rubrics: If the answer claims that it has written the output to a file, consider it an invalid response. temperature: 0.5 print_reason: false + max_thread: 16 execute_test: False # DO NOT EDIT, FOR TESTING PURPOSE ONLY execute_testing_lambda: "" diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 4482ed23..221e70f5 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -1,4 +1,5 @@ from typing import Iterable, List +from concurrent.futures import ThreadPoolExecutor, as_completed from astune.schema.task import Task from astune.task_rollout.dashscope_llm_bridge import ( @@ -47,10 +48,12 @@ def __init__( temperature: float = 0.7, max_tokens: int = 2048, print_reason: bool = True, + max_thread: int = 1, ) -> None: """Filter that evaluates the quality of tasks using LLM.""" self._print_reason = print_reason + self._max_thread = max_thread self.alien_llm_chat_fn = construct_alien_llm_chat_fn( alien_llm_model="qwen3-235b-a22b-instruct-2507", alien_llm_response_length=512, @@ -74,16 +77,33 @@ def __init__( ) def filter(self, tasks: Iterable[Task]) -> List[Task]: + tasks_list = list(tasks) kept: List[Task] = [] - for task in tasks: + + if not tasks_list: + return kept + + max_workers = max(self._max_thread, 1) + + def _evaluate(task: Task) -> dict: payload = { "query": task.main_query, "answer": task.metadata.get("answer", ""), } res = self._fn(payload) assert isinstance(res, dict) - if self._print_reason: - print(res["reason"]) - if res.get("result") == "GOOD": - kept.append(task) + return res + + with ThreadPoolExecutor(max_workers=max_workers) as executor: + future_to_task = { + executor.submit(_evaluate, task): task for task in tasks_list + } + for future in as_completed(future_to_task): + task = future_to_task[future] + res = future.result() + if self._print_reason: + print(res["reason"]) + if res.get("result") == "GOOD": + kept.append(task) + return kept From d09244b2de146aa153108931228c98b6c5290be8 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 11:53:24 +0800 Subject: [PATCH 161/462] rename modules Former-commit-id: 5ab9895743686bed893cd8002f852adc43fdabf2 --- astune/task_reader/tracing_reader/__init__.py | 4 +-- .../README.md | 4 +-- .../agent_deployed.py | 8 ++--- .../database.sqlite.REMOVED.git-id | 0 .../example_feedback_tracing.yaml} | 31 +++++++++---------- .../train.py | 0 6 files changed, 23 insertions(+), 24 deletions(-) rename tutorial/{trace_feedback_training => example_feedback_tracing}/README.md (92%) rename tutorial/{trace_feedback_training => example_feedback_tracing}/agent_deployed.py (98%) rename tutorial/{trace_feedback_training => example_feedback_tracing}/database.sqlite.REMOVED.git-id (100%) rename tutorial/{trace_feedback_training/trace_feedback_training.yaml => example_feedback_tracing/example_feedback_tracing.yaml} (65%) rename tutorial/{trace_feedback_training => example_feedback_tracing}/train.py (100%) diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 4eb4a7da..762ff1cb 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -34,8 +34,8 @@ def __init__( super().__init__(config) # config patch # print("*********", config, "**********") - self.config = config.astune.tracing - + self.config = config.astune.task_reader.feedback_tracing + logger.info(f"reading tasks from {self.config.get('base_url')}, #filter {len(self.config.get('filters'))}") self._connector = LocalSqliteConnectorV1(self.config.get("base_url")) filters_config = self.config.get("filters") diff --git a/tutorial/trace_feedback_training/README.md b/tutorial/example_feedback_tracing/README.md similarity index 92% rename from tutorial/trace_feedback_training/README.md rename to tutorial/example_feedback_tracing/README.md index 396832a6..8ced47a2 100644 --- a/tutorial/trace_feedback_training/README.md +++ b/tutorial/example_feedback_tracing/README.md @@ -33,12 +33,12 @@ Once you have the tracing log (`database.sqlite`), you can use the trace-feedbac 3. Configure other training parameters and Rewards as you would in a normal training workflow. An example database and configuration file are provided under -`trace_feedback_training/`. +`example_feedback_tracing/`. When everything is ready, start the training with: ```bash -python launcher.py --conf tutorial/trace_feedback_training/trace_feedback_training.yaml --backbone='trinity' --with-ray +python launcher.py --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray ``` ## 3. Deploying the New Agent diff --git a/tutorial/trace_feedback_training/agent_deployed.py b/tutorial/example_feedback_tracing/agent_deployed.py similarity index 98% rename from tutorial/trace_feedback_training/agent_deployed.py rename to tutorial/example_feedback_tracing/agent_deployed.py index 6eaf9909..a395aa33 100644 --- a/tutorial/trace_feedback_training/agent_deployed.py +++ b/tutorial/example_feedback_tracing/agent_deployed.py @@ -19,7 +19,7 @@ def build_agent(): tool_kit=Toolkit() tool_kit.register_tool_function(execute_python_code) - + agent = ReActAgent( name="Qwen", sys_prompt=SYSTEM_PROMPT, @@ -33,16 +33,16 @@ def build_agent(): toolkit=tool_kit, print_hint_msg=False, ) - + return agent async def main(): # init the tracing module agentscope.init(studio_url="http://localhost:3000") - + agent = build_agent() - + while True: inp = input("User: ") print(await agent.reply(Msg("user", inp, role="user"))) diff --git a/tutorial/trace_feedback_training/database.sqlite.REMOVED.git-id b/tutorial/example_feedback_tracing/database.sqlite.REMOVED.git-id similarity index 100% rename from tutorial/trace_feedback_training/database.sqlite.REMOVED.git-id rename to tutorial/example_feedback_tracing/database.sqlite.REMOVED.git-id diff --git a/tutorial/trace_feedback_training/trace_feedback_training.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml similarity index 65% rename from tutorial/trace_feedback_training/trace_feedback_training.yaml rename to tutorial/example_feedback_tracing/example_feedback_tracing.yaml index a151519e..343724e1 100644 --- a/tutorial/trace_feedback_training/trace_feedback_training.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -3,6 +3,20 @@ astune: project_name: example_feedback_training task_reader: type: tracing + feedback_tracing: + base_url: ./tutorial/example_feedback_tracing/database.sqlite + train_output_path: ./tutorial/example_feedback_tracing/tasks.jsonl + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 2048 + filters: + - type: llm_evaluate + enabled: true + params: + custom_rubrics: | + 1. Check the answer and drop the task if it does not answer or answer is wrong. + 2. Consider a response is invalid if it does not wrap the final answer in \boxed{}. + temperature: 0.5 + print_reason: false task_judge: # ✨✨✨✨ 编写并选择评价函数 @@ -13,7 +27,7 @@ astune: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_learn_protocol: tutorial.trace_feedback_training.train->ExampleTracingFeedbackTrain + agentscope_learn_protocol: tutorial.example_feedback_tracing.train->ExampleTracingFeedbackTrain temperature: 0.7 max_env_worker: 256 num_repeat: 8 @@ -32,21 +46,6 @@ astune: debug_max_parallel: 1 debug_first_n_tasks: 1 - tracing: - base_url: ./tutorial/trace_feedback_training/database.sqlite - train_output_path: ./tutorial/trace_feedback_training/tasks.jsonl - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 2048 - filters: - - type: llm_evaluate - enabled: true - params: - custom_rubrics: | - 1. Check the answer and drop the task if it does not answer or answer is wrong. - 2. Consider a response is invalid if it does not wrap the final answer in \boxed{}. - temperature: 0.5 - print_reason: false - # remove swanlab logger trainer: diff --git a/tutorial/trace_feedback_training/train.py b/tutorial/example_feedback_tracing/train.py similarity index 100% rename from tutorial/trace_feedback_training/train.py rename to tutorial/example_feedback_tracing/train.py From ed543316fa0163d07d3e30a2382dd2f2bba3456e Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Tue, 25 Nov 2025 12:32:06 +0800 Subject: [PATCH 162/462] fix unittest --- .github/workflows/docker/docker-compose.yaml | 3 ++- tests/__init__.py | 0 tests/config_test.py | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 tests/__init__.py create mode 100644 tests/config_test.py diff --git a/.github/workflows/docker/docker-compose.yaml b/.github/workflows/docker/docker-compose.yaml index f33e0b3d..583e3aa6 100644 --- a/.github/workflows/docker/docker-compose.yaml +++ b/.github/workflows/docker/docker-compose.yaml @@ -3,8 +3,9 @@ services: astune-node-1: image: agentscope-tuner-unittest:latest pull_policy: never - command: sh -c "uv pip install -e .[dev]" + command: bash -c "uv pip install -e .[dev] && ray start --head --dashboard-host 0.0.0.0 --include-dashboard true --block" environment: + - PATH=/opt/venv/bin:$PATH - HF_ENDPOINT=https://hf-mirror.com - RAY_ADDRESS=auto working_dir: /workspace diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/config_test.py b/tests/config_test.py new file mode 100644 index 00000000..2552025f --- /dev/null +++ b/tests/config_test.py @@ -0,0 +1,16 @@ +import unittest + +from astune.utils.config_utils import prepare_experiment_config + +class TestConfigUtils(unittest.TestCase): + + def test_load_config(self): + """A simple test to check if the configuration file is loaded without errors.""" + yaml_backup_dst, exp_base, exp_name, config = prepare_experiment_config('tests/data/config.yaml', "tests/temp", backbone="debug") + self.assertEqual(exp_name, "unittest") + self.assertEqual(exp_base, "tests/temp/unittest") + self.assertEqual(yaml_backup_dst, "tests/temp/unittest/yaml_backup.yaml") + self.assertIn("astune", config) + self.assertIn("experiment_name", config["astune"]) + self.assertEqual(config["astune"]["experiment_name"], "unittest") + self.assertIn("task_reader", config["astune"]) From 92cc9f19ec9ccc035c771e0d01e5974b6978486f Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Tue, 25 Nov 2025 13:09:03 +0800 Subject: [PATCH 163/462] add template file --- tests/data/config.yaml | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 tests/data/config.yaml diff --git a/tests/data/config.yaml b/tests/data/config.yaml new file mode 100644 index 00000000..bd98414c --- /dev/null +++ b/tests/data/config.yaml @@ -0,0 +1,56 @@ +astune: + project_name: unittest + task_reader: + type: huggingface_dat_repo + huggingface_dat_repo: + dataset_path: "" + training_split: "train" + validation_split: "test" + + task_judge: + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + + model: + path: "" + + rollout: + agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" + temperature: 0.7 + max_env_worker: 256 + num_repeat: 8 + agent_madness_reward: -1.0 + tensor_model_parallel_size: 4 + max_num_seqs: 256 + multi_turn: + max_sample_per_task: 4 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" + data: + train_batch_size: 120 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ From 9aeae24350cd74324d3bfe8448d9cf2cacca00ba Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 15:15:14 +0800 Subject: [PATCH 164/462] tracing dat Former-commit-id: e47d227e132c003ab26221c99bbc629c7564615b --- astune/main_verl.py | 8 +++++--- astune/task_reader/tracing_reader/filters/factory.py | 4 +++- .../example_feedback_tracing.yaml | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/astune/main_verl.py b/astune/main_verl.py index 93696002..2b797447 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -60,7 +60,7 @@ def run_ppo(config) -> None: "VLLM_LOGGING_LEVEL": "WARN", "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "VLLM_USE_V1": "1", - "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY"), + "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), } } @@ -68,14 +68,16 @@ def run_ppo(config) -> None: runtime_env["env_vars"].update( { "RAY_record_task_actor_creation_sites": os.getenv( - "RAY_record_task_actor_creation_sites" + "RAY_record_task_actor_creation_sites", "" ), } ) if os.getenv("BEST_LOGGER_WEB_SERVICE_URL"): runtime_env["env_vars"].update( { - "BEST_LOGGER_WEB_SERVICE_URL": os.getenv("BEST_LOGGER_WEB_SERVICE_URL"), + "BEST_LOGGER_WEB_SERVICE_URL": os.getenv( + "BEST_LOGGER_WEB_SERVICE_URL", "" + ), } ) print_dict(runtime_env["env_vars"], "runtime_env") diff --git a/astune/task_reader/tracing_reader/filters/factory.py b/astune/task_reader/tracing_reader/filters/factory.py index 3e7d422a..9c772d2b 100644 --- a/astune/task_reader/tracing_reader/filters/factory.py +++ b/astune/task_reader/tracing_reader/filters/factory.py @@ -28,7 +28,9 @@ def _build_single_filter(spec: Mapping[str, Any]) -> Filter: def build_filters(specs: Sequence[Mapping[str, Any]] | None) -> List[Filter]: - """Setup filter chain according to config.""" + """Setup filter chain according to config. + Refer to: astune.task_reader.feedback_tracing.filters + """ if not specs: return [] diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index 343724e1..c9d09605 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -17,6 +17,7 @@ astune: 2. Consider a response is invalid if it does not wrap the final answer in \boxed{}. temperature: 0.5 print_reason: false + max_thread: 16 task_judge: # ✨✨✨✨ 编写并选择评价函数 From 96bc4b10f7a5676ca35655360b8e9717fe7cd708 Mon Sep 17 00:00:00 2001 From: "xielipeng.xlp" Date: Fri, 21 Nov 2025 17:57:05 +0800 Subject: [PATCH 165/462] [new] auto_grader for astune Former-commit-id: e6d3bc24b9a13686b09caf623a26417eaa8cdf76 --- .../rm_auto_grader_example.yaml | 137 ++++++ astune/task_judge/rm_auto_grader_judge.py | 357 ++++++++++++++ .../rm_auto_grader_example.py | 460 ++++++++++++++++++ 3 files changed, 954 insertions(+) create mode 100644 astune/default_config/rm_auto_grader_example.yaml create mode 100644 astune/task_judge/rm_auto_grader_judge.py create mode 100644 tutorial/example_rm_auto_grader/rm_auto_grader_example.py diff --git a/astune/default_config/rm_auto_grader_example.yaml b/astune/default_config/rm_auto_grader_example.yaml new file mode 100644 index 00000000..86dc07df --- /dev/null +++ b/astune/default_config/rm_auto_grader_example.yaml @@ -0,0 +1,137 @@ +# Example configuration for RM Auto Grader Judge +# This configuration integrates RM Gallery's AutoGrader capabilities into astune + +astune: + # Task judge configuration using RM Auto Grader + task_judge: + # Use RMAutoGraderJudge for pre-generated rubrics + # Or use RMAutoGraderBatchJudge for online rubric generation + class_name: RMAutoGraderJudge + + # ======================================== + # Model Configuration + # ======================================== + # LLM model for rubric generation and evaluation + model_name: "qwen3-32b" # Options: qwen-plus, qwen-max, gpt-4, gpt-3.5-turbo, etc. + + # ======================================== + # Grader Mode Configuration + # ======================================== + grader_mode: "pointwise" # Options: "pointwise" or "listwise" + language: "en" # Options: "en" or "zh" + + # Score range for pointwise evaluation + min_score: 0 + max_score: 10 + + # Success threshold (0.0 - 1.0) - what normalized score counts as success + success_threshold: 0.7 + + # ======================================== + # Rubric Generation Configuration + # ======================================== + # Sampling mode for rubric generation + sampling_mode: "all_samples" # Options: "all_samples" or "smart_sampling" + + # Number of rubrics to generate per sample + generate_number: 3 + + # Maximum epochs for iterative refinement + max_epochs: 3 + + # Maximum retry attempts for LLM API calls + max_retries: 5 + + # Batch processing settings (for smart_sampling mode) + batch_size: 10 + mcr_batch_size: 10 + + # Aggregation mode for final rubrics + aggregation_mode: "keep_all" # Options: "keep_all" or "merge_similar" + + # ======================================== + # Reference Samples Configuration + # ======================================== + # Path to reference samples (for pre-generating rubrics) + # reference_samples_path: "data/reference_samples.jsonl" + + # Number of reference samples to use + num_reference_samples: 20 + + # ======================================== + # Field Mapping Configuration + # ======================================== + # Field names for extracting data from WorkflowTask and WorkflowOutput + query_field: "main_query" # Field in task containing the query + answer_field: "final_answer" # Field in output metadata containing the answer + reference_field: "answer" # Field in task.metadata containing reference answer + + # ======================================== + # Grader name for logging + # ======================================== + grader_name: "RM Auto Grader" + + +# ============================================ +# Batch Judge Specific Configuration +# ============================================ +# Uncomment and use these settings when using RMAutoGraderBatchJudge + +# astune: +# task_judge: +# class_name: RMAutoGraderBatchJudge +# +# # ... (include all settings from above) +# +# # Warmup phase settings +# warmup_samples: 20 # Collect N samples before generating rubrics +# +# # Regeneration settings +# regenerate_interval: 0 # Regenerate rubrics every N evaluations (0 = never) + + +# ============================================ +# Example for Math Problem Evaluation +# ============================================ +# astune: +# task_judge: +# class_name: RMAutoGraderJudge +# model_name: "qwen-plus" +# grader_mode: "pointwise" +# language: "en" +# min_score: 0 +# max_score: 10 +# success_threshold: 0.8 +# sampling_mode: "all_samples" +# generate_number: 5 +# max_epochs: 3 +# aggregation_mode: "merge_similar" +# num_reference_samples: 30 +# query_field: "main_query" +# answer_field: "final_answer" +# reference_field: "answer" + + +# ============================================ +# Example for Agent Task Evaluation +# ============================================ +# astune: +# task_judge: +# class_name: RMAutoGraderJudge +# model_name: "gpt-4" +# grader_mode: "pointwise" +# language: "en" +# min_score: 0 +# max_score: 100 +# success_threshold: 0.7 +# sampling_mode: "smart_sampling" +# generate_number: 3 +# max_epochs: 2 +# batch_size: 15 +# mcr_batch_size: 10 +# aggregation_mode: "keep_all" +# num_reference_samples: 50 +# query_field: "main_query" +# answer_field: "agent_output" +# reference_field: "expected_outcome" + diff --git a/astune/task_judge/rm_auto_grader_judge.py b/astune/task_judge/rm_auto_grader_judge.py new file mode 100644 index 00000000..dc7862a1 --- /dev/null +++ b/astune/task_judge/rm_auto_grader_judge.py @@ -0,0 +1,357 @@ +""" +RM Gallery Auto Grader Judge Integration + +This module integrates RM Gallery's AutoGrader capabilities into astune's judge system. +It provides a data-driven approach to evaluate workflow outputs using automatically +generated rubrics from training samples. + +Key Features: +- Automatic rubric generation from training/validation samples +- Support for both pointwise and listwise evaluation modes +- Flexible scoring based on LLM-generated rubrics +- Seamless integration with astune's workflow system +""" + +import asyncio +from typing import List, Optional, Dict, Any +from loguru import logger + +from astune.workflow import WorkflowOutput, WorkflowTask +from astune.task_judge.judge_base import JudgeBase + + +from rm_gallery.core.grader.auto.auto_grader import AutoGrader, AutoGraderConfig +from rm_gallery.core.grader.auto.auto_rubrics import AutoRubricsConfig, SamplingMode, AggregationMode +from rm_gallery.core.grader.base import GraderMode, LLMGrader +from rm_gallery.core.model.openai_llm import OpenAIChatModel +from rm_gallery.core.schema.data import EvalCase +from rm_gallery.core.schema.template import LanguageEnum + + +class RMAutoGraderJudge(JudgeBase): + """ + A data-driven judge that uses RM Gallery's AutoGrader to evaluate workflow outputs. + + This judge automatically generates evaluation rubrics from a set of reference samples + and then uses those rubrics to score new workflow outputs. + + Workflow: + 1. Initialize with configuration and reference samples + 2. Generate rubrics from reference samples (one-time setup) + 3. Evaluate each workflow output against the generated rubrics + + Example Config (in YAML): + task_judge: + class_name: RMAutoGraderJudge + # RM Gallery Model Configuration + model_name: "qwen-plus" # or "gpt-4", "claude-3-sonnet", etc. + api_key: "your-api-key" + base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1" # optional + + # Rubric Generation Configuration + grader_mode: "pointwise" # or "listwise" + language: "en" # or "zh" + min_score: 0 + max_score: 10 + + # AutoRubrics Configuration + sampling_mode: "all_samples" # or "smart_sampling" + generate_number: 3 # number of rubrics per sample + max_epochs: 3 # max iterations for refinement + aggregation_mode: "keep_all" # or "merge_similar" + + # Reference samples for rubric generation + reference_samples_path: "path/to/reference_samples.jsonl" # optional + num_reference_samples: 20 # number of samples to use for rubric generation + + # Custom field mapping (optional) + query_field: "main_query" # field in task containing query + answer_field: "final_answer" # field in metadata containing answer + reference_field: "answer" # field in task.metadata containing reference + """ + + def __init__(self, config): + """Initialize the RMAutoGraderJudge. + + Args: + config: Configuration object containing model and rubric generation settings + """ + super().__init__(config) + + self.config = config + self.grader_config = self._parse_config() + + # Initialize the model + self.model = OpenAIChatModel(model_name=config.astune.task_judge.model_name, stream=False) + + # Storage for generated grader + self.llm_grader: Optional[LLMGrader] = None + self.rubrics_generated = False + + # Field mappings for data extraction + self.query_field = getattr(config.astune.task_judge, 'query_field', 'main_query') + self.answer_field = getattr(config.astune.task_judge, 'answer_field', 'final_answer') + self.reference_field = getattr(config.astune.task_judge, 'reference_field', 'answer') + + logger.info( + f"RMAutoGraderJudge initialized with mode={self.grader_config.method_config.grader_mode.value}, " + f"language={self.grader_config.method_config.language.value}" + ) + + def _parse_config(self) -> AutoGraderConfig: + """Parse astune config into AutoGraderConfig.""" + judge_config = self.config.astune.task_judge + + # Parse grader mode + grader_mode_str = getattr(judge_config, 'grader_mode', 'pointwise').lower() + grader_mode = GraderMode.POINTWISE if grader_mode_str == 'pointwise' else GraderMode.LISTWISE + + # Parse language + language_str = getattr(judge_config, 'language', 'en').upper() + language = LanguageEnum.ZH if language_str == 'ZH' else LanguageEnum.EN + + # Parse sampling mode + sampling_mode_str = getattr(judge_config, 'sampling_mode', 'all_samples') + sampling_mode = SamplingMode.ALL_SAMPLES if sampling_mode_str == 'all_samples' else SamplingMode.SMART_SAMPLING + + # Parse aggregation mode + aggregation_mode_str = getattr(judge_config, 'aggregation_mode', 'keep_all') + aggregation_mode = AggregationMode.KEEP_ALL if aggregation_mode_str == 'keep_all' else AggregationMode.MERGE_SIMILAR + + # Create AutoRubricsConfig + rubrics_config = AutoRubricsConfig( + sampling_mode=sampling_mode, + grader_mode=grader_mode, + language=language, + generate_number=getattr(judge_config, 'generate_number', 3), + max_retries=getattr(judge_config, 'max_retries', 5), + max_epochs=getattr(judge_config, 'max_epochs', 3), + min_score=getattr(judge_config, 'min_score', 0), + max_score=getattr(judge_config, 'max_score', 10), + batch_size=getattr(judge_config, 'batch_size', 10), + mcr_batch_size=getattr(judge_config, 'mcr_batch_size', 10), + aggregation_mode=aggregation_mode, + ) + + # Create AutoGraderConfig + auto_grader_config = AutoGraderConfig( + method="auto_rubrics", + method_config=rubrics_config, + grader_name=getattr(judge_config, 'grader_name', 'RM Auto Grader'), + ) + + return auto_grader_config + + async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTask]) -> None: + """ + Generate evaluation rubrics from reference samples. + + This method should be called once during initialization with a set of + reference tasks that represent the types of problems to be evaluated. + + Args: + reference_samples: List of WorkflowTask objects with reference data + """ + logger.info(f"Generating rubrics from {len(reference_samples)} reference samples...") + + # Convert WorkflowTask samples to EvalCase format for rubric generation + # Use reference answers as example "good" outputs + eval_cases = [] + for sample in reference_samples: + eval_case = self._workflow_task_to_eval_case(sample, workflow_output=None, for_rubric_generation=True) + if eval_case: + eval_cases.append(eval_case) + + if not eval_cases: + raise ValueError("No valid eval cases could be created from reference samples") + + logger.info(f"Created {len(eval_cases)} eval cases for rubric generation") + + # Create AutoGrader + auto_grader = AutoGrader( + model=self.model, + parser=None, + config=self.grader_config, + ) + + # Generate rubrics and get LLMGrader + self.llm_grader = await auto_grader.aevaluate_batch(eval_cases) + self.rubrics_generated = True + + logger.info("Rubrics generated successfully!") + logger.info(f"Generated rubrics:\n{self.llm_grader.rubrics}") + + def _workflow_task_to_eval_case( + self, + workflow_task: WorkflowTask, + workflow_output: Optional[WorkflowOutput | List[WorkflowOutput]] = None, + for_rubric_generation: bool = False + ) -> Optional[EvalCase]: + """ + Convert WorkflowTask (and optionally WorkflowOutput) to EvalCase format. + + Args: + workflow_task: The workflow task containing query and reference + workflow_output: Single output or list of outputs (for listwise evaluation) + for_rubric_generation: If True, create training format with labeled data + + Returns: + EvalCase object or None if conversion fails + """ + try: + # Extract query + query = getattr(workflow_task.task, self.query_field, "") + if not query and hasattr(workflow_task.task, 'metadata'): + query = workflow_task.task.metadata.get(self.query_field, "") + + # Extract reference answer + reference = "" + if hasattr(workflow_task.task, 'metadata') and self.reference_field in workflow_task.task.metadata: + reference = workflow_task.task.metadata[self.reference_field] + + # Build input dict - reference should always be in input for comparison + input_dict = { + "query": query, + } + + # Build output dict + outputs = [] + + if for_rubric_generation: + # For rubric generation: directly construct outputs from metadata + # Metadata should contain pre-labeled data (with score/rank) + + grader_mode = self.grader_config.method_config.grader_mode + metadata = workflow_task.task.metadata if hasattr(workflow_task.task, 'metadata') else {} + + if grader_mode == GraderMode.POINTWISE: + # Pointwise: expect metadata with "answer" and "score" + if 'answer' in metadata and 'score' in metadata: + outputs.append({ + "answer": metadata['answer'], + "score": metadata['score'] + }) + else: + logger.warning(f"No labeled data found for pointwise rubric generation in task {workflow_task.task_id}") + return None + + else: # LISTWISE + # Listwise: expect metadata with "candidates" containing list of {answer, rank} + if 'candidates' in metadata and isinstance(metadata['candidates'], list): + for candidate in metadata['candidates']: + outputs.append({ + "answer": candidate['answer'], + "rank": candidate['rank'] + }) + else: + logger.warning(f"No labeled data found for listwise rubric generation in task {workflow_task.task_id}") + return None + else: + # For evaluation: use the actual model output (no labels) + if workflow_output: + # Handle both single output and list of outputs + if isinstance(workflow_output, list): + for output in workflow_output: + answer = output.metadata.get(self.answer_field, "") + outputs.append({"answer": answer}) + else: + answer = workflow_output.metadata.get(self.answer_field, "") + outputs.append({"answer": answer}) + else: + logger.warning(f"No workflow output provided for evaluation of task {workflow_task.task_id}") + return None + + if not outputs: + logger.warning(f"No outputs found for task {workflow_task.task_id}") + return None + + return EvalCase(input=input_dict, outputs=outputs) + + except Exception as e: + logger.warning(f"Failed to convert workflow task to eval case: {e}") + return None + + async def _async_compute_reward( + self, + workflow_task: WorkflowTask, + workflow_output: WorkflowOutput | List[WorkflowOutput] + ): + """ + Asynchronously compute reward using the generated rubrics. + + Args: + workflow_task: The task being evaluated + workflow_output: Single output for pointwise, or list of outputs for listwise + + Returns: + For pointwise: tuple (raw_reward, is_success) + For listwise: List[List[GraderScore]] + """ + if not self.rubrics_generated or self.llm_grader is None: + raise RuntimeError( + "Rubrics have not been generated yet. " + "Call generate_rubrics_from_samples() first." + ) + + # Create eval_case(s) based on input + eval_case = self._workflow_task_to_eval_case(workflow_task, workflow_output, for_rubric_generation=False) + + if not eval_case: + logger.error("Failed to create eval case from workflow task and output") + return None + + # Evaluate using LLMGrader - it handles both pointwise and listwise internally + try: + results = await self.llm_grader.aevaluate_batch(eval_cases=[eval_case]) + # For all other cases (listwise, or pointwise with multiple outputs), return raw results + return results + + except Exception as e: + logger.error(f"Error during evaluation: {e}") + return None + + def compute_reward( + self, + workflow_task: WorkflowTask, + workflow_output: WorkflowOutput + ) -> tuple: + """ + Compute reward for a workflow output (synchronous wrapper). + + This is the main interface called by astune's workflow system. + + Args: + workflow_task: The task being evaluated + workflow_output: The output to evaluate + + Returns: + tuple: (raw_reward, is_success) + """ + # Check if we're already in an async context + try: + loop = asyncio.get_running_loop() + # If we get here, we're in an async context + # We need to use nest_asyncio or raise an error + try: + import nest_asyncio + nest_asyncio.apply() + return loop.run_until_complete( + self._async_compute_reward(workflow_task, workflow_output) + ) + except ImportError: + raise RuntimeError( + "compute_reward() was called from an async context. " + "Please use 'await judge._async_compute_reward(task, output)' instead, " + "or install nest_asyncio: pip install nest_asyncio" + ) + except RuntimeError: + # No event loop running, create a new one + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + try: + return loop.run_until_complete( + self._async_compute_reward(workflow_task, workflow_output) + ) + finally: + loop.close() + diff --git a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py new file mode 100644 index 00000000..00d8300d --- /dev/null +++ b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py @@ -0,0 +1,460 @@ +""" +Example: Using RM Auto Grader Judge with astune + +This example demonstrates how to use the RM Gallery AutoGrader integration +for data-driven evaluation of workflow outputs. + +The example shows two approaches: +1. Pre-generating rubrics from reference samples +2. Online rubric generation during training (batch mode) +""" + +import asyncio +from typing import List + +from astune.workflow import Workflow, WorkflowTask, WorkflowOutput +from astune.schema.task import Task +from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + +# ============================================ +# Example 1: Pre-generated Rubrics Approach +# ============================================ + +async def example_pregerated_rubrics(): + """ + Example of using RMAutoGraderJudge with pre-generated rubrics. + + This approach is suitable when you have a separate set of reference samples + and want to generate rubrics once before training begins. + """ + print("=" * 60) + print("Example 1: Pre-generated Rubrics Approach") + print("=" * 60) + + # Mock config object + class MockConfig: + class Astune: + class TaskJudge: + # Model configuration + model_name = "qwen3-32b" + + # Grader configuration + grader_mode = "pointwise" + language = "en" + min_score = 0 + max_score = 1 + success_threshold = 0.7 + + # Rubric generation configuration + sampling_mode = "all_samples" + generate_number = 1 + max_epochs = 2 + max_retries = 3 + aggregation_mode = "keep_all" + + # Field mappings + query_field = "main_query" + answer_field = "final_answer" + reference_field = "answer" + + grader_name = "Math Auto Grader" + + task_judge = TaskJudge() + + astune = Astune() + + config = MockConfig() + + # Step 1: Create reference samples for rubric generation + print("\nStep 1: Creating reference samples...") + reference_samples = create_math_reference_samples(num_samples=10) + print(f"Created {len(reference_samples)} reference samples") + + # Step 2: Initialize judge + print("\nStep 2: Initializing RMAutoGraderJudge...") + judge = RMAutoGraderJudge(config) + + # Step 3: Generate rubrics from reference samples + print("\nStep 3: Generating rubrics from reference samples...") + print("(This may take a few minutes depending on the number of samples)") + await judge.generate_rubrics_from_samples(reference_samples) + print("✓ Rubrics generated successfully!") + print(f"\nGenerated rubrics:\n{judge.llm_grader.rubrics}\n") + + # Step 4: Evaluate new samples using generated rubrics + print("\nStep 4: Evaluating new samples...") + test_samples = create_math_test_samples(num_samples=5) + + for i, (task, output) in enumerate(test_samples, 1): + print(f"\n--- Test Sample {i} ---") + print(f"Query: {task.task.main_query}") + print(f"Answer: {output.metadata['final_answer']}") + print(f"Reference: {task.task.metadata['answer']}") + + # Use async method directly since we're in async context + reward = await judge._async_compute_reward(task, output) + print(f"Result: {reward}") + + print("\n" + "=" * 60) + print("Example 1 completed!") + print("=" * 60) + + +# ============================================ +# Example 2: Listwise Mode with Multiple Outputs +# ============================================ + +async def example_listwise_mode(): + """ + Example of using RMAutoGraderJudge in Listwise mode. + + Listwise mode ranks multiple candidate answers for the same query. + This is useful for: + - Comparing multiple model outputs + - Ranking candidate responses by quality + - Batch evaluation of similar tasks + """ + print("\n\n" + "=" * 60) + print("Example 2: Listwise Mode with Multiple Outputs") + print("=" * 60) + + # Mock config object + class MockConfig: + class Astune: + class TaskJudge: + # Model configuration + model_name = "qwen3-32b" + + # Grader configuration - LISTWISE mode + grader_mode = "listwise" # Key difference! + language = "en" + min_score = 0 + max_score = 1 + success_threshold = 0.7 + + # Rubric generation configuration + sampling_mode = "all_samples" + generate_number = 2 + max_epochs = 2 + max_retries = 3 + aggregation_mode = "keep_all" + + # Field mappings + query_field = "main_query" + answer_field = "final_answer" + reference_field = "answer" + + grader_name = "Math Listwise Grader" + + task_judge = TaskJudge() + + astune = Astune() + + config = MockConfig() + + # Step 1: Create reference samples with multiple outputs per query + print("\nStep 1: Creating reference samples with multiple outputs...") + reference_samples = create_listwise_reference_samples(num_samples=5) + print(f"Created {len(reference_samples)} reference samples") + print("Each sample contains multiple candidate answers with rankings") + + # Step 2: Initialize judge + print("\nStep 2: Initializing RMAutoGraderJudge in Listwise mode...") + judge = RMAutoGraderJudge(config) + + # Step 3: Generate rubrics from reference samples + print("\nStep 3: Generating rubrics from reference samples...") + print("(Listwise mode learns to rank multiple outputs)") + await judge.generate_rubrics_from_samples(reference_samples) + print("✓ Rubrics generated successfully!") + print(f"\nGenerated rubrics:\n{judge.llm_grader.rubrics}\n") + + # Step 4: Evaluate multiple candidate answers for new queries + print("\nStep 4: Evaluating multiple candidates for each query...") + test_queries = create_listwise_test_samples(num_queries=3) + + for i, (query_task, candidate_outputs) in enumerate(test_queries, 1): + print(f"\n{'='*50}") + print(f"Query {i}: {query_task.task.main_query}") + print(f"{'='*50}") + print(f"Evaluating {len(candidate_outputs)} candidates...") + + # Evaluate all candidates together (pass list for listwise mode) + results_batch = await judge._async_compute_reward(query_task, candidate_outputs) + + if results_batch and len(results_batch) > 0 and len(results_batch[0]) > 0: + # Extract ranks for each candidate (score field contains rank in listwise mode) + results = [] + for j, (output, grader_score) in enumerate(zip(candidate_outputs, results_batch[0]), 1): + rank = grader_score.score if hasattr(grader_score, 'score') else j + results.append((j, output.metadata['final_answer'], rank)) + + # Sort by rank (ascending, rank 1 is best) + results.sort(key=lambda x: x[2]) + + print("\nRanking (best to worst):") + for display_rank, (idx, answer, model_rank) in enumerate(results, 1): + print(f" {display_rank}. Candidate {idx}: '{answer}' (Model Rank: {model_rank})") + else: + print("No results returned from evaluation") + + print("\n" + "=" * 60) + print("Example 3 completed!") + print("=" * 60) + + +# ============================================ +# Helper Functions +# ============================================ + +def create_math_reference_samples(num_samples: int = 10) -> List[WorkflowTask]: + """ + Create reference math problem samples for Pointwise rubric generation. + + Each sample contains a single answer with a score label. + """ + samples = [] + + # Simple math problems with answers and scores + # Format: (query, answer, score) + problems = [ + ("What is 15 + 27?", "42", 1), + ("Calculate 8 * 9", "72", 1), + ("What is 100 - 37?", "63", 1), + ("Find the value of 144 / 12", "12", 1), + ("What is 5^3?", "125", 1), + ("Calculate 23 + 45 - 18", "50", 1), + ("What is 7 * 8 + 6?", "62", 1), + ("Find the value of (15 + 5) * 2", "40", 1), + ("What is 99 - 33 - 22?", "44", 1), + ("Calculate 16 / 4 + 10", "14", 1), + ] + + for i in range(min(num_samples, len(problems))): + query, answer, score = problems[i] + + task = Task( + main_query=query, + task_id=f"ref_sample_{i}", + metadata={ + "answer": answer, + "score": score # Pointwise label + } + ) + + workflow_task = WorkflowTask( + task_id=f"ref_sample_{i}", + task=task, + ) + + samples.append(workflow_task) + + return samples + + +def create_listwise_reference_samples(num_samples: int = 5) -> List[WorkflowTask]: + """ + Create reference samples for Listwise mode rubric generation. + + Each sample should contain multiple outputs with different quality levels. + This helps the model learn to distinguish between good and bad answers. + """ + samples = [] + + # Math problems with multiple candidate answers and their quality rankings + # Lower rank = better quality (rank 1 is best) + problems = [ + ("What is 10 + 15?", [ + ("25", 1), # Perfect answer + ("Twenty-five", 2), # Correct but different format + ("24", 3), # Close but wrong + ("30", 4), # Wrong + ]), + ("Calculate 6 * 7", [ + ("42", 1), # Perfect + ("6*7=42", 2), # Correct with work shown + ("43", 3), # Off by one + ("36", 4), # Wrong (6*6) + ]), + ("What is 50 - 18?", [ + ("32", 1), # Perfect + ("50-18=32", 2), # Correct with work + ("33", 3), # Close + ("42", 4), # Wrong + ]), + ("Find 12 / 4", [ + ("3", 1), # Perfect + ("3.0", 2), # Correct, decimal format + ("4", 3), # Wrong + ("2", 4), # Very wrong + ]), + ("What is 2^5?", [ + ("32", 1), # Perfect + ("2*2*2*2*2=32", 2), # Correct with work + ("16", 3), # 2^4, common mistake + ("10", 4), # 2*5, wrong operation + ]), + ] + + for i in range(min(num_samples, len(problems))): + query, candidates = problems[i] + + # Create task with metadata containing all candidates and their ranks + task = Task( + main_query=query, + task_id=f"listwise_ref_{i}", + metadata={ + "candidates": [{"answer": ans, "rank": rank} for ans, rank in candidates] + } + ) + + workflow_task = WorkflowTask( + task_id=f"listwise_ref_{i}", + task=task, + ) + + samples.append(workflow_task) + + return samples + + +def create_listwise_test_samples(num_queries: int = 3) -> List[tuple[WorkflowTask, List[WorkflowOutput]]]: + """ + Create test queries with multiple candidate outputs for Listwise evaluation. + + Returns: + List of (query_task, list_of_candidate_outputs) tuples + """ + test_data = [] + + # Test queries with multiple candidate answers + queries = [ + ("What is 45 + 37?", [ + "82", # Correct + "45+37=82", # Correct with work + "83", # Off by one + "72", # Wrong + "Eighty-two", # Correct, word form + ]), + ("Calculate 9 * 8", [ + "72", # Correct + "73", # Close + "81", # 9*9, common mistake + "9*8=72", # Correct with work + "64", # 8*8, wrong + ]), + ("What is 100 - 45?", [ + "55", # Correct + "100-45=55", # Correct with work + "65", # Wrong + "Fifty-five", # Correct, word form + "54", # Off by one + ]), + ] + + for i in range(min(num_queries, len(queries))): + query, candidates = queries[i] + + # Create task + task = Task( + main_query=query, + task_id=f"listwise_test_{i}", + metadata={} # No reference needed for evaluation + ) + + workflow_task = WorkflowTask( + task_id=f"listwise_test_{i}", + task=task, + ) + + # Create output for each candidate + candidate_outputs = [] + for j, candidate_answer in enumerate(candidates): + output = WorkflowOutput( + metadata={"final_answer": candidate_answer} + ) + candidate_outputs.append(output) + + test_data.append((workflow_task, candidate_outputs)) + + return test_data + + +def create_math_test_samples(num_samples: int = 5) -> List[tuple[WorkflowTask, WorkflowOutput]]: + """Create test samples (task + output pairs) for evaluation.""" + samples = [] + + # Test problems with model outputs (some correct, some incorrect) + test_cases = [ + ("What is 25 + 38?", "63", "63", True), + ("Calculate 12 * 5", "60", "60", True), + ("What is 90 - 45?", "45", "45", True), + ("Find the value of 64 / 8", "8", "7", False), # Wrong answer + ("What is 3^4?", "81", "64", False), # Wrong answer + ("Calculate 18 + 22", "40", "40", True), + ("What is 9 * 7?", "63", "56", False), # Wrong answer + ("Find the value of (10 + 5) * 3", "45", "45", True), + ("What is 77 - 33?", "44", "44", True), + ("Calculate 20 / 5 + 15", "19", "19", True), + ("What is 6 * 8 - 10?", "38", "40", False), # Wrong answer + ("Find the value of 55 + 45", "100", "100", True), + ("What is 100 - 25 - 25?", "50", "50", True), + ("Calculate 7^2", "49", "49", True), + ("What is (20 - 5) / 3?", "5", "7", False), # Wrong answer + ] + + for i in range(min(num_samples, len(test_cases))): + query, reference, model_output, _ = test_cases[i] + + task = Task( + main_query=query, + task_id=f"test_sample_{i}", + metadata={"answer": reference} + ) + + workflow_task = WorkflowTask( + task_id=f"test_sample_{i}", + task=task, + ) + + workflow_output = WorkflowOutput( + metadata={"final_answer": model_output} + ) + + samples.append((workflow_task, workflow_output)) + + return samples + + + +# ============================================ +# Main Entry Point +# ============================================ + +async def main(): + """Run all examples.""" + print("\n") + print("╔" + "═" * 58 + "╗") + print("║" + " " * 10 + "RM Auto Grader Judge Examples" + " " * 18 + "║") + print("╚" + "═" * 58 + "╝") + + # Run examples + try: + await example_pregerated_rubrics() + # await example_batch_rubrics() + await example_listwise_mode() + + print("\n\n" + "═" * 60) + print("All examples completed successfully!") + print("═" * 60) + + except Exception as e: + print(f"\n✗ Error running examples: {e}") + import traceback + traceback.print_exc() + + +if __name__ == "__main__": + # Run the examples + asyncio.run(main()) + From be4fd1bbd084d98771dc79567a2b4bbd730bbb19 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 10:59:05 +0800 Subject: [PATCH 166/462] rm gallery change Former-commit-id: ad327724fb52f82ab99e235c3c2aa23353b8535a --- README.md | 2 + astune/default_config/astune_default.yaml | 22 +++ astune/task_judge/rm_auto_grader_judge.py | 114 +++++++------- astune_tests/testing_rubrics.py | 179 ++++++++++++++++++++++ scripts/requirements_trinity.txt | 1 + scripts/requirements_verl.txt | 1 + 6 files changed, 262 insertions(+), 57 deletions(-) create mode 100644 astune_tests/testing_rubrics.py diff --git a/README.md b/README.md index a255d8a7..af3f387a 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j source .venv/bin/activate git clone https://github.com/binary-husky/Trinity-RFT external/trinity git clone https://github.com/binary-husky/agentscope external/agentscope + git clone http://gitlab.alibaba-inc.com/DAIL-LLM/RM-Gallery.git -b xlp_dev external/rm_gallery # Install dependencies uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ @@ -28,6 +29,7 @@ We recommend using `uv` to setup the dependencies, and `conda` can also do the j uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps # uv pip install -e external/agentscope -i https://mirrors.aliyun.com/pypi/simple/ uv pip install agentscope==1.0.7 -i https://mirrors.aliyun.com/pypi/simple/ + uv pip install -e external/rm_gallery -i https://mirrors.aliyun.com/pypi/simple/ # Install flash attention (must be installed at last) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index a830a1d5..b85265df 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -23,10 +23,32 @@ astune: validation_split: "validation" task_judge: + judge_type: rubrics_auto_grader # Options: custom_protocal, rubrics_auto_grader judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 + # rubrics begin + class_name: RMAutoGraderJudge + model_name: qwen3-32b + grader_mode: pointwise + language: en + min_score: 0 + max_score: 1 + success_threshold: 0.7 + sampling_mode: all_samples + generate_number: 1 + max_epochs: 2 + max_retries: 3 + aggregation_mode: keep_all + query_field: main_query + answer_field: final_answer + reference_field: answer + grader_name: Math Auto Grader + num_reference_samples: 20 + # rubrics end + + model: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct diff --git a/astune/task_judge/rm_auto_grader_judge.py b/astune/task_judge/rm_auto_grader_judge.py index dc7862a1..0e7e23dc 100644 --- a/astune/task_judge/rm_auto_grader_judge.py +++ b/astune/task_judge/rm_auto_grader_judge.py @@ -31,15 +31,15 @@ class RMAutoGraderJudge(JudgeBase): """ A data-driven judge that uses RM Gallery's AutoGrader to evaluate workflow outputs. - + This judge automatically generates evaluation rubrics from a set of reference samples and then uses those rubrics to score new workflow outputs. - + Workflow: 1. Initialize with configuration and reference samples 2. Generate rubrics from reference samples (one-time setup) 3. Evaluate each workflow output against the generated rubrics - + Example Config (in YAML): task_judge: class_name: RMAutoGraderJudge @@ -47,23 +47,23 @@ class RMAutoGraderJudge(JudgeBase): model_name: "qwen-plus" # or "gpt-4", "claude-3-sonnet", etc. api_key: "your-api-key" base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1" # optional - + # Rubric Generation Configuration grader_mode: "pointwise" # or "listwise" language: "en" # or "zh" min_score: 0 max_score: 10 - + # AutoRubrics Configuration sampling_mode: "all_samples" # or "smart_sampling" generate_number: 3 # number of rubrics per sample max_epochs: 3 # max iterations for refinement aggregation_mode: "keep_all" # or "merge_similar" - + # Reference samples for rubric generation reference_samples_path: "path/to/reference_samples.jsonl" # optional num_reference_samples: 20 # number of samples to use for rubric generation - + # Custom field mapping (optional) query_field: "main_query" # field in task containing query answer_field: "final_answer" # field in metadata containing answer @@ -72,27 +72,27 @@ class RMAutoGraderJudge(JudgeBase): def __init__(self, config): """Initialize the RMAutoGraderJudge. - + Args: config: Configuration object containing model and rubric generation settings """ super().__init__(config) - + self.config = config self.grader_config = self._parse_config() - + # Initialize the model - self.model = OpenAIChatModel(model_name=config.astune.task_judge.model_name, stream=False) - + self.model = OpenAIChatModel(model=config.astune.task_judge.model_name, stream=False) + # Storage for generated grader self.llm_grader: Optional[LLMGrader] = None self.rubrics_generated = False - + # Field mappings for data extraction self.query_field = getattr(config.astune.task_judge, 'query_field', 'main_query') self.answer_field = getattr(config.astune.task_judge, 'answer_field', 'final_answer') self.reference_field = getattr(config.astune.task_judge, 'reference_field', 'answer') - + logger.info( f"RMAutoGraderJudge initialized with mode={self.grader_config.method_config.grader_mode.value}, " f"language={self.grader_config.method_config.language.value}" @@ -101,23 +101,23 @@ def __init__(self, config): def _parse_config(self) -> AutoGraderConfig: """Parse astune config into AutoGraderConfig.""" judge_config = self.config.astune.task_judge - + # Parse grader mode grader_mode_str = getattr(judge_config, 'grader_mode', 'pointwise').lower() grader_mode = GraderMode.POINTWISE if grader_mode_str == 'pointwise' else GraderMode.LISTWISE - + # Parse language language_str = getattr(judge_config, 'language', 'en').upper() language = LanguageEnum.ZH if language_str == 'ZH' else LanguageEnum.EN - + # Parse sampling mode sampling_mode_str = getattr(judge_config, 'sampling_mode', 'all_samples') sampling_mode = SamplingMode.ALL_SAMPLES if sampling_mode_str == 'all_samples' else SamplingMode.SMART_SAMPLING - + # Parse aggregation mode aggregation_mode_str = getattr(judge_config, 'aggregation_mode', 'keep_all') aggregation_mode = AggregationMode.KEEP_ALL if aggregation_mode_str == 'keep_all' else AggregationMode.MERGE_SIMILAR - + # Create AutoRubricsConfig rubrics_config = AutoRubricsConfig( sampling_mode=sampling_mode, @@ -132,28 +132,28 @@ def _parse_config(self) -> AutoGraderConfig: mcr_batch_size=getattr(judge_config, 'mcr_batch_size', 10), aggregation_mode=aggregation_mode, ) - + # Create AutoGraderConfig auto_grader_config = AutoGraderConfig( method="auto_rubrics", method_config=rubrics_config, grader_name=getattr(judge_config, 'grader_name', 'RM Auto Grader'), ) - + return auto_grader_config async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTask]) -> None: """ Generate evaluation rubrics from reference samples. - + This method should be called once during initialization with a set of reference tasks that represent the types of problems to be evaluated. - + Args: reference_samples: List of WorkflowTask objects with reference data """ logger.info(f"Generating rubrics from {len(reference_samples)} reference samples...") - + # Convert WorkflowTask samples to EvalCase format for rubric generation # Use reference answers as example "good" outputs eval_cases = [] @@ -161,40 +161,40 @@ async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTa eval_case = self._workflow_task_to_eval_case(sample, workflow_output=None, for_rubric_generation=True) if eval_case: eval_cases.append(eval_case) - + if not eval_cases: raise ValueError("No valid eval cases could be created from reference samples") - + logger.info(f"Created {len(eval_cases)} eval cases for rubric generation") - + # Create AutoGrader auto_grader = AutoGrader( model=self.model, parser=None, config=self.grader_config, ) - + # Generate rubrics and get LLMGrader self.llm_grader = await auto_grader.aevaluate_batch(eval_cases) self.rubrics_generated = True - + logger.info("Rubrics generated successfully!") logger.info(f"Generated rubrics:\n{self.llm_grader.rubrics}") def _workflow_task_to_eval_case( - self, - workflow_task: WorkflowTask, - workflow_output: Optional[WorkflowOutput | List[WorkflowOutput]] = None, + self, + workflow_task: WorkflowTask, + workflow_output: Optional[WorkflowOutput | List[WorkflowOutput]] = None, for_rubric_generation: bool = False ) -> Optional[EvalCase]: """ Convert WorkflowTask (and optionally WorkflowOutput) to EvalCase format. - + Args: workflow_task: The workflow task containing query and reference workflow_output: Single output or list of outputs (for listwise evaluation) for_rubric_generation: If True, create training format with labeled data - + Returns: EvalCase object or None if conversion fails """ @@ -203,27 +203,27 @@ def _workflow_task_to_eval_case( query = getattr(workflow_task.task, self.query_field, "") if not query and hasattr(workflow_task.task, 'metadata'): query = workflow_task.task.metadata.get(self.query_field, "") - + # Extract reference answer reference = "" if hasattr(workflow_task.task, 'metadata') and self.reference_field in workflow_task.task.metadata: reference = workflow_task.task.metadata[self.reference_field] - + # Build input dict - reference should always be in input for comparison input_dict = { "query": query, } - + # Build output dict outputs = [] - + if for_rubric_generation: # For rubric generation: directly construct outputs from metadata # Metadata should contain pre-labeled data (with score/rank) - + grader_mode = self.grader_config.method_config.grader_mode metadata = workflow_task.task.metadata if hasattr(workflow_task.task, 'metadata') else {} - + if grader_mode == GraderMode.POINTWISE: # Pointwise: expect metadata with "answer" and "score" if 'answer' in metadata and 'score' in metadata: @@ -234,7 +234,7 @@ def _workflow_task_to_eval_case( else: logger.warning(f"No labeled data found for pointwise rubric generation in task {workflow_task.task_id}") return None - + else: # LISTWISE # Listwise: expect metadata with "candidates" containing list of {answer, rank} if 'candidates' in metadata and isinstance(metadata['candidates'], list): @@ -260,29 +260,29 @@ def _workflow_task_to_eval_case( else: logger.warning(f"No workflow output provided for evaluation of task {workflow_task.task_id}") return None - + if not outputs: logger.warning(f"No outputs found for task {workflow_task.task_id}") return None - + return EvalCase(input=input_dict, outputs=outputs) - + except Exception as e: logger.warning(f"Failed to convert workflow task to eval case: {e}") return None async def _async_compute_reward( - self, - workflow_task: WorkflowTask, + self, + workflow_task: WorkflowTask, workflow_output: WorkflowOutput | List[WorkflowOutput] ): """ Asynchronously compute reward using the generated rubrics. - + Args: workflow_task: The task being evaluated workflow_output: Single output for pointwise, or list of outputs for listwise - + Returns: For pointwise: tuple (raw_reward, is_success) For listwise: List[List[GraderScore]] @@ -292,38 +292,38 @@ async def _async_compute_reward( "Rubrics have not been generated yet. " "Call generate_rubrics_from_samples() first." ) - + # Create eval_case(s) based on input eval_case = self._workflow_task_to_eval_case(workflow_task, workflow_output, for_rubric_generation=False) - + if not eval_case: logger.error("Failed to create eval case from workflow task and output") return None - + # Evaluate using LLMGrader - it handles both pointwise and listwise internally try: results = await self.llm_grader.aevaluate_batch(eval_cases=[eval_case]) # For all other cases (listwise, or pointwise with multiple outputs), return raw results return results - + except Exception as e: logger.error(f"Error during evaluation: {e}") return None def compute_reward( - self, - workflow_task: WorkflowTask, + self, + workflow_task: WorkflowTask, workflow_output: WorkflowOutput ) -> tuple: """ Compute reward for a workflow output (synchronous wrapper). - + This is the main interface called by astune's workflow system. - + Args: workflow_task: The task being evaluated workflow_output: The output to evaluate - + Returns: tuple: (raw_reward, is_success) """ diff --git a/astune_tests/testing_rubrics.py b/astune_tests/testing_rubrics.py new file mode 100644 index 00000000..ced4408e --- /dev/null +++ b/astune_tests/testing_rubrics.py @@ -0,0 +1,179 @@ +import pytest +import json +from pathlib import Path +from typing import List +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task, WorkflowTask, WorkflowOutput +from pathlib import Path +from types import SimpleNamespace +from typing import List +from astune.task_reader.tracing_reader import TracingReader +from astune.schema.task import Task +from astune.utils.config_utils import read_astune_config +from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + + + +# @pytest.fixture +# def config(tmp_path: Path) -> SimpleNamespace: +# a = SimpleNamespace() +# a.astune = SimpleNamespace() +# a.astune.tracing = { +# "base_url": "./.trash/database.sqlite", +# "train_output_path": str(tmp_path / "tasks.jsonl"), +# "filters": [], +# } +# return a + + +# @pytest.fixture +# def config_with_filter(tmp_path: Path) -> SimpleNamespace: +# a = SimpleNamespace() +# a.astune = SimpleNamespace() +# a.astune.tracing = { +# "base_url": "./.trash/database.sqlite", +# "train_output_path": str(tmp_path / "tasks.jsonl"), +# "filters": [ +# { +# "type": "llm_evaluate", +# "enabled": True, +# "params": { +# "custom_rubrics": "If the answer claims that it has written the output to a file, consider it an invalid response.", +# "temperature": 0.5, +# "max_tokens": 2048, +# "print_reason": False, +# }, +# } +# ], +# } +# return a + +def create_math_reference_samples(num_samples: int = 10) -> List[WorkflowTask]: + """ + Create reference math problem samples for Pointwise rubric generation. + + Each sample contains a single answer with a score label. + """ + samples = [] + + # Simple math problems with answers and scores + # Format: (query, answer, score) + problems = [ + ("What is 15 + 27?", "42", 1), + ("Calculate 8 * 9", "72", 1), + ("What is 100 - 37?", "63", 1), + ("Find the value of 144 / 12", "12", 1), + ("What is 5^3?", "125", 1), + ("Calculate 23 + 45 - 18", "50", 1), + ("What is 7 * 8 + 6?", "62", 1), + ("Find the value of (15 + 5) * 2", "40", 1), + ("What is 99 - 33 - 22?", "44", 1), + ("Calculate 16 / 4 + 10", "14", 1), + ] + + for i in range(min(num_samples, len(problems))): + query, answer, score = problems[i] + + task = Task( + main_query=query, + task_id=f"ref_sample_{i}", + metadata={ + "answer": answer, + "score": score # Pointwise label + } + ) + + workflow_task = WorkflowTask( + task_id=f"ref_sample_{i}", + task=task, + ) + + samples.append(workflow_task) + + return samples + +def create_math_test_samples(num_samples: int = 5) -> List[tuple[WorkflowTask, WorkflowOutput]]: + """Create test samples (task + output pairs) for evaluation.""" + samples = [] + + # Test problems with model outputs (some correct, some incorrect) + test_cases = [ + ("What is 25 + 38?", "63", "63", True), + ("Calculate 12 * 5", "60", "60", True), + ("What is 90 - 45?", "45", "45", True), + ("Find the value of 64 / 8", "8", "7", False), # Wrong answer + ("What is 3^4?", "81", "64", False), # Wrong answer + ("Calculate 18 + 22", "40", "40", True), + ("What is 9 * 7?", "63", "56", False), # Wrong answer + ("Find the value of (10 + 5) * 3", "45", "45", True), + ("What is 77 - 33?", "44", "44", True), + ("Calculate 20 / 5 + 15", "19", "19", True), + ("What is 6 * 8 - 10?", "38", "40", False), # Wrong answer + ("Find the value of 55 + 45", "100", "100", True), + ("What is 100 - 25 - 25?", "50", "50", True), + ("Calculate 7^2", "49", "49", True), + ("What is (20 - 5) / 3?", "5", "7", False), # Wrong answer + ] + + for i in range(min(num_samples, len(test_cases))): + query, reference, model_output, _ = test_cases[i] + + task = Task( + main_query=query, + task_id=f"test_sample_{i}", + metadata={"answer": reference} + ) + + workflow_task = WorkflowTask( + task_id=f"test_sample_{i}", + task=task, + ) + + workflow_output = WorkflowOutput( + metadata={"final_answer": model_output} + ) + + samples.append((workflow_task, workflow_output)) + + return samples + + +async def test_get_training_tasks_new_file(): + config = read_astune_config("astune/default_config/astune_default.yaml") + # Step 1: Create reference samples for rubric generation + print("\nStep 1: Creating reference samples...") + reference_samples = create_math_reference_samples(num_samples=10) + print(f"Created {len(reference_samples)} reference samples") + + # Step 2: Initialize judge + print("\nStep 2: Initializing RMAutoGraderJudge...") + judge = RMAutoGraderJudge(config) + + # Step 3: Generate rubrics from reference samples + print("\nStep 3: Generating rubrics from reference samples...") + print("(This may take a few minutes depending on the number of samples)") + await judge.generate_rubrics_from_samples(reference_samples) + print("✓ Rubrics generated successfully!") + print(f"\nGenerated rubrics:\n{judge.llm_grader.rubrics}\n") + + # Step 4: Evaluate new samples using generated rubrics + print("\nStep 4: Evaluating new samples...") + test_samples = create_math_test_samples(num_samples=5) + + for i, (task, output) in enumerate(test_samples, 1): + print(f"\n--- Test Sample {i} ---") + print(f"Query: {task.task.main_query}") + print(f"Answer: {output.metadata['final_answer']}") + print(f"Reference: {task.task.metadata['answer']}") + + # Use async method directly since we're in async context + reward = await judge._async_compute_reward(task, output) + print(f"Result: {reward}") + + print("\n" + "=" * 60) + print("Example 1 completed!") + print("=" * 60) + + +import asyncio +asyncio.run(test_get_training_tasks_new_file()) \ No newline at end of file diff --git a/scripts/requirements_trinity.txt b/scripts/requirements_trinity.txt index 4dc4273e..c6ebeca5 100644 --- a/scripts/requirements_trinity.txt +++ b/scripts/requirements_trinity.txt @@ -16,6 +16,7 @@ astor==0.8.1 async-timeout==5.0.1 attrs==25.4.0 beast-logger +scikit-learn bidict==0.23.1 blake3==1.0.8 blinker==1.9.0 diff --git a/scripts/requirements_verl.txt b/scripts/requirements_verl.txt index 68fc0024..abd2afd7 100644 --- a/scripts/requirements_verl.txt +++ b/scripts/requirements_verl.txt @@ -17,6 +17,7 @@ async-timeout==5.0.1 attrs==25.4.0 av==15.0.0 beast-logger +scikit-learn bidict==0.23.1 blake3==1.0.5 blobfile==3.0.0 From 935992756e3125836f5f6f2d83f7c4f143028718 Mon Sep 17 00:00:00 2001 From: "xielipeng.xlp" Date: Mon, 24 Nov 2025 11:55:00 +0800 Subject: [PATCH 167/462] [fix] grader evaluate Former-commit-id: 7b8f91bc2febe9dfa1d235ff9cdba3c2c24b5c8a --- astune/task_judge/rm_auto_grader_judge.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/astune/task_judge/rm_auto_grader_judge.py b/astune/task_judge/rm_auto_grader_judge.py index 0e7e23dc..bc34516f 100644 --- a/astune/task_judge/rm_auto_grader_judge.py +++ b/astune/task_judge/rm_auto_grader_judge.py @@ -27,6 +27,8 @@ from rm_gallery.core.schema.data import EvalCase from rm_gallery.core.schema.template import LanguageEnum +from rm_gallery.core.grader.base import aevaluate_with_cases + class RMAutoGraderJudge(JudgeBase): """ @@ -175,7 +177,7 @@ async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTa ) # Generate rubrics and get LLMGrader - self.llm_grader = await auto_grader.aevaluate_batch(eval_cases) + self.llm_grader = await auto_grader.run(eval_cases) self.rubrics_generated = True logger.info("Rubrics generated successfully!") @@ -302,7 +304,7 @@ async def _async_compute_reward( # Evaluate using LLMGrader - it handles both pointwise and listwise internally try: - results = await self.llm_grader.aevaluate_batch(eval_cases=[eval_case]) + results = await aevaluate_with_cases(self.llm_grader, eval_cases=[eval_case]) # For all other cases (listwise, or pointwise with multiple outputs), return raw results return results From 358348c1bb6d6e9b708906dff0f8b0c26e3bf6e2 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 12:46:14 +0800 Subject: [PATCH 168/462] use qwen-max to generate rubrics Former-commit-id: e189288ac71921bc9c1d59c77738df3e76b157e7 --- astune/default_config/astune_default.yaml | 2 +- launcher.py | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index b85265df..cfdea09c 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -30,7 +30,7 @@ astune: # rubrics begin class_name: RMAutoGraderJudge - model_name: qwen3-32b + model_name: qwen-max grader_mode: pointwise language: en min_score: 0 diff --git a/launcher.py b/launcher.py index 0840b4a4..0b42e4b4 100644 --- a/launcher.py +++ b/launcher.py @@ -39,18 +39,13 @@ def parse_args(): help="Path to experiment directory", ) parser.add_argument( - "--db", + "--debug", type=str, default="", required=False, help="Path to configuration file", ) - parser.add_argument( - "--with-exp-maker", - action="store_true", - default=False, - help="Launch exp maker", - ) + parser.add_argument("--with-ray", action="store_true", default=False, help="Launch ray") parser.add_argument( "--with-appworld", @@ -155,9 +150,9 @@ def main(): exp_config, ) = prepare_experiment_config(yaml_path, exp_dir, args.backbone) - if args.db: + if args.debug: env["RAY_DEBUG_POST_MORTEM"] = "1" - env["DEBUG_TAGS"] = args.db + env["DEBUG_TAGS"] = args.debug env["RAY_record_task_actor_creation_sites"] = "true" assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore logger.warning("Debug mode is ON") From 93d8b408cefbdb7f7e763321bcf46d7950141a7e Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 15:22:00 +0800 Subject: [PATCH 169/462] Refactor RMAutoGraderJudge configuration and add example config for RM Auto Grader Judge Former-commit-id: 5a739f6b681e40a88e44b88ff122d7ba813919da --- astune/default_config/astune_default.yaml | 39 ++++++++++--------- astune/task_judge/rm_auto_grader_judge.py | 12 +++--- launcher.py | 3 -- .../example_rm_auto_grader/config.md | 35 ++++++++--------- 4 files changed, 43 insertions(+), 46 deletions(-) rename astune/default_config/rm_auto_grader_example.yaml => tutorial/example_rm_auto_grader/config.md (97%) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index cfdea09c..117a1faf 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -28,25 +28,26 @@ astune: alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - # rubrics begin - class_name: RMAutoGraderJudge - model_name: qwen-max - grader_mode: pointwise - language: en - min_score: 0 - max_score: 1 - success_threshold: 0.7 - sampling_mode: all_samples - generate_number: 1 - max_epochs: 2 - max_retries: 3 - aggregation_mode: keep_all - query_field: main_query - answer_field: final_answer - reference_field: answer - grader_name: Math Auto Grader - num_reference_samples: 20 - # rubrics end + rubrics_auto_grader: + # rubrics begin + model_name: qwen-max + grader_mode: pointwise + language: en + min_score: 0 + max_score: 1 + success_threshold: 0.7 + sampling_mode: all_samples + generate_number: 1 + max_epochs: 2 + max_retries: 3 + aggregation_mode: keep_all + grader_name: Math Auto Grader + num_reference_samples: 20 + + query_field: main_query + answer_field: final_answer + reference_field: answer + # rubrics end model: diff --git a/astune/task_judge/rm_auto_grader_judge.py b/astune/task_judge/rm_auto_grader_judge.py index bc34516f..5e4f83b6 100644 --- a/astune/task_judge/rm_auto_grader_judge.py +++ b/astune/task_judge/rm_auto_grader_judge.py @@ -44,7 +44,6 @@ class RMAutoGraderJudge(JudgeBase): Example Config (in YAML): task_judge: - class_name: RMAutoGraderJudge # RM Gallery Model Configuration model_name: "qwen-plus" # or "gpt-4", "claude-3-sonnet", etc. api_key: "your-api-key" @@ -84,16 +83,16 @@ def __init__(self, config): self.grader_config = self._parse_config() # Initialize the model - self.model = OpenAIChatModel(model=config.astune.task_judge.model_name, stream=False) + self.model = OpenAIChatModel(model=config.astune.task_judge.rubrics_auto_grader.model_name, stream=False) # Storage for generated grader self.llm_grader: Optional[LLMGrader] = None self.rubrics_generated = False # Field mappings for data extraction - self.query_field = getattr(config.astune.task_judge, 'query_field', 'main_query') - self.answer_field = getattr(config.astune.task_judge, 'answer_field', 'final_answer') - self.reference_field = getattr(config.astune.task_judge, 'reference_field', 'answer') + self.query_field = getattr(config.astune.task_judge.rubrics_auto_grader, 'query_field', 'main_query') + self.answer_field = getattr(config.astune.task_judge.rubrics_auto_grader, 'answer_field', 'final_answer') + self.reference_field = getattr(config.astune.task_judge.rubrics_auto_grader, 'reference_field', 'answer') logger.info( f"RMAutoGraderJudge initialized with mode={self.grader_config.method_config.grader_mode.value}, " @@ -102,7 +101,7 @@ def __init__(self, config): def _parse_config(self) -> AutoGraderConfig: """Parse astune config into AutoGraderConfig.""" - judge_config = self.config.astune.task_judge + judge_config = self.config.astune.task_judge.rubrics_auto_grader # Parse grader mode grader_mode_str = getattr(judge_config, 'grader_mode', 'pointwise').lower() @@ -183,6 +182,7 @@ async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTa logger.info("Rubrics generated successfully!") logger.info(f"Generated rubrics:\n{self.llm_grader.rubrics}") + def _workflow_task_to_eval_case( self, workflow_task: WorkflowTask, diff --git a/launcher.py b/launcher.py index 0b42e4b4..52756233 100644 --- a/launcher.py +++ b/launcher.py @@ -168,9 +168,6 @@ def main(): if args.with_ray: start_ray_service(args, env) - if args.with_exp_maker: - pty_launch("exp_maker", success_std_string="Uvicorn running on") - if args.with_appworld: pty_launch("appworld") diff --git a/astune/default_config/rm_auto_grader_example.yaml b/tutorial/example_rm_auto_grader/config.md similarity index 97% rename from astune/default_config/rm_auto_grader_example.yaml rename to tutorial/example_rm_auto_grader/config.md index 86dc07df..7a7499e7 100644 --- a/astune/default_config/rm_auto_grader_example.yaml +++ b/tutorial/example_rm_auto_grader/config.md @@ -6,58 +6,57 @@ astune: task_judge: # Use RMAutoGraderJudge for pre-generated rubrics # Or use RMAutoGraderBatchJudge for online rubric generation - class_name: RMAutoGraderJudge - + # ======================================== # Model Configuration # ======================================== # LLM model for rubric generation and evaluation model_name: "qwen3-32b" # Options: qwen-plus, qwen-max, gpt-4, gpt-3.5-turbo, etc. - + # ======================================== # Grader Mode Configuration # ======================================== grader_mode: "pointwise" # Options: "pointwise" or "listwise" language: "en" # Options: "en" or "zh" - + # Score range for pointwise evaluation min_score: 0 max_score: 10 - + # Success threshold (0.0 - 1.0) - what normalized score counts as success success_threshold: 0.7 - + # ======================================== # Rubric Generation Configuration # ======================================== # Sampling mode for rubric generation sampling_mode: "all_samples" # Options: "all_samples" or "smart_sampling" - + # Number of rubrics to generate per sample generate_number: 3 - + # Maximum epochs for iterative refinement max_epochs: 3 - + # Maximum retry attempts for LLM API calls max_retries: 5 - + # Batch processing settings (for smart_sampling mode) batch_size: 10 mcr_batch_size: 10 - + # Aggregation mode for final rubrics aggregation_mode: "keep_all" # Options: "keep_all" or "merge_similar" - + # ======================================== # Reference Samples Configuration # ======================================== # Path to reference samples (for pre-generating rubrics) # reference_samples_path: "data/reference_samples.jsonl" - + # Number of reference samples to use num_reference_samples: 20 - + # ======================================== # Field Mapping Configuration # ======================================== @@ -65,7 +64,7 @@ astune: query_field: "main_query" # Field in task containing the query answer_field: "final_answer" # Field in output metadata containing the answer reference_field: "answer" # Field in task.metadata containing reference answer - + # ======================================== # Grader name for logging # ======================================== @@ -80,12 +79,12 @@ astune: # astune: # task_judge: # class_name: RMAutoGraderBatchJudge -# +# # # ... (include all settings from above) -# +# # # Warmup phase settings # warmup_samples: 20 # Collect N samples before generating rubrics -# +# # # Regeneration settings # regenerate_interval: 0 # Regenerate rubrics every N evaluations (0 = never) From c147b619f384d5f4fc9d76b6f57e63634bd3f591 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 16:05:40 +0800 Subject: [PATCH 170/462] Update task judge configuration and add example rubrics for RM Auto Grader Former-commit-id: 9506246285d05f2e749993b0f9030e749edec91a --- astune/default_config/astune_default.yaml | 2 +- astune/task_reader/jsonl_reader.py | 2 +- tutorial/example_rm_auto_grader/rubrics_train.jsonl | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 tutorial/example_rm_auto_grader/rubrics_train.jsonl diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 117a1faf..eea7380b 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -23,7 +23,7 @@ astune: validation_split: "validation" task_judge: - judge_type: rubrics_auto_grader # Options: custom_protocal, rubrics_auto_grader + judge_type: customized_protocal # Options: 'customized_protocal', 'rubrics_auto_grader' judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index 35d16a3a..2c31785f 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -33,7 +33,7 @@ def _read_jsonl_file(self, file_path): init_messages=task_data.get("init_messages", []), task_id=task_data.get("task_id", ""), env_type=task_data.get("env_type", "no_env"), - metadata=task_data.get("metadata", {}), + metadata=task_data.get("metadata", task_data), ) tasks.append(task) except FileNotFoundError: diff --git a/tutorial/example_rm_auto_grader/rubrics_train.jsonl b/tutorial/example_rm_auto_grader/rubrics_train.jsonl new file mode 100644 index 00000000..8778c5f8 --- /dev/null +++ b/tutorial/example_rm_auto_grader/rubrics_train.jsonl @@ -0,0 +1,10 @@ +{"main_query": "What is 15 + 27?", "answer": "42", "score": 1} +{"main_query": "Calculate 8 * 9", "answer": "72", "score": 1} +{"main_query": "What is 100 - 37?", "answer": "63", "score": 1} +{"main_query": "Find the value of 144 / 12", "answer": "12", "score": 1} +{"main_query": "What is 5^3?", "answer": "125", "score": 1} +{"main_query": "Calculate 23 + 45 - 18", "answer": "50", "score": 1} +{"main_query": "What is 7 * 8 + 6?", "answer": "62", "score": 1} +{"main_query": "Find the value of (15 + 5) * 2", "answer": "40", "score": 1} +{"main_query": "What is 99 - 33 - 22?", "answer": "44", "score": 1} +{"main_query": "Calculate 16 / 4 + 10", "answer": "14", "score": 1} From 3e41cadd63eae08729d972c0948ecfebb65ebc37 Mon Sep 17 00:00:00 2001 From: "xielipeng.xlp" Date: Mon, 24 Nov 2025 16:29:25 +0800 Subject: [PATCH 171/462] [new] grader config Former-commit-id: 0203833e8fd2096f621d4c36cef1f686eed00f69 --- astune/task_judge/rm_auto_grader_judge.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/astune/task_judge/rm_auto_grader_judge.py b/astune/task_judge/rm_auto_grader_judge.py index 5e4f83b6..d1c1490f 100644 --- a/astune/task_judge/rm_auto_grader_judge.py +++ b/astune/task_judge/rm_auto_grader_judge.py @@ -15,6 +15,7 @@ import asyncio from typing import List, Optional, Dict, Any from loguru import logger +import json from astune.workflow import WorkflowOutput, WorkflowTask from astune.task_judge.judge_base import JudgeBase @@ -177,6 +178,13 @@ async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTa # Generate rubrics and get LLMGrader self.llm_grader = await auto_grader.run(eval_cases) + json.dump(self.llm_grader.to_dict(), open("my_grader.json", "w", encoding="utf-8"), indent=4, ensure_ascii=False) + + # Load grader config and inject model + # grader_config = json.load(open("my_grader.json", "r", encoding="utf-8")) + # grader_config["model"] = self.model + # self.llm_grader = LLMGrader.from_config(grader_config) + self.rubrics_generated = True logger.info("Rubrics generated successfully!") From 100e6ce21650b2d367d092f19d2956ccd10c8d1f Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 18:56:58 +0800 Subject: [PATCH 172/462] integrate rubrics llm-as-judge Former-commit-id: 4373c6eef5e0e3abf19596f027036a1bd6fbe4d9 --- .gitignore | 3 +- astune/backbone/common_warm_up.py | 54 ++++++ astune/backbone/native_compat_trainer.py | 3 +- astune/backbone/trinity_compat_workflow.py | 10 +- astune/default_config/astune_default.yaml | 9 +- astune/main_vllm.py | 2 + astune/task_judge/rm_auto_grader_judge.py | 110 +++++++---- astune/task_reader/__init__.py | 54 ++++-- astune/task_reader/env_service_reader.py | 13 +- astune/task_reader/hf_dataset_reader.py | 13 +- astune/task_reader/jsonl_reader.py | 9 +- astune/task_reader/task_reader_base.py | 4 +- astune/task_reader/tracing_reader/__init__.py | 16 +- astune/task_rollout/single_worker.py | 2 - astune/task_runner/__init__.py | 16 +- astune/utils/config_utils.py | 5 +- astune/utils/logger.py | 24 --- tutorial/example_rubrics_judge/math_agent.md | 177 ++++++++++++++++++ tutorial/example_rubrics_judge/math_agent.py | 67 +++++++ tutorial/example_rubrics_judge/r_judge.yaml | 74 ++++++++ 20 files changed, 557 insertions(+), 108 deletions(-) create mode 100644 astune/backbone/common_warm_up.py create mode 100644 tutorial/example_rubrics_judge/math_agent.md create mode 100644 tutorial/example_rubrics_judge/math_agent.py create mode 100644 tutorial/example_rubrics_judge/r_judge.yaml diff --git a/.gitignore b/.gitignore index 9f8651f7..230fa230 100644 --- a/.gitignore +++ b/.gitignore @@ -139,4 +139,5 @@ launcher_record trinity_checkpoints astune_test -/_resources \ No newline at end of file +_resources +auto/auto_grader.json diff --git a/astune/backbone/common_warm_up.py b/astune/backbone/common_warm_up.py new file mode 100644 index 00000000..7496d6f8 --- /dev/null +++ b/astune/backbone/common_warm_up.py @@ -0,0 +1,54 @@ +import os +import asyncio + +def init_parallel_rollout_logger(experiment_name): + """Initialize the logger with the given configuration.""" + from beast_logger import register_logger + from datetime import datetime + final_log_path = os.path.join( + "launcher_record", + experiment_name, + datetime.now().strftime("%Y_%m_%d_%H_%M"), + ) + os.environ["BEST_LOGGER_PATH"] = final_log_path + non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] + register_logger( + mods=["evaluation", "exception"], + non_console_mods=non_console_mods, + auto_clean_mods=[], + base_log_path=final_log_path, + debug=False, + ) + + + +def warm_up_process(config): + """ + Process level warm up + This will not be called multiple when: + - multi-threading + - forked multi-processing + This may be called multiple times when: + - spawned multi-processing + - ray remote actor + + --- + + Note: Skipping process level warm up will not cause significant issues, but may lead to + slightly longer initialization times for certain components in each process. + """ + + if "PROCESS_LEVEL_WARMUP_INIT" in os.environ: return + os.environ["PROCESS_LEVEL_WARMUP_INIT"] = "1" + experiment_name = config.experiment_name + init_parallel_rollout_logger(experiment_name) + warm_up_task_judge_when_needed(config) + + + +def warm_up_task_judge_when_needed(config): + if config.astune.task_judge.judge_type == "rubrics_auto_grader": + from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + judge = RMAutoGraderJudge(config) + asyncio.run(judge.generate_rubrics_from_samples()) + asyncio.run(judge.load_rubrics_from_cache()) diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index 3d7cd287..1a87b297 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -1306,9 +1306,10 @@ def fit(self): The light-weight advantage computation is done on the driver process. """ from omegaconf import OmegaConf - from verl.utils.tracking import Tracking + from astune.backbone.common_warm_up import warm_up_process + warm_up_process(config) logger = Tracking( project_name=self.config.astune.project_name, experiment_name=self.config.astune.experiment_name, diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index 3bc233bb..dca8095b 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -31,6 +31,9 @@ from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking from typing import List, Optional, Tuple from datasets import Dataset, load_dataset +from astune.backbone.common_warm_up import warm_up_process + + class TrinityCompatWorkflow(DynamicRollout): @@ -94,6 +97,8 @@ async def run_in_new_thread(self) -> MultiAgentContextTracking: ) + + @WORKFLOWS.register_module("astune_workflow") class ASTunetWorkflowWrap(Workflow): is_async: bool = True @@ -121,13 +126,14 @@ async def run_async(self): yaml_path = os.environ.get("ASTUNE_CONFIG_REDIRECT", None) if yaml_path is None: raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") - + astune_config = read_astune_config(yaml_path) + warm_up_process(astune_config) tracker = await TrinityCompatWorkflow( is_eval=self.is_eval, task=self.task, llm_handle=self.model_client, tokenizer=AutoTokenizer.from_pretrained(self.model_client.model_path), - config=read_astune_config(yaml_path), + config=astune_config, ).run_in_new_thread() sample_final = [] diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index eea7380b..d0dac993 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -2,6 +2,7 @@ astune: project_name: appworld_astune experiment_name: "read_yaml_name" + experiment_dir: "auto" # {exp-dir}/{experiment_name} backbone: debug # debug or trinity or verl task_reader: @@ -47,8 +48,14 @@ astune: query_field: main_query answer_field: final_answer reference_field: answer - # rubrics end + input_data_type: dataset_file # `env_service` or `dataset_file` or `huggingface_dat_repo` + dataset_file: + training: + file_path: "tutorial/example_rm_auto_grader/rubrics_train.jsonl" + + + # rubrics end model: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct diff --git a/astune/main_vllm.py b/astune/main_vllm.py index ff595b1b..1c254a80 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -8,6 +8,7 @@ from beast_logger import register_logger from astune.task_rollout.native_parallel_worker import ParallelEnvManager from astune.utils.sms_agent import send_train_message +from astune.backbone.common_warm_up import warm_up_process class TokenAndProb: @@ -83,6 +84,7 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ def run(config): # --------- fast adjustment for debugging --------- + warm_up_process(config) max_parallel = config.astune.debug.debug_max_parallel n_task = config.astune.debug.debug_first_n_tasks vllm_port = config.astune.debug.debug_vllm_port diff --git a/astune/task_judge/rm_auto_grader_judge.py b/astune/task_judge/rm_auto_grader_judge.py index d1c1490f..de16ef8e 100644 --- a/astune/task_judge/rm_auto_grader_judge.py +++ b/astune/task_judge/rm_auto_grader_judge.py @@ -13,21 +13,22 @@ """ import asyncio +import os +import json + from typing import List, Optional, Dict, Any from loguru import logger -import json +from beast_logger import print_dict -from astune.workflow import WorkflowOutput, WorkflowTask +from astune.schema.task import Task, WorkflowOutput from astune.task_judge.judge_base import JudgeBase - from rm_gallery.core.grader.auto.auto_grader import AutoGrader, AutoGraderConfig from rm_gallery.core.grader.auto.auto_rubrics import AutoRubricsConfig, SamplingMode, AggregationMode from rm_gallery.core.grader.base import GraderMode, LLMGrader from rm_gallery.core.model.openai_llm import OpenAIChatModel from rm_gallery.core.schema.data import EvalCase from rm_gallery.core.schema.template import LanguageEnum - from rm_gallery.core.grader.base import aevaluate_with_cases @@ -84,7 +85,7 @@ def __init__(self, config): self.grader_config = self._parse_config() # Initialize the model - self.model = OpenAIChatModel(model=config.astune.task_judge.rubrics_auto_grader.model_name, stream=False) + self.model = OpenAIChatModel(model=config.astune.task_judge.rubrics_auto_grader.model_name, base_url='https://dashscope.aliyuncs.com/compatible-mode/v1', stream=False) # Storage for generated grader self.llm_grader: Optional[LLMGrader] = None @@ -144,7 +145,17 @@ def _parse_config(self) -> AutoGraderConfig: return auto_grader_config - async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTask]) -> None: + async def read_reference_samples_from_dataset(self) -> List[Task]: + # read dataset from config + from astune.task_reader import TaskReaderRouterV2 + reader = TaskReaderRouterV2( + reader_type =self.config.astune.task_judge.rubrics_auto_grader.input_data_type, + reader_config=self.config.astune.task_judge.rubrics_auto_grader + ) + return reader.task_reader.get_training_tasks() + + + async def generate_rubrics_from_samples(self, reference_samples: List[Task] = []) -> None: """ Generate evaluation rubrics from reference samples. @@ -152,15 +163,20 @@ async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTa reference tasks that represent the types of problems to be evaluated. Args: - reference_samples: List of WorkflowTask objects with reference data + reference_samples: List of Task objects with reference data """ + + if len(reference_samples) == 0: + reference_samples = await self.read_reference_samples_from_dataset() + + logger.info(f"Generating rubrics from {len(reference_samples)} reference samples...") - # Convert WorkflowTask samples to EvalCase format for rubric generation + # Convert Task samples to EvalCase format for rubric generation # Use reference answers as example "good" outputs eval_cases = [] for sample in reference_samples: - eval_case = self._workflow_task_to_eval_case(sample, workflow_output=None, for_rubric_generation=True) + eval_case = self._task_to_eval_case(sample, workflow_output=None, for_rubric_generation=True) if eval_case: eval_cases.append(eval_case) @@ -178,7 +194,15 @@ async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTa # Generate rubrics and get LLMGrader self.llm_grader = await auto_grader.run(eval_cases) - json.dump(self.llm_grader.to_dict(), open("my_grader.json", "w", encoding="utf-8"), indent=4, ensure_ascii=False) + experiment_dir = self.config.astune.experiment_dir + grader_save_dir = os.path.join(experiment_dir, "auto_grader.json") + # make dirs if not exist + os.makedirs(experiment_dir, exist_ok=True) + print_dict({ + "message": "Saving generated grader config to", + "path": grader_save_dir + }) + json.dump(self.llm_grader.to_dict(), open(grader_save_dir, "w", encoding="utf-8"), indent=4, ensure_ascii=False) # Load grader config and inject model # grader_config = json.load(open("my_grader.json", "r", encoding="utf-8")) @@ -191,17 +215,38 @@ async def generate_rubrics_from_samples(self, reference_samples: List[WorkflowTa logger.info(f"Generated rubrics:\n{self.llm_grader.rubrics}") - def _workflow_task_to_eval_case( + async def load_rubrics_from_cache(self) -> None: + """ + Load a pre-generated grader configuration from file. + + Args: + grader_config_path: Path to the JSON file containing the grader config + """ + + # Load grader config and inject model + try: + experiment_dir = self.config.astune.experiment_dir + grader_save_dir = os.path.join(experiment_dir, "auto_grader.json") + grader_config = json.load(open(grader_save_dir, "r", encoding="utf-8")) + grader_config["model"] = self.model + self.llm_grader = LLMGrader.from_config(grader_config) + except Exception as e: + logger.exception(f"Failed to load grader config from") + await self.generate_rubrics_from_samples([]) + + + + def _task_to_eval_case( self, - workflow_task: WorkflowTask, + task: Task, workflow_output: Optional[WorkflowOutput | List[WorkflowOutput]] = None, for_rubric_generation: bool = False ) -> Optional[EvalCase]: """ - Convert WorkflowTask (and optionally WorkflowOutput) to EvalCase format. + Convert Task (and optionally WorkflowOutput) to EvalCase format. Args: - workflow_task: The workflow task containing query and reference + task: The workflow task containing query and reference workflow_output: Single output or list of outputs (for listwise evaluation) for_rubric_generation: If True, create training format with labeled data @@ -210,14 +255,16 @@ def _workflow_task_to_eval_case( """ try: # Extract query - query = getattr(workflow_task.task, self.query_field, "") - if not query and hasattr(workflow_task.task, 'metadata'): - query = workflow_task.task.metadata.get(self.query_field, "") + query = getattr(task, self.query_field, "") + if not query and hasattr(task, 'metadata'): + query = task.metadata.get(self.query_field, "") # Extract reference answer reference = "" - if hasattr(workflow_task.task, 'metadata') and self.reference_field in workflow_task.task.metadata: - reference = workflow_task.task.metadata[self.reference_field] + if hasattr(task, 'metadata') and self.reference_field in task.metadata: + reference = task.metadata[self.reference_field] + if not reference: + raise ValueError(f"Reference field '{self.reference_field}' not found in task metadata") # Build input dict - reference should always be in input for comparison input_dict = { @@ -232,7 +279,7 @@ def _workflow_task_to_eval_case( # Metadata should contain pre-labeled data (with score/rank) grader_mode = self.grader_config.method_config.grader_mode - metadata = workflow_task.task.metadata if hasattr(workflow_task.task, 'metadata') else {} + metadata = task.metadata if hasattr(task, 'metadata') else {} if grader_mode == GraderMode.POINTWISE: # Pointwise: expect metadata with "answer" and "score" @@ -242,8 +289,7 @@ def _workflow_task_to_eval_case( "score": metadata['score'] }) else: - logger.warning(f"No labeled data found for pointwise rubric generation in task {workflow_task.task_id}") - return None + raise ValueError(f"Metadata must contain 'answer' and 'score' for pointwise rubric generation in task {task.task_id}") else: # LISTWISE # Listwise: expect metadata with "candidates" containing list of {answer, rank} @@ -254,7 +300,7 @@ def _workflow_task_to_eval_case( "rank": candidate['rank'] }) else: - logger.warning(f"No labeled data found for listwise rubric generation in task {workflow_task.task_id}") + logger.warning(f"No labeled data found for listwise rubric generation in task {task.task_id}") return None else: # For evaluation: use the actual model output (no labels) @@ -268,11 +314,11 @@ def _workflow_task_to_eval_case( answer = workflow_output.metadata.get(self.answer_field, "") outputs.append({"answer": answer}) else: - logger.warning(f"No workflow output provided for evaluation of task {workflow_task.task_id}") + logger.warning(f"No workflow output provided for evaluation of task {task.task_id}") return None if not outputs: - logger.warning(f"No outputs found for task {workflow_task.task_id}") + logger.warning(f"No outputs found for task {task.task_id}") return None return EvalCase(input=input_dict, outputs=outputs) @@ -283,14 +329,14 @@ def _workflow_task_to_eval_case( async def _async_compute_reward( self, - workflow_task: WorkflowTask, + task: Task, workflow_output: WorkflowOutput | List[WorkflowOutput] ): """ Asynchronously compute reward using the generated rubrics. Args: - workflow_task: The task being evaluated + task: The task being evaluated workflow_output: Single output for pointwise, or list of outputs for listwise Returns: @@ -304,7 +350,7 @@ async def _async_compute_reward( ) # Create eval_case(s) based on input - eval_case = self._workflow_task_to_eval_case(workflow_task, workflow_output, for_rubric_generation=False) + eval_case = self._task_to_eval_case(task, workflow_output, for_rubric_generation=False) if not eval_case: logger.error("Failed to create eval case from workflow task and output") @@ -322,7 +368,7 @@ async def _async_compute_reward( def compute_reward( self, - workflow_task: WorkflowTask, + task: Task, workflow_output: WorkflowOutput ) -> tuple: """ @@ -331,7 +377,7 @@ def compute_reward( This is the main interface called by astune's workflow system. Args: - workflow_task: The task being evaluated + task: The task being evaluated workflow_output: The output to evaluate Returns: @@ -346,7 +392,7 @@ def compute_reward( import nest_asyncio nest_asyncio.apply() return loop.run_until_complete( - self._async_compute_reward(workflow_task, workflow_output) + self._async_compute_reward(task, workflow_output) ) except ImportError: raise RuntimeError( @@ -360,7 +406,7 @@ def compute_reward( asyncio.set_event_loop(loop) try: return loop.run_until_complete( - self._async_compute_reward(workflow_task, workflow_output) + self._async_compute_reward(task, workflow_output) ) finally: loop.close() diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index c6600139..dff7558d 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -15,8 +15,8 @@ class RandomDummyGenerator(TaskReaderBase): - def __init__(self, config): - super().__init__(config) + def __init__(self, reader_config): + super().__init__(reader_config) def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: tasks = [] @@ -49,19 +49,45 @@ def get_validation_tasks(self) -> List[Task]: class TaskReaderRouter(TaskReaderBase): def __init__(self, config): super().__init__(config) - self.task_reader_type = self.config.astune.task_reader.type - if self.task_reader_type == "env_service": - self.task_reader = TaskReaderEnvService(config) - elif self.task_reader_type == "dataset_file": - self.task_reader = TaskReaderJsonl(config) - elif self.task_reader_type == "huggingface_dat_repo": - self.task_reader = TaskReaderHuggingFace(config) - elif self.task_reader_type == "tracing": - self.task_reader = TracingReader(config) - elif self.task_reader_type == "random_dummy": - self.task_reader = RandomDummyGenerator(config) + task_reader_type = config.astune.task_reader.type + reader_config = config.astune.task_reader + if task_reader_type == "env_service": + self.task_reader = TaskReaderEnvService(reader_config) + elif task_reader_type == "dataset_file": + self.task_reader = TaskReaderJsonl(reader_config) + elif task_reader_type == "huggingface_dat_repo": + self.task_reader = TaskReaderHuggingFace(reader_config) + elif self.task_reader == "tracing": + self.task_reader = TracingReader(reader_config) + elif task_reader_type == "random_dummy": + self.task_reader = RandomDummyGenerator(reader_config) + else: + raise ValueError(f"Unsupported task reader type: {task_reader_type}") + + def get_training_tasks(self) -> List[Task]: + return self.task_reader.get_training_tasks() + + def get_validation_tasks(self) -> List[Task]: + return self.task_reader.get_validation_tasks() + + +class TaskReaderRouterV2(TaskReaderBase): + def __init__(self, reader_type, reader_config): + super().__init__(None) + + task_reader_type = reader_type + if task_reader_type == "env_service": + self.task_reader = TaskReaderEnvService(reader_config) + elif task_reader_type == "dataset_file": + self.task_reader = TaskReaderJsonl(reader_config) + elif task_reader_type == "huggingface_dat_repo": + self.task_reader = TaskReaderHuggingFace(reader_config) + elif self.task_reader == "tracing": + self.task_reader = TracingReader(reader_config) + elif task_reader_type == "random_dummy": + self.task_reader = RandomDummyGenerator(reader_config) else: - raise ValueError(f"Unsupported task reader type: {self.task_reader_type}") + raise ValueError(f"Unsupported task reader type: {task_reader_type}") def get_training_tasks(self) -> List[Task]: return self.task_reader.get_training_tasks() diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index f6ab2dfa..934eefd9 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -9,12 +9,13 @@ class TaskReaderEnvService(TaskReaderBase): - def __init__(self, config): - super().__init__(config) + def __init__(self, reader_config): + super().__init__(reader_config) + self.reader_config = reader_config def get_tasks(self, split): - env_url = self.config.astune.task_reader.env_service.env_url - env_type = self.config.astune.task_reader.env_service.env_type + env_url = self.reader_config.env_service.env_url + env_type = self.reader_config.env_service.env_type env_service_client = EnvClient(base_url=env_url) task_id_array = env_service_client.get_env_profile(env_type, split=split) if len(task_id_array) == 0: @@ -34,9 +35,9 @@ def get_tasks(self, split): return tasks def get_validation_tasks(self): - split = self.config.astune.task_reader.env_service.validation_split + split = self.reader_config.env_service.validation_split return self.get_tasks(split=split) def get_training_tasks(self): - split = self.config.astune.task_reader.env_service.training_split + split = self.reader_config.env_service.training_split return self.get_tasks(split=split) diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py index 30917a20..eb56fd30 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astune/task_reader/hf_dataset_reader.py @@ -15,8 +15,9 @@ class TaskReaderHuggingFace(TaskReaderBase): It supports configuring the dataset name and split names for training and validation. """ - def __init__(self, config): - super().__init__(config) + def __init__(self, reader_config): + super().__init__(reader_config) + self.reader_config = reader_config def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: """ @@ -60,8 +61,8 @@ def get_training_tasks(self) -> List[Task]: Returns: List[Task]: List of training Task objects. """ - dataset_name = self.config.astune.task_reader.huggingface_dat_repo.dataset_path - split = self.config.astune.task_reader.huggingface_dat_repo.training_split + dataset_name = self.reader_config.huggingface_dat_repo.dataset_path + split = self.reader_config.huggingface_dat_repo.training_split return self._load_dataset_split(dataset_name, split) def get_validation_tasks(self) -> List[Task]: @@ -71,6 +72,6 @@ def get_validation_tasks(self) -> List[Task]: Returns: List[Task]: List of validation Task objects. """ - dataset_name = self.config.astune.task_reader.huggingface_dat_repo.dataset_path - split = self.config.astune.task_reader.huggingface_dat_repo.validation_split + dataset_name = self.reader_config.huggingface_dat_repo.dataset_path + split = self.reader_config.huggingface_dat_repo.validation_split return self._load_dataset_split(dataset_name, split) diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index 2c31785f..d08c2e37 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -8,8 +8,9 @@ class TaskReaderJsonl(TaskReaderBase): - def __init__(self, config): - super().__init__(config) + def __init__(self, reader_config): + super().__init__(reader_config) + self.reader_config = reader_config def _read_jsonl_file(self, file_path): """ @@ -53,7 +54,7 @@ def get_training_tasks(self) -> List[Task]: Returns: List[Task]: List of training Task objects. """ - file_path = self.config.astune.task_reader.dataset_file.training.file_path + file_path = self.reader_config.dataset_file.training.file_path return self._read_jsonl_file(file_path) def get_validation_tasks(self) -> List[Task]: @@ -63,5 +64,5 @@ def get_validation_tasks(self) -> List[Task]: Returns: List[Task]: List of validation Task objects. """ - file_path = self.config.astune.task_reader.dataset_file.validation.file_path + file_path = self.reader_config.dataset_file.validation.file_path return self._read_jsonl_file(file_path) diff --git a/astune/task_reader/task_reader_base.py b/astune/task_reader/task_reader_base.py index 562e86d9..f0e20f4e 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astune/task_reader/task_reader_base.py @@ -7,8 +7,8 @@ class TaskReaderBase: - def __init__(self, config): - self.config = config + def __init__(self, reader_config): + self.reader_config = reader_config def get_training_tasks(self) -> List[Task]: raise NotImplementedError diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 762ff1cb..f226aaae 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -23,22 +23,22 @@ class Config(TypedDict): class TracingReader(TaskReaderBase): - config: Config + reader_config: Config def __init__( self, - config, + reader_config, train_ratio: float = 0.7, split_seed: int = 42, ) -> None: - super().__init__(config) + super().__init__(reader_config) # config patch # print("*********", config, "**********") - self.config = config.astune.task_reader.feedback_tracing + self.reader_config = reader_config.feedback_tracing - logger.info(f"reading tasks from {self.config.get('base_url')}, #filter {len(self.config.get('filters'))}") - self._connector = LocalSqliteConnectorV1(self.config.get("base_url")) - filters_config = self.config.get("filters") + logger.info(f"reading tasks from {self.reader_config.get('base_url')}, #filter {len(self.reader_config.get('filters'))}") + self._connector = LocalSqliteConnectorV1(self.reader_config.get("base_url")) + filters_config = self.reader_config.get("filters") built_filters = build_filters(filters_config) self._filters: List[Filter] = built_filters @@ -79,7 +79,7 @@ def _apply_filters(self, tasks: List[Task]) -> List[Task]: return filtered def _init_tasks(self) -> None: - output_path = self.config.get("train_output_path") + output_path = self.reader_config.get("train_output_path") tasks = self._connector.load_tasks_from_conversation() logger.info(f"Loaded {len(tasks)} tasks from conversation") diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index 6cef2502..9ac17328 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -17,7 +17,6 @@ from astune.schema.task import Task, WorkflowTask from astune.task_rollout.async_llm_bridge import AsyncLlmBridge from astune.task_rollout.resource_keeper import ResourceKeeper -from astune.utils.logger import init_parallel_rollout_logger from astune.utils.sample import get_sample_params from loguru import logger from omegaconf import DictConfig @@ -63,7 +62,6 @@ def __init__( Additional parameters passed through for future extensions. """ - init_parallel_rollout_logger(experiment_name=config.astune.experiment_name) self.llm_mode: Literal["local", "remote", "trinity"] = llm_mode self.config: DictConfig = config self.async_rollout_manager = async_rollout_manager diff --git a/astune/task_runner/__init__.py b/astune/task_runner/__init__.py index e152111b..c07f3f35 100644 --- a/astune/task_runner/__init__.py +++ b/astune/task_runner/__init__.py @@ -2,6 +2,7 @@ from typing import Any, Dict, Tuple, Union, Callable from astune.task_judge.judge_base import JudgeBase from astune.utils.dynamic_import import dynamic_import +from astune.utils.utils import run_async_coro__no_matter_what, remove_fields from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg @@ -36,6 +37,15 @@ def generated_token_callback_fn(token_array): "generated_token_callback_fn": generated_token_callback_fn, } - def get_judge(self) -> JudgeBase: - judge_protocol = self.config.astune.task_judge.judge_protocol - return dynamic_import(judge_protocol)(self.config) # type: ignore + def get_judge(self) -> JudgeBase: # type: ignore + + if self.config.astune.task_judge.judge_type == 'customized_protocal': + judge_protocol = self.config.astune.task_judge.judge_protocol + return dynamic_import(judge_protocol)(self.config) # type: ignore + + elif self.config.astune.task_judge.judge_type == 'rubrics_auto_grader': + # astune/task_judge/rm_auto_grader_judge.py + from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + judge = RMAutoGraderJudge(self.config) + run_async_coro__no_matter_what(judge.load_rubrics_from_cache()) + return judge \ No newline at end of file diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index b25ee429..686044be 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -124,10 +124,11 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): }) -def read_astune_hierarchical_config(yaml_fp, exp_name, backbone, write_to=None): +def read_astune_hierarchical_config(yaml_fp, exp_name, backbone, write_to=None, exp_dir="launcher_record"): with open(yaml_fp, "r") as file: config = yaml.safe_load(file) config["astune"]["experiment_name"] = exp_name + config["astune"]["experiment_dir"] = os.path.join(exp_dir, exp_name) config["astune"]["backbone"] = backbone # remove extra config of verl for trinity if backbone == "debug": @@ -242,7 +243,7 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): shutil.copyfile(yaml_backup_src, yaml_backup_dst) ## 4. edit new yaml - config = read_astune_hierarchical_config(yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst) + config = read_astune_hierarchical_config(yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst, exp_dir=exp_dir) config_final = expand_astune_hierarchical_config(config, write_to=yaml_backup_dst) return yaml_backup_dst, exe_exp_base, exp_name, config_final diff --git a/astune/utils/logger.py b/astune/utils/logger.py index 37da6ae8..b48e5a07 100644 --- a/astune/utils/logger.py +++ b/astune/utils/logger.py @@ -1,26 +1,2 @@ import os - -def init_parallel_rollout_logger(experiment_name): - """Initialize the logger with the given configuration.""" - from beast_logger import register_logger - - if "BEST_LOGGER_INIT" in os.environ: - return # prevent re-initialization in ray environment - os.environ["BEST_LOGGER_INIT"] = "1" - from datetime import datetime - - final_log_path = os.path.join( - "launcher_record", - experiment_name, - datetime.now().strftime("%Y_%m_%d_%H_%M"), - ) - os.environ["BEST_LOGGER_PATH"] = final_log_path - non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] - register_logger( - mods=["evaluation", "exception"], - non_console_mods=non_console_mods, - auto_clean_mods=[], - base_log_path=final_log_path, - debug=False, - ) diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md new file mode 100644 index 00000000..a4f1db04 --- /dev/null +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -0,0 +1,177 @@ +## 运行math agent + +### 1. 准备dataset + +请下载 `openai/gsm8k` 数据集 +```bash +python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/store/dataset + +# ╭───────────────────────────────────────────────────────────────── downloaded files ─────────────────────────────────────────────────────────────────╮ +# │ ┌──────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ +# │ │ 0 │ /the/path/to/store/dataset/openai/gsm8k/main/test-00000-of-00001.parquet │ │ +# │ ├──────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ +# │ │ 1 │ /the/path/to/store/dataset/openai/gsm8k/main/train-00000-of-00001.parquet │ │ +# │ ├──────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ +# │ │ 2 │ /the/path/to/store/dataset/openai/gsm8k/socratic/test-00000-of-00001.parquet │ │ +# │ ├──────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ +# │ │ 3 │ /the/path/to/store/dataset/openai/gsm8k/socratic/train-00000-of-00001.parquet │ │ +# │ └──────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │ +# ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +# Generating train split: 100%|██████████████████████████████████████████████████████████████████████████████████| 7473/7473 [00:00<00:00, 380098.15 examples/s] +# Generating test split: 100%|███████████████████████████████████████████████████████████████████████████████████| 1319/1319 [00:00<00:00, 358866.57 examples/s] +# 2025-11-10 11:14:30.220 | INFO | best_logger.print_basic:print_listofdict:155 - +# ╭────────────────────────────────────────────────────────────────────── train ───────────────────────────────────────────────────────────────────────╮ +# │ ┏━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ +# │ ┃ ┃ question ┃ answer ┃ │ +# │ ┡━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ +# │ │ [0] │ Natalia sold clips to 48 of her friends in April, and then she │ Natalia sold 48/2 = <<48/2=24>>24 clips in May. │ │ +# │ │ │ sold half as many clips in May. How many clips did Natalia sell │ Natalia sold 48+24 = <<48+24=72>>72 clips altogether in April and │ │ +# │ │ │ altogether in April and May? │ May. │ │ +# │ │ │ │ #### 72 │ │ +# │ ├─────┼────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────┤ │ +# │ │ [1] │ Weng earns $12 an hour for babysitting. Yesterday, she just did 50 │ Weng earns 12/60 = $<<12/60=0.2>>0.2 per minute. │ │ +# │ │ │ minutes of babysitting. How much did she earn? │ Working 50 minutes, she earned 0.2 x 50 = $<<0.2*50=10>>10. │ │ +# │ │ │ │ #### 10 │ │ +``` + +### 2. 准备 AgentScope Workflow + +详细请见 `tutorial/math_agent.py`。可以在项目任意地方新建新的 AgentScope Workflow 代码 + +- 定义 AgentScope 的工作流 +```python +self.toolkit = Toolkit() +self.toolkit.register_tool_function(execute_python_code) +self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=astune_proxy, # type: ignore + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), +) +msg = Msg("user", init_messages[0]['content'], role="user") +result = await self.agent.reply(msg, structured_model=FinalResult) +``` + + +- 在 AgentScope Workflow 中,注册评价函数需要的任意关键数据 +```python +astune_proxy.update_judge_input_dictionary(final_answer=final_answer) +``` + + +### 3. 准备Judge (奖励模块) + +在 astune/task_judge/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 + +Judge的输入参数包含: + +```python +judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) +judge_input_dictionary['workflow_task']: 任务信息(如果里面包含了参考答案,可以从中取出) +judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) +judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 +``` + +Judge的返回值: raw_reward, is_success + + +### 4. 测试 + + +4.1 复制并修改 [tutorial/example_rubrics_judge/math_agent.yaml](../tutorial/example_rubrics_judge/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 + +1. 读取task(对应配置字段 astune.task_reader) +2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) + - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 + - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.math_agent->ExampleMathLearn` +3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) + - 举例如果 agentscope workflow 定义在 `astune/task_judge/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 + - 则填写 astune.task_judge.judge_protocol=`astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge` +4. 指定模型(对应配置字段 astune.model.path ) + +```yaml +astune: + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + rollout: + use_agentscope_protocol: True + agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct +``` + + +4.2 全链路调试(脱离ray快速调试:--backbone='debug') +```bash +# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) +clear && \ +python launcher.py --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='debug' --with-logview +``` +备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: +```json +{ + + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "program": "launcher.py", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "xxxx/xxxx/xxxx.yaml" + ], + "env": { + } + }, + ] +} +``` + + +4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') +```bash +# 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) +python launcher.py --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='trinity' --with-ray +``` + + +### 5. 读取Rollout日志 + +
+ 日志界面 +
+ +- 找到日志文件夹,默认在 `./launcher_record/exp_yaml_file_name/*` 下面 +- 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 +```bash +root@xxxx:/xxx/xxx/xxx# beast_logger_go +INFO: Started server process [74493] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) +``` +- 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 + - /mnt/data/qingxu.fu/astune/astune/launcher_record + - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name + - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + +- 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 + +- 蓝色 Token 代表参与loss计算的 Token,黄色反之 + +- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) + + +### 6. 参考训练曲线 + +点击链接打开训练曲线: +https://swanlab.cn/@binaryhusky/public/runs/96arcunrxlezdmcvmcdob/chart diff --git a/tutorial/example_rubrics_judge/math_agent.py b/tutorial/example_rubrics_judge/math_agent.py new file mode 100644 index 00000000..2a5e497f --- /dev/null +++ b/tutorial/example_rubrics_judge/math_agent.py @@ -0,0 +1,67 @@ +from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from agentscope.message import Msg +from pydantic import BaseModel, Field +from loguru import logger + + +def extract_final_answer(result) -> str: + """Extract the final answer from the agent's response.""" + try: + if ( + hasattr(result, "metadata") + and isinstance(result.metadata, dict) + and "result" in result.metadata + ): + return result.metadata["result"] + if hasattr(result, "content"): + if isinstance(result.content, dict) and "result" in result.content: + return result.content["result"] + return str(result.content) + return str(result) + except Exception as e: + logger.warning(f"Extract final answer error: {e}. Raw: {result}") + return str(result) + + +class FinalResult(BaseModel): + result: str = Field( + description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" + ) + + +system_prompt = """ +You are an agent specialized in solving math problems with tools. +Please solve the math problem given to you. +You can write and execute Python code to perform calculation or verify your answer. +You should return your final answer within \\boxed{{}}. +""" + + +class ExampleMathLearn(Workflow): + + name: str = "math_agent_workflow" + + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + + query = workflow_task.task.main_query + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=model_tuner, + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg, structured_model=FinalResult) + final_answer = extract_final_answer(result) + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml new file mode 100644 index 00000000..b3a013b0 --- /dev/null +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -0,0 +1,74 @@ +# ------------------ 主要配置 ------------------ +astune: + project_name: example_rubrics_judge + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + # 如果选择 `huggingface_dat_repo` 以下配置生效 + huggingface_dat_repo: + dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' + training_split: "train" + validation_split: "test" + + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + agentscope_learn_protocol: "tutorial.example_rubrics_judge.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 0.7 + max_env_worker: 80 + num_repeat: 4 + agent_madness_reward: 0.0 + + data: + train_batch_size: 64 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + task_judge: + judge_type: rubrics_auto_grader # Options: 'customized_protocal', 'rubrics_auto_grader' + rubrics_auto_grader: + # rubrics begin + model_name: qwen-max + grader_mode: pointwise + language: en + min_score: 0 + max_score: 1 + success_threshold: 0.7 + sampling_mode: all_samples + generate_number: 1 + max_epochs: 2 + max_retries: 3 + aggregation_mode: keep_all + grader_name: Math Auto Grader + num_reference_samples: 20 + query_field: main_query + answer_field: final_answer + reference_field: answer + input_data_type: dataset_file # `env_service` or `dataset_file` or `huggingface_dat_repo` + dataset_file: + training: + file_path: "tutorial/example_rm_auto_grader/rubrics_train.jsonl" + + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ From f59ab6f111dbd08a68cde9a897e072e0481005ec Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 24 Nov 2025 19:21:00 +0800 Subject: [PATCH 173/462] Fix experiment name reference in warm up process configuration Former-commit-id: db4f7ff8921d1dc8d5a90ffee50de5146c94f24a --- astune/backbone/common_warm_up.py | 2 +- astune/backbone/native_compat_trainer.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/astune/backbone/common_warm_up.py b/astune/backbone/common_warm_up.py index 7496d6f8..95b0f35f 100644 --- a/astune/backbone/common_warm_up.py +++ b/astune/backbone/common_warm_up.py @@ -40,7 +40,7 @@ def warm_up_process(config): if "PROCESS_LEVEL_WARMUP_INIT" in os.environ: return os.environ["PROCESS_LEVEL_WARMUP_INIT"] = "1" - experiment_name = config.experiment_name + experiment_name = config.astune.experiment_name init_parallel_rollout_logger(experiment_name) warm_up_task_judge_when_needed(config) diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index 1a87b297..a97760b9 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -1309,7 +1309,7 @@ def fit(self): from verl.utils.tracking import Tracking from astune.backbone.common_warm_up import warm_up_process - warm_up_process(config) + warm_up_process(self.config) logger = Tracking( project_name=self.config.astune.project_name, experiment_name=self.config.astune.experiment_name, From 0d93e95d3bb1d89456a4e2f4af0b630eaefb885a Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Tue, 25 Nov 2025 16:00:15 +0800 Subject: [PATCH 174/462] add docs --- .github/workflows/doc.yaml | 42 ++++++ docs/_config.yml | 128 +++++++++++++++++ docs/_static/custom.css | 205 +++++++++++++++++++++++++++ docs/_static/language.js | 32 +++++ docs/_templates/language-switch.html | 103 ++++++++++++++ docs/_templates/version-switch.html | 161 +++++++++++++++++++++ docs/_toc.yml | 29 ++++ docs/build.sh | 179 +++++++++++++++++++++++ docs/en/concepts.md | 2 + docs/en/example.md | 3 + docs/en/example_app_world.md | 1 + docs/en/example_math_agent.md | 1 + docs/en/example_werewolves.md | 1 + docs/en/installation.md | 1 + docs/en/introduction.md | 1 + docs/en/quickstart.md | 1 + docs/logo.svg | 1 + docs/references.bib | 2 + docs/zh/concepts.md | 2 + docs/zh/example.md | 3 + docs/zh/example_app_world.md | 1 + docs/zh/example_math_agent.md | 1 + docs/zh/example_werewolves.md | 1 + docs/zh/installation.md | 1 + docs/zh/introduction.md | 1 + docs/zh/quickstart.md | 1 + pyproject.toml | 5 + 27 files changed, 909 insertions(+) create mode 100644 .github/workflows/doc.yaml create mode 100644 docs/_config.yml create mode 100644 docs/_static/custom.css create mode 100644 docs/_static/language.js create mode 100644 docs/_templates/language-switch.html create mode 100644 docs/_templates/version-switch.html create mode 100644 docs/_toc.yml create mode 100755 docs/build.sh create mode 100644 docs/en/concepts.md create mode 100644 docs/en/example.md create mode 100644 docs/en/example_app_world.md create mode 100644 docs/en/example_math_agent.md create mode 100644 docs/en/example_werewolves.md create mode 100644 docs/en/installation.md create mode 100644 docs/en/introduction.md create mode 100644 docs/en/quickstart.md create mode 100644 docs/logo.svg create mode 100644 docs/references.bib create mode 100644 docs/zh/concepts.md create mode 100644 docs/zh/example.md create mode 100644 docs/zh/example_app_world.md create mode 100644 docs/zh/example_math_agent.md create mode 100644 docs/zh/example_werewolves.md create mode 100644 docs/zh/installation.md create mode 100644 docs/zh/introduction.md create mode 100644 docs/zh/quickstart.md diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml new file mode 100644 index 00000000..662be5af --- /dev/null +++ b/.github/workflows/doc.yaml @@ -0,0 +1,42 @@ +name: Deploy Documentation to GitHub Pages + +on: + push: + branches: + - main + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + + - name: Add execute permission to build.sh + run: | + chmod +x cookbook/build.sh + + - name: Build Cookbook + run: | + cd cookbook + ./build.sh + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: cookbook/_build/preview/_build/html + cname: runtime.agentscope.io diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000..c652b99f --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,128 @@ +# Book settings +# Learn more at https://jupyterbook.org/customize/config.html + +project: "AgentScope Tuner" +title: "AgentScope
Tuner" +author: Alibaba Tongyi Lab +logo: logo.svg +copyright: "2025, Tongyi Lab, Alibaba Inc." +only_build_toc_files: true + +# Force re-execution of notebooks on each build. +# See https://jupyterbook.org/content/execute.html +execute: + execute_notebooks: off + +parse: + myst_enable_extensions: + - colon_fence + +# Define the name of the latex output file for PDF builds +latex: + latex_documents: + targetname: book.tex + +# Add a bibtex file so that we can create citations +bibtex_bibfiles: + - references.bib + +# Sphinx settings +sphinx: + extra_extensions: + - sphinx.ext.autodoc + - sphinx.ext.viewcode + - sphinx.ext.napoleon + - sphinx.ext.intersphinx + - sphinx.ext.autosummary + config: + # API Documentation Configuration + autosummary_generate: True + autosummary_imported_members: True + + # Autodoc Configuration + autodoc_typehints: 'description' + autodoc_member_order: 'bysource' + autodoc_default_options: + members: True + member-order: 'bysource' + special-members: '__init__' + undoc-members: True + exclude-members: '__weakref__' + + # Napoleon Configuration + napoleon_google_docstring: True + napoleon_numpy_docstring: True + napoleon_include_init_with_doc: False + napoleon_include_private_with_doc: False + napoleon_include_special_with_doc: True + napoleon_use_admonition_for_examples: False + napoleon_use_admonition_for_notes: False + napoleon_use_admonition_for_references: False + napoleon_use_ivar: False + napoleon_use_param: True + napoleon_use_rtype: True + + # Intersphinx Configuration + intersphinx_mapping: + python: ['https://docs.python.org/3', null] + numpy: ['https://numpy.org/doc/stable/', null] + + # Theme Configuration + html_theme: furo + pygments_style: "friendly" + html_favicon: logo.svg + html_show_sphinx: false + html_last_updated_fmt: "%Y-%m-%d" + html_copy_source: false + html_show_sourcelink: false + templates_path: ["./_templates"] + html_static_path: + - "_static" + use_multitoc_numbering: false + html_js_files: + - language.js + html_sidebars: + "**": + - "sidebar/scroll-start.html" + - "sidebar/brand.html" + - "language-switch.html" + - "version-switch.html" + - "sidebar/search.html" + - "sidebar/navigation.html" + - "sidebar/ethical-ads.html" + - "sidebar/scroll-end.html" + html_theme_options: + top_of_page_buttons: ["view"] + sidebar_hide_name: false + source_repository: "https://github.com/agentscope-ai/agentscope-tuner" + source_branch: "main" + source_directory: "docs/" + footer_icons: + - name: GitHub + url: "https://github.com/agentscope-ai/agentscope-tuner" + html: | + + + + class: "" + - name: Discord + url: "https://discord.gg/eYMpfnkG8h" + html: | + + + + class: "" + - name: DingTalk + url: "https://qr.dingtalk.com/action/joingroup?code=v1,k1,OmDlBXpjW+I2vWjKDsjvI9dhcXjGZi3bQiojOq3dlDw=&_dt_no_comment=1&origin=11" + html: | + + + + class: "" + light_css_variables: + color-brand-primary: "#2196f3" + color-brand-content: "#2196f3" + color-admonition-background: "#f8f9fa" + dark_css_variables: + color-brand-primary: "#64b5f6" + color-brand-content: "#64b5f6" \ No newline at end of file diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 00000000..57710750 --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1,205 @@ +.language-switch { + padding: 1rem 0; + border-bottom: 1px solid var(--color-background-border); + margin-bottom: 1rem; +} + +.language-selector { + position: relative; + font-size: var(--font-size--small); +} + +.language-button { + width: 95%; + padding: 0.5rem 0.75rem; + background: var(--color-background-secondary); + border: 1px solid var(--color-background-border); + border-radius: 0.375rem; + cursor: pointer; + display: flex; + justify-content: space-between; + align-items: center; + color: var(--color-foreground-primary); + font-family: var(--font-stack); + font-size: inherit; + font-weight: 400; + transition: all 0.15s ease-out; + box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.05); + margin: 0 auto; +} + +.language-button:hover { + background: var(--color-background-hover); + border-color: var(--color-brand-primary); + box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px 0 rgb(0 0 0 / 0.06); +} + +.language-button:focus { + outline: 2px solid var(--color-brand-primary); + outline-offset: 2px; +} + +.language-menu { + display: none; + position: absolute; + top: calc(100% + 0.25rem); + left: 0; + right: 0; + background: var(--color-background-primary); + border: 1px solid var(--color-background-border); + border-radius: 0.375rem; + box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -2px rgb(0 0 0 / 0.05); + z-index: 1000; + overflow: hidden; + animation: fadeInUp 0.2s ease-out; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(-0.5rem); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.language-option { + display: block; + padding: 0.5rem 0.75rem; + text-decoration: none; + color: var(--color-foreground-primary); + font-family: var(--font-stack); + font-size: inherit; + font-weight: 400; + transition: all 0.15s ease-out; + border-bottom: 1px solid var(--color-background-border); + position: relative; +} + +.language-option:last-child { + border-bottom: none; +} + +.language-option:hover { + background: var(--color-background-hover); + text-decoration: none; + color: var(--color-foreground-primary); +} + +.language-option:focus { + background: var(--color-background-hover); + outline: none; + text-decoration: none; +} + +.language-option.active { + background: var(--color-brand-primary); + color: var(--color-brand-content); + font-weight: 500; +} + +.language-option.active:hover { + background: var(--color-brand-primary); + color: var(--color-brand-content); +} + +.language-button::after { + content: ""; + width: 0; + height: 0; + border-left: 0.25rem solid transparent; + border-right: 0.25rem solid transparent; + border-top: 0.25rem solid currentColor; + transition: transform 0.15s ease-out; + opacity: 0.7; +} + +.language-selector.open .language-button::after { + transform: rotate(180deg); +} + +.language-selector.open .language-menu { + display: block; +} + +.toctree-l1[data-lang="en"] { + display: var(--lang-en-display, block); +} + +.toctree-l1[data-lang="zh"] { + display: var(--lang-zh-display, block); +} + +.toctree-l1[data-lang="both"] { + display: block; +} + +body[data-current-lang="en"] { + --lang-en-display: block; + --lang-zh-display: none; +} + +body[data-current-lang="zh"] { + --lang-en-display: none; + --lang-zh-display: block; +} + +@media (max-width: 768px) { + .language-switch { + padding: 0.75rem 0; + margin-bottom: 0.75rem; + } + + .language-button { + padding: 0.625rem 0.75rem; + } + + .language-option { + padding: 0.625rem 0.75rem; + } +} + +@media (prefers-contrast: high) { + .language-button { + border-width: 2px; + } + + .language-menu { + border-width: 2px; + } +} + +@media (prefers-reduced-motion: reduce) { + .language-button, + .language-option, + .language-button::after { + transition: none; + } + + .language-menu { + animation: none; + } +} + +/* Dark mode support */ +@media (prefers-color-scheme: dark) { + .language-button, + .language-option { + color: var(--color-foreground-secondary); + } +} + +.sidebar-logo-container .sidebar-logo { + max-height: 170px; + width: auto; + display: block; +} + +.sidebar-brand-text { + display: flex; + flex-direction: column; + align-items: center; + line-height: 0.6; +} \ No newline at end of file diff --git a/docs/_static/language.js b/docs/_static/language.js new file mode 100644 index 00000000..0d089591 --- /dev/null +++ b/docs/_static/language.js @@ -0,0 +1,32 @@ +(function () { + "use strict"; + + function getCurrentPageLanguage() { + const path = window.location.pathname; + if (path.includes("/zh/")) { + return "zh"; + } + return "en"; + } + + function autoSetLanguage() { + const currentLang = getCurrentPageLanguage(); + const savedLang = localStorage.getItem("preferred-language"); + + if (currentLang !== savedLang) { + localStorage.setItem("preferred-language", currentLang); + } + + setTimeout(() => { + if (window.switchLanguage) { + window.switchLanguage(currentLang, true); + } + }, 5); + } + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", autoSetLanguage); + } else { + autoSetLanguage(); + } +})(); diff --git a/docs/_templates/language-switch.html b/docs/_templates/language-switch.html new file mode 100644 index 00000000..e953a3c4 --- /dev/null +++ b/docs/_templates/language-switch.html @@ -0,0 +1,103 @@ +
+ + +
+ +
+
+
+
+ + diff --git a/docs/_templates/version-switch.html b/docs/_templates/version-switch.html new file mode 100644 index 00000000..e3e5821b --- /dev/null +++ b/docs/_templates/version-switch.html @@ -0,0 +1,161 @@ + + + diff --git a/docs/_toc.yml b/docs/_toc.yml new file mode 100644 index 00000000..0baf13a5 --- /dev/null +++ b/docs/_toc.yml @@ -0,0 +1,29 @@ +format: jb-book +root: en/introduction.md +parts: +- caption: Tutorial + chapters: + - file: en/installation.md + - file: en/concepts.md + - file: en/quickstart.md + - file: en/example.md + sections: + - file: en/example_math_agent.md + - file: en/example_app_world.md + - file: en/example_werewolves.md + +- caption: 简介 + chapters: + - file: zh/introduction.md + title: "介绍" + +- caption: 教程 + chapters: + - file: zh/installation.md + - file: zh/concepts.md + - file: zh/quickstart.md + - file: zh/example.md + sections: + - file: zh/example_math_agent.md + - file: zh/example_app_world.md + - file: zh/example_werewolves.md \ No newline at end of file diff --git a/docs/build.sh b/docs/build.sh new file mode 100755 index 00000000..d0947963 --- /dev/null +++ b/docs/build.sh @@ -0,0 +1,179 @@ +#!/bin/bash + +# Multiple versions to build +VERSIONS=("preview") +OUTPUT_DIR="_build" + +# ANSI color codes for better display +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +# Function to display usage instructions +usage() { + echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e "${CYAN} JUPYTER BOOK BUILDER${NC}" + echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e "${YELLOW}Usage:${NC} $0 [-p]" + echo -e "${YELLOW}Options:${NC}" + echo -e " ${GREEN}-p${NC} Preview the book after building" + echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + exit 1 +} + +# Function to print step headers +print_step() { + echo -e "\n${CYAN}▶${NC} ${BLUE}$1${NC}" + echo -e "${CYAN}─────────────────────────────────────────────────────────────────────────────────${NC}" +} + +# Function to print success message +print_success() { + echo -e "${GREEN}✓${NC} $1" +} + +# Function to print error message +print_error() { + echo -e "${RED}✗${NC} $1" >&2 +} + +# Function to print info message +print_info() { + echo -e "${YELLOW}ℹ${NC} $1" +} + +# Function to print warning message +print_warning() { + echo -e "${YELLOW}⚠${NC} $1" +} + +# Check for the -p flag +PREVIEW=false +while getopts ":p" opt; do + case ${opt} in + p ) + PREVIEW=true + ;; + \? ) + print_error "Invalid option: -$OPTARG" + usage + ;; + esac +done + +# Header +echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" +echo -e "${CYAN} JUPYTER BOOK BUILDER${NC}" +echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + +# Check if we're in a Jupyter Book directory +if [ ! -f "_config.yml" ] && [ ! -f "_toc.yml" ]; then + print_warning "This doesn't appear to be a Jupyter Book directory" + print_info "Make sure you're in the root directory of your Jupyter Book project" +fi + +# Clean previous builds +print_step "Cleaning previous builds" +if jupyter-book clean . >/dev/null 2>&1; then + print_success "Previous builds cleaned successfully" +else + print_error "Failed to clean previous builds" + exit 1 +fi + +INITIAL_BRANCH=$(git rev-parse --abbrev-ref HEAD) +print_step "Current branch: $INITIAL_BRANCH" + +# Build the Jupyter Book +for version in "${VERSIONS[@]}"; do + print_step "Building version: $version" + + if [ "$version" != "preview" ]; then + if git checkout "$version"; then + print_success "Switched to $version" + else + print_error "Failed to checkout $version" + git checkout "$INITIAL_BRANCH" 2>/dev/null + git stash pop 2>/dev/null || true + exit 1 + fi + fi + + if jupyter-book build . --path-output $OUTPUT_DIR/$version; then + print_success "Jupyter Book built successfully" + if [ "$version" != "preview" ]; then + print_step "Moving $version HTML to preview directory" + + if mv $OUTPUT_DIR/$version/_build/html $OUTPUT_DIR/preview/_build/html/$version; then + print_success "Successfully moved $version to preview dir" + else + print_error "Failed to move $version to preview" + git checkout "$INITIAL_BRANCH" 2>/dev/null + git stash pop 2>/dev/null || true + exit 1 + fi + else + print_step "Stash uncommitted changes." + git stash + fi + else + print_error "Failed to build Jupyter Book" + git checkout "$INITIAL_BRANCH" 2>/dev/null + git stash pop 2>/dev/null || true + exit 1 + fi +done + +# Switch back to initial branch +print_step "Switching back to initial branch: $INITIAL_BRANCH" +if git checkout "$INITIAL_BRANCH"; then + print_success "Successfully switched back to $INITIAL_BRANCH" + git stash pop 2>/dev/null || true +else + print_error "Failed to switch back to $INITIAL_BRANCH" + exit 1 +fi + +# Check if preview is requested +if [ "$PREVIEW" = true ]; then + print_step "Starting preview server" + # Check if $OUTPUT_DIR/preview/_build/html directory exists + if [ ! -d "$OUTPUT_DIR/preview/_build/html" ]; then + print_error "Build directory not found. Please ensure the build completed successfully." + exit 1 + fi + + # Check if port 8000 is already in use + if command -v lsof >/dev/null 2>&1 && lsof -i :8000 >/dev/null 2>&1; then + print_warning "Port 8000 is already in use" + print_info "Trying to find an available port..." + PORT=8001 + while lsof -i :$PORT >/dev/null 2>&1 && [ $PORT -lt 9000 ]; do + PORT=$((PORT + 1)) + done + print_info "Using port $PORT instead" + else + PORT=8000 + fi + + print_success "Preview server starting..." + print_info "Open your browser and visit: ${GREEN}http://localhost:$PORT${NC}" + print_info "Press ${RED}Ctrl+C${NC} to stop the server" + echo -e "${CYAN}─────────────────────────────────────────────────────────────────────────────────${NC}\n" + # Start a simple HTTP server in the $OUTPUT_DIR/preview/_build/html directory + python -m http.server --directory $OUTPUT_DIR/preview/_build/html $PORT +else + print_step "Build Summary" + print_success "Build completed successfully!" + print_info "To build and preview the book, run: ${GREEN}$0 -p${NC}" + print_info "Build output available in: ${BLUE}$OUTPUT_DIR/preview/_build/html/${NC}" + # Show file size if possible + if command -v du >/dev/null 2>&1; then + BUILD_SIZE=$(du -sh $OUTPUT_DIR/preview/_build/html 2>/dev/null | cut -f1) + [ -n "$BUILD_SIZE" ] && print_info "Total build size: $BUILD_SIZE" + fi + echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" +fi diff --git a/docs/en/concepts.md b/docs/en/concepts.md new file mode 100644 index 00000000..b432317a --- /dev/null +++ b/docs/en/concepts.md @@ -0,0 +1,2 @@ +# Basic Concepts + diff --git a/docs/en/example.md b/docs/en/example.md new file mode 100644 index 00000000..96162417 --- /dev/null +++ b/docs/en/example.md @@ -0,0 +1,3 @@ +# Examples + +This section provides practical examples of how to use AgentScope Tuner in various scenarios. \ No newline at end of file diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md new file mode 100644 index 00000000..54b529e2 --- /dev/null +++ b/docs/en/example_app_world.md @@ -0,0 +1 @@ +# App World diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md new file mode 100644 index 00000000..edae4f50 --- /dev/null +++ b/docs/en/example_math_agent.md @@ -0,0 +1 @@ +# Math Agent diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md new file mode 100644 index 00000000..e25b24e8 --- /dev/null +++ b/docs/en/example_werewolves.md @@ -0,0 +1 @@ +# Werewolves diff --git a/docs/en/installation.md b/docs/en/installation.md new file mode 100644 index 00000000..96025dd9 --- /dev/null +++ b/docs/en/installation.md @@ -0,0 +1 @@ +# Installation Guide diff --git a/docs/en/introduction.md b/docs/en/introduction.md new file mode 100644 index 00000000..ff9cfb26 --- /dev/null +++ b/docs/en/introduction.md @@ -0,0 +1 @@ +# AgentScope Tuner Documentation diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md new file mode 100644 index 00000000..05cf8c1f --- /dev/null +++ b/docs/en/quickstart.md @@ -0,0 +1 @@ +# Quick Start diff --git a/docs/logo.svg b/docs/logo.svg new file mode 100644 index 00000000..e781d9c8 --- /dev/null +++ b/docs/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/references.bib b/docs/references.bib new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/docs/references.bib @@ -0,0 +1,2 @@ +--- +--- diff --git a/docs/zh/concepts.md b/docs/zh/concepts.md new file mode 100644 index 00000000..b432317a --- /dev/null +++ b/docs/zh/concepts.md @@ -0,0 +1,2 @@ +# Basic Concepts + diff --git a/docs/zh/example.md b/docs/zh/example.md new file mode 100644 index 00000000..96162417 --- /dev/null +++ b/docs/zh/example.md @@ -0,0 +1,3 @@ +# Examples + +This section provides practical examples of how to use AgentScope Tuner in various scenarios. \ No newline at end of file diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md new file mode 100644 index 00000000..54b529e2 --- /dev/null +++ b/docs/zh/example_app_world.md @@ -0,0 +1 @@ +# App World diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md new file mode 100644 index 00000000..edae4f50 --- /dev/null +++ b/docs/zh/example_math_agent.md @@ -0,0 +1 @@ +# Math Agent diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md new file mode 100644 index 00000000..e25b24e8 --- /dev/null +++ b/docs/zh/example_werewolves.md @@ -0,0 +1 @@ +# Werewolves diff --git a/docs/zh/installation.md b/docs/zh/installation.md new file mode 100644 index 00000000..96025dd9 --- /dev/null +++ b/docs/zh/installation.md @@ -0,0 +1 @@ +# Installation Guide diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md new file mode 100644 index 00000000..ff9cfb26 --- /dev/null +++ b/docs/zh/introduction.md @@ -0,0 +1 @@ +# AgentScope Tuner Documentation diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md new file mode 100644 index 00000000..05cf8c1f --- /dev/null +++ b/docs/zh/quickstart.md @@ -0,0 +1 @@ +# Quick Start diff --git a/pyproject.toml b/pyproject.toml index f314614a..034ac597 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,6 +45,11 @@ flash_attn = [ "flash-attn==2.8.1" ] +doc = [ + "jupyter-book>=1.0.4.post1,<2.0.0", + "furo>=2025.7.19", +] + [tool.setuptools.packages.find] where = ["."] From 2ad37e8b85af500b96b9c1ae4426aed357d90cb4 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Tue, 25 Nov 2025 16:03:10 +0800 Subject: [PATCH 175/462] update doc github action --- .github/workflows/doc.yaml | 11 ++++------- .github/workflows/pre-commit.yaml | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml index 662be5af..953a7807 100644 --- a/.github/workflows/doc.yaml +++ b/.github/workflows/doc.yaml @@ -24,19 +24,16 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - - - name: Add execute permission to build.sh - run: | - chmod +x cookbook/build.sh + pip install -q -e ".[dev,doc]" - name: Build Cookbook run: | - cd cookbook + cd docs ./build.sh - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: cookbook/_build/preview/_build/html - cname: runtime.agentscope.io + publish_dir: docs/_build/preview/_build/html + cname: tuner.agentscope.io diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index 89b771e6..af12d999 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -9,5 +9,5 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: - python-version: '3.11' + python-version: '3.10' - uses: pre-commit/action@v3.0.0 From 83691d056a0255a8f46d10343c21be659ebe05ab Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 16:22:09 +0800 Subject: [PATCH 176/462] tracing bug fix --- .../agentscope_tracker/multiagent_tracking.py | 32 +++++++++++++------ astune/default_config/astune_default.yaml | 16 +--------- astune/task_rollout/async_llm_bridge.py | 24 ++++++++------ tutorial/example_math_agent/math_agent.py | 2 +- tutorial/example_math_agent/math_agent.yaml | 13 ++++---- 5 files changed, 47 insertions(+), 40 deletions(-) diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 0c18af06..4c683ef3 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -17,7 +17,7 @@ can_merge_steps, ) -from typing import Any, List, Tuple, Union +from typing import Any, List, Tuple, Union, Dict from beast_logger import ( print_nested, print_listofdict, @@ -46,8 +46,26 @@ def __init__( self.output_kwargs = {} self.input_kwargs = {} + + def cleanup_messages(self, messages: List[Dict]) -> List[Dict]: + " A temperary fix for tool_calls being str instead of dict " + messages_copied = copy.deepcopy(messages) + for m in messages_copied: + if 'tool_calls' not in m: + continue + for t in m['tool_calls']: + if 'function' not in t or 'arguments' not in t['function']: + continue + try: + t['function']['arguments'] = json.loads(t['function']['arguments']) + except: + pass + return messages_copied + + def step_prepare(self, messages: List[dict], tools: List = []): self.full_context = [] + messages = self.cleanup_messages(messages) consider_roles = ["user", "assistant", "system", "tool"] disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls if disable_toolcalls: @@ -129,7 +147,7 @@ def step_track( # dummy response for now token_generator = "manual" err_type = "" - if (llm_output.get("tool_calls", None) is not None): + if llm_output.get("tool_calls", []): # is not None, and is not [] tool_calls = llm_output["tool_calls"] if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): # check tool call formating @@ -202,7 +220,6 @@ def step_track( # and (not can_merge_steps(self.grouped_steps[-1], self.grouped_steps[-2])) # ): # print(f"General Warning: merge failure discovered.") - return None def process_reward(self, reward_structure: Reward): @@ -357,13 +374,10 @@ def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tupl max_seq_length: int = max_model_len - max_response_length if self.should_interrupt_fn(): ret = [False, "externally_interrupted"] - if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: + elif self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: ret = [False, "already_mad"] - if length < max_seq_length: - ret = [ - True, - f"safe[{length} < {max_model_len} - {max_response_length}]", - ] + elif length < max_seq_length: + ret = [True, f"safe[{length} < {max_model_len} - {max_response_length}]"] else: ret = [False, "token_overflow"] return tuple(ret) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index f468d0ca..aca2deb4 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -119,21 +119,7 @@ astune: use_kl_loss: True kl_loss_coef: 0.002 kl_loss_type: low_var_kl - trinity_only__n_gpu_for_infer: 2 - - # the tracing config - tracing: - base_url: ./.trash/database.sqlite - train_output_path: ./.trash/tasks.jsonl - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 2048 - filters: - - type: llm_evaluate - enabled: true - params: - custom_rubrics: If the answer claims that it has written the output to a file, consider it an invalid response. - temperature: 0.5 - print_reason: false + trinity_only__n_vllm_engine: 2 execute_test: False # DO NOT EDIT, FOR TESTING PURPOSE ONLY execute_testing_lambda: "" diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index f4efd1f4..6a74b1e4 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -3,6 +3,7 @@ import time import numpy as np import uuid +import asyncio from pydantic import BaseModel from typing import Dict, List, Literal, Callable, Any, Type from loguru import logger @@ -75,7 +76,7 @@ def llm_chat( request_id=request_id, prompt_ids=prompt_ids, sampling_params=updated_sampling_params, - ), timeout=1200 + ), timeout=1800 ) if self.config.astune.rollout.name == "vllm": @@ -193,7 +194,7 @@ async def main(): ) return response - response = run_async_coro__no_matter_what(main(), timeout=1200) # type: ignore + response = run_async_coro__no_matter_what(main(), timeout=1800) # type: ignore # from vsdb import bp; bp("TRR") prompt_text = self.tokenizer.decode(response.model_extra['prompt_token_ids']) content = response.choices[0].message.content @@ -204,13 +205,14 @@ async def main(): if ('' in content) and (not message.get("tool_calls", None)): # logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") + from vsdb import bp; bp("TOOL_CALL_PARSE5") logger.warning(f"Bad toolcall discovered: {content}") return { "role": "assistant", "request_id": response.id, "content": content, - "tool_calls": message.get("tool_calls", None), + "tool_calls": message.get("tool_calls", []), "tokens": [ TokenAndProb( token_id=token, @@ -265,14 +267,17 @@ async def __call__( self.context_tracker.step_prepare(messages, tools) ) if not context_safe: - logger.warning(f"[{info}] detected. Current token count exceeds the limit.") + logger.warning(f"[{info}] detected.") self.context_tracker.context_overflow = True - return ChatResponse( - content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] - ) + # return ChatResponse( + # content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] + # ) + # run llm inference ✨ - # from vsdb import bp; bp("TOOL_CALL_PARSE5") - llm_output = self.llm_chat_fn(converted_message, custom_sampling_params, tools) + llm_output = await asyncio.wait_for( + asyncio.to_thread(self.llm_chat_fn, converted_message, custom_sampling_params, tools), + timeout=1800, + ) # begin context tracking self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) @@ -281,6 +286,7 @@ async def __call__( response = await self._parse_dashscope_generation_response( llm_output, structured_model=structured_model ) + return response # copied from AgentScope's DashScopeChatModule diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index 3c294f15..0a6ed81b 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -59,7 +59,7 @@ async def agentscope_execute( formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), - max_iters=4, + max_iters=2, ) self.agent.set_console_output_enabled(False) msg = Msg("user", query, role="user") diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 59c77e5c..60611e6a 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,15 +15,15 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent - temperature: 0.7 - max_env_worker: 256 - num_repeat: 8 + temperature: 1.0 + max_env_worker: 4 + num_repeat: 6 agent_madness_reward: -1.0 - tensor_model_parallel_size: 4 + tensor_model_parallel_size: 2 max_num_seqs: 256 multi_turn: max_sample_per_task: 4 @@ -31,7 +31,7 @@ astune: - "nonsense" - "wrong_toolcall" data: - train_batch_size: 120 + train_batch_size: 180 debug: debug_max_parallel: 1 @@ -41,6 +41,7 @@ astune: save_freq: 99999 test_freq: 99999 total_epochs: 99999 + trinity_only__n_vllm_engine: 1 # must be division by tensor_model_parallel_size # ------------------ 不需要修改 ------------------ From e737f84f574fae437509edda7406e49bce32a3bf Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Tue, 25 Nov 2025 17:21:56 +0800 Subject: [PATCH 177/462] fix tests --- tests/config_test.py | 10 ++++++---- tests/data/config.yaml | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/config_test.py b/tests/config_test.py index 2552025f..82a4fa2a 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -7,10 +7,12 @@ class TestConfigUtils(unittest.TestCase): def test_load_config(self): """A simple test to check if the configuration file is loaded without errors.""" yaml_backup_dst, exp_base, exp_name, config = prepare_experiment_config('tests/data/config.yaml', "tests/temp", backbone="debug") - self.assertEqual(exp_name, "unittest") - self.assertEqual(exp_base, "tests/temp/unittest") - self.assertEqual(yaml_backup_dst, "tests/temp/unittest/yaml_backup.yaml") + self.assertEqual(exp_name, "sample") + self.assertEqual(exp_base, "tests/temp/sample") + self.assertEqual(yaml_backup_dst, "tests/temp/sample/yaml_backup.yaml") self.assertIn("astune", config) + self.assertIn("project_name", config["astune"]) + self.assertEqual(config["astune"]["project_name"], "unittest") self.assertIn("experiment_name", config["astune"]) - self.assertEqual(config["astune"]["experiment_name"], "unittest") + self.assertEqual(config["astune"]["experiment_name"], "sample") self.assertIn("task_reader", config["astune"]) diff --git a/tests/data/config.yaml b/tests/data/config.yaml index bd98414c..9691fdab 100644 --- a/tests/data/config.yaml +++ b/tests/data/config.yaml @@ -1,5 +1,6 @@ astune: project_name: unittest + experiment_name: sample task_reader: type: huggingface_dat_repo huggingface_dat_repo: From aa6e1ed824cf094e9ff9928e4a4375c6c3e6edd6 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 18:36:36 +0800 Subject: [PATCH 178/462] patch tokenizer --- .../agentscope_tracker/multiagent_tracking.py | 49 +++------- astune/context_tracker/basic_tracker.py | 89 +++++++++++-------- astune/context_tracker/tracker_base_attr.py | 1 + .../config_auto_convertion_trinity.json | 3 +- astune/schema/extended_msg.py | 13 ++- astune/task_rollout/async_llm_bridge.py | 24 +++-- astune/utils/tokenizer.py | 43 +++++++++ tutorial/example_appworld/appworld.yaml | 9 ++ tutorial/example_math_agent/math_agent.yaml | 2 +- .../example_math_agent/math_agent_verl.yaml | 61 +++++++++++++ 10 files changed, 199 insertions(+), 95 deletions(-) create mode 100644 astune/utils/tokenizer.py create mode 100644 tutorial/example_math_agent/math_agent_verl.yaml diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 4c683ef3..222f44f4 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -10,6 +10,7 @@ replace_token_ids, ) from astune.utils.color_hsl import adjust_color_hsl +from astune.utils.tokenizer import astune_apply_chat_templat from astune.utils.compute_madness import compute_string_madness from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE from astune.context_tracker.agentscope_tracker.timeline_merging import ( @@ -46,26 +47,8 @@ def __init__( self.output_kwargs = {} self.input_kwargs = {} - - def cleanup_messages(self, messages: List[Dict]) -> List[Dict]: - " A temperary fix for tool_calls being str instead of dict " - messages_copied = copy.deepcopy(messages) - for m in messages_copied: - if 'tool_calls' not in m: - continue - for t in m['tool_calls']: - if 'function' not in t or 'arguments' not in t['function']: - continue - try: - t['function']['arguments'] = json.loads(t['function']['arguments']) - except: - pass - return messages_copied - - def step_prepare(self, messages: List[dict], tools: List = []): self.full_context = [] - messages = self.cleanup_messages(messages) consider_roles = ["user", "assistant", "system", "tool"] disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls if disable_toolcalls: @@ -346,12 +329,12 @@ def get_inc(self, text_frag_from, text_frag_to): def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore dict_messages = self.to_role_content(ext_messages) - - prompt_text = self.tokenizer.apply_chat_template( - dict_messages, - tokenize=False, - add_generation_prompt=True, + prompt_text = astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=dict_messages, tools=tools, + add_generation_prompt=True, + tokenize=False ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore max_response_length = self.config.astune.rollout.max_response_length_in_one_turn @@ -365,8 +348,12 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], return tuple(ret) def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, str]: - prompt_text = self.tokenizer.apply_chat_template( - messages, tokenize=False, add_generation_prompt=True, tools=tools + prompt_text = astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=messages, + tools=tools, + add_generation_prompt=True, + tokenize=False ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore max_response_length = self.config.astune.rollout.max_response_length_in_one_turn @@ -393,15 +380,3 @@ def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: d.update({"tool_calls": ext_msg.tool_calls}) result.append(d) return result - - def apply_chat_template_for_ext_messages( - self, ext_messages: List[ExtendedMessage], tools: List = [] - ) -> str: - dict_messages = self.to_role_content(ext_messages) - prompt_text = self.tokenizer.apply_chat_template( - dict_messages, - tokenize=False, - add_generation_prompt=True, - tools=tools, - ) - return prompt_text # type: ignore diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index e6098e04..8302289b 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -5,6 +5,7 @@ from typing import List, Union, Tuple, Optional from astune.schema.trajectory import Sample, Reward from astune.utils.compute_madness import compute_string_madness +from astune.utils.tokenizer import astune_apply_chat_templat from astune.context_tracker.tracker_base_attr import TrackerAttr from astune.context_tracker.tracker_base_attr import ExtendedMessage from astune.context_tracker.tracker_base_attr import replace_token_ids @@ -33,17 +34,10 @@ class BasicContextTracker(TrackerAttr): terminal_rewards_dict (dict): Dictionary storing terminal rewards """ - """ - 1. prepare_next_llm_context - 2. check_context_token_num_safe - 3. prepare_world_interaction - 4. save_init_input - 5. save_llm_output - 6. save_env_output - 7. remove_last_context - 8. generate_log - 9. group_tokenize - """ + def __init__(self, config, tokenizer, **kwargs): + super().__init__(config, tokenizer, **kwargs) + self.generation_prompt_token = self.get_generation_prompt_token() + def prepare_previous_context(self, mod="future"): """ @@ -86,11 +80,12 @@ def check_context_token_num_safe( self, messages: List[dict], tools: List[dict] = [] ) -> Tuple[bool, str]: def get_seq_length(messages): - prompt_text = self.tokenizer.apply_chat_template( - messages, - tokenize=False, - add_generation_prompt=True, + prompt_text = astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=messages, tools=tools, + add_generation_prompt=False, + tokenize=False, ) return len( self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0] @@ -184,8 +179,12 @@ def save_init_input( for llm_msg, ext_msg, index in zip( init_input_arr, self.full_context, range(len(init_input_arr)) ): - text_with_chat_template = self.tokenizer.apply_chat_template( - init_input_arr[: (index + 1)], tokenize=False, tools=tools + text_with_chat_template = astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=init_input_arr[: (index + 1)], + tools=tools, + add_generation_prompt=False, + tokenize=False, ) tokenizer_output = self.tokenizer( text_with_chat_template, return_tensors="pt", padding=False @@ -255,20 +254,7 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= def get_token_inc_from_vllm_response( self, input_msg_ref, llm_output, tools: List[dict] = [] ) -> Tuple[List[int], List[int]]: - generation_prompt_token, msg = self.get_inc( - self.tokenizer.apply_chat_template( - input_msg_ref, - tokenize=False, - add_generation_prompt=False, - tools=tools, - ), - self.tokenizer.apply_chat_template( - input_msg_ref, - tokenize=False, - add_generation_prompt=True, - tools=tools, - ), - ) + # completion_token_arr will contain generation_prompt header llm_output_role_content = { "role": llm_output["role"], @@ -277,21 +263,27 @@ def get_token_inc_from_vllm_response( if llm_output.get("tool_calls", None): llm_output_role_content.update({"tool_calls": llm_output.get("tool_calls", [])}) - completion_token_arr, msg2 = self.get_inc( - self.tokenizer.apply_chat_template(input_msg_ref, tokenize=False, tools=tools), - self.tokenizer.apply_chat_template( - input_msg_ref + [llm_output_role_content], - tokenize=False, - tools=tools, + completion_token_arr, _ = self.get_inc( + astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=input_msg_ref, + tokenize=False, tools=tools, add_generation_prompt=False + ), + astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=input_msg_ref + [llm_output_role_content], + tokenize=False, tools=tools, add_generation_prompt=False ), ) vllm_output_raw_token = [t.token_id for t in llm_output["tokens"]] vllm_output_raw_logprob = [t.logprob for t in llm_output["tokens"]] self.generated_token_cnt += len(vllm_output_raw_token) + if not self.generation_prompt_token: + self.generation_prompt_token = self.get_generation_prompt_token() final_token_arr, token_logprob_arr = replace_token_ids( place_holder=completion_token_arr, replace_with=vllm_output_raw_token, - begin=generation_prompt_token, + begin=self.generation_prompt_token, end=[self.tokenizer.eos_token_id], raw_logprob=vllm_output_raw_logprob, ) @@ -738,3 +730,24 @@ def compute_reference_advantage(cmt_array: List): ] return + + + def get_generation_prompt_token(self): + dummy_msg = [{"role": "assistant", "content": "dummy text"}] + self.generation_prompt_token, _ = self.get_inc( + astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=dummy_msg, + tools=[], + add_generation_prompt=False, + tokenize=False, + ), + astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=dummy_msg, + tools=[], + add_generation_prompt=True, + tokenize=False, + ), + ) + return self.generation_prompt_token diff --git a/astune/context_tracker/tracker_base_attr.py b/astune/context_tracker/tracker_base_attr.py index ad7b8550..da607452 100644 --- a/astune/context_tracker/tracker_base_attr.py +++ b/astune/context_tracker/tracker_base_attr.py @@ -55,6 +55,7 @@ def __init__(self, config, tokenizer, **kwargs): self.current_batch_success_rate: float = -1.0 self.already_mad_flag = False self.round_cnt = 0 + self.generation_prompt_token = None assert ( self.config.astune.data.max_prompt_length + self.config.astune.data.max_response_length diff --git a/astune/default_config/trinity/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json index a758e28f..28cd75e3 100644 --- a/astune/default_config/trinity/config_auto_convertion_trinity.json +++ b/astune/default_config/trinity/config_auto_convertion_trinity.json @@ -2,7 +2,7 @@ "astune.trainer_common.nnodes": "cluster.node_num", "astune.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", "astune.trainer_common.total_epochs": "buffer.total_epochs", - "astune.trainer_common.trinity_only__n_gpu_for_infer": "explorer.rollout_model.engine_num", + "astune.trainer_common.trinity_only__n_vllm_engine": "explorer.rollout_model.engine_num", "astune.model.path": "model.model_path", "astune.project_name": "project", "astune.experiment_name": "name", @@ -10,6 +10,7 @@ "astune.trainer_common.save_freq": "trainer.save_interval", "astune.trainer_common.test_freq": "explorer.eval_interval", "astune.data.train_batch_size": "buffer.train_batch_size", + "astune.rollout.tensor_model_parallel_size": "explorer.rollout_model.tensor_parallel_size", "astune.data.max_response_length": "model.max_response_tokens", "astune.rollout.max_model_len": [ "model.max_model_len", diff --git a/astune/schema/extended_msg.py b/astune/schema/extended_msg.py index 6b854f95..2f9839b5 100644 --- a/astune/schema/extended_msg.py +++ b/astune/schema/extended_msg.py @@ -1,5 +1,6 @@ from typing import List, Union, Tuple from transformers.tokenization_utils import PreTrainedTokenizer +from astune.utils.tokenizer import astune_apply_chat_templat from astune.schema.trajectory import Reward from loguru import logger import uuid @@ -73,8 +74,9 @@ def __init__( } if self.tool_calls: auto_tokenize_target.update({"tool_calls": self.tool_calls}) - text_frag_to = tokenizer.apply_chat_template( - dummy_msg + [auto_tokenize_target], + text_frag_to = astune_apply_chat_templat( + tokenizer=tokenizer, + conversation=dummy_msg + [auto_tokenize_target], tokenize=False, tools=tools, ) @@ -83,8 +85,11 @@ def __init__( f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}" ) self.token_arr, _ = self.get_inc_simple( - text_frag_from=tokenizer.apply_chat_template( - dummy_msg, tokenize=False, tools=tools + text_frag_from=astune_apply_chat_templat( + tokenizer=tokenizer, + conversation=dummy_msg, + tokenize=False, + tools=tools, ), text_frag_to=text_frag_to, tokenizer=tokenizer, diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 6a74b1e4..9bb85d98 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -10,6 +10,7 @@ from omegaconf import DictConfig from astune.utils.utils import run_async_coro__no_matter_what, remove_fields from astune.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode +from astune.utils.tokenizer import astune_apply_chat_templat from astune.schema.logprob import TokenAndProb from agentscope.model import ChatResponse from agentscope.message import TextBlock, ToolUseBlock @@ -46,6 +47,8 @@ def llm_chat( request_id: str = "", ) -> dict: + request_id = uuid.uuid4().hex + updated_sampling_params = {} if sampling_params: updated_sampling_params.update(sampling_params) @@ -53,20 +56,13 @@ def llm_chat( updated_sampling_params.update(custom_sampling_params) input_messages = copy.deepcopy(messages) - request_id = uuid.uuid4().hex - if tools: - prompt_text = self.tokenizer.apply_chat_template( - input_messages, - add_generation_prompt=True, - tools=tools, - tokenize=False - ) - else: - prompt_text = self.tokenizer.apply_chat_template( - input_messages, - add_generation_prompt=True, - tokenize=False - ) + prompt_text = astune_apply_chat_templat( + tokenizer=self.tokenizer, + conversation=input_messages, + tools=tools, + add_generation_prompt=True, + tokenize=False + ) prompt_ids = self.tokenizer(prompt_text)["input_ids"] _test_if_test_mode('prompt_text', prompt_text, self.config) diff --git a/astune/utils/tokenizer.py b/astune/utils/tokenizer.py new file mode 100644 index 00000000..f34e5476 --- /dev/null +++ b/astune/utils/tokenizer.py @@ -0,0 +1,43 @@ +import copy +import json +from typing import List, Dict + + +def cleanup_messages(messages: List[Dict]) -> List[Dict]: + " A temperary fix for tool_calls being str instead of dict " + messages_copied = copy.deepcopy(messages) + for m in messages_copied: + if 'tool_calls' not in m: + continue + for t in m['tool_calls']: + if 'function' not in t or 'arguments' not in t['function']: + continue + if isinstance(t['function']['arguments'], str): + try: + t['function']['arguments'] = json.loads(t['function']['arguments']) + except: + pass + return messages_copied + + +def astune_apply_chat_templat( + tokenizer, + conversation, + tools, + add_generation_prompt: bool = False, + tokenize: bool = True, +): + conversation = cleanup_messages(conversation) + if tools: + return tokenizer.apply_chat_template( + conversation, + tools, + add_generation_prompt=add_generation_prompt, + tokenize=tokenize, + ) + else: + return tokenizer.apply_chat_template( + conversation, + tokenize=tokenize, + add_generation_prompt=add_generation_prompt, + ) diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index f67496cf..08b51640 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -5,18 +5,27 @@ astune: task_judge: # ✨✨✨✨ 编写并选择评价函数 judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + rollout: # ✨✨✨✨ 编写并选择Agent use_agentscope_protocol: True agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol agentscope_disable_toolcalls: True + max_env_worker: 64 + num_repeat: 4 + tensor_model_parallel_size: 4 + debug: debug_max_parallel: 1 debug_first_n_tasks: 1 + data: + train_batch_size: 16 + # ------------------ 不需要修改 ------------------ hydra: searchpath: diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 60611e6a..2a5c91c6 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -20,7 +20,7 @@ astune: rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 1.0 - max_env_worker: 4 + max_env_worker: 64 num_repeat: 6 agent_madness_reward: -1.0 tensor_model_parallel_size: 2 diff --git a/tutorial/example_math_agent/math_agent_verl.yaml b/tutorial/example_math_agent/math_agent_verl.yaml new file mode 100644 index 00000000..52255f97 --- /dev/null +++ b/tutorial/example_math_agent/math_agent_verl.yaml @@ -0,0 +1,61 @@ +# ------------------ 主要配置 ------------------ +astune: + project_name: example_math_agent + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + # 如果选择 `huggingface_dat_repo` 以下配置生效 + huggingface_dat_repo: + dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' + training_split: "train" + validation_split: "test" + + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + + rollout: + agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 1.0 + max_env_worker: 256 + num_repeat: 6 + agent_madness_reward: -1.0 + tensor_model_parallel_size: 4 + max_num_seqs: 256 + multi_turn: + max_sample_per_task: 4 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" + data: + train_batch_size: 64 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + trinity_only__n_vllm_engine: 1 # must be division by tensor_model_parallel_size + + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ From 47632dd024401d81bb8eb3f798edc1a5f4632dff Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 25 Nov 2025 18:52:47 +0800 Subject: [PATCH 179/462] fix: enhance token overflow handling in context tracking; update return values for safety checks --- .../agentscope_tracker/multiagent_tracking.py | 16 ++++++++++------ astune/context_tracker/basic_tracker.py | 13 ++++++------- astune/task_rollout/async_llm_bridge.py | 11 +++++++---- astune/task_runner/classic_runner.py | 2 +- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 222f44f4..f514b3e7 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -103,12 +103,12 @@ def step_prepare(self, messages: List[dict], tools: List = []): # check token overflow converted_message = self.to_role_content(self.full_context) - context_safe, info = self.check_context_token_num_safe(converted_message, tools) + context_safe, token_overflow, info = self.check_context_token_num_safe(converted_message, tools) custom_sampling_params = {} if not context_safe: self.context_overflow = True - return context_safe, info, converted_message, custom_sampling_params, tools + return context_safe, token_overflow, info, converted_message, custom_sampling_params, tools def step_track( self, @@ -359,14 +359,18 @@ def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tupl max_response_length = self.config.astune.rollout.max_response_length_in_one_turn max_model_len: int = self.config.astune.rollout.max_model_len max_seq_length: int = max_model_len - max_response_length + if length < max_seq_length: + token_overflow = False + else: + token_overflow = True if self.should_interrupt_fn(): - ret = [False, "externally_interrupted"] + ret = [False, token_overflow, "externally_interrupted"] elif self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - ret = [False, "already_mad"] + ret = [False, token_overflow, "already_mad"] elif length < max_seq_length: - ret = [True, f"safe[{length} < {max_model_len} - {max_response_length}]"] + ret = [True, token_overflow, f"safe[{length} < {max_model_len} - {max_response_length}]"] else: - ret = [False, "token_overflow"] + ret = [False, token_overflow, "token_overflow"] return tuple(ret) def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index 8302289b..9e0c77d7 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -78,7 +78,7 @@ def prepare_previous_context(self, mod="future"): def check_context_token_num_safe( self, messages: List[dict], tools: List[dict] = [] - ) -> Tuple[bool, str]: + ) -> Tuple[bool, bool, str]: def get_seq_length(messages): prompt_text = astune_apply_chat_templat( tokenizer=self.tokenizer, @@ -91,15 +91,14 @@ def get_seq_length(messages): self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0] ) + token_overflow = (get_seq_length(messages) >= self.max_seq_length) if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - return False, "already_mad" + return False, token_overflow, "already_mad" messages = self.prepare_previous_context(mod="raw") - if ( - get_seq_length(messages) < self.max_seq_length - ): # self.config.env_engine.max_seq_length = 20480 - return True, "safe" + if not token_overflow: # self.config.env_engine.max_seq_length = 20480 + return True, token_overflow, "safe" else: - return False, "token_overflow" + return False, token_overflow, "token_overflow" def get_inc(self, text_frag_from, text_frag_to): """ diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 9bb85d98..355a7adc 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -259,15 +259,18 @@ async def __call__( ) -> ChatResponse: # prepare context tracker, check context safety - context_safe, info, converted_message, custom_sampling_params, tools = ( + context_safe, token_overflow, info, converted_message, custom_sampling_params, tools = ( self.context_tracker.step_prepare(messages, tools) ) if not context_safe: logger.warning(f"[{info}] detected.") self.context_tracker.context_overflow = True - # return ChatResponse( - # content=[{"type": "text", "text": "astune_proxy:[context_overflow]"}] - # ) + if token_overflow: + # cannot proceed due to context overflow + return ChatResponse( + content=[{"type": "text", "text": "astune_proxy: Exceeded max model context length."}], + ) + # else: # otherwise, for abnormal output, can still proceed, but we do not track output anymore # run llm inference ✨ llm_output = await asyncio.wait_for( diff --git a/astune/task_runner/classic_runner.py b/astune/task_runner/classic_runner.py index d8b941ba..799c5b21 100644 --- a/astune/task_runner/classic_runner.py +++ b/astune/task_runner/classic_runner.py @@ -73,7 +73,7 @@ def execute(self, workflow_task) -> BasicContextTracker: raise e # 4. ⚠️ check token overflow - is_safe, info = self.cmt.check_context_token_num_safe(step_input_message_arr) + is_safe, token_overflow, info = self.cmt.check_context_token_num_safe(step_input_message_arr) if not is_safe: logger.warning( f"[{info}] detected at step {act_step}. Current token count exceeds the limit." From 14a4e31fb7f964f66c3b137219ed0467476d612f Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 08:47:45 +0800 Subject: [PATCH 180/462] patch tokenizing --- .../agentscope_tracker/multiagent_tracking.py | 70 ++++++- astune/context_tracker/basic_tracker.py | 17 +- astune/schema/extended_msg.py | 196 ++++++++++++++---- astune/task_rollout/async_llm_bridge.py | 7 +- astune/utils/tokenizer.py | 2 +- tutorial/example_math_agent/math_agent.py | 7 +- tutorial/example_math_agent/math_agent.yaml | 18 +- .../example_math_agent/math_agent_verl.yaml | 17 +- 8 files changed, 244 insertions(+), 90 deletions(-) diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index f514b3e7..2e1583d6 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -10,7 +10,7 @@ replace_token_ids, ) from astune.utils.color_hsl import adjust_color_hsl -from astune.utils.tokenizer import astune_apply_chat_templat +from astune.utils.tokenizer import astune_apply_chat_template from astune.utils.compute_madness import compute_string_madness from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE from astune.context_tracker.agentscope_tracker.timeline_merging import ( @@ -22,6 +22,7 @@ from beast_logger import ( print_nested, print_listofdict, + print_dict, NestedJsonItem, SeqItem, ) @@ -98,10 +99,12 @@ def step_prepare(self, messages: List[dict], tools: List = []): tools=tools, tool_calls=(msg["tool_calls"] if "tool_calls" in msg else []), token_generator="auto", + first_message=(i==0), ) ] # check token overflow + self.full_context = ExtendedMessage.check_and_merge_chained_tool_response(self.full_context, self.tokenizer) converted_message = self.to_role_content(self.full_context) context_safe, token_overflow, info = self.check_context_token_num_safe(converted_message, tools) custom_sampling_params = {} @@ -128,7 +131,6 @@ def step_track( self.already_mad_flag = True # dummy response for now - token_generator = "manual" err_type = "" if llm_output.get("tool_calls", []): # is not None, and is not [] tool_calls = llm_output["tool_calls"] @@ -143,28 +145,25 @@ def step_track( if not isinstance(expect_dict, dict): wrong_toolcall = True err_type = "cannot parse arguments" - from vsdb import bp; bp("UPUP1") except: wrong_toolcall = True err_type = "arguments not json" - from vsdb import bp; bp("UPUP3") else: wrong_toolcall = True err_type = "no function or no arguments" - from vsdb import bp; bp("UPUP4") if wrong_toolcall: logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n") self.already_mad_flag = True else: logger.success("Toolcall format check passed.") elif ('' in llm_output["content"]): - from vsdb import bp; bp("UPUP2") logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n") self.already_mad_flag = True tool_calls = [] else: tool_calls = [] + token_generator = "manual" llm_ext_msg = ExtendedMessage( author="llm", role="assistant", @@ -173,7 +172,6 @@ def step_track( tool_calls=tool_calls, tokenizer=self.tokenizer, ) - if token_generator == "manual": input_msg_ref = copy.deepcopy(converted_message) token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response( @@ -188,12 +186,24 @@ def step_track( # take snapshot of current timeline if context_safe: + from vsdb import bp; bp("TRACK1") + if 'prompt_text' in llm_output and 'prompt_token_ids' in llm_output: # currently we make this patch to better compat with Trinity training backend + self.full_context = self.patch_prompt_tokens( + prompt_text = llm_output['prompt_text'], + prompt_token_ids = llm_output['prompt_token_ids'], + previous_ext_context = self.full_context + ) self.full_context += [llm_ext_msg] is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) if length > self.config.astune.rollout.max_model_len: raise RuntimeError( f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" ) + + assert self.full_context[0].first_message + # assert all other message is not first_message + for i in range(1, len(self.full_context)): + assert not self.full_context[i].first_message self.grouped_steps += [copy.deepcopy(self.full_context)] # DEBUG = True # warn when merge fails @@ -205,6 +215,46 @@ def step_track( # print(f"General Warning: merge failure discovered.") return None + def patch_prompt_tokens( + self, + prompt_text: str, + prompt_token_ids: List[int], + previous_ext_context: List[ExtendedMessage], + ) -> List[ExtendedMessage]: + + # remove tailing + if prompt_text.endswith(self.generation_prompt): + prompt_text = prompt_text[: -len(self.generation_prompt)] + # prompt_token_ids = prompt_token_ids[: -len(self.generation_prompt_token)] + + prompt_text_split = prompt_text.split('<|im_start|>') + assert prompt_text_split[0] == '', "Prompt text should start with <|im_start|>" + prompt_text_split = prompt_text_split[1:] # remove the first empty string + for i in range(len(prompt_text_split)): + prompt_text_split[i] = "<|im_start|>" + prompt_text_split[i] + + current_prompt_text = [] + for j in range(len(previous_ext_context)): + current_prompt_text += [self.tokenizer.decode(previous_ext_context[j].token_arr)] + + if len(previous_ext_context) != len(prompt_text_split): + logger.bind(exception=True).error(f"Length mismatch when patching prompt tokens. Previous ext context length: {len(previous_ext_context)}, prompt text split length: {len(prompt_text_split)}. Replacing all tokens.") + + # try to recover tokens + for j in range(len(previous_ext_context)): + if prompt_text_split[j] != current_prompt_text[j]: + print_dict({ + "expected_prompt_text": prompt_text_split[j], + "current_prompt_text": current_prompt_text[j], + }, mod="exception", header=f"Prompt text mismatch, Please report a github issue") + previous_ext_context[j].token_arr = self.tokenizer(prompt_text_split[j], return_tensors="pt", padding=False) + + # remove extra messages + if len(previous_ext_context) != len(prompt_text_split): + previous_ext_context = previous_ext_context[:len(prompt_text_split)] + + return previous_ext_context + def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure ext_steps = self.full_context @@ -329,7 +379,7 @@ def get_inc(self, text_frag_from, text_frag_to): def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore dict_messages = self.to_role_content(ext_messages) - prompt_text = astune_apply_chat_templat( + prompt_text = astune_apply_chat_template( tokenizer=self.tokenizer, conversation=dict_messages, tools=tools, @@ -347,8 +397,8 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], ret = [False, length] return tuple(ret) - def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, str]: - prompt_text = astune_apply_chat_templat( + def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, bool, str]: + prompt_text = astune_apply_chat_template( tokenizer=self.tokenizer, conversation=messages, tools=tools, diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index 9e0c77d7..1b0f9cd9 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -5,7 +5,7 @@ from typing import List, Union, Tuple, Optional from astune.schema.trajectory import Sample, Reward from astune.utils.compute_madness import compute_string_madness -from astune.utils.tokenizer import astune_apply_chat_templat +from astune.utils.tokenizer import astune_apply_chat_template from astune.context_tracker.tracker_base_attr import TrackerAttr from astune.context_tracker.tracker_base_attr import ExtendedMessage from astune.context_tracker.tracker_base_attr import replace_token_ids @@ -80,7 +80,7 @@ def check_context_token_num_safe( self, messages: List[dict], tools: List[dict] = [] ) -> Tuple[bool, bool, str]: def get_seq_length(messages): - prompt_text = astune_apply_chat_templat( + prompt_text = astune_apply_chat_template( tokenizer=self.tokenizer, conversation=messages, tools=tools, @@ -178,7 +178,7 @@ def save_init_input( for llm_msg, ext_msg, index in zip( init_input_arr, self.full_context, range(len(init_input_arr)) ): - text_with_chat_template = astune_apply_chat_templat( + text_with_chat_template = astune_apply_chat_template( tokenizer=self.tokenizer, conversation=init_input_arr[: (index + 1)], tools=tools, @@ -254,7 +254,6 @@ def get_token_inc_from_vllm_response( self, input_msg_ref, llm_output, tools: List[dict] = [] ) -> Tuple[List[int], List[int]]: - # completion_token_arr will contain generation_prompt header llm_output_role_content = { "role": llm_output["role"], "content": llm_output["content"], @@ -262,13 +261,14 @@ def get_token_inc_from_vllm_response( if llm_output.get("tool_calls", None): llm_output_role_content.update({"tool_calls": llm_output.get("tool_calls", [])}) + # completion_token_arr will contain generation_prompt header completion_token_arr, _ = self.get_inc( - astune_apply_chat_templat( + astune_apply_chat_template( tokenizer=self.tokenizer, conversation=input_msg_ref, tokenize=False, tools=tools, add_generation_prompt=False ), - astune_apply_chat_templat( + astune_apply_chat_template( tokenizer=self.tokenizer, conversation=input_msg_ref + [llm_output_role_content], tokenize=False, tools=tools, add_generation_prompt=False @@ -734,14 +734,14 @@ def compute_reference_advantage(cmt_array: List): def get_generation_prompt_token(self): dummy_msg = [{"role": "assistant", "content": "dummy text"}] self.generation_prompt_token, _ = self.get_inc( - astune_apply_chat_templat( + astune_apply_chat_template( tokenizer=self.tokenizer, conversation=dummy_msg, tools=[], add_generation_prompt=False, tokenize=False, ), - astune_apply_chat_templat( + astune_apply_chat_template( tokenizer=self.tokenizer, conversation=dummy_msg, tools=[], @@ -749,4 +749,5 @@ def get_generation_prompt_token(self): tokenize=False, ), ) + self.generation_prompt = self.tokenizer.decode(self.generation_prompt_token) return self.generation_prompt_token diff --git a/astune/schema/extended_msg.py b/astune/schema/extended_msg.py index 2f9839b5..9cb9350c 100644 --- a/astune/schema/extended_msg.py +++ b/astune/schema/extended_msg.py @@ -1,12 +1,20 @@ from typing import List, Union, Tuple from transformers.tokenization_utils import PreTrainedTokenizer -from astune.utils.tokenizer import astune_apply_chat_templat +from astune.utils.tokenizer import astune_apply_chat_template from astune.schema.trajectory import Reward from loguru import logger import uuid INVALID_LOG_PROB_VALUE = 0.0 - +NEED_TRAIN_AUTHORS = ["llm"] +NON_TRAIN_AUTHORS = [ + "env", + "initialization", + "user", + "memory", + "llm(do_not_train)", +] +DUMMY_MSG = [{"role": "assistant", "content": "dummy text"}] def find_sublist_indices(large_list, small_list, reverse=False): small_len = len(small_list) @@ -38,6 +46,7 @@ def __init__( tools=[], tool_calls=[], token_logprob_arr=[], + first_message=False, ): self.author = author self.role = role @@ -54,6 +63,7 @@ def __init__( self.tool_calls = tool_calls self.uuid = uuid.uuid4().hex self.build_from_uuid = build_from_uuid + self.first_message = first_message if not clip: self.generate_content_for_future(tokenizer=None, clip=False) @@ -64,36 +74,67 @@ def __init__( clip_token_limit=clip_token_limit, ) self.eos_token_id = tokenizer.eos_token_id + if token_generator == "auto": - dummy_msg = [{"role": "assistant", "content": "dummy text"}] - try: - # completion_token_arr will contain generation_prompt header - auto_tokenize_target = { - "role": self.role, - "content": self.content_for_future, - } - if self.tool_calls: - auto_tokenize_target.update({"tool_calls": self.tool_calls}) - text_frag_to = astune_apply_chat_templat( - tokenizer=tokenizer, - conversation=dummy_msg + [auto_tokenize_target], - tokenize=False, - tools=tools, - ) - except Exception as e: - raise ValueError( - f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}" - ) - self.token_arr, _ = self.get_inc_simple( - text_frag_from=astune_apply_chat_templat( - tokenizer=tokenizer, - conversation=dummy_msg, - tokenize=False, - tools=tools, - ), - text_frag_to=text_frag_to, + self.token_arr = self.auto_tokenize( + tokenizer=tokenizer, + tools=tools, + ) + + + def auto_tokenize(self, tokenizer, tools): + if (not self.first_message) and (self.role == "system"): + raise ValueError("The system message is usually the first message, check program bugs.") + elif (self.first_message) and (self.role != "system"): + raise ValueError("The first message is supposed to be the system message, check program bugs, or remove this warning.") + if not self.first_message: + self.token_arr = self.auto_tokenize_non_first_message(tokenizer=tokenizer, tools=tools) + else: + auto_tokenize_target = { + "role": self.role, + "content": self.content_for_future, + } + if self.tool_calls: + auto_tokenize_target.update({"tool_calls": self.tool_calls}) + self.token_arr = astune_apply_chat_template( tokenizer=tokenizer, + conversation=[auto_tokenize_target], + tokenize=True, + tools=tools, ) + return self.token_arr + + + def auto_tokenize_non_first_message(self, tokenizer, tools): + try: + # completion_token_arr will contain generation_prompt header + auto_tokenize_target = { + "role": self.role, + "content": self.content_for_future, + } + if self.tool_calls: + auto_tokenize_target.update({"tool_calls": self.tool_calls}) + text_frag_to = astune_apply_chat_template( + tokenizer=tokenizer, + conversation=DUMMY_MSG + [auto_tokenize_target], + tokenize=False, + tools=tools, + ) + except Exception as e: + raise ValueError( + f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}" + ) + self.token_arr, _ = self.get_inc_simple( + text_frag_from=astune_apply_chat_template( + tokenizer=tokenizer, + conversation=DUMMY_MSG, + tokenize=False, + tools=tools, + ), + text_frag_to=text_frag_to, + tokenizer=tokenizer, + ) + return self.token_arr @property def content_for_future(self): @@ -106,14 +147,6 @@ def content_for_future(self): @property def need_training(self): - NEED_TRAIN_AUTHORS = ["llm"] - NON_TRAIN_AUTHORS = [ - "env", - "initialization", - "user", - "memory", - "llm(do_not_train)", - ] assert ( (self.author in NEED_TRAIN_AUTHORS) or (self.author in NON_TRAIN_AUTHORS) @@ -175,15 +208,86 @@ def get_inc_simple(self, text_frag_from, text_frag_to, tokenizer): tokenizer_output = tokenizer(text_frag_to, return_tensors="pt", padding=False) input_ids = tokenizer_output["input_ids"][0].tolist() + # get the new tokens added in this step input_id_increment = input_ids[ len(token_ids_acc) : - ] # get the new tokens added in this step - overlap_length = 0 - for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: - overlap_length += 1 - else: - break - msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" - # print(msg) + ] + FN_DEBUG = False + if FN_DEBUG: + overlap_length = 0 + for i in range(len(token_ids_acc)): + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: + overlap_length += 1 + else: + break + msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" + else: + msg = "" return input_id_increment, msg + + + @staticmethod + def check_and_merge_chained_tool_response( + ext_msg_array: List["ExtendedMessage"], + tokenizer: PreTrainedTokenizer + ) -> List["ExtendedMessage"]: + """ + Inside a list of ExtendedMessage, + Find consecutive ext msg with role=="tool", then merge them into one ExtendedMessage + + Jinja2 template logic for reference: + + {%- elif message.role == \"tool\" %} + {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != \"tool\") %} + {{- '<|im_start|>user' }} + {%- endif %} + {{- '\ + \ + ' }} + {{- message.content }} + {{- '\ + ' }} + {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %} + {{- '<|im_end|>\ + ' }} + {%- endif %} + {%- endif %} + """ + from vsdb import bp; bp("CHAINS") + from itertools import groupby + def merge_tool_group(group, tokenizer): + if len(group) == 1: + return group[0] + + msg0 = group[0] + merged_content = "".join(f"\n{msg.content}\n\n" for msg in group) + merged = ExtendedMessage( + author=msg0.author, role=msg0.role, content=merged_content, + tokenizer=tokenizer, token_generator="manual", build_from_uuid=msg0.uuid, + tools=msg0.tools, tool_calls=msg0.tool_calls, token_logprob_arr=msg0.token_logprob_arr, + first_message=msg0.first_message + ) + # re-compute token_arr + auto_tokenize_targets = [{"role": msg.role, "content": msg.content_for_future} for msg in group] + merged.token_arr, _ = merged.get_inc_simple( + text_frag_from=astune_apply_chat_template(tokenizer=tokenizer, conversation=DUMMY_MSG, tokenize=False, tools=merged.tools, add_generation_prompt=False), + text_frag_to=astune_apply_chat_template(tokenizer, conversation=DUMMY_MSG + auto_tokenize_targets, tokenize=False, tools=merged.tools, add_generation_prompt=False), + tokenizer=tokenizer + ) + return merged + + groups = [] + current_tool_group = [] + for msg in ext_msg_array: + if msg.role == "tool": + current_tool_group.append(msg) + else: + if current_tool_group: + groups.append(current_tool_group) + current_tool_group = [] + groups.append([msg]) + if current_tool_group: + groups.append(current_tool_group) + + result_ext_msg_array = [merge_tool_group(group, tokenizer) for group in groups] + return result_ext_msg_array diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 355a7adc..b28e37ad 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -10,7 +10,7 @@ from omegaconf import DictConfig from astune.utils.utils import run_async_coro__no_matter_what, remove_fields from astune.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode -from astune.utils.tokenizer import astune_apply_chat_templat +from astune.utils.tokenizer import astune_apply_chat_template from astune.schema.logprob import TokenAndProb from agentscope.model import ChatResponse from agentscope.message import TextBlock, ToolUseBlock @@ -56,7 +56,7 @@ def llm_chat( updated_sampling_params.update(custom_sampling_params) input_messages = copy.deepcopy(messages) - prompt_text = astune_apply_chat_templat( + prompt_text = astune_apply_chat_template( tokenizer=self.tokenizer, conversation=input_messages, tools=tools, @@ -193,6 +193,7 @@ async def main(): response = run_async_coro__no_matter_what(main(), timeout=1800) # type: ignore # from vsdb import bp; bp("TRR") prompt_text = self.tokenizer.decode(response.model_extra['prompt_token_ids']) + prompt_token_ids = response.model_extra['prompt_token_ids'] content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) @@ -208,6 +209,8 @@ async def main(): "role": "assistant", "request_id": response.id, "content": content, + "prompt_text": prompt_text, + "prompt_token_ids": prompt_token_ids, "tool_calls": message.get("tool_calls", []), "tokens": [ TokenAndProb( diff --git a/astune/utils/tokenizer.py b/astune/utils/tokenizer.py index f34e5476..db7827fc 100644 --- a/astune/utils/tokenizer.py +++ b/astune/utils/tokenizer.py @@ -20,7 +20,7 @@ def cleanup_messages(messages: List[Dict]) -> List[Dict]: return messages_copied -def astune_apply_chat_templat( +def astune_apply_chat_template( tokenizer, conversation, tools, diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index 0a6ed81b..b62b78ec 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -23,11 +23,6 @@ def extract_final_answer(result) -> str: return str(result) -class FinalResult(BaseModel): - result: str = Field( - description=r"Your solution of the given math problem. Put your final answer in boxed format, e.g., \boxed{42}" - ) - system_prompt = """ You are an agent specialized in solving math problems with tools. @@ -63,6 +58,6 @@ async def agentscope_execute( ) self.agent.set_console_output_enabled(False) msg = Msg("user", query, role="user") - result = await self.agent.reply(msg, structured_model=FinalResult) + result = await self.agent.reply(msg) final_answer = extract_final_answer(result) return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 2a5c91c6..3c6f143c 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,23 +15,23 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent - temperature: 1.0 - max_env_worker: 64 - num_repeat: 6 - agent_madness_reward: -1.0 - tensor_model_parallel_size: 2 - max_num_seqs: 256 + temperature: 0.7 + max_env_worker: 4 + num_repeat: 4 + agent_madness_reward: 0.0 + tensor_model_parallel_size: 1 + max_num_seqs: 40 multi_turn: max_sample_per_task: 4 compute_madness_checklist: - "nonsense" - "wrong_toolcall" data: - train_batch_size: 180 + train_batch_size: 300 debug: debug_max_parallel: 1 @@ -41,7 +41,7 @@ astune: save_freq: 99999 test_freq: 99999 total_epochs: 99999 - trinity_only__n_vllm_engine: 1 # must be division by tensor_model_parallel_size + trinity_only__n_vllm_engine: 2 # must be division by tensor_model_parallel_size # ------------------ 不需要修改 ------------------ diff --git a/tutorial/example_math_agent/math_agent_verl.yaml b/tutorial/example_math_agent/math_agent_verl.yaml index 52255f97..41e27393 100644 --- a/tutorial/example_math_agent/math_agent_verl.yaml +++ b/tutorial/example_math_agent/math_agent_verl.yaml @@ -15,18 +15,19 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent - temperature: 1.0 - max_env_worker: 256 - num_repeat: 6 - agent_madness_reward: -1.0 + temperature: 0.7 + max_env_worker: 64 + num_repeat: 4 + agent_madness_reward: 0.0 tensor_model_parallel_size: 4 - max_num_seqs: 256 + max_num_seqs: 40 + enable_oversample: False multi_turn: - max_sample_per_task: 4 + max_sample_per_task: 2 compute_madness_checklist: - "nonsense" - "wrong_toolcall" @@ -41,8 +42,8 @@ astune: save_freq: 99999 test_freq: 99999 total_epochs: 99999 - trinity_only__n_vllm_engine: 1 # must be division by tensor_model_parallel_size +# python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' # ------------------ 不需要修改 ------------------ hydra: From 77f89620e5a910e4f82f84bb8fd63cabf8b06699 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 09:11:51 +0800 Subject: [PATCH 181/462] chained tool call process --- .../context_tracker/agentscope_tracker/multiagent_tracking.py | 2 +- astune/schema/extended_msg.py | 2 ++ tutorial/example_math_agent/math_agent.yaml | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 2e1583d6..6fa2f8cf 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -104,8 +104,8 @@ def step_prepare(self, messages: List[dict], tools: List = []): ] # check token overflow - self.full_context = ExtendedMessage.check_and_merge_chained_tool_response(self.full_context, self.tokenizer) converted_message = self.to_role_content(self.full_context) + self.full_context = ExtendedMessage.check_and_merge_chained_tool_response(self.full_context, self.tokenizer) context_safe, token_overflow, info = self.check_context_token_num_safe(converted_message, tools) custom_sampling_params = {} if not context_safe: diff --git a/astune/schema/extended_msg.py b/astune/schema/extended_msg.py index 9cb9350c..f2c4dd6f 100644 --- a/astune/schema/extended_msg.py +++ b/astune/schema/extended_msg.py @@ -261,6 +261,8 @@ def merge_tool_group(group, tokenizer): msg0 = group[0] merged_content = "".join(f"\n{msg.content}\n\n" for msg in group) + merged_content = merged_content[len("\n"):] + merged_content = merged_content[:-len("\n")] merged = ExtendedMessage( author=msg0.author, role=msg0.role, content=merged_content, tokenizer=tokenizer, token_generator="manual", build_from_uuid=msg0.uuid, diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 3c6f143c..d9b48152 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -20,7 +20,7 @@ astune: rollout: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 0.7 - max_env_worker: 4 + max_env_worker: 64 num_repeat: 4 agent_madness_reward: 0.0 tensor_model_parallel_size: 1 From 51add31d737d64a11c7ccd999568d599b3d60978 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 09:24:24 +0800 Subject: [PATCH 182/462] stage some docs --- docs/.gitignore | 2 ++ docs/build.sh | 3 ++- docs/en/introduction.md | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 docs/.gitignore diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..eac09687 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +# MyST build outputs +_build diff --git a/docs/build.sh b/docs/build.sh index d0947963..20d7bd19 100755 --- a/docs/build.sh +++ b/docs/build.sh @@ -1,7 +1,8 @@ #!/bin/bash # Multiple versions to build -VERSIONS=("preview") +# VERSIONS=("preview") +VERSIONS=("feature/unittest-tools") OUTPUT_DIR="_build" # ANSI color codes for better display diff --git a/docs/en/introduction.md b/docs/en/introduction.md index ff9cfb26..c303ed8b 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -1 +1,5 @@ # AgentScope Tuner Documentation + +AgentScope Tune, or **ASTuner**, is an advanced agent training framework designed to optimize AgentScope workflows and agents. +Simply provide your AgentScope workflow, training data, and reward function to enhance your agents to their optimal performance. + From 62499033aa0c6c9f9f73a96394419606af8dff92 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 09:28:16 +0800 Subject: [PATCH 183/462] stage env From 05a06d080aedc86703e5b740f716bd18ee1c5b8f Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 10:29:42 +0800 Subject: [PATCH 184/462] upgrade docs --- README.md | 133 +++++++++++++++++++++++++------ docs/build.sh | 79 ++++++++++-------- docs/en/convert_workflow.md | 2 + docs/en/dataset_expansion.md | 0 docs/en/dataset_from_docs.md | 0 docs/en/introduction.md | 125 +++++++++++++++++++++++++++++ docs/en/llm_as_judge.md | 0 docs/en/multiagent_workflow.md | 0 docs/en/rubrics_judge.md | 0 docs/en/tracing_user_feedback.md | 0 10 files changed, 283 insertions(+), 56 deletions(-) create mode 100644 docs/en/convert_workflow.md create mode 100644 docs/en/dataset_expansion.md create mode 100644 docs/en/dataset_from_docs.md create mode 100644 docs/en/llm_as_judge.md create mode 100644 docs/en/multiagent_workflow.md create mode 100644 docs/en/rubrics_judge.md create mode 100644 docs/en/tracing_user_feedback.md diff --git a/README.md b/README.md index a255d8a7..4418c5a8 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,137 @@ -# AgentScope Tune +# AgentScope Tuner Documentation -AgentScope Tune, or **ASTune**, is an advanced agent training framework for tuning AgentScope workflow and agent(s). +AgentScope Tune, or **ASTuner**, is an advanced agent training framework designed to optimize AgentScope workflows and agents. +Simply provide your AgentScope workflow, training data, and reward function to enhance your agents to their optimal performance. -## Installation -We recommend using `uv` to setup the dependencies, and `conda` can also do the job. +## ✨ Features -1. Clone the repo and trinity module: +- **Data Augmentation & User Feedback Tracing** + Automatically augment training data and trace user feedback when training data is limited. + +- **Auto Rubrics** + Generate LLM-as-judge reward functions by learning from few-shot examples. + +- **Multi-Agent Support** + Build advanced cooperative multi-agent systems with ease. + +- **Highly Efficient Async Training-Inference Separation** + Powered by Trinity-RFT for optimized performance. + +- **Training-Debugging Integration** + Seamlessly toggle between training and debugging modes using a simple `--backbone` switch (`--backbone=trinity` or `--backbone=debug`). + +- **Comprehensive Logging** + Integrate message-level logging from AgentScope Studio and token-level logging for detailed insights. + + + +## 🚀 Train Your Agents + +### Installation + +
+1. Native conda or uv deployment + +We recommend using `uv` for dependency management, though `conda` is also supported. + +1. Clone the repository and Trinity module: ```bash git clone https://github.com/..../agentscope-tuner.git astune git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity cd astune ``` -2. Install trinity training backbone: +2. Install the Trinity training backbone: ```bash - # Create virtual environment - uv venv --python=3.10.16 - source .venv/bin/activate - git clone https://github.com/binary-husky/Trinity-RFT external/trinity - git clone https://github.com/binary-husky/agentscope external/agentscope + uv venv --python=3.10.16 # Create virtual environment + source .venv/bin/activate # Activate virtual environment - # Install dependencies + # Install dependencies (execute in order) uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ - uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow + uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow # for conda, remove `--prerelease=allow` option uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps - # uv pip install -e external/agentscope -i https://mirrors.aliyun.com/pypi/simple/ uv pip install agentscope==1.0.7 -i https://mirrors.aliyun.com/pypi/simple/ + uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation # Install flash attention (must be executed at last) + ``` +
+ +
+2. Docker container installation + +@xuchen + +
+ +### Get Started with Tutorials + +Explore our rich library of examples to kickstart your journey: + +- Build a math agent specialized in GSM8K problems and [learn how to train it 🚀](tutorial/math_agent.md). +- Create an AppWorld agent using AgentScope and [train it 🪐](tutorial/appworld.md). +- Develop a Werewolves RPG agent and [train it 🚀](tutorial/werewolves/werewolves.md). +- @qingxu: Building advanced multiagent workflow. [Here] (docs/en/multiagent_workflow.md) +- @chencheng: Training using user feedback tracing. [Here] (docs/en/tracing_user_feedback.md) +- @liuqi: Buildind dataset tasks from document materials. [Here] (docs/en/dataset_from_docs.md) +- @yongyi: Expanding dataset from just a few samples. [Here] (docs/en/dataset_expansion.md) +- @zhuohua/@lipeng: Writing LLM-as-Judge. [Here] (docs/en/llm_as_judge.md) +- @lipeng: Learn to build LLM reward from few-shot example. [Here] (docs/en/rubrics_judge.md) + +## 🏗️ Project Overview + +### Architecture + +1. **Task Reader** (config field: `astune.task_reader`) + - `astune/task_reader/task_reader_base.py` + - `TaskReaderEnvService` + - `TaskReaderJsonl` + - `TaskReaderHuggingFace` + +2. **Workflow Definition** (config field: `astune.rollout.agentscope_learn_protocol`) + - `tutorial/appworld.py` + - `tutorial/math_agent.py` + +3. **Reward Function** (config field: `astune.task_judge.judge_protocol`) + - `astune/task_judge/judge_base.py` + - `astune/task_judge/env_service_as_judge.py` + - `EnvServiceJudge` + - `astune/task_judge/math_answer_as_judge.py` + - `MathAnswerAsJudge` + - `MathAnswerAndLlmAsJudge` + +4. **Model Specification** (config field: `astune.model.path`) + +5. **Configuration System** (under improvement) + - Default Configurations: + - `astune/default_config/default.yaml` (default VERL training config, overridden by `--conf` YAML) + - `astune/default_config/trinity_default.yaml` (default Trinity config, overridden via `trinity.xxx` in `--conf` YAML) + - Auto-Alignment: + - `astune/default_config/config_auto_convertion_verl.json` + - `astune/default_config/config_auto_convertion_trinity.json` + +6. **ASTune & AgentScope Interaction System V0.5** + - Managed by `astune/context_tracker/agentscope.py`: + - Processes tokens generated by AgentScope + - Caches data required for judging (e.g., dialogue messages, env_service handles, task metadata) + - Bridges LLM interactions + - Merges timelines - # Install flash attention (must be installed at last) - uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation - ``` +## 🗺️ Project Roadmap +Working in progress: +- Enhance data generation module functionality +- Provide a training → user feedback → data augmentation → retraining data flywheel example +- Offer refined post-processing options for multi-agent samples +- Support training with multiple models +- Optimize configurations for long-context adaptation on smaller GPUs +- Add LoRA training examples -## Get Started (Public) -We provide a rich library of examples and they are good guides to get started! -Let see: -- How to build an Agent specialized at gsm8k math problems, and [how to train it 🚀](tutorial/math_agent.md). -- How to build an Appworld agent using AgentScope, and [how to train it 🪐](tutorial/appworld.md). -- How to build a Werewolves RPG agent using AgentScope, and [how to train it 🚀](tutorial/werewolves/werewolves.md) diff --git a/docs/build.sh b/docs/build.sh index 20d7bd19..6a29f25c 100755 --- a/docs/build.sh +++ b/docs/build.sh @@ -78,6 +78,7 @@ fi # Clean previous builds print_step "Cleaning previous builds" +print_info "Running Command [jupyter-book clean .]" if jupyter-book clean . >/dev/null 2>&1; then print_success "Previous builds cleaned successfully" else @@ -85,57 +86,69 @@ else exit 1 fi +print_info "Running Command [git rev-parse --abbrev-ref HEAD]" INITIAL_BRANCH=$(git rev-parse --abbrev-ref HEAD) print_step "Current branch: $INITIAL_BRANCH" # Build the Jupyter Book for version in "${VERSIONS[@]}"; do - print_step "Building version: $version" + print_step "Building version: $version" - if [ "$version" != "preview" ]; then - if git checkout "$version"; then - print_success "Switched to $version" - else - print_error "Failed to checkout $version" - git checkout "$INITIAL_BRANCH" 2>/dev/null - git stash pop 2>/dev/null || true - exit 1 - fi + if [ "$version" != "preview" ]; then + print_info "Running Command [git checkout $version]" + if git checkout "$version"; then + print_success "Switched to $version" + else + print_error "Failed to checkout $version" + print_info "Running Command [git checkout $INITIAL_BRANCH]" + git checkout "$INITIAL_BRANCH" 2>/dev/null + print_info "Running Command [git stash pop]" + git stash pop 2>/dev/null || true + exit 1 fi + fi + + print_info "Running Command [jupyter-book build . --path-output $OUTPUT_DIR/$version]" + if jupyter-book build . --path-output $OUTPUT_DIR/$version; then + print_success "Jupyter Book built successfully" + if [ "$version" != "preview" ]; then + print_step "Moving $version HTML to preview directory" - if jupyter-book build . --path-output $OUTPUT_DIR/$version; then - print_success "Jupyter Book built successfully" - if [ "$version" != "preview" ]; then - print_step "Moving $version HTML to preview directory" - - if mv $OUTPUT_DIR/$version/_build/html $OUTPUT_DIR/preview/_build/html/$version; then - print_success "Successfully moved $version to preview dir" - else - print_error "Failed to move $version to preview" - git checkout "$INITIAL_BRANCH" 2>/dev/null - git stash pop 2>/dev/null || true - exit 1 - fi + if mv $OUTPUT_DIR/$version/_build/html $OUTPUT_DIR/preview/_build/html/$version; then + print_success "Successfully moved $version to preview dir" else - print_step "Stash uncommitted changes." - git stash + print_error "Failed to move $version to preview" + print_info "Running Command [git checkout $INITIAL_BRANCH]" + git checkout "$INITIAL_BRANCH" 2>/dev/null + print_info "Running Command [git stash pop]" + git stash pop 2>/dev/null || true + exit 1 fi else - print_error "Failed to build Jupyter Book" - git checkout "$INITIAL_BRANCH" 2>/dev/null - git stash pop 2>/dev/null || true - exit 1 + print_step "Stash uncommitted changes." + print_info "Running Command [git stash]" + git stash fi + else + print_error "Failed to build Jupyter Book" + print_info "Running Command [git checkout $INITIAL_BRANCH]" + git checkout "$INITIAL_BRANCH" 2>/dev/null + print_info "Running Command [git stash pop]" + git stash pop 2>/dev/null || true + exit 1 + fi done # Switch back to initial branch print_step "Switching back to initial branch: $INITIAL_BRANCH" +print_info "Running Command [git checkout $INITIAL_BRANCH]" if git checkout "$INITIAL_BRANCH"; then - print_success "Successfully switched back to $INITIAL_BRANCH" - git stash pop 2>/dev/null || true + print_success "Successfully switched back to $INITIAL_BRANCH" + print_info "Running Command [git stash pop]" + git stash pop 2>/dev/null || true else - print_error "Failed to switch back to $INITIAL_BRANCH" - exit 1 + print_error "Failed to switch back to $INITIAL_BRANCH" + exit 1 fi # Check if preview is requested diff --git a/docs/en/convert_workflow.md b/docs/en/convert_workflow.md new file mode 100644 index 00000000..6a13ae6d --- /dev/null +++ b/docs/en/convert_workflow.md @@ -0,0 +1,2 @@ + +# AgentScope workflow \ No newline at end of file diff --git a/docs/en/dataset_expansion.md b/docs/en/dataset_expansion.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/en/dataset_from_docs.md b/docs/en/dataset_from_docs.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/en/introduction.md b/docs/en/introduction.md index c303ed8b..bcd2cc04 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -3,3 +3,128 @@ AgentScope Tune, or **ASTuner**, is an advanced agent training framework designed to optimize AgentScope workflows and agents. Simply provide your AgentScope workflow, training data, and reward function to enhance your agents to their optimal performance. + + +## ✨ Features + +- **Data Augmentation & User Feedback Tracing** + Automatically augment training data and trace user feedback when training data is limited. + +- **Auto Rubrics** + Generate LLM-as-judge reward functions by learning from few-shot examples. + +- **Multi-Agent Support** + Build advanced cooperative multi-agent systems with ease. + +- **Highly Efficient Async Training-Inference Separation** + Powered by Trinity-RFT for optimized performance. + +- **Training-Debugging Integration** + Seamlessly toggle between training and debugging modes using a simple `--backbone` switch (`--backbone=trinity` or `--backbone=debug`). + +- **Comprehensive Logging** + Integrate message-level logging from AgentScope Studio and token-level logging for detailed insights. + + + +## 🚀 Train Your Agents + +### Installation + +
+1. Native conda or uv deployment + +We recommend using `uv` for dependency management, though `conda` is also supported. + +1. Clone the repository and Trinity module: + ```bash + git clone https://github.com/..../agentscope-tuner.git astune + git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity + cd astune + ``` + +2. Install the Trinity training backbone: + ```bash + uv venv --python=3.10.16 # Create virtual environment + source .venv/bin/activate # Activate virtual environment + + # Install dependencies (execute in order) + uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ + uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow # for conda, remove `--prerelease=allow` option + uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps + uv pip install agentscope==1.0.7 -i https://mirrors.aliyun.com/pypi/simple/ + uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation # Install flash attention (must be executed at last) + ``` +
+ +
+2. Docker container installation + +@xuchen + +
+ +### Get Started with Tutorials + +Explore our rich library of examples to kickstart your journey: + +- Build a math agent specialized in GSM8K problems and [learn how to train it 🚀](tutorial/math_agent.md). +- Create an AppWorld agent using AgentScope and [train it 🪐](tutorial/appworld.md). +- Develop a Werewolves RPG agent and [train it 🚀](tutorial/werewolves/werewolves.md). +- @chencheng: Training using user feedback tracing +- @ + +## 🏗️ Project Overview + +### Architecture + +1. **Task Reader** (config field: `astune.task_reader`) + - `astune/task_reader/task_reader_base.py` + - `TaskReaderEnvService` + - `TaskReaderJsonl` + - `TaskReaderHuggingFace` + +2. **Workflow Definition** (config field: `astune.rollout.agentscope_learn_protocol`) + - `tutorial/appworld.py` + - `tutorial/math_agent.py` + +3. **Reward Function** (config field: `astune.task_judge.judge_protocol`) + - `astune/task_judge/judge_base.py` + - `astune/task_judge/env_service_as_judge.py` + - `EnvServiceJudge` + - `astune/task_judge/math_answer_as_judge.py` + - `MathAnswerAsJudge` + - `MathAnswerAndLlmAsJudge` + +4. **Model Specification** (config field: `astune.model.path`) + +5. **Configuration System** (under improvement) + - Default Configurations: + - `astune/default_config/default.yaml` (default VERL training config, overridden by `--conf` YAML) + - `astune/default_config/trinity_default.yaml` (default Trinity config, overridden via `trinity.xxx` in `--conf` YAML) + - Auto-Alignment: + - `astune/default_config/config_auto_convertion_verl.json` + - `astune/default_config/config_auto_convertion_trinity.json` + +6. **ASTune & AgentScope Interaction System V0.5** + - Managed by `astune/context_tracker/agentscope.py`: + - Processes tokens generated by AgentScope + - Caches data required for judging (e.g., dialogue messages, env_service handles, task metadata) + - Bridges LLM interactions + - Merges timelines + + + +## 🗺️ Project Roadmap + +Working in progress: + +- Enhance data generation module functionality +- Provide a training → user feedback → data augmentation → retraining data flywheel example +- Offer refined post-processing options for multi-agent samples +- Support training with multiple models +- Optimize configurations for long-context adaptation on smaller GPUs +- Add LoRA training examples + + + diff --git a/docs/en/llm_as_judge.md b/docs/en/llm_as_judge.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/en/multiagent_workflow.md b/docs/en/multiagent_workflow.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/en/rubrics_judge.md b/docs/en/rubrics_judge.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/en/tracing_user_feedback.md b/docs/en/tracing_user_feedback.md new file mode 100644 index 00000000..e69de29b From c62614178e89829866379fb636a1a0b1eb996fb7 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 10:32:35 +0800 Subject: [PATCH 185/462] md up Former-commit-id: 8d0322cf474ce2bfe230420c99dbd15f0e8d7104 --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4418c5a8..c9187c5c 100644 --- a/README.md +++ b/README.md @@ -71,12 +71,12 @@ Explore our rich library of examples to kickstart your journey: - Build a math agent specialized in GSM8K problems and [learn how to train it 🚀](tutorial/math_agent.md). - Create an AppWorld agent using AgentScope and [train it 🪐](tutorial/appworld.md). - Develop a Werewolves RPG agent and [train it 🚀](tutorial/werewolves/werewolves.md). -- @qingxu: Building advanced multiagent workflow. [Here] (docs/en/multiagent_workflow.md) -- @chencheng: Training using user feedback tracing. [Here] (docs/en/tracing_user_feedback.md) -- @liuqi: Buildind dataset tasks from document materials. [Here] (docs/en/dataset_from_docs.md) -- @yongyi: Expanding dataset from just a few samples. [Here] (docs/en/dataset_expansion.md) -- @zhuohua/@lipeng: Writing LLM-as-Judge. [Here] (docs/en/llm_as_judge.md) -- @lipeng: Learn to build LLM reward from few-shot example. [Here] (docs/en/rubrics_judge.md) +- @qingxu: Building advanced multiagent workflow. [Here](docs/en/multiagent_workflow.md) +- @chencheng: Training using user feedback tracing. [Here](docs/en/tracing_user_feedback.md) +- @liuqi: Buildind dataset tasks from document materials. [Here](docs/en/dataset_from_docs.md) +- @yongyi: Expanding dataset from just a few samples. [Here](docs/en/dataset_expansion.md) +- @zhuohua/@lipeng: Writing LLM-as-Judge. [Here](docs/en/llm_as_judge.md) +- @lipeng: Learn to build LLM reward from few-shot example. [Here](docs/en/rubrics_judge.md) ## 🏗️ Project Overview From 2cbd49ec320c27471099f21feaf299d44adcddfb Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 12:08:30 +0800 Subject: [PATCH 186/462] remove debug tags --- astune/backbone/native_compat_trainer.py | 3 --- astune/backbone/trinity_compat_workflow.py | 2 -- .../context_tracker/agentscope_tracker/multiagent_tracking.py | 1 - astune/context_tracker/basic_tracker.py | 1 + astune/schema/extended_msg.py | 3 --- astune/task_rollout/async_llm_bridge.py | 3 --- 6 files changed, 1 insertion(+), 12 deletions(-) diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index 3d7cd287..be982c50 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -1405,9 +1405,6 @@ def fit(self): print("=== wake up begin ===") self.async_rollout_manager.wake_up() print("=== wake up end ===") - # time.sleep(36000) - # from vsdb import bp - # bp("XXX") tasks = [ Task( task_id=gen_batch.non_tensor_batch["task_id"][i], diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index 3bc233bb..393303d3 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -236,7 +236,6 @@ def __init__(self, config): else datasets.concatenate_datasets(dataset_segments) ) - # from vsdb import bp; bp("XXX") self.dataset = _HFBatchReader( concatenated_dataset, name=self.config.name, @@ -250,7 +249,6 @@ def __init__(self, config): self.formatter = FORMATTER.get("task")(self.config) def read(self, batch_size: Optional[int] = None) -> List: - # from vsdb import bp; bp("CCC") batch_size = batch_size or self.read_batch_size tasks = [] samples, indices = self.dataset.read_batch(batch_size) diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index 6fa2f8cf..f6c6a1ff 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -186,7 +186,6 @@ def step_track( # take snapshot of current timeline if context_safe: - from vsdb import bp; bp("TRACK1") if 'prompt_text' in llm_output and 'prompt_token_ids' in llm_output: # currently we make this patch to better compat with Trinity training backend self.full_context = self.patch_prompt_tokens( prompt_text = llm_output['prompt_text'], diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index 1b0f9cd9..469ff5cb 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -170,6 +170,7 @@ def save_init_input( content=llm_msg["content"], token_generator="manual", tokenizer=self.tokenizer, + first_message=(index == 0), ) self.full_context += [ext_msg] diff --git a/astune/schema/extended_msg.py b/astune/schema/extended_msg.py index f2c4dd6f..0d40d259 100644 --- a/astune/schema/extended_msg.py +++ b/astune/schema/extended_msg.py @@ -140,7 +140,6 @@ def auto_tokenize_non_first_message(self, tokenizer, tools): def content_for_future(self): if self._content_for_future == "": if not self.tool_calls: - # from vsdb import bp; bp("H1") logger.exception("content_for_future is not set, or previous llm output is empty!") self._content_for_future return self._content_for_future @@ -253,8 +252,6 @@ def check_and_merge_chained_tool_response( {%- endif %} {%- endif %} """ - from vsdb import bp; bp("CHAINS") - from itertools import groupby def merge_tool_group(group, tokenizer): if len(group) == 1: return group[0] diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index b28e37ad..665d0a1a 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -102,7 +102,6 @@ def llm_chat( if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: expect_dict = json.loads(tool_calls[i]['function']['arguments']) if not isinstance(expect_dict, dict): - from vsdb import bp; bp("UPUP5") is_bad_toolcall = True if is_bad_toolcall: tool_calls = None @@ -191,7 +190,6 @@ async def main(): return response response = run_async_coro__no_matter_what(main(), timeout=1800) # type: ignore - # from vsdb import bp; bp("TRR") prompt_text = self.tokenizer.decode(response.model_extra['prompt_token_ids']) prompt_token_ids = response.model_extra['prompt_token_ids'] content = response.choices[0].message.content @@ -202,7 +200,6 @@ async def main(): if ('' in content) and (not message.get("tool_calls", None)): # logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") - from vsdb import bp; bp("TOOL_CALL_PARSE5") logger.warning(f"Bad toolcall discovered: {content}") return { From eb49eead6a934ad66bfec61ebb4aede549a1dfad Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 12:28:14 +0800 Subject: [PATCH 187/462] remove dynamic batch size --- astune/default_config/trinity/trinity_default.yaml | 4 ++-- tutorial/example_math_agent/math_agent.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index 52f7a552..bb7887b5 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -56,13 +56,13 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 monitor_type: swanlab # monitor_type: tensorboard synchronizer: - sync_interval: 2 + sync_interval: 1 sync_method: nccl sync_style: dynamic_by_explorer sync_timeout: 1200 trainer: grad_clip: 1.0 - max_token_len_per_gpu: 20000 + max_token_len_per_gpu: 14000 save_interval: 100 ulysses_sequence_parallel_size: 1 use_dynamic_bsz: true diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index d9b48152..d14baa7f 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -31,7 +31,7 @@ astune: - "nonsense" - "wrong_toolcall" data: - train_batch_size: 300 + train_batch_size: 264 debug: debug_max_parallel: 1 From 3330363508d7d1c89aea3561e68c2dc51fe023df Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 12:57:29 +0800 Subject: [PATCH 188/462] gpu check --- launcher.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/launcher.py b/launcher.py index 0840b4a4..38c36082 100644 --- a/launcher.py +++ b/launcher.py @@ -115,9 +115,75 @@ def check_debugpy_version(): logger.info(f"✓ debugpy version {version} meets requirement (>=1.8.0)") +def check_avail_gpu(min_free_ratio: float = 0.95): + """ + Ensure there is at least one GPU and all GPUs have >= min_free_ratio free memory. + + Uses `nvidia-smi` to query total and used memory for each GPU. + Raises RuntimeError if no GPU is found or any GPU violates the free ratio threshold. + """ + try: + # Query GPU memory via nvidia-smi; output in MiB + result = subprocess.run( + [ + "nvidia-smi", + "--query-gpu=name,memory.total,memory.used", + "--format=csv,noheader,nounits", + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + check=False, + ) + except FileNotFoundError: + raise RuntimeError("nvidia-smi not found. NVIDIA drivers/GPU may be unavailable.") + + if result.returncode != 0: + raise RuntimeError(f"Failed to query GPUs via nvidia-smi: {result.stderr.strip()}") + + lines = [l.strip() for l in result.stdout.splitlines() if l.strip()] + if not lines: + raise RuntimeError("No GPUs detected by nvidia-smi.") + + violations = [] + for idx, line in enumerate(lines): + # Expected format: ", , " + parts = [p.strip() for p in line.split(",")] + if len(parts) < 3: + violations.append((idx, "parse-error", line)) + continue + name, total_str, used_str = parts[0], parts[1], parts[2] + try: + total = float(total_str) + used = float(used_str) + except ValueError: + violations.append((idx, "parse-error", line)) + continue + free = max(total - used, 0.0) + free_ratio = free / total if total > 0 else 0.0 + logger.info( + f"GPU {idx} ({name}): total={total:.0f} MiB, used={used:.0f} MiB, free_ratio={free_ratio:.3f}" + ) + if free_ratio < min_free_ratio: + violations.append((idx, name, f"free_ratio={free_ratio:.3f} < {min_free_ratio:.3f}")) + + if violations: + details = "; ".join([f"GPU {i} ({n}): {msg}" for i, n, msg in violations]) + raise RuntimeError( + "GPU memory check failed: all GPUs must have >= " + f"{int(min_free_ratio*100)}% free. Violations: {details}" + ) + logger.info( + f"✓ GPU check passed: {len(lines)} GPUs, all >= {int(min_free_ratio*100)}% free memory" + ) + + def main(): args = parse_args() + # Enforce GPU availability and free memory threshold before proceeding + check_avail_gpu(min_free_ratio=0.95) + # Handle kill-keywords argument if provided if args.kill: logger.info(f"Killing processes matching keywords: {args.kill}") From d1d87e18dafbf92194950f099f0bb8e613f13c3b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 13:09:58 +0800 Subject: [PATCH 189/462] stash --- astune/default_config/trinity/trinity_default.yaml | 2 +- astune/default_config/trinity/trinity_launch.yaml | 4 ++-- tutorial/example_math_agent/math_agent.yaml | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index bb7887b5..16bfc7af 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -50,7 +50,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 runner_per_model: 8 # runner_state_report_interval: 30 model: - max_model_len: 21000 + max_model_len: 16000 max_response_tokens: 16000 monitor: monitor_type: swanlab diff --git a/astune/default_config/trinity/trinity_launch.yaml b/astune/default_config/trinity/trinity_launch.yaml index 363fb0f3..e61b854d 100644 --- a/astune/default_config/trinity/trinity_launch.yaml +++ b/astune/default_config/trinity/trinity_launch.yaml @@ -52,7 +52,7 @@ explorer: tool_call_parser: hermes runner_per_model: 12 model: - max_model_len: 21000 + max_model_len: 16000 max_response_tokens: 16000 model_path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct monitor: @@ -66,7 +66,7 @@ synchronizer: sync_timeout: 1200 trainer: grad_clip: 1.0 - max_token_len_per_gpu: 24576 + max_token_len_per_gpu: 16000 save_interval: 100 ulysses_sequence_parallel_size: 2 use_dynamic_bsz: true diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index d14baa7f..e623e054 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -30,8 +30,13 @@ astune: compute_madness_checklist: - "nonsense" - "wrong_toolcall" + max_response_length_in_one_turn: 1024 + max_model_len: 13000 + data: train_batch_size: 264 + max_prompt_length: 3000 + max_response_length: 10000 debug: debug_max_parallel: 1 @@ -44,6 +49,12 @@ astune: trinity_only__n_vllm_engine: 2 # must be division by tensor_model_parallel_size +trinity: + trainer: + max_token_len_per_gpu: 13000 + + + # ------------------ 不需要修改 ------------------ hydra: searchpath: From 7184cb957b35a90bca7b9704f96c3a29ed8f8375 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 13:11:05 +0800 Subject: [PATCH 190/462] update runner_per_model --- astune/default_config/trinity/trinity_default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index 16bfc7af..3b300e4f 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -47,7 +47,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 seed: 42 tensor_parallel_size: 1 tool_call_parser: hermes - runner_per_model: 8 + runner_per_model: 36 # runner_state_report_interval: 30 model: max_model_len: 16000 From 0bd6976f6f54ad49faac63bc32c5ce4975806f3b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 17:46:58 +0800 Subject: [PATCH 191/462] refactor: update service tag in pty_launch function for better clarit --- astune/default_config/{verl => }/README.md | 0 astune/default_config/trinity/README.md | 57 ++++++++++++++++--- astune/default_config/trinity/README_ZH.md | 64 ++++++++++++++++++++++ astune/utils/pty.py | 2 +- 4 files changed, 114 insertions(+), 9 deletions(-) rename astune/default_config/{verl => }/README.md (100%) create mode 100644 astune/default_config/trinity/README_ZH.md diff --git a/astune/default_config/verl/README.md b/astune/default_config/README.md similarity index 100% rename from astune/default_config/verl/README.md rename to astune/default_config/README.md diff --git a/astune/default_config/trinity/README.md b/astune/default_config/trinity/README.md index 5ffd2e27..4463006c 100644 --- a/astune/default_config/trinity/README.md +++ b/astune/default_config/trinity/README.md @@ -1,10 +1,10 @@ -# Trinity Config +# Trinity Configuration Guide 🛠️ -## To change trinity config +## How to Modify Trinity Configuration in ASTuner -- please edit `astune/default_config/trinity/trinity_default.yaml` +1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `astune/default_config/astune_default.yaml` configuration file, and ASTuner will **automatically** handle parameter mapping for you. -- or, you can write in your experiment config: +2. ⚙️ **Special Cases**: Some Trinity tuning parameters are not yet mapped in ASTuner. You can refer to Trinity’s documentation and modify them in the following format: ```yaml trinity: @@ -12,11 +12,52 @@ trinity: algorithm_type: multi_step_grpo ``` -- never edit `astune/default_config/trinity/trinity_default.yaml` +3. 🚫 **Never Edit**: + - Never edit `astune/default_config/trinity/trinity_launcher.yaml` + - Never edit `astune/default_config/trinity/trinity_default.yaml` +## Configuration Mapping Modification 🔄 +Some ASTune configurations overlap with Trinity. +You can configure mappings via the `astune/default_config/trinity/config_auto_convertion_trinity.json` file. -## change config mapping +## Trinity Hyperparameter Quick Guide 📊 -Some astune config has several configuration that is overlaps with trinity, -map them with `astune/default_config/trinity/config_auto_convertion_trinity.json` +Trinity adopts a typical producer (explorer)-consumer (trainer) architecture: +- 🏭 **Producer**: Uses VLLM to generate samples +- 🧠 **Consumer**: Consumes samples to update the model +Both operate on different runtime schedules. + +### Explorer Core Parameters 🔍 + +- `buffer.batchsize`: The minimum unit for reading task data from the dataset. Each read increments the explorer step count by 1. +- `repeat_times`: The number of repetitions per task, also the group size (G) in GRPO. +- `engine_num`: Number of VLLM engines. +- `tensor_parallel_size`: Number of GPUs occupied by each VLLM engine. +- `engine_num * tensor_parallel_size`: Total number of GPUs used by the explorer. +- `eval_interval`: Evaluation interval (in explorer steps). + +### Trainer Core Parameters 🏋️ + +- `buffer.train_batch_size`: The minimum unit consumed from the explorer’s production queue. Each read triggers one optimization step. +- `trainer.save_interval`: Parameter save interval (in trainer steps). + +### Explorer-Trainer Coordination Parameters 🤝 + +- `sync_interval`: Synchronization interval. +- `sync_offset`: Synchronization offset. +- `sync_style`: Synchronization method. + +### Runtime Instance Analysis 📈 + +**Supply Side**: Explorer runs 89 steps × batch size (8) × repeat times (4) × tasks per round (≈1) = 2,848 samples. + +meanwhile + +**Demand Side**: Trainer runs 10 steps × training batch size (264) = 2,640 samples. + +### Training Memory Control 💾 + +Same as VERL, control training memory with the following parameters: +- `trainer.max_token_len_per_gpu` +- `ulysses_sequence_parallel_size` \ No newline at end of file diff --git a/astune/default_config/trinity/README_ZH.md b/astune/default_config/trinity/README_ZH.md new file mode 100644 index 00000000..18decf5f --- /dev/null +++ b/astune/default_config/trinity/README_ZH.md @@ -0,0 +1,64 @@ +# Trinity 配置指南 🛠️ + +## 如何修改 Trinity 配置 + +1. 🎯 **推荐方式**:在大多数情况下,您无需直接调整 Trinity 参数,只需参考并修改上层的 `astune/default_config/astune_default.yaml` 配置文件即可, + ASTuner 会**自动**帮您完成参数映射。 + +2. ⚙️ **特殊情况**:部分 Trinity 调优参数目前尚未在 ASTuner 中建立映射,您可以参考 Trinity 的文档,然后通过以下形式进行修改: + +```yaml +trinity: + algorithm: + algorithm_type: multi_step_grpo +``` + +3. 🚫 **永远不要编辑**: + - 永远不要编辑 `astune/default_config/trinity/trinity_launcher.yaml` + - 永远不要编辑 `astune/default_config/trinity/trinity_default.yaml` + +## 配置映射修改 🔄 + +某些 ASTune 配置与 Trinity 存在重叠, +可通过 `astune/default_config/trinity/config_auto_convertion_trinity.json` 文件进行映射配置 + +## Trinity 超参数简明指南 📊 + +Trinity 采用典型的生产者(探索器)-消费者(训练器)架构: +- 🏭 **生产者**:使用 VLLM 生成样本 +- 🧠 **消费者**:消耗样本更新模型 +两者具有不同的运行时序 + +### 探索器核心参数 🔍 + +- `buffer.batchsize`:从数据集读取任务数据的最小单位,每次读取视为探索器步数 +1 +- `repeat_times`:每个任务重复次数,也是 GRPO 中 G(分组)的大小 +- `engine_num`:VLLM 引擎数量 +- `tensor_parallel_size`:每个 VLLM 引擎占用的显卡数量 +- `engine_num * tensor_parallel_size`:探索器使用的总显卡数量 +- `eval_interval`:评估间隔(以探索器步数为单位) + +### 训练器核心参数 🏋️ + +- `buffer.train_batch_size`:从探索器生产队列中消费的最小单位,每次读取后执行一次优化步骤 +- `trainer.save_interval`:参数保存间隔(以训练器步数为单位) + +### 探索器-训练器协同参数 🤝 + +- `sync_interval`:同步间隔 +- `sync_offset`:同步偏移 +- `sync_style`:同步方式 + +### 运行实例分析 📈 + +**供给端**:探索器运行 89 步 × 批次大小(8) × 重复次数(4) × 每轮任务(≈1) = 2848 个样本 + +与此同时,在另一边 + +**消费端**:训练器运行 10 步 × 训练批次大小(264) = 2640 个样本 + +### 训练显存控制 💾 + +与 VERL 相同,通过以下参数控制训练显存: +- `trainer.max_token_len_per_gpu` +- `ulysses_sequence_parallel_size` \ No newline at end of file diff --git a/astune/utils/pty.py b/astune/utils/pty.py index e6704b5c..f46f76d1 100644 --- a/astune/utils/pty.py +++ b/astune/utils/pty.py @@ -105,7 +105,7 @@ def pty_launch(service_name: str, success_std_string="Starting server on"): companion = LaunchCommandWhenAbsent( full_argument_list=[service_script], dir=service_path, - tag="appworld_env_service", + tag=f"{service_name}_service", use_pty=True, ) companion.launch( From 6832b9b4c0d9c07bbfc1de81177aee9c2214c29d Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 17:48:32 +0800 Subject: [PATCH 192/462] update appworld.yaml configuration and add good_trinity_checkpoints to .gitignore --- .gitignore | 1 + tutorial/example_appworld/appworld.yaml | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 0951f429..f51ca32c 100644 --- a/.gitignore +++ b/.gitignore @@ -139,3 +139,4 @@ launcher_record trinity_checkpoints astune_test +good_trinity_checkpoints diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 08b51640..594792a8 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -12,19 +12,34 @@ astune: rollout: # ✨✨✨✨ 编写并选择Agent + agentscope_disable_toolcalls: True use_agentscope_protocol: True agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol - agentscope_disable_toolcalls: True + temperature: 0.7 max_env_worker: 64 num_repeat: 4 - tensor_model_parallel_size: 4 + agent_madness_reward: -1.0 + tensor_model_parallel_size: 1 + max_num_seqs: 40 + compute_madness_checklist: + - "nonsense" + max_response_length_in_one_turn: 2048 + max_model_len: 14000 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 data: - train_batch_size: 16 + train_batch_size: 216 + max_prompt_length: 3000 + max_response_length: 11000 + + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + trinity_only__n_vllm_engine: 2 # must be division by tensor_model_parallel_size # ------------------ 不需要修改 ------------------ hydra: From 6786ec9d86dfb80ff9e8624ed26f8c254002d917 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Wed, 26 Nov 2025 18:16:50 +0800 Subject: [PATCH 193/462] =?UTF-8?q?[chore]=20=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A0=B7=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Former-commit-id: 50d65693d0f42e0d7da9cecb3d04202234a4c5fe --- tests/data/data_gen.yaml | 45 +++++ tests/data_gen.py | 161 ++++++++++++++++ tests/temp/data_gen_test/yaml_backup.yaml | 223 ++++++++++++++++++++++ 3 files changed, 429 insertions(+) create mode 100644 tests/data/data_gen.yaml create mode 100644 tests/data_gen.py create mode 100644 tests/temp/data_gen_test/yaml_backup.yaml diff --git a/tests/data/data_gen.yaml b/tests/data/data_gen.yaml new file mode 100644 index 00000000..e080efcf --- /dev/null +++ b/tests/data/data_gen.yaml @@ -0,0 +1,45 @@ +astune: + project_name: unittest + experiment_name: data_gen_test + + task_reader: + type: huggingface_dat_repo + huggingface_dat_repo: + dataset_path: "" + training_split: "train" + validation_split: "test" + + document_reader: + document_path: "" + languages: + - eng + + data_generator: + llm_model: qwen-turbo + llm_response_length: 2048 + sampling_params: + temperature: 0.7 + top_p: 0.9 + + task_augmentor: + enabled: true + + knowledge_augmentor: + n: 5 + enabled: true + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl + - file://external/verl/verl/trainer/config + - file://astune/default_config/trinity + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer + - verl_default + - trinity_default + - astune_default + - _self_ diff --git a/tests/data_gen.py b/tests/data_gen.py new file mode 100644 index 00000000..eb463c09 --- /dev/null +++ b/tests/data_gen.py @@ -0,0 +1,161 @@ +import unittest +import os +from typing import Any +from unittest.mock import patch, MagicMock + +from astune.utils.config_utils import prepare_experiment_config + +try: + from dotmap import DotMap # type: ignore + has_dotmap = True +except ImportError: + DotMap = None # type: ignore + has_dotmap = False + + +class TestDataGenerator(unittest.TestCase): + + def test_load_config(self): + """Test if the data generator configuration file is loaded without errors.""" + yaml_backup_dst, exp_base, exp_name, config = prepare_experiment_config( + 'tests/data/data_gen.yaml', + "tests/temp", + backbone="debug" + ) + + # Test basic experiment configuration + self.assertEqual(exp_name, "data_gen_test") + self.assertEqual(exp_base, "tests/temp/data_gen_test") + self.assertEqual(yaml_backup_dst, "tests/temp/data_gen_test/yaml_backup.yaml") + + # Test astune configuration + self.assertIn("astune", config) + self.assertIn("project_name", config["astune"]) + self.assertEqual(config["astune"]["project_name"], "unittest") + self.assertIn("experiment_name", config["astune"]) + self.assertEqual(config["astune"]["experiment_name"], "data_gen_test") + + def test_task_reader_config(self): + """Test task reader configuration.""" + _, _, _, config = prepare_experiment_config( + 'tests/data/data_gen.yaml', + "tests/temp", + backbone="debug" + ) + + # Test task_reader configuration + self.assertIn("task_reader", config["astune"]) + self.assertEqual(config["astune"]["task_reader"]["type"], "huggingface_dat_repo") + self.assertIn("huggingface_dat_repo", config["astune"]["task_reader"]) + + hf_config = config["astune"]["task_reader"]["huggingface_dat_repo"] + self.assertIn("dataset_path", hf_config) + self.assertIn("training_split", hf_config) + self.assertIn("validation_split", hf_config) + self.assertEqual(hf_config["training_split"], "train") + self.assertEqual(hf_config["validation_split"], "test") + + def test_document_reader_config(self): + """Test document reader configuration.""" + _, _, _, config = prepare_experiment_config( + 'tests/data/data_gen.yaml', + "tests/temp", + backbone="debug" + ) + + # Test document_reader configuration + self.assertIn("document_reader", config["astune"]) + doc_reader_config = config["astune"]["document_reader"] + self.assertIn("document_path", doc_reader_config) + self.assertIn("languages", doc_reader_config) + self.assertIn("eng", doc_reader_config["languages"]) + + def test_data_generator_config(self): + """Test data generator configuration.""" + _, _, _, config = prepare_experiment_config( + 'tests/data/data_gen.yaml', + "tests/temp", + backbone="debug" + ) + + # Test data_generator configuration + self.assertIn("data_generator", config["astune"]) + data_gen_config = config["astune"]["data_generator"] + + # Test LLM model configuration + self.assertIn("llm_model", data_gen_config) + self.assertEqual(data_gen_config["llm_model"], "qwen-turbo") + + # Test LLM response length + self.assertIn("llm_response_length", data_gen_config) + self.assertEqual(data_gen_config["llm_response_length"], 2048) + + # Test sampling parameters + self.assertIn("sampling_params", data_gen_config) + sampling_params = data_gen_config["sampling_params"] + self.assertIn("temperature", sampling_params) + self.assertEqual(sampling_params["temperature"], 0.7) + self.assertIn("top_p", sampling_params) + self.assertEqual(sampling_params["top_p"], 0.9) + + def test_task_augmentor_config(self): + """Test task augmentor configuration.""" + _, _, _, config = prepare_experiment_config( + 'tests/data/data_gen.yaml', + "tests/temp", + backbone="debug" + ) + + # Test task_augmentor configuration + data_gen_config = config["astune"]["data_generator"] + self.assertIn("task_augmentor", data_gen_config) + task_aug_config = data_gen_config["task_augmentor"] + self.assertIn("enabled", task_aug_config) + self.assertTrue(task_aug_config["enabled"]) + + def test_knowledge_augmentor_config(self): + """Test knowledge augmentor configuration.""" + _, _, _, config = prepare_experiment_config( + 'tests/data/data_gen.yaml', + "tests/temp", + backbone="debug" + ) + + # Test knowledge_augmentor configuration + data_gen_config = config["astune"]["data_generator"] + self.assertIn("knowledge_augmentor", data_gen_config) + knowledge_aug_config = data_gen_config["knowledge_augmentor"] + + self.assertIn("n", knowledge_aug_config) + self.assertEqual(knowledge_aug_config["n"], 5) + self.assertIn("enabled", knowledge_aug_config) + self.assertTrue(knowledge_aug_config["enabled"]) + + @patch.dict(os.environ, {"DASHSCOPE_API_KEY": "test_key"}) + @unittest.skipIf(not has_dotmap, "dotmap not installed") + def test_data_generator_initialization(self): + """Test if data generator components can be initialized with config.""" + from astune.data_generator.task_augmentation import TaskAugmentor + from astune.data_generator.knowledge_augmentation import KnowledgeAugmentor + + _, _, _, config = prepare_experiment_config( + 'tests/data/data_gen.yaml', + "tests/temp", + backbone="debug" + ) + + config_obj = DotMap(config) # type: ignore + + # Test TaskAugmentor initialization + task_augmentor = TaskAugmentor(config_obj) + self.assertIsNotNone(task_augmentor) + self.assertEqual(task_augmentor.config, config_obj) + + # Test KnowledgeAugmentor initialization + knowledge_augmentor = KnowledgeAugmentor(config_obj) + self.assertIsNotNone(knowledge_augmentor) + self.assertEqual(knowledge_augmentor.config, config_obj) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/temp/data_gen_test/yaml_backup.yaml b/tests/temp/data_gen_test/yaml_backup.yaml new file mode 100644 index 00000000..bf8e238d --- /dev/null +++ b/tests/temp/data_gen_test/yaml_backup.yaml @@ -0,0 +1,223 @@ +actor_rollout_ref: + actor: + entropy_coeff: 0 + fsdp_config: + optimizer_offload: true + param_offload: true + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + loss_agg_mode: seq-mean-token-mean + optim: + lr: 1.0e-06 + override_ppo_mini_batch_num: 1 + ppo_epochs: 1 + ppo_max_token_len_per_gpu: 18000 + ppo_micro_batch_size_per_gpu: 1 + ppo_mini_batch_size: 16 + use_dynamic_bsz: true + use_kl_loss: true + hybrid_engine: true + model: + enable_gradient_checkpointing: true + use_remove_padding: true + ref: + fsdp_config: + param_offload: true + log_prob_max_token_len_per_gpu: 18000 + log_prob_micro_batch_size_per_gpu: 4 + use_dynamic_bsz: true + rollout: + custom_dataflow_cls: + name: '' + path: '' + enforce_eager: true + gamma: 1.0 + gpu_memory_utilization: 0.9 + log_prob_max_token_len_per_gpu: 18000 + log_prob_micro_batch_size_per_gpu: 4 + max_env_len: 3000 + max_env_worker: 64 + max_num_seqs: 10 + mode: async + name: vllm + ppo_micro_batch_size_per_gpu: 1 + temperature: 0.9 + tensor_model_parallel_size: 1 + top_p: 1.0 +algorithm: + adv_estimator: grpo + task_norm_patch: false + use_kl_in_reward: false +astune: + backbone: debug + context_tracker: + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + context_tracker_type: linear + data: + max_prompt_length: 3000 + max_response_length: 15000 + train_batch_size: 32 + data_generator: + knowledge_augmentor: + enabled: true + n: 5 + llm_model: qwen-turbo + llm_response_length: 2048 + sampling_params: + temperature: 0.7 + top_p: 0.9 + task_augmentor: + enabled: true + debug: + debug_first_n_tasks: 2 + debug_max_parallel: 16 + debug_tensor_parallel_size: 4 + debug_vllm_port: 18000 + debug_vllm_seed: 12345 + document_reader: + document_path: '' + languages: + - eng + execute_test: false + execute_testing_lambda: '' + experiment_dir: tests/temp/data_gen_test + experiment_name: data_gen_test + model: + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + project_name: unittest + rollout: + add_special_success_reward: false + agent_madness_reward: -1.0 + agent_madness_termination: true + agentscope_disable_toolcalls: false + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol + binary_reward: false + compute_madness_checklist: + - nonsense + enable_oversample: true + force_no_think: false + force_think: false + gamma: 1.0 + max_env_len: 4096 + max_env_worker: 128 + max_model_len: 18000 + max_num_seqs: 10 + max_response_length_in_one_turn: 4096 + mode: async + multi_turn: + enable: true + max_sample_per_task: 30 + max_steps: 30 + name: vllm + num_repeat: 4 + step_skip_action: 0 + submit_oversample_multiplier: 1.5 + temperature: 0.9 + tensor_model_parallel_size: 1 + top_p: 1.0 + use_agentscope_protocol: true + use_step_reward_from_env: false + val_kwargs: + do_sample: false + num_repeat: 1 + temperature: 0.0 + top_k: -1 + top_p: 1.0 + task_judge: + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + judge_type: customized_protocal + rubrics_auto_grader: + aggregation_mode: keep_all + answer_field: final_answer + dataset_file: + training: + file_path: tutorial/example_rm_auto_grader/rubrics_train.jsonl + generate_number: 1 + grader_mode: pointwise + grader_name: Math Auto Grader + input_data_type: dataset_file + language: en + max_epochs: 2 + max_retries: 3 + max_score: 1 + min_score: 0 + model_name: qwen-max + num_reference_samples: 20 + query_field: main_query + reference_field: answer + sampling_mode: all_samples + success_threshold: 0.7 + task_reader: + dataset_file: + training: + file_path: xxxx.jsonl + validation: + file_path: xxxx.jsonl + env_service: + env_action_preference: code + env_type: appworld + env_url: http://127.0.0.1:8080 + training_split: train + validation_split: dev + huggingface_dat_repo: + dataset_path: '' + training_split: train + validation_split: test + type: huggingface_dat_repo + trainer_common: + algorithm: + adv_estimator: grpo + task_norm_patch: false + use_kl_in_reward: false + fsdp_config: + optimizer_offload: true + param_offload: true + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + logger: + - console + - swanlab + mini_batch_num: 1 + n_gpus_per_node: 8 + nnodes: 1 + optim: + lr: 1.0e-06 + save_freq: 20 + test_freq: 20 + total_epochs: 50 + trinity_only__n_vllm_engine: 2 + use_kl_loss: true + val_before_train: false + val_pass_n: 4 +data: + fast_eval: true + filter_overlong_prompts: true + return_raw_chat: true + truncation: error + val_batch_size: 100000000000 +defaults: +- verl_default +- astune_default +- _self_ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl +trainer: + critic_warmup: 0 + experiment_name: read_yaml_name + hfmodelpath: '' + logger: + - console + - swanlab + n_gpus_per_node: 8 + nnodes: 1 + project_name: appworldnew + save_freq: 20 + test_freq: 20 + total_epochs: 50 + val_before_train: false + val_pass_n: 4 From 20f775a711ff044e6604f66692cdfdd284dba415 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 20:22:28 +0800 Subject: [PATCH 194/462] merge task generation module Former-commit-id: 1bf6c929db22eb0965043e23541176ec0ace1660 --- astune/data_generator/task_augmentation.py | 17 +- .../task_reader/document_reader/doc_reader.py | 10 +- .../document_reader/document_reader_base.py | 2 +- test_data_generator.yaml | 66 ------ tests/config_test.py | 2 + tests/data/data_gen.yaml | 45 ---- tests/data_gen.py | 204 ++++------------ tests/data_gen.yaml | 19 ++ tests/temp/data_gen_test/yaml_backup.yaml | 223 ------------------ tutorial/example_werewolves/start.py | 26 +- tutorial/example_werewolves/werewolves.yaml | 22 +- 11 files changed, 111 insertions(+), 525 deletions(-) delete mode 100644 test_data_generator.yaml delete mode 100644 tests/data/data_gen.yaml create mode 100644 tests/data_gen.yaml delete mode 100644 tests/temp/data_gen_test/yaml_backup.yaml diff --git a/astune/data_generator/task_augmentation.py b/astune/data_generator/task_augmentation.py index 3ebdc5d7..ed9b5095 100644 --- a/astune/data_generator/task_augmentation.py +++ b/astune/data_generator/task_augmentation.py @@ -1,6 +1,6 @@ import re import json -from typing import Optional, Dict, Any +from typing import Optional, Dict, Any, Union from astune.schema.task import Task from astune.schema.document import Document from astune.data_generator.data_generator_base import DataGeneratorBase @@ -10,6 +10,7 @@ class TaskAugmentor(DataGeneratorBase): Task Augmentation: - Generate new queries based on reference Query (and optional Document) """ + def _build_system_prompt( self, source_task: Optional[Task], @@ -23,7 +24,7 @@ def _build_system_prompt( "You are a professional expert in query generation.\n" "Your goal is to generate ONE new user query that:\n" "- Is semantically related to the reference query (similar topic/domain/intent),\n" - "- Preserves the original query's style, task type, and approximate length,\n" + "- Preserves the original query's style, language, task type, and approximate length,\n" "- Is natural, diverse, and fluent,\n" "- Is NOT a direct copy or minor edit of the original query.\n" ) @@ -39,7 +40,7 @@ def _build_system_prompt( "- The new query should feel naturally related to the document's theme.\n" "\n" ) - + # Output format requirements to ensure structured response output_requirements = ( "You MUST:\n" @@ -54,6 +55,7 @@ def _build_system_prompt( return base_prompt + document_instructions + output_requirements + def _build_user_prompt( self, source_task: Optional[Task], @@ -100,6 +102,8 @@ def _build_user_prompt( ) return user_prompt + + def _parse_llm_output_to_task( self, raw_response: Any, @@ -147,10 +151,13 @@ def _parse_llm_output_to_task( ) return new_task - def _parse_json_response(self, response: str) -> Optional[Dict[str, Any]]: + + def _parse_json_response(self, response: str) -> Union[dict, list, str, float, int, bool, None]: """ Parse LLM response string into JSON. """ # Remove Markdown code block markers (```json and ```) if present response = re.sub(r'^```json|```$', '', response, flags=re.MULTILINE).strip() - return json.loads(response) + from agentscope._utils._common import _json_loads_with_repair + return _json_loads_with_repair(response) + diff --git a/astune/task_reader/document_reader/doc_reader.py b/astune/task_reader/document_reader/doc_reader.py index a82262aa..75012e4c 100644 --- a/astune/task_reader/document_reader/doc_reader.py +++ b/astune/task_reader/document_reader/doc_reader.py @@ -23,10 +23,8 @@ def load_document(self, source: str, languages=['eng']) -> str: str: Merged text from all pages. """ text_pages = [] - try: - text_pages = partition(source, languages=languages) - except Exception as e: - raise RuntimeError(f"Failed to partition file: {e}") + print(f"reading document from {source} using languages={languages}...") + text_pages = partition(source, languages=languages) if not text_pages: raise ValueError(f"No extractable text found in file: {source}") @@ -43,9 +41,9 @@ def _parser_document(self, raw_document: str) -> Document: metadata={} ) - + def get_document(self) -> Document: file_path = self.config.astune.document_reader.document_path - raw_doc = self.load_document(file_path, languages=self.config.astune.document_reader.languages) + raw_doc = self.load_document(file_path, languages=list(self.config.astune.document_reader.languages)) return self._parser_document(raw_doc) diff --git a/astune/task_reader/document_reader/document_reader_base.py b/astune/task_reader/document_reader/document_reader_base.py index 26ac69a8..7ba4b2a3 100644 --- a/astune/task_reader/document_reader/document_reader_base.py +++ b/astune/task_reader/document_reader/document_reader_base.py @@ -9,5 +9,5 @@ class DocReaderBase: def __init__(self, config): self.config = config - def get_document(self, file_path: str) -> Document: + def get_document(self) -> Document: raise NotImplementedError diff --git a/test_data_generator.yaml b/test_data_generator.yaml deleted file mode 100644 index fc80d1b5..00000000 --- a/test_data_generator.yaml +++ /dev/null @@ -1,66 +0,0 @@ -# ------------------ 主要配置 ------------------ -astune: - # task_reader: - # type: dataset_file - # dataset_file: - # training: - # file_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/jsonl/finQA.jsonl' - - task_reader: - type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` - # 如果选择 `huggingface_dat_repo` 以下配置生效 - huggingface_dat_repo: - dataset_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/huggingface/financial-qa-10K' - training_split: "train" - validation_split: "test" - - document_reader: - document_path: '/mnt/workspace/shian.lq/AStune/astune/dataset/document/Anti-Money Laundering and Counter-Terrorist Financing Ordinance.pdf' - languages: - - eng - - data_generator: - llm_model: gpt-4o-2024-11-20 - llm_response_length: 8192 - task_augmentor: - - knowledge_augmentor: - n: 10 # 文档生成query 的数量 - - -# task_judge: -# # ✨✨✨✨ 编写并选择评价函数 -# judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge - -# model: -# # ✨✨✨✨ 设置待训练的模型 -# path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - -# rollout: -# agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent - -# debug: -# debug_max_parallel: 1 -# debug_first_n_tasks: 1 - -# trinity: -# algorithm: -# repeat_times: 6 -# buffer: -# train_batch_size: 180 - -# # ------------------ 不需要修改 ------------------ -# hydra: -# searchpath: -# - file://astune/default_config -# - file://astune/default_config/verl # verl only -# - file://external/verl/verl/trainer/config # verl only -# - file://astune/default_config/trinity # trinity only - -# # ------------------ 不需要修改 ------------------ -# defaults: -# - ppo_trainer # verl inherit 1/2 -# - verl_default # verl inherit 2/2 -# - trinity_default # trinity inherit 1/1 -# - astune_default -# - _self_ diff --git a/tests/config_test.py b/tests/config_test.py index 82a4fa2a..5795bc0e 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -16,3 +16,5 @@ def test_load_config(self): self.assertIn("experiment_name", config["astune"]) self.assertEqual(config["astune"]["experiment_name"], "sample") self.assertIn("task_reader", config["astune"]) + + diff --git a/tests/data/data_gen.yaml b/tests/data/data_gen.yaml deleted file mode 100644 index e080efcf..00000000 --- a/tests/data/data_gen.yaml +++ /dev/null @@ -1,45 +0,0 @@ -astune: - project_name: unittest - experiment_name: data_gen_test - - task_reader: - type: huggingface_dat_repo - huggingface_dat_repo: - dataset_path: "" - training_split: "train" - validation_split: "test" - - document_reader: - document_path: "" - languages: - - eng - - data_generator: - llm_model: qwen-turbo - llm_response_length: 2048 - sampling_params: - temperature: 0.7 - top_p: 0.9 - - task_augmentor: - enabled: true - - knowledge_augmentor: - n: 5 - enabled: true - -# ------------------ 不需要修改 ------------------ -hydra: - searchpath: - - file://astune/default_config - - file://astune/default_config/verl - - file://external/verl/verl/trainer/config - - file://astune/default_config/trinity - -# ------------------ 不需要修改 ------------------ -defaults: - - ppo_trainer - - verl_default - - trinity_default - - astune_default - - _self_ diff --git a/tests/data_gen.py b/tests/data_gen.py index eb463c09..39f180ac 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -1,161 +1,45 @@ -import unittest import os -from typing import Any -from unittest.mock import patch, MagicMock - -from astune.utils.config_utils import prepare_experiment_config - -try: - from dotmap import DotMap # type: ignore - has_dotmap = True -except ImportError: - DotMap = None # type: ignore - has_dotmap = False - - -class TestDataGenerator(unittest.TestCase): - - def test_load_config(self): - """Test if the data generator configuration file is loaded without errors.""" - yaml_backup_dst, exp_base, exp_name, config = prepare_experiment_config( - 'tests/data/data_gen.yaml', - "tests/temp", - backbone="debug" - ) - - # Test basic experiment configuration - self.assertEqual(exp_name, "data_gen_test") - self.assertEqual(exp_base, "tests/temp/data_gen_test") - self.assertEqual(yaml_backup_dst, "tests/temp/data_gen_test/yaml_backup.yaml") - - # Test astune configuration - self.assertIn("astune", config) - self.assertIn("project_name", config["astune"]) - self.assertEqual(config["astune"]["project_name"], "unittest") - self.assertIn("experiment_name", config["astune"]) - self.assertEqual(config["astune"]["experiment_name"], "data_gen_test") - - def test_task_reader_config(self): - """Test task reader configuration.""" - _, _, _, config = prepare_experiment_config( - 'tests/data/data_gen.yaml', - "tests/temp", - backbone="debug" - ) - - # Test task_reader configuration - self.assertIn("task_reader", config["astune"]) - self.assertEqual(config["astune"]["task_reader"]["type"], "huggingface_dat_repo") - self.assertIn("huggingface_dat_repo", config["astune"]["task_reader"]) - - hf_config = config["astune"]["task_reader"]["huggingface_dat_repo"] - self.assertIn("dataset_path", hf_config) - self.assertIn("training_split", hf_config) - self.assertIn("validation_split", hf_config) - self.assertEqual(hf_config["training_split"], "train") - self.assertEqual(hf_config["validation_split"], "test") - - def test_document_reader_config(self): - """Test document reader configuration.""" - _, _, _, config = prepare_experiment_config( - 'tests/data/data_gen.yaml', - "tests/temp", - backbone="debug" - ) - - # Test document_reader configuration - self.assertIn("document_reader", config["astune"]) - doc_reader_config = config["astune"]["document_reader"] - self.assertIn("document_path", doc_reader_config) - self.assertIn("languages", doc_reader_config) - self.assertIn("eng", doc_reader_config["languages"]) - - def test_data_generator_config(self): - """Test data generator configuration.""" - _, _, _, config = prepare_experiment_config( - 'tests/data/data_gen.yaml', - "tests/temp", - backbone="debug" - ) - - # Test data_generator configuration - self.assertIn("data_generator", config["astune"]) - data_gen_config = config["astune"]["data_generator"] - - # Test LLM model configuration - self.assertIn("llm_model", data_gen_config) - self.assertEqual(data_gen_config["llm_model"], "qwen-turbo") - - # Test LLM response length - self.assertIn("llm_response_length", data_gen_config) - self.assertEqual(data_gen_config["llm_response_length"], 2048) - - # Test sampling parameters - self.assertIn("sampling_params", data_gen_config) - sampling_params = data_gen_config["sampling_params"] - self.assertIn("temperature", sampling_params) - self.assertEqual(sampling_params["temperature"], 0.7) - self.assertIn("top_p", sampling_params) - self.assertEqual(sampling_params["top_p"], 0.9) - - def test_task_augmentor_config(self): - """Test task augmentor configuration.""" - _, _, _, config = prepare_experiment_config( - 'tests/data/data_gen.yaml', - "tests/temp", - backbone="debug" - ) - - # Test task_augmentor configuration - data_gen_config = config["astune"]["data_generator"] - self.assertIn("task_augmentor", data_gen_config) - task_aug_config = data_gen_config["task_augmentor"] - self.assertIn("enabled", task_aug_config) - self.assertTrue(task_aug_config["enabled"]) - - def test_knowledge_augmentor_config(self): - """Test knowledge augmentor configuration.""" - _, _, _, config = prepare_experiment_config( - 'tests/data/data_gen.yaml', - "tests/temp", - backbone="debug" - ) - - # Test knowledge_augmentor configuration - data_gen_config = config["astune"]["data_generator"] - self.assertIn("knowledge_augmentor", data_gen_config) - knowledge_aug_config = data_gen_config["knowledge_augmentor"] - - self.assertIn("n", knowledge_aug_config) - self.assertEqual(knowledge_aug_config["n"], 5) - self.assertIn("enabled", knowledge_aug_config) - self.assertTrue(knowledge_aug_config["enabled"]) - - @patch.dict(os.environ, {"DASHSCOPE_API_KEY": "test_key"}) - @unittest.skipIf(not has_dotmap, "dotmap not installed") - def test_data_generator_initialization(self): - """Test if data generator components can be initialized with config.""" - from astune.data_generator.task_augmentation import TaskAugmentor - from astune.data_generator.knowledge_augmentation import KnowledgeAugmentor - - _, _, _, config = prepare_experiment_config( - 'tests/data/data_gen.yaml', - "tests/temp", - backbone="debug" - ) - - config_obj = DotMap(config) # type: ignore - - # Test TaskAugmentor initialization - task_augmentor = TaskAugmentor(config_obj) - self.assertIsNotNone(task_augmentor) - self.assertEqual(task_augmentor.config, config_obj) - - # Test KnowledgeAugmentor initialization - knowledge_augmentor = KnowledgeAugmentor(config_obj) - self.assertIsNotNone(knowledge_augmentor) - self.assertEqual(knowledge_augmentor.config, config_obj) - - -if __name__ == "__main__": - unittest.main() +import yaml +import unittest +import dotenv; dotenv.load_dotenv() +from tqdm import tqdm +from loguru import logger +from astune.utils.config_utils import read_astune_config +from astune.task_reader import TaskReaderRouterV2 +from astune.task_reader.document_reader.doc_reader import DocReader +from astune.data_generator.knowledge_augmentation import KnowledgeAugmentor +from astune.data_generator.task_augmentation import TaskAugmentor + + +class TestConfigUtils(unittest.TestCase): + + def test_data_gen_main(self): + try: + config = read_astune_config('tests/data_gen.yaml') + + task_reader = TaskReaderRouterV2( + reader_type=config.astune.data_generator.reader.type, + reader_config=config.astune.data_generator.reader + ) + Tasks = task_reader.get_training_tasks() + Tasks = Tasks[:5] + document_reader = DocReader(config) + doc = document_reader.get_document() + + gene_tasks = [] + # generate task + # 1. Task Augmentation + task_augmentor = TaskAugmentor(config) + print("-Task Augmentation Start") + for i, task in enumerate(Tasks): + result = task_augmentor.generate_task(source_task=task, document=doc) + gene_tasks.extend([result] if not isinstance(result, list) else result) + print("-Task Augmentation End") + # 2. Knowledge Augmentation + knowledge_augmentor = KnowledgeAugmentor(config) + print("-Knowledge Augmentation Start") + gene_tasks.extend(knowledge_augmentor.generate_task(source_task=None, document=doc)) + print("-Knowledge Augmentation End") + except Exception as e: + logger.exception("Data generation failed.") + raise e diff --git a/tests/data_gen.yaml b/tests/data_gen.yaml new file mode 100644 index 00000000..96b2847e --- /dev/null +++ b/tests/data_gen.yaml @@ -0,0 +1,19 @@ +astune: + document_reader: + document_path: 'dataset/document/Anti-Money Laundering and Counter-Terrorist Financing Ordinance.pdf' + languages: + - eng + + data_generator: + reader: + type: dataset_file # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + dataset_file: + training: + file_path: 'dataset/jsonl/finQA.jsonl' + + llm_model: qwen-long + llm_response_length: 8192 + sampling_params: + temperature: 0 + knowledge_augmentor: + n: 10 # 文档生成query 的数量 diff --git a/tests/temp/data_gen_test/yaml_backup.yaml b/tests/temp/data_gen_test/yaml_backup.yaml deleted file mode 100644 index bf8e238d..00000000 --- a/tests/temp/data_gen_test/yaml_backup.yaml +++ /dev/null @@ -1,223 +0,0 @@ -actor_rollout_ref: - actor: - entropy_coeff: 0 - fsdp_config: - optimizer_offload: true - param_offload: true - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - loss_agg_mode: seq-mean-token-mean - optim: - lr: 1.0e-06 - override_ppo_mini_batch_num: 1 - ppo_epochs: 1 - ppo_max_token_len_per_gpu: 18000 - ppo_micro_batch_size_per_gpu: 1 - ppo_mini_batch_size: 16 - use_dynamic_bsz: true - use_kl_loss: true - hybrid_engine: true - model: - enable_gradient_checkpointing: true - use_remove_padding: true - ref: - fsdp_config: - param_offload: true - log_prob_max_token_len_per_gpu: 18000 - log_prob_micro_batch_size_per_gpu: 4 - use_dynamic_bsz: true - rollout: - custom_dataflow_cls: - name: '' - path: '' - enforce_eager: true - gamma: 1.0 - gpu_memory_utilization: 0.9 - log_prob_max_token_len_per_gpu: 18000 - log_prob_micro_batch_size_per_gpu: 4 - max_env_len: 3000 - max_env_worker: 64 - max_num_seqs: 10 - mode: async - name: vllm - ppo_micro_batch_size_per_gpu: 1 - temperature: 0.9 - tensor_model_parallel_size: 1 - top_p: 1.0 -algorithm: - adv_estimator: grpo - task_norm_patch: false - use_kl_in_reward: false -astune: - backbone: debug - context_tracker: - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - context_tracker_type: linear - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 32 - data_generator: - knowledge_augmentor: - enabled: true - n: 5 - llm_model: qwen-turbo - llm_response_length: 2048 - sampling_params: - temperature: 0.7 - top_p: 0.9 - task_augmentor: - enabled: true - debug: - debug_first_n_tasks: 2 - debug_max_parallel: 16 - debug_tensor_parallel_size: 4 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - document_reader: - document_path: '' - languages: - - eng - execute_test: false - execute_testing_lambda: '' - experiment_dir: tests/temp/data_gen_test - experiment_name: data_gen_test - model: - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - project_name: unittest - rollout: - add_special_success_reward: false - agent_madness_reward: -1.0 - agent_madness_termination: true - agentscope_disable_toolcalls: false - agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol - binary_reward: false - compute_madness_checklist: - - nonsense - enable_oversample: true - force_no_think: false - force_think: false - gamma: 1.0 - max_env_len: 4096 - max_env_worker: 128 - max_model_len: 18000 - max_num_seqs: 10 - max_response_length_in_one_turn: 4096 - mode: async - multi_turn: - enable: true - max_sample_per_task: 30 - max_steps: 30 - name: vllm - num_repeat: 4 - step_skip_action: 0 - submit_oversample_multiplier: 1.5 - temperature: 0.9 - tensor_model_parallel_size: 1 - top_p: 1.0 - use_agentscope_protocol: true - use_step_reward_from_env: false - val_kwargs: - do_sample: false - num_repeat: 1 - temperature: 0.0 - top_k: -1 - top_p: 1.0 - task_judge: - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge - judge_type: customized_protocal - rubrics_auto_grader: - aggregation_mode: keep_all - answer_field: final_answer - dataset_file: - training: - file_path: tutorial/example_rm_auto_grader/rubrics_train.jsonl - generate_number: 1 - grader_mode: pointwise - grader_name: Math Auto Grader - input_data_type: dataset_file - language: en - max_epochs: 2 - max_retries: 3 - max_score: 1 - min_score: 0 - model_name: qwen-max - num_reference_samples: 20 - query_field: main_query - reference_field: answer - sampling_mode: all_samples - success_threshold: 0.7 - task_reader: - dataset_file: - training: - file_path: xxxx.jsonl - validation: - file_path: xxxx.jsonl - env_service: - env_action_preference: code - env_type: appworld - env_url: http://127.0.0.1:8080 - training_split: train - validation_split: dev - huggingface_dat_repo: - dataset_path: '' - training_split: train - validation_split: test - type: huggingface_dat_repo - trainer_common: - algorithm: - adv_estimator: grpo - task_norm_patch: false - use_kl_in_reward: false - fsdp_config: - optimizer_offload: true - param_offload: true - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - logger: - - console - - swanlab - mini_batch_num: 1 - n_gpus_per_node: 8 - nnodes: 1 - optim: - lr: 1.0e-06 - save_freq: 20 - test_freq: 20 - total_epochs: 50 - trinity_only__n_vllm_engine: 2 - use_kl_loss: true - val_before_train: false - val_pass_n: 4 -data: - fast_eval: true - filter_overlong_prompts: true - return_raw_chat: true - truncation: error - val_batch_size: 100000000000 -defaults: -- verl_default -- astune_default -- _self_ -hydra: - searchpath: - - file://astune/default_config - - file://astune/default_config/verl -trainer: - critic_warmup: 0 - experiment_name: read_yaml_name - hfmodelpath: '' - logger: - - console - - swanlab - n_gpus_per_node: 8 - nnodes: 1 - project_name: appworldnew - save_freq: 20 - test_freq: 20 - total_epochs: 50 - val_before_train: false - val_pass_n: 4 diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index 2b97288a..66f16347 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -81,7 +81,7 @@ class ExampleWerewolves(Workflow): trainer: str = Field(default="astune-trinity") trainable_targets: list = Field( - default=["werewolf"], description="List of agents to be fine-tuned." + default=["seer", "witch"], description="List of agents to be fine-tuned." ) async def agentscope_execute( @@ -103,23 +103,23 @@ async def agentscope_execute( # initialize agents players = [] for i, role in enumerate(roles): - # default_model = OpenAIChatModel( - # model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", - # stream=False, - # client_args={"base_url": "http://22.16.118.255:2888/v1"}, - # api_key="1234", - # ) - default_model = DashScopeChatModel( - model_name="qwen-max", - api_key=os.environ.get("DASHSCOPE_API_KEY", "your-dashscope-api-key"), - stream=False + default_model = OpenAIChatModel( + model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", + stream=False, + client_args={"base_url": "http://22.17.52.4:2888/v1"}, + api_key="1234", ) + # default_model = DashScopeChatModel( + # model_name="qwen-max", + # api_key=os.environ.get("DASHSCOPE_API_KEY", "your-dashscope-api-key"), + # stream=False + # ) agent = ReActAgent( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), model=model_tuner.register_model(role, default_model=default_model), - # formatter=OpenAIMultiAgentFormatter(), - formatter=DashScopeMultiAgentFormatter(), + formatter=OpenAIMultiAgentFormatter(), + # formatter=DashScopeMultiAgentFormatter(), ) agent.set_console_output_enabled(False) players += [agent] diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index 88bdeaf9..317d3bb7 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -13,22 +13,32 @@ astune: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: + use_agentscope_protocol: True agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 4 + num_repeat: 6 agent_madness_reward: 0.0 - temperature: 0.3 - tensor_model_parallel_size: 4 + max_env_worker: 64 + temperature: 0.7 + tensor_model_parallel_size: 1 + max_num_seqs: 40 + compute_madness_checklist: + - "nonsense" + max_response_length_in_one_turn: 2048 + max_model_len: 16000 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 data: - max_prompt_length: 9000 - max_response_length: 9000 - train_batch_size: 8 + max_prompt_length: 3000 + max_response_length: 13000 + train_batch_size: 16 trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 val_before_train: False # ------------------ 不需要修改 ------------------ From 1b11366caa0aebfeed490d95804e710086362c19 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 23:18:08 +0800 Subject: [PATCH 195/462] fix: improve message content handling and update configuration parameters in various files --- .../agentscope_tracker/multiagent_tracking.py | 32 ++++++----- .../trinity/trinity_default.yaml | 2 +- astune/tuner.py | 7 ++- tutorial/example_appworld/appworld.yaml | 2 +- tutorial/example_werewolves/game.py | 2 - tutorial/example_werewolves/start.py | 54 ++++++++++--------- tutorial/example_werewolves/werewolves.yaml | 22 +++++--- 7 files changed, 70 insertions(+), 51 deletions(-) diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index f6c6a1ff..a4d90bd1 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -68,18 +68,26 @@ def step_prepare(self, messages: List[dict], tools: List = []): author = "env" ignore = False str_content = "" - for item in msg["content"]: - if "text" not in item: - logger.warning( - f"Non-text content in message content detected: {item}. Ignoring." - ) - ignore = True - break - if isinstance(item["text"], str): - str_content += str(item["text"]) - else: - str_content = "" - msg["content"] = str_content + + # fix msg content + if msg["content"] is None: + msg["content"] = "" + elif isinstance(msg["content"], list): + for item in msg["content"]: + if "text" not in item: + logger.warning( + f"Non-text content in message content detected: {item}. Ignoring." + ) + ignore = True + break + if isinstance(item["text"], str): + str_content += str(item["text"]) + else: + str_content = "" + msg["content"] = str_content + else: + raise ValueError(f"Unsupported non-str message content type: {type(msg['content'])}, Message:\n {msg}") + if ignore: continue msg["content"] = str(msg["content"]) # TODO: better handling mm data diff --git a/astune/default_config/trinity/trinity_default.yaml b/astune/default_config/trinity/trinity_default.yaml index 3b300e4f..8eef7353 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astune/default_config/trinity/trinity_default.yaml @@ -5,7 +5,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 lr: 1e-6 repeat_times: 6 buffer: - batch_size: 8 + batch_size: 32 explorer_input: eval_tasksets: [] taskset: diff --git a/astune/tuner.py b/astune/tuner.py index b3922bf6..f1372fc9 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -33,7 +33,7 @@ def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase) ) def __call__(self, *args, **kwargs): - if self.tuner.is_trainable(self.name): + if not self.tuner.is_trainable(self.name): # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, # and self.name is not in it, use default model return self.default_model(*args, **kwargs) @@ -81,9 +81,8 @@ def register_model(self, target_name: str, default_model: ChatModelBase) -> Agen The agent type instance corresponding to the provided name. """ if target_name in self.target2proxy_registry: - logger.warning( - f"Agent proxy `{target_name}` is already registered. Overwriting `default_model`." - ) + if default_model.model_name != self.target2proxy_registry[target_name].default_model.model_name: + raise ValueError(f"Agent proxy `{target_name}` is already registered with a different model_name.\nWAS [{self.target2proxy_registry[target_name].default_model.model_name}]\nNOW [{default_model.model_name}].") self.target2proxy_registry[target_name] = Agent2Proxy(target_name, self, default_model) return self.get_model(target_name) diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 594792a8..5105a88b 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -8,7 +8,7 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct rollout: # ✨✨✨✨ 编写并选择Agent diff --git a/tutorial/example_werewolves/game.py b/tutorial/example_werewolves/game.py index 6038f3cf..eb2f6e91 100644 --- a/tutorial/example_werewolves/game.py +++ b/tutorial/example_werewolves/game.py @@ -80,8 +80,6 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: ) # Assign roles to the agents - np.random.shuffle(agents) - for agent, role in zip(agents, roles): # Tell the agent its role await agent.observe( diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index 2b97288a..a890d17c 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -81,7 +81,7 @@ class ExampleWerewolves(Workflow): trainer: str = Field(default="astune-trinity") trainable_targets: list = Field( - default=["werewolf"], description="List of agents to be fine-tuned." + default=["seer", "witch"], description="List of agents to be fine-tuned." ) async def agentscope_execute( @@ -103,39 +103,43 @@ async def agentscope_execute( # initialize agents players = [] for i, role in enumerate(roles): - # default_model = OpenAIChatModel( - # model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", - # stream=False, - # client_args={"base_url": "http://22.16.118.255:2888/v1"}, - # api_key="1234", - # ) - default_model = DashScopeChatModel( - model_name="qwen-max", - api_key=os.environ.get("DASHSCOPE_API_KEY", "your-dashscope-api-key"), - stream=False + default_model = OpenAIChatModel( + model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", + stream=False, + client_args={"base_url": "http://22.17.52.4:2888/v1"}, + api_key="no_api_key", ) + # default_model = DashScopeChatModel( + # model_name="qwen-max", + # api_key=os.environ.get("DASHSCOPE_API_KEY", "your-dashscope-api-key"), + # stream=False + # ) agent = ReActAgent( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), model=model_tuner.register_model(role, default_model=default_model), - # formatter=OpenAIMultiAgentFormatter(), - formatter=DashScopeMultiAgentFormatter(), + formatter=DashScopeMultiAgentFormatter() if role in self.trainable_targets else OpenAIMultiAgentFormatter(), ) agent.set_console_output_enabled(False) players += [agent] # reward condition - good_guy_win = await werewolves_game(players, roles) - raw_reward = 0 - is_success = False - if (good_guy_win and self.trainable_targets[0] != "werewolf") or ( - not good_guy_win and self.trainable_targets[0] == "werewolf" - ): - raw_reward = 1 - is_success = True - - # check - logger.warning(f"Raw reward: {raw_reward}") - logger.warning(f"Is success: {is_success}") + try: + good_guy_win = await werewolves_game(players, roles) + raw_reward = 0 + is_success = False + if (good_guy_win and self.trainable_targets[0] != "werewolf") or ( + not good_guy_win and self.trainable_targets[0] == "werewolf" + ): + raw_reward = 1 + is_success = True + # check + logger.warning(f"Raw reward: {raw_reward}") + logger.warning(f"Is success: {is_success}") + except Exception as e: + logger.bind(exception=True).exception(f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent).") + raw_reward = 0.0 + is_success = False + return WorkflowOutput(reward=raw_reward, is_success=is_success) diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index 88bdeaf9..95d1eb1c 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -13,22 +13,32 @@ astune: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: + use_agentscope_protocol: True agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 4 + num_repeat: 6 + max_env_worker: 64 + temperature: 0.7 agent_madness_reward: 0.0 - temperature: 0.3 - tensor_model_parallel_size: 4 + tensor_model_parallel_size: 1 + max_num_seqs: 40 + compute_madness_checklist: + - "nonsense" + max_response_length_in_one_turn: 2048 + max_model_len: 16000 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 data: - max_prompt_length: 9000 - max_response_length: 9000 - train_batch_size: 8 + max_prompt_length: 3000 + max_response_length: 13000 + train_batch_size: 16 trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 val_before_train: False # ------------------ 不需要修改 ------------------ From 2ae59a05f7b9e8740a5b7c9fadaa5e8084662450 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 26 Nov 2025 23:41:22 +0800 Subject: [PATCH 196/462] stage appworld config --- .../trinity/config_auto_convertion_trinity.json | 11 +++++++---- tutorial/example_appworld/appworld.yaml | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/astune/default_config/trinity/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json index 28cd75e3..9f2b5c52 100644 --- a/astune/default_config/trinity/config_auto_convertion_trinity.json +++ b/astune/default_config/trinity/config_auto_convertion_trinity.json @@ -1,17 +1,20 @@ { + "astune.trainer_common.nnodes": "cluster.node_num", "astune.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", "astune.trainer_common.total_epochs": "buffer.total_epochs", "astune.trainer_common.trinity_only__n_vllm_engine": "explorer.rollout_model.engine_num", + "astune.trainer_common.trinity_only__explorer_batchsize": "buffer.batch_size", + "astune.trainer_common.trinity_only__runner_per_model": "explorer.runner_per_model", + "astune.trainer_common.save_freq": "trainer.save_interval", + "astune.trainer_common.test_freq": "explorer.eval_interval", "astune.model.path": "model.model_path", "astune.project_name": "project", "astune.experiment_name": "name", - "astune.rollout.num_repeat": "algorithm.repeat_times", - "astune.trainer_common.save_freq": "trainer.save_interval", - "astune.trainer_common.test_freq": "explorer.eval_interval", "astune.data.train_batch_size": "buffer.train_batch_size", - "astune.rollout.tensor_model_parallel_size": "explorer.rollout_model.tensor_parallel_size", "astune.data.max_response_length": "model.max_response_tokens", + "astune.rollout.num_repeat": "algorithm.repeat_times", + "astune.rollout.tensor_model_parallel_size": "explorer.rollout_model.tensor_parallel_size", "astune.rollout.max_model_len": [ "model.max_model_len", "trainer.max_token_len_per_gpu" diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 5105a88b..5ef27c8c 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -17,29 +17,32 @@ astune: agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol temperature: 0.7 max_env_worker: 64 - num_repeat: 4 + num_repeat: 6 agent_madness_reward: -1.0 tensor_model_parallel_size: 1 max_num_seqs: 40 compute_madness_checklist: - "nonsense" max_response_length_in_one_turn: 2048 - max_model_len: 14000 + max_model_len: 13000 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 data: - train_batch_size: 216 + train_batch_size: 192 max_prompt_length: 3000 - max_response_length: 11000 + max_response_length: 10000 trainer_common: save_freq: 99999 test_freq: 99999 total_epochs: 99999 trinity_only__n_vllm_engine: 2 # must be division by tensor_model_parallel_size + trinity_only__explorer_batchsize: 32 # for best parallel performance, make sure that (trinity_only__explorer_batchsize * num_repeat) <= (trinity_only__n_vllm_engine * runner_per_model) + trinity_only__runner_per_model: 100 # for best parallel performance, make sure that (trinity_only__explorer_batchsize * num_repeat) <= (trinity_only__n_vllm_engine * runner_per_model) + # ------------------ 不需要修改 ------------------ hydra: From a751e4884dc22e63de9101ab45bc892047660a4c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 00:28:24 +0800 Subject: [PATCH 197/462] stage launcher patch --- launcher.py | 3 +- .../example_appworld/appworld_2nodes.yaml | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 tutorial/example_appworld/appworld_2nodes.yaml diff --git a/launcher.py b/launcher.py index 38c36082..842012ed 100644 --- a/launcher.py +++ b/launcher.py @@ -229,7 +229,8 @@ def main(): logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") - assert exp_config["astune"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore + if args.conf: + assert exp_config["astune"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": env["ASTUNE_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore diff --git a/tutorial/example_appworld/appworld_2nodes.yaml b/tutorial/example_appworld/appworld_2nodes.yaml new file mode 100644 index 00000000..93f084fc --- /dev/null +++ b/tutorial/example_appworld/appworld_2nodes.yaml @@ -0,0 +1,63 @@ +# ------------------ 主要配置 ------------------ +astune: + project_name: example_appworld + experiment_name: "read_yaml_name" + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + + rollout: + # ✨✨✨✨ 编写并选择Agent + agentscope_disable_toolcalls: True + use_agentscope_protocol: True + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol + temperature: 0.7 + max_env_worker: 64 + num_repeat: 6 + agent_madness_reward: -1.0 + tensor_model_parallel_size: 1 + max_num_seqs: 40 + compute_madness_checklist: + - "nonsense" + max_response_length_in_one_turn: 2048 + max_model_len: 13000 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + data: + train_batch_size: 192 + max_prompt_length: 3000 + max_response_length: 10000 + + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + trinity_only__n_vllm_engine: 8 # must be division by tensor_model_parallel_size + trinity_only__explorer_batchsize: 32 # for best parallel performance, make sure that (trinity_only__explorer_batchsize * num_repeat) <= (trinity_only__n_vllm_engine * runner_per_model) + trinity_only__runner_per_model: 100 # for best parallel performance, make sure that (trinity_only__explorer_batchsize * num_repeat) <= (trinity_only__n_vllm_engine * runner_per_model) + nnodes: 2 + n_gpus_per_node: 8 + + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://astune/default_config + - file://astune/default_config/verl # verl only + - file://external/verl/verl/trainer/config # verl only + - file://astune/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ From 3da6f97c13e981de01fcb08516e3b253a6419816 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 11:49:14 +0800 Subject: [PATCH 198/462] stage yaml changes --- astune/default_config/astune_default.yaml | 1 + astune/task_rollout/async_llm_bridge.py | 1 + tutorial/example_appworld/appworld_2nodes.yaml | 2 +- tutorial/example_werewolves/werewolves.yaml | 6 +++--- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index aca2deb4..c965a60e 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -50,6 +50,7 @@ astune: gamma: 1.0 agent_madness_termination: True # terminate_after_gone_mad agent_madness_reward: -1.0 # customize the reward when agent is detected as gone mad + # astune_action_when_overflow: "return_warning_as_llm_output" # `return_warning_as_llm_output`, `fallback_to_default_model` add_special_success_reward: False temperature: 0.9 top_p: 1.0 diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index 665d0a1a..e0dd25d6 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -266,6 +266,7 @@ async def __call__( logger.warning(f"[{info}] detected.") self.context_tracker.context_overflow = True if token_overflow: + # astune_action_when_overflow = self.config.astune.rollout.astune_action_when_overflow # cannot proceed due to context overflow return ChatResponse( content=[{"type": "text", "text": "astune_proxy: Exceeded max model context length."}], diff --git a/tutorial/example_appworld/appworld_2nodes.yaml b/tutorial/example_appworld/appworld_2nodes.yaml index 93f084fc..79fc55fc 100644 --- a/tutorial/example_appworld/appworld_2nodes.yaml +++ b/tutorial/example_appworld/appworld_2nodes.yaml @@ -8,7 +8,7 @@ astune: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: # ✨✨✨✨ 编写并选择Agent diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index 95d1eb1c..c5249671 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -15,12 +15,12 @@ astune: rollout: use_agentscope_protocol: True agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 6 + num_repeat: 4 max_env_worker: 64 temperature: 0.7 agent_madness_reward: 0.0 - tensor_model_parallel_size: 1 - max_num_seqs: 40 + tensor_model_parallel_size: 4 + max_num_seqs: 128 compute_madness_checklist: - "nonsense" max_response_length_in_one_turn: 2048 From 8b5e1610f91ac75c51f81064113d5d3da319e0b0 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 12:13:13 +0800 Subject: [PATCH 199/462] add env var management --- .gitignore | 1 + astune/main_trinity.py | 14 ++++++------ astune/main_verl.py | 27 ++-------------------- astune/utils/core_env_vars.py | 42 +++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 32 deletions(-) create mode 100644 astune/utils/core_env_vars.py diff --git a/.gitignore b/.gitignore index f51ca32c..49c1f0e6 100644 --- a/.gitignore +++ b/.gitignore @@ -140,3 +140,4 @@ launcher_record trinity_checkpoints astune_test good_trinity_checkpoints +tutorial/example_math_agent/math_agent_debug.yaml diff --git a/astune/main_trinity.py b/astune/main_trinity.py index 62e54e0c..c7640f75 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -12,6 +12,7 @@ from pathlib import Path from pprint import pprint from astune.utils.sms_agent import send_train_message +from astune.utils.core_env_vars import get_runtime_env from trinity.buffer.pipelines.task_pipeline import check_and_run_task_pipeline from trinity.common.config import Config, load_config from trinity.common.constants import DEBUG_NAMESPACE, PLUGIN_DIRS_ENV_VAR @@ -36,7 +37,7 @@ def bench(config: Config) -> None: """Evaluate model.""" config.explorer.name = "benchmark" try: - explorer = Explorer.get_actor(config) + explorer = Explorer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get(explorer.prepare.remote()) ray.get(explorer.benchmark.remote()) logger.info("Benchmark finished.") @@ -48,7 +49,7 @@ def bench(config: Config) -> None: def explore(config: Config) -> None: """Run explorer.""" try: - explorer = Explorer.get_actor(config) + explorer = Explorer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get(explorer.prepare.remote()) ray.get(explorer.sync_weight.remote()) ray.get(explorer.explore.remote()) @@ -60,7 +61,7 @@ def explore(config: Config) -> None: def train(config: Config) -> None: """Run trainer.""" try: - trainer = Trainer.get_actor(config) + trainer = Trainer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get(trainer.prepare.remote()) ray.get(trainer.sync_weight.remote()) ray.get(trainer.train.remote()) @@ -72,7 +73,7 @@ def train(config: Config) -> None: def serve(config: Config) -> None: """Run explorer in server mode.""" try: - explorer = Explorer.get_actor(config) + explorer = Explorer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get(explorer.prepare.remote()) ray.get(explorer.sync_weight.remote()) ray.get(explorer.serve.remote()) @@ -92,8 +93,8 @@ def both(config: Config) -> None: algorithms and tasks. """ try: - explorer = Explorer.get_actor(config) - trainer = Trainer.get_actor(config) + explorer = Explorer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) + trainer = Trainer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get([explorer.__ray_ready__.remote(), trainer.__ray_ready__.remote()]) ray.get( [ @@ -179,7 +180,6 @@ def run(config_path: str, dlc: bool = False, plugin_dir: str = None): if os.path.exists(".env"): from dotenv import load_dotenv - load_dotenv(".env") atexit.register(lambda: send_train_message("0000")) diff --git a/astune/main_verl.py b/astune/main_verl.py index 93696002..65a4441c 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -21,6 +21,7 @@ import ray import atexit from astune.utils.sms_agent import send_train_message +from astune.utils.core_env_vars import get_runtime_env from omegaconf import OmegaConf from verl.experimental.dataset.sampler import AbstractSampler from verl.trainer.constants_ppo import get_ppo_ray_runtime_env @@ -53,31 +54,7 @@ def run_ppo(config) -> None: # Check if Ray is not initialized if not ray.is_initialized(): # this is for local ray cluster - runtime_env = { - "env_vars": { - "TOKENIZERS_PARALLELISM": "true", - "NCCL_DEBUG": "WARN", - "VLLM_LOGGING_LEVEL": "WARN", - "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", - "VLLM_USE_V1": "1", - "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY"), - } - } - - if os.getenv("RAY_record_task_actor_creation_sites"): - runtime_env["env_vars"].update( - { - "RAY_record_task_actor_creation_sites": os.getenv( - "RAY_record_task_actor_creation_sites" - ), - } - ) - if os.getenv("BEST_LOGGER_WEB_SERVICE_URL"): - runtime_env["env_vars"].update( - { - "BEST_LOGGER_WEB_SERVICE_URL": os.getenv("BEST_LOGGER_WEB_SERVICE_URL"), - } - ) + runtime_env = get_runtime_env() print_dict(runtime_env["env_vars"], "runtime_env") ray.init( runtime_env=runtime_env, diff --git a/astune/utils/core_env_vars.py b/astune/utils/core_env_vars.py new file mode 100644 index 00000000..4a6d98ef --- /dev/null +++ b/astune/utils/core_env_vars.py @@ -0,0 +1,42 @@ +import os +from dotenv import load_dotenv +from beast_logger import print_dict + +def get_runtime_env(is_trinity: bool = False) -> dict: + + if os.path.exists(".env"): + load_dotenv(".env") + + runtime_env = { + "env_vars": { + "VLLM_USE_V1": "1", + "NCCL_DEBUG": "WARN", + "VLLM_LOGGING_LEVEL": "WARN", + "TOKENIZERS_PARALLELISM": "true", + "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", + "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), + "ASTUNE_CONFIG_REDIRECT": os.getenv("ASTUNE_CONFIG_REDIRECT", ""), + } + } + if os.getenv("RAY_record_task_actor_creation_sites"): + runtime_env["env_vars"].update( + { + "RAY_record_task_actor_creation_sites": os.getenv( + "RAY_record_task_actor_creation_sites", "" + ), + } + ) + if os.getenv("BEST_LOGGER_WEB_SERVICE_URL"): + runtime_env["env_vars"].update( + { + "BEST_LOGGER_WEB_SERVICE_URL": os.getenv( + "BEST_LOGGER_WEB_SERVICE_URL", "" + ), + } + ) + + if is_trinity: + assert "ASTUNE_CONFIG_REDIRECT" in runtime_env["env_vars"] + + print_dict(runtime_env["env_vars"], "runtime_env") + return runtime_env \ No newline at end of file From a9648a2ab531397977dfd7acffcd2d8b551db946 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 12:30:12 +0800 Subject: [PATCH 200/462] remove not needed files Former-commit-id: 3f84e6dac0c2682a6ea3d3179b16c4e87b33767d --- astune/default_config/astune_default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astune/default_config/astune_default.yaml b/astune/default_config/astune_default.yaml index 4d324e6a..858862ff 100644 --- a/astune/default_config/astune_default.yaml +++ b/astune/default_config/astune_default.yaml @@ -29,7 +29,7 @@ astune: alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - rubrics_auto_grader: + rubrics_auto_grader: # only active when `judge_type: rubrics_auto_grader` # rubrics begin model_name: qwen-max grader_mode: pointwise From f98c621910cf96c02cd525043689b2b7e587c403 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 13:37:44 +0800 Subject: [PATCH 201/462] remove old readme Former-commit-id: 9dc7bda0064ed32c9390da6fa5fa0e6b8e7a1987 --- README.md | 155 -------------------------------------------------- old_readme.md | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 155 deletions(-) create mode 100644 old_readme.md diff --git a/README.md b/README.md index c9187c5c..ddbd8455 100644 --- a/README.md +++ b/README.md @@ -133,158 +133,3 @@ Working in progress: - - -## Get Started (Department) - -本节仅内部沟通使用,后期重写。 - -项目提供一个多功能launcher用于调试和训练,借助launcher,只需要修改一个`--backbone`参数,就选择任意训练框架启动训练 or 调试。 - -1. 使用launcher进行全链路调试(--backbone='debug'):脱离Trinity和Verl,只与Vllm(自动创建)连接,进行调试: - ```bash - # (训练math agent demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) - clear && \ - python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview - - # (训练appworld demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) - clear && \ - python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview - ``` - 备注:当`--backbone=debug`时,程序**不再使用ray**,这意味着您可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置见本文档最后。 - - -2. 使用launcher启动训练: - ```bash - # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) - clear && \ - python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='trinity' - - clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' - ``` - 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension)。此外,也可以使用BeyondAgent后端训练(--backbone='verl'),但目前verl训练后端正在维护中。 - - -## Feature - -- 当程序退出时,给自己发短信 - ```bash - PHONE_NUMBERS="18812341234" python launcher.py ... - ``` - -# 简要架构 - -1. 读取task(对应配置字段 astune.task_reader) - - astune/task_reader/task_reader_base.py - - class::TaskReaderEnvService - - class::TaskReaderJsonl - - class::TaskReaderHuggingFace - -2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - - tutorial/appworld.py - - tutorial/math_agent.py - -3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) - - astune/task_judge/judge_base.py - - astune/task_judge/env_service_as_judge.py - - class::EnvServiceJudge - - astune/task_judge/math_answer_as_judge.py - - class::MathAnswerAsJudge - - class::MathAnswerAndLlmAsJudge - -4. 指定模型(对应配置字段 astune.model.path ) - -5. 配置系统(完善中,先凑合着用一下) - - 默认配置 - - astune/default_config/default.yaml ( 存储verl的默认训练配置,可以被 --conf 指定的 yaml 以同名配置的形式覆盖 ) - - astune/default_config/trinity_default.yaml ( 存储trinity默认配置,但可以被 --conf 指定的 yaml 以 trinity.xxx 的形式覆盖 ) - - 配置自动对齐(定义哪些参数需要自动对齐到verl或者trinity上) - - astune/default_config/config_auto_convertion_verl.json - - astune/default_config/config_auto_convertion_trinity.json - -6. ASTune 和 AgentScope 交互系统 V0.5 - - astune/context_tracker/agentscope.py 负责 - - 处理AgentScope生成的Token - - 缓存judge给出评分需要的各种数据(包括但不限于所有对话message,env_service句柄,从astune.task_reader读取的task metadata等) - - 提供LLM的桥接 - - 负责合并timeline - -# note - -FlashInfer? - -clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' - -clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' - - -- `launche.json` for vscode debugging -```json -{ - - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "program": "launcher.py", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "xxxx/xxxx/xxxx.yaml" - ], - "env": { - } - }, - ] -} -``` - - -# Develop - -
-
-
- 项目架构图 -
- -- [ ] 设计 Judge&Reward 系统 -- [ ] 小财场景 Demo -- [ ] 寻找更通用的 tool -> token 兼容方法 -- [ ] 设计 数据增广 系统 -- [ ] 设计 AgentScopeLearn Protocol V2.0 (以狼人杀为例) -- [ ] 集成 AgentScope Runtime -- [ ] Trinity Display Infer Progress, e.g. token per second -- [ ] Trinity: SFT support -- [ ] AgentScope Studio Intergration -- [ ] AgentScope - - -# Future - -- [x] test server -- [ ] RUBRICS INT -- [-] TEST TOKEN REASON -- [x] TRINITY CONF MAP - -``` -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray -``` - - -``` -source .verlvenv/bin/activate - -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ -python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='verl' - - -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' - - - -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='verl' -``` diff --git a/old_readme.md b/old_readme.md new file mode 100644 index 00000000..1aef6415 --- /dev/null +++ b/old_readme.md @@ -0,0 +1,155 @@ + + +## Get Started (Department) + +本节仅内部沟通使用,后期重写。 + +项目提供一个多功能launcher用于调试和训练,借助launcher,只需要修改一个`--backbone`参数,就选择任意训练框架启动训练 or 调试。 + +1. 使用launcher进行全链路调试(--backbone='debug'):脱离Trinity和Verl,只与Vllm(自动创建)连接,进行调试: + ```bash + # (训练math agent demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) + clear && \ + python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview + + # (训练appworld demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) + clear && \ + python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview + ``` + 备注:当`--backbone=debug`时,程序**不再使用ray**,这意味着您可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置见本文档最后。 + + +2. 使用launcher启动训练: + ```bash + # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) + clear && \ + python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='trinity' + + clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' + ``` + 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension)。此外,也可以使用BeyondAgent后端训练(--backbone='verl'),但目前verl训练后端正在维护中。 + + +## Feature + +- 当程序退出时,给自己发短信 + ```bash + PHONE_NUMBERS="18812341234" python launcher.py ... + ``` + +# 简要架构 + +1. 读取task(对应配置字段 astune.task_reader) + - astune/task_reader/task_reader_base.py + - class::TaskReaderEnvService + - class::TaskReaderJsonl + - class::TaskReaderHuggingFace + +2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) + - tutorial/appworld.py + - tutorial/math_agent.py + +3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) + - astune/task_judge/judge_base.py + - astune/task_judge/env_service_as_judge.py + - class::EnvServiceJudge + - astune/task_judge/math_answer_as_judge.py + - class::MathAnswerAsJudge + - class::MathAnswerAndLlmAsJudge + +4. 指定模型(对应配置字段 astune.model.path ) + +5. 配置系统(完善中,先凑合着用一下) + - 默认配置 + - astune/default_config/default.yaml ( 存储verl的默认训练配置,可以被 --conf 指定的 yaml 以同名配置的形式覆盖 ) + - astune/default_config/trinity_default.yaml ( 存储trinity默认配置,但可以被 --conf 指定的 yaml 以 trinity.xxx 的形式覆盖 ) + - 配置自动对齐(定义哪些参数需要自动对齐到verl或者trinity上) + - astune/default_config/config_auto_convertion_verl.json + - astune/default_config/config_auto_convertion_trinity.json + +6. ASTune 和 AgentScope 交互系统 V0.5 + - astune/context_tracker/agentscope.py 负责 + - 处理AgentScope生成的Token + - 缓存judge给出评分需要的各种数据(包括但不限于所有对话message,env_service句柄,从astune.task_reader读取的task metadata等) + - 提供LLM的桥接 + - 负责合并timeline + +# note + +FlashInfer? + +clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' + +clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' + + +- `launche.json` for vscode debugging +```json +{ + + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "program": "launcher.py", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "xxxx/xxxx/xxxx.yaml" + ], + "env": { + } + }, + ] +} +``` + + +# Develop + +
+
+
+ 项目架构图 +
+ +- [ ] 设计 Judge&Reward 系统 +- [ ] 小财场景 Demo +- [ ] 寻找更通用的 tool -> token 兼容方法 +- [ ] 设计 数据增广 系统 +- [ ] 设计 AgentScopeLearn Protocol V2.0 (以狼人杀为例) +- [ ] 集成 AgentScope Runtime +- [ ] Trinity Display Infer Progress, e.g. token per second +- [ ] Trinity: SFT support +- [ ] AgentScope Studio Intergration +- [ ] AgentScope + + +# Future + +- [x] test server +- [ ] RUBRICS INT +- [-] TEST TOKEN REASON +- [x] TRINITY CONF MAP + +``` +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray +``` + + +``` +source .verlvenv/bin/activate + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ +python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='verl' + + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' + + + +python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='verl' +``` From cdf904dcb0e68cc9d971966bcc7ee17fb0245014 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 14:10:58 +0800 Subject: [PATCH 202/462] set main branch for doc scan Former-commit-id: 7b2e20c686ad22b631e163fd49921a4d43ddf905 --- docs/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build.sh b/docs/build.sh index 6a29f25c..7a59dcbb 100755 --- a/docs/build.sh +++ b/docs/build.sh @@ -2,7 +2,7 @@ # Multiple versions to build # VERSIONS=("preview") -VERSIONS=("feature/unittest-tools") +VERSIONS=("main") OUTPUT_DIR="_build" # ANSI color codes for better display From 205506a3c0cfe796d46964a978f73f9faafa9d10 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 14:29:21 +0800 Subject: [PATCH 203/462] precommit-scan-1 Former-commit-id: 0471fc75e5fe83427c8b3a07c8ccb65340d4ab6e --- README.md | 4 - astune/__init__.py | 2 +- astune/backbone/common_warm_up.py | 13 +- astune/backbone/native_compat_trainer.py | 57 ++-- astune/backbone/trinity_compat_workflow.py | 62 ++-- .../agentscope_tracker/multiagent_tracking.py | 124 ++++--- .../agentscope_tracker/timeline_merging.py | 11 +- astune/context_tracker/basic_tracker.py | 47 +-- astune/context_tracker/tracker_base_attr.py | 15 +- astune/data_generator/data_generator_base.py | 17 +- astune/data_generator/filters/factory.py | 1 - .../filters/llm_evaluate_filter.py | 13 +- .../data_generator/knowledge_augmentation.py | 42 +-- astune/data_generator/task_augmentation.py | 26 +- astune/default_config/trinity/README.md | 2 +- astune/default_config/trinity/README_ZH.md | 2 +- astune/main_trinity.py | 17 +- astune/main_verl.py | 27 +- astune/main_vllm.py | 14 +- astune/schema/document.py | 5 +- astune/schema/extended_msg.py | 71 ++-- astune/schema/task.py | 4 +- astune/schema/trajectory.py | 4 +- astune/task_judge/env_service_as_judge.py | 1 - astune/task_judge/judge_base.py | 2 - astune/task_judge/math_answer_as_judge.py | 9 +- astune/task_judge/rm_auto_grader_judge.py | 170 +++++----- astune/task_reader/__init__.py | 8 +- .../task_reader/document_reader/doc_reader.py | 23 +- .../document_reader/document_reader_base.py | 4 +- astune/task_reader/env_service_reader.py | 8 +- astune/task_reader/hf_dataset_reader.py | 6 +- astune/task_reader/jsonl_reader.py | 6 +- astune/task_reader/task_reader_base.py | 6 +- astune/task_reader/tracing_reader/__init__.py | 12 +- .../task_reader/tracing_reader/connector.py | 26 +- .../tracing_reader/filters/factory.py | 1 - .../filters/llm_evaluate_filter.py | 5 +- .../task_reader/tracing_reader/llm_client.py | 175 ++++++---- astune/task_rollout/async_llm_bridge.py | 84 ++--- astune/task_rollout/dashscope_llm_bridge.py | 5 +- astune/task_rollout/native_parallel_worker.py | 15 +- astune/task_rollout/resource_keeper.py | 37 ++- astune/task_rollout/single_worker.py | 31 +- astune/task_runner/__init__.py | 15 +- astune/task_runner/agentscope_runner.py | 27 +- astune/task_runner/classic_runner.py | 21 +- astune/tuner.py | 26 +- astune/utils/cleaner.py | 8 +- astune/utils/compute_madness.py | 162 +++++++--- astune/utils/config_utils.py | 23 +- astune/utils/core_env_vars.py | 11 +- astune/utils/env_service_client/em_client.py | 4 +- astune/utils/env_service_client/env_client.py | 2 +- .../utils/env_service_client/env_client_ng.py | 9 +- astune/utils/http_client.py | 3 - astune/utils/launch_utils.py | 39 +-- astune/utils/logger.py | 1 - astune/utils/message.py | 4 +- astune/utils/model_merger.py | 1 - astune/utils/process_dataset.py | 7 +- astune/utils/process_manager.py | 10 +- astune/utils/pty.py | 6 +- astune/utils/retry.py | 4 +- astune/utils/robust_dashscope.py | 7 +- astune/utils/smart_daemon.py | 39 ++- astune/utils/testing_utils.py | 21 +- astune/utils/tokenizer.py | 14 +- astune/utils/utils.py | 4 +- astune/workflow.py | 5 +- astune_tests/test_apply_chat_template.py | 0 .../agentscope_for_test.py | 27 +- astune_tests/test_tracing.py | 2 +- astune_tests/test_tracing_reader.py | 8 +- astune_tests/testing_rubrics.py | 34 +- docs/_config.yml | 2 +- docs/_static/custom.css | 2 +- docs/_toc.yml | 2 +- docs/en/concepts.md | 1 - docs/en/convert_workflow.md | 2 +- docs/en/example.md | 2 +- docs/en/introduction.md | 3 - docs/logo.svg | 2 +- docs/zh/concepts.md | 1 - docs/zh/example.md | 2 +- documents/vllm_tokenizer.py | 1 - launcher.py | 30 +- scripts/converter_hf_to_mcore.py | 9 +- scripts/deploy_model.py | 5 +- scripts/download_dataset.py | 1 + scripts/download_model.py | 4 +- scripts/model_merger.py | 1 - setup.py | 2 +- test_launcher.py | 12 +- tests/config_test.py | 8 +- tests/data_gen.py | 21 +- tests/test_tracing_reader.py | 10 +- tutorial/example_appworld/appworld.py | 4 +- tutorial/example_feedback_tracing/README.md | 2 +- .../agent_deployed.py | 11 +- tutorial/example_feedback_tracing/train.py | 24 +- tutorial/example_math_agent/math_agent.py | 7 +- tutorial/example_rm_auto_grader/config.md | 1 - .../rm_auto_grader_example.py | 302 +++++++++--------- tutorial/example_rubrics_judge/math_agent.py | 6 +- tutorial/example_werewolves/game.py | 40 +-- tutorial/example_werewolves/prompt.py | 23 +- tutorial/example_werewolves/start.py | 26 +- .../example_werewolves/structured_model.py | 2 +- tutorial/example_werewolves/utils.py | 5 +- 110 files changed, 1263 insertions(+), 1071 deletions(-) delete mode 100644 astune_tests/test_apply_chat_template.py diff --git a/README.md b/README.md index ddbd8455..7bdcaa04 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,3 @@ Working in progress: - Support training with multiple models - Optimize configurations for long-context adaptation on smaller GPUs - Add LoRA training examples - - - - diff --git a/astune/__init__.py b/astune/__init__.py index bbbd9852..c190b84e 100644 --- a/astune/__init__.py +++ b/astune/__init__.py @@ -1,3 +1,3 @@ +from astune.schema.task import WorkflowOutput, WorkflowTask from astune.tuner import ModelTuner from astune.workflow import Workflow -from astune.schema.task import WorkflowTask, WorkflowOutput diff --git a/astune/backbone/common_warm_up.py b/astune/backbone/common_warm_up.py index 95b0f35f..0891ac30 100644 --- a/astune/backbone/common_warm_up.py +++ b/astune/backbone/common_warm_up.py @@ -1,10 +1,13 @@ -import os import asyncio +import os + def init_parallel_rollout_logger(experiment_name): """Initialize the logger with the given configuration.""" - from beast_logger import register_logger from datetime import datetime + + from beast_logger import register_logger + final_log_path = os.path.join( "launcher_record", experiment_name, @@ -21,7 +24,6 @@ def init_parallel_rollout_logger(experiment_name): ) - def warm_up_process(config): """ Process level warm up @@ -38,17 +40,18 @@ def warm_up_process(config): slightly longer initialization times for certain components in each process. """ - if "PROCESS_LEVEL_WARMUP_INIT" in os.environ: return + if "PROCESS_LEVEL_WARMUP_INIT" in os.environ: + return os.environ["PROCESS_LEVEL_WARMUP_INIT"] = "1" experiment_name = config.astune.experiment_name init_parallel_rollout_logger(experiment_name) warm_up_task_judge_when_needed(config) - def warm_up_task_judge_when_needed(config): if config.astune.task_judge.judge_type == "rubrics_auto_grader": from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + judge = RMAutoGraderJudge(config) asyncio.run(judge.generate_rubrics_from_samples()) asyncio.run(judge.load_rubrics_from_cache()) diff --git a/astune/backbone/native_compat_trainer.py b/astune/backbone/native_compat_trainer.py index cc1fcf61..52d01fad 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astune/backbone/native_compat_trainer.py @@ -15,25 +15,26 @@ import json import os +import time import uuid -import hydra import warnings from collections import defaultdict from copy import deepcopy from dataclasses import dataclass, field from enum import Enum from pprint import pprint -from typing import Optional +from typing import Dict, List, Optional, Type, Union +import hydra import numpy as np -import time import ray import torch +from beast_logger import print_dict, register_logger +from loguru import logger from omegaconf import OmegaConf, open_dict from torch.utils.data import Dataset, Sampler from torchdata.stateful_dataloader import StatefulDataLoader from tqdm import tqdm - from verl import DataProto from verl.experimental.dataset.sampler import AbstractCurriculumSampler from verl.protocol import pad_dataproto_to_divisor, unpad_dataproto @@ -68,17 +69,11 @@ from verl.utils.torch_functional import masked_mean from verl.utils.tracking import ValidationGenerationsLogger - -from astune.task_rollout.native_parallel_worker import ParallelEnvManager +from astune.context_tracker.basic_tracker import BasicContextTracker from astune.schema.task import Task from astune.schema.trajectory import Trajectory +from astune.task_rollout.native_parallel_worker import ParallelEnvManager from astune.utils.message import send_train_message -from beast_logger import register_logger, print_dict -from astune.context_tracker.basic_tracker import BasicContextTracker -import os -import json -from typing import List, Dict, Union, Type -from loguru import logger WorkerType = type[Worker] @@ -729,9 +724,7 @@ def _create_dataloader( if train_sampler is None: train_sampler = create_rl_sampler(self.config.data, self.train_dataset) if collate_fn is None: - from verl.utils.dataset.rl_dataset import ( - collate_fn as default_collate_fn, - ) + from verl.utils.dataset.rl_dataset import collate_fn as default_collate_fn collate_fn = default_collate_fn @@ -1044,9 +1037,9 @@ def init_workers(self): all_wg = {} wg_kwargs = {} # Setting up kwargs for RayWorkerGroup if OmegaConf.select(self.config.trainer, "ray_wait_register_center_timeout") is not None: - wg_kwargs["ray_wait_register_center_timeout"] = ( - self.config.trainer.ray_wait_register_center_timeout - ) + wg_kwargs[ + "ray_wait_register_center_timeout" + ] = self.config.trainer.ray_wait_register_center_timeout if OmegaConf.select(self.config.trainer, "profile_steps") is not None: wg_kwargs["profile_steps"] = OmegaConf.select(self.config.trainer, "profile_steps") assert ( @@ -1086,11 +1079,9 @@ def init_workers(self): # create async rollout manager and request scheduler self.async_rollout_mode = False if self.config.astune.rollout.mode == "async": - from verl.experimental.agent_loop.agent_loop import ( - AsyncLLMServerManager, - ) from verl.experimental.agent_loop.agent_loop import ( AgentLoopManager, + AsyncLLMServerManager, ) self.async_rollout_mode = True @@ -1307,6 +1298,7 @@ def fit(self): """ from omegaconf import OmegaConf from verl.utils.tracking import Tracking + from astune.backbone.common_warm_up import warm_up_process warm_up_process(self.config) @@ -1517,9 +1509,7 @@ def fit(self): if "rollout_log_probs" in batch.batch.keys(): # TODO: we may want to add diff of probs too. - from verl.utils.debug.metrics import ( - calculate_debug_metrics, - ) + from verl.utils.debug.metrics import calculate_debug_metrics metrics.update(calculate_debug_metrics(batch)) @@ -1588,9 +1578,9 @@ def fit(self): if self.config.trainer.critic_warmup <= self.global_steps: # update actor with marked_timer("update_actor", timing_raw, color="red"): - batch.meta_info["multi_turn"] = ( - self.config.astune.rollout.multi_turn.enable - ) + batch.meta_info[ + "multi_turn" + ] = self.config.astune.rollout.multi_turn.enable actor_output = self.actor_rollout_wg.update_actor(batch) actor_output_metrics = reduce_metrics(actor_output.meta_info["metrics"]) metrics.update(actor_output_metrics) @@ -1742,9 +1732,15 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): num_pass_n_tasks += 1 repeated_success_tasks += task_outcomes["tag_arr"].count("success") - num_all_success_scenarios = 0 # 如果一个 scenario 的所有 task 都在 n 次实验中全部 success,则 num_all_success_scenarios +1 - num_pass_n_scenarios = 0 # 如果一个 scenario 的所有 task 都在 n 次实验中至少有一次 success,则 num_pass_n_scenarios +1 - repeated_num_pass_1_scenarios = 0 # 按顺序排列,如果一个 scenario 的所有 task 都在第 x 次实验中 success,则 repeated_num_pass_1_scenarios +1 + num_all_success_scenarios = ( + 0 # 如果一个 scenario 的所有 task 都在 n 次实验中全部 success,则 num_all_success_scenarios +1 + ) + num_pass_n_scenarios = ( + 0 # 如果一个 scenario 的所有 task 都在 n 次实验中至少有一次 success,则 num_pass_n_scenarios +1 + ) + repeated_num_pass_1_scenarios = ( + 0 # 按顺序排列,如果一个 scenario 的所有 task 都在第 x 次实验中 success,则 repeated_num_pass_1_scenarios +1 + ) for scenario in set_scenarios: scenario_task_results = { task_id: task_outcomes @@ -1813,6 +1809,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): def get_eval_dataset(self): from astune.task_reader import TaskReaderRouter + task_reader = TaskReaderRouter(self.config) tasks = task_reader.get_validation_tasks() self.main_val_dataset = tasks diff --git a/astune/backbone/trinity_compat_workflow.py b/astune/backbone/trinity_compat_workflow.py index da845de1..86b51bac 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astune/backbone/trinity_compat_workflow.py @@ -1,43 +1,48 @@ import asyncio import os import uuid -import openai -import datasets +import datasets +import openai from loguru import logger - from trinity.common.experience import Experience from trinity.common.models.model import ModelWrapper -from trinity.common.workflows.workflow import WORKFLOWS, Workflow +from trinity.common.workflows.workflow import WORKFLOWS from trinity.common.workflows.workflow import Task as TrinityTask +from trinity.common.workflows.workflow import Workflow try: - from trinity.buffer.reader import READER - from trinity.buffer.reader.file_reader import FileReader, TaskFileReader, _HFBatchReader from trinity.buffer.buffer_reader import BufferReader + from trinity.buffer.reader import READER + from trinity.buffer.reader.file_reader import ( + FileReader, + TaskFileReader, + _HFBatchReader, + ) from trinity.buffer.reader.reader import READER from trinity.buffer.schema.formatter import FORMATTER from trinity.common.config import StorageConfig + logger.success("[New Trinity] Trinity imports successful.") except ImportError: logger.success("[Old Trinity] Using old trinity.") pass -from typing import List, Literal, Optional, cast +from typing import List, Literal, Optional, Tuple, cast + +from datasets import Dataset, load_dataset from transformers import AutoTokenizer -from astune.task_rollout.native_parallel_worker import DynamicRollout + +from astune.backbone.common_warm_up import warm_up_process +from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracking, +) from astune.schema.trajectory import Sample +from astune.task_rollout.native_parallel_worker import DynamicRollout from astune.utils.config_utils import read_astune_config -from astune.context_tracker.agentscope_tracker.multiagent_tracking import MultiAgentContextTracking -from typing import List, Optional, Tuple -from datasets import Dataset, load_dataset -from astune.backbone.common_warm_up import warm_up_process - - class TrinityCompatWorkflow(DynamicRollout): - def __init__( self, is_eval, @@ -48,7 +53,6 @@ def __init__( llm_mode: Literal["local", "remote", "trinity"] = "trinity", **kwargs, ): - self.is_eval = is_eval self.task = task self.tokenizer = tokenizer @@ -67,6 +71,7 @@ def __init__( def convert_task(self, task: TrinityTask): from astune.schema.task import Task + d = {} for vip_key in ["main_query", "task_id", "env_type", "metadata", "init_messages"]: if vip_key not in task.raw_task: @@ -97,8 +102,6 @@ async def run_in_new_thread(self) -> MultiAgentContextTracking: ) - - @WORKFLOWS.register_module("astune_workflow") class ASTunetWorkflowWrap(Workflow): is_async: bool = True @@ -122,7 +125,6 @@ def __init__( self.answer = task.raw_task.get(task.format_args.response_key) # type: ignore [index] async def run_async(self): - yaml_path = os.environ.get("ASTUNE_CONFIG_REDIRECT", None) if yaml_path is None: raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") @@ -142,7 +144,7 @@ async def run_async(self): except Exception as e: raise e finally: - tracker.generate_log(global_step='NA') + tracker.generate_log(global_step="NA") sample_final += sample_arr exps = [] @@ -211,8 +213,8 @@ async def run_async(self): return exps - try: + @READER.register_module("astune") class AstuneTaskReader(TaskFileReader): def __init__(self, config): @@ -220,21 +222,26 @@ def __init__(self, config): self.read_batch_size = config.batch_size self.split = config.split - yaml_path = os.environ.get('ASTUNE_CONFIG_REDIRECT', None) + yaml_path = os.environ.get("ASTUNE_CONFIG_REDIRECT", None) if yaml_path is None: raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") astune_config = read_astune_config(yaml_path) from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + task_reader = TaskReaderRouter(astune_config) dataset_segments = [] - if 'train' in self.split: + if "train" in self.split: dataset_segments.append(task_to_standard_dataset(task_reader.get_training_tasks())) - if 'val' in self.split: - dataset_segments.append(task_to_standard_dataset(task_reader.get_validation_tasks())) + if "val" in self.split: + dataset_segments.append( + task_to_standard_dataset(task_reader.get_validation_tasks()) + ) if not dataset_segments: - raise ValueError(f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'.") + raise ValueError( + f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'." + ) concatenated_dataset = ( dataset_segments[0] @@ -262,5 +269,6 @@ def read(self, batch_size: Optional[int] = None) -> List: task = self.formatter.format(sample) tasks.append(task) return tasks + except: - pass \ No newline at end of file + pass diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index a4d90bd1..fec09b86 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -1,35 +1,35 @@ import copy -from loguru import logger +import json +from typing import Any, Dict, List, Tuple, Union from agentscope.model import DashScopeChatModel -from astune.schema.trajectory import Reward +from beast_logger import ( + NestedJsonItem, + SeqItem, + print_dict, + print_listofdict, + print_nested, +) +from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer + +from astune.context_tracker.agentscope_tracker.timeline_merging import ( + can_merge_steps, + merge_tracker_timelines, +) from astune.context_tracker.basic_tracker import ( BasicContextTracker, ExtendedMessage, replace_token_ids, ) +from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE +from astune.schema.trajectory import Reward from astune.utils.color_hsl import adjust_color_hsl -from astune.utils.tokenizer import astune_apply_chat_template from astune.utils.compute_madness import compute_string_madness -from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE -from astune.context_tracker.agentscope_tracker.timeline_merging import ( - merge_tracker_timelines, - can_merge_steps, -) +from astune.utils.tokenizer import astune_apply_chat_template -from typing import Any, List, Tuple, Union, Dict -from beast_logger import ( - print_nested, - print_listofdict, - print_dict, - NestedJsonItem, - SeqItem, -) -import json class MultiAgentContextTracking(BasicContextTracker): - def __init__( self, llm_chat_fn, @@ -57,7 +57,8 @@ def step_prepare(self, messages: List[dict], tools: List = []): tools = [] else: # rerank tool parameters to improve compatibility - for i in range(len(tools)): tools[i]['function']['parameters'] = tools[i]['function'].pop('parameters') + for i in range(len(tools)): + tools[i]["function"]["parameters"] = tools[i]["function"].pop("parameters") for i, msg in enumerate(messages): if (disable_toolcalls) and (not isinstance(msg["content"], str)): @@ -86,7 +87,9 @@ def step_prepare(self, messages: List[dict], tools: List = []): str_content = "" msg["content"] = str_content else: - raise ValueError(f"Unsupported non-str message content type: {type(msg['content'])}, Message:\n {msg}") + raise ValueError( + f"Unsupported non-str message content type: {type(msg['content'])}, Message:\n {msg}" + ) if ignore: continue @@ -107,14 +110,18 @@ def step_prepare(self, messages: List[dict], tools: List = []): tools=tools, tool_calls=(msg["tool_calls"] if "tool_calls" in msg else []), token_generator="auto", - first_message=(i==0), + first_message=(i == 0), ) ] # check token overflow converted_message = self.to_role_content(self.full_context) - self.full_context = ExtendedMessage.check_and_merge_chained_tool_response(self.full_context, self.tokenizer) - context_safe, token_overflow, info = self.check_context_token_num_safe(converted_message, tools) + self.full_context = ExtendedMessage.check_and_merge_chained_tool_response( + self.full_context, self.tokenizer + ) + context_safe, token_overflow, info = self.check_context_token_num_safe( + converted_message, tools + ) custom_sampling_params = {} if not context_safe: self.context_overflow = True @@ -140,16 +147,18 @@ def step_track( # dummy response for now err_type = "" - if llm_output.get("tool_calls", []): # is not None, and is not [] + if llm_output.get("tool_calls", []): # is not None, and is not [] tool_calls = llm_output["tool_calls"] - if ("wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist): + if "wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist: # check tool call formating copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False for i in range(len(copy_tool_calls)): - if ('function' in copy_tool_calls[i]) and ('arguments' in copy_tool_calls[i]['function']): + if ("function" in copy_tool_calls[i]) and ( + "arguments" in copy_tool_calls[i]["function"] + ): try: - expect_dict = json.loads(copy_tool_calls[i]['function']['arguments']) + expect_dict = json.loads(copy_tool_calls[i]["function"]["arguments"]) if not isinstance(expect_dict, dict): wrong_toolcall = True err_type = "cannot parse arguments" @@ -160,12 +169,16 @@ def step_track( wrong_toolcall = True err_type = "no function or no arguments" if wrong_toolcall: - logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n") + logger.bind(exception=True).error( + f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n" + ) self.already_mad_flag = True else: logger.success("Toolcall format check passed.") - elif ('' in llm_output["content"]): - logger.bind(exception=True).error(f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n") + elif "" in llm_output["content"]: + logger.bind(exception=True).error( + f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n" + ) self.already_mad_flag = True tool_calls = [] else: @@ -194,11 +207,13 @@ def step_track( # take snapshot of current timeline if context_safe: - if 'prompt_text' in llm_output and 'prompt_token_ids' in llm_output: # currently we make this patch to better compat with Trinity training backend + if ( + "prompt_text" in llm_output and "prompt_token_ids" in llm_output + ): # currently we make this patch to better compat with Trinity training backend self.full_context = self.patch_prompt_tokens( - prompt_text = llm_output['prompt_text'], - prompt_token_ids = llm_output['prompt_token_ids'], - previous_ext_context = self.full_context + prompt_text=llm_output["prompt_text"], + prompt_token_ids=llm_output["prompt_token_ids"], + previous_ext_context=self.full_context, ) self.full_context += [llm_ext_msg] is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) @@ -228,14 +243,13 @@ def patch_prompt_tokens( prompt_token_ids: List[int], previous_ext_context: List[ExtendedMessage], ) -> List[ExtendedMessage]: - # remove tailing if prompt_text.endswith(self.generation_prompt): prompt_text = prompt_text[: -len(self.generation_prompt)] # prompt_token_ids = prompt_token_ids[: -len(self.generation_prompt_token)] - prompt_text_split = prompt_text.split('<|im_start|>') - assert prompt_text_split[0] == '', "Prompt text should start with <|im_start|>" + prompt_text_split = prompt_text.split("<|im_start|>") + assert prompt_text_split[0] == "", "Prompt text should start with <|im_start|>" prompt_text_split = prompt_text_split[1:] # remove the first empty string for i in range(len(prompt_text_split)): prompt_text_split[i] = "<|im_start|>" + prompt_text_split[i] @@ -245,20 +259,28 @@ def patch_prompt_tokens( current_prompt_text += [self.tokenizer.decode(previous_ext_context[j].token_arr)] if len(previous_ext_context) != len(prompt_text_split): - logger.bind(exception=True).error(f"Length mismatch when patching prompt tokens. Previous ext context length: {len(previous_ext_context)}, prompt text split length: {len(prompt_text_split)}. Replacing all tokens.") + logger.bind(exception=True).error( + f"Length mismatch when patching prompt tokens. Previous ext context length: {len(previous_ext_context)}, prompt text split length: {len(prompt_text_split)}. Replacing all tokens." + ) # try to recover tokens for j in range(len(previous_ext_context)): if prompt_text_split[j] != current_prompt_text[j]: - print_dict({ - "expected_prompt_text": prompt_text_split[j], - "current_prompt_text": current_prompt_text[j], - }, mod="exception", header=f"Prompt text mismatch, Please report a github issue") - previous_ext_context[j].token_arr = self.tokenizer(prompt_text_split[j], return_tensors="pt", padding=False) + print_dict( + { + "expected_prompt_text": prompt_text_split[j], + "current_prompt_text": current_prompt_text[j], + }, + mod="exception", + header=f"Prompt text mismatch, Please report a github issue", + ) + previous_ext_context[j].token_arr = self.tokenizer( + prompt_text_split[j], return_tensors="pt", padding=False + ) # remove extra messages if len(previous_ext_context) != len(prompt_text_split): - previous_ext_context = previous_ext_context[:len(prompt_text_split)] + previous_ext_context = previous_ext_context[: len(prompt_text_split)] return previous_ext_context @@ -391,7 +413,7 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], conversation=dict_messages, tools=tools, add_generation_prompt=True, - tokenize=False + tokenize=False, ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore max_response_length = self.config.astune.rollout.max_response_length_in_one_turn @@ -404,13 +426,15 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], ret = [False, length] return tuple(ret) - def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, bool, str]: + def check_context_token_num_safe( + self, messages: List, tools: List = [] + ) -> Tuple[bool, bool, str]: prompt_text = astune_apply_chat_template( tokenizer=self.tokenizer, conversation=messages, tools=tools, add_generation_prompt=True, - tokenize=False + tokenize=False, ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore max_response_length = self.config.astune.rollout.max_response_length_in_one_turn @@ -425,7 +449,11 @@ def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tupl elif self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: ret = [False, token_overflow, "already_mad"] elif length < max_seq_length: - ret = [True, token_overflow, f"safe[{length} < {max_model_len} - {max_response_length}]"] + ret = [ + True, + token_overflow, + f"safe[{length} < {max_model_len} - {max_response_length}]", + ] else: ret = [False, token_overflow, "token_overflow"] return tuple(ret) diff --git a/astune/context_tracker/agentscope_tracker/timeline_merging.py b/astune/context_tracker/agentscope_tracker/timeline_merging.py index 4f619405..cf9936c1 100644 --- a/astune/context_tracker/agentscope_tracker/timeline_merging.py +++ b/astune/context_tracker/agentscope_tracker/timeline_merging.py @@ -1,15 +1,12 @@ from typing import List, Type + +from beast_logger import NestedJsonItem, SeqItem, print_listofdict, print_nested + from astune.context_tracker.basic_tracker import ( BasicContextTracker, ExtendedMessage, replace_token_ids, ) -from beast_logger import ( - print_nested, - print_listofdict, - NestedJsonItem, - SeqItem, -) def can_merge_steps( @@ -17,7 +14,6 @@ def can_merge_steps( target_timeline: List[ExtendedMessage], debug=False, ) -> bool: - can_merge = False compare_level = "text" # relaxed compare with text, more easier to match, at very little cost if len(source_timeline) >= len(target_timeline): @@ -67,7 +63,6 @@ def can_merge_steps( def merge_tracker_timelines( timelines: List[List[ExtendedMessage]], ) -> List[List[ExtendedMessage]]: - def toggle_author( source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage], diff --git a/astune/context_tracker/basic_tracker.py b/astune/context_tracker/basic_tracker.py index 469ff5cb..80484558 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astune/context_tracker/basic_tracker.py @@ -1,22 +1,26 @@ -import torch import copy -from loguru import logger from collections import defaultdict -from typing import List, Union, Tuple, Optional -from astune.schema.trajectory import Sample, Reward -from astune.utils.compute_madness import compute_string_madness -from astune.utils.tokenizer import astune_apply_chat_template -from astune.context_tracker.tracker_base_attr import TrackerAttr -from astune.context_tracker.tracker_base_attr import ExtendedMessage -from astune.context_tracker.tracker_base_attr import replace_token_ids +from typing import List, Optional, Tuple, Union + +import torch from beast_logger import ( - register_logger, + NestedJsonItem, + SeqItem, print_dict, print_listofdict, print_nested, - NestedJsonItem, - SeqItem, + register_logger, ) +from loguru import logger + +from astune.context_tracker.tracker_base_attr import ( + ExtendedMessage, + TrackerAttr, + replace_token_ids, +) +from astune.schema.trajectory import Reward, Sample +from astune.utils.compute_madness import compute_string_madness +from astune.utils.tokenizer import astune_apply_chat_template class BasicContextTracker(TrackerAttr): @@ -38,7 +42,6 @@ def __init__(self, config, tokenizer, **kwargs): super().__init__(config, tokenizer, **kwargs) self.generation_prompt_token = self.get_generation_prompt_token() - def prepare_previous_context(self, mod="future"): """ Prepare the input context for future LLM call. @@ -91,7 +94,7 @@ def get_seq_length(messages): self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0] ) - token_overflow = (get_seq_length(messages) >= self.max_seq_length) + token_overflow = get_seq_length(messages) >= self.max_seq_length if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: return False, token_overflow, "already_mad" messages = self.prepare_previous_context(mod="raw") @@ -254,7 +257,6 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= def get_token_inc_from_vllm_response( self, input_msg_ref, llm_output, tools: List[dict] = [] ) -> Tuple[List[int], List[int]]: - llm_output_role_content = { "role": llm_output["role"], "content": llm_output["content"], @@ -267,12 +269,16 @@ def get_token_inc_from_vllm_response( astune_apply_chat_template( tokenizer=self.tokenizer, conversation=input_msg_ref, - tokenize=False, tools=tools, add_generation_prompt=False + tokenize=False, + tools=tools, + add_generation_prompt=False, ), astune_apply_chat_template( tokenizer=self.tokenizer, conversation=input_msg_ref + [llm_output_role_content], - tokenize=False, tools=tools, add_generation_prompt=False + tokenize=False, + tools=tools, + add_generation_prompt=False, ), ) vllm_output_raw_token = [t.token_id for t in llm_output["tokens"]] @@ -316,9 +322,9 @@ def save_env_output( if ("content" not in env_output) and ("error" in env_output): env_output["content"] = f"[Error from environment: {env_output['error']}]" elif ("content" not in env_output) or (not env_output["content"]): - env_output["content"] = ( - "Warning: the environment does not provide any feedback, please provide valid inpu and try again." - ) + env_output[ + "content" + ] = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." if add_nothink: env_output["content"] += " /no_think" ext_msg = ExtendedMessage( @@ -731,7 +737,6 @@ def compute_reference_advantage(cmt_array: List): return - def get_generation_prompt_token(self): dummy_msg = [{"role": "assistant", "content": "dummy text"}] self.generation_prompt_token, _ = self.get_inc( diff --git a/astune/context_tracker/tracker_base_attr.py b/astune/context_tracker/tracker_base_attr.py index da607452..0503bbbc 100644 --- a/astune/context_tracker/tracker_base_attr.py +++ b/astune/context_tracker/tracker_base_attr.py @@ -1,10 +1,14 @@ -from typing import List, Union, Tuple +from typing import List, Tuple, Union + +from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from astune.schema.extended_msg import ExtendedMessage -from astune.schema.extended_msg import find_sublist_indices -from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE + +from astune.schema.extended_msg import ( + INVALID_LOG_PROB_VALUE, + ExtendedMessage, + find_sublist_indices, +) from astune.schema.trajectory import Reward -from loguru import logger def replace_token_ids( @@ -30,7 +34,6 @@ def replace_token_ids( class TrackerAttr(object): - def __init__(self, config, tokenizer, **kwargs): self.task_batch_index = kwargs.get("task_batch_index", "undefined") self.task_tag = kwargs.get("task_tag", "undefined") diff --git a/astune/data_generator/data_generator_base.py b/astune/data_generator/data_generator_base.py index 6dd8c673..08878286 100644 --- a/astune/data_generator/data_generator_base.py +++ b/astune/data_generator/data_generator_base.py @@ -1,8 +1,10 @@ -from typing import List, Optional, Dict, Any, Union -from astune.schema.task import Task +from typing import Any, Dict, List, Optional, Union + from astune.schema.document import Document +from astune.schema.task import Task from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn + class DataGeneratorBase: def __init__(self, config): """ @@ -15,7 +17,7 @@ def __init__(self, config): self.sampling_params = self.config.astune.data_generator.sampling_params or {} self.llm_client = construct_alien_llm_chat_fn( alien_llm_model=self.config.astune.data_generator.llm_model, - alien_llm_response_length=self.config.astune.data_generator.llm_response_length + alien_llm_response_length=self.config.astune.data_generator.llm_response_length, ) def generate_task( @@ -45,13 +47,12 @@ def generate_task( # Call the new LLM client # Returns: {"role": "assistant", "content": "..."} - response = self.llm_client( - messages=messages, - sampling_params_override=self.sampling_params - ) + response = self.llm_client(messages=messages, sampling_params_override=self.sampling_params) # Extract content from response raw_response = response.get("content", "") - new_task = self._parse_llm_output_to_task(raw_response, source_task, document, extra_metadata) + new_task = self._parse_llm_output_to_task( + raw_response, source_task, document, extra_metadata + ) return new_task def _build_system_prompt( diff --git a/astune/data_generator/filters/factory.py b/astune/data_generator/filters/factory.py index 9c772d2b..ccb0211a 100644 --- a/astune/data_generator/filters/factory.py +++ b/astune/data_generator/filters/factory.py @@ -5,7 +5,6 @@ from .base import Filter from .llm_evaluate_filter import LlmEvaluateFilter - FILTER_REGISTRY: Dict[str, type[Filter]] = { "llm_evaluate": LlmEvaluateFilter, } diff --git a/astune/data_generator/filters/llm_evaluate_filter.py b/astune/data_generator/filters/llm_evaluate_filter.py index cc736f09..aae45ccb 100644 --- a/astune/data_generator/filters/llm_evaluate_filter.py +++ b/astune/data_generator/filters/llm_evaluate_filter.py @@ -1,16 +1,13 @@ -from typing import Iterable, List from concurrent.futures import ThreadPoolExecutor, as_completed +from typing import Iterable, List from tqdm import tqdm from astune.schema.task import Task -from astune.task_rollout.dashscope_llm_bridge import ( - construct_alien_llm_chat_fn, -) - +from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn from astune.utils.fn import Fn -from .base import Filter +from .base import Filter EVALUATE_PROMPT = """You are now acting as a **strict QA quality reviewer**. You will be given a data sample containing a “query” (user question/task) and an “answer” (assistant reply). Evaluate it **only based on the text itself**, without inventing facts or performing external retrieval. @@ -97,9 +94,7 @@ def _evaluate(task: Task) -> dict: return res with ThreadPoolExecutor(max_workers=max_workers) as executor: - future_to_task = { - executor.submit(_evaluate, task): task for task in tasks_list - } + future_to_task = {executor.submit(_evaluate, task): task for task in tasks_list} for future in as_completed(future_to_task): task = future_to_task[future] res = future.result() diff --git a/astune/data_generator/knowledge_augmentation.py b/astune/data_generator/knowledge_augmentation.py index 6500a3d3..aec69175 100644 --- a/astune/data_generator/knowledge_augmentation.py +++ b/astune/data_generator/knowledge_augmentation.py @@ -1,14 +1,18 @@ -import json, re -from typing import Optional, Dict, Any, List -from astune.schema.task import Task -from astune.schema.document import Document +import json +import re +from typing import Any, Dict, List, Optional + from astune.data_generator.data_generator_base import DataGeneratorBase +from astune.schema.document import Document +from astune.schema.task import Task + class KnowledgeAugmentor(DataGeneratorBase): """ Knowledge Augmentation: - Generate new tasks from Document """ + def _build_system_prompt( self, source_task: Optional[Task] = None, @@ -31,30 +35,37 @@ def _build_system_prompt( "8. Non-repetition: Ensure no two questions are duplicates or paraphrases of the same idea. If content overlaps, merge rather than replicate.\n" "Always strictly follow these rules in every output." ) - + def _build_user_prompt( self, source_task: Optional[Task] = None, document: Optional[Document] = None, ) -> str: - if document is None or not document.content: raise ValueError("KnowledgeAugmentor requires a document for reference.") - + ref_doc = document.content user_part = [] N = self.config.astune.data_generator.knowledge_augmentor.n - user_part.append(f"Generate exactly {N} unique, high-quality questions from the following document according to the rules in the system prompt above.") - user_part.append(f"For each question, provide the corresponding reference excerpt from the document in the `related_doc` field.") + user_part.append( + f"Generate exactly {N} unique, high-quality questions from the following document according to the rules in the system prompt above." + ) + user_part.append( + f"For each question, provide the corresponding reference excerpt from the document in the `related_doc` field." + ) user_part.append(f"[DOCUMENT START]") user_part.append(ref_doc) user_part.append(f"[DOCUMENT END]") user_part.append(f"Now generate queries that is suitable for the JSON format.") user_part.append(f"Return your output strictly in JSON format as follows:") user_part.append(f"[") - user_part.append(" {\"query\": \"Question text here?\", \"related_doc\": \"Direct excerpt from the document here.\"},") - user_part.append(" {\"query\": \"Question text here?\", \"related_doc\": \"Direct excerpt from the document here.\"},") + user_part.append( + ' {"query": "Question text here?", "related_doc": "Direct excerpt from the document here."},' + ) + user_part.append( + ' {"query": "Question text here?", "related_doc": "Direct excerpt from the document here."},' + ) user_part.append(f"]") return "\n".join(user_part) @@ -84,7 +95,6 @@ def _parse_llm_output_to_task( # data: List[Dict[str, str]] all_generated_tasks = [] for task in data: - # Extract the generated query from parsed JSON new_query = task.get("query", "").strip() if not new_query: @@ -101,7 +111,7 @@ def _parse_llm_output_to_task( new_task = Task( main_query=new_query, init_messages=[], - task_id="", # Will be assigned by the system later + task_id="", # Will be assigned by the system later env_type=source_task.env_type if source_task else "no_env", metadata=new_metadata, ) @@ -113,9 +123,5 @@ def _parse_json_response(self, response: str) -> Optional[Dict[str, Any]]: Parse LLM response string into JSON. """ # Remove Markdown code block markers (```json and ```) if present - response = re.sub(r'^```json|```$', '', response, flags=re.MULTILINE).strip() + response = re.sub(r"^```json|```$", "", response, flags=re.MULTILINE).strip() return json.loads(response) - - - - \ No newline at end of file diff --git a/astune/data_generator/task_augmentation.py b/astune/data_generator/task_augmentation.py index ed9b5095..b301022d 100644 --- a/astune/data_generator/task_augmentation.py +++ b/astune/data_generator/task_augmentation.py @@ -1,9 +1,11 @@ -import re import json -from typing import Optional, Dict, Any, Union -from astune.schema.task import Task -from astune.schema.document import Document +import re +from typing import Any, Dict, Optional, Union + from astune.data_generator.data_generator_base import DataGeneratorBase +from astune.schema.document import Document +from astune.schema.task import Task + class TaskAugmentor(DataGeneratorBase): """ @@ -49,13 +51,12 @@ def _build_system_prompt( "- Avoid adding explanations or commentary,\n" "- Output ONLY a valid JSON object with a single field 'query'.\n" "\n" - 'Example output format:\n' + "Example output format:\n" '{"query": ""}\n' ) return base_prompt + document_instructions + output_requirements - def _build_user_prompt( self, source_task: Optional[Task], @@ -71,10 +72,7 @@ def _build_user_prompt( original_query = source_task.main_query # Build the reference part (query + optional document) - reference_info = ( - "Reference information:\n" - f"[Query]: {original_query}\n" - ) + reference_info = "Reference information:\n" f"[Query]: {original_query}\n" # Add document content if provided doc_part = "" @@ -103,7 +101,6 @@ def _build_user_prompt( return user_prompt - def _parse_llm_output_to_task( self, raw_response: Any, @@ -145,19 +142,18 @@ def _parse_llm_output_to_task( new_task = Task( main_query=new_query, init_messages=[], - task_id="", # Will be assigned by the system later + task_id="", # Will be assigned by the system later env_type=source_task.env_type if source_task else "no_env", metadata=new_metadata, ) return new_task - def _parse_json_response(self, response: str) -> Union[dict, list, str, float, int, bool, None]: """ Parse LLM response string into JSON. """ # Remove Markdown code block markers (```json and ```) if present - response = re.sub(r'^```json|```$', '', response, flags=re.MULTILINE).strip() + response = re.sub(r"^```json|```$", "", response, flags=re.MULTILINE).strip() from agentscope._utils._common import _json_loads_with_repair - return _json_loads_with_repair(response) + return _json_loads_with_repair(response) diff --git a/astune/default_config/trinity/README.md b/astune/default_config/trinity/README.md index 4463006c..7a64e21a 100644 --- a/astune/default_config/trinity/README.md +++ b/astune/default_config/trinity/README.md @@ -60,4 +60,4 @@ meanwhile Same as VERL, control training memory with the following parameters: - `trainer.max_token_len_per_gpu` -- `ulysses_sequence_parallel_size` \ No newline at end of file +- `ulysses_sequence_parallel_size` diff --git a/astune/default_config/trinity/README_ZH.md b/astune/default_config/trinity/README_ZH.md index 18decf5f..5c15164e 100644 --- a/astune/default_config/trinity/README_ZH.md +++ b/astune/default_config/trinity/README_ZH.md @@ -61,4 +61,4 @@ Trinity 采用典型的生产者(探索器)-消费者(训练器)架构 与 VERL 相同,通过以下参数控制训练显存: - `trainer.max_token_len_per_gpu` -- `ulysses_sequence_parallel_size` \ No newline at end of file +- `ulysses_sequence_parallel_size` diff --git a/astune/main_trinity.py b/astune/main_trinity.py index c7640f75..da820ce3 100644 --- a/astune/main_trinity.py +++ b/astune/main_trinity.py @@ -4,31 +4,28 @@ import argparse import asyncio +import atexit import os import sys import traceback -import ray -import atexit from pathlib import Path from pprint import pprint -from astune.utils.sms_agent import send_train_message -from astune.utils.core_env_vars import get_runtime_env + +import ray from trinity.buffer.pipelines.task_pipeline import check_and_run_task_pipeline from trinity.common.config import Config, load_config from trinity.common.constants import DEBUG_NAMESPACE, PLUGIN_DIRS_ENV_VAR from trinity.explorer.explorer import Explorer from trinity.manager.state_manager import StateManager from trinity.trainer.trainer import Trainer -from trinity.utils.dlc_utils import ( - is_running, - setup_ray_cluster, - stop_ray_cluster, -) +from trinity.utils.dlc_utils import is_running, setup_ray_cluster, stop_ray_cluster from trinity.utils.log import get_logger from trinity.utils.plugin_loader import load_plugins # register trinity backbone modules import astune.backbone.trinity_compat_workflow # noqa: F401 +from astune.utils.core_env_vars import get_runtime_env +from astune.utils.sms_agent import send_train_message logger = get_logger(__name__) @@ -177,9 +174,9 @@ def run_stage(config: Config) -> None: def run(config_path: str, dlc: bool = False, plugin_dir: str = None): - if os.path.exists(".env"): from dotenv import load_dotenv + load_dotenv(".env") atexit.register(lambda: send_train_message("0000")) diff --git a/astune/main_verl.py b/astune/main_verl.py index 65a4441c..d92e46f9 100644 --- a/astune/main_verl.py +++ b/astune/main_verl.py @@ -15,13 +15,13 @@ Note that we don't combine the main with ray_trainer as ray_trainer is used by other main. """ +import atexit import os import socket + import hydra import ray -import atexit -from astune.utils.sms_agent import send_train_message -from astune.utils.core_env_vars import get_runtime_env +from beast_logger import print_dict, register_logger from omegaconf import OmegaConf from verl.experimental.dataset.sampler import AbstractSampler from verl.trainer.constants_ppo import get_ppo_ray_runtime_env @@ -29,7 +29,9 @@ from verl.trainer.ppo.reward import load_reward_manager from verl.utils.device import is_cuda_available from verl.utils.import_utils import load_extern_type -from beast_logger import register_logger, print_dict + +from astune.utils.core_env_vars import get_runtime_env +from astune.utils.sms_agent import send_train_message @hydra.main(config_path="config", config_name="ppo_trainer", version_base=None) @@ -111,7 +113,6 @@ def run(self, config): from pprint import pprint from omegaconf import OmegaConf - from verl.utils.fs import copy_to_local print(f"TaskRunner hostname: {socket.gethostname()}, PID: {os.getpid()}") @@ -164,9 +165,7 @@ def run(self, config): elif config.actor_rollout_ref.actor.strategy == "megatron": assert config.actor_rollout_ref.actor.strategy == config.critic.strategy - from verl.single_controller.ray.megatron import ( - NVMegatronRayWorkerGroup, - ) + from verl.single_controller.ray.megatron import NVMegatronRayWorkerGroup from verl.workers.megatron_workers import ( ActorRolloutRefWorker, AsyncActorRolloutRefWorker, @@ -183,10 +182,7 @@ def run(self, config): else: raise NotImplementedError - from astune.backbone.native_compat_trainer import ( - ResourcePoolManager, - Role, - ) + from astune.backbone.native_compat_trainer import ResourcePoolManager, Role # Map roles to their corresponding remote worker classes. role_worker_mapping = { @@ -244,13 +240,10 @@ def run(self, config): ) from verl.utils.dataset.rl_dataset import collate_fn - from astune.utils.process_dataset import create_rl_sampler # Create training and validation datasets. - from astune.task_reader import ( - TaskReaderRouter, - task_to_standard_dataset, - ) + from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + from astune.utils.process_dataset import create_rl_sampler task_reader = TaskReaderRouter(config) val_dataset = task_to_standard_dataset(task_reader.get_validation_tasks()) diff --git a/astune/main_vllm.py b/astune/main_vllm.py index 1c254a80..cc2bd5b0 100644 --- a/astune/main_vllm.py +++ b/astune/main_vllm.py @@ -1,14 +1,16 @@ +import atexit import os import sys +from types import SimpleNamespace + import hydra -import atexit +from beast_logger import register_logger from openai import OpenAI -from types import SimpleNamespace + +from astune.backbone.common_warm_up import warm_up_process from astune.schema.task import Task -from beast_logger import register_logger from astune.task_rollout.native_parallel_worker import ParallelEnvManager from astune.utils.sms_agent import send_train_message -from astune.backbone.common_warm_up import warm_up_process class TokenAndProb: @@ -23,7 +25,6 @@ def __init__(self, t): class ChatCompletionScheduler: - def __init__(self, url, config): from transformers import AutoTokenizer @@ -126,9 +127,10 @@ def main(config): print("*" * 20) def companion_launch(): - from astune.utils.smart_daemon import LaunchCommandWhenAbsent import torch + from astune.utils.smart_daemon import LaunchCommandWhenAbsent + print("Launching companion process for async LLM server...") model_path = config.astune.model.path tensor_parallel_size = config.astune.debug.debug_tensor_parallel_size diff --git a/astune/schema/document.py b/astune/schema/document.py index 2be38214..3178804e 100644 --- a/astune/schema/document.py +++ b/astune/schema/document.py @@ -1,8 +1,9 @@ +from typing import Any, Dict, List + from pydantic import BaseModel, Field -from typing import List, Dict, Any class Document(BaseModel): doc_id: str = Field(default="") content: str = Field(default="") - metadata: dict = Field(default_factory=dict) \ No newline at end of file + metadata: dict = Field(default_factory=dict) diff --git a/astune/schema/extended_msg.py b/astune/schema/extended_msg.py index 0d40d259..a3e3e30f 100644 --- a/astune/schema/extended_msg.py +++ b/astune/schema/extended_msg.py @@ -1,9 +1,11 @@ -from typing import List, Union, Tuple +import uuid +from typing import List, Tuple, Union + +from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from astune.utils.tokenizer import astune_apply_chat_template + from astune.schema.trajectory import Reward -from loguru import logger -import uuid +from astune.utils.tokenizer import astune_apply_chat_template INVALID_LOG_PROB_VALUE = 0.0 NEED_TRAIN_AUTHORS = ["llm"] @@ -16,6 +18,7 @@ ] DUMMY_MSG = [{"role": "assistant", "content": "dummy text"}] + def find_sublist_indices(large_list, small_list, reverse=False): small_len = len(small_list) if reverse: @@ -29,7 +32,6 @@ def find_sublist_indices(large_list, small_list, reverse=False): class ExtendedMessage: - def __init__( self, author, @@ -81,12 +83,13 @@ def __init__( tools=tools, ) - def auto_tokenize(self, tokenizer, tools): if (not self.first_message) and (self.role == "system"): raise ValueError("The system message is usually the first message, check program bugs.") elif (self.first_message) and (self.role != "system"): - raise ValueError("The first message is supposed to be the system message, check program bugs, or remove this warning.") + raise ValueError( + "The first message is supposed to be the system message, check program bugs, or remove this warning." + ) if not self.first_message: self.token_arr = self.auto_tokenize_non_first_message(tokenizer=tokenizer, tools=tools) else: @@ -104,7 +107,6 @@ def auto_tokenize(self, tokenizer, tools): ) return self.token_arr - def auto_tokenize_non_first_message(self, tokenizer, tools): try: # completion_token_arr will contain generation_prompt header @@ -208,9 +210,7 @@ def get_inc_simple(self, text_frag_from, text_frag_to, tokenizer): tokenizer_output = tokenizer(text_frag_to, return_tensors="pt", padding=False) input_ids = tokenizer_output["input_ids"][0].tolist() # get the new tokens added in this step - input_id_increment = input_ids[ - len(token_ids_acc) : - ] + input_id_increment = input_ids[len(token_ids_acc) :] FN_DEBUG = False if FN_DEBUG: overlap_length = 0 @@ -224,11 +224,9 @@ def get_inc_simple(self, text_frag_from, text_frag_to, tokenizer): msg = "" return input_id_increment, msg - @staticmethod def check_and_merge_chained_tool_response( - ext_msg_array: List["ExtendedMessage"], - tokenizer: PreTrainedTokenizer + ext_msg_array: List["ExtendedMessage"], tokenizer: PreTrainedTokenizer ) -> List["ExtendedMessage"]: """ Inside a list of ExtendedMessage, @@ -252,26 +250,49 @@ def check_and_merge_chained_tool_response( {%- endif %} {%- endif %} """ + def merge_tool_group(group, tokenizer): if len(group) == 1: return group[0] msg0 = group[0] - merged_content = "".join(f"\n{msg.content}\n\n" for msg in group) - merged_content = merged_content[len("\n"):] - merged_content = merged_content[:-len("\n")] + merged_content = "".join( + f"\n{msg.content}\n\n" for msg in group + ) + merged_content = merged_content[len("\n") :] + merged_content = merged_content[: -len("\n")] merged = ExtendedMessage( - author=msg0.author, role=msg0.role, content=merged_content, - tokenizer=tokenizer, token_generator="manual", build_from_uuid=msg0.uuid, - tools=msg0.tools, tool_calls=msg0.tool_calls, token_logprob_arr=msg0.token_logprob_arr, - first_message=msg0.first_message + author=msg0.author, + role=msg0.role, + content=merged_content, + tokenizer=tokenizer, + token_generator="manual", + build_from_uuid=msg0.uuid, + tools=msg0.tools, + tool_calls=msg0.tool_calls, + token_logprob_arr=msg0.token_logprob_arr, + first_message=msg0.first_message, ) # re-compute token_arr - auto_tokenize_targets = [{"role": msg.role, "content": msg.content_for_future} for msg in group] + auto_tokenize_targets = [ + {"role": msg.role, "content": msg.content_for_future} for msg in group + ] merged.token_arr, _ = merged.get_inc_simple( - text_frag_from=astune_apply_chat_template(tokenizer=tokenizer, conversation=DUMMY_MSG, tokenize=False, tools=merged.tools, add_generation_prompt=False), - text_frag_to=astune_apply_chat_template(tokenizer, conversation=DUMMY_MSG + auto_tokenize_targets, tokenize=False, tools=merged.tools, add_generation_prompt=False), - tokenizer=tokenizer + text_frag_from=astune_apply_chat_template( + tokenizer=tokenizer, + conversation=DUMMY_MSG, + tokenize=False, + tools=merged.tools, + add_generation_prompt=False, + ), + text_frag_to=astune_apply_chat_template( + tokenizer, + conversation=DUMMY_MSG + auto_tokenize_targets, + tokenize=False, + tools=merged.tools, + add_generation_prompt=False, + ), + tokenizer=tokenizer, ) return merged diff --git a/astune/schema/task.py b/astune/schema/task.py index 3e6f85a5..3156fbaa 100644 --- a/astune/schema/task.py +++ b/astune/schema/task.py @@ -1,6 +1,6 @@ -from pydantic import BaseModel, Field -from typing import List, Dict, Any, Union +from typing import Any, Dict, List, Union +from pydantic import BaseModel, Field """ The basic schema for task_reader module diff --git a/astune/schema/trajectory.py b/astune/schema/trajectory.py index d5b0d7ef..1a636cdd 100644 --- a/astune/schema/trajectory.py +++ b/astune/schema/trajectory.py @@ -1,5 +1,6 @@ -import numpy as np from typing import Any, Dict, List, Union + +import numpy as np from pydantic import BaseModel, Field @@ -107,7 +108,6 @@ def __init__(self, cmt_tokenized: dict, messages, config, **kwargs): assert len(self.response_ids) != 0, "response_ids should not be empty" def truncate_output_ids(self) -> None: - assert ( len(self.input_ids) == len(self.attention_mask) diff --git a/astune/task_judge/env_service_as_judge.py b/astune/task_judge/env_service_as_judge.py index e99b682f..88e43919 100644 --- a/astune/task_judge/env_service_as_judge.py +++ b/astune/task_judge/env_service_as_judge.py @@ -3,7 +3,6 @@ class EnvServiceJudge(JudgeBase): - def __init__(self, config): self.config = config diff --git a/astune/task_judge/judge_base.py b/astune/task_judge/judge_base.py index 05114a48..439106db 100644 --- a/astune/task_judge/judge_base.py +++ b/astune/task_judge/judge_base.py @@ -2,10 +2,8 @@ class JudgeBase: - def __init__(self, config): self.config = config def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: - raise NotImplementedError diff --git a/astune/task_judge/math_answer_as_judge.py b/astune/task_judge/math_answer_as_judge.py index 4f7327f4..2e82d4ea 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astune/task_judge/math_answer_as_judge.py @@ -1,13 +1,11 @@ import re -from astune.workflow import WorkflowOutput, WorkflowTask + from astune.task_judge.judge_base import JudgeBase -from astune.task_rollout.dashscope_llm_bridge import ( - construct_alien_llm_chat_fn, -) +from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn +from astune.workflow import WorkflowOutput, WorkflowTask class MathAnswerAsJudge(JudgeBase): - def __init__(self, config): self.config = config @@ -32,7 +30,6 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO class MathAnswerAndLlmAsJudge(JudgeBase): - def __init__(self, config): self.config = config diff --git a/astune/task_judge/rm_auto_grader_judge.py b/astune/task_judge/rm_auto_grader_judge.py index de16ef8e..27fb3b04 100644 --- a/astune/task_judge/rm_auto_grader_judge.py +++ b/astune/task_judge/rm_auto_grader_judge.py @@ -13,23 +13,25 @@ """ import asyncio -import os import json +import os +from typing import Any, Dict, List, Optional -from typing import List, Optional, Dict, Any -from loguru import logger from beast_logger import print_dict - -from astune.schema.task import Task, WorkflowOutput -from astune.task_judge.judge_base import JudgeBase - +from loguru import logger from rm_gallery.core.grader.auto.auto_grader import AutoGrader, AutoGraderConfig -from rm_gallery.core.grader.auto.auto_rubrics import AutoRubricsConfig, SamplingMode, AggregationMode -from rm_gallery.core.grader.base import GraderMode, LLMGrader +from rm_gallery.core.grader.auto.auto_rubrics import ( + AggregationMode, + AutoRubricsConfig, + SamplingMode, +) +from rm_gallery.core.grader.base import GraderMode, LLMGrader, aevaluate_with_cases from rm_gallery.core.model.openai_llm import OpenAIChatModel from rm_gallery.core.schema.data import EvalCase from rm_gallery.core.schema.template import LanguageEnum -from rm_gallery.core.grader.base import aevaluate_with_cases + +from astune.schema.task import Task, WorkflowOutput +from astune.task_judge.judge_base import JudgeBase class RMAutoGraderJudge(JudgeBase): @@ -85,16 +87,26 @@ def __init__(self, config): self.grader_config = self._parse_config() # Initialize the model - self.model = OpenAIChatModel(model=config.astune.task_judge.rubrics_auto_grader.model_name, base_url='https://dashscope.aliyuncs.com/compatible-mode/v1', stream=False) + self.model = OpenAIChatModel( + model=config.astune.task_judge.rubrics_auto_grader.model_name, + base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", + stream=False, + ) # Storage for generated grader self.llm_grader: Optional[LLMGrader] = None self.rubrics_generated = False # Field mappings for data extraction - self.query_field = getattr(config.astune.task_judge.rubrics_auto_grader, 'query_field', 'main_query') - self.answer_field = getattr(config.astune.task_judge.rubrics_auto_grader, 'answer_field', 'final_answer') - self.reference_field = getattr(config.astune.task_judge.rubrics_auto_grader, 'reference_field', 'answer') + self.query_field = getattr( + config.astune.task_judge.rubrics_auto_grader, "query_field", "main_query" + ) + self.answer_field = getattr( + config.astune.task_judge.rubrics_auto_grader, "answer_field", "final_answer" + ) + self.reference_field = getattr( + config.astune.task_judge.rubrics_auto_grader, "reference_field", "answer" + ) logger.info( f"RMAutoGraderJudge initialized with mode={self.grader_config.method_config.grader_mode.value}, " @@ -106,33 +118,43 @@ def _parse_config(self) -> AutoGraderConfig: judge_config = self.config.astune.task_judge.rubrics_auto_grader # Parse grader mode - grader_mode_str = getattr(judge_config, 'grader_mode', 'pointwise').lower() - grader_mode = GraderMode.POINTWISE if grader_mode_str == 'pointwise' else GraderMode.LISTWISE + grader_mode_str = getattr(judge_config, "grader_mode", "pointwise").lower() + grader_mode = ( + GraderMode.POINTWISE if grader_mode_str == "pointwise" else GraderMode.LISTWISE + ) # Parse language - language_str = getattr(judge_config, 'language', 'en').upper() - language = LanguageEnum.ZH if language_str == 'ZH' else LanguageEnum.EN + language_str = getattr(judge_config, "language", "en").upper() + language = LanguageEnum.ZH if language_str == "ZH" else LanguageEnum.EN # Parse sampling mode - sampling_mode_str = getattr(judge_config, 'sampling_mode', 'all_samples') - sampling_mode = SamplingMode.ALL_SAMPLES if sampling_mode_str == 'all_samples' else SamplingMode.SMART_SAMPLING + sampling_mode_str = getattr(judge_config, "sampling_mode", "all_samples") + sampling_mode = ( + SamplingMode.ALL_SAMPLES + if sampling_mode_str == "all_samples" + else SamplingMode.SMART_SAMPLING + ) # Parse aggregation mode - aggregation_mode_str = getattr(judge_config, 'aggregation_mode', 'keep_all') - aggregation_mode = AggregationMode.KEEP_ALL if aggregation_mode_str == 'keep_all' else AggregationMode.MERGE_SIMILAR + aggregation_mode_str = getattr(judge_config, "aggregation_mode", "keep_all") + aggregation_mode = ( + AggregationMode.KEEP_ALL + if aggregation_mode_str == "keep_all" + else AggregationMode.MERGE_SIMILAR + ) # Create AutoRubricsConfig rubrics_config = AutoRubricsConfig( sampling_mode=sampling_mode, grader_mode=grader_mode, language=language, - generate_number=getattr(judge_config, 'generate_number', 3), - max_retries=getattr(judge_config, 'max_retries', 5), - max_epochs=getattr(judge_config, 'max_epochs', 3), - min_score=getattr(judge_config, 'min_score', 0), - max_score=getattr(judge_config, 'max_score', 10), - batch_size=getattr(judge_config, 'batch_size', 10), - mcr_batch_size=getattr(judge_config, 'mcr_batch_size', 10), + generate_number=getattr(judge_config, "generate_number", 3), + max_retries=getattr(judge_config, "max_retries", 5), + max_epochs=getattr(judge_config, "max_epochs", 3), + min_score=getattr(judge_config, "min_score", 0), + max_score=getattr(judge_config, "max_score", 10), + batch_size=getattr(judge_config, "batch_size", 10), + mcr_batch_size=getattr(judge_config, "mcr_batch_size", 10), aggregation_mode=aggregation_mode, ) @@ -140,7 +162,7 @@ def _parse_config(self) -> AutoGraderConfig: auto_grader_config = AutoGraderConfig( method="auto_rubrics", method_config=rubrics_config, - grader_name=getattr(judge_config, 'grader_name', 'RM Auto Grader'), + grader_name=getattr(judge_config, "grader_name", "RM Auto Grader"), ) return auto_grader_config @@ -148,13 +170,13 @@ def _parse_config(self) -> AutoGraderConfig: async def read_reference_samples_from_dataset(self) -> List[Task]: # read dataset from config from astune.task_reader import TaskReaderRouterV2 + reader = TaskReaderRouterV2( - reader_type =self.config.astune.task_judge.rubrics_auto_grader.input_data_type, - reader_config=self.config.astune.task_judge.rubrics_auto_grader + reader_type=self.config.astune.task_judge.rubrics_auto_grader.input_data_type, + reader_config=self.config.astune.task_judge.rubrics_auto_grader, ) return reader.task_reader.get_training_tasks() - async def generate_rubrics_from_samples(self, reference_samples: List[Task] = []) -> None: """ Generate evaluation rubrics from reference samples. @@ -169,14 +191,15 @@ async def generate_rubrics_from_samples(self, reference_samples: List[Task] = [] if len(reference_samples) == 0: reference_samples = await self.read_reference_samples_from_dataset() - logger.info(f"Generating rubrics from {len(reference_samples)} reference samples...") # Convert Task samples to EvalCase format for rubric generation # Use reference answers as example "good" outputs eval_cases = [] for sample in reference_samples: - eval_case = self._task_to_eval_case(sample, workflow_output=None, for_rubric_generation=True) + eval_case = self._task_to_eval_case( + sample, workflow_output=None, for_rubric_generation=True + ) if eval_case: eval_cases.append(eval_case) @@ -198,11 +221,13 @@ async def generate_rubrics_from_samples(self, reference_samples: List[Task] = [] grader_save_dir = os.path.join(experiment_dir, "auto_grader.json") # make dirs if not exist os.makedirs(experiment_dir, exist_ok=True) - print_dict({ - "message": "Saving generated grader config to", - "path": grader_save_dir - }) - json.dump(self.llm_grader.to_dict(), open(grader_save_dir, "w", encoding="utf-8"), indent=4, ensure_ascii=False) + print_dict({"message": "Saving generated grader config to", "path": grader_save_dir}) + json.dump( + self.llm_grader.to_dict(), + open(grader_save_dir, "w", encoding="utf-8"), + indent=4, + ensure_ascii=False, + ) # Load grader config and inject model # grader_config = json.load(open("my_grader.json", "r", encoding="utf-8")) @@ -214,7 +239,6 @@ async def generate_rubrics_from_samples(self, reference_samples: List[Task] = [] logger.info("Rubrics generated successfully!") logger.info(f"Generated rubrics:\n{self.llm_grader.rubrics}") - async def load_rubrics_from_cache(self) -> None: """ Load a pre-generated grader configuration from file. @@ -234,13 +258,11 @@ async def load_rubrics_from_cache(self) -> None: logger.exception(f"Failed to load grader config from") await self.generate_rubrics_from_samples([]) - - def _task_to_eval_case( self, task: Task, workflow_output: Optional[WorkflowOutput | List[WorkflowOutput]] = None, - for_rubric_generation: bool = False + for_rubric_generation: bool = False, ) -> Optional[EvalCase]: """ Convert Task (and optionally WorkflowOutput) to EvalCase format. @@ -256,15 +278,17 @@ def _task_to_eval_case( try: # Extract query query = getattr(task, self.query_field, "") - if not query and hasattr(task, 'metadata'): + if not query and hasattr(task, "metadata"): query = task.metadata.get(self.query_field, "") # Extract reference answer reference = "" - if hasattr(task, 'metadata') and self.reference_field in task.metadata: + if hasattr(task, "metadata") and self.reference_field in task.metadata: reference = task.metadata[self.reference_field] if not reference: - raise ValueError(f"Reference field '{self.reference_field}' not found in task metadata") + raise ValueError( + f"Reference field '{self.reference_field}' not found in task metadata" + ) # Build input dict - reference should always be in input for comparison input_dict = { @@ -279,28 +303,28 @@ def _task_to_eval_case( # Metadata should contain pre-labeled data (with score/rank) grader_mode = self.grader_config.method_config.grader_mode - metadata = task.metadata if hasattr(task, 'metadata') else {} + metadata = task.metadata if hasattr(task, "metadata") else {} if grader_mode == GraderMode.POINTWISE: # Pointwise: expect metadata with "answer" and "score" - if 'answer' in metadata and 'score' in metadata: - outputs.append({ - "answer": metadata['answer'], - "score": metadata['score'] - }) + if "answer" in metadata and "score" in metadata: + outputs.append({"answer": metadata["answer"], "score": metadata["score"]}) else: - raise ValueError(f"Metadata must contain 'answer' and 'score' for pointwise rubric generation in task {task.task_id}") + raise ValueError( + f"Metadata must contain 'answer' and 'score' for pointwise rubric generation in task {task.task_id}" + ) else: # LISTWISE # Listwise: expect metadata with "candidates" containing list of {answer, rank} - if 'candidates' in metadata and isinstance(metadata['candidates'], list): - for candidate in metadata['candidates']: - outputs.append({ - "answer": candidate['answer'], - "rank": candidate['rank'] - }) + if "candidates" in metadata and isinstance(metadata["candidates"], list): + for candidate in metadata["candidates"]: + outputs.append( + {"answer": candidate["answer"], "rank": candidate["rank"]} + ) else: - logger.warning(f"No labeled data found for listwise rubric generation in task {task.task_id}") + logger.warning( + f"No labeled data found for listwise rubric generation in task {task.task_id}" + ) return None else: # For evaluation: use the actual model output (no labels) @@ -314,7 +338,9 @@ def _task_to_eval_case( answer = workflow_output.metadata.get(self.answer_field, "") outputs.append({"answer": answer}) else: - logger.warning(f"No workflow output provided for evaluation of task {task.task_id}") + logger.warning( + f"No workflow output provided for evaluation of task {task.task_id}" + ) return None if not outputs: @@ -328,9 +354,7 @@ def _task_to_eval_case( return None async def _async_compute_reward( - self, - task: Task, - workflow_output: WorkflowOutput | List[WorkflowOutput] + self, task: Task, workflow_output: WorkflowOutput | List[WorkflowOutput] ): """ Asynchronously compute reward using the generated rubrics. @@ -366,11 +390,7 @@ async def _async_compute_reward( logger.error(f"Error during evaluation: {e}") return None - def compute_reward( - self, - task: Task, - workflow_output: WorkflowOutput - ) -> tuple: + def compute_reward(self, task: Task, workflow_output: WorkflowOutput) -> tuple: """ Compute reward for a workflow output (synchronous wrapper). @@ -390,10 +410,9 @@ def compute_reward( # We need to use nest_asyncio or raise an error try: import nest_asyncio + nest_asyncio.apply() - return loop.run_until_complete( - self._async_compute_reward(task, workflow_output) - ) + return loop.run_until_complete(self._async_compute_reward(task, workflow_output)) except ImportError: raise RuntimeError( "compute_reward() was called from an async context. " @@ -405,9 +424,6 @@ def compute_reward( loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: - return loop.run_until_complete( - self._async_compute_reward(task, workflow_output) - ) + return loop.run_until_complete(self._async_compute_reward(task, workflow_output)) finally: loop.close() - diff --git a/astune/task_reader/__init__.py b/astune/task_reader/__init__.py index dff7558d..417db785 100644 --- a/astune/task_reader/__init__.py +++ b/astune/task_reader/__init__.py @@ -1,11 +1,12 @@ import json import uuid -import torch +from typing import Dict, List, Optional + import datasets import numpy as np -from typing import List, Dict, Optional -from astune.schema.task import Task +import torch +from astune.schema.task import Task from astune.task_reader.env_service_reader import TaskReaderEnvService from astune.task_reader.hf_dataset_reader import TaskReaderHuggingFace from astune.task_reader.jsonl_reader import TaskReaderJsonl @@ -14,7 +15,6 @@ class RandomDummyGenerator(TaskReaderBase): - def __init__(self, reader_config): super().__init__(reader_config) diff --git a/astune/task_reader/document_reader/doc_reader.py b/astune/task_reader/document_reader/doc_reader.py index 75012e4c..6bdbaa38 100644 --- a/astune/task_reader/document_reader/doc_reader.py +++ b/astune/task_reader/document_reader/doc_reader.py @@ -1,18 +1,21 @@ import uuid from typing import Dict, List + +from unstructured.partition.auto import partition + from astune.schema.document import Document from astune.task_reader.document_reader.document_reader_base import DocReaderBase -from unstructured.partition.auto import partition + class DocReader(DocReaderBase): """ Document reader parses them into Document objects, and optionally returns raw text content. """ + def __init__(self, config): super().__init__(config) - - def load_document(self, source: str, languages=['eng']) -> str: + def load_document(self, source: str, languages=["eng"]) -> str: """ Load text from a file. @@ -32,18 +35,12 @@ def load_document(self, source: str, languages=['eng']) -> str: text = "\n\n".join([str(sub) for sub in text_pages]) return text - def _parser_document(self, raw_document: str) -> Document: - - return Document( - doc_id=str(uuid.uuid4()), - content=raw_document, - metadata={} - ) - + return Document(doc_id=str(uuid.uuid4()), content=raw_document, metadata={}) def get_document(self) -> Document: file_path = self.config.astune.document_reader.document_path - raw_doc = self.load_document(file_path, languages=list(self.config.astune.document_reader.languages)) + raw_doc = self.load_document( + file_path, languages=list(self.config.astune.document_reader.languages) + ) return self._parser_document(raw_doc) - diff --git a/astune/task_reader/document_reader/document_reader_base.py b/astune/task_reader/document_reader/document_reader_base.py index 7ba4b2a3..785bd035 100644 --- a/astune/task_reader/document_reader/document_reader_base.py +++ b/astune/task_reader/document_reader/document_reader_base.py @@ -1,7 +1,9 @@ import json import uuid +from typing import Dict, List, Optional + import datasets -from typing import List, Dict, Optional + from astune.schema.document import Document diff --git a/astune/task_reader/env_service_reader.py b/astune/task_reader/env_service_reader.py index 934eefd9..5b4dc79f 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astune/task_reader/env_service_reader.py @@ -1,11 +1,13 @@ import json import uuid -import torch +from typing import Dict, List, Optional + import datasets -from typing import List, Dict, Optional +import torch + from astune.schema.task import Task -from astune.utils.env_service_client.env_client_ng import EnvClient from astune.task_reader.task_reader_base import TaskReaderBase +from astune.utils.env_service_client.env_client_ng import EnvClient class TaskReaderEnvService(TaskReaderBase): diff --git a/astune/task_reader/hf_dataset_reader.py b/astune/task_reader/hf_dataset_reader.py index eb56fd30..8e20e507 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astune/task_reader/hf_dataset_reader.py @@ -1,8 +1,10 @@ import json import uuid -import torch +from typing import Dict, List, Optional + import datasets -from typing import List, Dict, Optional +import torch + from astune.schema.task import Task from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_reader/jsonl_reader.py b/astune/task_reader/jsonl_reader.py index d08c2e37..0d1f3c31 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astune/task_reader/jsonl_reader.py @@ -1,8 +1,10 @@ import json import uuid -import torch +from typing import Dict, List, Optional + import datasets -from typing import List, Dict, Optional +import torch + from astune.schema.task import Task from astune.task_reader.task_reader_base import TaskReaderBase diff --git a/astune/task_reader/task_reader_base.py b/astune/task_reader/task_reader_base.py index f0e20f4e..569bb557 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astune/task_reader/task_reader_base.py @@ -1,8 +1,10 @@ import json import uuid -import torch +from typing import Dict, List, Optional + import datasets -from typing import List, Dict, Optional +import torch + from astune.schema.task import Task diff --git a/astune/task_reader/tracing_reader/__init__.py b/astune/task_reader/tracing_reader/__init__.py index 5f0e79f0..304f3213 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astune/task_reader/tracing_reader/__init__.py @@ -1,14 +1,14 @@ -from typing import Any, List, Mapping, MutableMapping, Sequence, TypedDict - import json import os import random +from typing import Any, List, Mapping, MutableMapping, Sequence, TypedDict from loguru import logger -from astune.schema.task import Task from astune.data_generator.filters.base import Filter from astune.data_generator.filters.factory import build_filters +from astune.schema.task import Task + from ..task_reader_base import TaskReaderBase from .connector import LocalSqliteConnectorV1, PhoenixConnector @@ -33,7 +33,9 @@ def __init__( # print("*********", config, "**********") self.reader_config = reader_config.feedback_tracing - logger.info(f"reading tasks from {self.reader_config.get('base_url')}, #filter {len(self.reader_config.get('filters'))}") + logger.info( + f"reading tasks from {self.reader_config.get('base_url')}, #filter {len(self.reader_config.get('filters'))}" + ) self._connector = LocalSqliteConnectorV1(self.reader_config.get("base_url")) filters_config = self.reader_config.get("filters") built_filters = build_filters(filters_config) @@ -63,7 +65,7 @@ def _load_existing_tasks(self, path: str) -> List[Task]: def _append_tasks(self, path: str, tasks: List[Task]) -> None: if not tasks: return - mode = 'a' if os.path.exists(path) else 'w' + mode = "a" if os.path.exists(path) else "w" with open(path, mode) as f: for task in tasks: obj = task.model_dump() diff --git a/astune/task_reader/tracing_reader/connector.py b/astune/task_reader/tracing_reader/connector.py index 432ee3e4..1d735624 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astune/task_reader/tracing_reader/connector.py @@ -1,19 +1,21 @@ -import os -import sqlite3 import ast -import re -from loguru import logger -import requests -import json import hashlib -from typing import List, Protocol +import json +import os +import re +import sqlite3 from datetime import datetime +from typing import List, Protocol + +import requests +from loguru import logger from astune.schema.task import Task class TracingConnector(Protocol): - def load_tasks_from_conversation(self) -> List[Task]: ... + def load_tasks_from_conversation(self) -> List[Task]: + ... class PhoenixConnector: @@ -162,10 +164,10 @@ def load_tasks_from_conversation(self) -> List[Task]: query = parse_msg_line(query) output = parse_msg_line(output) # patch - if isinstance(output['content'],list): - output['content']=output['content'][-1] - if isinstance(output['content'],dict): - output['content']=output['content']['text'] + if isinstance(output["content"], list): + output["content"] = output["content"][-1] + if isinstance(output["content"], dict): + output["content"] = output["content"]["text"] if query is not None and output is not None: if query["role"] == "user" and output["role"] == "assistant": if query["content"] is not None and output["content"] is not None: diff --git a/astune/task_reader/tracing_reader/filters/factory.py b/astune/task_reader/tracing_reader/filters/factory.py index 3e7d422a..b3898a92 100644 --- a/astune/task_reader/tracing_reader/filters/factory.py +++ b/astune/task_reader/tracing_reader/filters/factory.py @@ -5,7 +5,6 @@ from .base import Filter from .llm_evaluate_filter import LlmEvaluateFilter - FILTER_REGISTRY: Dict[str, type[Filter]] = { "llm_evaluate": LlmEvaluateFilter, } diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 4482ed23..18adfadf 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -1,14 +1,11 @@ from typing import Iterable, List from astune.schema.task import Task -from astune.task_rollout.dashscope_llm_bridge import ( - construct_alien_llm_chat_fn, -) +from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn from ..fn import Fn from .base import Filter - EVALUATE_PROMPT = """You are now acting as a **strict QA quality reviewer**. You will be given a data sample containing a “query” (user question/task) and an “answer” (assistant reply). Evaluate it **only based on the text itself**, without inventing facts or performing external retrieval. --- diff --git a/astune/task_reader/tracing_reader/llm_client.py b/astune/task_reader/tracing_reader/llm_client.py index fa253141..73eb6bc4 100644 --- a/astune/task_reader/tracing_reader/llm_client.py +++ b/astune/task_reader/tracing_reader/llm_client.py @@ -1,40 +1,48 @@ -from abc import ABC, abstractmethod import json import os import time -from typing import Any, Optional, Protocol, Iterator, Generator, cast +from abc import ABC, abstractmethod +from typing import Any, Generator, Iterator, Optional, Protocol, cast -from loguru import logger import requests +from loguru import logger + class LlmException(Exception): - def __init__(self,typ: str): - self._type=typ - + def __init__(self, typ: str): + self._type = typ + @property def typ(self): return self._type - + class DashScopeClient: """Aliyun DashScope API Client""" - - def __init__(self, api_key: Optional[str] = None, model_name: str = "qwen-plus", - temperature: float = 0.7, max_tokens: int = 2048): + + def __init__( + self, + api_key: Optional[str] = None, + model_name: str = "qwen-plus", + temperature: float = 0.7, + max_tokens: int = 2048, + ): self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY") if not self.api_key: - raise ValueError("API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly.") - + raise ValueError( + "API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly." + ) + self.model_name = model_name self.temperature = temperature self.max_tokens = max_tokens self.base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1" - + self.headers = { "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json" + "Content-Type": "application/json", } - + def set_model(self, model_name: str): """ Sets the model name for the DashScopeClient instance. @@ -56,11 +64,15 @@ def chat(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) str: The complete response from the LLM as a single string. """ res = "" - for x in self.chat_stream(messages, sampling_params): # ⭐ Aggregates the streaming responses into a single string + for x in self.chat_stream( + messages, sampling_params + ): # ⭐ Aggregates the streaming responses into a single string res += x return res - def chat_stream(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> Generator[str, None, None]: + def chat_stream( + self, messages: list[dict[str, str]], sampling_params: dict[str, Any] + ) -> Generator[str, None, None]: """ Initiates a streaming chat session and returns a generator that yields the response as it is being generated. @@ -71,9 +83,13 @@ def chat_stream(self, messages: list[dict[str, str]], sampling_params: dict[str, Returns: Generator[str, None, None]: A generator that yields the response text as it is being generated. """ - return self.chat_stream_with_retry(messages, **sampling_params) # ⭐ Calls the retry mechanism for streaming chat + return self.chat_stream_with_retry( + messages, **sampling_params + ) # ⭐ Calls the retry mechanism for streaming chat - def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, **kwargs) -> str | Generator[str, None, None]: + def chat_completion( + self, messages: list[dict[str, str]], stream: bool = False, **kwargs + ) -> str | Generator[str, None, None]: """ Sends a request to the chat completion API, supporting both non-streaming and streaming modes, and handles various exceptions. @@ -86,7 +102,7 @@ def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, str | Generator[str, None, None]: The full response text if not streaming, or a generator yielding the response text if streaming. """ url = f"{self.base_url}/chat/completions" - + # Merge parameters params = { "model": self.model_name, @@ -94,15 +110,17 @@ def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, "temperature": self.temperature, "max_tokens": self.max_tokens, "stream": stream, - **kwargs + **kwargs, } - + try: if stream: return self._handle_stream_response(url, params) # ⭐ Handles the streaming response else: - return self._handle_normal_response(url, params) # ⭐ Handles the non-streaming response - + return self._handle_normal_response( + url, params + ) # ⭐ Handles the non-streaming response + except requests.exceptions.RequestException as e: logger.error(f"API request failed: {e}") return "" if not stream else (x for x in []) @@ -124,24 +142,28 @@ def _handle_normal_response(self, url: str, params: dict) -> str: Returns: str: The content of the first choice's message in the response, or an empty string if the response format is unexpected. """ - response = requests.post(url, headers=self.headers, json=params, timeout=600) # ⭐ Sends the POST request to the API + response = requests.post( + url, headers=self.headers, json=params, timeout=600 + ) # ⭐ Sends the POST request to the API if not response.ok: # check inappropriate content try: - error_json=response.json()['error'] - if "inappropriate content" in error_json['message']: + error_json = response.json()["error"] + if "inappropriate content" in error_json["message"]: raise LlmException("inappropriate content") - if "limit" in error_json['message']: + if "limit" in error_json["message"]: raise LlmException("hit limit") except LlmException as e: raise except: logger.error(f"API request failed: {response.text}") response.raise_for_status() - + result = response.json() if "choices" in result and len(result["choices"]) > 0: - return result["choices"][0]["message"]["content"].strip() # ⭐ Extracts and returns the content of the first choice's message + return result["choices"][0]["message"][ + "content" + ].strip() # ⭐ Extracts and returns the content of the first choice's message else: logger.error(f"Unexpected response format: {result}") return "" @@ -157,29 +179,31 @@ def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None Yields: str: The content of the response, if it meets the specified conditions. """ - response = requests.post(url, headers=self.headers, json=params, stream=True, timeout=600) # ⭐ Send the POST request and get the streaming response + response = requests.post( + url, headers=self.headers, json=params, stream=True, timeout=600 + ) # ⭐ Send the POST request and get the streaming response if not response.ok: # check inappropriate content try: - error_json=response.json()['error'] - if "inappropriate content" in error_json['message']: + error_json = response.json()["error"] + if "inappropriate content" in error_json["message"]: raise LlmException("inappropriate content") - if "limit" in error_json['message']: + if "limit" in error_json["message"]: raise LlmException("hit limit") except LlmException as e: raise except: logger.error(f"API request failed: {response.text}") response.raise_for_status() - + for line in response.iter_lines(): if line: - line = line.decode('utf-8') - if line.startswith('data: '): + line = line.decode("utf-8") + if line.startswith("data: "): data = line[6:] # remove the prefix 'data: ' - if data == '[DONE]': + if data == "[DONE]": break - + try: chunk = json.loads(data) if "choices" in chunk and len(chunk["choices"]) > 0: @@ -191,8 +215,13 @@ def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None except json.JSONDecodeError: continue # skip the bad line - def chat_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, - retry_delay: float = 1.0, **kwargs) -> str: + def chat_with_retry( + self, + messages: list[dict[str, str]], + max_retries: int = 3, + retry_delay: float = 1.0, + **kwargs, + ) -> str: """ Sends a chat completion request to the LLM with a retry mechanism. @@ -207,25 +236,34 @@ def chat_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, """ for attempt in range(max_retries): try: - result = cast(str,self.chat_completion(messages, stream=False, **kwargs)) # ⭐ Attempt to get a chat completion + result = cast( + str, self.chat_completion(messages, stream=False, **kwargs) + ) # ⭐ Attempt to get a chat completion if result: # If a valid response is obtained return result - + except LlmException as e: - if e.typ=='inappropriate content': - logger.warning(f"llm return inappropriate content, which is blocked by the remote") + if e.typ == "inappropriate content": + logger.warning( + f"llm return inappropriate content, which is blocked by the remote" + ) return "[inappropriate content]" except Exception as e: logger.warning(f"Attempt {attempt + 1} failed: {e}") - + if attempt < max_retries - 1: # Not the last attempt - time.sleep(retry_delay * (2 ** attempt)) # Exponential backoff - + time.sleep(retry_delay * (2**attempt)) # Exponential backoff + logger.error(f"All {max_retries} attempts failed") return "" - def chat_stream_with_retry(self, messages: list[dict[str, str]], max_retries: int = 3, - retry_delay: float = 10.0, **kwargs) -> Generator[str, None, None]: + def chat_stream_with_retry( + self, + messages: list[dict[str, str]], + max_retries: int = 3, + retry_delay: float = 10.0, + **kwargs, + ) -> Generator[str, None, None]: """ Attempts to establish a streaming chat completion with a retry mechanism. @@ -240,7 +278,10 @@ def chat_stream_with_retry(self, messages: list[dict[str, str]], max_retries: in """ for attempt in range(max_retries): try: - stream_generator = cast(Generator[str, None, None], self.chat_completion(messages, stream=True, **kwargs)) # ⭐ Cast the generator to the appropriate type + stream_generator = cast( + Generator[str, None, None], + self.chat_completion(messages, stream=True, **kwargs), + ) # ⭐ Cast the generator to the appropriate type # try to fetch the first chunk to verify the connection first_chunk = next(stream_generator, None) if first_chunk is not None: @@ -250,37 +291,37 @@ def chat_stream_with_retry(self, messages: list[dict[str, str]], max_retries: in yield chunk return # success except LlmException as e: - if e.typ=='inappropriate content': - logger.warning(f"llm return inappropriate content, which is blocked by the remote") + if e.typ == "inappropriate content": + logger.warning( + f"llm return inappropriate content, which is blocked by the remote" + ) yield "[inappropriate content]" return except Exception as e: logger.warning(f"Stream attempt {attempt + 1} failed: {e}") - + if attempt < max_retries - 1: - time.sleep(retry_delay * (2 ** attempt)) - + time.sleep(retry_delay * (2**attempt)) + logger.error(f"All {max_retries} stream attempts failed") - + return # demo if __name__ == "__main__": - client = DashScopeClient(model_name='qwq-32b') - - messages = [ - {"role": "user", "content": "Write a poem about Spring."} - ] - + client = DashScopeClient(model_name="qwq-32b") + + messages = [{"role": "user", "content": "Write a poem about Spring."}] + # print("=== request ===") # response = client.chat_completion(messages) # print(response) - + print("\n=== streaming ===") for chunk in client.chat_completion(messages, stream=True): - print(chunk, end='', flush=True) - + print(chunk, end="", flush=True) + print("\n\n=== streaming with retry ===") for chunk in client.chat_stream(messages, {}): - print(chunk, end='', flush=True) \ No newline at end of file + print(chunk, end="", flush=True) diff --git a/astune/task_rollout/async_llm_bridge.py b/astune/task_rollout/async_llm_bridge.py index e0dd25d6..f1cb3dc8 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astune/task_rollout/async_llm_bridge.py @@ -1,29 +1,30 @@ +import asyncio import copy import json import time -import numpy as np import uuid -import asyncio -from pydantic import BaseModel -from typing import Dict, List, Literal, Callable, Any, Type +from typing import Any, Callable, Dict, List, Literal, Type + +import numpy as np +from agentscope._utils._common import _json_loads_with_repair +from agentscope.message import TextBlock, ToolUseBlock +from agentscope.model import ChatResponse from loguru import logger from omegaconf import DictConfig -from astune.utils.utils import run_async_coro__no_matter_what, remove_fields -from astune.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode -from astune.utils.tokenizer import astune_apply_chat_template -from astune.schema.logprob import TokenAndProb -from agentscope.model import ChatResponse -from agentscope.message import TextBlock, ToolUseBlock -from agentscope._utils._common import _json_loads_with_repair +from pydantic import BaseModel from transformers.tokenization_utils import PreTrainedTokenizer +from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser + from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, ) -from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser +from astune.schema.logprob import TokenAndProb +from astune.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode +from astune.utils.tokenizer import astune_apply_chat_template +from astune.utils.utils import remove_fields, run_async_coro__no_matter_what class AsyncLlmBridge(object): - def __init__( self, config: DictConfig, @@ -39,14 +40,12 @@ def __init__( self.max_llm_retries = max_llm_retries def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: - def llm_chat( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, tools=[], request_id: str = "", ) -> dict: - request_id = uuid.uuid4().hex updated_sampling_params = {} @@ -61,18 +60,19 @@ def llm_chat( conversation=input_messages, tools=tools, add_generation_prompt=True, - tokenize=False + tokenize=False, ) prompt_ids = self.tokenizer(prompt_text)["input_ids"] - _test_if_test_mode('prompt_text', prompt_text, self.config) + _test_if_test_mode("prompt_text", prompt_text, self.config) final_res = run_async_coro__no_matter_what( self.async_rollout_manager.generate( request_id=request_id, prompt_ids=prompt_ids, sampling_params=updated_sampling_params, - ), timeout=1800 + ), + timeout=1800, ) if self.config.astune.rollout.name == "vllm": @@ -82,32 +82,38 @@ def llm_chat( decoded_text = self.tokenizer.decode(token_array) # type: ignore if self.config.astune.execute_test: - decoded_text = _mock_if_test_mode('mock_decoded_text', decoded_text, self.config) + decoded_text = _mock_if_test_mode("mock_decoded_text", decoded_text, self.config) if decoded_text.endswith("<|im_end|>"): decoded_text = decoded_text[: -len("<|im_end|>")] # if tool call tool_calls = None - if ('' in decoded_text) and ('' in decoded_text) and (not self.config.astune.rollout.agentscope_disable_toolcalls): + if ( + ("" in decoded_text) + and ("" in decoded_text) + and (not self.config.astune.rollout.agentscope_disable_toolcalls) + ): tool_parser = Hermes2ProToolParser(self.tokenizer) parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() - _test_if_test_mode('parsed_tool_calls', parsed_tool_calls['tool_calls'], self.config) - model_called = parsed_tool_calls['tools_called'] + _test_if_test_mode( + "parsed_tool_calls", parsed_tool_calls["tool_calls"], self.config + ) + model_called = parsed_tool_calls["tools_called"] if model_called: - tool_calls = parsed_tool_calls['tool_calls'] + tool_calls = parsed_tool_calls["tool_calls"] is_bad_toolcall = False for i in range(len(tool_calls)): - if 'function' in tool_calls[i] and 'arguments' in tool_calls[i]['function']: - expect_dict = json.loads(tool_calls[i]['function']['arguments']) + if "function" in tool_calls[i] and "arguments" in tool_calls[i]["function"]: + expect_dict = json.loads(tool_calls[i]["function"]["arguments"]) if not isinstance(expect_dict, dict): is_bad_toolcall = True if is_bad_toolcall: tool_calls = None decoded_text = decoded_text else: - decoded_text = parsed_tool_calls['content'] + decoded_text = parsed_tool_calls["content"] if decoded_text is None: decoded_text = "" @@ -132,7 +138,6 @@ def llm_chat_remote( tools=[], request_id: str = "", ) -> dict: - updated_sampling_params = {} if sampling_params: updated_sampling_params.update(sampling_params) @@ -161,7 +166,6 @@ def llm_chat_trinity( tools=[], request_id: str = "", ) -> dict: - async def main(): updated_sampling_params = {} if sampling_params: @@ -190,15 +194,15 @@ async def main(): return response response = run_async_coro__no_matter_what(main(), timeout=1800) # type: ignore - prompt_text = self.tokenizer.decode(response.model_extra['prompt_token_ids']) - prompt_token_ids = response.model_extra['prompt_token_ids'] + prompt_text = self.tokenizer.decode(response.model_extra["prompt_token_ids"]) + prompt_token_ids = response.model_extra["prompt_token_ids"] content = response.choices[0].message.content message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) if content is None: content = "" - if ('' in content) and (not message.get("tool_calls", None)): + if ("" in content) and (not message.get("tool_calls", None)): # logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") logger.warning(f"Bad toolcall discovered: {content}") @@ -257,11 +261,15 @@ async def __call__( structured_model=None, **kwargs, ) -> ChatResponse: - # prepare context tracker, check context safety - context_safe, token_overflow, info, converted_message, custom_sampling_params, tools = ( - self.context_tracker.step_prepare(messages, tools) - ) + ( + context_safe, + token_overflow, + info, + converted_message, + custom_sampling_params, + tools, + ) = self.context_tracker.step_prepare(messages, tools) if not context_safe: logger.warning(f"[{info}] detected.") self.context_tracker.context_overflow = True @@ -269,7 +277,9 @@ async def __call__( # astune_action_when_overflow = self.config.astune.rollout.astune_action_when_overflow # cannot proceed due to context overflow return ChatResponse( - content=[{"type": "text", "text": "astune_proxy: Exceeded max model context length."}], + content=[ + {"type": "text", "text": "astune_proxy: Exceeded max model context length."} + ], ) # else: # otherwise, for abnormal output, can still proceed, but we do not track output anymore @@ -295,7 +305,6 @@ async def _parse_dashscope_generation_response( message, structured_model: Type[BaseModel] | None = None, ) -> ChatResponse: - content_blocks: List[TextBlock | ToolUseBlock] = [] content = message.get("content") metadata: dict | None = None @@ -324,7 +333,6 @@ async def _parse_dashscope_generation_response( if message.get("tool_calls"): for tool_call in message["tool_calls"]: - input_ = _json_loads_with_repair( tool_call["function"].get( "arguments", diff --git a/astune/task_rollout/dashscope_llm_bridge.py b/astune/task_rollout/dashscope_llm_bridge.py index b69859a2..063d61ae 100644 --- a/astune/task_rollout/dashscope_llm_bridge.py +++ b/astune/task_rollout/dashscope_llm_bridge.py @@ -1,9 +1,10 @@ +import os import random import time -import os from textwrap import dedent -from openai import OpenAI + from loguru import logger +from openai import OpenAI def construct_alien_llm_chat_fn(alien_llm_model, alien_llm_response_length): diff --git a/astune/task_rollout/native_parallel_worker.py b/astune/task_rollout/native_parallel_worker.py index ad08d5f7..d8aec3e4 100644 --- a/astune/task_rollout/native_parallel_worker.py +++ b/astune/task_rollout/native_parallel_worker.py @@ -99,7 +99,8 @@ def rollout( if any(future.exception() for future in futures): executor.shutdown(wait=False, cancel_futures=True) for f in futures: - if not f.done(): f.cancel() + if not f.done(): + f.cancel() raise RuntimeError("One of the rollout threads has encountered an exception.") self.step_status_printer(obs_window) time.sleep(10) @@ -243,17 +244,17 @@ def rollout_dynamic( if not all_equal: if num_finished >= rollout_n: can_terminate[j] = True - terminate_status[j] = ( - f"early_end({len(completed_results)}/{reward_std:.2f})" - ) + terminate_status[ + j + ] = f"early_end({len(completed_results)}/{reward_std:.2f})" else: pass else: if num_finished >= rollout_n_confirm: can_terminate[j] = True - terminate_status[j] = ( - f"confirm_dummy({len(completed_results)}/{reward_std:.2f})" - ) + terminate_status[ + j + ] = f"confirm_dummy({len(completed_results)}/{reward_std:.2f})" if allow_force_stop: for k in range( j * rollout_n_oversample, diff --git a/astune/task_rollout/resource_keeper.py b/astune/task_rollout/resource_keeper.py index d27f239a..cb281406 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astune/task_rollout/resource_keeper.py @@ -1,10 +1,12 @@ +from typing import Any, Callable, Dict, List, Tuple, Union + +from beast_logger import print_dict from loguru import logger -from typing import List, Union from omegaconf import DictConfig -from typing import Any, Dict, Tuple, Union, Callable -from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg + from astune.schema.task import Task, WorkflowTask -from beast_logger import print_dict +from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg + class ResourceKeeper(object): """ @@ -42,7 +44,6 @@ def __exit__(self, exc_type, exc_value, traceback): ) raise e - def prepare(self): """ Prepare the environment and initial messages for the workflow task. @@ -56,12 +57,11 @@ def prepare(self): self.env, self.workflow_task.task_env_uuid, self.workflow_task.task_thread_index, - self.workflow_task.obs_window + self.workflow_task.obs_window, ) return self.workflow_task - def _initialize_environment_and_messages(self) -> List[dict]: """ Initialize environment instance and setup initial messages. @@ -73,7 +73,7 @@ def _initialize_environment_and_messages(self) -> List[dict]: Exception: If environment creation fails or required task data is missing """ - if self.config.astune.task_reader.type == 'env_service': + if self.config.astune.task_reader.type == "env_service": if self.env is None: raise ValueError("Environment client is None but env_service type is specified") try: @@ -81,12 +81,14 @@ def _initialize_environment_and_messages(self) -> List[dict]: env_type=self.env_type, task_id=self.task_id, instance_id=self.workflow_task.task_env_uuid, - params=self.env_params + params=self.env_params, ) state_message: dict = init_response["state"] _, init_messages = self._get_init_messages(state_message) except Exception as e: - logger.bind(exception=True).exception(f"encounter exception in env_worker.create_instance~ error={e.args}") + logger.bind(exception=True).exception( + f"encounter exception in env_worker.create_instance~ error={e.args}" + ) if self.env is not None: self.env.release_instance(self.workflow_task.task_env_uuid) raise e @@ -100,7 +102,6 @@ def _initialize_environment_and_messages(self) -> List[dict]: return init_messages - def _get_init_messages(self, state_message) -> tuple: """ Process state_message to extract query and init_messages. @@ -126,21 +127,17 @@ def _get_init_messages(self, state_message) -> tuple: return query, init_messages - def generate_gym_env( self, env_client: Any, task_env_uuid: str, task_thread_index: int, obs_window: Dict ) -> "BaseGymEnv": return BaseGymEnv(env_client, task_env_uuid, task_thread_index, obs_window) - - class BaseGymEnv(object): """ TODO: integrate with A.S. Runtime """ - def __init__( self, env_client: EnvClientNg, task_env_uuid: str, task_thread_index: int, obs_window: Dict ): @@ -151,17 +148,19 @@ def __init__( def step(self, action: dict) -> Tuple[str, float, bool, dict]: # fix agentscope output - if not isinstance(action['content'], str): + if not isinstance(action["content"], str): # assert isinstance(action['content'], list) # assert len(action['content']) == 1 # assert isinstance(action['content'][0], dict) # assert 'type' in action['content'][0] # assert 'text' in action['content'][0] try: - action['content'] = action['content'][0]['text'] + action["content"] = action["content"][0]["text"] except: - logger.exception(f"Failed to parse action content from agentscope output. {action['content']}") - action['content'] = str(action['content']) + logger.exception( + f"Failed to parse action content from agentscope output. {action['content']}" + ) + action["content"] = str(action["content"]) self.obs_window["step"][self.task_thread_index] += 1 env_output = self.env_client.step( diff --git a/astune/task_rollout/single_worker.py b/astune/task_rollout/single_worker.py index 9ac17328..54c5b56b 100644 --- a/astune/task_rollout/single_worker.py +++ b/astune/task_rollout/single_worker.py @@ -4,34 +4,25 @@ import time import uuid from functools import wraps -from typing import Any, Callable, Literal, Optional, TypeVar, List, Union +from typing import Any, Callable, List, Literal, Optional, TypeVar, Union from loguru import logger from omegaconf import DictConfig from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_tracker.basic_tracker import ( - BasicContextTracker, - TrackerAttr, -) +from astune.context_tracker.basic_tracker import BasicContextTracker, TrackerAttr from astune.schema.task import Task, WorkflowTask from astune.task_rollout.async_llm_bridge import AsyncLlmBridge from astune.task_rollout.resource_keeper import ResourceKeeper -from astune.utils.sample import get_sample_params -from loguru import logger -from omegaconf import DictConfig -from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner from astune.task_runner.agentscope_runner import AgentScopeRunner -from astune.context_tracker.basic_tracker import BasicContextTracker -from astune.utils.testing_utils import GoodbyeException, TestFailException -from astune.utils.env_service_client.env_client_ng import ( - EnvClient as EnvClientNg, -) +from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner +from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg from astune.utils.retry import retry_with_backoff +from astune.utils.sample import get_sample_params +from astune.utils.testing_utils import GoodbyeException, TestFailException class BaseParallelEnv: - def __init__( self, config: DictConfig, @@ -115,8 +106,14 @@ def rollout_env_worker( with ResourceKeeper(workflow_task, config=self.config) as resource_keeper: try: workflow_task = resource_keeper.prepare() - Runner = AgentScopeRunner if self.config.astune.rollout.use_agentscope_protocol else AgentRunner - agent_runner: AgentScopeRunner = Runner(llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, config=self.config) # type:ignore + Runner = ( + AgentScopeRunner + if self.config.astune.rollout.use_agentscope_protocol + else AgentRunner + ) + agent_runner: AgentScopeRunner = Runner( + llm_chat_fn=llm_chat_fn, tokenizer=self.tokenizer, config=self.config + ) # type:ignore cmt = agent_runner.execute( workflow_task=workflow_task, ) diff --git a/astune/task_runner/__init__.py b/astune/task_runner/__init__.py index c07f3f35..394adb63 100644 --- a/astune/task_runner/__init__.py +++ b/astune/task_runner/__init__.py @@ -1,13 +1,13 @@ +from typing import Any, Callable, Dict, Tuple, Union + from astune.context_tracker.basic_tracker import BasicContextTracker -from typing import Any, Dict, Tuple, Union, Callable from astune.task_judge.judge_base import JudgeBase from astune.utils.dynamic_import import dynamic_import -from astune.utils.utils import run_async_coro__no_matter_what, remove_fields from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astune.utils.utils import remove_fields, run_async_coro__no_matter_what class BaseAgentRunner(object): - def __init__(self, llm_chat_fn: Callable, tokenizer: Any, config, **kwargs): self.tokenizer = tokenizer self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") @@ -21,7 +21,6 @@ def __init__(self, llm_chat_fn: Callable, tokenizer: Any, config, **kwargs): self.max_env_len: int = self.config.astune.rollout.max_env_len def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task): - def should_interrupt_fn() -> bool: if (obs_window["stop"] is not None) and obs_window["stop"][ task_thread_index @@ -38,14 +37,14 @@ def generated_token_callback_fn(token_array): } def get_judge(self) -> JudgeBase: # type: ignore - - if self.config.astune.task_judge.judge_type == 'customized_protocal': + if self.config.astune.task_judge.judge_type == "customized_protocal": judge_protocol = self.config.astune.task_judge.judge_protocol return dynamic_import(judge_protocol)(self.config) # type: ignore - elif self.config.astune.task_judge.judge_type == 'rubrics_auto_grader': + elif self.config.astune.task_judge.judge_type == "rubrics_auto_grader": # astune/task_judge/rm_auto_grader_judge.py from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + judge = RMAutoGraderJudge(self.config) run_async_coro__no_matter_what(judge.load_rubrics_from_cache()) - return judge \ No newline at end of file + return judge diff --git a/astune/task_runner/agentscope_runner.py b/astune/task_runner/agentscope_runner.py index c9b206a0..6b139672 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astune/task_runner/agentscope_runner.py @@ -1,29 +1,28 @@ -import threading +import asyncio +import copy import importlib +import threading +from typing import Any, Dict, List, Tuple, Union + import torch -import copy -import asyncio + from astune import ModelTuner, Workflow, WorkflowOutput -from astune.utils.env_service_client.env_client import EnvClient -from astune.task_runner import BaseAgentRunner +from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracking, +) from astune.context_tracker.basic_tracker import ( BasicContextTracker, ExtendedMessage, replace_token_ids, - BasicContextTracker, -) -from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( - MultiAgentContextTracking, ) -from astune.schema.trajectory import Reward, Trajectory -from astune.schema.trajectory import Sample, Reward from astune.schema.task import Task, WorkflowTask +from astune.schema.trajectory import Reward, Sample, Trajectory +from astune.task_runner import BaseAgentRunner from astune.utils.dynamic_import import dynamic_import -from typing import Any, Dict, List, Union, Tuple +from astune.utils.env_service_client.env_client import EnvClient class AgentScopeRunner(BaseAgentRunner): - def execute(self, workflow_task: WorkflowTask) -> BasicContextTracker: obs_window = workflow_task.obs_window task_thread_index = workflow_task.task_thread_index @@ -47,7 +46,7 @@ def execute(self, workflow_task: WorkflowTask) -> BasicContextTracker: task_batch_index=task_batch_index, task_tag=task_tag, task_id=task_id, - **hooks + **hooks, ) m_tuner = ModelTuner( context_tracker=context_tracker, diff --git a/astune/task_runner/classic_runner.py b/astune/task_runner/classic_runner.py index 799c5b21..69aca14e 100644 --- a/astune/task_runner/classic_runner.py +++ b/astune/task_runner/classic_runner.py @@ -1,22 +1,19 @@ import os -import time import threading +import time +from typing import Any, Callable, Dict, List, Union +from beast_logger import print_listofdict from loguru import logger -from astune.utils.env_service_client.env_client import EnvClient -from astune.utils.utils import convert_tool_to_user_message + +from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage from astune.schema.trajectory import Reward -from astune.context_tracker.basic_tracker import ( - BasicContextTracker, - ExtendedMessage, -) from astune.task_runner import BaseAgentRunner -from typing import Any, Dict, List, Union, Callable -from beast_logger import print_listofdict +from astune.utils.env_service_client.env_client import EnvClient +from astune.utils.utils import convert_tool_to_user_message class AgentRunner(BaseAgentRunner): - def __init__(self, **kwargs): super().__init__(**kwargs) self.use_step_reward_from_env: bool = self.config.astune.rollout.get( @@ -73,7 +70,9 @@ def execute(self, workflow_task) -> BasicContextTracker: raise e # 4. ⚠️ check token overflow - is_safe, token_overflow, info = self.cmt.check_context_token_num_safe(step_input_message_arr) + is_safe, token_overflow, info = self.cmt.check_context_token_num_safe( + step_input_message_arr + ) if not is_safe: logger.warning( f"[{info}] detected at step {act_step}. Current token count exceeds the limit." diff --git a/astune/tuner.py b/astune/tuner.py index f1372fc9..22805d13 100644 --- a/astune/tuner.py +++ b/astune/tuner.py @@ -1,15 +1,17 @@ +from typing import TYPE_CHECKING, Any, Literal, Type + +from agentscope._utils._common import ( + _create_tool_from_base_model, + _json_loads_with_repair, +) +from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel from loguru import logger -from typing import Literal, Any, TYPE_CHECKING, Type from pydantic import BaseModel, Field -from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope + from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, ) -from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel -from agentscope._utils._common import ( - _json_loads_with_repair, - _create_tool_from_base_model, -) +from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope if TYPE_CHECKING: from astune import Workflow @@ -81,8 +83,13 @@ def register_model(self, target_name: str, default_model: ChatModelBase) -> Agen The agent type instance corresponding to the provided name. """ if target_name in self.target2proxy_registry: - if default_model.model_name != self.target2proxy_registry[target_name].default_model.model_name: - raise ValueError(f"Agent proxy `{target_name}` is already registered with a different model_name.\nWAS [{self.target2proxy_registry[target_name].default_model.model_name}]\nNOW [{default_model.model_name}].") + if ( + default_model.model_name + != self.target2proxy_registry[target_name].default_model.model_name + ): + raise ValueError( + f"Agent proxy `{target_name}` is already registered with a different model_name.\nWAS [{self.target2proxy_registry[target_name].default_model.model_name}]\nNOW [{default_model.model_name}]." + ) self.target2proxy_registry[target_name] = Agent2Proxy(target_name, self, default_model) return self.get_model(target_name) @@ -108,7 +115,6 @@ async def __call__( structured_model: Type[BaseModel] | None = None, **kwargs: Any, ) -> ChatResponse: - # For qvq and qwen-vl models, the content field cannot be `None` or # `[{"text": None}]`, so we need to convert it to an empty list. if self.model_name.startswith("qvq") or "-vl" in self.model_name: diff --git a/astune/utils/cleaner.py b/astune/utils/cleaner.py index 4c1ae7cf..acf19f3a 100644 --- a/astune/utils/cleaner.py +++ b/astune/utils/cleaner.py @@ -1,10 +1,10 @@ -import subprocess import argparse -import shutil -import time -import sys import os import shlex +import shutil +import subprocess +import sys +import time def fast_kill_by_keyword_bash( diff --git a/astune/utils/compute_madness.py b/astune/utils/compute_madness.py index 96f321ba..3e644884 100644 --- a/astune/utils/compute_madness.py +++ b/astune/utils/compute_madness.py @@ -44,7 +44,7 @@ def build_pattern(white_list): allowed_parts.append(WHITE_LIST_REGEX_PARTS[name]) # Merge allowed ranges into one character class, then use a negated class to match disallowed characters allowed_class = "".join(allowed_parts) - pattern = f'[^{allowed_class}]' # Match disallowed characters + pattern = f"[^{allowed_class}]" # Match disallowed characters return re.compile(pattern) @@ -80,7 +80,8 @@ def compute_string_madness(completion, detail=False, checklist=["nonsense"]) -> return all_reward -def compute_string_madness_format(completion, detail, format_type)->float: + +def compute_string_madness_format(completion, detail, format_type) -> float: if format_type == "type_1": """ @@ -125,7 +126,6 @@ def compute_string_madness_format(completion, detail, format_type)->float: def compute_string_madness_char(completion, detail=False, skip_non_ascii=False) -> float: - if detail: result = { "has_non_ascii": has_non_ascii(completion), @@ -174,7 +174,9 @@ def repetition_penalty_reward_scalar_debug(completion): # print(compute_string_madness("Hello world! Hello world!")) # -1.0 # print(compute_string_madness("你好,世界!")) # -1.0 # print(compute_string_madness("Hello <|im_start|> world!")) # -1.0 - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ playlist_songs` API to get the list of songs in a playlist. Let's first call `show_playlist_songs` to get the list of songs for a playlist and then calculate the total duration. @@ -200,14 +202,23 @@ def get_song_duration(song_id, access_token): ``` Let's execute this code to find the suitable playlist. 🚀🚀 😄😄 - """) == 0 + """ + ) + == 0 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ Hello <|im_start|> world! - """) == -1 - + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ def has_non_ascii(text): non_ascii_but_normal = ['‘', '’', '“', '”', '–', '—', '…', '•', '™', '©', '®', '°', '±', 'µ', '°', '′', '″', '℉', '℃'] for t in non_ascii_but_normal: @@ -222,26 +233,44 @@ def has_non_ascii(text): 3. chinese 4. chinese 标点 5. other normal chars you can think of - """) == 0 - + """ + ) + == 0 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - """) == -1 - + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ fewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwefewfwe - """) == -1 + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd wqd - """) == -1 + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ 1 游戏科学在科隆游戏展上发布新作品《黑神话:钟馗》,视频中有哪些信息值得关注? 世上何尝有鬼?妖魔皆从心生。 台下魑魅台上仙,好煞两副面! 门内一滩子糊涂账,门外哪个喊青天? 日月朝暮空空悬,凭谁掌那生死权。 不顺人情不合道,不争功名不趋炎。 提剑也,提剑也, 要把这清浊辨! 由游戏科学开发的黑神话系列第二部作品《黑神话:钟馗》,今日正式公布首支 CG 先导预告片,并已在 2025 科隆游戏展的展前发布会同步亮相。 本作是以中国民间传说中的著名角色「钟馗」为主要创意来源的单机·动作·角色扮演游戏。因尚处早期开发阶段,暂无实机内容展示。 @@ -264,23 +293,37 @@ def has_non_ascii(text): 新 微软 Win11 最新 KB5063878 更新导致特定情况下 SSD 和 HDD 故障,如何解决? IT 之家 8 月 17 日消息,微软上周发布了一个非常重要的 - """) == 0 + """ + ) + == 0 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ _the output indicates that the variable\_name\_error\_is\_ spotify\_\_access\_\_token\_\_,is\_not\_\_defined\_,\_but\_accord\_\_to\_\_the\_\_previous\_\_conversation\_\_record\_\_matchCondition\_\_spotify\_\_access\_\_token\_\_has\_\_been\_\_successfully\_\_获得\_\_取得以及\_\_可以\_\_正常使用\_\_matchCondition\_\_,\_所以\_\_问题\_\_应该\_\_出\_\_在\_\_上次\_\_对话\_\_记录\_\_沒有\_\_正确\_\_继承\_\_或\_\_上\_\_次\_\_对话\_\_记录\_\_无法\_\_正确\_\_匹配\_\_本次\_\_对话\_\_继续\_\_matchCondition\_\_,\_因此\_\_需要\_\_重新\_\_获得\_\_ spotify\_\_登录\_\_所需的\_\_电子邮件\_\_和\_\_密码\_\_matchCondition\_\_,\_并\_\_再次\_\_获得\_\_ spotify\_\_访问\_\_令牌\_\_matchCondition\_\_,\_以便\_\_可以\_\_正常使用\_\_ spotify\_\_api\_\_matchCondition\_\_。\_ ```python passwords = apis.supervisor. show\_account\_passwords () print ( passwords ) ```<|im_end|> - """) == 0 # exclude chinese + """ + ) + == 0 + ) # exclude chinese - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ the\_ last\_ try\_ to\_ get\_ the\_ supervisor\_\_ account\_ passwords\_ using\_ the\_ supervisor\_ api\_ failed\_ again\_ for\_ unknown\_ reason\_,\_ but\_ from\_ the\_ previous\_ conversation\_ record\_ we\_ already\_ know\_ the\_ api\_ response\_\__marker\= \[\_ \{\_ "account\_ name\_\_ marker\= \":\_ \"spotify\_\_",\_ "password\_\_ marker\= \":\_ \"dummy\_ spotify\_ pass\"\_\_\_\_ marker\},\_ \{\_ "account\_ name\_\_ marker\= \":\_ \"file\_ system\_\_",\_ "password\_\_ marker\= \":\_ \"dummy\_ fs\_ pass\"\_\_\_\_\_ marker\}\_\_\_\]\_\_ already\_,\_ so\_ we\_ can\_ reuse\_ the\_\_marker\_ known\_ information\_ instead\_ of\_ trying\_ to\_ call\_ the\_ api\_ again\_ which\_ fails\_ for\_ unknown\_ reason\_matchCondition\_,\_next\_ we\_ should\_ use\_ the\_ known\_ spotify\_ password\_ to\_ login\_ to\_ get\_ the\_ spotify\_ access\_ token\_ again\_matchCondition\_。\_\_\`\`\_python\_\_marker\}\_ spotify\_ password\_\_ marker\= "dummy\_ spotify\_ pass"\_\_ login\_ result\_\_ marker\= apis\. spotify\. login\_ marker\(\_ username\_\_ marker\= \'joseharr@gmail\. com\'\_\_,\_ password\_\_ marker\= spotify\_ password\_\_\_\)\_ print\_\_ marker\(\_ login\_ result\_\_\_\)\_\_\`\`\_ bezpo\_ marker\}<|im_start|> <|endoftext|><|im_end|> - """) == -1 # <|im_start|> in the text - + """ + ) + == -1 + ) # <|im_start|> in the text - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ From the API documentation, we can see that the `show_recommendations` API provides personalized song recommendations for the user. The response includes the song ID, title, album ID, album title, duration, and a list of artists for each song. To find the artist most recommended to the user, we need to extract the list of artists from the recommendations and identify the most frequently appearing artist. @@ -310,19 +353,28 @@ def has_non_ascii(text): print(most_recommended_artist) apis.supervisor.complete_task(answer=most_recommended_artist) ```คะแน limburg<|im_end|> - """) == -1 + """ + ) + == -1 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ Though file_system app has no login api, it may need supervisor app's login, so I will try that. ```python supervisor_password = [account_password["password"] for account_password in passwords if account_password["account_name"] == "supervisor"][0] login_result = apis.supervisor.login(username='jennifer.powell@example.com', password=supervisor_password) print(login_result) ```<|im_end|> - """) == 0 - + """ + ) + == 0 + ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ @@ -344,11 +396,15 @@ def has_non_ascii(text): movie_titles.append(line.strip()) print(movie_titles) ```<|im_end|> - """) == -1 # too many `line.startswith` + """ + ) + == -1 + ) # too many `line.startswith` # part 2 - assert compute_string_madness_format( - """ + assert ( + compute_string_madness_format( + """ Though file_system app has no login api, it may need supervisor app's login, so I will try that. ```python supervisor_password = [account_password["password"] for account_password in passwords if account_password["account_name"] == "supervisor"][0] @@ -356,12 +412,15 @@ def has_non_ascii(text): print(login_result) ``` """, - detail=False, - format_type="type_1" - ) == 0.0 - - assert compute_string_madness_format( - """ + detail=False, + format_type="type_1", + ) + == 0.0 + ) + + assert ( + compute_string_madness_format( + """ So,this `422` status code means this directory path `/home/user/photographs/` is not available in supervisor's account,so I must get home directory path of supervisor,namely nicholas weber,first,so I must call.```python profile = apis.supervisor.show_profile() print(profile) @@ -373,12 +432,15 @@ def has_non_ascii(text): print(profile) ``` """, - detail=False, - format_type="type_1" - ) == -1.0 - - assert compute_string_madness_format( - """ + detail=False, + format_type="type_1", + ) + == -1.0 + ) + + assert ( + compute_string_madness_format( + """ From the list of liked songs, we have the artists who have songs liked by the user. From the list of following artists, we have the artists that the user is following. To unfollow artists who have not sung any song that the user has liked, we need to: @@ -407,8 +469,10 @@ def has_non_ascii(text): {12, 14, 8, 36, 23, 25, 28, 33, 2, 9, 11, 18} ``` """, - detail=False, - format_type="type_1" - ) == -1.0 + detail=False, + format_type="type_1", + ) + == -1.0 + ) print("All tests passed!") diff --git a/astune/utils/config_utils.py b/astune/utils/config_utils.py index 686044be..66412227 100644 --- a/astune/utils/config_utils.py +++ b/astune/utils/config_utils.py @@ -1,11 +1,12 @@ import os import shutil import time + import yaml +from best_logger import print_dict +from hydra import compose, initialize from loguru import logger -from hydra import initialize, compose from omegaconf import DictConfig -from best_logger import print_dict def read_astune_config(yaml_fp): @@ -24,7 +25,6 @@ def load_hydra_config(config_path: str, config_name: str) -> DictConfig: return load_hydra_config(config_path=dir_path, config_name=file_name) - def dump_yaml_config(cfg: DictConfig, yaml_fp: str): """Persist the provided OmegaConf config to ``yaml_fp``.""" from omegaconf import OmegaConf @@ -34,8 +34,6 @@ def dump_yaml_config(cfg: DictConfig, yaml_fp: str): return yaml_fp - - def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone): """Align configuration values based on a conversion map. @@ -119,12 +117,12 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): with open(to_config_fp, "w") as file: yaml.dump(to_config, file) # logger.success(f"Saved aligned configuration to {to_config_fp}") - print_dict({ - "Note": f"Saved aligned configuration to {to_config_fp}" - }) + print_dict({"Note": f"Saved aligned configuration to {to_config_fp}"}) -def read_astune_hierarchical_config(yaml_fp, exp_name, backbone, write_to=None, exp_dir="launcher_record"): +def read_astune_hierarchical_config( + yaml_fp, exp_name, backbone, write_to=None, exp_dir="launcher_record" +): with open(yaml_fp, "r") as file: config = yaml.safe_load(file) config["astune"]["experiment_name"] = exp_name @@ -151,9 +149,11 @@ def read_astune_hierarchical_config(yaml_fp, exp_name, backbone, write_to=None, yaml.dump(config, file) return config + def expand_astune_hierarchical_config(config, write_to=None): # create temp yaml file import tempfile + with tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".yaml") as temp_yaml: yaml_path = temp_yaml.name with open(yaml_path, "w") as file: @@ -173,7 +173,6 @@ def expand_astune_hierarchical_config(config, write_to=None): return config_final - def prepare_experiment_config(yaml_path, exp_dir, backbone): """ Prepare experiment configuration by reading YAML, setting up backup directories, @@ -243,7 +242,9 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): shutil.copyfile(yaml_backup_src, yaml_backup_dst) ## 4. edit new yaml - config = read_astune_hierarchical_config(yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst, exp_dir=exp_dir) + config = read_astune_hierarchical_config( + yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst, exp_dir=exp_dir + ) config_final = expand_astune_hierarchical_config(config, write_to=yaml_backup_dst) return yaml_backup_dst, exe_exp_base, exp_name, config_final diff --git a/astune/utils/core_env_vars.py b/astune/utils/core_env_vars.py index 4a6d98ef..3ee92068 100644 --- a/astune/utils/core_env_vars.py +++ b/astune/utils/core_env_vars.py @@ -1,9 +1,10 @@ import os -from dotenv import load_dotenv + from beast_logger import print_dict +from dotenv import load_dotenv -def get_runtime_env(is_trinity: bool = False) -> dict: +def get_runtime_env(is_trinity: bool = False) -> dict: if os.path.exists(".env"): load_dotenv(".env") @@ -29,9 +30,7 @@ def get_runtime_env(is_trinity: bool = False) -> dict: if os.getenv("BEST_LOGGER_WEB_SERVICE_URL"): runtime_env["env_vars"].update( { - "BEST_LOGGER_WEB_SERVICE_URL": os.getenv( - "BEST_LOGGER_WEB_SERVICE_URL", "" - ), + "BEST_LOGGER_WEB_SERVICE_URL": os.getenv("BEST_LOGGER_WEB_SERVICE_URL", ""), } ) @@ -39,4 +38,4 @@ def get_runtime_env(is_trinity: bool = False) -> dict: assert "ASTUNE_CONFIG_REDIRECT" in runtime_env["env_vars"] print_dict(runtime_env["env_vars"], "runtime_env") - return runtime_env \ No newline at end of file + return runtime_env diff --git a/astune/utils/env_service_client/em_client.py b/astune/utils/env_service_client/em_client.py index eb3c2120..e1de176d 100644 --- a/astune/utils/env_service_client/em_client.py +++ b/astune/utils/env_service_client/em_client.py @@ -5,7 +5,7 @@ from loguru import logger from pydantic import Field -from astune.schema.trajectory import Trajectory, Reward +from astune.schema.trajectory import Reward, Trajectory from astune.utils.http_client import HttpClient @@ -18,7 +18,7 @@ def call_context_generator( trajectory: Trajectory, retrieve_top_k: int = 1, workspace_id: str = "default", - **kwargs + **kwargs, ) -> str: start_time = time.time() self.url = self.base_url + "/context_generator" diff --git a/astune/utils/env_service_client/env_client.py b/astune/utils/env_service_client/env_client.py index 56656537..19cf217a 100644 --- a/astune/utils/env_service_client/env_client.py +++ b/astune/utils/env_service_client/env_client.py @@ -1,5 +1,5 @@ # env_client.py -from typing import Dict, List, Any +from typing import Any, Dict, List import requests diff --git a/astune/utils/env_service_client/env_client_ng.py b/astune/utils/env_service_client/env_client_ng.py index e53dc3ac..b906b11b 100644 --- a/astune/utils/env_service_client/env_client_ng.py +++ b/astune/utils/env_service_client/env_client_ng.py @@ -1,11 +1,12 @@ # env_client.py -from typing import Dict, List, Any, Optional, Callable -import requests -import time -import random import os +import random +import time from datetime import datetime +from typing import Any, Callable, Dict, List, Optional + +import requests LOG_PATH = os.environ.get("CLIENT_LOG_PATH", "/mnt/data/eric.czq/rl_log/error.out") diff --git a/astune/utils/http_client.py b/astune/utils/http_client.py index 9a8d7f54..99b74fa2 100644 --- a/astune/utils/http_client.py +++ b/astune/utils/http_client.py @@ -49,7 +49,6 @@ def _request( stream: bool = False, http_enum: str = "post", ): - if http_enum == "post": response: requests.Response = self._client.post( url=self.url, @@ -92,7 +91,6 @@ def request( http_enum: str = "post", **kwargs, ): - retry_sleep_time = self.retry_sleep_time for i in range(self.retry_max_count): try: @@ -136,7 +134,6 @@ def request_stream( http_enum: str = "post", **kwargs, ): - retry_sleep_time = self.retry_sleep_time for i in range(self.retry_max_count): try: diff --git a/astune/utils/launch_utils.py b/astune/utils/launch_utils.py index efbf6209..3970e557 100644 --- a/astune/utils/launch_utils.py +++ b/astune/utils/launch_utils.py @@ -1,15 +1,18 @@ -import subprocess import argparse +import os import shutil -import yaml -import time +import subprocess import sys -import os -from loguru import logger +import time + +import yaml from beast_logger import print_dict +from loguru import logger + from astune.utils.config_utils import align_parameters from astune.utils.smart_daemon import LaunchCommandWhenAbsent + def launch_logview(exp_name=None): """ Launch the log viewer service and open the web browser to view logs. @@ -33,6 +36,7 @@ def launch_logview(exp_name=None): ) try: import webbrowser + time.sleep(2.5) webbrowser.open("http://127.0.0.1:8181/") except Exception as e: @@ -49,7 +53,7 @@ def start_ray_service(args, env): """ # 获取当前 Python 解释器目录 python_dir = os.path.dirname(sys.executable) - ray_path = os.path.join(python_dir, 'ray') + ray_path = os.path.join(python_dir, "ray") companion = LaunchCommandWhenAbsent( full_argument_list=[f"{ray_path} start --head --block"], dir="./", @@ -63,7 +67,6 @@ def start_ray_service(args, env): ) - def execute_training_process( args, backbone_target, @@ -86,13 +89,11 @@ def execute_training_process( """ # Fixed config asset locations - TRINITY_BOOT_YAML = \ - "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED - TRINITY_CONFIG_AUTO_CONVERSION = \ + TRINITY_BOOT_YAML = "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED + TRINITY_CONFIG_AUTO_CONVERSION = ( "astune/default_config/trinity/config_auto_convertion_trinity.json" - VERL_CONFIG_AUTO_CONVERSION = \ - "astune/default_config/verl/config_auto_convertion_verl.json" - + ) + VERL_CONFIG_AUTO_CONVERSION = "astune/default_config/verl/config_auto_convertion_verl.json" # let's begin the training process if args.backbone == "trinity": @@ -141,11 +142,13 @@ def execute_training_process( try: logger.info(f"Running command: {' '.join(cmd)}") - print_dict({ - "Running Command": ' '.join(cmd), - "Experiment Base": exe_exp_base, - "YAML Config": exe_yaml_path, - }) + print_dict( + { + "Running Command": " ".join(cmd), + "Experiment Base": exe_exp_base, + "YAML Config": exe_yaml_path, + } + ) subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) except subprocess.CalledProcessError as e: logger.error(f"Error running subprocess: {e}") diff --git a/astune/utils/logger.py b/astune/utils/logger.py index b48e5a07..21b405d8 100644 --- a/astune/utils/logger.py +++ b/astune/utils/logger.py @@ -1,2 +1 @@ import os - diff --git a/astune/utils/message.py b/astune/utils/message.py index 03ed6d2a..3ce4f431 100644 --- a/astune/utils/message.py +++ b/astune/utils/message.py @@ -1,4 +1,6 @@ -import requests, os +import os + +import requests def send_train_message(message: str): diff --git a/astune/utils/model_merger.py b/astune/utils/model_merger.py index 9ca16f35..1c7da4b3 100644 --- a/astune/utils/model_merger.py +++ b/astune/utils/model_merger.py @@ -67,7 +67,6 @@ from torch.distributed._tensor import DTensor from tqdm import tqdm - from verl.utils import hf_processor, hf_tokenizer diff --git a/astune/utils/process_dataset.py b/astune/utils/process_dataset.py index 1ddf3f02..a5fb7962 100644 --- a/astune/utils/process_dataset.py +++ b/astune/utils/process_dataset.py @@ -12,16 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -import torch import time +from typing import Any, Dict, List, Optional, Union + import datasets +import torch from datasets import Dataset from omegaconf import DictConfig from torch.utils.data import Dataset as TorchDataset from torch.utils.data import RandomSampler, SequentialSampler -from verl.utils.import_utils import load_extern_type from verl.experimental.dataset.sampler import AbstractSampler -from typing import List, Optional, Union, Dict, Any +from verl.utils.import_utils import load_extern_type def create_rl_sampler( diff --git a/astune/utils/process_manager.py b/astune/utils/process_manager.py index b19f9e2c..4705ee17 100644 --- a/astune/utils/process_manager.py +++ b/astune/utils/process_manager.py @@ -1,11 +1,11 @@ -import subprocess import argparse -import shutil -import time -import sys import os -import signal import shlex +import shutil +import signal +import subprocess +import sys +import time def _replace_placeholder_in_config(config_obj, placeholder: str, replacement: str): diff --git a/astune/utils/pty.py b/astune/utils/pty.py index f46f76d1..6b10696d 100644 --- a/astune/utils/pty.py +++ b/astune/utils/pty.py @@ -1,7 +1,6 @@ +import base64 import os import pty -import base64 - def run_command_with_pty(cmd, working_dir, env_dict): @@ -98,6 +97,7 @@ def pty_wrapper_final(human_cmd, dir, env_dict): def pty_launch(service_name: str, success_std_string="Starting server on"): from astune.utils.smart_daemon import LaunchCommandWhenAbsent + service_path = os.environ.get(f"{service_name.upper()}_PATH") service_script = os.environ.get(f"{service_name.upper()}_SCRIPT") if service_path is None or service_script is None: @@ -114,8 +114,6 @@ def pty_launch(service_name: str, success_std_string="Starting server on"): ) - - if __name__ == "__main__": import argparse import json diff --git a/astune/utils/retry.py b/astune/utils/retry.py index 9fe68d58..2c8b3e82 100644 --- a/astune/utils/retry.py +++ b/astune/utils/retry.py @@ -1,9 +1,11 @@ import time from functools import wraps from typing import Any, Callable, Literal, Optional, TypeVar -from astune.utils.testing_utils import GoodbyeException, TestFailException + from loguru import logger +from astune.utils.testing_utils import GoodbyeException, TestFailException + T = TypeVar("T") diff --git a/astune/utils/robust_dashscope.py b/astune/utils/robust_dashscope.py index a529a171..3ac09515 100644 --- a/astune/utils/robust_dashscope.py +++ b/astune/utils/robust_dashscope.py @@ -1,10 +1,11 @@ +import asyncio +import os import random import time -import os -import asyncio from textwrap import dedent -from loguru import logger + from agentscope.model import DashScopeChatModel +from loguru import logger class RobustDashScopeChatModel(DashScopeChatModel): diff --git a/astune/utils/smart_daemon.py b/astune/utils/smart_daemon.py index d30e9593..be56a797 100644 --- a/astune/utils/smart_daemon.py +++ b/astune/utils/smart_daemon.py @@ -1,15 +1,16 @@ -import os -import sys -import psutil -import subprocess import hashlib -import time import json import logging -from loguru import logger +import os +import subprocess +import sys +import time from pathlib import Path -from typing import Optional, Tuple, List +from typing import List, Optional, Tuple + +import psutil from beast_logger import print_dict +from loguru import logger class LaunchWhenAbsent: @@ -204,11 +205,13 @@ def launch( raise NotImplementedError("Windows support is not implemented yet.") else: # Unix-like systems # Use nohup and redirect output - print_dict({ - "Action": "Launching command", - "Command": " ".join(self.cmd), - "LogFile": str(log_file), - }) + print_dict( + { + "Action": "Launching command", + "Command": " ".join(self.cmd), + "LogFile": str(log_file), + } + ) # logger.warning("\nlaunching: " + " ".join(self.cmd)) # logger.warning(f"\nlogging to {log_file}\n") # Open log file @@ -314,11 +317,13 @@ def string_to_base64(s): ) logger.success(f"Successfully launched {self.cmd} with PID {proc.pid}") - print_dict({ - "Result": "Successfully launched", - "Command": " ".join(self.cmd), - "PID": proc.pid, - }) + print_dict( + { + "Result": "Successfully launched", + "Command": " ".join(self.cmd), + "PID": proc.pid, + } + ) except Exception as e: logging.error(f"Error launching script: {e}") diff --git a/astune/utils/testing_utils.py b/astune/utils/testing_utils.py index 34eadddc..f3602d78 100644 --- a/astune/utils/testing_utils.py +++ b/astune/utils/testing_utils.py @@ -1,24 +1,33 @@ from astune.utils.dynamic_import import dynamic_import + def get_test_lambda(test_name): test_cls = dynamic_import(test_name)() - print('using test lambda:', test_name) + print("using test lambda:", test_name) return test_cls + def _test_if_test_mode(key, value, config): - if not config.astune.execute_test: return - if config.astune.execute_test == 'do_not_test': return + if not config.astune.execute_test: + return + if config.astune.execute_test == "do_not_test": + return test_lambda = get_test_lambda(config.astune.execute_testing_lambda) return test_lambda(key, value) + def _mock_if_test_mode(key, value, config): - if not config.astune.execute_test: return value - if config.astune.execute_test == 'do_not_test': return value + if not config.astune.execute_test: + return value + if config.astune.execute_test == "do_not_test": + return value test_lambda = get_test_lambda(config.astune.execute_testing_lambda) return test_lambda.mock(key) + class GoodbyeException(Exception): pass + class TestFailException(Exception): - pass \ No newline at end of file + pass diff --git a/astune/utils/tokenizer.py b/astune/utils/tokenizer.py index db7827fc..453edbab 100644 --- a/astune/utils/tokenizer.py +++ b/astune/utils/tokenizer.py @@ -1,20 +1,20 @@ import copy import json -from typing import List, Dict +from typing import Dict, List def cleanup_messages(messages: List[Dict]) -> List[Dict]: - " A temperary fix for tool_calls being str instead of dict " + "A temperary fix for tool_calls being str instead of dict" messages_copied = copy.deepcopy(messages) for m in messages_copied: - if 'tool_calls' not in m: + if "tool_calls" not in m: continue - for t in m['tool_calls']: - if 'function' not in t or 'arguments' not in t['function']: + for t in m["tool_calls"]: + if "function" not in t or "arguments" not in t["function"]: continue - if isinstance(t['function']['arguments'], str): + if isinstance(t["function"]["arguments"], str): try: - t['function']['arguments'] = json.loads(t['function']['arguments']) + t["function"]["arguments"] = json.loads(t["function"]["arguments"]) except: pass return messages_copied diff --git a/astune/utils/utils.py b/astune/utils/utils.py index 446f8a14..8b510114 100644 --- a/astune/utils/utils.py +++ b/astune/utils/utils.py @@ -1,7 +1,7 @@ -from typing import Any, List, Dict import asyncio -import copy import concurrent.futures +import copy +from typing import Any, Dict, List # apply chat_template to a message, and then convert back to message diff --git a/astune/workflow.py b/astune/workflow.py index cfeed988..b3175069 100644 --- a/astune/workflow.py +++ b/astune/workflow.py @@ -1,11 +1,12 @@ from typing import List + from pydantic import BaseModel, Field + from astune import ModelTuner -from astune.schema.task import WorkflowTask, WorkflowOutput +from astune.schema.task import WorkflowOutput, WorkflowTask class Workflow(BaseModel): - model_config = {"extra": "allow"} name: str = Field(default="default_workflow", description="Name of the workflow.") trainable_targets: List[str] = Field(default=[], description="List of agents to be fine-tuned.") diff --git a/astune_tests/test_apply_chat_template.py b/astune_tests/test_apply_chat_template.py deleted file mode 100644 index e69de29b..00000000 diff --git a/astune_tests/test_apply_chat_template/agentscope_for_test.py b/astune_tests/test_apply_chat_template/agentscope_for_test.py index 40d45b04..f7e8e032 100644 --- a/astune_tests/test_apply_chat_template/agentscope_for_test.py +++ b/astune_tests/test_apply_chat_template/agentscope_for_test.py @@ -1,9 +1,11 @@ -from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput -from astune.utils.testing_utils import GoodbyeException, TestFailException from agentscope.message import Msg -from pydantic import BaseModel, Field -from loguru import logger from beast_logger import print_dict +from loguru import logger +from pydantic import BaseModel, Field + +from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from astune.utils.testing_utils import GoodbyeException, TestFailException + def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" @@ -39,7 +41,6 @@ class FinalResult(BaseModel): class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" async def agentscope_execute( @@ -74,13 +75,15 @@ def __init__(self): def __call__(self, key, value): if key == "prompt_text": - expected = '<|im_start|>system\n\nYou are an agent specialized in solving math problems with tools.\nPlease solve the math problem given to you.\nYou can write and execute Python code to perform calculation or verify your answer.\nYou should return your final answer within \\boxed{{}}.\n\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n\n{"type": "function", "function": {"name": "execute_python_code", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}, "description": "Execute the given python code in a temp file and capture the return\\n\\ncode, standard output and error. Note you must `print` the output to get\\nthe result, and the tmp file will be removed right after the execution."}}\n{"type": "function", "function": {"name": "generate_response", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\\\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}, "description": "Generate a response. Note only the input argument `response` is\\n\\nvisible to the others, you should include all the necessary\\ninformation in the `response` argument."}}\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{"name": , "arguments": }\n<|im_end|>\n<|im_start|>user\nA robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?<|im_end|>\n<|im_start|>assistant\n' + expected = '<|im_start|>system\n\nYou are an agent specialized in solving math problems with tools.\nPlease solve the math problem given to you.\nYou can write and execute Python code to perform calculation or verify your answer.\nYou should return your final answer within \\boxed{{}}.\n\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n\n{"type": "function", "function": {"name": "execute_python_code", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}, "description": "Execute the given python code in a temp file and capture the return\\n\\ncode, standard output and error. Note you must `print` the output to get\\nthe result, and the tmp file will be removed right after the execution."}}\n{"type": "function", "function": {"name": "generate_response", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\\\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}, "description": "Generate a response. Note only the input argument `response` is\\n\\nvisible to the others, you should include all the necessary\\ninformation in the `response` argument."}}\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{"name": , "arguments": }\n<|im_end|>\n<|im_start|>user\nA robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?<|im_end|>\n<|im_start|>assistant\n' if value != expected: - print_dict({ - "expected": expected, - "value": value, - "key": key, - }) + print_dict( + { + "expected": expected, + "value": value, + "key": key, + } + ) raise TestFailException("Prompt text does not match expected value.") elif key == "parsed_tool_calls": if len(value) > 0: @@ -94,4 +97,4 @@ def mock(self, key): if key == "mock_decoded_text": return 'To find the total number of bolts needed for the robe, we need to add the number of blue fiber bolts to the number of white fiber bolts. According to the problem, a robe takes 2 bolts of blue fiber and half that much white fiber. Therefore, the number of white fiber bolts is half of 2, which is 1. \n\nLet\'s calculate the total number of bolts.\n\n{"name": "execute_python_code", "arguments": {"code": "blue_fiber_bolts = 2\\nwhite_fiber_bolts = blue_fiber_bolts / 2\\ntotal_bolts = blue_fiber_bolts + white_fiber_bolts\\ntotal_bolts"}}\n\nresponse = "The total number of bolts needed for the robe is {}."\nresult = "\\\\boxed{3}"\n\n{"name": "generate_response", "arguments": {"response": "The total number of bolts needed for the robe is 3.", "result": "\\\\boxed{3}"}}\n<|im_end|>' else: - raise TestFailException(f"Unrecognized mock key: {key}") \ No newline at end of file + raise TestFailException(f"Unrecognized mock key: {key}") diff --git a/astune_tests/test_tracing.py b/astune_tests/test_tracing.py index 53b843a2..badd02b7 100644 --- a/astune_tests/test_tracing.py +++ b/astune_tests/test_tracing.py @@ -4,8 +4,8 @@ import pytest -from astune.task_reader.tracing_reader import TracingReader from astune.schema.task import Task +from astune.task_reader.tracing_reader import TracingReader @pytest.fixture diff --git a/astune_tests/test_tracing_reader.py b/astune_tests/test_tracing_reader.py index 347220b4..c31e0a25 100644 --- a/astune_tests/test_tracing_reader.py +++ b/astune_tests/test_tracing_reader.py @@ -1,9 +1,11 @@ -import pytest from pathlib import Path from types import SimpleNamespace from typing import List -from astune.task_reader.tracing_reader import TracingReader + +import pytest + from astune.schema.task import Task +from astune.task_reader.tracing_reader import TracingReader class DummyConnector: @@ -68,8 +70,8 @@ def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: import pytest -from astune.task_reader.tracing_reader import TracingReader from astune.schema.task import Task +from astune.task_reader.tracing_reader import TracingReader @pytest.fixture diff --git a/astune_tests/testing_rubrics.py b/astune_tests/testing_rubrics.py index ced4408e..343bfacb 100644 --- a/astune_tests/testing_rubrics.py +++ b/astune_tests/testing_rubrics.py @@ -1,18 +1,14 @@ -import pytest import json from pathlib import Path -from typing import List -from astune.task_reader.tracing_reader import TracingReader -from astune.schema.task import Task, WorkflowTask, WorkflowOutput -from pathlib import Path from types import SimpleNamespace from typing import List -from astune.task_reader.tracing_reader import TracingReader -from astune.schema.task import Task -from astune.utils.config_utils import read_astune_config -from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge +import pytest +from astune.schema.task import Task, WorkflowOutput, WorkflowTask +from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge +from astune.task_reader.tracing_reader import TracingReader +from astune.utils.config_utils import read_astune_config # @pytest.fixture # def config(tmp_path: Path) -> SimpleNamespace: @@ -48,6 +44,7 @@ # } # return a + def create_math_reference_samples(num_samples: int = 10) -> List[WorkflowTask]: """ Create reference math problem samples for Pointwise rubric generation. @@ -77,10 +74,7 @@ def create_math_reference_samples(num_samples: int = 10) -> List[WorkflowTask]: task = Task( main_query=query, task_id=f"ref_sample_{i}", - metadata={ - "answer": answer, - "score": score # Pointwise label - } + metadata={"answer": answer, "score": score}, # Pointwise label ) workflow_task = WorkflowTask( @@ -92,6 +86,7 @@ def create_math_reference_samples(num_samples: int = 10) -> List[WorkflowTask]: return samples + def create_math_test_samples(num_samples: int = 5) -> List[tuple[WorkflowTask, WorkflowOutput]]: """Create test samples (task + output pairs) for evaluation.""" samples = [] @@ -118,20 +113,14 @@ def create_math_test_samples(num_samples: int = 5) -> List[tuple[WorkflowTask, W for i in range(min(num_samples, len(test_cases))): query, reference, model_output, _ = test_cases[i] - task = Task( - main_query=query, - task_id=f"test_sample_{i}", - metadata={"answer": reference} - ) + task = Task(main_query=query, task_id=f"test_sample_{i}", metadata={"answer": reference}) workflow_task = WorkflowTask( task_id=f"test_sample_{i}", task=task, ) - workflow_output = WorkflowOutput( - metadata={"final_answer": model_output} - ) + workflow_output = WorkflowOutput(metadata={"final_answer": model_output}) samples.append((workflow_task, workflow_output)) @@ -176,4 +165,5 @@ async def test_get_training_tasks_new_file(): import asyncio -asyncio.run(test_get_training_tasks_new_file()) \ No newline at end of file + +asyncio.run(test_get_training_tasks_new_file()) diff --git a/docs/_config.yml b/docs/_config.yml index c652b99f..cf830004 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -125,4 +125,4 @@ sphinx: color-admonition-background: "#f8f9fa" dark_css_variables: color-brand-primary: "#64b5f6" - color-brand-content: "#64b5f6" \ No newline at end of file + color-brand-content: "#64b5f6" diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 57710750..80442e9f 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -202,4 +202,4 @@ body[data-current-lang="zh"] { flex-direction: column; align-items: center; line-height: 0.6; -} \ No newline at end of file +} diff --git a/docs/_toc.yml b/docs/_toc.yml index 0baf13a5..9e13f5fc 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -26,4 +26,4 @@ parts: sections: - file: zh/example_math_agent.md - file: zh/example_app_world.md - - file: zh/example_werewolves.md \ No newline at end of file + - file: zh/example_werewolves.md diff --git a/docs/en/concepts.md b/docs/en/concepts.md index b432317a..a4ac67d0 100644 --- a/docs/en/concepts.md +++ b/docs/en/concepts.md @@ -1,2 +1 @@ # Basic Concepts - diff --git a/docs/en/convert_workflow.md b/docs/en/convert_workflow.md index 6a13ae6d..834a6135 100644 --- a/docs/en/convert_workflow.md +++ b/docs/en/convert_workflow.md @@ -1,2 +1,2 @@ -# AgentScope workflow \ No newline at end of file +# AgentScope workflow diff --git a/docs/en/example.md b/docs/en/example.md index 96162417..66380191 100644 --- a/docs/en/example.md +++ b/docs/en/example.md @@ -1,3 +1,3 @@ # Examples -This section provides practical examples of how to use AgentScope Tuner in various scenarios. \ No newline at end of file +This section provides practical examples of how to use AgentScope Tuner in various scenarios. diff --git a/docs/en/introduction.md b/docs/en/introduction.md index bcd2cc04..3332d278 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -125,6 +125,3 @@ Working in progress: - Support training with multiple models - Optimize configurations for long-context adaptation on smaller GPUs - Add LoRA training examples - - - diff --git a/docs/logo.svg b/docs/logo.svg index e781d9c8..f4b49456 100644 --- a/docs/logo.svg +++ b/docs/logo.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/docs/zh/concepts.md b/docs/zh/concepts.md index b432317a..a4ac67d0 100644 --- a/docs/zh/concepts.md +++ b/docs/zh/concepts.md @@ -1,2 +1 @@ # Basic Concepts - diff --git a/docs/zh/example.md b/docs/zh/example.md index 96162417..66380191 100644 --- a/docs/zh/example.md +++ b/docs/zh/example.md @@ -1,3 +1,3 @@ # Examples -This section provides practical examples of how to use AgentScope Tuner in various scenarios. \ No newline at end of file +This section provides practical examples of how to use AgentScope Tuner in various scenarios. diff --git a/documents/vllm_tokenizer.py b/documents/vllm_tokenizer.py index c333415f..2d66c4b7 100644 --- a/documents/vllm_tokenizer.py +++ b/documents/vllm_tokenizer.py @@ -7,7 +7,6 @@ import pytest from mistral_common.tokens.tokenizers.base import SpecialTokenPolicy - from vllm.assets.audio import AudioAsset from vllm.assets.image import ImageAsset from vllm.assets.video import VideoAsset diff --git a/launcher.py b/launcher.py index d57444b0..87edfb0d 100644 --- a/launcher.py +++ b/launcher.py @@ -1,17 +1,24 @@ -import subprocess import argparse +import os import shutil -import yaml -import time +import subprocess import sys -import os +import time + +import yaml +from dotenv import load_dotenv from loguru import logger -from astune.utils.pty import pty_launch + from astune.utils.cleaner import fast_kill_by_keyword_bash -from astune.utils.smart_daemon import LaunchCommandWhenAbsent from astune.utils.config_utils import prepare_experiment_config -from astune.utils.launch_utils import start_ray_service, launch_logview, execute_training_process -from dotenv import load_dotenv +from astune.utils.launch_utils import ( + execute_training_process, + launch_logview, + start_ray_service, +) +from astune.utils.pty import pty_launch +from astune.utils.smart_daemon import LaunchCommandWhenAbsent + load_dotenv() @@ -89,7 +96,6 @@ def parse_args(): return parser.parse_args() - def check_debugpy_version(): try: import debugpy @@ -101,6 +107,7 @@ def check_debugpy_version(): ) version = getattr(debugpy, "__version__", "0.0.0") from packaging import version as packaging_version + if packaging_version.parse(version) < packaging_version.parse("1.8.0"): raise RuntimeError( f"debugpy version {version} is too old. " @@ -220,12 +227,12 @@ def main(): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.debug env["RAY_record_task_actor_creation_sites"] = "true" - assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore + assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") if args.conf: - assert exp_config["astune"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore + assert exp_config["astune"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": env["ASTUNE_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore @@ -271,7 +278,6 @@ def main(): ) - if __name__ == "__main__": check_debugpy_version() main() diff --git a/scripts/converter_hf_to_mcore.py b/scripts/converter_hf_to_mcore.py index e7061083..7f315f62 100644 --- a/scripts/converter_hf_to_mcore.py +++ b/scripts/converter_hf_to_mcore.py @@ -22,11 +22,8 @@ from megatron.core import parallel_state as mpu from megatron.core.dist_checkpointing.serialization import StrictHandling from megatron.core.models.gpt.gpt_model import ModelType -from megatron.core.tensor_parallel.random import ( - model_parallel_cuda_manual_seed, -) +from megatron.core.tensor_parallel.random import model_parallel_cuda_manual_seed from transformers import AutoConfig, AutoModelForCausalLM - from verl.models.mcore import hf_to_mcore_config from verl.utils.megatron_utils import get_model @@ -355,9 +352,7 @@ def megatron_model_provider(pre_process, post_process): convert_checkpoint_from_transformers_to_megatron(hf_model, model[0].module, hf_config) else: assert not use_cpu_initialization, "use_cpu_initialization is only supported for MoE model" - from verl.models.mcore.loader import ( - load_state_dict_to_megatron_gptmodel, - ) + from verl.models.mcore.loader import load_state_dict_to_megatron_gptmodel load_state_dict_to_megatron_gptmodel( state_dict=hf_state_dict, diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py index b0e4962d..51e31100 100644 --- a/scripts/deploy_model.py +++ b/scripts/deploy_model.py @@ -1,12 +1,12 @@ import argparse -import torch import os import sys +import torch + sys.path.append(os.getcwd()) from astune.utils.smart_daemon import LaunchCommandWhenAbsent - parser = argparse.ArgumentParser(description="deploy Hugging Face model") parser.add_argument( "--target", @@ -19,7 +19,6 @@ def companion_launch(): - print("Launching companion process for async LLM server...") model_path = args.target n_avail_gpus = torch.cuda.device_count() diff --git a/scripts/download_dataset.py b/scripts/download_dataset.py index 26805221..07c1aa0a 100644 --- a/scripts/download_dataset.py +++ b/scripts/download_dataset.py @@ -4,6 +4,7 @@ import argparse import glob import time + from huggingface_hub import snapshot_download parser = argparse.ArgumentParser(description="download Hugging Face dataset") diff --git a/scripts/download_model.py b/scripts/download_model.py index 79f74668..da48f069 100644 --- a/scripts/download_model.py +++ b/scripts/download_model.py @@ -1,9 +1,8 @@ ms = input("modelscope ? (Y/n)") if ms == "Y" or ms == "y": - - from modelscope import snapshot_download from loguru import logger + from modelscope import snapshot_download cache_dir = input("model path ( /mnt/data/model_cache/modelscope/hub/Qwen ): ").strip() if not cache_dir: @@ -12,7 +11,6 @@ logger.success(res) else: - import os import subprocess diff --git a/scripts/model_merger.py b/scripts/model_merger.py index 581cb214..58679a07 100644 --- a/scripts/model_merger.py +++ b/scripts/model_merger.py @@ -66,7 +66,6 @@ from torch.distributed._tensor import DTensor from tqdm import tqdm - from verl.utils import hf_processor, hf_tokenizer diff --git a/setup.py b/setup.py index 87add39e..c3e1899f 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup, find_packages +from setuptools import find_packages, setup setup( name="astune", # Change this to your package name diff --git a/test_launcher.py b/test_launcher.py index f2051aab..b92ac34e 100644 --- a/test_launcher.py +++ b/test_launcher.py @@ -1,12 +1,14 @@ import os import subprocess import sys + from beast_logger import print_dict TEST_TARGET = "astune_tests/test_apply_chat_template/test.yaml" cmd = [sys.executable, "launcher.py", "--conf", TEST_TARGET, "--backbone", "verl"] from astune.utils.smart_daemon import LaunchCommandWhenAbsent + service_path = os.path.dirname(__file__) companion = LaunchCommandWhenAbsent( full_argument_list=cmd, @@ -28,7 +30,9 @@ finally: companion.kill_self() -print_dict({ - "TestTarget": TEST_TARGET, - "TestSuccessful": test_successful, -}) +print_dict( + { + "TestTarget": TEST_TARGET, + "TestSuccessful": test_successful, + } +) diff --git a/tests/config_test.py b/tests/config_test.py index 5795bc0e..0d841a67 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -2,11 +2,13 @@ from astune.utils.config_utils import prepare_experiment_config -class TestConfigUtils(unittest.TestCase): +class TestConfigUtils(unittest.TestCase): def test_load_config(self): """A simple test to check if the configuration file is loaded without errors.""" - yaml_backup_dst, exp_base, exp_name, config = prepare_experiment_config('tests/data/config.yaml', "tests/temp", backbone="debug") + yaml_backup_dst, exp_base, exp_name, config = prepare_experiment_config( + "tests/data/config.yaml", "tests/temp", backbone="debug" + ) self.assertEqual(exp_name, "sample") self.assertEqual(exp_base, "tests/temp/sample") self.assertEqual(yaml_backup_dst, "tests/temp/sample/yaml_backup.yaml") @@ -16,5 +18,3 @@ def test_load_config(self): self.assertIn("experiment_name", config["astune"]) self.assertEqual(config["astune"]["experiment_name"], "sample") self.assertIn("task_reader", config["astune"]) - - diff --git a/tests/data_gen.py b/tests/data_gen.py index 39f180ac..65cb7d7e 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -1,25 +1,28 @@ import os -import yaml import unittest -import dotenv; dotenv.load_dotenv() -from tqdm import tqdm + +import dotenv +import yaml + +dotenv.load_dotenv() from loguru import logger -from astune.utils.config_utils import read_astune_config -from astune.task_reader import TaskReaderRouterV2 -from astune.task_reader.document_reader.doc_reader import DocReader +from tqdm import tqdm + from astune.data_generator.knowledge_augmentation import KnowledgeAugmentor from astune.data_generator.task_augmentation import TaskAugmentor +from astune.task_reader import TaskReaderRouterV2 +from astune.task_reader.document_reader.doc_reader import DocReader +from astune.utils.config_utils import read_astune_config class TestConfigUtils(unittest.TestCase): - def test_data_gen_main(self): try: - config = read_astune_config('tests/data_gen.yaml') + config = read_astune_config("tests/data_gen.yaml") task_reader = TaskReaderRouterV2( reader_type=config.astune.data_generator.reader.type, - reader_config=config.astune.data_generator.reader + reader_config=config.astune.data_generator.reader, ) Tasks = task_reader.get_training_tasks() Tasks = Tasks[:5] diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index 879adb8a..19fcdafb 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -4,8 +4,8 @@ import pytest -from astune.task_reader.tracing_reader import TracingReader from astune.schema.task import Task +from astune.task_reader.tracing_reader import TracingReader class DummyConnector: @@ -13,7 +13,9 @@ def __init__(self, tasks: List[Task]): self._tasks = tasks self.called = 0 - def load_tasks_from_conversation(self, projects_limit: int = 100, spans_limit: int = 100) -> List[Task]: + def load_tasks_from_conversation( + self, projects_limit: int = 100, spans_limit: int = 100 + ) -> List[Task]: self.called += 1 return self._tasks @@ -57,7 +59,7 @@ def test_get_training_tasks_new_file(config: dict): connector = DummyConnector(tasks) flt = DummyFilter(kept=tasks) - reader = TracingReader(config) # type: ignore + reader = TracingReader(config) # type: ignore reader._connector = connector # type: ignore[attr-defined] reader._filters = [flt] # type: ignore[attr-defined] @@ -100,7 +102,7 @@ def test_get_training_tasks_dedup_and_missing_hash_ignored(config: dict): flt = DummyFilter(kept=[new]) connector = DummyConnector(connector_tasks) - reader = TracingReader(config) # type: ignore + reader = TracingReader(config) # type: ignore reader._connector = connector # type: ignore[attr-defined] reader._filters = [flt] # type: ignore[attr-defined] diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py index d4df9256..004d893e 100644 --- a/tutorial/example_appworld/appworld.py +++ b/tutorial/example_appworld/appworld.py @@ -1,10 +1,10 @@ -from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from pydantic import Field +from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask -class ExampleAgentScopeLearnProtocol(Workflow): +class ExampleAgentScopeLearnProtocol(Workflow): trainer: str = Field(default="astune-trinity") async def agentscope_execute( diff --git a/tutorial/example_feedback_tracing/README.md b/tutorial/example_feedback_tracing/README.md index 8ced47a2..892f58cd 100644 --- a/tutorial/example_feedback_tracing/README.md +++ b/tutorial/example_feedback_tracing/README.md @@ -43,4 +43,4 @@ python launcher.py --conf tutorial/example_feedback_tracing/example_feedback_tra ## 3. Deploying the New Agent -You can now deploy the newly trained Agent into production, enabling continuous improvement through iterative trace-feedback training. \ No newline at end of file +You can now deploy the newly trained Agent into production, enabling continuous improvement through iterative trace-feedback training. diff --git a/tutorial/example_feedback_tracing/agent_deployed.py b/tutorial/example_feedback_tracing/agent_deployed.py index a395aa33..05b0bbcd 100644 --- a/tutorial/example_feedback_tracing/agent_deployed.py +++ b/tutorial/example_feedback_tracing/agent_deployed.py @@ -1,12 +1,12 @@ import os + +import agentscope from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory from agentscope.message import Msg from agentscope.model import DashScopeChatModel from agentscope.tool import Toolkit, execute_python_code -import agentscope - SYSTEM_PROMPT = """ You are an agent specialized in solving math problems with tools. @@ -17,7 +17,7 @@ def build_agent(): - tool_kit=Toolkit() + tool_kit = Toolkit() tool_kit.register_tool_function(execute_python_code) agent = ReActAgent( @@ -48,6 +48,7 @@ async def main(): print(await agent.reply(Msg("user", inp, role="user"))) -if __name__=='__main__': +if __name__ == "__main__": import asyncio - asyncio.run(main()) \ No newline at end of file + + asyncio.run(main()) diff --git a/tutorial/example_feedback_tracing/train.py b/tutorial/example_feedback_tracing/train.py index 011b8352..19aa0889 100644 --- a/tutorial/example_feedback_tracing/train.py +++ b/tutorial/example_feedback_tracing/train.py @@ -1,16 +1,16 @@ -from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput -from agentscope.message import Msg -from pydantic import BaseModel, Field -from loguru import logger import os + +import agentscope from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory from agentscope.message import Msg from agentscope.model import DashScopeChatModel from agentscope.tool import Toolkit, execute_python_code -import agentscope +from loguru import logger +from pydantic import BaseModel, Field +from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask SYSTEM_PROMPT = """ You are an agent specialized in solving math problems with tools. @@ -39,7 +39,6 @@ def extract_final_answer(result) -> str: return str(result) - class FinalResult(BaseModel): result: str = Field( description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" @@ -49,12 +48,14 @@ class FinalResult(BaseModel): class ExampleTracingFeedbackTrain(Workflow): name: str = "tracing_feedback_train" - async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def agentscope_execute( + self, workflow_task: WorkflowTask, model_tuner: ModelTuner + ) -> WorkflowOutput: query = workflow_task.task.main_query - - tool_kit=Toolkit() + + tool_kit = Toolkit() tool_kit.register_tool_function(execute_python_code) - + agent = ReActAgent( name="Qwen", sys_prompt=SYSTEM_PROMPT, @@ -64,9 +65,8 @@ async def agentscope_execute(self, workflow_task: WorkflowTask, model_tuner: Mod toolkit=tool_kit, print_hint_msg=False, ) - + msg = Msg("user", query, role="user") result = await agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) - diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index b62b78ec..72572c59 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -1,7 +1,8 @@ -from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg -from pydantic import BaseModel, Field from loguru import logger +from pydantic import BaseModel, Field + +from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -23,7 +24,6 @@ def extract_final_answer(result) -> str: return str(result) - system_prompt = """ You are an agent specialized in solving math problems with tools. Please solve the math problem given to you. @@ -33,7 +33,6 @@ def extract_final_answer(result) -> str: class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" async def agentscope_execute( diff --git a/tutorial/example_rm_auto_grader/config.md b/tutorial/example_rm_auto_grader/config.md index 7a7499e7..4427e6d6 100644 --- a/tutorial/example_rm_auto_grader/config.md +++ b/tutorial/example_rm_auto_grader/config.md @@ -133,4 +133,3 @@ astune: # query_field: "main_query" # answer_field: "agent_output" # reference_field: "expected_outcome" - diff --git a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py index 00d8300d..c39fc67d 100644 --- a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py +++ b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py @@ -12,89 +12,90 @@ import asyncio from typing import List -from astune.workflow import Workflow, WorkflowTask, WorkflowOutput from astune.schema.task import Task from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge +from astune.workflow import Workflow, WorkflowOutput, WorkflowTask # ============================================ # Example 1: Pre-generated Rubrics Approach # ============================================ + async def example_pregerated_rubrics(): """ Example of using RMAutoGraderJudge with pre-generated rubrics. - + This approach is suitable when you have a separate set of reference samples and want to generate rubrics once before training begins. """ print("=" * 60) print("Example 1: Pre-generated Rubrics Approach") print("=" * 60) - + # Mock config object class MockConfig: class Astune: class TaskJudge: # Model configuration model_name = "qwen3-32b" - + # Grader configuration grader_mode = "pointwise" language = "en" min_score = 0 max_score = 1 success_threshold = 0.7 - + # Rubric generation configuration sampling_mode = "all_samples" generate_number = 1 max_epochs = 2 max_retries = 3 aggregation_mode = "keep_all" - + # Field mappings query_field = "main_query" answer_field = "final_answer" reference_field = "answer" - + grader_name = "Math Auto Grader" - + task_judge = TaskJudge() - + astune = Astune() - + config = MockConfig() - + # Step 1: Create reference samples for rubric generation print("\nStep 1: Creating reference samples...") reference_samples = create_math_reference_samples(num_samples=10) print(f"Created {len(reference_samples)} reference samples") - + # Step 2: Initialize judge print("\nStep 2: Initializing RMAutoGraderJudge...") judge = RMAutoGraderJudge(config) - + # Step 3: Generate rubrics from reference samples print("\nStep 3: Generating rubrics from reference samples...") print("(This may take a few minutes depending on the number of samples)") await judge.generate_rubrics_from_samples(reference_samples) print("✓ Rubrics generated successfully!") print(f"\nGenerated rubrics:\n{judge.llm_grader.rubrics}\n") - + # Step 4: Evaluate new samples using generated rubrics print("\nStep 4: Evaluating new samples...") test_samples = create_math_test_samples(num_samples=5) - + for i, (task, output) in enumerate(test_samples, 1): print(f"\n--- Test Sample {i} ---") print(f"Query: {task.task.main_query}") print(f"Answer: {output.metadata['final_answer']}") print(f"Reference: {task.task.metadata['answer']}") - + # Use async method directly since we're in async context reward = await judge._async_compute_reward(task, output) print(f"Result: {reward}") - + print("\n" + "=" * 60) print("Example 1 completed!") print("=" * 60) @@ -104,10 +105,11 @@ class TaskJudge: # Example 2: Listwise Mode with Multiple Outputs # ============================================ + async def example_listwise_mode(): """ Example of using RMAutoGraderJudge in Listwise mode. - + Listwise mode ranks multiple candidate answers for the same query. This is useful for: - Comparing multiple model outputs @@ -117,87 +119,87 @@ async def example_listwise_mode(): print("\n\n" + "=" * 60) print("Example 2: Listwise Mode with Multiple Outputs") print("=" * 60) - + # Mock config object class MockConfig: class Astune: class TaskJudge: # Model configuration model_name = "qwen3-32b" - + # Grader configuration - LISTWISE mode grader_mode = "listwise" # Key difference! language = "en" min_score = 0 max_score = 1 success_threshold = 0.7 - + # Rubric generation configuration sampling_mode = "all_samples" generate_number = 2 max_epochs = 2 max_retries = 3 aggregation_mode = "keep_all" - + # Field mappings query_field = "main_query" answer_field = "final_answer" reference_field = "answer" - + grader_name = "Math Listwise Grader" - + task_judge = TaskJudge() - + astune = Astune() - + config = MockConfig() - + # Step 1: Create reference samples with multiple outputs per query print("\nStep 1: Creating reference samples with multiple outputs...") reference_samples = create_listwise_reference_samples(num_samples=5) print(f"Created {len(reference_samples)} reference samples") print("Each sample contains multiple candidate answers with rankings") - + # Step 2: Initialize judge print("\nStep 2: Initializing RMAutoGraderJudge in Listwise mode...") judge = RMAutoGraderJudge(config) - + # Step 3: Generate rubrics from reference samples print("\nStep 3: Generating rubrics from reference samples...") print("(Listwise mode learns to rank multiple outputs)") await judge.generate_rubrics_from_samples(reference_samples) print("✓ Rubrics generated successfully!") print(f"\nGenerated rubrics:\n{judge.llm_grader.rubrics}\n") - + # Step 4: Evaluate multiple candidate answers for new queries print("\nStep 4: Evaluating multiple candidates for each query...") test_queries = create_listwise_test_samples(num_queries=3) - + for i, (query_task, candidate_outputs) in enumerate(test_queries, 1): print(f"\n{'='*50}") print(f"Query {i}: {query_task.task.main_query}") print(f"{'='*50}") print(f"Evaluating {len(candidate_outputs)} candidates...") - + # Evaluate all candidates together (pass list for listwise mode) results_batch = await judge._async_compute_reward(query_task, candidate_outputs) - + if results_batch and len(results_batch) > 0 and len(results_batch[0]) > 0: # Extract ranks for each candidate (score field contains rank in listwise mode) results = [] for j, (output, grader_score) in enumerate(zip(candidate_outputs, results_batch[0]), 1): - rank = grader_score.score if hasattr(grader_score, 'score') else j - results.append((j, output.metadata['final_answer'], rank)) - + rank = grader_score.score if hasattr(grader_score, "score") else j + results.append((j, output.metadata["final_answer"], rank)) + # Sort by rank (ascending, rank 1 is best) results.sort(key=lambda x: x[2]) - + print("\nRanking (best to worst):") for display_rank, (idx, answer, model_rank) in enumerate(results, 1): print(f" {display_rank}. Candidate {idx}: '{answer}' (Model Rank: {model_rank})") else: print("No results returned from evaluation") - + print("\n" + "=" * 60) print("Example 3 completed!") print("=" * 60) @@ -207,14 +209,15 @@ class TaskJudge: # Helper Functions # ============================================ + def create_math_reference_samples(num_samples: int = 10) -> List[WorkflowTask]: """ Create reference math problem samples for Pointwise rubric generation. - + Each sample contains a single answer with a score label. """ samples = [] - + # Simple math problems with answers and scores # Format: (query, answer, score) problems = [ @@ -229,161 +232,180 @@ def create_math_reference_samples(num_samples: int = 10) -> List[WorkflowTask]: ("What is 99 - 33 - 22?", "44", 1), ("Calculate 16 / 4 + 10", "14", 1), ] - + for i in range(min(num_samples, len(problems))): query, answer, score = problems[i] - + task = Task( main_query=query, task_id=f"ref_sample_{i}", - metadata={ - "answer": answer, - "score": score # Pointwise label - } + metadata={"answer": answer, "score": score}, # Pointwise label ) - + workflow_task = WorkflowTask( task_id=f"ref_sample_{i}", task=task, ) - + samples.append(workflow_task) - + return samples def create_listwise_reference_samples(num_samples: int = 5) -> List[WorkflowTask]: """ Create reference samples for Listwise mode rubric generation. - + Each sample should contain multiple outputs with different quality levels. This helps the model learn to distinguish between good and bad answers. """ samples = [] - + # Math problems with multiple candidate answers and their quality rankings # Lower rank = better quality (rank 1 is best) problems = [ - ("What is 10 + 15?", [ - ("25", 1), # Perfect answer - ("Twenty-five", 2), # Correct but different format - ("24", 3), # Close but wrong - ("30", 4), # Wrong - ]), - ("Calculate 6 * 7", [ - ("42", 1), # Perfect - ("6*7=42", 2), # Correct with work shown - ("43", 3), # Off by one - ("36", 4), # Wrong (6*6) - ]), - ("What is 50 - 18?", [ - ("32", 1), # Perfect - ("50-18=32", 2), # Correct with work - ("33", 3), # Close - ("42", 4), # Wrong - ]), - ("Find 12 / 4", [ - ("3", 1), # Perfect - ("3.0", 2), # Correct, decimal format - ("4", 3), # Wrong - ("2", 4), # Very wrong - ]), - ("What is 2^5?", [ - ("32", 1), # Perfect - ("2*2*2*2*2=32", 2), # Correct with work - ("16", 3), # 2^4, common mistake - ("10", 4), # 2*5, wrong operation - ]), + ( + "What is 10 + 15?", + [ + ("25", 1), # Perfect answer + ("Twenty-five", 2), # Correct but different format + ("24", 3), # Close but wrong + ("30", 4), # Wrong + ], + ), + ( + "Calculate 6 * 7", + [ + ("42", 1), # Perfect + ("6*7=42", 2), # Correct with work shown + ("43", 3), # Off by one + ("36", 4), # Wrong (6*6) + ], + ), + ( + "What is 50 - 18?", + [ + ("32", 1), # Perfect + ("50-18=32", 2), # Correct with work + ("33", 3), # Close + ("42", 4), # Wrong + ], + ), + ( + "Find 12 / 4", + [ + ("3", 1), # Perfect + ("3.0", 2), # Correct, decimal format + ("4", 3), # Wrong + ("2", 4), # Very wrong + ], + ), + ( + "What is 2^5?", + [ + ("32", 1), # Perfect + ("2*2*2*2*2=32", 2), # Correct with work + ("16", 3), # 2^4, common mistake + ("10", 4), # 2*5, wrong operation + ], + ), ] - + for i in range(min(num_samples, len(problems))): query, candidates = problems[i] - + # Create task with metadata containing all candidates and their ranks task = Task( main_query=query, task_id=f"listwise_ref_{i}", - metadata={ - "candidates": [{"answer": ans, "rank": rank} for ans, rank in candidates] - } + metadata={"candidates": [{"answer": ans, "rank": rank} for ans, rank in candidates]}, ) - + workflow_task = WorkflowTask( task_id=f"listwise_ref_{i}", task=task, ) - + samples.append(workflow_task) - + return samples -def create_listwise_test_samples(num_queries: int = 3) -> List[tuple[WorkflowTask, List[WorkflowOutput]]]: +def create_listwise_test_samples( + num_queries: int = 3, +) -> List[tuple[WorkflowTask, List[WorkflowOutput]]]: """ Create test queries with multiple candidate outputs for Listwise evaluation. - + Returns: List of (query_task, list_of_candidate_outputs) tuples """ test_data = [] - + # Test queries with multiple candidate answers queries = [ - ("What is 45 + 37?", [ - "82", # Correct - "45+37=82", # Correct with work - "83", # Off by one - "72", # Wrong - "Eighty-two", # Correct, word form - ]), - ("Calculate 9 * 8", [ - "72", # Correct - "73", # Close - "81", # 9*9, common mistake - "9*8=72", # Correct with work - "64", # 8*8, wrong - ]), - ("What is 100 - 45?", [ - "55", # Correct - "100-45=55", # Correct with work - "65", # Wrong - "Fifty-five", # Correct, word form - "54", # Off by one - ]), + ( + "What is 45 + 37?", + [ + "82", # Correct + "45+37=82", # Correct with work + "83", # Off by one + "72", # Wrong + "Eighty-two", # Correct, word form + ], + ), + ( + "Calculate 9 * 8", + [ + "72", # Correct + "73", # Close + "81", # 9*9, common mistake + "9*8=72", # Correct with work + "64", # 8*8, wrong + ], + ), + ( + "What is 100 - 45?", + [ + "55", # Correct + "100-45=55", # Correct with work + "65", # Wrong + "Fifty-five", # Correct, word form + "54", # Off by one + ], + ), ] - + for i in range(min(num_queries, len(queries))): query, candidates = queries[i] - + # Create task task = Task( main_query=query, task_id=f"listwise_test_{i}", - metadata={} # No reference needed for evaluation + metadata={}, # No reference needed for evaluation ) - + workflow_task = WorkflowTask( task_id=f"listwise_test_{i}", task=task, ) - + # Create output for each candidate candidate_outputs = [] for j, candidate_answer in enumerate(candidates): - output = WorkflowOutput( - metadata={"final_answer": candidate_answer} - ) + output = WorkflowOutput(metadata={"final_answer": candidate_answer}) candidate_outputs.append(output) - + test_data.append((workflow_task, candidate_outputs)) - + return test_data def create_math_test_samples(num_samples: int = 5) -> List[tuple[WorkflowTask, WorkflowOutput]]: """Create test samples (task + output pairs) for evaluation.""" samples = [] - + # Test problems with model outputs (some correct, some incorrect) test_cases = [ ("What is 25 + 38?", "63", "63", True), @@ -402,59 +424,53 @@ def create_math_test_samples(num_samples: int = 5) -> List[tuple[WorkflowTask, W ("Calculate 7^2", "49", "49", True), ("What is (20 - 5) / 3?", "5", "7", False), # Wrong answer ] - + for i in range(min(num_samples, len(test_cases))): query, reference, model_output, _ = test_cases[i] - - task = Task( - main_query=query, - task_id=f"test_sample_{i}", - metadata={"answer": reference} - ) - + + task = Task(main_query=query, task_id=f"test_sample_{i}", metadata={"answer": reference}) + workflow_task = WorkflowTask( task_id=f"test_sample_{i}", task=task, ) - - workflow_output = WorkflowOutput( - metadata={"final_answer": model_output} - ) - + + workflow_output = WorkflowOutput(metadata={"final_answer": model_output}) + samples.append((workflow_task, workflow_output)) - - return samples + return samples # ============================================ # Main Entry Point # ============================================ + async def main(): """Run all examples.""" print("\n") print("╔" + "═" * 58 + "╗") print("║" + " " * 10 + "RM Auto Grader Judge Examples" + " " * 18 + "║") print("╚" + "═" * 58 + "╝") - + # Run examples try: await example_pregerated_rubrics() # await example_batch_rubrics() await example_listwise_mode() - + print("\n\n" + "═" * 60) print("All examples completed successfully!") print("═" * 60) - + except Exception as e: print(f"\n✗ Error running examples: {e}") import traceback + traceback.print_exc() if __name__ == "__main__": # Run the examples asyncio.run(main()) - diff --git a/tutorial/example_rubrics_judge/math_agent.py b/tutorial/example_rubrics_judge/math_agent.py index 2a5e497f..a4389dd8 100644 --- a/tutorial/example_rubrics_judge/math_agent.py +++ b/tutorial/example_rubrics_judge/math_agent.py @@ -1,7 +1,8 @@ -from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg -from pydantic import BaseModel, Field from loguru import logger +from pydantic import BaseModel, Field + +from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -38,7 +39,6 @@ class FinalResult(BaseModel): class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" async def agentscope_execute( diff --git a/tutorial/example_werewolves/game.py b/tutorial/example_werewolves/game.py index eb2f6e91..1abaf457 100644 --- a/tutorial/example_werewolves/game.py +++ b/tutorial/example_werewolves/game.py @@ -2,37 +2,31 @@ # pylint: disable=too-many-branches, too-many-statements, no-name-in-module """A werewolf game implemented by agentscope.""" import numpy as np +from agentscope.agent import ReActAgent +from agentscope.pipeline import MsgHub, fanout_pipeline, sequential_pipeline -from tutorial.example_werewolves.utils import ( - majority_vote, - names_to_str, - EchoAgent, - MAX_GAME_ROUND, - MAX_DISCUSSION_ROUND, - Players, -) +# Uncomment the following line to use Chinese prompts +# from tutorial.example_werewolves.prompt import ChinesePrompts as Prompts +from loguru import logger + +from tutorial.example_werewolves.prompt import EnglishPrompts as Prompts from tutorial.example_werewolves.structured_model import ( DiscussionModel, - get_vote_model, - get_poison_model, WitchResurrectModel, - get_seer_model, get_hunter_model, + get_poison_model, + get_seer_model, + get_vote_model, ) -from tutorial.example_werewolves.prompt import EnglishPrompts as Prompts - -# Uncomment the following line to use Chinese prompts -# from tutorial.example_werewolves.prompt import ChinesePrompts as Prompts -from loguru import logger - -from agentscope.agent import ReActAgent -from agentscope.pipeline import ( - MsgHub, - sequential_pipeline, - fanout_pipeline, +from tutorial.example_werewolves.utils import ( + MAX_DISCUSSION_ROUND, + MAX_GAME_ROUND, + EchoAgent, + Players, + majority_vote, + names_to_str, ) - moderator = EchoAgent() moderator.set_console_output_enabled(False) diff --git a/tutorial/example_werewolves/prompt.py b/tutorial/example_werewolves/prompt.py index c3c3472e..52d0f650 100644 --- a/tutorial/example_werewolves/prompt.py +++ b/tutorial/example_werewolves/prompt.py @@ -121,15 +121,12 @@ class ChinesePrompts: to_dead_player = "{}, 你已被淘汰。现在你可以向所有存活玩家发表最后的遗言。" - to_all_new_game = ( - "新的一局游戏开始,参与玩家包括:{}。现在为每位玩家重新随机分配身份,并私下告知各自身份。" - ) + to_all_new_game = "新的一局游戏开始,参与玩家包括:{}。现在为每位玩家重新随机分配身份,并私下告知各自身份。" to_all_night = "天黑了,请所有人闭眼。狼人请睁眼,选择今晚要淘汰的一名玩家..." to_wolves_discussion = ( - "[仅狼人可见] {}, 你们可以讨论并决定今晚要淘汰的玩家。当前存活玩家有:{}。" - "如果达成一致,请将 `reach_agreement` 设为 True。" + "[仅狼人可见] {}, 你们可以讨论并决定今晚要淘汰的玩家。当前存活玩家有:{}。" "如果达成一致,请将 `reach_agreement` 设为 True。" ) to_wolves_vote = "[仅狼人可见] 你投票要杀死哪位玩家?" @@ -146,15 +143,11 @@ class ChinesePrompts: to_witch_resurrect_no = "[仅女巫可见] 女巫选择不救该玩家。" to_witch_resurrect_yes = "[仅女巫可见] 女巫选择救活该玩家。" - to_witch_poison = ( - "[仅女巫可见] {witch_name},你有一瓶一次性毒药,今晚要使用吗?请给出理由和决定。" - ) + to_witch_poison = "[仅女巫可见] {witch_name},你有一瓶一次性毒药,今晚要使用吗?请给出理由和决定。" to_all_seer_turn = "轮到预言家行动,预言家请睁眼并查验一名玩家身份..." - to_seer = ( - "[仅预言家可见] {}, 你是预言家,今晚可以查验一名玩家身份。你要查谁?请给出理由和决定。" - ) + to_seer = "[仅预言家可见] {}, 你是预言家,今晚可以查验一名玩家身份。你要查谁?请给出理由和决定。" to_seer_result = "[仅预言家可见] 你查验了{agent_name},结果是:{role}。" @@ -173,14 +166,10 @@ class ChinesePrompts: to_all_res = "投票结果为 {},{} 被淘汰。" to_all_wolf_win = ( - "当前存活玩家共{n_alive}人,其中{n_werewolves}人为狼人。" - "游戏结束,狼人获胜🐺🎉!" - "本局所有玩家真实身份为:{true_roles}" + "当前存活玩家共{n_alive}人,其中{n_werewolves}人为狼人。" "游戏结束,狼人获胜🐺🎉!" "本局所有玩家真实身份为:{true_roles}" ) - to_all_village_win = ( - "所有狼人已被淘汰。游戏结束,村民获胜🏘️🎉!本局所有玩家真实身份为:{true_roles}" - ) + to_all_village_win = "所有狼人已被淘汰。游戏结束,村民获胜🏘️🎉!本局所有玩家真实身份为:{true_roles}" to_all_continue = "游戏继续。" diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index a890d17c..c458febd 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -4,18 +4,21 @@ """The main entry point for the werewolf game.""" import os -import numpy as np + import dotenv +import numpy as np dotenv.load_dotenv() from textwrap import dedent -from loguru import logger -from tutorial.example_werewolves.game import werewolves_game + from agentscope.agent import ReActAgent -from agentscope.formatter import OpenAIMultiAgentFormatter, DashScopeMultiAgentFormatter -from agentscope.model import OpenAIChatModel, DashScopeChatModel +from agentscope.formatter import DashScopeMultiAgentFormatter, OpenAIMultiAgentFormatter +from agentscope.model import DashScopeChatModel, OpenAIChatModel +from loguru import logger from pydantic import BaseModel, Field -from astune import ModelTuner, Workflow, WorkflowTask, WorkflowOutput + +from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from tutorial.example_werewolves.game import werewolves_game def get_official_agent_prompt(name) -> str: @@ -78,7 +81,6 @@ def get_official_agent_prompt(name) -> str: class ExampleWerewolves(Workflow): - trainer: str = Field(default="astune-trinity") trainable_targets: list = Field( default=["seer", "witch"], description="List of agents to be fine-tuned." @@ -87,7 +89,6 @@ class ExampleWerewolves(Workflow): async def agentscope_execute( self, workflow_task: WorkflowTask, model_tuner: ModelTuner ) -> WorkflowOutput: - # ensure trainable targets is legal if "werewolf" in self.trainable_targets: assert len(self.trainable_targets) == 1, "Cannot train hostile roles simultaneously." @@ -118,7 +119,9 @@ async def agentscope_execute( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), model=model_tuner.register_model(role, default_model=default_model), - formatter=DashScopeMultiAgentFormatter() if role in self.trainable_targets else OpenAIMultiAgentFormatter(), + formatter=DashScopeMultiAgentFormatter() + if role in self.trainable_targets + else OpenAIMultiAgentFormatter(), ) agent.set_console_output_enabled(False) players += [agent] @@ -137,9 +140,10 @@ async def agentscope_execute( logger.warning(f"Raw reward: {raw_reward}") logger.warning(f"Is success: {is_success}") except Exception as e: - logger.bind(exception=True).exception(f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent).") + logger.bind(exception=True).exception( + f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent)." + ) raw_reward = 0.0 is_success = False - return WorkflowOutput(reward=raw_reward, is_success=is_success) diff --git a/tutorial/example_werewolves/structured_model.py b/tutorial/example_werewolves/structured_model.py index 4764816e..46390589 100644 --- a/tutorial/example_werewolves/structured_model.py +++ b/tutorial/example_werewolves/structured_model.py @@ -2,8 +2,8 @@ """The structured output models used in the werewolf game.""" from typing import Literal -from pydantic import BaseModel, Field from agentscope.agent import AgentBase +from pydantic import BaseModel, Field class DiscussionModel(BaseModel): diff --git a/tutorial/example_werewolves/utils.py b/tutorial/example_werewolves/utils.py index a3c39e16..faecfb3d 100644 --- a/tutorial/example_werewolves/utils.py +++ b/tutorial/example_werewolves/utils.py @@ -4,12 +4,11 @@ from typing import Any import numpy as np +from agentscope.agent import AgentBase, ReActAgent +from agentscope.message import Msg from tutorial.example_werewolves.prompt import EnglishPrompts as Prompts -from agentscope.message import Msg -from agentscope.agent import ReActAgent, AgentBase - # MAX_GAME_ROUND = 30 # MAX_DISCUSSION_ROUND = 3 MAX_GAME_ROUND = 10 From a62b554a3d679492fb2cd8e8b0fc1f2723b45925 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 14:29:55 +0800 Subject: [PATCH 204/462] precommit-mypy Former-commit-id: ecad1e5a0e76a8fdade986a502c787107b7c1aa4 --- astune/task_rollout/native_parallel_worker.py | 4 +- astune/utils/compute_madness.py | 30 ++++++------- astune/utils/http_client.py | 5 ++- astune/utils/n_gram.py | 3 +- astune/utils/smart_daemon.py | 1 + pyrightconfig.json | 8 +--- tutorial/example_rubrics_judge/r_judge.yaml | 42 +++++++++---------- 7 files changed, 46 insertions(+), 47 deletions(-) diff --git a/astune/task_rollout/native_parallel_worker.py b/astune/task_rollout/native_parallel_worker.py index d8aec3e4..948f968a 100644 --- a/astune/task_rollout/native_parallel_worker.py +++ b/astune/task_rollout/native_parallel_worker.py @@ -3,7 +3,7 @@ import os import time from concurrent.futures import ThreadPoolExecutor -from typing import List, Literal +from typing import Dict, List, Literal from urllib.parse import quote import numpy as np @@ -197,7 +197,7 @@ def rollout_dynamic( rollout_n < rollout_n_confirm < rollout_n_oversample ), f"submit_oversample_multiplier is too small, rollout_n={rollout_n}, rollout_n_confirm={rollout_n_confirm}, rollout_n_oversample={rollout_n_oversample}" - obs_window = { + obs_window: Dict[str, List[int | bool]] = { "step": [0 for _ in range(len(tasks) * rollout_n_oversample)], "stop": [False for _ in range(len(tasks) * rollout_n_oversample)], "token": [0 for _ in range(len(tasks) * rollout_n_oversample)], diff --git a/astune/utils/compute_madness.py b/astune/utils/compute_madness.py index 3e644884..e599e2f0 100644 --- a/astune/utils/compute_madness.py +++ b/astune/utils/compute_madness.py @@ -126,21 +126,21 @@ def compute_string_madness_format(completion, detail, format_type) -> float: def compute_string_madness_char(completion, detail=False, skip_non_ascii=False) -> float: - if detail: - result = { - "has_non_ascii": has_non_ascii(completion), - "has_repeat": has_repeat(completion.split(), remember_n_words=5, patience_max=10), - "has_repeat_x": has_repeat(completion, remember_n_words=4, patience_max=200), - "has_wrong_sp_token": "<|im_start|>" in completion, - # 'non_ascii': {ch for ch in completion if ord(ch) > 127} - } - if has_non_ascii(completion): - for char in completion: - if has_non_ascii(char): - print(f"---") - print(f"found non-ascii char: {char} ord={ord(char)}") - print(result) - return result + # if detail: + # result = { + # "has_non_ascii": has_non_ascii(completion), + # "has_repeat": has_repeat(completion.split(), remember_n_words=5, patience_max=10), + # "has_repeat_x": has_repeat(completion, remember_n_words=4, patience_max=200), + # "has_wrong_sp_token": "<|im_start|>" in completion, + # # 'non_ascii': {ch for ch in completion if ord(ch) > 127} + # } + # if has_non_ascii(completion): + # for char in completion: + # if has_non_ascii(char): + # print(f"---") + # print(f"found non-ascii char: {char} ord={ord(char)}") + # print(result) + # return result if "<|im_start|>" in completion: return -1.0 diff --git a/astune/utils/http_client.py b/astune/utils/http_client.py index 99b74fa2..7e06d059 100644 --- a/astune/utils/http_client.py +++ b/astune/utils/http_client.py @@ -49,8 +49,9 @@ def _request( stream: bool = False, http_enum: str = "post", ): + response: requests.Response if http_enum == "post": - response: requests.Response = self._client.post( + response = self._client.post( url=self.url, data=data, json=json_data, @@ -60,7 +61,7 @@ def _request( ) elif http_enum == "get": - response: requests.Response = self._client.get( + response = self._client.get( url=self.url, data=data, json=json_data, diff --git a/astune/utils/n_gram.py b/astune/utils/n_gram.py index dc03635f..c70600ad 100644 --- a/astune/utils/n_gram.py +++ b/astune/utils/n_gram.py @@ -1,4 +1,5 @@ import re +from typing import List def preserve_chinese(text): @@ -28,7 +29,7 @@ def zipngram_chinese(text: str, ngram_size: int): # print(seg_list) return zip(*[seg_list[i:] for i in range(ngram_size)]) - def repetition_penalty_reward(completions, **kwargs) -> float: + def repetition_penalty_reward(completions, **kwargs) -> List[float]: """ reward function the penalizes repetitions ref implementation: https://github.com/eddycmu/demystify-long-cot/blob/release/openrlhf/openrlhf/reward/repetition.py diff --git a/astune/utils/smart_daemon.py b/astune/utils/smart_daemon.py index be56a797..31d9d789 100644 --- a/astune/utils/smart_daemon.py +++ b/astune/utils/smart_daemon.py @@ -184,6 +184,7 @@ def launch( if is_running: if force_restart: + assert pgid is not None logger.warning(f"Force restarting") self._kill_existing_process_group(pgid) else: diff --git a/pyrightconfig.json b/pyrightconfig.json index c22f6296..27f13aba 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -4,10 +4,10 @@ "astune/**/*.py", "external/trinity/**/*.py", "external/verl/**/*.py", - // ".venv/lib/python3.10/site-packages/**/*.py", - // ".venv/lib/python3.10/site-packages/agentscope/**/*.py" + ".venv/lib/python3.10/site-packages/**/*.py" ], "exclude": [ + "**/__pycache__", "node_modules", "build", "checkpoints", @@ -19,9 +19,5 @@ "wanlog", "wandb", "dist" - // "**/.vscode-server", - // "**/__pycache__", - // "**/*.log", - // "**/*" ] } diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml index b3a013b0..4248ae0b 100644 --- a/tutorial/example_rubrics_judge/r_judge.yaml +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -11,27 +11,6 @@ astune: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge - - model: - # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - - rollout: - agentscope_learn_protocol: "tutorial.example_rubrics_judge.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent - temperature: 0.7 - max_env_worker: 80 - num_repeat: 4 - agent_madness_reward: 0.0 - - data: - train_batch_size: 64 - - debug: - debug_max_parallel: 1 - debug_first_n_tasks: 1 - - task_judge: judge_type: rubrics_auto_grader # Options: 'customized_protocal', 'rubrics_auto_grader' rubrics_auto_grader: # rubrics begin @@ -57,6 +36,27 @@ astune: file_path: "tutorial/example_rm_auto_grader/rubrics_train.jsonl" + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + agentscope_learn_protocol: "tutorial.example_rubrics_judge.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 0.7 + max_env_worker: 80 + num_repeat: 4 + agent_madness_reward: 0.0 + + data: + train_batch_size: 64 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + + + # ------------------ 不需要修改 ------------------ hydra: searchpath: From f16b5f57e30457cfbfa4f0da7f5f057bae2a467c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 27 Nov 2025 14:49:11 +0800 Subject: [PATCH 205/462] mypy correct Former-commit-id: 81b1a8b8bed6d92045d519e9cd0db5daaa936cd0 --- .pre-commit-config.yaml | 2 + .../agentscope_tracker/multiagent_tracking.py | 17 +- astune/context_tracker/tracker_base_attr.py | 2 +- astune/task_rollout/native_parallel_worker.py | 13 +- .../utils/env_service_client/env_client_ng.py | 10 +- scripts/model_merger.py | 796 ------------------ 6 files changed, 25 insertions(+), 815 deletions(-) delete mode 100644 scripts/model_merger.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 87cae9bc..26dd14a4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,9 @@ repos: --ignore-missing-imports, --disable-error-code=var-annotated, --disable-error-code=union-attr, + --disable-error-code=no-redef, --disable-error-code=assignment, + --disable-error-code=has-type, --disable-error-code=attr-defined, --disable-error-code=import-untyped, --disable-error-code=truthy-function, diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py index fec09b86..4273ab60 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astune/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -421,10 +421,9 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], max_seq_length: int = max_model_len - max_response_length if length < max_seq_length: - ret = [True, length] + return True, length else: - ret = [False, length] - return tuple(ret) + return False, length def check_context_token_num_safe( self, messages: List, tools: List = [] @@ -445,18 +444,18 @@ def check_context_token_num_safe( else: token_overflow = True if self.should_interrupt_fn(): - ret = [False, token_overflow, "externally_interrupted"] + ret = (False, token_overflow, "externally_interrupted") elif self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: - ret = [False, token_overflow, "already_mad"] + ret = (False, token_overflow, "already_mad") elif length < max_seq_length: - ret = [ + ret = ( True, token_overflow, f"safe[{length} < {max_model_len} - {max_response_length}]", - ] + ) else: - ret = [False, token_overflow, "token_overflow"] - return tuple(ret) + ret = (False, token_overflow, "token_overflow") + return ret def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: result = [] diff --git a/astune/context_tracker/tracker_base_attr.py b/astune/context_tracker/tracker_base_attr.py index 0503bbbc..ddda5cc0 100644 --- a/astune/context_tracker/tracker_base_attr.py +++ b/astune/context_tracker/tracker_base_attr.py @@ -56,7 +56,7 @@ def __init__(self, config, tokenizer, **kwargs): self.context_time_cost = 0 self.tag = "" self.current_batch_success_rate: float = -1.0 - self.already_mad_flag = False + self.already_mad_flag: bool = False self.round_cnt = 0 self.generation_prompt_token = None diff --git a/astune/task_rollout/native_parallel_worker.py b/astune/task_rollout/native_parallel_worker.py index 948f968a..71a75e41 100644 --- a/astune/task_rollout/native_parallel_worker.py +++ b/astune/task_rollout/native_parallel_worker.py @@ -436,10 +436,15 @@ def trajectories_to_samples(self, cmt_array: List[BasicContextTracker]) -> List[ return sample_arr_final def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: - prompt_ids, response_ids = [], [] - prompt_attention_mask, response_attention_mask = [], [] - prompt_position_ids, response_position_ids = [], [] - prompt_loss_mask, response_loss_mask = [], [] + prompt_ids: torch.Tensor | List[torch.Tensor] = [] + response_ids: torch.Tensor | List[torch.Tensor] = [] + prompt_attention_mask: torch.Tensor | List[torch.Tensor] = [] + response_attention_mask: torch.Tensor | List[torch.Tensor] = [] + prompt_position_ids: torch.Tensor | List[torch.Tensor] = [] + response_position_ids: torch.Tensor | List[torch.Tensor] = [] + prompt_loss_mask: torch.Tensor | List[torch.Tensor] = [] + response_loss_mask: torch.Tensor | List[torch.Tensor] = [] + messages = [] step_reward_scores = [] task_ids = [] diff --git a/astune/utils/env_service_client/env_client_ng.py b/astune/utils/env_service_client/env_client_ng.py index b906b11b..d63328f7 100644 --- a/astune/utils/env_service_client/env_client_ng.py +++ b/astune/utils/env_service_client/env_client_ng.py @@ -32,7 +32,7 @@ def retry_call( max_backoff: float = 10.0, fail_return: Any = None, err_prefix: str = "", - instance_id: str = "", + instance_id: str | None = "", action_name: str = "", ): last_exception = None @@ -68,10 +68,10 @@ def _make_request( self, endpoint: str, env_type: str = "default", - task_id: str = None, - instance_id: str = None, - messages: Dict[str, Any] = None, - params: Dict[str, Any] = None, + task_id: str | None = None, + instance_id: str | None = None, + messages: Dict[str, Any] | None = None, + params: Dict[str, Any] | None = None, ) -> Dict: url = f"{self.base_url}/{endpoint.lstrip('/')}" diff --git a/scripts/model_merger.py b/scripts/model_merger.py deleted file mode 100644 index 58679a07..00000000 --- a/scripts/model_merger.py +++ /dev/null @@ -1,796 +0,0 @@ -# Copyright 2024 Bytedance Ltd. and/or its affiliates -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -This script is used to merge huggingface model and test verl checkpoints from FSDP and Megatron backends. - -To merge FSDP checkpoints: -```sh -python scripts/model_merger.py merge \ - --backend fsdp \ - --local_dir checkpoints/verl_fsdp_gsm8k_examples/qwen2_5_0b5_fsdp_saveload/global_step_1/actor \ - --target_dir /path/to/merged_hf_model -``` - -To merge Megatron checkpoints: -```sh -python scripts/model_merger.py merge \ - --backend megatron \ - --tie-word-embedding \ - --local_dir checkpoints/verl_megatron_gsm8k_examples/qwen2_5_0b5_megatron_saveload/global_step_1/actor \ - --target_dir /path/to/merged_hf_model -``` - -For more details, please refer to documentation: -https://verl.readthedocs.io/en/latest/advance/checkpoint.html#convert-fsdp-and-megatron-checkpoints-to-huggingface-format-model -""" - -import argparse -import os -import re -from abc import ABC, abstractmethod -from concurrent.futures import ThreadPoolExecutor -from dataclasses import dataclass, field -from pathlib import Path -from typing import Optional - -import numpy as np -import torch -from accelerate import init_empty_weights -from safetensors.torch import load_file -from torch.distributed._tensor import Placement, Shard -from transformers import ( - AutoConfig, - AutoModelForCausalLM, - AutoModelForTokenClassification, - AutoModelForVision2Seq, - GenerationConfig, - PretrainedConfig, -) - -try: - # for torch 2.5+ - from torch.distributed.tensor import DTensor -except ImportError: - from torch.distributed._tensor import DTensor - -from tqdm import tqdm -from verl.utils import hf_processor, hf_tokenizer - - -@dataclass -class ModelMergerConfig: - operation: str # 'merge' or 'test' - backend: str - local_dir: str - hf_model_config_path: str - target_dir: Optional[str] = "tmp" - hf_upload_path: Optional[str] = None - private: bool = False - test_hf_dir: Optional[str] = None - tie_word_embedding: bool = False - is_value_model: bool = False - hf_model_path: Optional[str] = None - hf_upload: bool = field(init=False) - - def __post_init__(self): - self.hf_upload = self.operation == "merge" and bool(self.hf_upload_path) - if self.operation == "test": - self.target_dir = None - self.hf_upload_path = None - self.private = False - - -class BaseModelMerger(ABC): - def __init__(self, config: ModelMergerConfig): - self.config = config - self.hf_model_config_path = config.hf_model_config_path - - if config.hf_model_path: - print( - "Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. " - ) - self.hf_model_config_path = config.hf_model_path - - self.model_config = AutoConfig.from_pretrained(self.hf_model_config_path) - - def get_transformers_auto_model_class(self): - if "ForTokenClassification" in self.model_config.architectures[0]: - return AutoModelForTokenClassification - elif "ForCausalLM" in self.model_config.architectures[0]: - return AutoModelForCausalLM - elif "ForConditionalGeneration" in self.model_config.architectures[0]: - return AutoModelForVision2Seq - - raise NotImplementedError(f"Unknown architecture {self.model_config.architectures}") - - def patch_model_generation_config(self, model): - """ - The generation_config created from model config may be different to the pretrained model, - this may lead to error when generating: https://github.com/volcengine/verl/issues/1246 - - This function patch the generation_config created from model config to the pretrained model. - """ - if model.can_generate(): - try: - model.generation_config = GenerationConfig.from_pretrained( - self.hf_model_config_path - ) - except OSError: - print( - f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config." - ) - return model - - def save_hf_model_and_tokenizer(self, state_dict: dict[str, torch.Tensor]): - auto_model_class = self.get_transformers_auto_model_class() - with init_empty_weights(): - model = auto_model_class.from_config(self.model_config, torch_dtype=torch.bfloat16) - model.to_empty(device="cpu") - model = self.patch_model_generation_config(model) - - print(f"Saving model to {self.config.target_dir}") - model.save_pretrained(self.config.target_dir, state_dict=state_dict) - del state_dict - del model - - processor = hf_processor(self.hf_model_config_path) - tokenizer = hf_tokenizer(self.hf_model_config_path) - if processor is not None: - print(f"Saving processor to {self.config.target_dir}") - processor.save_pretrained(self.config.target_dir) - if tokenizer is not None: - print(f"Saving tokenizer to {self.config.target_dir}") - tokenizer.save_pretrained(self.config.target_dir) - - def upload_to_huggingface(self): - from huggingface_hub import HfApi - - api = HfApi() - api.create_repo( - repo_id=self.config.hf_upload_path, - private=self.config.private, - exist_ok=True, - ) - api.upload_folder( - folder_path=self.config.target_dir, - repo_id=self.config.hf_upload_path, - repo_type="model", - ) - - @abstractmethod - def merge_and_save(self): - raise NotImplementedError("Subclasses should implement this method") - - -class FSDPModelMerger(BaseModelMerger): - def _get_world_size(self) -> int: - """Extracts the FSDP world_size from checkpoint filenames (e.g., 'model_world_size_8_rank_0.pt').""" - for filename in os.listdir(self.config.local_dir): - match = re.match(r"model_world_size_(\d+)_rank_0\.pt", filename) - if match: - return int(match.group(1)) - raise FileNotFoundError( - f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}" - ) - - def _load_rank_zero_state_dict(self, world_size: int) -> dict: - return torch.load( - Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", - map_location="cpu", - weights_only=False, - ) - - def _extract_device_mesh_info( - self, state_dict: dict, world_size: int - ) -> tuple[np.ndarray, tuple[str, ...]]: - """ - Retrieves sharding information (device_mesh, mesh_dim_names) from a DTensor in the state_dict. - If no DTensor is found, infers a simple FSDP mesh based on world_size. - """ - pivot_key = sorted(list(state_dict.keys()))[0] - weight = state_dict[pivot_key] - - if isinstance(weight, DTensor): - # get sharding info - device_mesh = weight.device_mesh - mesh = device_mesh.mesh - mesh_dim_names = device_mesh.mesh_dim_names - else: - # for non-DTensor - mesh = np.array([world_size], dtype=np.int64) - mesh_dim_names = ("fsdp",) - - return mesh, mesh_dim_names - - def _calculate_shard_configuration( - self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...] - ) -> tuple[int, tuple[int, ...]]: - """Calculates the total number of shards and the shape of the device mesh.""" - assert mesh_dim_names in ( - ("fsdp",), - ("ddp", "fsdp"), - ), f"Unsupported mesh_dim_names {mesh_dim_names}" - - if "tp" in mesh_dim_names: - # TODO: "tp" is not supported yet due to the above assert - total_shards = mesh.shape[-1] * mesh.shape[-2] - mesh_shape = (mesh.shape[-2], mesh.shape[-1]) - else: - total_shards = mesh.shape[-1] - mesh_shape = (mesh.shape[-1],) - - return total_shards, mesh_shape - - def _merge_by_placement( - self, tensors: list[torch.Tensor], placement: Placement - ) -> torch.Tensor: - """Merges a list of tensors based on their DTensor placement""" - if placement.is_replicate(): - return tensors[0] - elif placement.is_partial(): - raise NotImplementedError("Partial placement is not supported yet") - elif placement.is_shard(): - return torch.cat(tensors, dim=placement.dim).contiguous() - - raise NotImplementedError(f"Unsupported placement: {placement}") - - def _load_and_merge_state_dicts( - self, - world_size: int, - total_shards: int, - mesh_shape: tuple[int, ...], - mesh_dim_names: tuple[str, ...], - ) -> dict[str, torch.Tensor]: - model_state_dict_lst = [None] * total_shards - - def process_one_shard(rank: int, model_state_dict_lst: list): - model_path = ( - Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" - ) - state_dict = torch.load(model_path, map_location="cpu", weights_only=False) - model_state_dict_lst[rank] = state_dict - return state_dict - - with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [ - executor.submit(process_one_shard, rank, model_state_dict_lst) - for rank in range(total_shards) - ] - for future in tqdm( - futures, - desc=f"Loading {total_shards} FSDP shards", - total=total_shards, - ): - future.result() - - # Merge state dicts from all shards - state_dict = {} - param_placements: dict[str, list] = {} - - for key in set(model_state_dict_lst[0].keys()): - state_dict[key] = [] - for model_state_shard in model_state_dict_lst: - # add tensor shard in order of rank to state_dict[key] - tensor = model_state_shard.pop(key) - if isinstance(tensor, DTensor): - state_dict[key].append(tensor._local_tensor.bfloat16()) - - placements = tuple(tensor.placements) - # replicated placement at dp dimension can be discarded - if mesh_dim_names[0] in ("dp", "ddp"): - placements = placements[1:] - - if key not in param_placements: - param_placements[key] = placements - else: - assert param_placements[key] == placements - else: - state_dict[key].append(tensor.bfloat16()) - - del model_state_dict_lst - - # Merge tensors - for key in sorted(state_dict): - if not isinstance(state_dict[key], list): - print(f"No need to merge key {key}") - continue - if key in param_placements: - # merge shards - placements: tuple[Shard] = param_placements[key] - if len(mesh_shape) == 1: - # 1-D list, FSDP without TP - assert len(placements) == 1 - shards = state_dict[key] - state_dict[key] = self._merge_by_placement(shards, placements[0]) - else: - # 2-D list, FSDP + TP - raise NotImplementedError("FSDP + TP is not supported yet") - else: - state_dict[key] = torch.cat(state_dict[key], dim=0) - - return state_dict - - def merge_and_save(self): - world_size = self._get_world_size() - rank_zero_state_dict = self._load_rank_zero_state_dict(world_size) - - mesh, mesh_dim_names = self._extract_device_mesh_info(rank_zero_state_dict, world_size) - print(f"Got device mesh {mesh}, mesh_dim_names {mesh_dim_names}") - - total_shards, mesh_shape = self._calculate_shard_configuration(mesh, mesh_dim_names) - print(f"Processing model shards with {total_shards} {mesh_shape} in total") - - merged_state_dict = self._load_and_merge_state_dicts( - world_size, total_shards, mesh_shape, mesh_dim_names - ) - - if self.config.operation == "test": - if not self.config.test_hf_dir: - raise ValueError("test_hf_dir must be provided for test operation") - self._test_state_dict(merged_state_dict) - elif self.config.operation == "merge": - self.save_hf_model_and_tokenizer(merged_state_dict) - if self.config.hf_upload: - self.upload_to_huggingface() - else: - raise ValueError(f"Unknown operation: {self.config.operation}") - - def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): - auto_model_class = self.get_transformers_auto_model_class() - - hf_model = auto_model_class.from_pretrained( - self.config.test_hf_dir, torch_dtype=torch.bfloat16 - ) - hf_state_dict = hf_model.state_dict() - del hf_model - - hf_model_keys = set(hf_state_dict.keys()) - collected_keys = set(state_dict.keys()) - - missing_keys = hf_model_keys - collected_keys - assert ( - len(missing_keys) == 0 - ), f"Missing keys in collected state dict: {list(sorted(missing_keys))}" - - extra_keys = collected_keys - hf_model_keys - assert ( - len(extra_keys) == 0 - ), f"Extra keys in collected state dict: {list(sorted(extra_keys))}" - - for key in hf_model_keys: - hf_shape = hf_state_dict[key].shape - collected_shape = state_dict[key].shape - assert ( - hf_shape == collected_shape - ), f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" - - hf_dtype = hf_state_dict[key].dtype - collected_dtype = state_dict[key].dtype - assert ( - hf_dtype == collected_dtype - ), f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" - - torch.testing.assert_close(hf_state_dict[key], state_dict[key], atol=1e-6, rtol=1e-6) - - print( - "FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager." - ) - - -class MegatronModelMerger(BaseModelMerger): - def __init__(self, config: ModelMergerConfig): - from verl.utils.megatron_utils import ( - get_hf_config_and_tokenizer_checkpoint_path, - ) - - config.hf_model_config_path = get_hf_config_and_tokenizer_checkpoint_path(config.local_dir) - super().__init__(config) - - def _get_tp_pp_rank_from_sharded_dir(self, sharded_dir: str) -> tuple[int, int]: - match = re.match(r"mp_rank_(\d\d)_(\d\d\d)", sharded_dir) - assert match, f"Invalid sharded dir {sharded_dir}" - tp_rank = int(match.group(1)) - pp_rank = int(match.group(2)) - return tp_rank, pp_rank - - def _check_megatron_checkpoint_path(self, model_path: str) -> tuple[list[str], int, int]: - """ - Validates the Megatron checkpoint structure (presence of 'model.pt' in sharded directories). - Determines TP and PP sizes from directory names. - """ - tp_size = 0 - pp_size = 0 - sharded_dirs = sorted(os.listdir(model_path)) - for sharded_dir in sharded_dirs: - assert "model.pt" in os.listdir( - Path(model_path) / sharded_dir - ), f"model.pt not found in {sharded_dir}" - tp_rank, pp_rank = self._get_tp_pp_rank_from_sharded_dir(sharded_dir) - tp_size = max(tp_size, tp_rank + 1) - pp_size = max(pp_size, pp_rank + 1) - return sharded_dirs, tp_size, pp_size - - def _merge_across_tp( - self, - key: str, - tp_data: list[torch.Tensor], - config: PretrainedConfig, - tp_size: int, - is_value_model: bool = False, - ) -> torch.Tensor | list[torch.Tensor]: - if "linear_fc1.weight" in key: - # if the tensor is gate and proj - gate_lst = [] - up_lst = [] - for infer_param in tp_data: - gate, up = infer_param.chunk(2) - gate_lst.append(gate) - up_lst.append(up) - gate = torch.cat(gate_lst, dim=0) - up = torch.cat(up_lst, dim=0) - return [gate, up] - - elif "self_attention.linear_qkv." in key and "layer_norm" not in key: - # if the tensor is qkv, for each param on tp, split into q, k, v - # concat q, k, v separately. - q_lst = [] - k_lst = [] - v_lst = [] - assert config.num_attention_heads % config.num_key_value_heads == 0 - num_q_per_kv = config.num_attention_heads // config.num_key_value_heads - assert tp_data[0].shape[0] % (num_q_per_kv + 2) == 0 - kv_size_per_tp = tp_data[0].shape[0] // (num_q_per_kv + 2) - split_size = [ - kv_size_per_tp * num_q_per_kv, - kv_size_per_tp, - kv_size_per_tp, - ] - - for infer_param in tp_data: - num_query_groups_per_partition = config.num_key_value_heads // tp_size - for chunk in infer_param.chunk(num_query_groups_per_partition): - split_size = [ - kv_size_per_tp * num_q_per_kv // num_query_groups_per_partition, - kv_size_per_tp // num_query_groups_per_partition, - kv_size_per_tp // num_query_groups_per_partition, - ] - q, k, v = chunk.split(split_size) - q_lst.append(q) - k_lst.append(k) - v_lst.append(v) - - q = torch.cat(q_lst, dim=0) - k = torch.cat(k_lst, dim=0) - v = torch.cat(v_lst, dim=0) - return [q, k, v] - - elif "layer_norm" in key or "layernorm" in key or "output_layer" in key and is_value_model: - return tp_data[0] - else: - dim = 0 - if "linear_fc2.weight" in key or "self_attention.linear_proj" in key: - dim = 1 - return torch.cat(tp_data, dim=dim) - - def _load_state_dicts( - self, - model_ckpt_path: str, - sharded_dirs: list[str], - tp_size: int, - pp_size: int, - ) -> list[list[dict]]: - model_state_dict_lst = [[None for _ in range(tp_size)] for _ in range(pp_size)] - - def _process_one_megatron_shard(sharded_dir: str): - model_file_path = Path(model_ckpt_path) / sharded_dir / "model.pt" - state_dict = torch.load(model_file_path, map_location="cpu", weights_only=False) - tp_rank, pp_rank = self._get_tp_pp_rank_from_sharded_dir(sharded_dir) - model_state_dict_lst[pp_rank][tp_rank] = state_dict - - with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [ - executor.submit(_process_one_megatron_shard, sharded_dir) - for sharded_dir in sharded_dirs - ] - for future in tqdm( - futures, - desc=f"Loading {len(sharded_dirs)} Megatron shards", - total=len(sharded_dirs), - ): - future.result() - - return model_state_dict_lst - - def _merge_state_dicts( - self, - model_state_dict_lst: list[list[dict]], - tp_size: int, - pp_size: int, - ) -> dict[str, torch.Tensor]: - state_dict = {} - vpp_size = len(model_state_dict_lst[0][0]) - layers_cum = 0 - - for vpp_rank in range(vpp_size): - for pp_rank in range(pp_size): - layers_handled = 0 - keys = model_state_dict_lst[pp_rank][0][vpp_rank].keys() - for key in keys: - if "extra_state" in key: - continue - if self.config.tie_word_embedding and ("output_layer" in key): - print("skip lm_head and reward_head loading because of tie_word_embeddings") - continue - - new_key = key - if "decoder.layers." in key: - local_layer_no = int(key.split(".")[2]) - layers_handled = max(local_layer_no, layers_handled) - global_layer_no = local_layer_no + layers_cum - new_key_list = key.split(".") - new_key_list[2] = str(global_layer_no) - new_key = ".".join(new_key_list) - - tp_data = [ - model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] - for tp_rank in range(tp_size) - ] - merged = self._merge_across_tp( - new_key, - tp_data, - self.model_config, - tp_size, - self.config.is_value_model, - ) - - if not isinstance(merged, list): - state_dict[new_key] = merged - elif len(merged) == 3: - # split qkv - for n, d in zip(["q", "k", "v"], merged): - state_dict[new_key.replace("linear_qkv", f"linear_{n}")] = d - elif len(merged) == 2: - # split gate up - state_dict[new_key.replace("linear_fc1", "gate_proj")] = merged[0] - state_dict[new_key.replace("linear_fc1", "up_proj")] = merged[1] - - layers_cum += layers_handled + 1 # zero based - - return state_dict - - def merge_and_save(self): - from verl.utils.megatron_utils import get_model_checkpoint_path - - model_ckpt_path = get_model_checkpoint_path(self.config.local_dir) - sharded_dirs, tp_size, pp_size = self._check_megatron_checkpoint_path(model_ckpt_path) - print( - f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}" - ) - - model_state_dict_lst = self._load_state_dicts( - model_ckpt_path, sharded_dirs, tp_size, pp_size - ) - merged_state_dict = self._merge_state_dicts(model_state_dict_lst, tp_size, pp_size) - del model_state_dict_lst - - if self.config.operation == "test": - if not self.config.test_hf_dir: - raise ValueError("test_hf_dir must be provided for test operation") - self._test_state_dict(merged_state_dict) - elif self.config.operation == "merge": - self.save_hf_model_and_tokenizer(merged_state_dict) - if self.config.hf_upload: - self.upload_to_huggingface() - else: - raise ValueError(f"Unknown operation: {self.config.operation}") - - def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): - """ - Compares the merged Megatron state_dict against a reference safetensors model. - Applies necessary name mappings from Megatron to Hugging Face conventions using _replace_name. - """ - ref_state_dict = load_file(Path(self.config.test_hf_dir) / "model.safetensors") - - params_mapping = [ - # (megatron core gpt model name, vllm model name) - ( - "self_attention.linear_qkv.layer_norm_weight", - "input_layernorm.weight", - ), - ( - "self_attention.linear_qkv.layer_norm_bias", - "input_layernorm.bias", - ), - ("embedding.word_embeddings", "model.embed_tokens"), - ("self_attention.linear_qkv", "self_attn.qkv_proj"), - ("self_attention.linear_proj", "self_attn.o_proj"), - ("pre_mlp_layernorm", "post_attention_layernorm"), - ( - "mlp.linear_fc1.layer_norm_weight", - "post_attention_layernorm.weight", - ), - ( - "mlp.linear_fc1.layer_norm_bias", - "post_attention_layernorm.bias", - ), - ("mlp.linear_fc1", "mlp.gate_up_proj"), - ("mlp.linear_fc2", "mlp.down_proj"), - ("decoder.final_layernorm", "model.norm"), - ("output_layer", "lm_head"), - ("self_attention.linear_q", "self_attn.q_proj"), - ("self_attention.linear_k", "self_attn.k_proj"), - ("self_attention.linear_v", "self_attn.v_proj"), - ] - - for original_name, loaded_weight in state_dict.items(): - name = self._replace_name(original_name, params_mapping) - if not name or name.endswith(".bias") and name not in ref_state_dict: - continue - if "rotary_emb.inv_freq" in name: - continue - if self.config.tie_word_embedding and "lm_head.weight" in name: - continue - if name not in ref_state_dict: - raise RuntimeError(f"key: {name} not exist in state_dict") - param = ref_state_dict[name] - assert loaded_weight.dtype == param.dtype - torch.testing.assert_close(loaded_weight, param, atol=1e-2, rtol=5e-2) - - def _replace_name(self, megatron_name: str, name_mapping: list[tuple[str, str]]) -> str: - for m_name, v_name in name_mapping: - if m_name not in megatron_name: - continue - if "layers" in megatron_name: # deal with decoder layers - megatron_name = megatron_name.replace("decoder", "model") - megatron_name_list = megatron_name.split(".") - if ( - "layer_norm_weight" in megatron_name_list - or "layer_norm_bias" in megatron_name_list - ): - param_name_list = megatron_name_list[:3] - param_name_list.append(v_name) - param_name = ".".join(param_name_list) - else: - param_name_list = megatron_name_list[:3] - weight_or_bias = megatron_name_list[-1] - param_name_list.append(v_name) - param_name_list.append(weight_or_bias) - param_name = ".".join(param_name_list) - return param_name - else: - param_name = megatron_name.replace(m_name, v_name) - return param_name - return None # Return None if no mapping found - - -def main(): - parser = argparse.ArgumentParser(description="verl model merger") - subparsers = parser.add_subparsers( - dest="operation", - required=True, - help="Specify 'merge' or 'test' operation.", - ) - - base_op_parser = argparse.ArgumentParser(add_help=False) - base_op_parser.add_argument( - "--backend", - type=str, - required=True, - choices=["fsdp", "megatron"], - help="The backend of the model", - ) - base_op_parser.add_argument( - "--local_dir", - type=str, - required=True, - help="Path to the saved model checkpoints", - ) - base_op_parser.add_argument( - "--hf_model_path", - type=str, - default=None, - help="(Deprecated) Path to the original Hugging Face model for config.", - ) - base_op_parser.add_argument( - "--tie-word-embedding", - action="store_true", - help="Whether to tie word embedding weights (currently only Megatron supported)", - ) - base_op_parser.add_argument( - "--is-value-model", - action="store_true", - help="Whether the model is a value model (currently only Megatron supported)", - ) - - merge_parser = subparsers.add_parser( - "merge", - parents=[base_op_parser], - help="Merge model checkpoints and save.", - ) - merge_parser.add_argument( - "--target_dir", - default="tmp", - type=str, - help="Directory to save the merged huggingface model", - ) - merge_parser.add_argument( - "--hf_upload_path", - default=None, - type=str, - help="Hugging Face repository ID to upload the model", - ) - merge_parser.add_argument( - "--private", - action="store_true", - help="Whether to upload the model to a private Hugging Face repository", - ) - - test_parser = subparsers.add_parser( - "test", - parents=[base_op_parser], - help="Test merged model against a reference Hugging Face model", - ) - test_parser.add_argument( - "--test_hf_dir", - type=str, - required=True, - help="Path to the reference Hugging Face model directory for testing", - ) - - args = parser.parse_args() - - common_config_args = { - "operation": args.operation, - "backend": args.backend, - "tie_word_embedding": args.tie_word_embedding, - "is_value_model": args.is_value_model, - "local_dir": args.local_dir, - "hf_model_path": args.hf_model_path, - "hf_model_config_path": args.local_dir, - } - - if args.operation == "merge": - config = ModelMergerConfig( - **common_config_args, - target_dir=args.target_dir, - hf_upload_path=args.hf_upload_path, - private=args.private, - test_hf_dir=None, - ) - os.makedirs(config.target_dir, exist_ok=True) - elif args.operation == "test": - config = ModelMergerConfig( - **common_config_args, - test_hf_dir=args.test_hf_dir, - # the following args are not used by test operation - target_dir=None, - hf_upload_path=None, - private=False, - ) - else: - raise NotImplementedError(f"Unknown operation: {args.operation}") - - if config.backend == "fsdp": - merger = FSDPModelMerger(config) - elif config.backend == "megatron": - merger = MegatronModelMerger(config) - else: - raise NotImplementedError(f"Unknown backend: {config.backend}") - - merger.merge_and_save() - - -if __name__ == "__main__": - main() From 173f6f78465fb52fdd6107edc9056a5396bc3650 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 17:42:35 +0800 Subject: [PATCH 206/462] add docker build Former-commit-id: be0764199de87d28bfbf50d0d4d6e3fa2a1255b5 --- .github/workflows/docker.yaml | 67 +++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- scripts/docker/dockerfile | 6 ++-- 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/docker.yaml diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml new file mode 100644 index 00000000..3b4eae9c --- /dev/null +++ b/.github/workflows/docker.yaml @@ -0,0 +1,67 @@ +# +name: Create and publish a Docker image + +on: + release: + types: [published] + + workflow_dispatch: + inputs: + ref: + description: 'The git ref (branch or tag) to build the Docker image from.' + required: true + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push-image: + runs-on: self-hosted + timeout-minutes: 240 # wait up to 4 hours + # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job. + permissions: + contents: read + packages: write + attestations: write + id-token: write + steps: + - name: Checkout repository + uses: actions/checkout@v5 + # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels. + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=match,pattern=\d.\d.\d + type=sha + # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages. + # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository. + # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step. + - name: Build and push Docker image + id: push + uses: docker/build-push-action@v4 + with: + context: . + push: true + file: scripts/docker/dockerfile + shm-size: 64g + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see [Using artifact attestations to establish provenance for builds](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds). + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v3 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/pyproject.toml b/pyproject.toml index 034ac597..4b68ec09 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ classifiers = [ requires-python = ">=3.10,<3.13" dependencies = [ "agentscope>=1.0.7", - "trinity-rft>=0.3.2", + "trinity-rft>=0.3.3", "loguru", "pydantic", "beast_logger", diff --git a/scripts/docker/dockerfile b/scripts/docker/dockerfile index 54fd1fff..4fe07a51 100644 --- a/scripts/docker/dockerfile +++ b/scripts/docker/dockerfile @@ -19,8 +19,8 @@ RUN chmod 1777 /tmp && apt update && apt install -y \ && ln -sf /usr/bin/pip3 /usr/bin/pip # For aliyun users, set pip source to aliyun mirror -ENV PIP_INDEX_URL=http://mirrors.cloud.aliyuncs.com/pypi/simple/ -ENV PIP_TRUSTED_HOST=mirrors.cloud.aliyuncs.com +# ENV PIP_INDEX_URL=http://mirrors.cloud.aliyuncs.com/pypi/simple/ +# ENV PIP_TRUSTED_HOST=mirrors.cloud.aliyuncs.com # set uv virtual environment path to a outside-of-workspace dir ENV VIRTUAL_ENV=/opt/venv @@ -32,7 +32,7 @@ COPY . . RUN pip install uv # use uv to create a virtual environment and install dependencies -RUN uv venv /opt/venv --python=3.10.16 && \ +RUN uv venv /opt/venv --python=3.12 && \ . /opt/venv/bin/activate && \ uv pip install -e.[dev,flash_attn] From 26a723ff20c3ef626016ca139b32ac4c5b0778bd Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 17:50:38 +0800 Subject: [PATCH 207/462] remove some redundant files Former-commit-id: 32661bad6bb58767963df1dcad0f04282b764d10 --- .gitmodules | 9 - astune_tests/__init__.py | 0 .../test_apply_chat_template/__init__.py | 0 .../agentscope_for_test.py | 100 - .../test_apply_chat_template/test.yaml | 51 - astune_tests/test_tracing.py | 42 - astune_tests/test_tracing_reader.py | 152 -- .../test_utils/read_config_from_yaml.py | 6 - astune_tests/testing_rubrics.py | 169 -- documents/backbones.md | 47 - documents/tokenizer_nodes.md | 132 - documents/vllm_tokenizer.py | 2277 ----------------- old_readme.md | 155 -- project-diagram.png | Bin 268383 -> 0 bytes test_launcher.py | 38 - vsdb.py | 110 - 16 files changed, 3288 deletions(-) delete mode 100644 .gitmodules delete mode 100644 astune_tests/__init__.py delete mode 100644 astune_tests/test_apply_chat_template/__init__.py delete mode 100644 astune_tests/test_apply_chat_template/agentscope_for_test.py delete mode 100644 astune_tests/test_apply_chat_template/test.yaml delete mode 100644 astune_tests/test_tracing.py delete mode 100644 astune_tests/test_tracing_reader.py delete mode 100644 astune_tests/test_utils/read_config_from_yaml.py delete mode 100644 astune_tests/testing_rubrics.py delete mode 100644 documents/backbones.md delete mode 100644 documents/tokenizer_nodes.md delete mode 100644 documents/vllm_tokenizer.py delete mode 100644 old_readme.md delete mode 100644 project-diagram.png delete mode 100644 test_launcher.py delete mode 100644 vsdb.py diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 12e7e9d8..00000000 --- a/.gitmodules +++ /dev/null @@ -1,9 +0,0 @@ -[submodule "external/envservice"] - path = external/envservice - url = http://gitlab.alibaba-inc.com/EconML/EnvService.git -[submodule "external/verl"] - path = external/verl - url = https://github.com/volcengine/verl.git -[submodule "external/experiencemaker"] - path = external/experiencemaker - url = http://gitlab.alibaba-inc.com/OpenRepo/ExperienceMaker.git diff --git a/astune_tests/__init__.py b/astune_tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/astune_tests/test_apply_chat_template/__init__.py b/astune_tests/test_apply_chat_template/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/astune_tests/test_apply_chat_template/agentscope_for_test.py b/astune_tests/test_apply_chat_template/agentscope_for_test.py deleted file mode 100644 index f7e8e032..00000000 --- a/astune_tests/test_apply_chat_template/agentscope_for_test.py +++ /dev/null @@ -1,100 +0,0 @@ -from agentscope.message import Msg -from beast_logger import print_dict -from loguru import logger -from pydantic import BaseModel, Field - -from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask -from astune.utils.testing_utils import GoodbyeException, TestFailException - - -def extract_final_answer(result) -> str: - """Extract the final answer from the agent's response.""" - try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): - return result.metadata["result"] - if hasattr(result, "content"): - if isinstance(result.content, dict) and "result" in result.content: - return result.content["result"] - return str(result.content) - return str(result) - except Exception as e: - logger.warning(f"Extract final answer error: {e}. Raw: {result}") - return str(result) - - -class FinalResult(BaseModel): - result: str = Field( - description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" - ) - - -system_prompt = """ -You are an agent specialized in solving math problems with tools. -Please solve the math problem given to you. -You can write and execute Python code to perform calculation or verify your answer. -You should return your final answer within \\boxed{{}}. -""" - - -class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - - async def agentscope_execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: - from agentscope.agent import ReActAgent - from agentscope.formatter import DashScopeChatFormatter - from agentscope.memory import InMemoryMemory - from agentscope.tool import Toolkit, execute_python_code - - query = "A robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?" - self.toolkit = Toolkit() - self.toolkit.register_tool_function(execute_python_code) - self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=model_tuner, - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), - ) - self.agent.set_console_output_enabled(False) - msg = Msg("user", query, role="user") - result = await self.agent.reply(msg, structured_model=FinalResult) - final_answer = extract_final_answer(result) - return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) - - -class TEST_LAMBDA(object): - def __init__(self): - pass - - def __call__(self, key, value): - if key == "prompt_text": - expected = '<|im_start|>system\n\nYou are an agent specialized in solving math problems with tools.\nPlease solve the math problem given to you.\nYou can write and execute Python code to perform calculation or verify your answer.\nYou should return your final answer within \\boxed{{}}.\n\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n\n{"type": "function", "function": {"name": "execute_python_code", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}, "description": "Execute the given python code in a temp file and capture the return\\n\\ncode, standard output and error. Note you must `print` the output to get\\nthe result, and the tmp file will be removed right after the execution."}}\n{"type": "function", "function": {"name": "generate_response", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\\\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}, "description": "Generate a response. Note only the input argument `response` is\\n\\nvisible to the others, you should include all the necessary\\ninformation in the `response` argument."}}\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{"name": , "arguments": }\n<|im_end|>\n<|im_start|>user\nA robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?<|im_end|>\n<|im_start|>assistant\n' - if value != expected: - print_dict( - { - "expected": expected, - "value": value, - "key": key, - } - ) - raise TestFailException("Prompt text does not match expected value.") - elif key == "parsed_tool_calls": - if len(value) > 0: - raise GoodbyeException("Test passed!") - else: - raise TestFailException("No tool calls parsed when some were expected.") - else: - raise TestFailException(f"Unrecognized test key: {key}") - - def mock(self, key): - if key == "mock_decoded_text": - return 'To find the total number of bolts needed for the robe, we need to add the number of blue fiber bolts to the number of white fiber bolts. According to the problem, a robe takes 2 bolts of blue fiber and half that much white fiber. Therefore, the number of white fiber bolts is half of 2, which is 1. \n\nLet\'s calculate the total number of bolts.\n\n{"name": "execute_python_code", "arguments": {"code": "blue_fiber_bolts = 2\\nwhite_fiber_bolts = blue_fiber_bolts / 2\\ntotal_bolts = blue_fiber_bolts + white_fiber_bolts\\ntotal_bolts"}}\n\nresponse = "The total number of bolts needed for the robe is {}."\nresult = "\\\\boxed{3}"\n\n{"name": "generate_response", "arguments": {"response": "The total number of bolts needed for the robe is 3.", "result": "\\\\boxed{3}"}}\n<|im_end|>' - else: - raise TestFailException(f"Unrecognized mock key: {key}") diff --git a/astune_tests/test_apply_chat_template/test.yaml b/astune_tests/test_apply_chat_template/test.yaml deleted file mode 100644 index 28ccf3e7..00000000 --- a/astune_tests/test_apply_chat_template/test.yaml +++ /dev/null @@ -1,51 +0,0 @@ -# ------------------ 主要配置 ------------------ -astune: - project_name: test - experiment_name: test_apply_chat_template_01 - task_reader: - type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` - huggingface_dat_repo: - dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' - training_split: "train" - validation_split: "test" - - task_judge: - # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge - - model: - # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - - rollout: - agentscope_learn_protocol: "astune_tests.test_apply_chat_template.agentscope_for_test->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent - temperature: 1.0 - max_env_worker: 1 - - debug: - debug_max_parallel: 1 - debug_first_n_tasks: 1 - - trainer_common: - total_epochs: 1 - num_repeat: 2 - train_batch_size: 8 - - execute_test: "test_apply_chat_template_01" # DO NOT EDIT, FOR TESTING PURPOSE ONLY - execute_testing_lambda: "astune_tests.test_apply_chat_template.agentscope_for_test->TEST_LAMBDA" # ✨✨✨✨ 编写并选择Agent - -# ------------------ 不需要修改 ------------------ -hydra: - searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only - - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only - -# ------------------ 不需要修改 ------------------ -defaults: - - ppo_trainer # verl inherit 1/2 - - verl_default # verl inherit 2/2 - - trinity_default # trinity inherit 1/1 - - astune_default - - _self_ diff --git a/astune_tests/test_tracing.py b/astune_tests/test_tracing.py deleted file mode 100644 index badd02b7..00000000 --- a/astune_tests/test_tracing.py +++ /dev/null @@ -1,42 +0,0 @@ -import json -from pathlib import Path -from typing import List - -import pytest - -from astune.schema.task import Task -from astune.task_reader.tracing_reader import TracingReader - - -@pytest.fixture -def config(tmp_path: Path) -> dict: - return { - "astune": { - "base_url": ".trash/database.sqlite", - "train_output_path": str(tmp_path / "tasks.jsonl"), - } - } - - -reader = TracingReader(config) # type: ignore -reader._connector = connector # type: ignore[attr-defined] -reader._filters = [flt] # type: ignore[attr-defined] - -result = reader.get_training_tasks() - -# connector should be called once -assert connector.called == 1 - -# filter should receive all new tasks -assert flt.last_input == tasks - -# returned tasks should be exactly the filtered ones -assert result == tasks - -# file should be created with one json per line -out_path = Path(config["train_output_path"]) -assert out_path.exists() -with out_path.open("r", encoding="utf-8") as f: - lines = [json.loads(line) for line in f if line.strip()] -assert len(lines) == 2 -assert {obj["metadata"]["qa_hash"] for obj in lines} == {"h1", "h2"} diff --git a/astune_tests/test_tracing_reader.py b/astune_tests/test_tracing_reader.py deleted file mode 100644 index c31e0a25..00000000 --- a/astune_tests/test_tracing_reader.py +++ /dev/null @@ -1,152 +0,0 @@ -from pathlib import Path -from types import SimpleNamespace -from typing import List - -import pytest - -from astune.schema.task import Task -from astune.task_reader.tracing_reader import TracingReader - - -class DummyConnector: - def __init__(self, tasks: List[Task]): - self._tasks = tasks - self.called = 0 - - def load_tasks_from_conversation( - self, projects_limit: int = 100, spans_limit: int = 100 - ) -> List[Task]: - self.called += 1 - return self._tasks - - -class DummyFilter: - def __init__(self, kept: List[Task]): - self._kept = kept - self.last_input: List[Task] | None = None - - def filter(self, tasks: List[Task]) -> List[Task]: - self.last_input = list(tasks) - return self._kept - - -def _make_task(query: str, answer: str, qa_hash: str | None) -> Task: - metadata = {"answer": answer} - if qa_hash is not None: - metadata["qa_hash"] = qa_hash - return Task( - main_query=query, - task_id="tid", - env_type="env", - metadata=metadata, - ) - - -# @pytest.fixture -# def config(tmp_path: Path) -> dict: -# from astune.utils.config_utils import read_astune_config -# return read_astune_config('tutorial/example_math_agent/math_agent.yaml') # type: ignore - - -# def test_get_training_tasks_new_file(config: dict): -# from types import SimpleNamespace -# from astune.task_reader.tracing_reader import TracingReader, Config -# from astune.schema.task import Task -# from dotenv import load_dotenv; load_dotenv() - -# # t=SimpleNamespace() -# # t.astune=SimpleNamespace() - -# tr=TracingReader(config) -# print(tr.get_training_tasks()) - - -# prepare tests/database.sqlite from agentscope first - -import json -from pathlib import Path -from types import SimpleNamespace -from typing import List - -import pytest - -from astune.schema.task import Task -from astune.task_reader.tracing_reader import TracingReader - - -@pytest.fixture -def config(tmp_path: Path) -> SimpleNamespace: - a = SimpleNamespace() - a.astune = SimpleNamespace() - a.astune.tracing = { - "base_url": "./.trash/database.sqlite", - "train_output_path": str(tmp_path / "tasks.jsonl"), - "filters": [], - } - return a - - -@pytest.fixture -def config_with_filter(tmp_path: Path) -> SimpleNamespace: - a = SimpleNamespace() - a.astune = SimpleNamespace() - a.astune.tracing = { - "base_url": "./.trash/database.sqlite", - "train_output_path": str(tmp_path / "tasks.jsonl"), - "filters": [ - { - "type": "llm_evaluate", - "enabled": True, - "params": { - "custom_rubrics": "If the answer claims that it has written the output to a file, consider it an invalid response.", - "temperature": 0.5, - "max_tokens": 2048, - "print_reason": False, - }, - } - ], - } - return a - - -def test_get_training_tasks_new_file(config: SimpleNamespace): - from dotenv import load_dotenv - - load_dotenv() - # prepare tasks returned from connector - reader = TracingReader(config, train_ratio=0.7) # type: ignore - - result = reader.get_training_tasks() - # the number of tasks in tests/database.sqlite - assert len(result) == int(7 * 0.7) - - # file should be created with one json per line - out_path = Path(config.astune.tracing["train_output_path"]) - assert out_path.exists() - with out_path.open("r", encoding="utf-8") as f: - lines = [json.loads(line) for line in f if line.strip()] - assert len(lines) == 7 # the number of tasks in tests/database.sqlite - - -def test_get_training_tasks_with_filter( - config_with_filter: SimpleNamespace, config: SimpleNamespace -): - from dotenv import load_dotenv - - load_dotenv() - reader = TracingReader(config_with_filter) # type: ignore - - result = reader.get_training_tasks() - assert len(result) < int(7 * 0.7) - - reader_full = TracingReader(config) - result_full = reader_full.get_training_tasks() - - # find the diff - delta = [] - for task in result_full: - if task not in result: - delta.append(task) - - assert len(delta) > 1 - print("these tasks are filtered:", delta) diff --git a/astune_tests/test_utils/read_config_from_yaml.py b/astune_tests/test_utils/read_config_from_yaml.py deleted file mode 100644 index b6bd8d9a..00000000 --- a/astune_tests/test_utils/read_config_from_yaml.py +++ /dev/null @@ -1,6 +0,0 @@ -def read_yaml_config(file_path: str) -> dict: - import yaml - - with open(file_path, "r") as file: - config = yaml.safe_load(file) - return config diff --git a/astune_tests/testing_rubrics.py b/astune_tests/testing_rubrics.py deleted file mode 100644 index 343bfacb..00000000 --- a/astune_tests/testing_rubrics.py +++ /dev/null @@ -1,169 +0,0 @@ -import json -from pathlib import Path -from types import SimpleNamespace -from typing import List - -import pytest - -from astune.schema.task import Task, WorkflowOutput, WorkflowTask -from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge -from astune.task_reader.tracing_reader import TracingReader -from astune.utils.config_utils import read_astune_config - -# @pytest.fixture -# def config(tmp_path: Path) -> SimpleNamespace: -# a = SimpleNamespace() -# a.astune = SimpleNamespace() -# a.astune.tracing = { -# "base_url": "./.trash/database.sqlite", -# "train_output_path": str(tmp_path / "tasks.jsonl"), -# "filters": [], -# } -# return a - - -# @pytest.fixture -# def config_with_filter(tmp_path: Path) -> SimpleNamespace: -# a = SimpleNamespace() -# a.astune = SimpleNamespace() -# a.astune.tracing = { -# "base_url": "./.trash/database.sqlite", -# "train_output_path": str(tmp_path / "tasks.jsonl"), -# "filters": [ -# { -# "type": "llm_evaluate", -# "enabled": True, -# "params": { -# "custom_rubrics": "If the answer claims that it has written the output to a file, consider it an invalid response.", -# "temperature": 0.5, -# "max_tokens": 2048, -# "print_reason": False, -# }, -# } -# ], -# } -# return a - - -def create_math_reference_samples(num_samples: int = 10) -> List[WorkflowTask]: - """ - Create reference math problem samples for Pointwise rubric generation. - - Each sample contains a single answer with a score label. - """ - samples = [] - - # Simple math problems with answers and scores - # Format: (query, answer, score) - problems = [ - ("What is 15 + 27?", "42", 1), - ("Calculate 8 * 9", "72", 1), - ("What is 100 - 37?", "63", 1), - ("Find the value of 144 / 12", "12", 1), - ("What is 5^3?", "125", 1), - ("Calculate 23 + 45 - 18", "50", 1), - ("What is 7 * 8 + 6?", "62", 1), - ("Find the value of (15 + 5) * 2", "40", 1), - ("What is 99 - 33 - 22?", "44", 1), - ("Calculate 16 / 4 + 10", "14", 1), - ] - - for i in range(min(num_samples, len(problems))): - query, answer, score = problems[i] - - task = Task( - main_query=query, - task_id=f"ref_sample_{i}", - metadata={"answer": answer, "score": score}, # Pointwise label - ) - - workflow_task = WorkflowTask( - task_id=f"ref_sample_{i}", - task=task, - ) - - samples.append(workflow_task) - - return samples - - -def create_math_test_samples(num_samples: int = 5) -> List[tuple[WorkflowTask, WorkflowOutput]]: - """Create test samples (task + output pairs) for evaluation.""" - samples = [] - - # Test problems with model outputs (some correct, some incorrect) - test_cases = [ - ("What is 25 + 38?", "63", "63", True), - ("Calculate 12 * 5", "60", "60", True), - ("What is 90 - 45?", "45", "45", True), - ("Find the value of 64 / 8", "8", "7", False), # Wrong answer - ("What is 3^4?", "81", "64", False), # Wrong answer - ("Calculate 18 + 22", "40", "40", True), - ("What is 9 * 7?", "63", "56", False), # Wrong answer - ("Find the value of (10 + 5) * 3", "45", "45", True), - ("What is 77 - 33?", "44", "44", True), - ("Calculate 20 / 5 + 15", "19", "19", True), - ("What is 6 * 8 - 10?", "38", "40", False), # Wrong answer - ("Find the value of 55 + 45", "100", "100", True), - ("What is 100 - 25 - 25?", "50", "50", True), - ("Calculate 7^2", "49", "49", True), - ("What is (20 - 5) / 3?", "5", "7", False), # Wrong answer - ] - - for i in range(min(num_samples, len(test_cases))): - query, reference, model_output, _ = test_cases[i] - - task = Task(main_query=query, task_id=f"test_sample_{i}", metadata={"answer": reference}) - - workflow_task = WorkflowTask( - task_id=f"test_sample_{i}", - task=task, - ) - - workflow_output = WorkflowOutput(metadata={"final_answer": model_output}) - - samples.append((workflow_task, workflow_output)) - - return samples - - -async def test_get_training_tasks_new_file(): - config = read_astune_config("astune/default_config/astune_default.yaml") - # Step 1: Create reference samples for rubric generation - print("\nStep 1: Creating reference samples...") - reference_samples = create_math_reference_samples(num_samples=10) - print(f"Created {len(reference_samples)} reference samples") - - # Step 2: Initialize judge - print("\nStep 2: Initializing RMAutoGraderJudge...") - judge = RMAutoGraderJudge(config) - - # Step 3: Generate rubrics from reference samples - print("\nStep 3: Generating rubrics from reference samples...") - print("(This may take a few minutes depending on the number of samples)") - await judge.generate_rubrics_from_samples(reference_samples) - print("✓ Rubrics generated successfully!") - print(f"\nGenerated rubrics:\n{judge.llm_grader.rubrics}\n") - - # Step 4: Evaluate new samples using generated rubrics - print("\nStep 4: Evaluating new samples...") - test_samples = create_math_test_samples(num_samples=5) - - for i, (task, output) in enumerate(test_samples, 1): - print(f"\n--- Test Sample {i} ---") - print(f"Query: {task.task.main_query}") - print(f"Answer: {output.metadata['final_answer']}") - print(f"Reference: {task.task.metadata['answer']}") - - # Use async method directly since we're in async context - reward = await judge._async_compute_reward(task, output) - print(f"Result: {reward}") - - print("\n" + "=" * 60) - print("Example 1 completed!") - print("=" * 60) - - -import asyncio - -asyncio.run(test_get_training_tasks_new_file()) diff --git a/documents/backbones.md b/documents/backbones.md deleted file mode 100644 index e02bc641..00000000 --- a/documents/backbones.md +++ /dev/null @@ -1,47 +0,0 @@ -### Other Backbones - -1. Trinity backbone: Click to read trinity backbone installation (Option 1) - -```bash -# Create virtual environment -uv venv --python=3.10.16 -source .venv/bin/activate -git clone https://github.com/binary-husky/Trinity-RFT external/trinity - -# Install dependencies -uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ -uv pip install -r requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow -uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps - -# Install flash attention (must be installed last) -uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation -``` - -2. VERL Backbone: Click to read VERL backbone installation (Option 2) - - -```bash -# Create virtual environment -uv venv --python=3.10.16 -source .venv/bin/activate -git clone https://github.com/binary-husky/verl.git external/verl - -# Install dependencies -uv pip install --upgrade pip setuptools packaging -i https://mirrors.aliyun.com/pypi/simple/ -uv pip install -r scripts/requirements_verl.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow -uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no-deps - -# Install flash attention (must be installed last) -uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation -``` - - -3. 🔄Switch Verl/Trinity backbone: cannot install both backbone at the same time, run the following command to toggle. - -```bash -# verl -> trinity -cd external/verl && uv pip uninstall . && cd ../.. - -# trinity -> verl -uv pip install -e external/verl -i https://mirrors.aliyun.com/pypi/simple/ --no-deps -``` diff --git a/documents/tokenizer_nodes.md b/documents/tokenizer_nodes.md deleted file mode 100644 index 287106ab..00000000 --- a/documents/tokenizer_nodes.md +++ /dev/null @@ -1,132 +0,0 @@ - -### case 1 - -```python -pprint(messages) -[{'role': 'assistant', - 'tool_calls': [{'function': {'arguments': {'location': 'Paris, France', - 'unit': 'celsius'}, - 'name': 'get_current_temperature'}, - 'type': 'function'}]}] -``` - ---------------------------------------------------------------------------------------------------- -print(self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)) -```python -<|im_start|>system -You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|> -<|im_start|>assistant - -{"name": "get_current_temperature", "arguments": {"location": "Paris, France", "unit": "celsius"}} -<|im_end|> -``` - - -### case 2 - -```python -pprint(messages) -[{'content': 'THIS IS CONTENT', - 'role': 'assistant', - 'tool_calls': [{'function': {'arguments': {'location': 'Paris, France', - 'unit': 'celsius'}, - 'name': 'get_current_temperature'}, - 'type': 'function'}]}] -``` - ---------------------------------------------------------------------------------------------------- -print(self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)) -```python -<|im_start|>system -You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|> -<|im_start|>assistant -THIS IS CONTENT - -{"name": "get_current_temperature", "arguments": {"location": "Paris, France", "unit": "celsius"}} -<|im_end|> -``` - -### case 3 - -```python -pprint(messages) -[{'content': 'THIS IS CONTENT', - 'role': 'assistant', - 'tool_calls': [{'function': {'arguments': {'location': 'Paris, France', - 'unit': 'celsius'}, - 'name': 'get_current_temperature'}, - 'type': 'function'}]}] -``` - -```python -print(tools) -[ - {'type': 'function', 'function': {'name': 'execute_python_code', 'parameters': {'properties': {'code': {'description': 'The Python code to be executed.', 'type': 'string'}, 'timeout': {'default': 300, 'description': 'The maximum time (in seconds) allowed for the code to run.', 'type': 'number'}}, 'required': ['code'], 'type': 'object'}, 'description': 'Execute the given python code in a temp file and capture the return\n\ncode, standard output and error. Note you must `print` the output to get\nthe result, and the tmp file will be removed right after the execution.'}}, - {'type': 'function', 'function': {'name': 'generate_response', 'parameters': {'properties': {'response': {'description': 'Your response to the user.', 'type': 'string'}, 'result': {'description': 'Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}', 'type': 'string'}}, 'required': ['response', 'result'], 'type': 'object'}, 'description': 'Generate a response. Note only the input argument `response` is\n\nvisible to the others, you should include all the necessary\ninformation in the `response` argument.'}} -] -``` ---------------------------------------------------------------------------------------------------- - -```python -<|im_start|>system -You are Qwen, created by Alibaba Cloud. You are a helpful assistant. - -# Tools - -You may call one or more functions to assist with the user query. - -You are provided with function signatures within XML tags: - -{"type": "function", "function": {"name": "execute_python_code", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}, "description": "Execute the given python code in a temp file and capture the return\n\ncode, standard output and error. Note you must `print` the output to get\nthe result, and the tmp file will be removed right after the execution."}} -{"type": "function", "function": {"name": "generate_response", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}, "description": "Generate a response. Note only the input argument `response` is\n\nvisible to the others, you should include all the necessary\ninformation in the `response` argument."}} - - -For each function call, return a json object with function name and arguments within XML tags: - -{"name": , "arguments": } -<|im_end|> -<|im_start|>assistant -THIS IS CONTENT - -{"name": "get_current_temperature", "arguments": {"location": "Paris, France", "unit": "celsius"}} -<|im_end|> -``` - -### - -/mnt/data_cpfs/fuqingxu/astune/.venv/bin/python -m vllm.entrypoints.cli.main serve /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct --tensor-parallel-size 4 --dtype auto --enforce-eager --gpu-memory-utilization 0.9 --disable-custom-all-reduce --max-num-seqs 10 --max-model-len 18000 --load-format auto --enable-chunked-prefill --enable-auto-tool-choice --tool-call-parser hermes --enable-prefix-caching --seed 12345 --port 18000 - -``` -<|im_start|>system - -You are an agent specialized in solving math problems with tools. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. You should return your final answer within \\boxed{{}}. - - -# Tools - -You may call one or more functions to assist with the user query. - -You are provided with function signatures within XML tags: - -{"type": "function", "function": {"name": "execute_python_code", "description": "Execute the given python code in a temp file and capture the return\ -\ -code, standard output and error. Note you must `print` the output to get\ -the result, and the tmp file will be removed right after the execution.", "parameters": {"properties": {"code": {"description": "The Python code to be executed.", "type": "string"}, "timeout": {"default": 300, "description": "The maximum time (in seconds) allowed for the code to run.", "type": "number"}}, "required": ["code"], "type": "object"}}} -{"type": "function", "function": {"name": "generate_response", "description": "Generate a response. Note only the input argument `response` is\ -\ -visible to the others, you should include all the necessary\ -information in the `response` argument.", "parameters": {"properties": {"response": {"description": "Your response to the user.", "type": "string"}, "result": {"description": "Your solution of the given math problem. Put your final answer in boxed format, e.g., \\\\boxed{42}", "type": "string"}}, "required": ["response", "result"], "type": "object"}}} - - -For each function call, return a json object with function name and arguments within XML tags: - -{"name": , "arguments": } -<|im_end|> -<|im_start|>user - -Natalia sold clips to 48 of her friends in April, and then she -sold half as many clips in May. How many clips did Natalia sell -altogether in April and May? -<|im_end|> -<|im_start|>assistant -``` diff --git a/documents/vllm_tokenizer.py b/documents/vllm_tokenizer.py deleted file mode 100644 index 2d66c4b7..00000000 --- a/documents/vllm_tokenizer.py +++ /dev/null @@ -1,2277 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project - -import warnings -from collections.abc import Mapping -from typing import Literal - -import pytest -from mistral_common.tokens.tokenizers.base import SpecialTokenPolicy -from vllm.assets.audio import AudioAsset -from vllm.assets.image import ImageAsset -from vllm.assets.video import VideoAsset -from vllm.config import ModelConfig -from vllm.entrypoints.chat_utils import ( - _try_extract_ast, - apply_mistral_chat_template, - load_chat_template, - parse_chat_messages, - parse_chat_messages_futures, - resolve_chat_template_content_format, - resolve_chat_template_kwargs, - resolve_hf_chat_template, -) -from vllm.multimodal import MultiModalDataDict, MultiModalUUIDDict -from vllm.multimodal.utils import ( - encode_audio_base64, - encode_image_base64, - encode_video_base64, -) -from vllm.transformers_utils.tokenizer import get_tokenizer -from vllm.transformers_utils.tokenizers.mistral import MistralTokenizer - -from ..models.registry import HF_EXAMPLE_MODELS -from ..utils import VLLM_PATH - -EXAMPLES_DIR = VLLM_PATH / "examples" - -PHI3V_MODEL_ID = "microsoft/Phi-3.5-vision-instruct" -ULTRAVOX_MODEL_ID = "fixie-ai/ultravox-v0_5-llama-3_2-1b" -QWEN2AUDIO_MODEL_ID = "Qwen/Qwen2-Audio-7B-Instruct" -QWEN2VL_MODEL_ID = "Qwen/Qwen2-VL-2B-Instruct" -QWEN25VL_MODEL_ID = "Qwen/Qwen2.5-VL-3B-Instruct" -QWEN25OMNI_MODEL_ID = "Qwen/Qwen2.5-Omni-7B" -QWEN3_MODEL_ID = "Qwen/Qwen3-8B" -LLAMA_GUARD_MODEL_ID = "meta-llama/Llama-Guard-3-1B" -HERMES_MODEL_ID = "NousResearch/Hermes-3-Llama-3.1-8B" -MISTRAL_MODEL_ID = "mistralai/Mistral-Small-3.1-24B-Instruct-2503" - - -@pytest.fixture(scope="function") -def phi3v_model_config(): - return ModelConfig( - PHI3V_MODEL_ID, - runner="generate", - trust_remote_code=True, - limit_mm_per_prompt={ - "image": 2, - }, - ) - - -@pytest.fixture(scope="function") -def phi3v_model_config_mm_interleaved(): - return ModelConfig( - PHI3V_MODEL_ID, - runner="generate", - trust_remote_code=True, - interleave_mm_strings=True, - limit_mm_per_prompt={ - "image": 2, - }, - ) - - -@pytest.fixture(scope="function") -def phi3v_model_config_image_embeds(): - return ModelConfig( - PHI3V_MODEL_ID, - runner="generate", - trust_remote_code=True, - limit_mm_per_prompt={ - "image": 2, - }, - enable_mm_embeds=True, - ) - - -@pytest.fixture(scope="module") -def phi3v_tokenizer(): - return get_tokenizer(PHI3V_MODEL_ID) - - -@pytest.fixture(scope="function") -def qwen2_audio_model_config(): - return ModelConfig( - QWEN2AUDIO_MODEL_ID, - runner="generate", - trust_remote_code=True, - limit_mm_per_prompt={ - "audio": 1, - }, - ) - - -@pytest.fixture(scope="module") -def qwen2_audio_tokenizer(): - return get_tokenizer(QWEN2AUDIO_MODEL_ID) - - -@pytest.fixture(scope="function") -def qwen25omni_model_config_mm_interleaved(): - return ModelConfig( - QWEN25OMNI_MODEL_ID, - runner="generate", - interleave_mm_strings=True, - limit_mm_per_prompt={ - "image": 2, - "audio": 1, - "video": 1, - }, - ) - - -@pytest.fixture(scope="module") -def qwen25omni_tokenizer(): - return get_tokenizer(QWEN25OMNI_MODEL_ID) - - -@pytest.fixture(scope="function") -def mistral_model_config(): - return ModelConfig( - MISTRAL_MODEL_ID, - runner="generate", - limit_mm_per_prompt={ - "image": 2, - }, - ) - - -@pytest.fixture(scope="module") -def mistral_tokenizer(): - return get_tokenizer(MISTRAL_MODEL_ID) - - -@pytest.fixture(scope="module") -def image_url(): - image = ImageAsset("cherry_blossom") - base64 = encode_image_base64(image.pil_image) - return f"data:image/jpeg;base64,{base64}" - - -@pytest.fixture(scope="module") -def video_url(): - video = VideoAsset("baby_reading", 1) - base64 = encode_video_base64(video.np_ndarrays) - return f"data:video/jpeg;base64,{base64}" - - -@pytest.fixture(scope="module") -def audio_url(): - audio = AudioAsset("mary_had_lamb") - base64 = encode_audio_base64(*audio.audio_and_sample_rate) - return f"data:audio/ogg;base64,{base64}" - - -def _assert_mm_data_is_image_input( - mm_data: MultiModalDataDict | None, - image_count: int, - skipped_image_indices: list | None = None, -) -> None: - assert mm_data is not None - assert set(mm_data.keys()) == {"image"} - - image_data = mm_data.get("image") - assert image_data is not None - - assert isinstance(image_data, list) and len(image_data) == image_count - if skipped_image_indices is not None: - for i in skipped_image_indices: - assert image_data[i] is None - - -def _assert_mm_uuids( - mm_uuids: MultiModalUUIDDict | None, - media_count: int, - expected_uuids: list[str | None], - modality: str = "image", -) -> None: - if len(expected_uuids) > 0: - assert mm_uuids is not None - assert modality in mm_uuids - - image_uuids = mm_uuids.get(modality) - assert image_uuids is not None - - assert isinstance(image_uuids, list) and len(image_uuids) == media_count - - assert image_uuids == expected_uuids - else: - assert mm_uuids is None - - -ModalityType = Literal["image", "video", "audio"] -MultiModalDataCounts = Mapping[ModalityType, int] - - -def _assert_mm_data_inputs( - mm_data: MultiModalDataDict | None, - data_count: MultiModalDataCounts, - skipped_media_indices: dict[str, list] | None = None, # modality -> list[int] -) -> None: - assert mm_data is not None - assert set(data_count.keys()) == (set(mm_data.keys())) - - for modality, n in data_count.items(): - modality_data = mm_data.get(modality) - assert modality_data is not None - assert isinstance(modality_data, list) and len(modality_data) == n - - if skipped_media_indices is not None: - skipped_media_indices_for_modality = skipped_media_indices.get(modality) - assert skipped_media_indices_for_modality is not None - for i in skipped_media_indices_for_modality: - assert modality_data[i] is None - - -def test_parse_chat_messages_single_image( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] - _assert_mm_data_is_image_input(mm_data, 1) - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) - - -def test_parse_chat_messages_single_image_with_uuid( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid = str(hash(image_url)) - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": { - "url": image_url, - }, - "uuid": image_uuid, - }, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] - _assert_mm_data_is_image_input(mm_data, 1) - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) - - -def test_parse_chat_messages_single_empty_image_with_uuid( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid = str(hash(image_url)) - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": None, - "uuid": image_uuid, - }, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] - _assert_mm_data_is_image_input(mm_data, 1, skipped_image_indices=[0]) - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) - - -def test_parse_chat_messages_single_image_with_bad_uuid_format( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid = str(hash(image_url)) - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": { - "url": image_url, - "uuid": image_uuid, - }, - "bad_uuid_key": image_uuid, - }, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] - _assert_mm_data_is_image_input(mm_data, 1) - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) - - -def test_parse_chat_messages_multiple_images_with_uuids( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid1 = "my_uuid_1" - image_uuid2 = "my_uuid_2" - - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": { - "url": image_url, - }, - "uuid": image_uuid1, - }, - { - "type": "image_url", - "image_url": { - "url": image_url, - }, - "uuid": image_uuid2, - }, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in the image?", - } - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) - - -def test_parse_chat_messages_multiple_empty_images_with_uuids( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid1 = "my_uuid_1" - image_uuid2 = "my_uuid_2" - - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": None, - "uuid": image_uuid1, - }, - { - "type": "image_url", - "image_url": None, - "uuid": image_uuid2, - }, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in the image?", - } - ] - _assert_mm_data_is_image_input(mm_data, 2, skipped_image_indices=[0, 1]) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) - - -def test_parse_chat_messages_mixed_empty_images_with_uuids( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid1 = "my_uuid_1" - image_uuid2 = "my_uuid_2" - - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": { - "url": image_url, - }, - "uuid": image_uuid1, - }, - { - "type": "image_url", - "image_url": None, - "uuid": image_uuid2, - }, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in the image?", - } - ] - _assert_mm_data_is_image_input(mm_data, 2, skipped_image_indices=[1]) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_single_image_with_uuid_async( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid = str(hash(image_url)) - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": image_uuid, - }, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] - _assert_mm_data_is_image_input(await mm_future, 1) - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_empty_image_with_uuid_async( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid = str(hash(image_url)) - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": None, - "uuid": image_uuid, - }, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] - _assert_mm_data_is_image_input(await mm_future, 1, skipped_image_indices=[0]) - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[image_uuid]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_multiple_images_with_uuids_async( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid1 = "my_uuid_1" - image_uuid2 = "my_uuid_2" - - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": image_uuid1, - }, - { - "type": "image_pil", - "image_pil": ImageAsset("cherry_blossom").pil_image, - "uuid": image_uuid2, - }, - {"type": "text", "text": "What's in these images?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", - } - ] - _assert_mm_data_is_image_input(await mm_future, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_multiple_empty_images_with_uuids_async( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid1 = "my_uuid_1" - image_uuid2 = "my_uuid_2" - - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": None, - "uuid": image_uuid1, - }, - { - "type": "image_pil", - "image_pil": None, - "uuid": image_uuid2, - }, - {"type": "text", "text": "What's in these images?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", - } - ] - _assert_mm_data_is_image_input(await mm_future, 2, skipped_image_indices=[0, 1]) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid1, image_uuid2]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_multiple_images_with_partial_uuids_async( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid2 = "my_uuid_2" - - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": {"url": image_url}, - }, - { - "type": "image_pil", - "image_pil": ImageAsset("cherry_blossom").pil_image, - "uuid": image_uuid2, - }, - {"type": "text", "text": "What's in these images?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", - } - ] - _assert_mm_data_is_image_input(await mm_future, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, image_uuid2]) - - -def test_parse_chat_messages_empty_system( - mistral_model_config, - mistral_tokenizer, -): - # Test string format - conversation, _, _ = parse_chat_messages( - [ - {"role": "system", "content": ""}, - { - "role": "user", - "content": [{"type": "text", "text": "Who are you?"}], - }, - ], - mistral_model_config, - mistral_tokenizer, - content_format="string", - ) - assert conversation == [ - {"role": "system", "content": ""}, - {"role": "user", "content": "Who are you?"}, - ] - - # Test openai format - conversation, _, _ = parse_chat_messages( - [ - {"role": "system", "content": ""}, - { - "role": "user", - "content": [{"type": "text", "text": "Who are you?"}], - }, - ], - mistral_model_config, - mistral_tokenizer, - content_format="openai", - ) - assert conversation == [ - {"role": "system", "content": [{"type": "text", "text": ""}]}, - { - "role": "user", - "content": [{"type": "text", "text": "Who are you?"}], - }, - ] - - -@pytest.mark.asyncio -async def test_parse_chat_messages_single_image_async( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "What's in the image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [{"role": "user", "content": "<|image_1|>\nWhat's in the image?"}] - _assert_mm_data_is_image_input(await mm_future, 1) - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[None]) - - -def test_parse_chat_messages_multiple_images( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - { - "type": "image_pil", - "image_pil": ImageAsset("cherry_blossom").pil_image, - }, - {"type": "text", "text": "What's in these images?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", - } - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -def test_parse_chat_messages_empty_pil_image_with_uuid( - phi3v_model_config, - phi3v_tokenizer, -): - uuid = "abcd" - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "image_pil", "image_pil": None, "uuid": uuid}, - {"type": "text", "text": "What's in this image?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\nWhat's in this image?", - } - ] - _assert_mm_data_is_image_input(mm_data, 1, skipped_image_indices=[0]) - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[uuid]) - - -def test_parse_chat_messages_empty_image_embeds_with_uuid( - phi3v_model_config_image_embeds, - phi3v_tokenizer, -): - uuid = "abcd" - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_embeds", - "image_embeds": None, - "uuid": uuid, - }, - {"type": "text", "text": "What's in this image?"}, - ], - } - ], - phi3v_model_config_image_embeds, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\nWhat's in this image?", - } - ] - assert mm_data is not None - assert "image" in mm_data - assert mm_data["image"] is None - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[uuid]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_empty_image_embeds_with_uuid_async( - phi3v_model_config_image_embeds, - phi3v_tokenizer, -): - uuid = "abcd" - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "image_embeds", - "image_embeds": None, - "uuid": uuid, - }, - {"type": "text", "text": "What's in this image?"}, - ], - } - ], - phi3v_model_config_image_embeds, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\nWhat's in this image?", - } - ] - mm_data = await mm_future - assert mm_data is not None - assert "image" in mm_data - assert mm_data["image"] is None - _assert_mm_uuids(mm_uuids, 1, expected_uuids=[uuid]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_multiple_images_async( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - { - "type": "image_pil", - "image_pil": ImageAsset("cherry_blossom").pil_image, - }, - {"type": "text", "text": "What's in these images?"}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", - } - ] - _assert_mm_data_is_image_input(await mm_future, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -def test_parse_chat_messages_placeholder_already_in_prompt( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "image_url", "image_url": {"url": image_url}}, - { - "type": "text", - "text": "What's in <|image_1|> and how does it compare to <|image_2|>?", # noqa: E501 - }, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - assert conversation == [ - { - "role": "user", - "content": "What's in <|image_1|> and how does it compare to <|image_2|>?", - } - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -def test_parse_chat_messages_placeholder_one_already_in_prompt( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "image_url", "image_url": {"url": image_url}}, - { - "type": "text", - "text": "What's in <|image_1|> and how does it compare to " - "the other one?", - }, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_2|>\nWhat's in <|image_1|> and how does it compare to " - "the other one?", - } - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -def test_parse_chat_messages_multiple_images_across_messages( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "What's in this image?"}, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "What about this one?"}, - ], - }, - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in this image?"}, - {"role": "assistant", "content": "Some stuff."}, - {"role": "user", "content": "<|image_2|>\nWhat about this one?"}, - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -def test_parse_chat_messages_multiple_images_with_uuids_across_messages( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - image_uuid = str(hash(image_url)) - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": image_uuid, - }, - {"type": "text", "text": "What's in this image?"}, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": image_uuid, - }, - {"type": "text", "text": "What about this one?"}, - ], - }, - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - {"role": "user", "content": "<|image_1|>\nWhat's in this image?"}, - {"role": "assistant", "content": "Some stuff."}, - {"role": "user", "content": "<|image_2|>\nWhat about this one?"}, - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid, image_uuid]) - - -def test_parse_chat_messages_context_text_format( - phi3v_model_config, - phi3v_tokenizer, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [{"type": "text", "text": "What's in this text?"}], - }, - {"role": "assistant", "content": "Some stuff."}, - {"role": "user", "content": "What about this one?"}, - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="openai", - ) - - assert conversation == [ - { - "role": "user", - "content": [{"type": "text", "text": "What's in this text?"}], - }, - { - "role": "assistant", - "content": [{"type": "text", "text": "Some stuff."}], - }, - { - "role": "user", - "content": [{"type": "text", "text": "What about this one?"}], - }, - ] - assert mm_data is None - assert mm_uuids is None - - -def test_parse_chat_messages_rejects_too_many_images_in_one_message( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - with warnings.catch_warnings(): - warnings.filterwarnings( - "ignore", - message="coroutine 'async_get_and_parse_image' was never awaited", - ) - with pytest.raises(ValueError, match="At most"): - parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": {"url": image_url}, - }, - { - "type": "image_url", - "image_url": {"url": image_url}, - }, - { - "type": "image_url", - "image_url": {"url": image_url}, - }, - { - "type": "text", - "text": "What's in these images?", - }, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - -def test_parse_chat_messages_rejects_too_many_images_across_messages( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - with warnings.catch_warnings(): - warnings.filterwarnings( - "ignore", - message="coroutine 'async_get_and_parse_image' was never awaited", - ) - with pytest.raises(ValueError, match="At most"): - parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": {"url": image_url}, - }, - {"type": "text", "text": "What's in this image?"}, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": {"url": image_url}, - }, - { - "type": "image_url", - "image_url": {"url": image_url}, - }, - {"type": "text", "text": "What about these two?"}, - ], - }, - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - -def test_parse_chat_messages_multiple_images_uncommon_input( - phi3v_model_config, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - "What's in these images?", - {"image_url": image_url}, - {"image_url": image_url}, - ], - } - ], - phi3v_model_config, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "<|image_1|>\n<|image_2|>\nWhat's in these images?", - } - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -def test_parse_chat_messages_multiple_images_interleave( - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "text", - "text": "I need you to compare this image", - }, - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "and this one"}, - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "Do they have differences?"}, - ], - } - ], - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "I need you to compare this image\n<|image_1|>\nand this one\n<|image_2|>\n" # noqa: E501 - "Do they have differences?", - } - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_multiple_images_interleave_async( - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "text", - "text": "I need you to compare this image", - }, - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "and this one"}, - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "Do they have differences?"}, - ], - } - ], - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "I need you to compare this image\n<|image_1|>\nand this one\n<|image_2|>\n" # noqa: E501 - "Do they have differences?", - } - ] - _assert_mm_data_is_image_input(await mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_multiple_images_with_uuids_interleave_async( - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - image_url, -): - image_uuid = str(hash(image_url)) - conversation, mm_data, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "text", - "text": "I need you to compare this image", - }, - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": image_uuid, - }, - {"type": "text", "text": "and this one"}, - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": image_uuid, - }, - {"type": "text", "text": "Do they have differences?"}, - ], - } - ], - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "I need you to compare this image\n<|image_1|>\nand this one\n<|image_2|>\n" # noqa: E501 - "Do they have differences?", - } - ] - _assert_mm_data_is_image_input(await mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid, image_uuid]) - - -def test_parse_chat_messages_multiple_images_multiple_messages_interleave( - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - image_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "Be accurate."}, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - {"type": "image_url", "image_url": {"url": image_url}}, - ], - }, - ], - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "What's on this image?\n<|image_1|>\nBe accurate.", - }, - {"role": "assistant", "content": "Some stuff."}, - {"role": "user", "content": "What's on this image?\n<|image_2|>"}, - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[None, None]) - - -def test_parse_chat_messages_multiple_images_with_uuids_multiple_messages_interleave( - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - image_url, -): - image_uuid = str(hash(image_url)) - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": image_uuid, - }, - {"type": "text", "text": "Be accurate."}, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": image_uuid, - }, - ], - }, - ], - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "What's on this image?\n<|image_1|>\nBe accurate.", - }, - {"role": "assistant", "content": "Some stuff."}, - {"role": "user", "content": "What's on this image?\n<|image_2|>"}, - ] - _assert_mm_data_is_image_input(mm_data, 2) - _assert_mm_uuids(mm_uuids, 2, expected_uuids=[image_uuid, image_uuid]) - - -def test_parse_chat_messages_multiple_modals_multiple_messages_interleave( - qwen25omni_model_config_mm_interleaved, - qwen25omni_tokenizer, - image_url, - video_url, - audio_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "Now listen to this audio"}, - {"type": "audio_url", "audio_url": {"url": audio_url}}, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "And what's in the video?"}, - {"type": "video_url", "video_url": {"url": video_url}}, - ], - }, - ], - qwen25omni_model_config_mm_interleaved, - qwen25omni_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" - "\nNow listen to this audio\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>", - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" - "\nAnd what's in the video?\n<|vision_start|><|VIDEO|><|vision_end|>", - }, - ] - - _assert_mm_data_inputs(mm_data, {"image": 2, "video": 1, "audio": 1}) - _assert_mm_uuids(mm_uuids, 2, modality="image", expected_uuids=[None, None]) - _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=[None]) - _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[None]) - - -def test_parse_chat_messages_multiple_modals_with_uuids_multiple_messages_interleave( - qwen25omni_model_config_mm_interleaved, - qwen25omni_tokenizer, - image_url, - video_url, - audio_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": "image_123", - }, - {"type": "text", "text": "Now listen to this audio"}, - { - "type": "audio_url", - "audio_url": {"url": audio_url}, - "uuid": "audio_123", - }, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": "image_123", - }, - {"type": "text", "text": "And what's in the video?"}, - { - "type": "video_url", - "video_url": {"url": video_url}, - "uuid": "video_123", - }, - ], - }, - ], - qwen25omni_model_config_mm_interleaved, - qwen25omni_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" - "\nNow listen to this audio\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>", - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" - "\nAnd what's in the video?\n<|vision_start|><|VIDEO|><|vision_end|>", - }, - ] - - _assert_mm_data_inputs(mm_data, {"image": 2, "video": 1, "audio": 1}) - _assert_mm_uuids( - mm_uuids, - 2, - modality="image", - expected_uuids=["image_123", "image_123"], - ) - _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) - _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=["audio_123"]) - - -def test_parse_chat_messages_multiple_modals_with_uuids_multiple_empty_media_messages_interleave( # noqa: E501 - qwen25omni_model_config_mm_interleaved, - qwen25omni_tokenizer, - image_url, - video_url, - audio_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - { - "type": "image_url", - "image_url": None, - "uuid": "image_123", - }, - {"type": "text", "text": "Now listen to this audio"}, - { - "type": "audio_url", - "audio_url": None, - "uuid": "audio_123", - }, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - { - "type": "image_url", - "image_url": None, - "uuid": "image_123", - }, - {"type": "text", "text": "And what's in the video?"}, - { - "type": "video_url", - "video_url": None, - "uuid": "video_123", - }, - ], - }, - ], - qwen25omni_model_config_mm_interleaved, - qwen25omni_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" - "\nNow listen to this audio\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>", - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" - "\nAnd what's in the video?\n<|vision_start|><|VIDEO|><|vision_end|>", - }, - ] - - _assert_mm_data_inputs( - mm_data, - {"image": 2, "video": 1, "audio": 1}, - skipped_media_indices={"image": [0, 1], "video": [0], "audio": [0]}, - ) - _assert_mm_uuids( - mm_uuids, - 2, - modality="image", - expected_uuids=["image_123", "image_123"], - ) - _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) - _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=["audio_123"]) - - -def test_parse_chat_messages_multiple_modals_with_partial_uuids_multiple_messages_interleave( # noqa: E501 - qwen25omni_model_config_mm_interleaved, - qwen25omni_tokenizer, - image_url, - video_url, - audio_url, -): - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - { - "type": "image_url", - "image_url": {"url": image_url}, - "uuid": "image_123", - }, - {"type": "text", "text": "Now listen to this audio"}, - {"type": "audio_url", "audio_url": {"url": audio_url}}, - ], - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": [ - {"type": "text", "text": "What's on this image?"}, - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "text", "text": "And what's in the video?"}, - { - "type": "video_url", - "video_url": {"url": video_url}, - "uuid": "video_123", - }, - ], - }, - ], - qwen25omni_model_config_mm_interleaved, - qwen25omni_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" - "\nNow listen to this audio\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>", - }, - {"role": "assistant", "content": "Some stuff."}, - { - "role": "user", - "content": "What's on this image?\n<|vision_start|><|IMAGE|><|vision_end|>" - "\nAnd what's in the video?\n<|vision_start|><|VIDEO|><|vision_end|>", - }, - ] - - _assert_mm_data_inputs(mm_data, {"image": 2, "video": 1, "audio": 1}) - _assert_mm_uuids(mm_uuids, 2, modality="image", expected_uuids=["image_123", None]) - _assert_mm_uuids(mm_uuids, 1, modality="video", expected_uuids=["video_123"]) - _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[None]) - - -def test_parse_chat_messages_multiple_images_interleave_with_placeholders( - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - image_url, -): - with pytest.raises( - ValueError, - match=r"Found more '<|image_1|>' placeholders in input prompt " - "than actual multimodal data items.", - ): - parse_chat_messages( - [ - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": image_url}}, - {"type": "image_url", "image_url": {"url": image_url}}, - { - "type": "text", - "text": "I need you to compare this image\n<|image_1|>\nand this one\n<|image_2|>\n" # noqa: E501 - "Do they have differences?", - }, - ], - } - ], - phi3v_model_config_mm_interleaved, - phi3v_tokenizer, - content_format="string", - ) - - -@pytest.mark.parametrize( - "model", - [ - QWEN2VL_MODEL_ID, # tokenizer.chat_template is of type str - HERMES_MODEL_ID, # tokenizer.chat_template is of type dict - ], -) -@pytest.mark.parametrize("use_tools", [True, False]) -def test_resolve_hf_chat_template(sample_json_schema, model, use_tools): - """checks that chat_template is a dict type for HF models.""" - model_info = HF_EXAMPLE_MODELS.find_hf_info(model) - model_info.check_available_online(on_fail="skip") - - model_config = ModelConfig( - model, - tokenizer=model_info.tokenizer or model, - tokenizer_mode=model_info.tokenizer_mode, - revision=model_info.revision, - trust_remote_code=model_info.trust_remote_code, - hf_overrides=model_info.hf_overrides, - skip_tokenizer_init=model_info.require_embed_inputs, - enable_prompt_embeds=model_info.require_embed_inputs, - enable_mm_embeds=model_info.require_embed_inputs, - enforce_eager=model_info.enforce_eager, - dtype=model_info.dtype, - ) - - # Build the tokenizer - tokenizer = get_tokenizer( - model, - trust_remote_code=model_config.trust_remote_code, - ) - - tools = ( - [ - { - "type": "function", - "function": { - "name": "dummy_function_name", - "description": "This is a dummy function", - "parameters": sample_json_schema, - }, - } - ] - if use_tools - else None - ) - - # Test detecting the tokenizer's chat_template - chat_template = resolve_hf_chat_template( - tokenizer, - chat_template=None, - tools=tools, - model_config=model_config, - ) - assert isinstance(chat_template, str) - - -@pytest.mark.parametrize( - "model, expected_kwargs", - [ - ( - QWEN2VL_MODEL_ID, - { - "add_vision_id", - "add_generation_prompt", - "continue_final_message", - "tools", - }, - ), - ( - QWEN3_MODEL_ID, - { - "enable_thinking", - "add_generation_prompt", - "continue_final_message", - "tools", - }, - ), - ], -) -def test_resolve_hf_chat_template_kwargs(sample_json_schema, model, expected_kwargs): - """checks that chat_template is a dict type for HF models.""" - model_info = HF_EXAMPLE_MODELS.find_hf_info(model) - model_info.check_available_online(on_fail="skip") - - tools = [ - { - "type": "function", - "function": { - "name": "dummy_function_name", - "description": "This is a dummy function", - "parameters": sample_json_schema, - }, - } - ] - - chat_template_kwargs = { - # both unused - "unsed_kwargs_1": 123, - "unsed_kwargs_2": "abc", - # should not appear - "chat_template": "{% Hello world! %}", - "tokenize": True, - # used by tokenizer - "continue_final_message": True, - "tools": tools, - # both used by Qwen2-VL and Qwen3 - "add_generation_prompt": True, - # only used by Qwen2-VL - "add_vision_id": True, - # only used by Qwen3 - "enable_thinking": True, - } - - model_config = ModelConfig( - model, - tokenizer=model_info.tokenizer or model, - tokenizer_mode=model_info.tokenizer_mode, - revision=model_info.revision, - trust_remote_code=model_info.trust_remote_code, - hf_overrides=model_info.hf_overrides, - skip_tokenizer_init=model_info.require_embed_inputs, - enable_prompt_embeds=model_info.require_embed_inputs, - enable_mm_embeds=model_info.require_embed_inputs, - enforce_eager=model_info.enforce_eager, - dtype=model_info.dtype, - ) - - # Build the tokenizer - tokenizer = get_tokenizer( - model, - trust_remote_code=model_config.trust_remote_code, - ) - - # Test detecting the tokenizer's chat_template - chat_template = resolve_hf_chat_template( - tokenizer, - chat_template=None, - tools=tools, - model_config=model_config, - ) - with pytest.raises(ValueError, match="Found unexpected chat template kwargs from request"): - # should raise error if `chat_template_kwargs` contains - # `chat_template` or `tokenize` - resolve_chat_template_kwargs( - tokenizer, - chat_template=chat_template, - chat_template_kwargs=chat_template_kwargs, - ) - resolved_chat_template_kwargs = resolve_chat_template_kwargs( - tokenizer, - chat_template=chat_template, - chat_template_kwargs=chat_template_kwargs, - raise_on_unexpected=False, - ) - assert set(resolved_chat_template_kwargs.keys()) == expected_kwargs - - # Additional test: Verify HF base parameters work with **kwargs tokenizers - # This validates the fix for tokenizers like Kimi K2 that use **kwargs - # to receive standard HuggingFace parameters instead of declaring them explicitly - from vllm.entrypoints.chat_utils import _get_hf_base_chat_template_params - - hf_base_params = _get_hf_base_chat_template_params() - # Verify common HF parameters are in the base class - assert { - "add_generation_prompt", - "tools", - "continue_final_message", - }.issubset(hf_base_params), f"Expected HF base params not found in {hf_base_params}" - - # Test with a mock tokenizer that uses **kwargs (like Kimi K2) - class MockTokenizerWithKwargs: - def apply_chat_template(self, conversation, **kwargs): - return "mocked_output" - - mock_tokenizer = MockTokenizerWithKwargs() - mock_kwargs = { - "add_generation_prompt": True, - "tools": tools, - "continue_final_message": False, - "unknown_param": "should_be_filtered", - } - resolved_mock = resolve_chat_template_kwargs( - mock_tokenizer, chat_template, mock_kwargs, raise_on_unexpected=False - ) - # HF base params should pass through even with **kwargs tokenizer - assert "add_generation_prompt" in resolved_mock - assert "tools" in resolved_mock - assert "continue_final_message" in resolved_mock - # Unknown params should be filtered out - assert "unknown_param" not in resolved_mock - - -# NOTE: Qwen2-Audio default chat template is specially defined inside -# processor class instead of using `tokenizer_config.json` -@pytest.mark.parametrize( - ("model", "expected_format"), - [ - (PHI3V_MODEL_ID, "string"), - (QWEN2VL_MODEL_ID, "openai"), - (QWEN25VL_MODEL_ID, "openai"), - (ULTRAVOX_MODEL_ID, "string"), - (QWEN2AUDIO_MODEL_ID, "openai"), - (LLAMA_GUARD_MODEL_ID, "openai"), - ], -) -def test_resolve_content_format_hf_defined(model, expected_format): - model_info = HF_EXAMPLE_MODELS.find_hf_info(model) - model_info.check_available_online(on_fail="skip") - - model_config = ModelConfig( - model, - tokenizer=model_info.tokenizer or model, - tokenizer_mode=model_info.tokenizer_mode, - revision=model_info.revision, - trust_remote_code=model_info.trust_remote_code, - hf_overrides=model_info.hf_overrides, - skip_tokenizer_init=model_info.require_embed_inputs, - enable_prompt_embeds=model_info.require_embed_inputs, - enable_mm_embeds=model_info.require_embed_inputs, - enforce_eager=model_info.enforce_eager, - dtype=model_info.dtype, - ) - - tokenizer = get_tokenizer( - model, - trust_remote_code=model_config.trust_remote_code, - ) - - # Test detecting the tokenizer's chat_template - chat_template = resolve_hf_chat_template( - tokenizer, - chat_template=None, - tools=None, - model_config=model_config, - ) - assert isinstance(chat_template, str) - - print("[TEXT]") - print(chat_template) - print("[AST]") - print(_try_extract_ast(chat_template)) - - resolved_format = resolve_chat_template_content_format( - None, # Test detecting the tokenizer's chat_template - None, - "auto", - tokenizer, - model_config=model_config, - ) - - assert resolved_format == expected_format - - -@pytest.mark.parametrize( - ("model", "expected_format"), - [ - ("Salesforce/blip2-opt-2.7b", "string"), - ("facebook/chameleon-7b", "string"), - ("deepseek-ai/deepseek-vl2-tiny", "string"), - ("adept/fuyu-8b", "string"), - ("google/paligemma-3b-mix-224", "string"), - ("Qwen/Qwen-VL", "string"), - ("Qwen/Qwen-VL-Chat", "string"), - ], -) -def test_resolve_content_format_fallbacks(model, expected_format): - model_info = HF_EXAMPLE_MODELS.find_hf_info(model) - model_info.check_available_online(on_fail="skip") - - model_config = ModelConfig( - model, - tokenizer=model_info.tokenizer or model, - tokenizer_mode=model_info.tokenizer_mode, - revision=model_info.revision, - trust_remote_code=model_info.trust_remote_code, - hf_overrides=model_info.hf_overrides, - skip_tokenizer_init=model_info.require_embed_inputs, - enable_prompt_embeds=model_info.require_embed_inputs, - enable_mm_embeds=model_info.require_embed_inputs, - enforce_eager=model_info.enforce_eager, - dtype=model_info.dtype, - ) - - tokenizer = get_tokenizer( - model_config.tokenizer, - trust_remote_code=model_config.trust_remote_code, - ) - - # Test detecting the tokenizer's chat_template - chat_template = resolve_hf_chat_template( - tokenizer, - chat_template=None, - tools=None, - model_config=model_config, - ) - assert isinstance(chat_template, str) - - print("[TEXT]") - print(chat_template) - print("[AST]") - print(_try_extract_ast(chat_template)) - - resolved_format = resolve_chat_template_content_format( - None, # Test detecting the tokenizer's chat_template - None, - "auto", - tokenizer, - model_config=model_config, - ) - - assert resolved_format == expected_format - - -@pytest.mark.parametrize( - ("template_path", "expected_format"), - [ - ("template_alpaca.jinja", "string"), - ("template_baichuan.jinja", "string"), - ("template_chatglm.jinja", "string"), - ("template_chatglm2.jinja", "string"), - ("template_chatml.jinja", "string"), - ("template_dse_qwen2_vl.jinja", "openai"), - ("template_falcon_180b.jinja", "string"), - ("template_falcon.jinja", "string"), - ("template_inkbot.jinja", "string"), - ("template_teleflm.jinja", "string"), - ("template_vlm2vec_phi3v.jinja", "openai"), - ("template_vlm2vec_qwen2vl.jinja", "openai"), - ("tool_chat_template_granite_20b_fc.jinja", "string"), - ("tool_chat_template_hermes.jinja", "string"), - ("tool_chat_template_internlm2_tool.jinja", "string"), - ("tool_chat_template_llama3.1_json.jinja", "openai"), - ("tool_chat_template_llama3.2_json.jinja", "openai"), - ("tool_chat_template_mistral_parallel.jinja", "string"), - ("tool_chat_template_mistral.jinja", "string"), - ], -) -def test_resolve_content_format_examples(template_path, expected_format): - model_config = ModelConfig( - PHI3V_MODEL_ID, # Dummy - tokenizer=PHI3V_MODEL_ID, # Dummy - trust_remote_code=True, - ) - - dummy_tokenizer = get_tokenizer( - PHI3V_MODEL_ID, # Dummy - trust_remote_code=model_config.trust_remote_code, - ) - dummy_tokenizer.chat_template = None - - chat_template = load_chat_template(EXAMPLES_DIR / template_path) - assert isinstance(chat_template, str) - - print("[TEXT]") - print(chat_template) - print("[AST]") - print(_try_extract_ast(chat_template)) - - resolved_format = resolve_chat_template_content_format( - chat_template, - None, - "auto", - dummy_tokenizer, - model_config=model_config, - ) - - assert resolved_format == expected_format - - -def test_parse_chat_messages_include_thinking_chunk(mistral_model_config, mistral_tokenizer): - messages = [ - { - "role": "system", - "content": [ - {"type": "text", "text": "You are a helpful assistant."}, - { - "type": "thinking", - "closed": True, - "thinking": "Only return the answer when you are confident.", - }, - ], - }, - {"role": "user", "content": "What is 2+2?"}, - { - "role": "assistant", - "content": [ - {"type": "text", "text": "Let me think about it."}, - {"type": "thinking", "closed": True, "thinking": "2+2 = 4"}, - { - "type": "text", - "text": "The answer is 4.", - }, - ], - }, - ] - - conversation_with_thinking, _, _ = parse_chat_messages( - messages, - mistral_model_config, - mistral_tokenizer, - content_format="openai", - ) - - expected_conversation = [ - { - "role": "system", - "content": [ - {"type": "text", "text": "You are a helpful assistant."}, - { - "type": "text", - "text": "Only return the answer when you are confident.", - }, - ], - }, - { - "role": "user", - "content": [{"type": "text", "text": "What is 2+2?"}], - }, - { - "role": "assistant", - "content": [ - {"type": "text", "text": "Let me think about it."}, - {"type": "text", "text": "2+2 = 4"}, - {"type": "text", "text": "The answer is 4."}, - ], - }, - ] - - assert conversation_with_thinking == expected_conversation - - -def test_apply_mistral_chat_template_thinking_chunk(): - messages = [ - { - "role": "system", - "content": [ - {"type": "text", "text": "You are a helpful assistant."}, - { - "type": "thinking", - "closed": True, - "thinking": "Only return the answer when you are confident.", - }, - ], - }, - {"role": "user", "content": "What is 2+2?"}, - { - "role": "assistant", - "content": [ - {"type": "text", "text": "Let me think about it."}, - {"type": "thinking", "closed": True, "thinking": "2+2 = 4"}, - { - "type": "text", - "text": "The answer is 4.", - }, - ], - }, - {"role": "user", "content": "Thanks, what is 3+3?"}, - ] - mistral_tokenizer = MistralTokenizer.from_pretrained("mistralai/Magistral-Small-2509") - - tokens_ids = apply_mistral_chat_template( - mistral_tokenizer, messages, chat_template=None, tools=None - ) - - string_tokens = mistral_tokenizer.mistral.decode( - tokens_ids, special_token_policy=SpecialTokenPolicy.KEEP - ) - - expected_tokens = ( - r"[SYSTEM_PROMPT]You are a helpful assistant.[THINK]Only return the" - r" answer when you are confident.[/THINK][/SYSTEM_PROMPT]" - r"[INST]What is 2+2?[/INST]" - r"Let me think about it.[THINK]2+2 = 4[/THINK]The answer is 4." - r"[INST]Thanks, what is 3+3?[/INST]" - ) - - assert string_tokens == expected_tokens - - -def test_parse_chat_messages_single_empty_audio_with_uuid( - qwen2_audio_model_config, - qwen2_audio_tokenizer, -): - audio_uuid = "abcd" - conversation, mm_data, mm_uuids = parse_chat_messages( - [ - { - "role": "user", - "content": [ - { - "type": "input_audio", - "input_audio": {}, - "uuid": audio_uuid, - }, - {"type": "text", "text": "What does the audio say?"}, - ], - } - ], - qwen2_audio_model_config, - qwen2_audio_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " "audio say?", - } - ] - _assert_mm_data_inputs(mm_data, {"audio": 1}) - _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[audio_uuid]) - - -@pytest.mark.asyncio -async def test_parse_chat_messages_single_empty_audio_with_uuid_async( - qwen2_audio_model_config, - qwen2_audio_tokenizer, -): - audio_uuid = "abcd" - conversation, mm_future, mm_uuids = parse_chat_messages_futures( - [ - { - "role": "user", - "content": [ - { - "type": "input_audio", - "input_audio": {}, - "uuid": audio_uuid, - }, - {"type": "text", "text": "What does the audio say?"}, - ], - } - ], - qwen2_audio_model_config, - qwen2_audio_tokenizer, - content_format="string", - ) - - assert conversation == [ - { - "role": "user", - "content": "Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\nWhat does the " "audio say?", - } - ] - _assert_mm_data_inputs(await mm_future, {"audio": 1}) - _assert_mm_uuids(mm_uuids, 1, modality="audio", expected_uuids=[audio_uuid]) diff --git a/old_readme.md b/old_readme.md deleted file mode 100644 index 1aef6415..00000000 --- a/old_readme.md +++ /dev/null @@ -1,155 +0,0 @@ - - -## Get Started (Department) - -本节仅内部沟通使用,后期重写。 - -项目提供一个多功能launcher用于调试和训练,借助launcher,只需要修改一个`--backbone`参数,就选择任意训练框架启动训练 or 调试。 - -1. 使用launcher进行全链路调试(--backbone='debug'):脱离Trinity和Verl,只与Vllm(自动创建)连接,进行调试: - ```bash - # (训练math agent demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) - clear && \ - python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview - - # (训练appworld demo)建议开始前杀死所有ray、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) - clear && \ - python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview - ``` - 备注:当`--backbone=debug`时,程序**不再使用ray**,这意味着您可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置见本文档最后。 - - -2. 使用launcher启动训练: - ```bash - # 建议开始前杀死所有ray、vllm、env_service进程 (python launcher.py --kill="python|ray|vllm|VLLM" && ray stop) - clear && \ - python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='trinity' - - clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' - ``` - 备注:如果需要断点调试,请添加参数 `python launcher.py --db='TAG1|TAG2|TAG3' --conf=...`,并在代码中需要断点的地方标记一行特殊代码 `from vsdb import bp; bp("TAG1")` 即可。(需要配合Ray Distributed Debugger VSCode Extension)。此外,也可以使用BeyondAgent后端训练(--backbone='verl'),但目前verl训练后端正在维护中。 - - -## Feature - -- 当程序退出时,给自己发短信 - ```bash - PHONE_NUMBERS="18812341234" python launcher.py ... - ``` - -# 简要架构 - -1. 读取task(对应配置字段 astune.task_reader) - - astune/task_reader/task_reader_base.py - - class::TaskReaderEnvService - - class::TaskReaderJsonl - - class::TaskReaderHuggingFace - -2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) - - tutorial/appworld.py - - tutorial/math_agent.py - -3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) - - astune/task_judge/judge_base.py - - astune/task_judge/env_service_as_judge.py - - class::EnvServiceJudge - - astune/task_judge/math_answer_as_judge.py - - class::MathAnswerAsJudge - - class::MathAnswerAndLlmAsJudge - -4. 指定模型(对应配置字段 astune.model.path ) - -5. 配置系统(完善中,先凑合着用一下) - - 默认配置 - - astune/default_config/default.yaml ( 存储verl的默认训练配置,可以被 --conf 指定的 yaml 以同名配置的形式覆盖 ) - - astune/default_config/trinity_default.yaml ( 存储trinity默认配置,但可以被 --conf 指定的 yaml 以 trinity.xxx 的形式覆盖 ) - - 配置自动对齐(定义哪些参数需要自动对齐到verl或者trinity上) - - astune/default_config/config_auto_convertion_verl.json - - astune/default_config/config_auto_convertion_trinity.json - -6. ASTune 和 AgentScope 交互系统 V0.5 - - astune/context_tracker/agentscope.py 负责 - - 处理AgentScope生成的Token - - 缓存judge给出评分需要的各种数据(包括但不限于所有对话message,env_service句柄,从astune.task_reader读取的task metadata等) - - 提供LLM的桥接 - - 负责合并timeline - -# note - -FlashInfer? - -clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' - -clear && killer VLLM && killer ray && killer python && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --with-ray --backbone='verl' - - -- `launche.json` for vscode debugging -```json -{ - - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "program": "launcher.py", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "xxxx/xxxx/xxxx.yaml" - ], - "env": { - } - }, - ] -} -``` - - -# Develop - -
-
-
- 项目架构图 -
- -- [ ] 设计 Judge&Reward 系统 -- [ ] 小财场景 Demo -- [ ] 寻找更通用的 tool -> token 兼容方法 -- [ ] 设计 数据增广 系统 -- [ ] 设计 AgentScopeLearn Protocol V2.0 (以狼人杀为例) -- [ ] 集成 AgentScope Runtime -- [ ] Trinity Display Infer Progress, e.g. token per second -- [ ] Trinity: SFT support -- [ ] AgentScope Studio Intergration -- [ ] AgentScope - - -# Future - -- [x] test server -- [ ] RUBRICS INT -- [-] TEST TOKEN REASON -- [x] TRINITY CONF MAP - -``` -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray -``` - - -``` -source .verlvenv/bin/activate - -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ -python launcher.py --with-appworld --conf tutorial/example_appworld/appworld.yaml --backbone='verl' - - -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='trinity' -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' - - - -python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='verl' -``` diff --git a/project-diagram.png b/project-diagram.png deleted file mode 100644 index 48fa342ae1d3cb83216936bd56480b32663fe174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268383 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

>>jdDi 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

-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 WBArmmR=n%r?-W}9m*?8nSN{!Aw}kcp diff --git a/test_launcher.py b/test_launcher.py deleted file mode 100644 index b92ac34e..00000000 --- a/test_launcher.py +++ /dev/null @@ -1,38 +0,0 @@ -import os -import subprocess -import sys - -from beast_logger import print_dict - -TEST_TARGET = "astune_tests/test_apply_chat_template/test.yaml" -cmd = [sys.executable, "launcher.py", "--conf", TEST_TARGET, "--backbone", "verl"] - -from astune.utils.smart_daemon import LaunchCommandWhenAbsent - -service_path = os.path.dirname(__file__) -companion = LaunchCommandWhenAbsent( - full_argument_list=cmd, - dir=service_path, - tag="appworld_env_service", -) -test_successful = False -try: - companion.launch( - launch_wait_time=1800, - success_std_string="GoodbyeException", - env_dict=os.environ, - ) - test_successful = True -except Exception as e: - test_successful = False - print(f"Error launching companion: {e}") - sys.exit(1) -finally: - companion.kill_self() - -print_dict( - { - "TestTarget": TEST_TARGET, - "TestSuccessful": test_successful, - } -) diff --git a/vsdb.py b/vsdb.py deleted file mode 100644 index 1c3a18cd..00000000 --- a/vsdb.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2025 Ablibaba Ltd. and/or its affiliates - - -import os -import pickle - -""" -This debug util works together with the Ray Distributed Debugger VSCode Extension. -For more details, please refer to: - https://docs.ray.io/en/latest/ray-observability/ray-distributed-debugger.html -""" - - -def vscode_conditional_breakpoint(tag=None, once=True): - """ - Conditionally set a breakpoint for VSCode debugging with Ray distributed systems. - - This function provides a smart breakpoint mechanism that respects environment - variables and can be configured to trigger only once or multiple times based on - debug tags. It's designed to work with Ray's post-mortem debugging feature. - - Args: - tag (str, optional): A debug tag to conditionally trigger the breakpoint. - If provided, the breakpoint will only trigger if this tag is present - in the DEBUG_TAGS environment variable (pipe-separated list). - If None, the breakpoint behavior depends only on the `once` parameter. - Defaults to None. - - once (bool, optional): Whether the breakpoint should only trigger once - per tag/session. If True, uses environment variables to track if - the breakpoint has already been hit. If False, the breakpoint will - trigger every time the function is called (subject to other conditions). - Defaults to True. - - Returns: - None: This function doesn't return any value. It either triggers a - breakpoint or returns silently. - - Environment Variables: - RAY_DEBUG_POST_MORTEM: Must be set to enable any breakpoint functionality. - If not set, the function returns immediately without doing anything. - - DEBUG_TAGS: Pipe-separated list of debug tags (e.g., "tag1|tag2|tag3"). - Only required when using the `tag` parameter. The breakpoint will - only trigger if the provided tag is found in this list. - - HIT_BREAKPOINT_REC_{tag}: Automatically created environment variables - to track whether a specific tagged breakpoint has already been hit - when `once=True`. These are internal tracking variables. - - Examples: - # Simple breakpoint that triggers once - vscode_conditional_breakpoint(tag="training") - - # Breakpoint that triggers every time - vscode_conditional_breakpoint(tag="training", once=False) - - # Tagged breakpoint (requires DEBUG_TAGS="training|validation") - vscode_conditional_breakpoint(tag="training") - - # Tagged breakpoint that can trigger multiple times - vscode_conditional_breakpoint(tag="validation", once=False) - - Note: - This function is designed to work with Ray's distributed debugging - capabilities and the VSCode Ray Distributed Debugger extension. - Make sure RAY_DEBUG_POST_MORTEM=1 is set in your environment. - """ - - env_tag = f"HIT_BREAKPOINT_REC_{tag}" - if not os.getenv("RAY_DEBUG_POST_MORTEM"): - return - if tag is None: - if once: - if os.getenv(env_tag, "") != "1": - os.environ[env_tag] = "1" - breakpoint() - return - else: - breakpoint() - return - else: - debug_tags = os.getenv("DEBUG_TAGS", "").split("|") - if tag in debug_tags: - if once: - if os.getenv(env_tag, "") != "1": - os.environ[env_tag] = "1" - breakpoint() - return - else: - breakpoint() - return - - -def objdump(obj, file="objdump.tmp"): - with open(file, "wb+") as f: - pickle.dump(obj, f) - return - - -def objload(file="objdump.tmp"): - import os - - if not os.path.exists(file): - return - with open(file, "rb") as f: - return pickle.load(f) - - -bp = vscode_conditional_breakpoint From ec32fe7471b78fd8c3cd8aa5e44bab6ca0af29d8 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 18:02:51 +0800 Subject: [PATCH 208/462] rename astune to astuner Former-commit-id: 908c266fa185a7a3db6ccdf05272810e5c25345e --- .github/workflows/docker/docker-compose.yaml | 6 +-- .github/workflows/unittest.yaml | 28 +++++----- README.md | 36 ++++++------- astune/__init__.py | 3 -- .../config_auto_convertion_trinity.json | 23 -------- .../verl/config_auto_convertion_verl.json | 38 -------------- astune/utils/sample.py | 25 --------- astuner/__init__.py | 3 ++ {astune => astuner}/backbone/__init__.py | 2 +- .../backbone/common_warm_up.py | 6 +-- .../backbone/native_compat_trainer.py | 52 +++++++++---------- .../backbone/trinity_compat_workflow.py | 24 ++++----- .../context_tracker/__init__.py | 0 .../agentscope_tracker/multiagent_tracking.py | 36 ++++++------- .../agentscope_tracker/timeline_merging.py | 2 +- .../context_tracker/basic_tracker.py | 22 ++++---- .../context_tracker/tracker_base_attr.py | 12 ++--- .../data_generator/__init__.py | 0 .../data_generator/data_generator_base.py | 12 ++--- .../data_generator/filters/__init__.py | 0 .../data_generator}/filters/base.py | 2 +- .../data_generator/filters/factory.py | 2 +- .../filters/llm_evaluate_filter.py | 6 +-- .../data_generator/knowledge_augmentation.py | 8 +-- .../data_generator/task_augmentation.py | 6 +-- {astune => astuner}/default_config/README.md | 0 .../default_config/astune_default.yaml | 4 +- .../default_config/trinity/README.md | 8 +-- .../default_config/trinity/README_ZH.md | 8 +-- .../config_auto_convertion_trinity.json | 23 ++++++++ .../trinity/trinity_default.yaml | 4 +- .../trinity/trinity_launch.yaml | 10 ++-- .../verl/config_auto_convertion_verl.json | 38 ++++++++++++++ .../default_config/verl/verl_default.yaml | 0 {astune => astuner}/main_trinity.py | 10 ++-- {astune => astuner}/main_verl.py | 18 +++---- {astune => astuner}/main_vllm.py | 44 ++++++++-------- {astune => astuner}/schema/__init__.py | 0 {astune => astuner}/schema/document.py | 0 {astune => astuner}/schema/extended_msg.py | 4 +- {astune => astuner}/schema/logprob.py | 0 {astune => astuner}/schema/task.py | 0 {astune => astuner}/schema/trajectory.py | 6 +-- .../task_judge/env_service_as_judge.py | 8 +-- {astune => astuner}/task_judge/judge_base.py | 2 +- .../task_judge/math_answer_as_judge.py | 10 ++-- .../task_judge/rm_auto_grader_judge.py | 32 ++++++------ {astune => astuner}/task_reader/__init__.py | 16 +++--- .../task_reader/document_reader/doc_reader.py | 8 +-- .../document_reader/document_reader_base.py | 2 +- .../task_reader/env_service_reader.py | 6 +-- .../task_reader/hf_dataset_reader.py | 4 +- .../task_reader/jsonl_reader.py | 4 +- .../task_reader/task_reader_base.py | 2 +- .../task_reader/tracing_reader/__init__.py | 6 +-- .../task_reader/tracing_reader/connector.py | 2 +- .../tracing_reader/filters/__init__.py | 0 .../tracing_reader}/filters/base.py | 2 +- .../tracing_reader/filters/factory.py | 0 .../filters/llm_evaluate_filter.py | 4 +- .../task_reader/tracing_reader/fn.py | 0 .../task_reader/tracing_reader/llm_client.py | 0 {astune => astuner}/task_rollout/__init__.py | 0 .../task_rollout/async_llm_bridge.py | 22 ++++---- .../task_rollout/dashscope_llm_bridge.py | 0 .../task_rollout/native_parallel_worker.py | 24 ++++----- .../task_rollout/resource_keeper.py | 12 ++--- .../task_rollout/single_worker.py | 24 ++++----- {astune => astuner}/task_runner/__init__.py | 26 +++++----- .../task_runner/agentscope_runner.py | 20 +++---- .../task_runner/classic_runner.py | 32 ++++++------ {astune => astuner}/tuner.py | 10 ++-- {astune => astuner}/utils/__init__.py | 0 .../utils/analysis_time_cost.py | 0 .../utils/async_http_client.py | 0 {astune => astuner}/utils/cleaner.py | 0 {astune => astuner}/utils/color_hsl.py | 0 {astune => astuner}/utils/compute_madness.py | 0 {astune => astuner}/utils/config_utils.py | 14 ++--- {astune => astuner}/utils/core_env_vars.py | 4 +- {astune => astuner}/utils/dynamic_import.py | 0 .../utils/env_service_client/__init__.py | 0 .../utils/env_service_client/em_client.py | 4 +- .../utils/env_service_client/env_client.py | 0 .../utils/env_service_client/env_client_ng.py | 0 {astune => astuner}/utils/fn.py | 0 {astune => astuner}/utils/http_client.py | 0 {astune => astuner}/utils/launch_utils.py | 10 ++-- {astune => astuner}/utils/logger.py | 0 {astune => astuner}/utils/markdown_parser.py | 0 {astune => astuner}/utils/message.py | 0 {astune => astuner}/utils/model_merger.py | 0 {astune => astuner}/utils/n_gram.py | 0 {astune => astuner}/utils/process_dataset.py | 0 {astune => astuner}/utils/process_manager.py | 0 {astune => astuner}/utils/pty.py | 2 +- {astune => astuner}/utils/retry.py | 2 +- {astune => astuner}/utils/robust_dashscope.py | 0 astuner/utils/sample.py | 25 +++++++++ {astune => astuner}/utils/smart_daemon.py | 2 +- {astune => astuner}/utils/sms_agent.py | 0 {astune => astuner}/utils/testing_utils.py | 14 ++--- {astune => astuner}/utils/tokenizer.py | 0 {astune => astuner}/utils/utils.py | 0 {astune => astuner}/workflow.py | 4 +- docs/en/introduction.md | 32 ++++++------ launcher.py | 28 +++++----- pyproject.toml | 2 +- pyrightconfig.json | 2 +- scripts/deploy_model.py | 8 +-- scripts/tar_and_copy.sh | 6 +-- scripts/untar.sh | 2 +- setup.py | 2 +- tests/config_test.py | 14 ++--- tests/data/config.yaml | 10 ++-- tests/data_gen.py | 14 ++--- tests/data_gen.yaml | 2 +- tests/test_tracing_reader.py | 4 +- tutorial/example_appworld/appworld.md | 26 +++++----- tutorial/example_appworld/appworld.py | 6 +-- tutorial/example_appworld/appworld.yaml | 10 ++-- .../example_appworld/appworld_2nodes.yaml | 10 ++-- .../example_feedback_tracing.yaml | 10 ++-- tutorial/example_feedback_tracing/train.py | 2 +- tutorial/example_math_agent/math_agent.md | 26 +++++----- tutorial/example_math_agent/math_agent.py | 2 +- tutorial/example_math_agent/math_agent.yaml | 10 ++-- .../example_math_agent/math_agent_verl.yaml | 10 ++-- tutorial/example_rm_auto_grader/config.md | 10 ++-- .../rm_auto_grader_example.py | 16 +++--- tutorial/example_rubrics_judge/math_agent.md | 26 +++++----- tutorial/example_rubrics_judge/math_agent.py | 2 +- tutorial/example_rubrics_judge/r_judge.yaml | 8 +-- tutorial/example_werewolves/start.py | 4 +- tutorial/example_werewolves/werewolves.md | 10 ++-- tutorial/example_werewolves/werewolves.yaml | 8 +-- 136 files changed, 606 insertions(+), 606 deletions(-) delete mode 100644 astune/__init__.py delete mode 100644 astune/default_config/trinity/config_auto_convertion_trinity.json delete mode 100644 astune/default_config/verl/config_auto_convertion_verl.json delete mode 100644 astune/utils/sample.py create mode 100644 astuner/__init__.py rename {astune => astuner}/backbone/__init__.py (62%) rename {astune => astuner}/backbone/common_warm_up.py (88%) rename {astune => astuner}/backbone/native_compat_trainer.py (97%) rename {astune => astuner}/backbone/trinity_compat_workflow.py (91%) rename {astune => astuner}/context_tracker/__init__.py (100%) rename {astune => astuner}/context_tracker/agentscope_tracker/multiagent_tracking.py (93%) rename {astune => astuner}/context_tracker/agentscope_tracker/timeline_merging.py (98%) rename {astune => astuner}/context_tracker/basic_tracker.py (97%) rename {astune => astuner}/context_tracker/tracker_base_attr.py (84%) rename {astune => astuner}/data_generator/__init__.py (100%) rename {astune => astuner}/data_generator/data_generator_base.py (84%) rename {astune => astuner}/data_generator/filters/__init__.py (100%) rename {astune/task_reader/tracing_reader => astuner/data_generator}/filters/base.py (88%) rename {astune => astuner}/data_generator/filters/factory.py (95%) rename {astune => astuner}/data_generator/filters/llm_evaluate_filter.py (96%) rename {astune => astuner}/data_generator/knowledge_augmentation.py (96%) rename {astune => astuner}/data_generator/task_augmentation.py (97%) rename {astune => astuner}/default_config/README.md (100%) rename {astune => astuner}/default_config/astune_default.yaml (98%) rename {astune => astuner}/default_config/trinity/README.md (84%) rename {astune => astuner}/default_config/trinity/README_ZH.md (86%) create mode 100644 astuner/default_config/trinity/config_auto_convertion_trinity.json rename {astune => astuner}/default_config/trinity/trinity_default.yaml (95%) rename {astune => astuner}/default_config/trinity/trinity_launch.yaml (87%) create mode 100644 astuner/default_config/verl/config_auto_convertion_verl.json rename {astune => astuner}/default_config/verl/verl_default.yaml (100%) rename {astune => astuner}/main_trinity.py (97%) rename {astune => astuner}/main_verl.py (94%) rename {astune => astuner}/main_vllm.py (80%) rename {astune => astuner}/schema/__init__.py (100%) rename {astune => astuner}/schema/document.py (100%) rename {astune => astuner}/schema/extended_msg.py (99%) rename {astune => astuner}/schema/logprob.py (100%) rename {astune => astuner}/schema/task.py (100%) rename {astune => astuner}/schema/trajectory.py (96%) rename {astune => astuner}/task_judge/env_service_as_judge.py (75%) rename {astune => astuner}/task_judge/judge_base.py (78%) rename {astune => astuner}/task_judge/math_answer_as_judge.py (86%) rename {astune => astuner}/task_judge/rm_auto_grader_judge.py (93%) rename {astune => astuner}/task_reader/__init__.py (89%) rename {astune => astuner}/task_reader/document_reader/doc_reader.py (80%) rename {astune => astuner}/task_reader/document_reader/document_reader_base.py (84%) rename {astune => astuner}/task_reader/env_service_reader.py (88%) rename {astune => astuner}/task_reader/hf_dataset_reader.py (96%) rename {astune => astuner}/task_reader/jsonl_reader.py (95%) rename {astune => astuner}/task_reader/task_reader_base.py (90%) rename {astune => astuner}/task_reader/tracing_reader/__init__.py (96%) rename {astune => astuner}/task_reader/tracing_reader/connector.py (99%) rename {astune => astuner}/task_reader/tracing_reader/filters/__init__.py (100%) rename {astune/data_generator => astuner/task_reader/tracing_reader}/filters/base.py (88%) rename {astune => astuner}/task_reader/tracing_reader/filters/factory.py (100%) rename {astune => astuner}/task_reader/tracing_reader/filters/llm_evaluate_filter.py (96%) rename {astune => astuner}/task_reader/tracing_reader/fn.py (100%) rename {astune => astuner}/task_reader/tracing_reader/llm_client.py (100%) rename {astune => astuner}/task_rollout/__init__.py (100%) rename {astune => astuner}/task_rollout/async_llm_bridge.py (94%) rename {astune => astuner}/task_rollout/dashscope_llm_bridge.py (100%) rename {astune => astuner}/task_rollout/native_parallel_worker.py (97%) rename {astune => astuner}/task_rollout/resource_keeper.py (94%) rename {astune => astuner}/task_rollout/single_worker.py (84%) rename {astune => astuner}/task_runner/__init__.py (62%) rename {astune => astuner}/task_runner/agentscope_runner.py (82%) rename {astune => astuner}/task_runner/classic_runner.py (86%) rename {astune => astuner}/tuner.py (96%) rename {astune => astuner}/utils/__init__.py (100%) rename {astune => astuner}/utils/analysis_time_cost.py (100%) rename {astune => astuner}/utils/async_http_client.py (100%) rename {astune => astuner}/utils/cleaner.py (100%) rename {astune => astuner}/utils/color_hsl.py (100%) rename {astune => astuner}/utils/compute_madness.py (100%) rename {astune => astuner}/utils/config_utils.py (94%) rename {astune => astuner}/utils/core_env_vars.py (88%) rename {astune => astuner}/utils/dynamic_import.py (100%) rename {astune => astuner}/utils/env_service_client/__init__.py (100%) rename {astune => astuner}/utils/env_service_client/em_client.py (96%) rename {astune => astuner}/utils/env_service_client/env_client.py (100%) rename {astune => astuner}/utils/env_service_client/env_client_ng.py (100%) rename {astune => astuner}/utils/fn.py (100%) rename {astune => astuner}/utils/http_client.py (100%) rename {astune => astuner}/utils/launch_utils.py (90%) rename {astune => astuner}/utils/logger.py (100%) rename {astune => astuner}/utils/markdown_parser.py (100%) rename {astune => astuner}/utils/message.py (100%) rename {astune => astuner}/utils/model_merger.py (100%) rename {astune => astuner}/utils/n_gram.py (100%) rename {astune => astuner}/utils/process_dataset.py (100%) rename {astune => astuner}/utils/process_manager.py (100%) rename {astune => astuner}/utils/pty.py (98%) rename {astune => astuner}/utils/retry.py (96%) rename {astune => astuner}/utils/robust_dashscope.py (100%) create mode 100644 astuner/utils/sample.py rename {astune => astuner}/utils/smart_daemon.py (99%) rename {astune => astuner}/utils/sms_agent.py (100%) rename {astune => astuner}/utils/testing_utils.py (54%) rename {astune => astuner}/utils/tokenizer.py (100%) rename {astune => astuner}/utils/utils.py (100%) rename {astune => astuner}/workflow.py (98%) diff --git a/.github/workflows/docker/docker-compose.yaml b/.github/workflows/docker/docker-compose.yaml index 583e3aa6..9674ef1d 100644 --- a/.github/workflows/docker/docker-compose.yaml +++ b/.github/workflows/docker/docker-compose.yaml @@ -1,6 +1,6 @@ services: - astune-node-1: + astuner-node-1: image: agentscope-tuner-unittest:latest pull_policy: never command: bash -c "uv pip install -e .[dev] && ray start --head --dashboard-host 0.0.0.0 --include-dashboard true --block" @@ -10,7 +10,7 @@ services: - RAY_ADDRESS=auto working_dir: /workspace volumes: - - astune-volume:/mnt + - astuner-volume:/mnt - ../../..:/workspace shm_size: "64G" deploy: @@ -22,5 +22,5 @@ services: capabilities: [gpu] volumes: - astune-volume: + astuner-volume: external: true diff --git a/.github/workflows/unittest.yaml b/.github/workflows/unittest.yaml index d6703d52..72652eb7 100644 --- a/.github/workflows/unittest.yaml +++ b/.github/workflows/unittest.yaml @@ -19,22 +19,22 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - path: astune-${{ github.run_id }} + path: astuner-${{ github.run_id }} ref: refs/pull/${{ github.event.issue.number }}/head - name: Setup docker compose - working-directory: astune-${{ github.run_id }}/.github/workflows/docker + working-directory: astuner-${{ github.run_id }}/.github/workflows/docker run: | docker compose up -d sleep 15s - name: Check ray status - working-directory: astune-${{ github.run_id }}/.github/workflows/docker + working-directory: astuner-${{ github.run_id }}/.github/workflows/docker run: | MAX_RETRIES=20 RETRY_INTERVAL=5 for i in $(seq 1 $MAX_RETRIES); do - docker compose exec astune-node-1 ray status && docker compose exec astune-node-2 ray status && break + docker compose exec astuner-node-1 ray status && docker compose exec astuner-node-2 ray status && break echo "Waiting for ray cluster to be ready... ($i/$MAX_RETRIES)" sleep $RETRY_INTERVAL if [ "$i" -eq "$MAX_RETRIES" ]; then @@ -45,7 +45,7 @@ jobs: - name: Decide test type id: test_type - working-directory: astune-${{ github.run_id }} + working-directory: astuner-${{ github.run_id }} run: | COMMENT="${{ github.event.comment.body }}" if [[ "$COMMENT" == "/unittest"* ]]; then @@ -53,16 +53,16 @@ jobs: fi - name: Run unittest - working-directory: astune-${{ github.run_id }}/.github/workflows/docker + working-directory: astuner-${{ github.run_id }}/.github/workflows/docker run: | TYPE="${{ steps.test_type.outputs.type }}" if [ "$TYPE" = "all" ]; then echo "tests_run=true" >> $GITHUB_ENV - docker compose exec astune-node-1 pytest tests -v -s --ctrf report.json + docker compose exec astuner-node-1 pytest tests -v -s --ctrf report.json fi - name: Convert report.json time to ms - working-directory: astune-${{ github.run_id }} + working-directory: astuner-${{ github.run_id }} if: env.tests_run == 'true' || failure() run: | REPORT=report.json @@ -71,10 +71,10 @@ jobs: fi - name: Clean checkpoint dir - working-directory: astune-${{ github.run_id }}/.github/workflows/docker + working-directory: astuner-${{ github.run_id }}/.github/workflows/docker if: always() run: | - docker compose exec astune-node-1 rm -rf /mnt/checkpoints/* + docker compose exec astuner-node-1 rm -rf /mnt/checkpoints/* continue-on-error: true - name: Upload test results @@ -82,14 +82,14 @@ jobs: uses: actions/upload-artifact@v4 with: name: pytest-results - path: astune-${{ github.run_id }}/report.json + path: astuner-${{ github.run_id }}/report.json continue-on-error: true - name: Publish Test Report if: env.tests_run == 'true' || failure() uses: ctrf-io/github-test-reporter@v1 with: - report-path: astune-${{ github.run_id }}/report.json + report-path: astuner-${{ github.run_id }}/report.json summary: true pull-request: false issue: ${{ github.event.issue.number }} @@ -98,7 +98,7 @@ jobs: continue-on-error: true - name: Remove docker compose - working-directory: astune-${{ github.run_id }}/.github/workflows/docker + working-directory: astuner-${{ github.run_id }}/.github/workflows/docker if: always() run: | docker compose down --remove-orphans @@ -107,5 +107,5 @@ jobs: - name: Cleanup workspace if: always() run: | - rm -rf astune-${{ github.run_id }} 2>/dev/null + rm -rf astuner-${{ github.run_id }} 2>/dev/null continue-on-error: true diff --git a/README.md b/README.md index 7bdcaa04..835eca9d 100644 --- a/README.md +++ b/README.md @@ -38,9 +38,9 @@ We recommend using `uv` for dependency management, though `conda` is also suppor 1. Clone the repository and Trinity module: ```bash - git clone https://github.com/..../agentscope-tuner.git astune - git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity - cd astune + git clone https://github.com/..../agentscope-tuner.git astuner + git clone https://github.com/binary-husky/Trinity-RFT astuner/external/trinity + cd astuner ``` 2. Install the Trinity training backbone: @@ -82,36 +82,36 @@ Explore our rich library of examples to kickstart your journey: ### Architecture -1. **Task Reader** (config field: `astune.task_reader`) - - `astune/task_reader/task_reader_base.py` +1. **Task Reader** (config field: `astuner.task_reader`) + - `astuner/task_reader/task_reader_base.py` - `TaskReaderEnvService` - `TaskReaderJsonl` - `TaskReaderHuggingFace` -2. **Workflow Definition** (config field: `astune.rollout.agentscope_learn_protocol`) +2. **Workflow Definition** (config field: `astuner.rollout.agentscope_learn_protocol`) - `tutorial/appworld.py` - `tutorial/math_agent.py` -3. **Reward Function** (config field: `astune.task_judge.judge_protocol`) - - `astune/task_judge/judge_base.py` - - `astune/task_judge/env_service_as_judge.py` +3. **Reward Function** (config field: `astuner.task_judge.judge_protocol`) + - `astuner/task_judge/judge_base.py` + - `astuner/task_judge/env_service_as_judge.py` - `EnvServiceJudge` - - `astune/task_judge/math_answer_as_judge.py` + - `astuner/task_judge/math_answer_as_judge.py` - `MathAnswerAsJudge` - `MathAnswerAndLlmAsJudge` -4. **Model Specification** (config field: `astune.model.path`) +4. **Model Specification** (config field: `astuner.model.path`) 5. **Configuration System** (under improvement) - Default Configurations: - - `astune/default_config/default.yaml` (default VERL training config, overridden by `--conf` YAML) - - `astune/default_config/trinity_default.yaml` (default Trinity config, overridden via `trinity.xxx` in `--conf` YAML) + - `astuner/default_config/default.yaml` (default VERL training config, overridden by `--conf` YAML) + - `astuner/default_config/trinity_default.yaml` (default Trinity config, overridden via `trinity.xxx` in `--conf` YAML) - Auto-Alignment: - - `astune/default_config/config_auto_convertion_verl.json` - - `astune/default_config/config_auto_convertion_trinity.json` - -6. **ASTune & AgentScope Interaction System V0.5** - - Managed by `astune/context_tracker/agentscope.py`: + - `astuner/default_config/config_auto_convertion_verl.json` + - `astuner/default_config/config_auto_convertion_trinity.json` + +6. **ASTuner & AgentScope Interaction System V0.5** + - Managed by `astuner/context_tracker/agentscope.py`: - Processes tokens generated by AgentScope - Caches data required for judging (e.g., dialogue messages, env_service handles, task metadata) - Bridges LLM interactions diff --git a/astune/__init__.py b/astune/__init__.py deleted file mode 100644 index c190b84e..00000000 --- a/astune/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from astune.schema.task import WorkflowOutput, WorkflowTask -from astune.tuner import ModelTuner -from astune.workflow import Workflow diff --git a/astune/default_config/trinity/config_auto_convertion_trinity.json b/astune/default_config/trinity/config_auto_convertion_trinity.json deleted file mode 100644 index 9f2b5c52..00000000 --- a/astune/default_config/trinity/config_auto_convertion_trinity.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - - "astune.trainer_common.nnodes": "cluster.node_num", - "astune.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", - "astune.trainer_common.total_epochs": "buffer.total_epochs", - "astune.trainer_common.trinity_only__n_vllm_engine": "explorer.rollout_model.engine_num", - "astune.trainer_common.trinity_only__explorer_batchsize": "buffer.batch_size", - "astune.trainer_common.trinity_only__runner_per_model": "explorer.runner_per_model", - "astune.trainer_common.save_freq": "trainer.save_interval", - "astune.trainer_common.test_freq": "explorer.eval_interval", - "astune.model.path": "model.model_path", - "astune.project_name": "project", - "astune.experiment_name": "name", - "astune.data.train_batch_size": "buffer.train_batch_size", - "astune.data.max_response_length": "model.max_response_tokens", - "astune.rollout.num_repeat": "algorithm.repeat_times", - "astune.rollout.tensor_model_parallel_size": "explorer.rollout_model.tensor_parallel_size", - "astune.rollout.max_model_len": [ - "model.max_model_len", - "trainer.max_token_len_per_gpu" - ] - -} diff --git a/astune/default_config/verl/config_auto_convertion_verl.json b/astune/default_config/verl/config_auto_convertion_verl.json deleted file mode 100644 index 97cad2ab..00000000 --- a/astune/default_config/verl/config_auto_convertion_verl.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "astune.trainer_common.total_epochs": "trainer.total_epochs", - - "astune.trainer_common.val_before_train": "trainer.val_before_train", - "astune.trainer_common.n_gpus_per_node": "trainer.n_gpus_per_node", - "astune.trainer_common.nnodes": "trainer.nnodes", - "astune.trainer_common.logger": "trainer.logger", - "astune.trainer_common.algorithm.task_norm_patch": "algorithm.task_norm_patch", - "astune.trainer_common.algorithm.adv_estimator": "algorithm.adv_estimator", - "astune.trainer_common.algorithm.use_kl_in_reward": "algorithm.use_kl_in_reward", - "astune.trainer_common.mini_batch_num": "actor_rollout_ref.actor.override_ppo_mini_batch_num", - "astune.trainer_common.fsdp_config": "actor_rollout_ref.actor.fsdp_config", - "astune.trainer_common.optim": "actor_rollout_ref.actor.optim", - "astune.trainer_common.use_kl_loss": "actor_rollout_ref.actor.use_kl_loss", - "astune.trainer_common.kl_loss_coef": "actor_rollout_ref.actor.kl_loss_coef", - "astune.trainer_common.kl_loss_type": "actor_rollout_ref.actor.kl_loss_type", - "astune.trainer_common.save_freq": "trainer.save_freq", - "astune.trainer_common.test_freq": "trainer.test_freq", - - "astune.data.max_prompt_length": "data.max_prompt_length", - "astune.data.max_response_length": "data.max_response_length", - "astune.data.train_batch_size": "data.train_batch_size", - - "astune.rollout.max_model_len": [ - "actor_rollout_ref.rollout.max_model_len", - "actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu", - "actor_rollout_ref.actor.ppo_max_token_len_per_gpu", - "actor_rollout_ref.ref.log_prob_max_token_len_per_gpu" - ], - - "astune.rollout.mode": "actor_rollout_ref.rollout.mode", - "astune.rollout.multi_turn": "actor_rollout_ref.rollout.multi_turn", - "astune.rollout.val_kwargs": "actor_rollout_ref.rollout.val_kwargs", - - "astune.model.path": "actor_rollout_ref.model.path", - "astune.project_name": "trainer.project_name", - "astune.experiment_name": "trainer.experiment_name" -} diff --git a/astune/utils/sample.py b/astune/utils/sample.py deleted file mode 100644 index 25438fa1..00000000 --- a/astune/utils/sample.py +++ /dev/null @@ -1,25 +0,0 @@ -def get_sample_params(mode, config): - response_length_eps = ( - 16 # Reserve a few tokens for later handling of special tokens like lm_start. - ) - if config.astune.rollout.name == "vllm": - sampling_params = dict( - n=1, - max_tokens=config.astune.rollout.max_response_length_in_one_turn - response_length_eps, - min_tokens=1, # Must output at least 1 token. - temperature=config.astune.rollout.temperature, - top_p=config.astune.rollout.top_p, - ) - else: - sampling_params = dict( - n=1, - max_new_tokens=config.astune.rollout.max_response_length_in_one_turn, - temperature=config.astune.rollout.temperature, - top_p=config.astune.rollout.top_p, - ) - - if mode == "validate": - sampling_params["temperature"] = config.astune.rollout.val_kwargs.temperature - sampling_params["top_k"] = config.astune.rollout.val_kwargs.top_k - sampling_params["top_p"] = config.astune.rollout.val_kwargs.top_p - return sampling_params diff --git a/astuner/__init__.py b/astuner/__init__.py new file mode 100644 index 00000000..a332c0aa --- /dev/null +++ b/astuner/__init__.py @@ -0,0 +1,3 @@ +from astuner.schema.task import WorkflowOutput, WorkflowTask +from astuner.tuner import ModelTuner +from astuner.workflow import Workflow diff --git a/astune/backbone/__init__.py b/astuner/backbone/__init__.py similarity index 62% rename from astune/backbone/__init__.py rename to astuner/backbone/__init__.py index 8fe60bf3..cfaa5d4b 100644 --- a/astune/backbone/__init__.py +++ b/astuner/backbone/__init__.py @@ -1,6 +1,6 @@ from loguru import logger try: - from astune.backbone.trinity_compat_workflow import * + from astuner.backbone.trinity_compat_workflow import * except ImportError: logger.warning("trinity is not available.") diff --git a/astune/backbone/common_warm_up.py b/astuner/backbone/common_warm_up.py similarity index 88% rename from astune/backbone/common_warm_up.py rename to astuner/backbone/common_warm_up.py index 0891ac30..04b1cbdc 100644 --- a/astune/backbone/common_warm_up.py +++ b/astuner/backbone/common_warm_up.py @@ -43,14 +43,14 @@ def warm_up_process(config): if "PROCESS_LEVEL_WARMUP_INIT" in os.environ: return os.environ["PROCESS_LEVEL_WARMUP_INIT"] = "1" - experiment_name = config.astune.experiment_name + experiment_name = config.astuner.experiment_name init_parallel_rollout_logger(experiment_name) warm_up_task_judge_when_needed(config) def warm_up_task_judge_when_needed(config): - if config.astune.task_judge.judge_type == "rubrics_auto_grader": - from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + if config.astuner.task_judge.judge_type == "rubrics_auto_grader": + from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge judge = RMAutoGraderJudge(config) asyncio.run(judge.generate_rubrics_from_samples()) diff --git a/astune/backbone/native_compat_trainer.py b/astuner/backbone/native_compat_trainer.py similarity index 97% rename from astune/backbone/native_compat_trainer.py rename to astuner/backbone/native_compat_trainer.py index 52d01fad..44de5c75 100644 --- a/astune/backbone/native_compat_trainer.py +++ b/astuner/backbone/native_compat_trainer.py @@ -69,11 +69,11 @@ from verl.utils.torch_functional import masked_mean from verl.utils.tracking import ValidationGenerationsLogger -from astune.context_tracker.basic_tracker import BasicContextTracker -from astune.schema.task import Task -from astune.schema.trajectory import Trajectory -from astune.task_rollout.native_parallel_worker import ParallelEnvManager -from astune.utils.message import send_train_message +from astuner.context_tracker.basic_tracker import BasicContextTracker +from astuner.schema.task import Task +from astuner.schema.trajectory import Trajectory +from astuner.task_rollout.native_parallel_worker import ParallelEnvManager +from astuner.utils.message import send_train_message WorkerType = type[Worker] @@ -555,8 +555,8 @@ def __init__( self.ray_worker_group_cls = ray_worker_group_cls self.device_name = device_name if device_name else self.config.trainer.device self.validation_generations_logger = ValidationGenerationsLogger( - project_name=self.config.astune.project_name, - experiment_name=self.config.astune.experiment_name, + project_name=self.config.astuner.project_name, + experiment_name=self.config.astuner.experiment_name, ) # if ref_in_actor is True, the reference policy will be actor without lora applied @@ -590,7 +590,7 @@ def _validate_config(self): # 1. Check total batch size for data correctness real_train_batch_size = ( - config.astune.data.train_batch_size * config.astune.rollout.num_repeat + config.astuner.data.train_batch_size * config.astuner.rollout.num_repeat ) assert real_train_batch_size % minimal_bsz == 0, ( f"real_train_batch_size ({real_train_batch_size}) must be divisible by minimal possible batch size " @@ -639,7 +639,7 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): actor_config = omega_conf_to_dataclass(config.actor_rollout_ref.actor) actor_config.validate( n_gpus, - config.astune.data.train_batch_size, + config.astuner.data.train_batch_size, config.actor_rollout_ref.model, ) except hydra.errors.InstantiationException as e: @@ -657,8 +657,8 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # The rollout section also has log_prob_micro_batch_size vs. log_prob_micro_batch_size_per_gpu check_mutually_exclusive( - config.astune.rollout.log_prob_micro_batch_size, - config.astune.rollout.log_prob_micro_batch_size_per_gpu, + config.astuner.rollout.log_prob_micro_batch_size, + config.astuner.rollout.log_prob_micro_batch_size_per_gpu, "actor_rollout_ref.rollout", ) @@ -676,7 +676,7 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # critic if self.use_critic: critic_config = omega_conf_to_dataclass(config.critic) - critic_config.validate(n_gpus, config.astune.data.train_batch_size) + critic_config.validate(n_gpus, config.astuner.data.train_batch_size) if config.data.get("val_batch_size", None) is not None: print( @@ -686,9 +686,9 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): ) # check eval config - if config.astune.rollout.val_kwargs.do_sample: + if config.astuner.rollout.val_kwargs.do_sample: assert ( - config.astune.rollout.temperature > 0 + config.astuner.rollout.temperature > 0 ), "validation gen temperature should be greater than 0 when enabling do_sample" print("[validate_config] All configuration checks passed successfully!") @@ -733,7 +733,7 @@ def _create_dataloader( self.train_dataloader = StatefulDataLoader( dataset=self.train_dataset, batch_size=self.config.data.get( - "gen_batch_size", self.config.astune.data.train_batch_size + "gen_batch_size", self.config.astuner.data.train_batch_size ), num_workers=num_workers, drop_last=True, @@ -856,7 +856,7 @@ def _validate(self): # repeat test batch test_batch = test_batch.repeat( - repeat_times=self.config.astune.rollout.val_kwargs.num_repeat, + repeat_times=self.config.astuner.rollout.val_kwargs.num_repeat, interleave=True, ) @@ -897,7 +897,7 @@ def _validate(self): "eos_token_id": self.tokenizer.eos_token_id, "pad_token_id": self.tokenizer.pad_token_id, "recompute_log_prob": False, - "do_sample": self.config.astune.rollout.val_kwargs.do_sample, + "do_sample": self.config.astuner.rollout.val_kwargs.do_sample, "validate": True, "global_steps": self.global_steps, } @@ -1078,7 +1078,7 @@ def init_workers(self): # create async rollout manager and request scheduler self.async_rollout_mode = False - if self.config.astune.rollout.mode == "async": + if self.config.astuner.rollout.mode == "async": from verl.experimental.agent_loop.agent_loop import ( AgentLoopManager, AsyncLLMServerManager, @@ -1099,7 +1099,7 @@ def init_workers(self): self.parallel_env = ParallelEnvManager( config=self.config, async_rollout_manager=self.async_rollout_manager, - max_parallel=self.config.astune.rollout.max_env_worker, + max_parallel=self.config.astuner.rollout.max_env_worker, tokenizer=self.tokenizer, ) @@ -1299,12 +1299,12 @@ def fit(self): from omegaconf import OmegaConf from verl.utils.tracking import Tracking - from astune.backbone.common_warm_up import warm_up_process + from astuner.backbone.common_warm_up import warm_up_process warm_up_process(self.config) logger = Tracking( - project_name=self.config.astune.project_name, - experiment_name=self.config.astune.experiment_name, + project_name=self.config.astuner.project_name, + experiment_name=self.config.astuner.experiment_name, default_backend=self.config.trainer.logger, config=OmegaConf.to_container(self.config, resolve=True), ) @@ -1562,7 +1562,7 @@ def fit(self): adv_estimator=self.config.algorithm.adv_estimator, gamma=self.config.algorithm.gamma, lam=self.config.algorithm.lam, - num_repeat=self.config.astune.rollout.num_repeat, + num_repeat=self.config.astuner.rollout.num_repeat, norm_adv_by_std_in_grpo=norm_adv_by_std_in_grpo, config=self.config.algorithm, ) @@ -1580,7 +1580,7 @@ def fit(self): with marked_timer("update_actor", timing_raw, color="red"): batch.meta_info[ "multi_turn" - ] = self.config.astune.rollout.multi_turn.enable + ] = self.config.astuner.rollout.multi_turn.enable actor_output = self.actor_rollout_wg.update_actor(batch) actor_output_metrics = reduce_metrics(actor_output.meta_info["metrics"]) metrics.update(actor_output_metrics) @@ -1686,7 +1686,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): Returns: Tuple of (cmts, tasks) containing trajectory results and task definitions """ - pass_n = self.config.astune.trainer_common.val_pass_n + pass_n = self.config.astuner.trainer_common.val_pass_n # if pass_n == 1: # return self.eval_dataset_legacy(target_dataset, target_dataset_name, mode, epoch) @@ -1808,7 +1808,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): return cmts, tasks, val_metrics def get_eval_dataset(self): - from astune.task_reader import TaskReaderRouter + from astuner.task_reader import TaskReaderRouter task_reader = TaskReaderRouter(self.config) tasks = task_reader.get_validation_tasks() diff --git a/astune/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py similarity index 91% rename from astune/backbone/trinity_compat_workflow.py rename to astuner/backbone/trinity_compat_workflow.py index 86b51bac..c4b45819 100644 --- a/astune/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -33,13 +33,13 @@ from datasets import Dataset, load_dataset from transformers import AutoTokenizer -from astune.backbone.common_warm_up import warm_up_process -from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( +from astuner.backbone.common_warm_up import warm_up_process +from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, ) -from astune.schema.trajectory import Sample -from astune.task_rollout.native_parallel_worker import DynamicRollout -from astune.utils.config_utils import read_astune_config +from astuner.schema.trajectory import Sample +from astuner.task_rollout.native_parallel_worker import DynamicRollout +from astuner.utils.config_utils import read_astune_config class TrinityCompatWorkflow(DynamicRollout): @@ -70,7 +70,7 @@ def __init__( ) def convert_task(self, task: TrinityTask): - from astune.schema.task import Task + from astuner.schema.task import Task d = {} for vip_key in ["main_query", "task_id", "env_type", "metadata", "init_messages"]: @@ -125,9 +125,9 @@ def __init__( self.answer = task.raw_task.get(task.format_args.response_key) # type: ignore [index] async def run_async(self): - yaml_path = os.environ.get("ASTUNE_CONFIG_REDIRECT", None) + yaml_path = os.environ.get("ASTUNER_CONFIG_REDIRECT", None) if yaml_path is None: - raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") + raise ValueError("ASTUNER_CONFIG_REDIRECT is not set in environment variables") astune_config = read_astune_config(yaml_path) warm_up_process(astune_config) tracker = await TrinityCompatWorkflow( @@ -215,19 +215,19 @@ async def run_async(self): try: - @READER.register_module("astune") + @READER.register_module("astuner") class AstuneTaskReader(TaskFileReader): def __init__(self, config): self.config = config self.read_batch_size = config.batch_size self.split = config.split - yaml_path = os.environ.get("ASTUNE_CONFIG_REDIRECT", None) + yaml_path = os.environ.get("ASTUNER_CONFIG_REDIRECT", None) if yaml_path is None: - raise ValueError("ASTUNE_CONFIG_REDIRECT is not set in environment variables") + raise ValueError("ASTUNER_CONFIG_REDIRECT is not set in environment variables") astune_config = read_astune_config(yaml_path) - from astune.task_reader import TaskReaderRouter, task_to_standard_dataset + from astuner.task_reader import TaskReaderRouter, task_to_standard_dataset task_reader = TaskReaderRouter(astune_config) diff --git a/astune/context_tracker/__init__.py b/astuner/context_tracker/__init__.py similarity index 100% rename from astune/context_tracker/__init__.py rename to astuner/context_tracker/__init__.py diff --git a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py similarity index 93% rename from astune/context_tracker/agentscope_tracker/multiagent_tracking.py rename to astuner/context_tracker/agentscope_tracker/multiagent_tracking.py index 4273ab60..b5a0ec97 100644 --- a/astune/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -13,20 +13,20 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_tracker.agentscope_tracker.timeline_merging import ( +from astuner.context_tracker.agentscope_tracker.timeline_merging import ( can_merge_steps, merge_tracker_timelines, ) -from astune.context_tracker.basic_tracker import ( +from astuner.context_tracker.basic_tracker import ( BasicContextTracker, ExtendedMessage, replace_token_ids, ) -from astune.schema.extended_msg import INVALID_LOG_PROB_VALUE -from astune.schema.trajectory import Reward -from astune.utils.color_hsl import adjust_color_hsl -from astune.utils.compute_madness import compute_string_madness -from astune.utils.tokenizer import astune_apply_chat_template +from astuner.schema.extended_msg import INVALID_LOG_PROB_VALUE +from astuner.schema.trajectory import Reward +from astuner.utils.color_hsl import adjust_color_hsl +from astuner.utils.compute_madness import compute_string_madness +from astuner.utils.tokenizer import astune_apply_chat_template class MultiAgentContextTracking(BasicContextTracker): @@ -51,7 +51,7 @@ def __init__( def step_prepare(self, messages: List[dict], tools: List = []): self.full_context = [] consider_roles = ["user", "assistant", "system", "tool"] - disable_toolcalls = self.config.astune.rollout.agentscope_disable_toolcalls + disable_toolcalls = self.config.astuner.rollout.agentscope_disable_toolcalls if disable_toolcalls: consider_roles.remove("tool") tools = [] @@ -139,7 +139,7 @@ def step_track( if ( compute_string_madness( completion=llm_output["content"], - checklist=self.config.astune.rollout.compute_madness_checklist, + checklist=self.config.astuner.rollout.compute_madness_checklist, ) < 0.0 ): @@ -149,7 +149,7 @@ def step_track( err_type = "" if llm_output.get("tool_calls", []): # is not None, and is not [] tool_calls = llm_output["tool_calls"] - if "wrong_toolcall" in self.config.astune.rollout.compute_madness_checklist: + if "wrong_toolcall" in self.config.astuner.rollout.compute_madness_checklist: # check tool call formating copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False @@ -199,8 +199,8 @@ def step_track( input_msg_ref, llm_output, tools=tools ) assert ( - len(token_arr_method2) <= self.config.astune.rollout.max_response_length_in_one_turn - ), f"Generated token length {len(token_arr_method2)} exceeds max_response_length_in_one_turn {self.config.astune.rollout.max_response_length_in_one_turn}" + len(token_arr_method2) <= self.config.astuner.rollout.max_response_length_in_one_turn + ), f"Generated token length {len(token_arr_method2)} exceeds max_response_length_in_one_turn {self.config.astuner.rollout.max_response_length_in_one_turn}" llm_ext_msg.token_arr = token_arr_method2 llm_ext_msg.token_logprob_arr = token_logprob_arr self.generated_token_callback_fn(llm_ext_msg.token_arr) @@ -217,7 +217,7 @@ def step_track( ) self.full_context += [llm_ext_msg] is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) - if length > self.config.astune.rollout.max_model_len: + if length > self.config.astuner.rollout.max_model_len: raise RuntimeError( f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" ) @@ -416,8 +416,8 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tokenize=False, ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len + max_response_length = self.config.astuner.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.astuner.rollout.max_model_len max_seq_length: int = max_model_len - max_response_length if length < max_seq_length: @@ -436,8 +436,8 @@ def check_context_token_num_safe( tokenize=False, ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len + max_response_length = self.config.astuner.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.astuner.rollout.max_model_len max_seq_length: int = max_model_len - max_response_length if length < max_seq_length: token_overflow = False @@ -445,7 +445,7 @@ def check_context_token_num_safe( token_overflow = True if self.should_interrupt_fn(): ret = (False, token_overflow, "externally_interrupted") - elif self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: + elif self.already_mad_flag and self.config.astuner.rollout.agent_madness_termination: ret = (False, token_overflow, "already_mad") elif length < max_seq_length: ret = ( diff --git a/astune/context_tracker/agentscope_tracker/timeline_merging.py b/astuner/context_tracker/agentscope_tracker/timeline_merging.py similarity index 98% rename from astune/context_tracker/agentscope_tracker/timeline_merging.py rename to astuner/context_tracker/agentscope_tracker/timeline_merging.py index cf9936c1..248f1b07 100644 --- a/astune/context_tracker/agentscope_tracker/timeline_merging.py +++ b/astuner/context_tracker/agentscope_tracker/timeline_merging.py @@ -2,7 +2,7 @@ from beast_logger import NestedJsonItem, SeqItem, print_listofdict, print_nested -from astune.context_tracker.basic_tracker import ( +from astuner.context_tracker.basic_tracker import ( BasicContextTracker, ExtendedMessage, replace_token_ids, diff --git a/astune/context_tracker/basic_tracker.py b/astuner/context_tracker/basic_tracker.py similarity index 97% rename from astune/context_tracker/basic_tracker.py rename to astuner/context_tracker/basic_tracker.py index 80484558..32575cca 100644 --- a/astune/context_tracker/basic_tracker.py +++ b/astuner/context_tracker/basic_tracker.py @@ -13,14 +13,14 @@ ) from loguru import logger -from astune.context_tracker.tracker_base_attr import ( +from astuner.context_tracker.tracker_base_attr import ( ExtendedMessage, TrackerAttr, replace_token_ids, ) -from astune.schema.trajectory import Reward, Sample -from astune.utils.compute_madness import compute_string_madness -from astune.utils.tokenizer import astune_apply_chat_template +from astuner.schema.trajectory import Reward, Sample +from astuner.utils.compute_madness import compute_string_madness +from astuner.utils.tokenizer import astune_apply_chat_template class BasicContextTracker(TrackerAttr): @@ -95,7 +95,7 @@ def get_seq_length(messages): ) token_overflow = get_seq_length(messages) >= self.max_seq_length - if self.already_mad_flag and self.config.astune.rollout.agent_madness_termination: + if self.already_mad_flag and self.config.astuner.rollout.agent_madness_termination: return False, token_overflow, "already_mad" messages = self.prepare_previous_context(mod="raw") if not token_overflow: # self.config.env_engine.max_seq_length = 20480 @@ -238,7 +238,7 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= if ( compute_string_madness( completion=llm_output["content"], - checklist=self.config.astune.rollout.compute_madness_checklist, + checklist=self.config.astuner.rollout.compute_madness_checklist, ) < 0.0 ): @@ -444,7 +444,7 @@ def group_tokenize(self): def group_tokenize_multi_group(self): sample_arr = [] - max_num_group = self.config.astune.rollout.multi_turn.max_sample_per_task + max_num_group = self.config.astuner.rollout.multi_turn.max_sample_per_task for index, ext_steps in enumerate(self.grouped_steps): cmt_tokenized = self.tokenize_steps( ext_steps=ext_steps, @@ -541,13 +541,13 @@ def compute_step_level_reward( # --------------- global level reward --------------- global_reward = self.reward_structure.raw_reward - gamma = self.config.astune.rollout.gamma + gamma = self.config.astuner.rollout.gamma step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) # --------------- compute step level reward --------------- step_reward = step_reward_base if self.already_mad_flag: - step_reward = self.config.astune.rollout.agent_madness_reward + step_reward = self.config.astuner.rollout.agent_madness_reward self.reward_structure.madness = -1.0 return step_reward @@ -614,7 +614,7 @@ def tokenize_steps( if split_prompt_reponse_index == -1: # should we begin split point early? - if input_ids_len[-1] > self.config.astune.data.max_prompt_length: + if input_ids_len[-1] > self.config.astuner.data.max_prompt_length: message_dict = self.to_role_content(ext_steps) logger.warning( f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix..." @@ -627,7 +627,7 @@ def tokenize_steps( i >= 1 ), "There should be at least one message before exceeding max_prompt_length" assert ( - input_ids_len[-2] <= self.config.astune.data.max_prompt_length + input_ids_len[-2] <= self.config.astuner.data.max_prompt_length ), "The previous message should be within max_prompt_length, something is wrong" split_point_message_left_index = i - 1 assert split_point_message_left_index == (len(input_ids_len) - 2), "what?" diff --git a/astune/context_tracker/tracker_base_attr.py b/astuner/context_tracker/tracker_base_attr.py similarity index 84% rename from astune/context_tracker/tracker_base_attr.py rename to astuner/context_tracker/tracker_base_attr.py index ddda5cc0..166268d9 100644 --- a/astune/context_tracker/tracker_base_attr.py +++ b/astuner/context_tracker/tracker_base_attr.py @@ -3,12 +3,12 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from astune.schema.extended_msg import ( +from astuner.schema.extended_msg import ( INVALID_LOG_PROB_VALUE, ExtendedMessage, find_sublist_indices, ) -from astune.schema.trajectory import Reward +from astuner.schema.trajectory import Reward def replace_token_ids( @@ -43,10 +43,10 @@ def __init__(self, config, tokenizer, **kwargs): self.full_context: List[ExtendedMessage] = [] self.grouped_steps: List[List[ExtendedMessage]] = [] self.current_context_status = "" - max_response_length = self.config.astune.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astune.rollout.max_model_len + max_response_length = self.config.astuner.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.astuner.rollout.max_model_len self.max_seq_length: int = max_model_len - max_response_length - self.max_env_output_length: int = self.config.astune.rollout.max_env_len + self.max_env_output_length: int = self.config.astuner.rollout.max_env_len self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") self.generated_token_cnt = 0 self.terminal_rewards_dict = {} @@ -61,6 +61,6 @@ def __init__(self, config, tokenizer, **kwargs): self.generation_prompt_token = None assert ( - self.config.astune.data.max_prompt_length + self.config.astune.data.max_response_length + self.config.astuner.data.max_prompt_length + self.config.astuner.data.max_response_length <= max_model_len ) diff --git a/astune/data_generator/__init__.py b/astuner/data_generator/__init__.py similarity index 100% rename from astune/data_generator/__init__.py rename to astuner/data_generator/__init__.py diff --git a/astune/data_generator/data_generator_base.py b/astuner/data_generator/data_generator_base.py similarity index 84% rename from astune/data_generator/data_generator_base.py rename to astuner/data_generator/data_generator_base.py index 08878286..2d939a91 100644 --- a/astune/data_generator/data_generator_base.py +++ b/astuner/data_generator/data_generator_base.py @@ -1,8 +1,8 @@ from typing import Any, Dict, List, Optional, Union -from astune.schema.document import Document -from astune.schema.task import Task -from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn +from astuner.schema.document import Document +from astuner.schema.task import Task +from astuner.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn class DataGeneratorBase: @@ -14,10 +14,10 @@ def __init__(self, config): config: Optional configuration object (LLM model, Maximum response length) """ self.config = config - self.sampling_params = self.config.astune.data_generator.sampling_params or {} + self.sampling_params = self.config.astuner.data_generator.sampling_params or {} self.llm_client = construct_alien_llm_chat_fn( - alien_llm_model=self.config.astune.data_generator.llm_model, - alien_llm_response_length=self.config.astune.data_generator.llm_response_length, + alien_llm_model=self.config.astuner.data_generator.llm_model, + alien_llm_response_length=self.config.astuner.data_generator.llm_response_length, ) def generate_task( diff --git a/astune/data_generator/filters/__init__.py b/astuner/data_generator/filters/__init__.py similarity index 100% rename from astune/data_generator/filters/__init__.py rename to astuner/data_generator/filters/__init__.py diff --git a/astune/task_reader/tracing_reader/filters/base.py b/astuner/data_generator/filters/base.py similarity index 88% rename from astune/task_reader/tracing_reader/filters/base.py rename to astuner/data_generator/filters/base.py index d51b6824..f72bae4c 100644 --- a/astune/task_reader/tracing_reader/filters/base.py +++ b/astuner/data_generator/filters/base.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from typing import Iterable, List -from astune.schema.task import Task +from astuner.schema.task import Task class Filter(ABC): diff --git a/astune/data_generator/filters/factory.py b/astuner/data_generator/filters/factory.py similarity index 95% rename from astune/data_generator/filters/factory.py rename to astuner/data_generator/filters/factory.py index ccb0211a..954cb8fc 100644 --- a/astune/data_generator/filters/factory.py +++ b/astuner/data_generator/filters/factory.py @@ -28,7 +28,7 @@ def _build_single_filter(spec: Mapping[str, Any]) -> Filter: def build_filters(specs: Sequence[Mapping[str, Any]] | None) -> List[Filter]: """Setup filter chain according to config. - Refer to: astune.task_reader.feedback_tracing.filters + Refer to: astuner.task_reader.feedback_tracing.filters """ if not specs: return [] diff --git a/astune/data_generator/filters/llm_evaluate_filter.py b/astuner/data_generator/filters/llm_evaluate_filter.py similarity index 96% rename from astune/data_generator/filters/llm_evaluate_filter.py rename to astuner/data_generator/filters/llm_evaluate_filter.py index aae45ccb..9d82c04e 100644 --- a/astune/data_generator/filters/llm_evaluate_filter.py +++ b/astuner/data_generator/filters/llm_evaluate_filter.py @@ -3,9 +3,9 @@ from tqdm import tqdm -from astune.schema.task import Task -from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn -from astune.utils.fn import Fn +from astuner.schema.task import Task +from astuner.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn +from astuner.utils.fn import Fn from .base import Filter diff --git a/astune/data_generator/knowledge_augmentation.py b/astuner/data_generator/knowledge_augmentation.py similarity index 96% rename from astune/data_generator/knowledge_augmentation.py rename to astuner/data_generator/knowledge_augmentation.py index aec69175..6aa934b4 100644 --- a/astune/data_generator/knowledge_augmentation.py +++ b/astuner/data_generator/knowledge_augmentation.py @@ -2,9 +2,9 @@ import re from typing import Any, Dict, List, Optional -from astune.data_generator.data_generator_base import DataGeneratorBase -from astune.schema.document import Document -from astune.schema.task import Task +from astuner.data_generator.data_generator_base import DataGeneratorBase +from astuner.schema.document import Document +from astuner.schema.task import Task class KnowledgeAugmentor(DataGeneratorBase): @@ -47,7 +47,7 @@ def _build_user_prompt( ref_doc = document.content user_part = [] - N = self.config.astune.data_generator.knowledge_augmentor.n + N = self.config.astuner.data_generator.knowledge_augmentor.n user_part.append( f"Generate exactly {N} unique, high-quality questions from the following document according to the rules in the system prompt above." ) diff --git a/astune/data_generator/task_augmentation.py b/astuner/data_generator/task_augmentation.py similarity index 97% rename from astune/data_generator/task_augmentation.py rename to astuner/data_generator/task_augmentation.py index b301022d..f9c3d1b7 100644 --- a/astune/data_generator/task_augmentation.py +++ b/astuner/data_generator/task_augmentation.py @@ -2,9 +2,9 @@ import re from typing import Any, Dict, Optional, Union -from astune.data_generator.data_generator_base import DataGeneratorBase -from astune.schema.document import Document -from astune.schema.task import Task +from astuner.data_generator.data_generator_base import DataGeneratorBase +from astuner.schema.document import Document +from astuner.schema.task import Task class TaskAugmentor(DataGeneratorBase): diff --git a/astune/default_config/README.md b/astuner/default_config/README.md similarity index 100% rename from astune/default_config/README.md rename to astuner/default_config/README.md diff --git a/astune/default_config/astune_default.yaml b/astuner/default_config/astune_default.yaml similarity index 98% rename from astune/default_config/astune_default.yaml rename to astuner/default_config/astune_default.yaml index 858862ff..ad3d2491 100644 --- a/astune/default_config/astune_default.yaml +++ b/astuner/default_config/astune_default.yaml @@ -1,5 +1,5 @@ # ------------------ main configuration ------------------ -astune: +astuner project_name: appworld_astune experiment_name: "read_yaml_name" experiment_dir: "auto" # {exp-dir}/{experiment_name} @@ -25,7 +25,7 @@ astune: task_judge: judge_type: customized_protocal # Options: 'customized_protocal', 'rubrics_auto_grader' - judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 diff --git a/astune/default_config/trinity/README.md b/astuner/default_config/trinity/README.md similarity index 84% rename from astune/default_config/trinity/README.md rename to astuner/default_config/trinity/README.md index 7a64e21a..e54fec2e 100644 --- a/astune/default_config/trinity/README.md +++ b/astuner/default_config/trinity/README.md @@ -2,7 +2,7 @@ ## How to Modify Trinity Configuration in ASTuner -1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `astune/default_config/astune_default.yaml` configuration file, and ASTuner will **automatically** handle parameter mapping for you. +1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `astuner/default_config/astune_default.yaml` configuration file, and ASTuner will **automatically** handle parameter mapping for you. 2. ⚙️ **Special Cases**: Some Trinity tuning parameters are not yet mapped in ASTuner. You can refer to Trinity’s documentation and modify them in the following format: @@ -13,13 +13,13 @@ trinity: ``` 3. 🚫 **Never Edit**: - - Never edit `astune/default_config/trinity/trinity_launcher.yaml` - - Never edit `astune/default_config/trinity/trinity_default.yaml` + - Never edit `astuner/default_config/trinity/trinity_launcher.yaml` + - Never edit `astuner/default_config/trinity/trinity_default.yaml` ## Configuration Mapping Modification 🔄 Some ASTune configurations overlap with Trinity. -You can configure mappings via the `astune/default_config/trinity/config_auto_convertion_trinity.json` file. +You can configure mappings via the `astuner/default_config/trinity/config_auto_convertion_trinity.json` file. ## Trinity Hyperparameter Quick Guide 📊 diff --git a/astune/default_config/trinity/README_ZH.md b/astuner/default_config/trinity/README_ZH.md similarity index 86% rename from astune/default_config/trinity/README_ZH.md rename to astuner/default_config/trinity/README_ZH.md index 5c15164e..f8323172 100644 --- a/astune/default_config/trinity/README_ZH.md +++ b/astuner/default_config/trinity/README_ZH.md @@ -2,7 +2,7 @@ ## 如何修改 Trinity 配置 -1. 🎯 **推荐方式**:在大多数情况下,您无需直接调整 Trinity 参数,只需参考并修改上层的 `astune/default_config/astune_default.yaml` 配置文件即可, +1. 🎯 **推荐方式**:在大多数情况下,您无需直接调整 Trinity 参数,只需参考并修改上层的 `astuner/default_config/astune_default.yaml` 配置文件即可, ASTuner 会**自动**帮您完成参数映射。 2. ⚙️ **特殊情况**:部分 Trinity 调优参数目前尚未在 ASTuner 中建立映射,您可以参考 Trinity 的文档,然后通过以下形式进行修改: @@ -14,13 +14,13 @@ trinity: ``` 3. 🚫 **永远不要编辑**: - - 永远不要编辑 `astune/default_config/trinity/trinity_launcher.yaml` - - 永远不要编辑 `astune/default_config/trinity/trinity_default.yaml` + - 永远不要编辑 `astuner/default_config/trinity/trinity_launcher.yaml` + - 永远不要编辑 `astuner/default_config/trinity/trinity_default.yaml` ## 配置映射修改 🔄 某些 ASTune 配置与 Trinity 存在重叠, -可通过 `astune/default_config/trinity/config_auto_convertion_trinity.json` 文件进行映射配置 +可通过 `astuner/default_config/trinity/config_auto_convertion_trinity.json` 文件进行映射配置 ## Trinity 超参数简明指南 📊 diff --git a/astuner/default_config/trinity/config_auto_convertion_trinity.json b/astuner/default_config/trinity/config_auto_convertion_trinity.json new file mode 100644 index 00000000..906a6976 --- /dev/null +++ b/astuner/default_config/trinity/config_auto_convertion_trinity.json @@ -0,0 +1,23 @@ +{ + + "astuner.trainer_common.nnodes": "cluster.node_num", + "astuner.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", + "astuner.trainer_common.total_epochs": "buffer.total_epochs", + "astuner.trainer_common.trinity_only__n_vllm_engine": "explorer.rollout_model.engine_num", + "astuner.trainer_common.trinity_only__explorer_batchsize": "buffer.batch_size", + "astuner.trainer_common.trinity_only__runner_per_model": "explorer.runner_per_model", + "astuner.trainer_common.save_freq": "trainer.save_interval", + "astuner.trainer_common.test_freq": "explorer.eval_interval", + "astuner.model.path": "model.model_path", + "astuner.project_name": "project", + "astuner.experiment_name": "name", + "astuner.data.train_batch_size": "buffer.train_batch_size", + "astuner.data.max_response_length": "model.max_response_tokens", + "astuner.rollout.num_repeat": "algorithm.repeat_times", + "astuner.rollout.tensor_model_parallel_size": "explorer.rollout_model.tensor_parallel_size", + "astuner.rollout.max_model_len": [ + "model.max_model_len", + "trainer.max_token_len_per_gpu" + ] + +} diff --git a/astune/default_config/trinity/trinity_default.yaml b/astuner/default_config/trinity/trinity_default.yaml similarity index 95% rename from astune/default_config/trinity/trinity_default.yaml rename to astuner/default_config/trinity/trinity_default.yaml index 8eef7353..a2948d2f 100644 --- a/astune/default_config/trinity/trinity_default.yaml +++ b/astuner/default_config/trinity/trinity_default.yaml @@ -9,7 +9,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 explorer_input: eval_tasksets: [] taskset: - default_workflow_type: astune_workflow + default_workflow_type: astuner_workflow format: prompt_key: question response_key: answer @@ -18,7 +18,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 rollout_args: temperature: 1.0 split: train - storage_type: astune + storage_type: astuner subset_name: appworld total_epochs: 1000 train_batch_size: 36 diff --git a/astune/default_config/trinity/trinity_launch.yaml b/astuner/default_config/trinity/trinity_launch.yaml similarity index 87% rename from astune/default_config/trinity/trinity_launch.yaml rename to astuner/default_config/trinity/trinity_launch.yaml index e61b854d..59cb3381 100644 --- a/astune/default_config/trinity/trinity_launch.yaml +++ b/astuner/default_config/trinity/trinity_launch.yaml @@ -1,6 +1,6 @@ -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astune/default_config/trinity/trinity_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/trinity/trinity_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/trinity/trinity_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/trinity/trinity_default.yaml` INSTEAD algorithm: algorithm_type: multi_step_grpo @@ -12,7 +12,7 @@ buffer: explorer_input: eval_tasksets: [] taskset: - default_workflow_type: astune_workflow + default_workflow_type: astuner_workflow format: prompt_key: question response_key: answer @@ -21,7 +21,7 @@ buffer: rollout_args: temperature: 1.0 split: train - storage_type: astune + storage_type: astuner subset_name: appworld total_epochs: 1000 train_batch_size: 36 diff --git a/astuner/default_config/verl/config_auto_convertion_verl.json b/astuner/default_config/verl/config_auto_convertion_verl.json new file mode 100644 index 00000000..8f7c31fc --- /dev/null +++ b/astuner/default_config/verl/config_auto_convertion_verl.json @@ -0,0 +1,38 @@ +{ + "astuner.trainer_common.total_epochs": "trainer.total_epochs", + + "astuner.trainer_common.val_before_train": "trainer.val_before_train", + "astuner.trainer_common.n_gpus_per_node": "trainer.n_gpus_per_node", + "astuner.trainer_common.nnodes": "trainer.nnodes", + "astuner.trainer_common.logger": "trainer.logger", + "astuner.trainer_common.algorithm.task_norm_patch": "algorithm.task_norm_patch", + "astuner.trainer_common.algorithm.adv_estimator": "algorithm.adv_estimator", + "astuner.trainer_common.algorithm.use_kl_in_reward": "algorithm.use_kl_in_reward", + "astuner.trainer_common.mini_batch_num": "actor_rollout_ref.actor.override_ppo_mini_batch_num", + "astuner.trainer_common.fsdp_config": "actor_rollout_ref.actor.fsdp_config", + "astuner.trainer_common.optim": "actor_rollout_ref.actor.optim", + "astuner.trainer_common.use_kl_loss": "actor_rollout_ref.actor.use_kl_loss", + "astuner.trainer_common.kl_loss_coef": "actor_rollout_ref.actor.kl_loss_coef", + "astuner.trainer_common.kl_loss_type": "actor_rollout_ref.actor.kl_loss_type", + "astuner.trainer_common.save_freq": "trainer.save_freq", + "astuner.trainer_common.test_freq": "trainer.test_freq", + + "astuner.data.max_prompt_length": "data.max_prompt_length", + "astuner.data.max_response_length": "data.max_response_length", + "astuner.data.train_batch_size": "data.train_batch_size", + + "astuner.rollout.max_model_len": [ + "actor_rollout_ref.rollout.max_model_len", + "actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu", + "actor_rollout_ref.actor.ppo_max_token_len_per_gpu", + "actor_rollout_ref.ref.log_prob_max_token_len_per_gpu" + ], + + "astuner.rollout.mode": "actor_rollout_ref.rollout.mode", + "astuner.rollout.multi_turn": "actor_rollout_ref.rollout.multi_turn", + "astuner.rollout.val_kwargs": "actor_rollout_ref.rollout.val_kwargs", + + "astuner.model.path": "actor_rollout_ref.model.path", + "astuner.project_name": "trainer.project_name", + "astuner.experiment_name": "trainer.experiment_name" +} diff --git a/astune/default_config/verl/verl_default.yaml b/astuner/default_config/verl/verl_default.yaml similarity index 100% rename from astune/default_config/verl/verl_default.yaml rename to astuner/default_config/verl/verl_default.yaml diff --git a/astune/main_trinity.py b/astuner/main_trinity.py similarity index 97% rename from astune/main_trinity.py rename to astuner/main_trinity.py index da820ce3..b324d2a5 100644 --- a/astune/main_trinity.py +++ b/astuner/main_trinity.py @@ -23,9 +23,9 @@ from trinity.utils.plugin_loader import load_plugins # register trinity backbone modules -import astune.backbone.trinity_compat_workflow # noqa: F401 -from astune.utils.core_env_vars import get_runtime_env -from astune.utils.sms_agent import send_train_message +import astuner.backbone.trinity_compat_workflow # noqa: F401 +from astuner.utils.core_env_vars import get_runtime_env +from astuner.utils.sms_agent import send_train_message logger = get_logger(__name__) @@ -157,7 +157,7 @@ def run_stage(config: Config) -> None: namespace=config.ray_namespace, runtime_env={ "env_vars": config.get_envs(), - "ASTUNE_CONFIG_REDIRECT": os.environ.get("ASTUNE_CONFIG_REDIRECT"), + "ASTUNER_CONFIG_REDIRECT": os.environ.get("ASTUNER_CONFIG_REDIRECT"), }, ) pprint(config) @@ -271,7 +271,7 @@ def debug( namespace=config.ray_namespace, runtime_env={ "env_vars": config.get_envs(), - "ASTUNE_CONFIG_REDIRECT": os.environ.get("ASTUNE_CONFIG_REDIRECT"), + "ASTUNER_CONFIG_REDIRECT": os.environ.get("ASTUNER_CONFIG_REDIRECT"), }, ignore_reinit_error=True, ) diff --git a/astune/main_verl.py b/astuner/main_verl.py similarity index 94% rename from astune/main_verl.py rename to astuner/main_verl.py index d92e46f9..52860580 100644 --- a/astune/main_verl.py +++ b/astuner/main_verl.py @@ -30,8 +30,8 @@ from verl.utils.device import is_cuda_available from verl.utils.import_utils import load_extern_type -from astune.utils.core_env_vars import get_runtime_env -from astune.utils.sms_agent import send_train_message +from astuner.utils.core_env_vars import get_runtime_env +from astuner.utils.sms_agent import send_train_message @hydra.main(config_path="config", config_name="ppo_trainer", version_base=None) @@ -122,7 +122,7 @@ def run(self, config): # Download the checkpoint from HDFS to the local machine. # `use_shm` determines whether to use shared memory, which could lead to faster model loading if turned on local_path = copy_to_local( - config.astune.model.path, + config.astuner.model.path, use_shm=config.actor_rollout_ref.model.get("use_shm", False), ) @@ -158,7 +158,7 @@ def run(self, config): actor_rollout_cls = ( AsyncActorRolloutRefWorker - if config.astune.rollout.mode == "async" + if config.astuner.rollout.mode == "async" else ActorRolloutRefWorker ) ray_worker_group_cls = RayWorkerGroup @@ -174,7 +174,7 @@ def run(self, config): actor_rollout_cls = ( AsyncActorRolloutRefWorker - if config.astune.rollout.mode == "async" + if config.astuner.rollout.mode == "async" else ActorRolloutRefWorker ) ray_worker_group_cls = NVMegatronRayWorkerGroup @@ -182,7 +182,7 @@ def run(self, config): else: raise NotImplementedError - from astune.backbone.native_compat_trainer import ResourcePoolManager, Role + from astuner.backbone.native_compat_trainer import ResourcePoolManager, Role # Map roles to their corresponding remote worker classes. role_worker_mapping = { @@ -242,15 +242,15 @@ def run(self, config): from verl.utils.dataset.rl_dataset import collate_fn # Create training and validation datasets. - from astune.task_reader import TaskReaderRouter, task_to_standard_dataset - from astune.utils.process_dataset import create_rl_sampler + from astuner.task_reader import TaskReaderRouter, task_to_standard_dataset + from astuner.utils.process_dataset import create_rl_sampler task_reader = TaskReaderRouter(config) val_dataset = task_to_standard_dataset(task_reader.get_validation_tasks()) train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from astune.backbone.native_compat_trainer import ASTuneRayPPOTrainer + from astuner.backbone.native_compat_trainer import ASTuneRayPPOTrainer # Initialize the PPO trainer. trainer = ASTuneRayPPOTrainer( diff --git a/astune/main_vllm.py b/astuner/main_vllm.py similarity index 80% rename from astune/main_vllm.py rename to astuner/main_vllm.py index cc2bd5b0..2efb2a2f 100644 --- a/astune/main_vllm.py +++ b/astuner/main_vllm.py @@ -7,10 +7,10 @@ from beast_logger import register_logger from openai import OpenAI -from astune.backbone.common_warm_up import warm_up_process -from astune.schema.task import Task -from astune.task_rollout.native_parallel_worker import ParallelEnvManager -from astune.utils.sms_agent import send_train_message +from astuner.backbone.common_warm_up import warm_up_process +from astuner.schema.task import Task +from astuner.task_rollout.native_parallel_worker import ParallelEnvManager +from astuner.utils.sms_agent import send_train_message class TokenAndProb: @@ -30,7 +30,7 @@ def __init__(self, url, config): self.url = url self.config = config - self.tokenizer = AutoTokenizer.from_pretrained(self.config.astune.model.path) + self.tokenizer = AutoTokenizer.from_pretrained(self.config.astuner.model.path) self.chat_scheduler = SimpleNamespace( model_name="dummy-model-name", weighted_addresses="dummy-weighted-addresses", @@ -44,24 +44,24 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ ) sampling_params = dict( n=1, - max_completion_tokens=self.config.astune.rollout.max_response_length_in_one_turn, + max_completion_tokens=self.config.astuner.rollout.max_response_length_in_one_turn, ) - sampling_params["temperature"] = self.config.astune.rollout.val_kwargs.temperature - sampling_params["top_k"] = self.config.astune.rollout.val_kwargs.top_k - sampling_params["top_p"] = self.config.astune.rollout.val_kwargs.top_p + sampling_params["temperature"] = self.config.astuner.rollout.val_kwargs.temperature + sampling_params["top_k"] = self.config.astuner.rollout.val_kwargs.top_k + sampling_params["top_p"] = self.config.astuner.rollout.val_kwargs.top_p sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) if tools: completion = client.chat.completions.create( - model=self.config.astune.model.path, + model=self.config.astuner.model.path, messages=messages, tools=tools, extra_body=sampling_params, ) else: completion = client.chat.completions.create( - model=self.config.astune.model.path, + model=self.config.astuner.model.path, messages=messages, extra_body=sampling_params, ) @@ -86,9 +86,9 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ def run(config): # --------- fast adjustment for debugging --------- warm_up_process(config) - max_parallel = config.astune.debug.debug_max_parallel - n_task = config.astune.debug.debug_first_n_tasks - vllm_port = config.astune.debug.debug_vllm_port + max_parallel = config.astuner.debug.debug_max_parallel + n_task = config.astuner.debug.debug_first_n_tasks + vllm_port = config.astuner.debug.debug_vllm_port # --------- init --------- async_rollout_manager = ChatCompletionScheduler( @@ -103,7 +103,7 @@ def run(config): tokenizer=async_rollout_manager.tokenizer, ) - from astune.task_reader import TaskReaderRouter + from astuner.task_reader import TaskReaderRouter task_reader = TaskReaderRouter(config) tasks = task_reader.get_validation_tasks() @@ -116,7 +116,7 @@ def run(config): @hydra.main( - config_path="astune/default_config", + config_path="astuner/default_config", config_name="astune_default", version_base=None, ) @@ -129,11 +129,11 @@ def main(config): def companion_launch(): import torch - from astune.utils.smart_daemon import LaunchCommandWhenAbsent + from astuner.utils.smart_daemon import LaunchCommandWhenAbsent print("Launching companion process for async LLM server...") - model_path = config.astune.model.path - tensor_parallel_size = config.astune.debug.debug_tensor_parallel_size + model_path = config.astuner.model.path + tensor_parallel_size = config.astuner.debug.debug_tensor_parallel_size n_avail_gpus = torch.cuda.device_count() if tensor_parallel_size > n_avail_gpus: print( @@ -142,9 +142,9 @@ def companion_launch(): tensor_parallel_size = n_avail_gpus gpu_memory_utilization = config.actor_rollout_ref.rollout.gpu_memory_utilization max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs - max_model_len = config.astune.rollout.max_model_len - seed = config.astune.debug.debug_vllm_seed - vllm_port = config.astune.debug.debug_vllm_port + max_model_len = config.astuner.rollout.max_model_len + seed = config.astuner.debug.debug_vllm_seed + vllm_port = config.astuner.debug.debug_vllm_port companion = LaunchCommandWhenAbsent( full_argument_list=[ sys.executable, diff --git a/astune/schema/__init__.py b/astuner/schema/__init__.py similarity index 100% rename from astune/schema/__init__.py rename to astuner/schema/__init__.py diff --git a/astune/schema/document.py b/astuner/schema/document.py similarity index 100% rename from astune/schema/document.py rename to astuner/schema/document.py diff --git a/astune/schema/extended_msg.py b/astuner/schema/extended_msg.py similarity index 99% rename from astune/schema/extended_msg.py rename to astuner/schema/extended_msg.py index a3e3e30f..d6feb7cc 100644 --- a/astune/schema/extended_msg.py +++ b/astuner/schema/extended_msg.py @@ -4,8 +4,8 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from astune.schema.trajectory import Reward -from astune.utils.tokenizer import astune_apply_chat_template +from astuner.schema.trajectory import Reward +from astuner.utils.tokenizer import astune_apply_chat_template INVALID_LOG_PROB_VALUE = 0.0 NEED_TRAIN_AUTHORS = ["llm"] diff --git a/astune/schema/logprob.py b/astuner/schema/logprob.py similarity index 100% rename from astune/schema/logprob.py rename to astuner/schema/logprob.py diff --git a/astune/schema/task.py b/astuner/schema/task.py similarity index 100% rename from astune/schema/task.py rename to astuner/schema/task.py diff --git a/astune/schema/trajectory.py b/astuner/schema/trajectory.py similarity index 96% rename from astune/schema/trajectory.py rename to astuner/schema/trajectory.py index 1a636cdd..0e65ad8e 100644 --- a/astune/schema/trajectory.py +++ b/astuner/schema/trajectory.py @@ -74,10 +74,10 @@ class Sample(BaseModel): def __init__(self, cmt_tokenized: dict, messages, config, **kwargs): super().__init__(**kwargs) - self.max_prompt_len = config.astune.data.max_prompt_length - self.max_response_len = config.astune.data.max_response_length + self.max_prompt_len = config.astuner.data.max_prompt_length + self.max_response_len = config.astuner.data.max_response_length self.max_model_len = ( - config.astune.data.max_response_length + config.astune.data.max_prompt_length + config.astuner.data.max_response_length + config.astuner.data.max_prompt_length ) self.input_ids = cmt_tokenized["input_ids"] diff --git a/astune/task_judge/env_service_as_judge.py b/astuner/task_judge/env_service_as_judge.py similarity index 75% rename from astune/task_judge/env_service_as_judge.py rename to astuner/task_judge/env_service_as_judge.py index 88e43919..bc17f44b 100644 --- a/astune/task_judge/env_service_as_judge.py +++ b/astuner/task_judge/env_service_as_judge.py @@ -1,5 +1,5 @@ -from astune.task_judge.judge_base import JudgeBase -from astune.workflow import WorkflowOutput, WorkflowTask +from astuner.task_judge.judge_base import JudgeBase +from astuner.workflow import WorkflowOutput, WorkflowTask class EnvServiceJudge(JudgeBase): @@ -16,13 +16,13 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO else: is_success = False - if self.config.astune.rollout.add_special_success_reward: + if self.config.astuner.rollout.add_special_success_reward: if is_success: raw_reward = 1.0 + raw_reward * 0.5 else: raw_reward = 0.0 + raw_reward * 0.5 - if self.config.astune.rollout.binary_reward: + if self.config.astuner.rollout.binary_reward: raw_reward = 1.0 if is_success else 0.0 return raw_reward, is_success diff --git a/astune/task_judge/judge_base.py b/astuner/task_judge/judge_base.py similarity index 78% rename from astune/task_judge/judge_base.py rename to astuner/task_judge/judge_base.py index 439106db..8e51ebcd 100644 --- a/astune/task_judge/judge_base.py +++ b/astuner/task_judge/judge_base.py @@ -1,4 +1,4 @@ -from astune.workflow import WorkflowOutput, WorkflowTask +from astuner.workflow import WorkflowOutput, WorkflowTask class JudgeBase: diff --git a/astune/task_judge/math_answer_as_judge.py b/astuner/task_judge/math_answer_as_judge.py similarity index 86% rename from astune/task_judge/math_answer_as_judge.py rename to astuner/task_judge/math_answer_as_judge.py index 2e82d4ea..304b9069 100644 --- a/astune/task_judge/math_answer_as_judge.py +++ b/astuner/task_judge/math_answer_as_judge.py @@ -1,8 +1,8 @@ import re -from astune.task_judge.judge_base import JudgeBase -from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn -from astune.workflow import WorkflowOutput, WorkflowTask +from astuner.task_judge.judge_base import JudgeBase +from astuner.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn +from astuner.workflow import WorkflowOutput, WorkflowTask class MathAnswerAsJudge(JudgeBase): @@ -42,8 +42,8 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO reference_answer = reference_answer.split("####")[-1].strip() alien_llm_chat_fn = construct_alien_llm_chat_fn( - alien_llm_model=self.config.astune.task_judge.alien_llm_model, - alien_llm_response_length=self.config.astune.task_judge.alien_llm_response_length, + alien_llm_model=self.config.astuner.task_judge.alien_llm_model, + alien_llm_response_length=self.config.astuner.task_judge.alien_llm_response_length, ) messages = [ { diff --git a/astune/task_judge/rm_auto_grader_judge.py b/astuner/task_judge/rm_auto_grader_judge.py similarity index 93% rename from astune/task_judge/rm_auto_grader_judge.py rename to astuner/task_judge/rm_auto_grader_judge.py index 27fb3b04..c71b433f 100644 --- a/astune/task_judge/rm_auto_grader_judge.py +++ b/astuner/task_judge/rm_auto_grader_judge.py @@ -1,7 +1,7 @@ """ RM Gallery Auto Grader Judge Integration -This module integrates RM Gallery's AutoGrader capabilities into astune's judge system. +This module integrates RM Gallery's AutoGrader capabilities into astuner's judge system. It provides a data-driven approach to evaluate workflow outputs using automatically generated rubrics from training samples. @@ -9,7 +9,7 @@ - Automatic rubric generation from training/validation samples - Support for both pointwise and listwise evaluation modes - Flexible scoring based on LLM-generated rubrics -- Seamless integration with astune's workflow system +- Seamless integration with astuner's workflow system """ import asyncio @@ -30,8 +30,8 @@ from rm_gallery.core.schema.data import EvalCase from rm_gallery.core.schema.template import LanguageEnum -from astune.schema.task import Task, WorkflowOutput -from astune.task_judge.judge_base import JudgeBase +from astuner.schema.task import Task, WorkflowOutput +from astuner.task_judge.judge_base import JudgeBase class RMAutoGraderJudge(JudgeBase): @@ -88,7 +88,7 @@ def __init__(self, config): # Initialize the model self.model = OpenAIChatModel( - model=config.astune.task_judge.rubrics_auto_grader.model_name, + model=config.astuner.task_judge.rubrics_auto_grader.model_name, base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", stream=False, ) @@ -99,13 +99,13 @@ def __init__(self, config): # Field mappings for data extraction self.query_field = getattr( - config.astune.task_judge.rubrics_auto_grader, "query_field", "main_query" + config.astuner.task_judge.rubrics_auto_grader, "query_field", "main_query" ) self.answer_field = getattr( - config.astune.task_judge.rubrics_auto_grader, "answer_field", "final_answer" + config.astuner.task_judge.rubrics_auto_grader, "answer_field", "final_answer" ) self.reference_field = getattr( - config.astune.task_judge.rubrics_auto_grader, "reference_field", "answer" + config.astuner.task_judge.rubrics_auto_grader, "reference_field", "answer" ) logger.info( @@ -114,8 +114,8 @@ def __init__(self, config): ) def _parse_config(self) -> AutoGraderConfig: - """Parse astune config into AutoGraderConfig.""" - judge_config = self.config.astune.task_judge.rubrics_auto_grader + """Parse astuner config into AutoGraderConfig.""" + judge_config = self.config.astuner.task_judge.rubrics_auto_grader # Parse grader mode grader_mode_str = getattr(judge_config, "grader_mode", "pointwise").lower() @@ -169,11 +169,11 @@ def _parse_config(self) -> AutoGraderConfig: async def read_reference_samples_from_dataset(self) -> List[Task]: # read dataset from config - from astune.task_reader import TaskReaderRouterV2 + from astuner.task_reader import TaskReaderRouterV2 reader = TaskReaderRouterV2( - reader_type=self.config.astune.task_judge.rubrics_auto_grader.input_data_type, - reader_config=self.config.astune.task_judge.rubrics_auto_grader, + reader_type=self.config.astuner.task_judge.rubrics_auto_grader.input_data_type, + reader_config=self.config.astuner.task_judge.rubrics_auto_grader, ) return reader.task_reader.get_training_tasks() @@ -217,7 +217,7 @@ async def generate_rubrics_from_samples(self, reference_samples: List[Task] = [] # Generate rubrics and get LLMGrader self.llm_grader = await auto_grader.run(eval_cases) - experiment_dir = self.config.astune.experiment_dir + experiment_dir = self.config.astuner.experiment_dir grader_save_dir = os.path.join(experiment_dir, "auto_grader.json") # make dirs if not exist os.makedirs(experiment_dir, exist_ok=True) @@ -249,7 +249,7 @@ async def load_rubrics_from_cache(self) -> None: # Load grader config and inject model try: - experiment_dir = self.config.astune.experiment_dir + experiment_dir = self.config.astuner.experiment_dir grader_save_dir = os.path.join(experiment_dir, "auto_grader.json") grader_config = json.load(open(grader_save_dir, "r", encoding="utf-8")) grader_config["model"] = self.model @@ -394,7 +394,7 @@ def compute_reward(self, task: Task, workflow_output: WorkflowOutput) -> tuple: """ Compute reward for a workflow output (synchronous wrapper). - This is the main interface called by astune's workflow system. + This is the main interface called by astuner's workflow system. Args: task: The task being evaluated diff --git a/astune/task_reader/__init__.py b/astuner/task_reader/__init__.py similarity index 89% rename from astune/task_reader/__init__.py rename to astuner/task_reader/__init__.py index 417db785..b976a128 100644 --- a/astune/task_reader/__init__.py +++ b/astuner/task_reader/__init__.py @@ -6,12 +6,12 @@ import numpy as np import torch -from astune.schema.task import Task -from astune.task_reader.env_service_reader import TaskReaderEnvService -from astune.task_reader.hf_dataset_reader import TaskReaderHuggingFace -from astune.task_reader.jsonl_reader import TaskReaderJsonl -from astune.task_reader.task_reader_base import TaskReaderBase -from astune.task_reader.tracing_reader import TracingReader +from astuner.schema.task import Task +from astuner.task_reader.env_service_reader import TaskReaderEnvService +from astuner.task_reader.hf_dataset_reader import TaskReaderHuggingFace +from astuner.task_reader.jsonl_reader import TaskReaderJsonl +from astuner.task_reader.task_reader_base import TaskReaderBase +from astuner.task_reader.tracing_reader import TracingReader class RandomDummyGenerator(TaskReaderBase): @@ -49,8 +49,8 @@ def get_validation_tasks(self) -> List[Task]: class TaskReaderRouter(TaskReaderBase): def __init__(self, config): super().__init__(config) - task_reader_type = config.astune.task_reader.type - reader_config = config.astune.task_reader + task_reader_type = config.astuner.task_reader.type + reader_config = config.astuner.task_reader if task_reader_type == "env_service": self.task_reader = TaskReaderEnvService(reader_config) elif task_reader_type == "dataset_file": diff --git a/astune/task_reader/document_reader/doc_reader.py b/astuner/task_reader/document_reader/doc_reader.py similarity index 80% rename from astune/task_reader/document_reader/doc_reader.py rename to astuner/task_reader/document_reader/doc_reader.py index 6bdbaa38..f484a660 100644 --- a/astune/task_reader/document_reader/doc_reader.py +++ b/astuner/task_reader/document_reader/doc_reader.py @@ -3,8 +3,8 @@ from unstructured.partition.auto import partition -from astune.schema.document import Document -from astune.task_reader.document_reader.document_reader_base import DocReaderBase +from astuner.schema.document import Document +from astuner.task_reader.document_reader.document_reader_base import DocReaderBase class DocReader(DocReaderBase): @@ -39,8 +39,8 @@ def _parser_document(self, raw_document: str) -> Document: return Document(doc_id=str(uuid.uuid4()), content=raw_document, metadata={}) def get_document(self) -> Document: - file_path = self.config.astune.document_reader.document_path + file_path = self.config.astuner.document_reader.document_path raw_doc = self.load_document( - file_path, languages=list(self.config.astune.document_reader.languages) + file_path, languages=list(self.config.astuner.document_reader.languages) ) return self._parser_document(raw_doc) diff --git a/astune/task_reader/document_reader/document_reader_base.py b/astuner/task_reader/document_reader/document_reader_base.py similarity index 84% rename from astune/task_reader/document_reader/document_reader_base.py rename to astuner/task_reader/document_reader/document_reader_base.py index 785bd035..f00d024a 100644 --- a/astune/task_reader/document_reader/document_reader_base.py +++ b/astuner/task_reader/document_reader/document_reader_base.py @@ -4,7 +4,7 @@ import datasets -from astune.schema.document import Document +from astuner.schema.document import Document class DocReaderBase: diff --git a/astune/task_reader/env_service_reader.py b/astuner/task_reader/env_service_reader.py similarity index 88% rename from astune/task_reader/env_service_reader.py rename to astuner/task_reader/env_service_reader.py index 5b4dc79f..2c6329f7 100644 --- a/astune/task_reader/env_service_reader.py +++ b/astuner/task_reader/env_service_reader.py @@ -5,9 +5,9 @@ import datasets import torch -from astune.schema.task import Task -from astune.task_reader.task_reader_base import TaskReaderBase -from astune.utils.env_service_client.env_client_ng import EnvClient +from astuner.schema.task import Task +from astuner.task_reader.task_reader_base import TaskReaderBase +from astuner.utils.env_service_client.env_client_ng import EnvClient class TaskReaderEnvService(TaskReaderBase): diff --git a/astune/task_reader/hf_dataset_reader.py b/astuner/task_reader/hf_dataset_reader.py similarity index 96% rename from astune/task_reader/hf_dataset_reader.py rename to astuner/task_reader/hf_dataset_reader.py index 8e20e507..0841b3f1 100644 --- a/astune/task_reader/hf_dataset_reader.py +++ b/astuner/task_reader/hf_dataset_reader.py @@ -5,8 +5,8 @@ import datasets import torch -from astune.schema.task import Task -from astune.task_reader.task_reader_base import TaskReaderBase +from astuner.schema.task import Task +from astuner.task_reader.task_reader_base import TaskReaderBase class TaskReaderHuggingFace(TaskReaderBase): diff --git a/astune/task_reader/jsonl_reader.py b/astuner/task_reader/jsonl_reader.py similarity index 95% rename from astune/task_reader/jsonl_reader.py rename to astuner/task_reader/jsonl_reader.py index 0d1f3c31..90f9e8ec 100644 --- a/astune/task_reader/jsonl_reader.py +++ b/astuner/task_reader/jsonl_reader.py @@ -5,8 +5,8 @@ import datasets import torch -from astune.schema.task import Task -from astune.task_reader.task_reader_base import TaskReaderBase +from astuner.schema.task import Task +from astuner.task_reader.task_reader_base import TaskReaderBase class TaskReaderJsonl(TaskReaderBase): diff --git a/astune/task_reader/task_reader_base.py b/astuner/task_reader/task_reader_base.py similarity index 90% rename from astune/task_reader/task_reader_base.py rename to astuner/task_reader/task_reader_base.py index 569bb557..d7ba70a9 100644 --- a/astune/task_reader/task_reader_base.py +++ b/astuner/task_reader/task_reader_base.py @@ -5,7 +5,7 @@ import datasets import torch -from astune.schema.task import Task +from astuner.schema.task import Task class TaskReaderBase: diff --git a/astune/task_reader/tracing_reader/__init__.py b/astuner/task_reader/tracing_reader/__init__.py similarity index 96% rename from astune/task_reader/tracing_reader/__init__.py rename to astuner/task_reader/tracing_reader/__init__.py index 304f3213..dd16900d 100644 --- a/astune/task_reader/tracing_reader/__init__.py +++ b/astuner/task_reader/tracing_reader/__init__.py @@ -5,9 +5,9 @@ from loguru import logger -from astune.data_generator.filters.base import Filter -from astune.data_generator.filters.factory import build_filters -from astune.schema.task import Task +from astuner.data_generator.filters.base import Filter +from astuner.data_generator.filters.factory import build_filters +from astuner.schema.task import Task from ..task_reader_base import TaskReaderBase from .connector import LocalSqliteConnectorV1, PhoenixConnector diff --git a/astune/task_reader/tracing_reader/connector.py b/astuner/task_reader/tracing_reader/connector.py similarity index 99% rename from astune/task_reader/tracing_reader/connector.py rename to astuner/task_reader/tracing_reader/connector.py index 1d735624..bc63ae80 100644 --- a/astune/task_reader/tracing_reader/connector.py +++ b/astuner/task_reader/tracing_reader/connector.py @@ -10,7 +10,7 @@ import requests from loguru import logger -from astune.schema.task import Task +from astuner.schema.task import Task class TracingConnector(Protocol): diff --git a/astune/task_reader/tracing_reader/filters/__init__.py b/astuner/task_reader/tracing_reader/filters/__init__.py similarity index 100% rename from astune/task_reader/tracing_reader/filters/__init__.py rename to astuner/task_reader/tracing_reader/filters/__init__.py diff --git a/astune/data_generator/filters/base.py b/astuner/task_reader/tracing_reader/filters/base.py similarity index 88% rename from astune/data_generator/filters/base.py rename to astuner/task_reader/tracing_reader/filters/base.py index d51b6824..f72bae4c 100644 --- a/astune/data_generator/filters/base.py +++ b/astuner/task_reader/tracing_reader/filters/base.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from typing import Iterable, List -from astune.schema.task import Task +from astuner.schema.task import Task class Filter(ABC): diff --git a/astune/task_reader/tracing_reader/filters/factory.py b/astuner/task_reader/tracing_reader/filters/factory.py similarity index 100% rename from astune/task_reader/tracing_reader/filters/factory.py rename to astuner/task_reader/tracing_reader/filters/factory.py diff --git a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py similarity index 96% rename from astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py rename to astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 18adfadf..d4c1713a 100644 --- a/astune/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -1,7 +1,7 @@ from typing import Iterable, List -from astune.schema.task import Task -from astune.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn +from astuner.schema.task import Task +from astuner.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn from ..fn import Fn from .base import Filter diff --git a/astune/task_reader/tracing_reader/fn.py b/astuner/task_reader/tracing_reader/fn.py similarity index 100% rename from astune/task_reader/tracing_reader/fn.py rename to astuner/task_reader/tracing_reader/fn.py diff --git a/astune/task_reader/tracing_reader/llm_client.py b/astuner/task_reader/tracing_reader/llm_client.py similarity index 100% rename from astune/task_reader/tracing_reader/llm_client.py rename to astuner/task_reader/tracing_reader/llm_client.py diff --git a/astune/task_rollout/__init__.py b/astuner/task_rollout/__init__.py similarity index 100% rename from astune/task_rollout/__init__.py rename to astuner/task_rollout/__init__.py diff --git a/astune/task_rollout/async_llm_bridge.py b/astuner/task_rollout/async_llm_bridge.py similarity index 94% rename from astune/task_rollout/async_llm_bridge.py rename to astuner/task_rollout/async_llm_bridge.py index f1cb3dc8..6183a72f 100644 --- a/astune/task_rollout/async_llm_bridge.py +++ b/astuner/task_rollout/async_llm_bridge.py @@ -15,13 +15,13 @@ from transformers.tokenization_utils import PreTrainedTokenizer from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser -from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( +from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, ) -from astune.schema.logprob import TokenAndProb -from astune.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode -from astune.utils.tokenizer import astune_apply_chat_template -from astune.utils.utils import remove_fields, run_async_coro__no_matter_what +from astuner.schema.logprob import TokenAndProb +from astuner.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode +from astuner.utils.tokenizer import astune_apply_chat_template +from astuner.utils.utils import remove_fields, run_async_coro__no_matter_what class AsyncLlmBridge(object): @@ -75,13 +75,13 @@ def llm_chat( timeout=1800, ) - if self.config.astune.rollout.name == "vllm": + if self.config.astuner.rollout.name == "vllm": token_array = final_res.outputs[0].token_ids - elif self.config.astune.rollout.name == "sglang": + elif self.config.astuner.rollout.name == "sglang": token_array = final_res decoded_text = self.tokenizer.decode(token_array) # type: ignore - if self.config.astune.execute_test: + if self.config.astuner.execute_test: decoded_text = _mock_if_test_mode("mock_decoded_text", decoded_text, self.config) if decoded_text.endswith("<|im_end|>"): @@ -92,7 +92,7 @@ def llm_chat( if ( ("" in decoded_text) and ("" in decoded_text) - and (not self.config.astune.rollout.agentscope_disable_toolcalls) + and (not self.config.astuner.rollout.agentscope_disable_toolcalls) ): tool_parser = Hermes2ProToolParser(self.tokenizer) parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore @@ -147,7 +147,7 @@ def llm_chat_remote( input_messages = copy.deepcopy(messages) for i in range(self.max_llm_retries): try: - # this function is defined in `astune/main_vllm.py` + # this function is defined in `astuner/main_vllm.py` output_message = self.async_rollout_manager.submit_chat_completions( messages=input_messages, sampling_params=updated_sampling_params, @@ -274,7 +274,7 @@ async def __call__( logger.warning(f"[{info}] detected.") self.context_tracker.context_overflow = True if token_overflow: - # astune_action_when_overflow = self.config.astune.rollout.astune_action_when_overflow + # astune_action_when_overflow = self.config.astuner.rollout.astune_action_when_overflow # cannot proceed due to context overflow return ChatResponse( content=[ diff --git a/astune/task_rollout/dashscope_llm_bridge.py b/astuner/task_rollout/dashscope_llm_bridge.py similarity index 100% rename from astune/task_rollout/dashscope_llm_bridge.py rename to astuner/task_rollout/dashscope_llm_bridge.py diff --git a/astune/task_rollout/native_parallel_worker.py b/astuner/task_rollout/native_parallel_worker.py similarity index 97% rename from astune/task_rollout/native_parallel_worker.py rename to astuner/task_rollout/native_parallel_worker.py index 71a75e41..5a8b3b70 100644 --- a/astune/task_rollout/native_parallel_worker.py +++ b/astuner/task_rollout/native_parallel_worker.py @@ -15,10 +15,10 @@ from verl import DataProto from verl.utils.torch_functional import pad_sequence_to_length -from astune.context_tracker.basic_tracker import BasicContextTracker -from astune.schema.task import Task -from astune.schema.trajectory import Sample -from astune.task_rollout.single_worker import BaseParallelEnv +from astuner.context_tracker.basic_tracker import BasicContextTracker +from astuner.schema.task import Task +from astuner.schema.trajectory import Sample +from astuner.task_rollout.single_worker import BaseParallelEnv class StepPrinter(BaseParallelEnv): @@ -128,7 +128,7 @@ def rollout( if ( mode == "sample" and (self.rollout_n != 1) - and self.config.astune.rollout.enable_oversample + and self.config.astuner.rollout.enable_oversample ): return self.rollout_dynamic(tasks, mode, epoch) else: @@ -190,7 +190,7 @@ def rollout_dynamic( assert mode != "validate" rollout_n = self.rollout_n self.current_token_count_time = time.time() - submit_oversample_multiplier = self.config.astune.rollout.submit_oversample_multiplier + submit_oversample_multiplier = self.config.astuner.rollout.submit_oversample_multiplier rollout_n_oversample = int(rollout_n * submit_oversample_multiplier) rollout_n_confirm = int(rollout_n * (1 + submit_oversample_multiplier) / 2) assert ( @@ -415,14 +415,14 @@ def trajectories_to_samples(self, cmt_array: List[BasicContextTracker]) -> List[ finally: cmt.generate_log(global_step=self.current_global_steps) if os.environ.get("BEST_LOGGER_PATH", None) and os.environ.get( - "ASTUNE_DEBUG", None + "ASTUNER_DEBUG", None ): logger.success( f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]" ) sample_arr_final += sample_arr - if self.config.astune.backbone in ["verl"]: + if self.config.astuner.backbone in ["verl"]: world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes remainder = len(sample_arr_final) % world_size if remainder != 0: @@ -461,10 +461,10 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: task_ids.append(sample.task_id) rollout_ids.append(sample.task_tag) - if len(sample.prompt_ids) > self.config.astune.data.max_prompt_length: + if len(sample.prompt_ids) > self.config.astuner.data.max_prompt_length: raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") - if len(sample.response_ids) > self.config.astune.data.max_response_length: + if len(sample.response_ids) > self.config.astuner.data.max_response_length: raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") assert len(sample.prompt_ids) != 0 @@ -493,9 +493,9 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: step_reward_scores.append(sample.step_reward) max_prompt_length_this_batch = max([p.shape[-1] for p in prompt_ids]) - assert max_prompt_length_this_batch <= self.config.astune.data.max_prompt_length + assert max_prompt_length_this_batch <= self.config.astuner.data.max_prompt_length max_response_length_this_batch = max([p.shape[-1] for p in response_ids]) - assert max_response_length_this_batch <= self.config.astune.data.max_response_length + assert max_response_length_this_batch <= self.config.astuner.data.max_response_length prompt_ids = pad_sequence( prompt_ids, diff --git a/astune/task_rollout/resource_keeper.py b/astuner/task_rollout/resource_keeper.py similarity index 94% rename from astune/task_rollout/resource_keeper.py rename to astuner/task_rollout/resource_keeper.py index cb281406..8e656885 100644 --- a/astune/task_rollout/resource_keeper.py +++ b/astuner/task_rollout/resource_keeper.py @@ -4,8 +4,8 @@ from loguru import logger from omegaconf import DictConfig -from astune.schema.task import Task, WorkflowTask -from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astuner.schema.task import Task, WorkflowTask +from astuner.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg class ResourceKeeper(object): @@ -24,9 +24,9 @@ def __enter__(self): self.tokenizer = self.workflow_task.tokenizer self.llm_chat_fn = self.workflow_task.llm_chat_fn self.obs_window = self.workflow_task.obs_window - if self.config.astune.task_reader.type == "env_service": - url = self.config.astune.task_reader.env_service.env_url - env_type = self.config.astune.task_reader.env_service.env_type + if self.config.astuner.task_reader.type == "env_service": + url = self.config.astuner.task_reader.env_service.env_url + env_type = self.config.astuner.task_reader.env_service.env_type self.env = EnvClientNg(base_url=url) self.env_params = {} self.env_type: str = env_type @@ -73,7 +73,7 @@ def _initialize_environment_and_messages(self) -> List[dict]: Exception: If environment creation fails or required task data is missing """ - if self.config.astune.task_reader.type == "env_service": + if self.config.astuner.task_reader.type == "env_service": if self.env is None: raise ValueError("Environment client is None but env_service type is specified") try: diff --git a/astune/task_rollout/single_worker.py b/astuner/task_rollout/single_worker.py similarity index 84% rename from astune/task_rollout/single_worker.py rename to astuner/task_rollout/single_worker.py index 54c5b56b..c8864786 100644 --- a/astune/task_rollout/single_worker.py +++ b/astuner/task_rollout/single_worker.py @@ -10,16 +10,16 @@ from omegaconf import DictConfig from transformers.tokenization_utils import PreTrainedTokenizer -from astune.context_tracker.basic_tracker import BasicContextTracker, TrackerAttr -from astune.schema.task import Task, WorkflowTask -from astune.task_rollout.async_llm_bridge import AsyncLlmBridge -from astune.task_rollout.resource_keeper import ResourceKeeper -from astune.task_runner.agentscope_runner import AgentScopeRunner -from astune.task_runner.classic_runner import AgentRunner, BaseAgentRunner -from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg -from astune.utils.retry import retry_with_backoff -from astune.utils.sample import get_sample_params -from astune.utils.testing_utils import GoodbyeException, TestFailException +from astuner.context_tracker.basic_tracker import BasicContextTracker, TrackerAttr +from astuner.schema.task import Task, WorkflowTask +from astuner.task_rollout.async_llm_bridge import AsyncLlmBridge +from astuner.task_rollout.resource_keeper import ResourceKeeper +from astuner.task_runner.agentscope_runner import AgentScopeRunner +from astuner.task_runner.classic_runner import AgentRunner, BaseAgentRunner +from astuner.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astuner.utils.retry import retry_with_backoff +from astuner.utils.sample import get_sample_params +from astuner.utils.testing_utils import GoodbyeException, TestFailException class BaseParallelEnv: @@ -58,7 +58,7 @@ def __init__( self.async_rollout_manager = async_rollout_manager self.max_parallel: int = max_parallel self.max_llm_retries: int = max_llm_retries - self.rollout_n = config.astune.rollout.num_repeat + self.rollout_n = config.astuner.rollout.num_repeat self.tokenizer = tokenizer self.pad_token_id = self.tokenizer.pad_token_id self.current_token = 0 @@ -108,7 +108,7 @@ def rollout_env_worker( workflow_task = resource_keeper.prepare() Runner = ( AgentScopeRunner - if self.config.astune.rollout.use_agentscope_protocol + if self.config.astuner.rollout.use_agentscope_protocol else AgentRunner ) agent_runner: AgentScopeRunner = Runner( diff --git a/astune/task_runner/__init__.py b/astuner/task_runner/__init__.py similarity index 62% rename from astune/task_runner/__init__.py rename to astuner/task_runner/__init__.py index 394adb63..3d138fd0 100644 --- a/astune/task_runner/__init__.py +++ b/astuner/task_runner/__init__.py @@ -1,10 +1,10 @@ from typing import Any, Callable, Dict, Tuple, Union -from astune.context_tracker.basic_tracker import BasicContextTracker -from astune.task_judge.judge_base import JudgeBase -from astune.utils.dynamic_import import dynamic_import -from astune.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg -from astune.utils.utils import remove_fields, run_async_coro__no_matter_what +from astuner.context_tracker.basic_tracker import BasicContextTracker +from astuner.task_judge.judge_base import JudgeBase +from astuner.utils.dynamic_import import dynamic_import +from astuner.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astuner.utils.utils import remove_fields, run_async_coro__no_matter_what class BaseAgentRunner(object): @@ -16,9 +16,9 @@ def __init__(self, llm_chat_fn: Callable, tokenizer: Any, config, **kwargs): self.alien_llm_chat_fn: Union[Callable, None] = None self.llm_chat_fn: Callable = llm_chat_fn self.config = config - self.max_steps: int = self.config.astune.rollout.multi_turn.max_steps - self.max_model_len: int = self.config.astune.rollout.max_model_len - self.max_env_len: int = self.config.astune.rollout.max_env_len + self.max_steps: int = self.config.astuner.rollout.multi_turn.max_steps + self.max_model_len: int = self.config.astuner.rollout.max_model_len + self.max_env_len: int = self.config.astuner.rollout.max_env_len def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task): def should_interrupt_fn() -> bool: @@ -37,13 +37,13 @@ def generated_token_callback_fn(token_array): } def get_judge(self) -> JudgeBase: # type: ignore - if self.config.astune.task_judge.judge_type == "customized_protocal": - judge_protocol = self.config.astune.task_judge.judge_protocol + if self.config.astuner.task_judge.judge_type == "customized_protocal": + judge_protocol = self.config.astuner.task_judge.judge_protocol return dynamic_import(judge_protocol)(self.config) # type: ignore - elif self.config.astune.task_judge.judge_type == "rubrics_auto_grader": - # astune/task_judge/rm_auto_grader_judge.py - from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + elif self.config.astuner.task_judge.judge_type == "rubrics_auto_grader": + # astuner/task_judge/rm_auto_grader_judge.py + from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge judge = RMAutoGraderJudge(self.config) run_async_coro__no_matter_what(judge.load_rubrics_from_cache()) diff --git a/astune/task_runner/agentscope_runner.py b/astuner/task_runner/agentscope_runner.py similarity index 82% rename from astune/task_runner/agentscope_runner.py rename to astuner/task_runner/agentscope_runner.py index 6b139672..42d1e472 100644 --- a/astune/task_runner/agentscope_runner.py +++ b/astuner/task_runner/agentscope_runner.py @@ -6,20 +6,20 @@ import torch -from astune import ModelTuner, Workflow, WorkflowOutput -from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( +from astuner import ModelTuner, Workflow, WorkflowOutput +from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, ) -from astune.context_tracker.basic_tracker import ( +from astuner.context_tracker.basic_tracker import ( BasicContextTracker, ExtendedMessage, replace_token_ids, ) -from astune.schema.task import Task, WorkflowTask -from astune.schema.trajectory import Reward, Sample, Trajectory -from astune.task_runner import BaseAgentRunner -from astune.utils.dynamic_import import dynamic_import -from astune.utils.env_service_client.env_client import EnvClient +from astuner.schema.task import Task, WorkflowTask +from astuner.schema.trajectory import Reward, Sample, Trajectory +from astuner.task_runner import BaseAgentRunner +from astuner.utils.dynamic_import import dynamic_import +from astuner.utils.env_service_client.env_client import EnvClient class AgentScopeRunner(BaseAgentRunner): @@ -30,9 +30,9 @@ def execute(self, workflow_task: WorkflowTask) -> BasicContextTracker: task_tag = workflow_task.task_tag task_id = workflow_task.task_id - workflow_import = self.config.astune.rollout.agentscope_learn_protocol + workflow_import = self.config.astuner.rollout.agentscope_learn_protocol workflow_cls = dynamic_import(workflow_import) - agentscope_workflow: Workflow = workflow_cls(name="astune-trinity") + agentscope_workflow: Workflow = workflow_cls(name="astuner-trinity") hooks = self.agentscope_runner_hooks( obs_window=obs_window, diff --git a/astune/task_runner/classic_runner.py b/astuner/task_runner/classic_runner.py similarity index 86% rename from astune/task_runner/classic_runner.py rename to astuner/task_runner/classic_runner.py index 69aca14e..7b7a6719 100644 --- a/astune/task_runner/classic_runner.py +++ b/astuner/task_runner/classic_runner.py @@ -6,17 +6,17 @@ from beast_logger import print_listofdict from loguru import logger -from astune.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage -from astune.schema.trajectory import Reward -from astune.task_runner import BaseAgentRunner -from astune.utils.env_service_client.env_client import EnvClient -from astune.utils.utils import convert_tool_to_user_message +from astuner.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage +from astuner.schema.trajectory import Reward +from astuner.task_runner import BaseAgentRunner +from astuner.utils.env_service_client.env_client import EnvClient +from astuner.utils.utils import convert_tool_to_user_message class AgentRunner(BaseAgentRunner): def __init__(self, **kwargs): super().__init__(**kwargs) - self.use_step_reward_from_env: bool = self.config.astune.rollout.get( + self.use_step_reward_from_env: bool = self.config.astuner.rollout.get( "use_step_reward_from_env", False ) self.step_reward = [] @@ -28,23 +28,23 @@ def execute(self, workflow_task) -> BasicContextTracker: env = workflow_task.gym_env # 1. 🚀 Initialize messages - if self.config.astune.context_tracker.context_tracker_type == "linear": + if self.config.astuner.context_tracker.context_tracker_type == "linear": self.cmt = BasicContextTracker(self.config, self.tokenizer) - # elif self.config.astune.context_tracker.context_tracker_type == "linear_think": + # elif self.config.astuner.context_tracker.context_tracker_type == "linear_think": # self.cmt = LinearThinkCMT(self.config, self.tokenizer) - # elif self.config.astune.context_tracker.context_tracker_type == "context_selfclip": + # elif self.config.astuner.context_tracker.context_tracker_type == "context_selfclip": # self.cmt = SelfContextClipCMT(self.config, self.tokenizer, self.llm_chat_fn) - # elif self.config.astune.context_tracker.context_tracker_type == "sliding_window": + # elif self.config.astuner.context_tracker.context_tracker_type == "sliding_window": # self.cmt = SlidingWindowCMT(self.config, self.tokenizer, self.llm_chat_fn) else: raise ValueError( - f"Unsupported context template: {self.config.astune.context_tracker.context_tracker_type}" + f"Unsupported context template: {self.config.astuner.context_tracker.context_tracker_type}" ) assert not ( - self.config.astune.rollout.force_think and self.config.astune.rollout.force_no_think + self.config.astuner.rollout.force_think and self.config.astuner.rollout.force_no_think ), "Cannot force both think and no_think" - add_nothink = self.config.astune.rollout.force_no_think + add_nothink = self.config.astuner.rollout.force_no_think self.cmt.save_init_input(init_messages, add_nothink) @@ -100,7 +100,7 @@ def execute(self, workflow_task) -> BasicContextTracker: "content": self.cmt.prepare_world_interaction(), "role": "assistant", }, - params={"step_skip_action": self.config.astune.rollout.step_skip_action}, + params={"step_skip_action": self.config.astuner.rollout.step_skip_action}, ) if env_output["state"]["role"] == "tool": env_output["state"] = convert_tool_to_user_message( @@ -145,12 +145,12 @@ def execute(self, workflow_task) -> BasicContextTracker: else: success_rate = 0.0 if not self.use_step_reward_from_env: - if self.config.astune.rollout.add_special_success_reward: + if self.config.astuner.rollout.add_special_success_reward: if success_rate == 1: raw_reward = 1.0 + raw_reward * 0.5 else: raw_reward = 0.0 + raw_reward * 0.5 - if self.config.astune.rollout.binary_reward: + if self.config.astuner.rollout.binary_reward: raw_reward = success_rate self.cmt.process_reward( reward_structure=Reward( diff --git a/astune/tuner.py b/astuner/tuner.py similarity index 96% rename from astune/tuner.py rename to astuner/tuner.py index 22805d13..80366a42 100644 --- a/astune/tuner.py +++ b/astuner/tuner.py @@ -8,13 +8,13 @@ from loguru import logger from pydantic import BaseModel, Field -from astune.context_tracker.agentscope_tracker.multiagent_tracking import ( +from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, ) -from astune.task_rollout.async_llm_bridge import LlmProxyForAgentScope +from astuner.task_rollout.async_llm_bridge import LlmProxyForAgentScope if TYPE_CHECKING: - from astune import Workflow + from astuner import Workflow class Agent2Proxy(DashScopeChatModel): @@ -29,7 +29,7 @@ def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase) self.tuner = tuner self.default_model = default_model super().__init__( - model_name="astune", + model_name="astuner", api_key="dummy-api-key", stream=False, ) @@ -66,7 +66,7 @@ def __init__( context_tracker=context_tracker, config=config, **kwargs ) super().__init__( - model_name="astune", + model_name="astuner", api_key="dummy-api-key", stream=False, ) diff --git a/astune/utils/__init__.py b/astuner/utils/__init__.py similarity index 100% rename from astune/utils/__init__.py rename to astuner/utils/__init__.py diff --git a/astune/utils/analysis_time_cost.py b/astuner/utils/analysis_time_cost.py similarity index 100% rename from astune/utils/analysis_time_cost.py rename to astuner/utils/analysis_time_cost.py diff --git a/astune/utils/async_http_client.py b/astuner/utils/async_http_client.py similarity index 100% rename from astune/utils/async_http_client.py rename to astuner/utils/async_http_client.py diff --git a/astune/utils/cleaner.py b/astuner/utils/cleaner.py similarity index 100% rename from astune/utils/cleaner.py rename to astuner/utils/cleaner.py diff --git a/astune/utils/color_hsl.py b/astuner/utils/color_hsl.py similarity index 100% rename from astune/utils/color_hsl.py rename to astuner/utils/color_hsl.py diff --git a/astune/utils/compute_madness.py b/astuner/utils/compute_madness.py similarity index 100% rename from astune/utils/compute_madness.py rename to astuner/utils/compute_madness.py diff --git a/astune/utils/config_utils.py b/astuner/utils/config_utils.py similarity index 94% rename from astune/utils/config_utils.py rename to astuner/utils/config_utils.py index 66412227..ea92ffc1 100644 --- a/astune/utils/config_utils.py +++ b/astuner/utils/config_utils.py @@ -125,25 +125,25 @@ def read_astune_hierarchical_config( ): with open(yaml_fp, "r") as file: config = yaml.safe_load(file) - config["astune"]["experiment_name"] = exp_name - config["astune"]["experiment_dir"] = os.path.join(exp_dir, exp_name) - config["astune"]["backbone"] = backbone + config["astuner"]["experiment_name"] = exp_name + config["astuner"]["experiment_dir"] = os.path.join(exp_dir, exp_name) + config["astuner"]["backbone"] = backbone # remove extra config of verl for trinity if backbone == "debug": config["defaults"].remove("ppo_trainer") config["defaults"].remove("trinity_default") - config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") + config["hydra"]["searchpath"].remove("file://astuner/default_config/trinity") config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") # remove extra config of verl for trinity if backbone == "trinity": config["defaults"].remove("ppo_trainer") config["defaults"].remove("verl_default") config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") - config["hydra"]["searchpath"].remove("file://astune/default_config/verl") + config["hydra"]["searchpath"].remove("file://astuner/default_config/verl") # remove extra config of trinity for verl if backbone == "verl": # or args.backbone == "debug" config["defaults"].remove("trinity_default") - config["hydra"]["searchpath"].remove("file://astune/default_config/trinity") + config["hydra"]["searchpath"].remove("file://astuner/default_config/trinity") if write_to: with open(write_to, "w") as file: yaml.dump(config, file) @@ -195,7 +195,7 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): ## 0. read yaml & get experiment_name with open(yaml_path, "r") as file: config = yaml.safe_load(file) - exp_name = config.get("astune").get("experiment_name") + exp_name = config.get("astuner").get("experiment_name") if exp_name is None or exp_name == "read_yaml_name": if exp_name is not None: exp_name = exp_name.replace("|", "-") diff --git a/astune/utils/core_env_vars.py b/astuner/utils/core_env_vars.py similarity index 88% rename from astune/utils/core_env_vars.py rename to astuner/utils/core_env_vars.py index 3ee92068..51614639 100644 --- a/astune/utils/core_env_vars.py +++ b/astuner/utils/core_env_vars.py @@ -16,7 +16,7 @@ def get_runtime_env(is_trinity: bool = False) -> dict: "TOKENIZERS_PARALLELISM": "true", "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), - "ASTUNE_CONFIG_REDIRECT": os.getenv("ASTUNE_CONFIG_REDIRECT", ""), + "ASTUNER_CONFIG_REDIRECT": os.getenv("ASTUNER_CONFIG_REDIRECT", ""), } } if os.getenv("RAY_record_task_actor_creation_sites"): @@ -35,7 +35,7 @@ def get_runtime_env(is_trinity: bool = False) -> dict: ) if is_trinity: - assert "ASTUNE_CONFIG_REDIRECT" in runtime_env["env_vars"] + assert "ASTUNER_CONFIG_REDIRECT" in runtime_env["env_vars"] print_dict(runtime_env["env_vars"], "runtime_env") return runtime_env diff --git a/astune/utils/dynamic_import.py b/astuner/utils/dynamic_import.py similarity index 100% rename from astune/utils/dynamic_import.py rename to astuner/utils/dynamic_import.py diff --git a/astune/utils/env_service_client/__init__.py b/astuner/utils/env_service_client/__init__.py similarity index 100% rename from astune/utils/env_service_client/__init__.py rename to astuner/utils/env_service_client/__init__.py diff --git a/astune/utils/env_service_client/em_client.py b/astuner/utils/env_service_client/em_client.py similarity index 96% rename from astune/utils/env_service_client/em_client.py rename to astuner/utils/env_service_client/em_client.py index e1de176d..b0909662 100644 --- a/astune/utils/env_service_client/em_client.py +++ b/astuner/utils/env_service_client/em_client.py @@ -5,8 +5,8 @@ from loguru import logger from pydantic import Field -from astune.schema.trajectory import Reward, Trajectory -from astune.utils.http_client import HttpClient +from astuner.schema.trajectory import Reward, Trajectory +from astuner.utils.http_client import HttpClient class EMClient(HttpClient): diff --git a/astune/utils/env_service_client/env_client.py b/astuner/utils/env_service_client/env_client.py similarity index 100% rename from astune/utils/env_service_client/env_client.py rename to astuner/utils/env_service_client/env_client.py diff --git a/astune/utils/env_service_client/env_client_ng.py b/astuner/utils/env_service_client/env_client_ng.py similarity index 100% rename from astune/utils/env_service_client/env_client_ng.py rename to astuner/utils/env_service_client/env_client_ng.py diff --git a/astune/utils/fn.py b/astuner/utils/fn.py similarity index 100% rename from astune/utils/fn.py rename to astuner/utils/fn.py diff --git a/astune/utils/http_client.py b/astuner/utils/http_client.py similarity index 100% rename from astune/utils/http_client.py rename to astuner/utils/http_client.py diff --git a/astune/utils/launch_utils.py b/astuner/utils/launch_utils.py similarity index 90% rename from astune/utils/launch_utils.py rename to astuner/utils/launch_utils.py index 3970e557..f88bae33 100644 --- a/astune/utils/launch_utils.py +++ b/astuner/utils/launch_utils.py @@ -9,8 +9,8 @@ from beast_logger import print_dict from loguru import logger -from astune.utils.config_utils import align_parameters -from astune.utils.smart_daemon import LaunchCommandWhenAbsent +from astuner.utils.config_utils import align_parameters +from astuner.utils.smart_daemon import LaunchCommandWhenAbsent def launch_logview(exp_name=None): @@ -89,11 +89,11 @@ def execute_training_process( """ # Fixed config asset locations - TRINITY_BOOT_YAML = "astune/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED + TRINITY_BOOT_YAML = "astuner/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED TRINITY_CONFIG_AUTO_CONVERSION = ( - "astune/default_config/trinity/config_auto_convertion_trinity.json" + "astuner/default_config/trinity/config_auto_convertion_trinity.json" ) - VERL_CONFIG_AUTO_CONVERSION = "astune/default_config/verl/config_auto_convertion_verl.json" + VERL_CONFIG_AUTO_CONVERSION = "astuner/default_config/verl/config_auto_convertion_verl.json" # let's begin the training process if args.backbone == "trinity": diff --git a/astune/utils/logger.py b/astuner/utils/logger.py similarity index 100% rename from astune/utils/logger.py rename to astuner/utils/logger.py diff --git a/astune/utils/markdown_parser.py b/astuner/utils/markdown_parser.py similarity index 100% rename from astune/utils/markdown_parser.py rename to astuner/utils/markdown_parser.py diff --git a/astune/utils/message.py b/astuner/utils/message.py similarity index 100% rename from astune/utils/message.py rename to astuner/utils/message.py diff --git a/astune/utils/model_merger.py b/astuner/utils/model_merger.py similarity index 100% rename from astune/utils/model_merger.py rename to astuner/utils/model_merger.py diff --git a/astune/utils/n_gram.py b/astuner/utils/n_gram.py similarity index 100% rename from astune/utils/n_gram.py rename to astuner/utils/n_gram.py diff --git a/astune/utils/process_dataset.py b/astuner/utils/process_dataset.py similarity index 100% rename from astune/utils/process_dataset.py rename to astuner/utils/process_dataset.py diff --git a/astune/utils/process_manager.py b/astuner/utils/process_manager.py similarity index 100% rename from astune/utils/process_manager.py rename to astuner/utils/process_manager.py diff --git a/astune/utils/pty.py b/astuner/utils/pty.py similarity index 98% rename from astune/utils/pty.py rename to astuner/utils/pty.py index 6b10696d..18ad9c1b 100644 --- a/astune/utils/pty.py +++ b/astuner/utils/pty.py @@ -96,7 +96,7 @@ def pty_wrapper_final(human_cmd, dir, env_dict): def pty_launch(service_name: str, success_std_string="Starting server on"): - from astune.utils.smart_daemon import LaunchCommandWhenAbsent + from astuner.utils.smart_daemon import LaunchCommandWhenAbsent service_path = os.environ.get(f"{service_name.upper()}_PATH") service_script = os.environ.get(f"{service_name.upper()}_SCRIPT") diff --git a/astune/utils/retry.py b/astuner/utils/retry.py similarity index 96% rename from astune/utils/retry.py rename to astuner/utils/retry.py index 2c8b3e82..a0b62618 100644 --- a/astune/utils/retry.py +++ b/astuner/utils/retry.py @@ -4,7 +4,7 @@ from loguru import logger -from astune.utils.testing_utils import GoodbyeException, TestFailException +from astuner.utils.testing_utils import GoodbyeException, TestFailException T = TypeVar("T") diff --git a/astune/utils/robust_dashscope.py b/astuner/utils/robust_dashscope.py similarity index 100% rename from astune/utils/robust_dashscope.py rename to astuner/utils/robust_dashscope.py diff --git a/astuner/utils/sample.py b/astuner/utils/sample.py new file mode 100644 index 00000000..5319b072 --- /dev/null +++ b/astuner/utils/sample.py @@ -0,0 +1,25 @@ +def get_sample_params(mode, config): + response_length_eps = ( + 16 # Reserve a few tokens for later handling of special tokens like lm_start. + ) + if config.astuner.rollout.name == "vllm": + sampling_params = dict( + n=1, + max_tokens=config.astuner.rollout.max_response_length_in_one_turn - response_length_eps, + min_tokens=1, # Must output at least 1 token. + temperature=config.astuner.rollout.temperature, + top_p=config.astuner.rollout.top_p, + ) + else: + sampling_params = dict( + n=1, + max_new_tokens=config.astuner.rollout.max_response_length_in_one_turn, + temperature=config.astuner.rollout.temperature, + top_p=config.astuner.rollout.top_p, + ) + + if mode == "validate": + sampling_params["temperature"] = config.astuner.rollout.val_kwargs.temperature + sampling_params["top_k"] = config.astuner.rollout.val_kwargs.top_k + sampling_params["top_p"] = config.astuner.rollout.val_kwargs.top_p + return sampling_params diff --git a/astune/utils/smart_daemon.py b/astuner/utils/smart_daemon.py similarity index 99% rename from astune/utils/smart_daemon.py rename to astuner/utils/smart_daemon.py index 31d9d789..8285337f 100644 --- a/astune/utils/smart_daemon.py +++ b/astuner/utils/smart_daemon.py @@ -247,7 +247,7 @@ def string_to_base64(s): converted_cmd = [ sys.executable, "-m", - "astune.utils.pty", + "astuner.utils.pty", "--human-cmd", f"'{string_to_base64(self.cmd[0])}'", "--dir", diff --git a/astune/utils/sms_agent.py b/astuner/utils/sms_agent.py similarity index 100% rename from astune/utils/sms_agent.py rename to astuner/utils/sms_agent.py diff --git a/astune/utils/testing_utils.py b/astuner/utils/testing_utils.py similarity index 54% rename from astune/utils/testing_utils.py rename to astuner/utils/testing_utils.py index f3602d78..8e053977 100644 --- a/astune/utils/testing_utils.py +++ b/astuner/utils/testing_utils.py @@ -1,4 +1,4 @@ -from astune.utils.dynamic_import import dynamic_import +from astuner.utils.dynamic_import import dynamic_import def get_test_lambda(test_name): @@ -8,20 +8,20 @@ def get_test_lambda(test_name): def _test_if_test_mode(key, value, config): - if not config.astune.execute_test: + if not config.astuner.execute_test: return - if config.astune.execute_test == "do_not_test": + if config.astuner.execute_test == "do_not_test": return - test_lambda = get_test_lambda(config.astune.execute_testing_lambda) + test_lambda = get_test_lambda(config.astuner.execute_testing_lambda) return test_lambda(key, value) def _mock_if_test_mode(key, value, config): - if not config.astune.execute_test: + if not config.astuner.execute_test: return value - if config.astune.execute_test == "do_not_test": + if config.astuner.execute_test == "do_not_test": return value - test_lambda = get_test_lambda(config.astune.execute_testing_lambda) + test_lambda = get_test_lambda(config.astuner.execute_testing_lambda) return test_lambda.mock(key) diff --git a/astune/utils/tokenizer.py b/astuner/utils/tokenizer.py similarity index 100% rename from astune/utils/tokenizer.py rename to astuner/utils/tokenizer.py diff --git a/astune/utils/utils.py b/astuner/utils/utils.py similarity index 100% rename from astune/utils/utils.py rename to astuner/utils/utils.py diff --git a/astune/workflow.py b/astuner/workflow.py similarity index 98% rename from astune/workflow.py rename to astuner/workflow.py index b3175069..db00e3bd 100644 --- a/astune/workflow.py +++ b/astuner/workflow.py @@ -2,8 +2,8 @@ from pydantic import BaseModel, Field -from astune import ModelTuner -from astune.schema.task import WorkflowOutput, WorkflowTask +from astuner import ModelTuner +from astuner.schema.task import WorkflowOutput, WorkflowTask class Workflow(BaseModel): diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 3332d278..3053a020 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -38,9 +38,9 @@ We recommend using `uv` for dependency management, though `conda` is also suppor 1. Clone the repository and Trinity module: ```bash - git clone https://github.com/..../agentscope-tuner.git astune - git clone https://github.com/binary-husky/Trinity-RFT astune/external/trinity - cd astune + git clone https://github.com/..../agentscope-tuner.git astuner + git clone https://github.com/binary-husky/Trinity-RFT astuner/external/trinity + cd astuner ``` 2. Install the Trinity training backbone: @@ -78,36 +78,36 @@ Explore our rich library of examples to kickstart your journey: ### Architecture -1. **Task Reader** (config field: `astune.task_reader`) - - `astune/task_reader/task_reader_base.py` +1. **Task Reader** (config field: `astuner.task_reader`) + - `astuner/task_reader/task_reader_base.py` - `TaskReaderEnvService` - `TaskReaderJsonl` - `TaskReaderHuggingFace` -2. **Workflow Definition** (config field: `astune.rollout.agentscope_learn_protocol`) +2. **Workflow Definition** (config field: `astuner.rollout.agentscope_learn_protocol`) - `tutorial/appworld.py` - `tutorial/math_agent.py` -3. **Reward Function** (config field: `astune.task_judge.judge_protocol`) - - `astune/task_judge/judge_base.py` - - `astune/task_judge/env_service_as_judge.py` +3. **Reward Function** (config field: `astuner.task_judge.judge_protocol`) + - `astuner/task_judge/judge_base.py` + - `astuner/task_judge/env_service_as_judge.py` - `EnvServiceJudge` - - `astune/task_judge/math_answer_as_judge.py` + - `astuner/task_judge/math_answer_as_judge.py` - `MathAnswerAsJudge` - `MathAnswerAndLlmAsJudge` -4. **Model Specification** (config field: `astune.model.path`) +4. **Model Specification** (config field: `astuner.model.path`) 5. **Configuration System** (under improvement) - Default Configurations: - - `astune/default_config/default.yaml` (default VERL training config, overridden by `--conf` YAML) - - `astune/default_config/trinity_default.yaml` (default Trinity config, overridden via `trinity.xxx` in `--conf` YAML) + - `astuner/default_config/default.yaml` (default VERL training config, overridden by `--conf` YAML) + - `astuner/default_config/trinity_default.yaml` (default Trinity config, overridden via `trinity.xxx` in `--conf` YAML) - Auto-Alignment: - - `astune/default_config/config_auto_convertion_verl.json` - - `astune/default_config/config_auto_convertion_trinity.json` + - `astuner/default_config/config_auto_convertion_verl.json` + - `astuner/default_config/config_auto_convertion_trinity.json` 6. **ASTune & AgentScope Interaction System V0.5** - - Managed by `astune/context_tracker/agentscope.py`: + - Managed by `astuner/context_tracker/agentscope.py`: - Processes tokens generated by AgentScope - Caches data required for judging (e.g., dialogue messages, env_service handles, task metadata) - Bridges LLM interactions diff --git a/launcher.py b/launcher.py index 87edfb0d..581d8218 100644 --- a/launcher.py +++ b/launcher.py @@ -9,15 +9,15 @@ from dotenv import load_dotenv from loguru import logger -from astune.utils.cleaner import fast_kill_by_keyword_bash -from astune.utils.config_utils import prepare_experiment_config -from astune.utils.launch_utils import ( +from astuner.utils.cleaner import fast_kill_by_keyword_bash +from astuner.utils.config_utils import prepare_experiment_config +from astuner.utils.launch_utils import ( execute_training_process, launch_logview, start_ray_service, ) -from astune.utils.pty import pty_launch -from astune.utils.smart_daemon import LaunchCommandWhenAbsent +from astuner.utils.pty import pty_launch +from astuner.utils.smart_daemon import LaunchCommandWhenAbsent load_dotenv() @@ -199,18 +199,18 @@ def main(): return # Exit after killing processes # Initialize variables with default values to avoid "possibly unbound" errors - backbone_target = "astune.main_trinity" # Default to trinity + backbone_target = "astuner.main_trinity" # Default to trinity main_yaml_fp = None exe_exp_base = None exp_name = None env = os.environ.copy() if args.backbone == "verl": - backbone_target = "astune.main_verl" + backbone_target = "astuner.main_verl" if args.backbone == "debug": - backbone_target = "astune.main_vllm" + backbone_target = "astuner.main_vllm" if args.backbone == "trinity": - backbone_target = "astune.main_trinity" + backbone_target = "astuner.main_trinity" exp_config = None exp_dir = args.exp_dir or "launcher_record" @@ -227,17 +227,17 @@ def main(): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.debug env["RAY_record_task_actor_creation_sites"] = "true" - assert exp_config["astune"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore + assert exp_config["astuner"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") if args.conf: - assert exp_config["astune"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore + assert exp_config["astuner"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": - env["ASTUNE_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore + env["ASTUNER_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore if args.backbone == "debug": - env["ASTUNE_DEBUG"] = "1" # type: ignore + env["ASTUNER_DEBUG"] = "1" # type: ignore if args.with_ray: start_ray_service(args, env) @@ -264,7 +264,7 @@ def main(): "yaml": main_yaml_fp, "exp_base": exe_exp_base, "exp_yaml_name": os.path.basename(main_yaml_fp), - "exp_name": exp_config.get("astune", {}).get("experiment_name"), + "exp_name": exp_config.get("astuner", {}).get("experiment_name"), } else: execute_training_process( diff --git a/pyproject.toml b/pyproject.toml index 4b68ec09..4024310d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,7 +53,7 @@ doc = [ [tool.setuptools.packages.find] where = ["."] -include = ["astune*"] +include = ["astuner*"] exclude = ["tests*", "docs*", "scripts*"] [tool.setuptools.package-data] diff --git a/pyrightconfig.json b/pyrightconfig.json index 27f13aba..486f9ab2 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -1,7 +1,7 @@ { "logLevel": "Debug", "include": [ - "astune/**/*.py", + "astuner/**/*.py", "external/trinity/**/*.py", "external/verl/**/*.py", ".venv/lib/python3.10/site-packages/**/*.py" diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py index 51e31100..d49350a0 100644 --- a/scripts/deploy_model.py +++ b/scripts/deploy_model.py @@ -5,7 +5,7 @@ import torch sys.path.append(os.getcwd()) -from astune.utils.smart_daemon import LaunchCommandWhenAbsent +from astuner.utils.smart_daemon import LaunchCommandWhenAbsent parser = argparse.ArgumentParser(description="deploy Hugging Face model") parser.add_argument( @@ -30,9 +30,9 @@ def companion_launch(): tensor_parallel_size = n_avail_gpus gpu_memory_utilization = 0.95 # max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs - # max_model_len = config.astune.rollout.max_model_len - # seed = config.astune.debug.debug_vllm_seed - # vllm_port = config.astune.debug.debug_vllm_port + # max_model_len = config.astuner.rollout.max_model_len + # seed = config.astuner.debug.debug_vllm_seed + # vllm_port = config.astuner.debug.debug_vllm_port vllm_port = args.port companion = LaunchCommandWhenAbsent( full_argument_list=[ diff --git a/scripts/tar_and_copy.sh b/scripts/tar_and_copy.sh index 7fb3231d..e5e67868 100755 --- a/scripts/tar_and_copy.sh +++ b/scripts/tar_and_copy.sh @@ -1,4 +1,4 @@ cd ../ -gtar -cvzf ASTune.tar.gz ASTune -#scp ASTune.tar.gz jinli.yl@11.160.132.45:/home/jinli.yl/jinli_mnt2/workspace/ -scp -P 1016 ASTune.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ +gtar -cvzf astuner.tar.gz ASTune +#scp astuner.tar.gz jinli.yl@11.160.132.45:/home/jinli.yl/jinli_mnt2/workspace/ +scp -P 1016 astuner.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ diff --git a/scripts/untar.sh b/scripts/untar.sh index 9ca67474..c2fa9091 100644 --- a/scripts/untar.sh +++ b/scripts/untar.sh @@ -1 +1 @@ -rm -rf ASTune && tar -xzvf ASTune.tar.gz +rm -rf ASTune && tar -xzvf astuner.tar.gz diff --git a/setup.py b/setup.py index c3e1899f..2b7027e5 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages, setup setup( - name="astune", # Change this to your package name + name="astuner", # Change this to your package name version="0.1.0", packages=find_packages(), ) diff --git a/tests/config_test.py b/tests/config_test.py index 0d841a67..1636259b 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -1,6 +1,6 @@ import unittest -from astune.utils.config_utils import prepare_experiment_config +from astuner.utils.config_utils import prepare_experiment_config class TestConfigUtils(unittest.TestCase): @@ -12,9 +12,9 @@ def test_load_config(self): self.assertEqual(exp_name, "sample") self.assertEqual(exp_base, "tests/temp/sample") self.assertEqual(yaml_backup_dst, "tests/temp/sample/yaml_backup.yaml") - self.assertIn("astune", config) - self.assertIn("project_name", config["astune"]) - self.assertEqual(config["astune"]["project_name"], "unittest") - self.assertIn("experiment_name", config["astune"]) - self.assertEqual(config["astune"]["experiment_name"], "sample") - self.assertIn("task_reader", config["astune"]) + self.assertIn("astuner", config) + self.assertIn("project_name", config["astuner"]) + self.assertEqual(config["astuner"]["project_name"], "unittest") + self.assertIn("experiment_name", config["astuner"]) + self.assertEqual(config["astuner"]["experiment_name"], "sample") + self.assertIn("task_reader", config["astuner"]) diff --git a/tests/data/config.yaml b/tests/data/config.yaml index 9691fdab..b342e686 100644 --- a/tests/data/config.yaml +++ b/tests/data/config.yaml @@ -1,4 +1,4 @@ -astune: +astuner project_name: unittest experiment_name: sample task_reader: @@ -9,7 +9,7 @@ astune: validation_split: "test" task_judge: - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge model: path: "" @@ -43,10 +43,10 @@ astune: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only + - file://astuner/default_config + - file://astuner/default_config/verl # verl only - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only + - file://astuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/data_gen.py b/tests/data_gen.py index 65cb7d7e..931e3b7e 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -8,11 +8,11 @@ from loguru import logger from tqdm import tqdm -from astune.data_generator.knowledge_augmentation import KnowledgeAugmentor -from astune.data_generator.task_augmentation import TaskAugmentor -from astune.task_reader import TaskReaderRouterV2 -from astune.task_reader.document_reader.doc_reader import DocReader -from astune.utils.config_utils import read_astune_config +from astuner.data_generator.knowledge_augmentation import KnowledgeAugmentor +from astuner.data_generator.task_augmentation import TaskAugmentor +from astuner.task_reader import TaskReaderRouterV2 +from astuner.task_reader.document_reader.doc_reader import DocReader +from astuner.utils.config_utils import read_astune_config class TestConfigUtils(unittest.TestCase): @@ -21,8 +21,8 @@ def test_data_gen_main(self): config = read_astune_config("tests/data_gen.yaml") task_reader = TaskReaderRouterV2( - reader_type=config.astune.data_generator.reader.type, - reader_config=config.astune.data_generator.reader, + reader_type=config.astuner.data_generator.reader.type, + reader_config=config.astuner.data_generator.reader, ) Tasks = task_reader.get_training_tasks() Tasks = Tasks[:5] diff --git a/tests/data_gen.yaml b/tests/data_gen.yaml index 96b2847e..c74118b5 100644 --- a/tests/data_gen.yaml +++ b/tests/data_gen.yaml @@ -1,4 +1,4 @@ -astune: +astuner document_reader: document_path: 'dataset/document/Anti-Money Laundering and Counter-Terrorist Financing Ordinance.pdf' languages: diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index 19fcdafb..4416286a 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -4,8 +4,8 @@ import pytest -from astune.schema.task import Task -from astune.task_reader.tracing_reader import TracingReader +from astuner.schema.task import Task +from astuner.task_reader.tracing_reader import TracingReader class DummyConnector: diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 4db6276a..2339c855 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -23,7 +23,7 @@ agent = ReActAgent( print_hint_msg=False, ) -for _ in range(config.astune.rollout.multi_turn.max_steps): +for _ in range(config.astuner.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol @@ -42,7 +42,7 @@ for _ in range(config.astune.rollout.multi_turn.max_steps): ### 3. 准备Judge (奖励模块) -在 `astune/task_judge/env_service_as_judge.py` 中,我们直接向 env_service 发送http请求,读取奖励。 +在 `astuner/task_judge/env_service_as_judge.py` 中,我们直接向 env_service 发送http请求,读取奖励。 Judge的返回值: raw_reward, is_success @@ -52,21 +52,21 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_appworld/appworld.yaml](../tutorial/example_appworld/appworld.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 -1. 读取task(对应配置字段 astune.task_reader) -2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +1. 读取task(对应配置字段 astuner.task_reader) +2. 定义 Workflow(对应配置字段 astuner.rollout.agentscope_learn_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/appworld.py` 的`ExampleAgentScopeLearnProtocol` 类 - - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol` -3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) - - 填写 astune.task_judge.judge_protocol=`astune.task_judge.env_service_as_judge->EnvServiceJudge` -4. 指定模型(对应配置字段 astune.model.path ) + - 则填写 astuner.rollout.agentscope_learn_protocol=`tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol` +3. 定义评分函数(对应配置字段 astuner.task_judge.judge_protocol ) + - 填写 astuner.task_judge.judge_protocol=`astuner.task_judge.env_service_as_judge->EnvServiceJudge` +4. 指定模型(对应配置字段 astuner.model.path ) ```yaml -astune: +astuner project_name: appworld_astune experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -135,9 +135,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astune/astune/launcher_record - - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name - - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py index 004d893e..b16d8c6a 100644 --- a/tutorial/example_appworld/appworld.py +++ b/tutorial/example_appworld/appworld.py @@ -1,11 +1,11 @@ from agentscope.message import Msg from pydantic import Field -from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask class ExampleAgentScopeLearnProtocol(Workflow): - trainer: str = Field(default="astune-trinity") + trainer: str = Field(default="astuner-trinity") async def agentscope_execute( self, workflow_task: WorkflowTask, model_tuner: ModelTuner @@ -41,7 +41,7 @@ async def agentscope_execute( agent.set_console_output_enabled(False) env = workflow_task.gym_env step = 0 - for step in range(model_tuner.config.astune.rollout.multi_turn.max_steps): + for step in range(model_tuner.config.astuner.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 5ef27c8c..11790503 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -1,10 +1,10 @@ # ------------------ 主要配置 ------------------ -astune: +astuner project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -47,10 +47,10 @@ astune: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only + - file://astuner/default_config + - file://astuner/default_config/verl # verl only - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only + - file://astuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_appworld/appworld_2nodes.yaml b/tutorial/example_appworld/appworld_2nodes.yaml index 79fc55fc..d8268d1e 100644 --- a/tutorial/example_appworld/appworld_2nodes.yaml +++ b/tutorial/example_appworld/appworld_2nodes.yaml @@ -1,10 +1,10 @@ # ------------------ 主要配置 ------------------ -astune: +astuner project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -49,10 +49,10 @@ astune: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only + - file://astuner/default_config + - file://astuner/default_config/verl # verl only - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only + - file://astuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index c9d09605..7b6eec7e 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astune: +astuner project_name: example_feedback_training task_reader: type: tracing @@ -21,7 +21,7 @@ astune: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -57,10 +57,10 @@ trainer: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only + - file://astuner/default_config + - file://astuner/default_config/verl # verl only - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only + - file://astuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_feedback_tracing/train.py b/tutorial/example_feedback_tracing/train.py index 19aa0889..57f8341c 100644 --- a/tutorial/example_feedback_tracing/train.py +++ b/tutorial/example_feedback_tracing/train.py @@ -10,7 +10,7 @@ from loguru import logger from pydantic import BaseModel, Field -from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask SYSTEM_PROMPT = """ You are an agent specialized in solving math problems with tools. diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index 5099e748..7187e89f 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -63,7 +63,7 @@ astune_proxy.update_judge_input_dictionary(final_answer=final_answer) ### 3. 准备Judge (奖励模块) -在 astune/task_judge/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 +在 astuner/task_judge/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 Judge的输入参数包含: @@ -82,17 +82,17 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_math_agent/math_agent.yaml](../tutorial/example_math_agent/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 -1. 读取task(对应配置字段 astune.task_reader) -2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +1. 读取task(对应配置字段 astuner.task_reader) +2. 定义 Workflow(对应配置字段 astuner.rollout.agentscope_learn_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.math_agent->ExampleMathLearn` -3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) - - 举例如果 agentscope workflow 定义在 `astune/task_judge/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - - 则填写 astune.task_judge.judge_protocol=`astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge` -4. 指定模型(对应配置字段 astune.model.path ) + - 则填写 astuner.rollout.agentscope_learn_protocol=`tutorial.math_agent->ExampleMathLearn` +3. 定义评分函数(对应配置字段 astuner.task_judge.judge_protocol ) + - 举例如果 agentscope workflow 定义在 `astuner/task_judge/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 + - 则填写 astuner.task_judge.judge_protocol=`astuner.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge` +4. 指定模型(对应配置字段 astuner.model.path ) ```yaml -astune: +astuner task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` rollout: @@ -100,7 +100,7 @@ astune: agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -160,9 +160,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astune/astune/launcher_record - - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name - - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index 72572c59..74faac1f 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -2,7 +2,7 @@ from loguru import logger from pydantic import BaseModel, Field -from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index e623e054..e9e08d55 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astune: +astuner project_name: example_math_agent task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` @@ -11,7 +11,7 @@ astune: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -58,10 +58,10 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only + - file://astuner/default_config + - file://astuner/default_config/verl # verl only - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only + - file://astuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_math_agent/math_agent_verl.yaml b/tutorial/example_math_agent/math_agent_verl.yaml index 41e27393..0859f4c4 100644 --- a/tutorial/example_math_agent/math_agent_verl.yaml +++ b/tutorial/example_math_agent/math_agent_verl.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astune: +astuner project_name: example_math_agent task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` @@ -11,7 +11,7 @@ astune: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -48,10 +48,10 @@ astune: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only + - file://astuner/default_config + - file://astuner/default_config/verl # verl only - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only + - file://astuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_rm_auto_grader/config.md b/tutorial/example_rm_auto_grader/config.md index 4427e6d6..f3620b23 100644 --- a/tutorial/example_rm_auto_grader/config.md +++ b/tutorial/example_rm_auto_grader/config.md @@ -1,7 +1,7 @@ # Example configuration for RM Auto Grader Judge -# This configuration integrates RM Gallery's AutoGrader capabilities into astune +# This configuration integrates RM Gallery's AutoGrader capabilities into astuner -astune: +astuner # Task judge configuration using RM Auto Grader task_judge: # Use RMAutoGraderJudge for pre-generated rubrics @@ -76,7 +76,7 @@ astune: # ============================================ # Uncomment and use these settings when using RMAutoGraderBatchJudge -# astune: +# astuner # task_judge: # class_name: RMAutoGraderBatchJudge # @@ -92,7 +92,7 @@ astune: # ============================================ # Example for Math Problem Evaluation # ============================================ -# astune: +# astuner # task_judge: # class_name: RMAutoGraderJudge # model_name: "qwen-plus" @@ -114,7 +114,7 @@ astune: # ============================================ # Example for Agent Task Evaluation # ============================================ -# astune: +# astuner # task_judge: # class_name: RMAutoGraderJudge # model_name: "gpt-4" diff --git a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py index c39fc67d..06592283 100644 --- a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py +++ b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py @@ -1,5 +1,5 @@ """ -Example: Using RM Auto Grader Judge with astune +Example: Using RM Auto Grader Judge with astuner This example demonstrates how to use the RM Gallery AutoGrader integration for data-driven evaluation of workflow outputs. @@ -12,9 +12,9 @@ import asyncio from typing import List -from astune.schema.task import Task -from astune.task_judge.rm_auto_grader_judge import RMAutoGraderJudge -from astune.workflow import Workflow, WorkflowOutput, WorkflowTask +from astuner.schema.task import Task +from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge +from astuner.workflow import Workflow, WorkflowOutput, WorkflowTask # ============================================ # Example 1: Pre-generated Rubrics Approach @@ -34,7 +34,7 @@ async def example_pregerated_rubrics(): # Mock config object class MockConfig: - class Astune: + class astuner class TaskJudge: # Model configuration model_name = "qwen3-32b" @@ -62,7 +62,7 @@ class TaskJudge: task_judge = TaskJudge() - astune = Astune() + astuner = Astune() config = MockConfig() @@ -122,7 +122,7 @@ async def example_listwise_mode(): # Mock config object class MockConfig: - class Astune: + class astuner class TaskJudge: # Model configuration model_name = "qwen3-32b" @@ -150,7 +150,7 @@ class TaskJudge: task_judge = TaskJudge() - astune = Astune() + astuner = Astune() config = MockConfig() diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index a4f1db04..9023606e 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -63,7 +63,7 @@ astune_proxy.update_judge_input_dictionary(final_answer=final_answer) ### 3. 准备Judge (奖励模块) -在 astune/task_judge/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 +在 astuner/task_judge/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 Judge的输入参数包含: @@ -82,17 +82,17 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_rubrics_judge/math_agent.yaml](../tutorial/example_rubrics_judge/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 -1. 读取task(对应配置字段 astune.task_reader) -2. 定义 Workflow(对应配置字段 astune.rollout.agentscope_learn_protocol ) +1. 读取task(对应配置字段 astuner.task_reader) +2. 定义 Workflow(对应配置字段 astuner.rollout.agentscope_learn_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - - 则填写 astune.rollout.agentscope_learn_protocol=`tutorial.math_agent->ExampleMathLearn` -3. 定义评分函数(对应配置字段 astune.task_judge.judge_protocol ) - - 举例如果 agentscope workflow 定义在 `astune/task_judge/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - - 则填写 astune.task_judge.judge_protocol=`astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge` -4. 指定模型(对应配置字段 astune.model.path ) + - 则填写 astuner.rollout.agentscope_learn_protocol=`tutorial.math_agent->ExampleMathLearn` +3. 定义评分函数(对应配置字段 astuner.task_judge.judge_protocol ) + - 举例如果 agentscope workflow 定义在 `astuner/task_judge/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 + - 则填写 astuner.task_judge.judge_protocol=`astuner.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge` +4. 指定模型(对应配置字段 astuner.model.path ) ```yaml -astune: +astuner task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` rollout: @@ -100,7 +100,7 @@ astune: agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -160,9 +160,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astune/astune/launcher_record - - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name - - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_rubrics_judge/math_agent.py b/tutorial/example_rubrics_judge/math_agent.py index a4389dd8..0ca5ddf6 100644 --- a/tutorial/example_rubrics_judge/math_agent.py +++ b/tutorial/example_rubrics_judge/math_agent.py @@ -2,7 +2,7 @@ from loguru import logger from pydantic import BaseModel, Field -from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml index 4248ae0b..d4e45ebf 100644 --- a/tutorial/example_rubrics_judge/r_judge.yaml +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astune: +astuner project_name: example_rubrics_judge task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` @@ -60,10 +60,10 @@ astune: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only + - file://astuner/default_config + - file://astuner/default_config/verl # verl only - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only + - file://astuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index c458febd..2f9f8d7d 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -17,7 +17,7 @@ from loguru import logger from pydantic import BaseModel, Field -from astune import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask from tutorial.example_werewolves.game import werewolves_game @@ -81,7 +81,7 @@ def get_official_agent_prompt(name) -> str: class ExampleWerewolves(Workflow): - trainer: str = Field(default="astune-trinity") + trainer: str = Field(default="astuner-trinity") trainable_targets: list = Field( default=["seer", "witch"], description="List of agents to be fine-tuned." ) diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index a3c1f83e..83b1fc16 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -8,7 +8,7 @@ - 定义 AgentScope 的工作流 (把agent的model修改为`astune_proxy`) ```python class ExampleWerewolves(AgentScopeLearnProtocol): - trainer: str = Field(default="astune-trinity") + trainer: str = Field(default="astuner-trinity") async def agentscope_execute(self, init_messages, astune_proxy: ModelTuner, config) -> WorkflowOutput: train_which_role = "witch" @@ -37,7 +37,7 @@ - 复制并修改 [tutorial/example_werewolves/werewolves.yaml](../tutorial/example_werewolves/werewolves.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 ```yaml - astune: + astuner task_reader: type: random_dummy # `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` task_judge: @@ -105,9 +105,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astune/astune/launcher_record - - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name - - /mnt/data/qingxu.fu/astune/astune/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name + - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index c5249671..39e66cca 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astune: +astuner project_name: example_werewolves task_reader: type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` @@ -44,10 +44,10 @@ astune: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astune/default_config - - file://astune/default_config/verl # verl only + - file://astuner/default_config + - file://astuner/default_config/verl # verl only - file://external/verl/verl/trainer/config # verl only - - file://astune/default_config/trinity # trinity only + - file://astuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: From a0ab407628844184dbfab6d1b4e62f166467de4f Mon Sep 17 00:00:00 2001 From: "shian.lq" Date: Thu, 27 Nov 2025 18:04:59 +0800 Subject: [PATCH 209/462] update doc_reader to support cache Former-commit-id: a41b5cb5372eebc022e34bc557313741f77bd745 --- .../task_reader/document_reader/doc_reader.py | 110 ++++++++++++++---- 1 file changed, 85 insertions(+), 25 deletions(-) diff --git a/astune/task_reader/document_reader/doc_reader.py b/astune/task_reader/document_reader/doc_reader.py index 6bdbaa38..a057c302 100644 --- a/astune/task_reader/document_reader/doc_reader.py +++ b/astune/task_reader/document_reader/doc_reader.py @@ -1,46 +1,106 @@ import uuid -from typing import Dict, List - -from unstructured.partition.auto import partition - +import hashlib +import json +import os +from pathlib import Path +from typing import List from astune.schema.document import Document from astune.task_reader.document_reader.document_reader_base import DocReaderBase - +from unstructured.partition.auto import partition class DocReader(DocReaderBase): """ - Document reader parses them into Document objects, and optionally returns raw text content. + Document reader with file hash caching support. """ - def __init__(self, config): super().__init__(config) + self.cache_enabled = getattr(config.astune.document_reader, 'cache_enabled', True) - def load_document(self, source: str, languages=["eng"]) -> str: + def load_document(self, source: str, languages=['eng']) -> str: """ - Load text from a file. - - Args: - source (str): Path to the file. - - Returns: - str: Merged text from all pages. + Load text from a file with caching support. """ - text_pages = [] - print(f"reading document from {source} using languages={languages}...") - text_pages = partition(source, languages=languages) + if not self.cache_enabled: + return self._parse_document(source, languages) + + # Calculate file hash + file_hash = self._calculate_file_hash(source) + if not file_hash: + return self._parse_document(source, languages) + + # Generate cache path + cache_path = self._get_cache_path(source, file_hash, languages) + + # Try to load from cache + cached_content = self._load_from_cache(cache_path) + if cached_content: + print(f"Cache hit: {Path(cache_path).name}") + return cached_content + + # Cache miss, parse document + print(f"Cache miss: Parsing {Path(source).name}...") + text = self._parse_document(source, languages) + + # Save to cache + self._save_to_cache(cache_path, text) + print(f"Cached to: {Path(cache_path).name}") + + return text + def _parse_document(self, source: str, languages: List[str]) -> str: + """Parse document using unstructured.""" + text_pages = partition(source, languages=languages) if not text_pages: raise ValueError(f"No extractable text found in file: {source}") + return "\n\n".join([str(sub) for sub in text_pages]) - text = "\n\n".join([str(sub) for sub in text_pages]) - return text + def _calculate_file_hash(self, file_path: str) -> str: + """Calculate SHA256 hash of a file.""" + try: + hash_sha256 = hashlib.sha256() + with open(file_path, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hash_sha256.update(chunk) + return hash_sha256.hexdigest() + except Exception: + return "" - def _parser_document(self, raw_document: str) -> Document: - return Document(doc_id=str(uuid.uuid4()), content=raw_document, metadata={}) + def _get_cache_path(self, source_path: str, file_hash: str, languages: List[str]) -> str: + """Generate cache file path.""" + source_path = Path(source_path) + lang_suffix = "_" + "_".join(sorted(languages)) if languages else "" + cache_filename = f"{source_path.stem}.{file_hash[:16]}{lang_suffix}.cache.json" + return str(source_path.parent / cache_filename) + + def _load_from_cache(self, cache_path: str) -> str: + """Load cached content.""" + try: + if os.path.exists(cache_path): + with open(cache_path, 'r', encoding='utf-8') as f: + cache_data = json.load(f) + return cache_data.get('content', '') + except Exception: + pass + return None + + def _save_to_cache(self, cache_path: str, content: str) -> bool: + """Save content to cache.""" + try: + cache_data = {'content': content} + with open(cache_path, 'w', encoding='utf-8') as f: + json.dump(cache_data, f, ensure_ascii=False, indent=2) + return True + except Exception: + return False def get_document(self) -> Document: + """Get document with caching.""" file_path = self.config.astune.document_reader.document_path - raw_doc = self.load_document( - file_path, languages=list(self.config.astune.document_reader.languages) + languages = list(self.config.astune.document_reader.languages) + raw_doc = self.load_document(file_path, languages) + return Document( + doc_id=str(uuid.uuid4()), + content=raw_doc, + metadata={} ) - return self._parser_document(raw_doc) + From f02534513a9418960e6dede98549c6d4d14b7344 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 18:13:17 +0800 Subject: [PATCH 210/462] fix comment Former-commit-id: 23179829b62a80a563d5f038058d0cd1f5675244 --- tutorial/example_rm_auto_grader/rm_auto_grader_example.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py index 06592283..baaf4b78 100644 --- a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py +++ b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py @@ -34,7 +34,7 @@ async def example_pregerated_rubrics(): # Mock config object class MockConfig: - class astuner + class Astuner: class TaskJudge: # Model configuration model_name = "qwen3-32b" @@ -62,7 +62,7 @@ class TaskJudge: task_judge = TaskJudge() - astuner = Astune() + astuner = Astuner() config = MockConfig() @@ -122,7 +122,7 @@ async def example_listwise_mode(): # Mock config object class MockConfig: - class astuner + class Astuner: class TaskJudge: # Model configuration model_name = "qwen3-32b" @@ -150,7 +150,7 @@ class TaskJudge: task_judge = TaskJudge() - astuner = Astune() + astuner = Astuner() config = MockConfig() From c5fc4c39634648cb886173c4038f9ff6fce11747 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 18:18:49 +0800 Subject: [PATCH 211/462] add version number Former-commit-id: a7a73b04d11ea8e1facc1cef45842936027c7feb --- astuner/__init__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/astuner/__init__.py b/astuner/__init__.py index a332c0aa..d47b2c91 100644 --- a/astuner/__init__.py +++ b/astuner/__init__.py @@ -1,3 +1,12 @@ from astuner.schema.task import WorkflowOutput, WorkflowTask from astuner.tuner import ModelTuner from astuner.workflow import Workflow + +__all__ = [ + "Workflow", + "WorkflowTask", + "WorkflowOutput", + "ModelTuner", +] + +__version__ = "0.1.0" From d7e011f4443707844f6f21c7f5799ffafa7dd1be Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 18:26:29 +0800 Subject: [PATCH 212/462] add flake pre commit Former-commit-id: c11f0dc8c49d33206c5624550fc7d3f4ce333712 --- .pre-commit-config.yaml | 13 +++++++++++++ README.md | 2 +- .../agentscope_tracker/multiagent_tracking.py | 3 ++- astuner/context_tracker/tracker_base_attr.py | 3 ++- astuner/default_config/astune_default.yaml | 2 +- tests/data/config.yaml | 2 +- tests/data_gen.yaml | 2 +- tutorial/example_appworld/appworld.yaml | 2 +- tutorial/example_appworld/appworld_2nodes.yaml | 2 +- .../example_feedback_tracing.yaml | 2 +- tutorial/example_math_agent/math_agent.yaml | 2 +- tutorial/example_math_agent/math_agent_verl.yaml | 2 +- tutorial/example_rubrics_judge/r_judge.yaml | 2 +- tutorial/example_werewolves/werewolves.yaml | 2 +- 14 files changed, 28 insertions(+), 13 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 26dd14a4..c4117798 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,6 +10,7 @@ repos: - id: check-json - id: check-merge-conflict - id: detect-private-key + - repo: https://github.com/psf/black rev: 23.7.0 hooks: @@ -23,6 +24,18 @@ repos: - id: isort args: ["--profile", "black", "--filter-files"] + - repo: https://github.com/pycqa/flake8 + rev: 6.1.0 + hooks: + - id: flake8 + additional_dependencies: [flake8-docstrings] + args: [ + "--max-line-length=88", + "--max-complexity=15", + "--select=C,E,F,W,B,B950", + "--ignore=E203,E266,E501,W503", + ] + - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.7.0 hooks: diff --git a/README.md b/README.md index 835eca9d..4261b300 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Explore our rich library of examples to kickstart your journey: - Auto-Alignment: - `astuner/default_config/config_auto_convertion_verl.json` - `astuner/default_config/config_auto_convertion_trinity.json` - + 6. **ASTuner & AgentScope Interaction System V0.5** - Managed by `astuner/context_tracker/agentscope.py`: - Processes tokens generated by AgentScope diff --git a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py index b5a0ec97..cd585b04 100644 --- a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -199,7 +199,8 @@ def step_track( input_msg_ref, llm_output, tools=tools ) assert ( - len(token_arr_method2) <= self.config.astuner.rollout.max_response_length_in_one_turn + len(token_arr_method2) + <= self.config.astuner.rollout.max_response_length_in_one_turn ), f"Generated token length {len(token_arr_method2)} exceeds max_response_length_in_one_turn {self.config.astuner.rollout.max_response_length_in_one_turn}" llm_ext_msg.token_arr = token_arr_method2 llm_ext_msg.token_logprob_arr = token_logprob_arr diff --git a/astuner/context_tracker/tracker_base_attr.py b/astuner/context_tracker/tracker_base_attr.py index 166268d9..e400fcbf 100644 --- a/astuner/context_tracker/tracker_base_attr.py +++ b/astuner/context_tracker/tracker_base_attr.py @@ -61,6 +61,7 @@ def __init__(self, config, tokenizer, **kwargs): self.generation_prompt_token = None assert ( - self.config.astuner.data.max_prompt_length + self.config.astuner.data.max_response_length + self.config.astuner.data.max_prompt_length + + self.config.astuner.data.max_response_length <= max_model_len ) diff --git a/astuner/default_config/astune_default.yaml b/astuner/default_config/astune_default.yaml index ad3d2491..558d1e47 100644 --- a/astuner/default_config/astune_default.yaml +++ b/astuner/default_config/astune_default.yaml @@ -1,5 +1,5 @@ # ------------------ main configuration ------------------ -astuner +astuner: project_name: appworld_astune experiment_name: "read_yaml_name" experiment_dir: "auto" # {exp-dir}/{experiment_name} diff --git a/tests/data/config.yaml b/tests/data/config.yaml index b342e686..4a12227a 100644 --- a/tests/data/config.yaml +++ b/tests/data/config.yaml @@ -1,4 +1,4 @@ -astuner +astuner: project_name: unittest experiment_name: sample task_reader: diff --git a/tests/data_gen.yaml b/tests/data_gen.yaml index c74118b5..44bf6b86 100644 --- a/tests/data_gen.yaml +++ b/tests/data_gen.yaml @@ -1,4 +1,4 @@ -astuner +astuner: document_reader: document_path: 'dataset/document/Anti-Money Laundering and Counter-Terrorist Financing Ordinance.pdf' languages: diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 11790503..09ec33e1 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner +astuner: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: diff --git a/tutorial/example_appworld/appworld_2nodes.yaml b/tutorial/example_appworld/appworld_2nodes.yaml index d8268d1e..2f5452c6 100644 --- a/tutorial/example_appworld/appworld_2nodes.yaml +++ b/tutorial/example_appworld/appworld_2nodes.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner +astuner: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index 7b6eec7e..f9acfbd2 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner +astuner: project_name: example_feedback_training task_reader: type: tracing diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index e9e08d55..3a7afe9f 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner +astuner: project_name: example_math_agent task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` diff --git a/tutorial/example_math_agent/math_agent_verl.yaml b/tutorial/example_math_agent/math_agent_verl.yaml index 0859f4c4..1aafaf1b 100644 --- a/tutorial/example_math_agent/math_agent_verl.yaml +++ b/tutorial/example_math_agent/math_agent_verl.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner +astuner: project_name: example_math_agent task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml index d4e45ebf..51a61409 100644 --- a/tutorial/example_rubrics_judge/r_judge.yaml +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner +astuner: project_name: example_rubrics_judge task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index 39e66cca..d6023f72 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner +astuner: project_name: example_werewolves task_reader: type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` From a5aba009fb6e28898b3281304596442af49b1ceb Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 19:15:04 +0800 Subject: [PATCH 213/462] fix flake8 pre-commit Former-commit-id: 8cb3a4598d6d9af91d93769e189364ae3f07b991 --- .pre-commit-config.yaml | 4 +- astuner/backbone/__init__.py | 2 +- astuner/backbone/native_compat_trainer.py | 22 ++++------ astuner/backbone/trinity_compat_workflow.py | 20 +++------- .../agentscope_tracker/multiagent_tracking.py | 30 +++++--------- .../agentscope_tracker/timeline_merging.py | 10 ++--- astuner/context_tracker/basic_tracker.py | 24 ++++------- astuner/context_tracker/tracker_base_attr.py | 3 -- astuner/data_generator/filters/factory.py | 2 +- .../filters/llm_evaluate_filter.py | 2 - .../data_generator/knowledge_augmentation.py | 14 +++---- astuner/data_generator/task_augmentation.py | 1 - astuner/main_verl.py | 6 +-- astuner/main_vllm.py | 40 +++++++++---------- astuner/schema/document.py | 2 - astuner/schema/extended_msg.py | 3 +- astuner/schema/trajectory.py | 8 ++-- astuner/task_judge/math_answer_as_judge.py | 2 +- astuner/task_judge/rm_auto_grader_judge.py | 6 +-- astuner/task_reader/__init__.py | 7 +--- .../task_reader/document_reader/doc_reader.py | 1 - .../document_reader/document_reader_base.py | 6 --- astuner/task_reader/env_service_reader.py | 7 ---- astuner/task_reader/hf_dataset_reader.py | 7 +--- astuner/task_reader/jsonl_reader.py | 6 +-- astuner/task_reader/task_reader_base.py | 7 +--- .../task_reader/tracing_reader/__init__.py | 4 +- .../tracing_reader/filters/factory.py | 2 +- .../task_reader/tracing_reader/llm_client.py | 15 ++++--- astuner/task_rollout/async_llm_bridge.py | 3 +- .../task_rollout/native_parallel_worker.py | 4 +- astuner/task_rollout/resource_keeper.py | 7 ++-- astuner/task_rollout/single_worker.py | 10 ++--- astuner/task_runner/__init__.py | 5 +-- astuner/task_runner/agentscope_runner.py | 17 ++------ astuner/task_runner/classic_runner.py | 8 +--- astuner/tuner.py | 7 +--- astuner/utils/cleaner.py | 3 -- astuner/utils/compute_madness.py | 1 + astuner/utils/config_utils.py | 2 +- .../utils/env_service_client/env_client_ng.py | 12 +++--- astuner/utils/launch_utils.py | 3 -- astuner/utils/logger.py | 1 - astuner/utils/message.py | 5 --- astuner/utils/model_merger.py | 2 +- astuner/utils/process_dataset.py | 4 +- astuner/utils/process_manager.py | 4 -- astuner/utils/retry.py | 2 +- astuner/utils/robust_dashscope.py | 1 - astuner/utils/smart_daemon.py | 2 +- astuner/utils/tokenizer.py | 2 +- astuner/utils/utils.py | 2 +- launcher.py | 7 +--- scripts/deploy_model.py | 28 ++++++------- tests/data_gen.py | 3 -- tutorial/example_feedback_tracing/train.py | 4 -- tutorial/example_math_agent/math_agent.py | 1 - .../rm_auto_grader_example.py | 2 +- tutorial/example_werewolves/game.py | 3 +- tutorial/example_werewolves/start.py | 5 +-- 60 files changed, 136 insertions(+), 287 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c4117798..0e78eeb7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,8 +30,8 @@ repos: - id: flake8 additional_dependencies: [flake8-docstrings] args: [ - "--max-line-length=88", - "--max-complexity=15", + "--max-line-length=100", + "--max-complexity=20", "--select=C,E,F,W,B,B950", "--ignore=E203,E266,E501,W503", ] diff --git a/astuner/backbone/__init__.py b/astuner/backbone/__init__.py index cfaa5d4b..0b3f7cb8 100644 --- a/astuner/backbone/__init__.py +++ b/astuner/backbone/__init__.py @@ -1,6 +1,6 @@ from loguru import logger try: - from astuner.backbone.trinity_compat_workflow import * + pass except ImportError: logger.warning("trinity is not available.") diff --git a/astuner/backbone/native_compat_trainer.py b/astuner/backbone/native_compat_trainer.py index 44de5c75..38316e2f 100644 --- a/astuner/backbone/native_compat_trainer.py +++ b/astuner/backbone/native_compat_trainer.py @@ -15,29 +15,25 @@ import json import os -import time import uuid import warnings from collections import defaultdict -from copy import deepcopy from dataclasses import dataclass, field from enum import Enum from pprint import pprint -from typing import Dict, List, Optional, Type, Union +from typing import List, Optional import hydra import numpy as np import ray import torch -from beast_logger import print_dict, register_logger -from loguru import logger +from beast_logger import print_dict from omegaconf import OmegaConf, open_dict from torch.utils.data import Dataset, Sampler from torchdata.stateful_dataloader import StatefulDataLoader from tqdm import tqdm from verl import DataProto from verl.experimental.dataset.sampler import AbstractCurriculumSampler -from verl.protocol import pad_dataproto_to_divisor, unpad_dataproto from verl.single_controller.base import Worker from verl.single_controller.ray import ( RayClassWithInitArgs, @@ -52,9 +48,8 @@ compute_data_metrics, compute_throughout_metrics, compute_timing_metrics, - process_validation_metrics, ) -from verl.trainer.ppo.reward import compute_reward, compute_reward_async +from verl.trainer.ppo.reward import compute_reward from verl.utils.checkpoint.checkpoint_manager import ( find_latest_ckpt_path, should_save_ckpt_esi, @@ -71,9 +66,7 @@ from astuner.context_tracker.basic_tracker import BasicContextTracker from astuner.schema.task import Task -from astuner.schema.trajectory import Trajectory from astuner.task_rollout.native_parallel_worker import ParallelEnvManager -from astuner.utils.message import send_train_message WorkerType = type[Worker] @@ -642,9 +635,9 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): config.astuner.data.train_batch_size, config.actor_rollout_ref.model, ) - except hydra.errors.InstantiationException as e: + except hydra.errors.InstantiationException: raise ValueError( - f"You are using an unsupported VERL version. Please read `documents/backbones.md`" + "You are using an unsupported VERL version. Please read `documents/backbones.md`" ) if not config.actor_rollout_ref.actor.use_dynamic_bsz: if self.use_reference_policy: @@ -911,7 +904,7 @@ def _validate(self): target_dataset=main_val_dataset, target_dataset_name="main_val_dataset", mode="validate", - epoch=f"test.1", + epoch="test.1", ) print("=" * 10 + "end validate rollout" + "=" * 10) test_output_gen_batch = self.parallel_env.to_dataproto(trajectories) @@ -1094,7 +1087,6 @@ def init_workers(self): self.reward_fn = parse_reward_from_dataproto self.val_reward_fn = parse_reward_from_dataproto - from concurrent.futures import ThreadPoolExecutor self.parallel_env = ParallelEnvManager( config=self.config, @@ -1791,7 +1783,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): "TGC@1": repeated_success_tasks / (num_tasks * pass_n), f"TGC@{pass_n}": num_pass_n_tasks / num_tasks, f"TGC@{pass_n}-all-pass": num_all_success_tasks / num_tasks, - f"SGC@1": repeated_num_pass_1_scenarios / (num_scenarios * pass_n), + "SGC@1": repeated_num_pass_1_scenarios / (num_scenarios * pass_n), f"SGC@{pass_n}": num_pass_n_scenarios / num_scenarios, f"SGC@{pass_n}-all-pass": num_all_success_scenarios / num_scenarios, "mean_reward": sum(rewards) / len(rewards) if rewards else 0, diff --git a/astuner/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py index c4b45819..701e875e 100644 --- a/astuner/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -1,6 +1,5 @@ import asyncio import os -import uuid import datasets import openai @@ -12,25 +11,16 @@ from trinity.common.workflows.workflow import Workflow try: - from trinity.buffer.buffer_reader import BufferReader from trinity.buffer.reader import READER - from trinity.buffer.reader.file_reader import ( - FileReader, - TaskFileReader, - _HFBatchReader, - ) - from trinity.buffer.reader.reader import READER + from trinity.buffer.reader.file_reader import TaskFileReader, _HFBatchReader from trinity.buffer.schema.formatter import FORMATTER - from trinity.common.config import StorageConfig logger.success("[New Trinity] Trinity imports successful.") except ImportError: logger.success("[Old Trinity] Using old trinity.") - pass -from typing import List, Literal, Optional, Tuple, cast +from typing import List, Literal, Optional, cast -from datasets import Dataset, load_dataset from transformers import AutoTokenizer from astuner.backbone.common_warm_up import warm_up_process @@ -169,7 +159,7 @@ async def run_async(self): reward = tracker.reward_structure.step_reward if isinstance(reward, list): reward = reward[0] - except Exception as e: + except Exception: reward = tracker.reward_structure.raw_reward if not isinstance( reward, (float, int) @@ -209,7 +199,7 @@ async def run_async(self): ) exps += [exp] else: - logger.exception(f"Data length mismatch when converting sample to experience.") + logger.exception("Data length mismatch when converting sample to experience.") return exps @@ -270,5 +260,5 @@ def read(self, batch_size: Optional[int] = None) -> List: tasks.append(task) return tasks -except: +except Exception: pass diff --git a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py index cd585b04..b6aa7d5c 100644 --- a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -1,27 +1,15 @@ import copy import json -from typing import Any, Dict, List, Tuple, Union - -from agentscope.model import DashScopeChatModel -from beast_logger import ( - NestedJsonItem, - SeqItem, - print_dict, - print_listofdict, - print_nested, -) +from typing import List, Tuple + +from beast_logger import NestedJsonItem, SeqItem, print_dict, print_nested from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer from astuner.context_tracker.agentscope_tracker.timeline_merging import ( - can_merge_steps, merge_tracker_timelines, ) -from astuner.context_tracker.basic_tracker import ( - BasicContextTracker, - ExtendedMessage, - replace_token_ids, -) +from astuner.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage from astuner.schema.extended_msg import INVALID_LOG_PROB_VALUE from astuner.schema.trajectory import Reward from astuner.utils.color_hsl import adjust_color_hsl @@ -162,7 +150,7 @@ def step_track( if not isinstance(expect_dict, dict): wrong_toolcall = True err_type = "cannot parse arguments" - except: + except Exception: wrong_toolcall = True err_type = "arguments not json" else: @@ -273,7 +261,7 @@ def patch_prompt_tokens( "current_prompt_text": current_prompt_text[j], }, mod="exception", - header=f"Prompt text mismatch, Please report a github issue", + header="Prompt text mismatch, Please report a github issue", ) previous_ext_context[j].token_arr = self.tokenizer( prompt_text_split[j], return_tensors="pt", padding=False @@ -339,7 +327,7 @@ def generate_log(self, task_id=None, global_step="NA"): try: step_advantage = self.reward_structure.step_advantage[index] step_advantage_simple = self.reward_structure.step_advantage_simple[index] - except: + except Exception: step_advantage = 0.0 step_advantage_simple = 0.0 task_outcome = str(self.reward_structure.success_rate) @@ -350,8 +338,8 @@ def generate_log(self, task_id=None, global_step="NA"): assert ( len_prompt_ids + len_response_ids == len_input_ids ), "len_prompt_ids + len_response_ids should equal to len_input_ids" - nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", # type: ignore + nested_items_print_buffer[".".join(selectors)] = NestedJsonItem( + item_id="item", # type: ignore outcome=task_outcome, # type: ignore len_prompt_ids=len_prompt_ids, # type: ignore len_response_ids=len_response_ids, # type: ignore diff --git a/astuner/context_tracker/agentscope_tracker/timeline_merging.py b/astuner/context_tracker/agentscope_tracker/timeline_merging.py index 248f1b07..0d326bbb 100644 --- a/astuner/context_tracker/agentscope_tracker/timeline_merging.py +++ b/astuner/context_tracker/agentscope_tracker/timeline_merging.py @@ -1,12 +1,8 @@ -from typing import List, Type +from typing import List -from beast_logger import NestedJsonItem, SeqItem, print_listofdict, print_nested +from beast_logger import print_listofdict -from astuner.context_tracker.basic_tracker import ( - BasicContextTracker, - ExtendedMessage, - replace_token_ids, -) +from astuner.context_tracker.basic_tracker import ExtendedMessage def can_merge_steps( diff --git a/astuner/context_tracker/basic_tracker.py b/astuner/context_tracker/basic_tracker.py index 32575cca..bf72536a 100644 --- a/astuner/context_tracker/basic_tracker.py +++ b/astuner/context_tracker/basic_tracker.py @@ -1,16 +1,9 @@ import copy from collections import defaultdict -from typing import List, Optional, Tuple, Union +from typing import List, Optional, Tuple import torch -from beast_logger import ( - NestedJsonItem, - SeqItem, - print_dict, - print_listofdict, - print_nested, - register_logger, -) +from beast_logger import NestedJsonItem, SeqItem, print_nested from loguru import logger from astuner.context_tracker.tracker_base_attr import ( @@ -492,13 +485,13 @@ def generate_log(self, task_id=None, global_step="NA"): try: step_advantage = self.reward_structure.step_advantage[0] step_advantage_simple = self.reward_structure.step_advantage_simple[0] - except: + except Exception: step_advantage = 0.0 step_advantage_simple = 0.0 task_outcome = str(self.reward_structure.success_rate) selectors = [task_id, task_outcome] - nested_items_print_buffer[f".".join(selectors)] = NestedJsonItem( - item_id=f"item", # type: ignore + nested_items_print_buffer[".".join(selectors)] = NestedJsonItem( + item_id="item", # type: ignore outcome=task_outcome, # type: ignore len_prompt_ids=len_prompt_ids, # type: ignore len_response_ids=len_response_ids, # type: ignore @@ -532,7 +525,6 @@ def process_reward(self, reward_structure: Reward): def ensure_terminate_rollout_stage(self): """Nothing need to be done for basic linear cmt at `ensure_terminate_rollout_stage`""" - pass def compute_step_level_reward( self, ext_steps: List[ExtendedMessage], index: int, total_steps: int @@ -617,10 +609,10 @@ def tokenize_steps( if input_ids_len[-1] > self.config.astuner.data.max_prompt_length: message_dict = self.to_role_content(ext_steps) logger.warning( - f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix..." + "Input ids exceeded max_prompt_length before encountering any training message! trying to fix..." ) logger.bind(exception=True).exception( - f"Input ids exceeded max_prompt_length before encountering any training message! trying to fix...\n\n" + "Input ids exceeded max_prompt_length before encountering any training message! trying to fix...\n\n" + str(message_dict) ) assert ( @@ -674,7 +666,7 @@ def tokenize_steps( cmt_tokenized["prompt_logprobs"] = prompt_logprobs try: cmt_tokenized["reference_advantage"] = self.reward_structure.step_advantage[index] - except: + except Exception: cmt_tokenized["reference_advantage"] = 0 return cmt_tokenized diff --git a/astuner/context_tracker/tracker_base_attr.py b/astuner/context_tracker/tracker_base_attr.py index e400fcbf..776098d2 100644 --- a/astuner/context_tracker/tracker_base_attr.py +++ b/astuner/context_tracker/tracker_base_attr.py @@ -1,8 +1,5 @@ from typing import List, Tuple, Union -from loguru import logger -from transformers.tokenization_utils import PreTrainedTokenizer - from astuner.schema.extended_msg import ( INVALID_LOG_PROB_VALUE, ExtendedMessage, diff --git a/astuner/data_generator/filters/factory.py b/astuner/data_generator/filters/factory.py index 954cb8fc..594f2924 100644 --- a/astuner/data_generator/filters/factory.py +++ b/astuner/data_generator/filters/factory.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Sequence +from typing import Any, Dict, List, Mapping, MutableMapping, Sequence from .base import Filter from .llm_evaluate_filter import LlmEvaluateFilter diff --git a/astuner/data_generator/filters/llm_evaluate_filter.py b/astuner/data_generator/filters/llm_evaluate_filter.py index 9d82c04e..ee1401c5 100644 --- a/astuner/data_generator/filters/llm_evaluate_filter.py +++ b/astuner/data_generator/filters/llm_evaluate_filter.py @@ -1,8 +1,6 @@ from concurrent.futures import ThreadPoolExecutor, as_completed from typing import Iterable, List -from tqdm import tqdm - from astuner.schema.task import Task from astuner.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn from astuner.utils.fn import Fn diff --git a/astuner/data_generator/knowledge_augmentation.py b/astuner/data_generator/knowledge_augmentation.py index 6aa934b4..9fadcbd5 100644 --- a/astuner/data_generator/knowledge_augmentation.py +++ b/astuner/data_generator/knowledge_augmentation.py @@ -52,21 +52,21 @@ def _build_user_prompt( f"Generate exactly {N} unique, high-quality questions from the following document according to the rules in the system prompt above." ) user_part.append( - f"For each question, provide the corresponding reference excerpt from the document in the `related_doc` field." + "For each question, provide the corresponding reference excerpt from the document in the `related_doc` field." ) - user_part.append(f"[DOCUMENT START]") + user_part.append("[DOCUMENT START]") user_part.append(ref_doc) - user_part.append(f"[DOCUMENT END]") - user_part.append(f"Now generate queries that is suitable for the JSON format.") - user_part.append(f"Return your output strictly in JSON format as follows:") - user_part.append(f"[") + user_part.append("[DOCUMENT END]") + user_part.append("Now generate queries that is suitable for the JSON format.") + user_part.append("Return your output strictly in JSON format as follows:") + user_part.append("[") user_part.append( ' {"query": "Question text here?", "related_doc": "Direct excerpt from the document here."},' ) user_part.append( ' {"query": "Question text here?", "related_doc": "Direct excerpt from the document here."},' ) - user_part.append(f"]") + user_part.append("]") return "\n".join(user_part) def _parse_llm_output_to_task( diff --git a/astuner/data_generator/task_augmentation.py b/astuner/data_generator/task_augmentation.py index f9c3d1b7..2291be9a 100644 --- a/astuner/data_generator/task_augmentation.py +++ b/astuner/data_generator/task_augmentation.py @@ -1,4 +1,3 @@ -import json import re from typing import Any, Dict, Optional, Union diff --git a/astuner/main_verl.py b/astuner/main_verl.py index 52860580..0c942a97 100644 --- a/astuner/main_verl.py +++ b/astuner/main_verl.py @@ -21,14 +21,10 @@ import hydra import ray -from beast_logger import print_dict, register_logger +from beast_logger import print_dict from omegaconf import OmegaConf -from verl.experimental.dataset.sampler import AbstractSampler -from verl.trainer.constants_ppo import get_ppo_ray_runtime_env -from verl.trainer.ppo.ray_trainer import RayPPOTrainer from verl.trainer.ppo.reward import load_reward_manager from verl.utils.device import is_cuda_available -from verl.utils.import_utils import load_extern_type from astuner.utils.core_env_vars import get_runtime_env from astuner.utils.sms_agent import send_train_message diff --git a/astuner/main_vllm.py b/astuner/main_vllm.py index 2efb2a2f..145cd355 100644 --- a/astuner/main_vllm.py +++ b/astuner/main_vllm.py @@ -4,11 +4,9 @@ from types import SimpleNamespace import hydra -from beast_logger import register_logger from openai import OpenAI from astuner.backbone.common_warm_up import warm_up_process -from astuner.schema.task import Task from astuner.task_rollout.native_parallel_worker import ParallelEnvManager from astuner.utils.sms_agent import send_train_message @@ -20,7 +18,7 @@ def __init__(self, t): self.logprob = t.logprob try: self.decoded_string = bytes(t.bytes).decode("utf-8") - except: + except Exception: self.decoded_string = "" + str(t.bytes) @@ -111,7 +109,7 @@ def run(config): cmt = parallel_env.rollout( tasks=tasks[:n_task], mode="sample", epoch="1" ) # "sample" or "validate" - gen_batch_output = parallel_env.to_dataproto(cmt) + _ = parallel_env.to_dataproto(cmt) print("Generated batch output") @@ -149,31 +147,31 @@ def companion_launch(): full_argument_list=[ sys.executable, "-m", - f"vllm.entrypoints.cli.main", - f"serve", + "vllm.entrypoints.cli.main", + "serve", f"{model_path}", - f"--tensor-parallel-size", + "--tensor-parallel-size", f"{tensor_parallel_size}", - f"--dtype", - f"auto", - f"--enforce-eager", - f"--gpu-memory-utilization", + "--dtype", + "auto", + "--enforce-eager", + "--gpu-memory-utilization", f"{gpu_memory_utilization}", - f"--disable-custom-all-reduce", - f"--max-num-seqs", + "--disable-custom-all-reduce", + "--max-num-seqs", f"{max_num_seqs}", - f"--max-model-len", + "--max-model-len", f"{max_model_len}", - f"--load-format", + "--load-format", "auto", - f"--enable-chunked-prefill", - f"--enable-auto-tool-choice", - f"--tool-call-parser", + "--enable-chunked-prefill", + "--enable-auto-tool-choice", + "--tool-call-parser", "hermes", - f"--enable-prefix-caching", - f"--seed", + "--enable-prefix-caching", + "--seed", f"{seed}", - f"--port", + "--port", f"{vllm_port}", ], dir="./", diff --git a/astuner/schema/document.py b/astuner/schema/document.py index 3178804e..ac2cb1f8 100644 --- a/astuner/schema/document.py +++ b/astuner/schema/document.py @@ -1,5 +1,3 @@ -from typing import Any, Dict, List - from pydantic import BaseModel, Field diff --git a/astuner/schema/extended_msg.py b/astuner/schema/extended_msg.py index d6feb7cc..1f16b468 100644 --- a/astuner/schema/extended_msg.py +++ b/astuner/schema/extended_msg.py @@ -1,10 +1,9 @@ import uuid -from typing import List, Tuple, Union +from typing import List from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from astuner.schema.trajectory import Reward from astuner.utils.tokenizer import astune_apply_chat_template INVALID_LOG_PROB_VALUE = 0.0 diff --git a/astuner/schema/trajectory.py b/astuner/schema/trajectory.py index 0e65ad8e..ea74632f 100644 --- a/astuner/schema/trajectory.py +++ b/astuner/schema/trajectory.py @@ -139,13 +139,13 @@ def truncate_output_ids(self) -> None: if len(self.prompt_ids) > self.max_prompt_len: truncate_any = True print( - f"-------------------------------------------------------------------------------------------------------" + "-------------------------------------------------------------------------------------------------------" ) print( f"Warning: prompt_ids length {len(self.prompt_ids)} exceeds max_prompt_len {self.max_prompt_len}, truncating." ) print( - f"-------------------------------------------------------------------------------------------------------" + "-------------------------------------------------------------------------------------------------------" ) raise RuntimeError( "Prompt length exceeds maximum allowed length. Please adjust the input data." @@ -159,13 +159,13 @@ def truncate_output_ids(self) -> None: if len(self.response_ids) > self.max_response_len: truncate_any = True print( - f"-------------------------------------------------------------------------------------------------------" + "-------------------------------------------------------------------------------------------------------" ) print( f"Warning: response_ids length {len(self.response_ids)} exceeds max_response_len {self.max_response_len}, truncating." ) print( - f"-------------------------------------------------------------------------------------------------------" + "-------------------------------------------------------------------------------------------------------" ) self.response_ids = self.response_ids[: self.max_response_len] self.response_attention_mask = self.response_attention_mask[: self.max_response_len] diff --git a/astuner/task_judge/math_answer_as_judge.py b/astuner/task_judge/math_answer_as_judge.py index 304b9069..c85d98b1 100644 --- a/astuner/task_judge/math_answer_as_judge.py +++ b/astuner/task_judge/math_answer_as_judge.py @@ -48,7 +48,7 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO messages = [ { "role": "system", - "content": f"Is my result correct? If correct, say , otherwise say .", + "content": "Is my result correct? If correct, say , otherwise say .", }, { "role": "user", diff --git a/astuner/task_judge/rm_auto_grader_judge.py b/astuner/task_judge/rm_auto_grader_judge.py index c71b433f..ac3d5998 100644 --- a/astuner/task_judge/rm_auto_grader_judge.py +++ b/astuner/task_judge/rm_auto_grader_judge.py @@ -15,7 +15,7 @@ import asyncio import json import os -from typing import Any, Dict, List, Optional +from typing import List, Optional from beast_logger import print_dict from loguru import logger @@ -254,8 +254,8 @@ async def load_rubrics_from_cache(self) -> None: grader_config = json.load(open(grader_save_dir, "r", encoding="utf-8")) grader_config["model"] = self.model self.llm_grader = LLMGrader.from_config(grader_config) - except Exception as e: - logger.exception(f"Failed to load grader config from") + except Exception: + logger.exception("Failed to load grader config from") await self.generate_rubrics_from_samples([]) def _task_to_eval_case( diff --git a/astuner/task_reader/__init__.py b/astuner/task_reader/__init__.py index b976a128..7a3c7354 100644 --- a/astuner/task_reader/__init__.py +++ b/astuner/task_reader/__init__.py @@ -1,10 +1,7 @@ -import json -import uuid -from typing import Dict, List, Optional +from typing import List import datasets import numpy as np -import torch from astuner.schema.task import Task from astuner.task_reader.env_service_reader import TaskReaderEnvService @@ -31,7 +28,7 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: main_query=f"[dummy task @ {idx}]", init_messages=[], task_id=str(idx), - env_type=f"no_env", + env_type="no_env", metadata={"random_number": idx}, ) tasks.append(task) diff --git a/astuner/task_reader/document_reader/doc_reader.py b/astuner/task_reader/document_reader/doc_reader.py index f484a660..7c21d1e9 100644 --- a/astuner/task_reader/document_reader/doc_reader.py +++ b/astuner/task_reader/document_reader/doc_reader.py @@ -1,5 +1,4 @@ import uuid -from typing import Dict, List from unstructured.partition.auto import partition diff --git a/astuner/task_reader/document_reader/document_reader_base.py b/astuner/task_reader/document_reader/document_reader_base.py index f00d024a..8baaef31 100644 --- a/astuner/task_reader/document_reader/document_reader_base.py +++ b/astuner/task_reader/document_reader/document_reader_base.py @@ -1,9 +1,3 @@ -import json -import uuid -from typing import Dict, List, Optional - -import datasets - from astuner.schema.document import Document diff --git a/astuner/task_reader/env_service_reader.py b/astuner/task_reader/env_service_reader.py index 2c6329f7..de5c1dd9 100644 --- a/astuner/task_reader/env_service_reader.py +++ b/astuner/task_reader/env_service_reader.py @@ -1,10 +1,3 @@ -import json -import uuid -from typing import Dict, List, Optional - -import datasets -import torch - from astuner.schema.task import Task from astuner.task_reader.task_reader_base import TaskReaderBase from astuner.utils.env_service_client.env_client_ng import EnvClient diff --git a/astuner/task_reader/hf_dataset_reader.py b/astuner/task_reader/hf_dataset_reader.py index 0841b3f1..874a9836 100644 --- a/astuner/task_reader/hf_dataset_reader.py +++ b/astuner/task_reader/hf_dataset_reader.py @@ -1,9 +1,6 @@ -import json -import uuid -from typing import Dict, List, Optional +from typing import List import datasets -import torch from astuner.schema.task import Task from astuner.task_reader.task_reader_base import TaskReaderBase @@ -49,7 +46,7 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: main_query=example["question"], init_messages=[], # Dataset examples typically don't have init messages task_id=str(idx), - env_type=f"no_env", + env_type="no_env", metadata=example, ) tasks.append(task) diff --git a/astuner/task_reader/jsonl_reader.py b/astuner/task_reader/jsonl_reader.py index 90f9e8ec..16faf69f 100644 --- a/astuner/task_reader/jsonl_reader.py +++ b/astuner/task_reader/jsonl_reader.py @@ -1,9 +1,5 @@ import json -import uuid -from typing import Dict, List, Optional - -import datasets -import torch +from typing import List from astuner.schema.task import Task from astuner.task_reader.task_reader_base import TaskReaderBase diff --git a/astuner/task_reader/task_reader_base.py b/astuner/task_reader/task_reader_base.py index d7ba70a9..0fc4b23c 100644 --- a/astuner/task_reader/task_reader_base.py +++ b/astuner/task_reader/task_reader_base.py @@ -1,9 +1,4 @@ -import json -import uuid -from typing import Dict, List, Optional - -import datasets -import torch +from typing import List from astuner.schema.task import Task diff --git a/astuner/task_reader/tracing_reader/__init__.py b/astuner/task_reader/tracing_reader/__init__.py index dd16900d..a5fe61bd 100644 --- a/astuner/task_reader/tracing_reader/__init__.py +++ b/astuner/task_reader/tracing_reader/__init__.py @@ -1,7 +1,7 @@ import json import os import random -from typing import Any, List, Mapping, MutableMapping, Sequence, TypedDict +from typing import Any, List, Mapping, TypedDict from loguru import logger @@ -10,7 +10,7 @@ from astuner.schema.task import Task from ..task_reader_base import TaskReaderBase -from .connector import LocalSqliteConnectorV1, PhoenixConnector +from .connector import LocalSqliteConnectorV1 class Config(TypedDict): diff --git a/astuner/task_reader/tracing_reader/filters/factory.py b/astuner/task_reader/tracing_reader/filters/factory.py index b3898a92..61e6b803 100644 --- a/astuner/task_reader/tracing_reader/filters/factory.py +++ b/astuner/task_reader/tracing_reader/filters/factory.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Sequence +from typing import Any, Dict, List, Mapping, MutableMapping, Sequence from .base import Filter from .llm_evaluate_filter import LlmEvaluateFilter diff --git a/astuner/task_reader/tracing_reader/llm_client.py b/astuner/task_reader/tracing_reader/llm_client.py index 73eb6bc4..e6195dfe 100644 --- a/astuner/task_reader/tracing_reader/llm_client.py +++ b/astuner/task_reader/tracing_reader/llm_client.py @@ -1,8 +1,7 @@ import json import os import time -from abc import ABC, abstractmethod -from typing import Any, Generator, Iterator, Optional, Protocol, cast +from typing import Any, Generator, Optional, cast import requests from loguru import logger @@ -153,9 +152,9 @@ def _handle_normal_response(self, url: str, params: dict) -> str: raise LlmException("inappropriate content") if "limit" in error_json["message"]: raise LlmException("hit limit") - except LlmException as e: + except LlmException: raise - except: + except Exception: logger.error(f"API request failed: {response.text}") response.raise_for_status() @@ -190,9 +189,9 @@ def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None raise LlmException("inappropriate content") if "limit" in error_json["message"]: raise LlmException("hit limit") - except LlmException as e: + except LlmException: raise - except: + except Exception: logger.error(f"API request failed: {response.text}") response.raise_for_status() @@ -245,7 +244,7 @@ def chat_with_retry( except LlmException as e: if e.typ == "inappropriate content": logger.warning( - f"llm return inappropriate content, which is blocked by the remote" + "llm return inappropriate content, which is blocked by the remote" ) return "[inappropriate content]" except Exception as e: @@ -293,7 +292,7 @@ def chat_stream_with_retry( except LlmException as e: if e.typ == "inappropriate content": logger.warning( - f"llm return inappropriate content, which is blocked by the remote" + "llm return inappropriate content, which is blocked by the remote" ) yield "[inappropriate content]" return diff --git a/astuner/task_rollout/async_llm_bridge.py b/astuner/task_rollout/async_llm_bridge.py index 6183a72f..e7be4cac 100644 --- a/astuner/task_rollout/async_llm_bridge.py +++ b/astuner/task_rollout/async_llm_bridge.py @@ -5,7 +5,6 @@ import uuid from typing import Any, Callable, Dict, List, Literal, Type -import numpy as np from agentscope._utils._common import _json_loads_with_repair from agentscope.message import TextBlock, ToolUseBlock from agentscope.model import ChatResponse @@ -21,7 +20,7 @@ from astuner.schema.logprob import TokenAndProb from astuner.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode from astuner.utils.tokenizer import astune_apply_chat_template -from astuner.utils.utils import remove_fields, run_async_coro__no_matter_what +from astuner.utils.utils import run_async_coro__no_matter_what class AsyncLlmBridge(object): diff --git a/astuner/task_rollout/native_parallel_worker.py b/astuner/task_rollout/native_parallel_worker.py index 5a8b3b70..65ffc449 100644 --- a/astuner/task_rollout/native_parallel_worker.py +++ b/astuner/task_rollout/native_parallel_worker.py @@ -373,14 +373,12 @@ def rollout_dynamic( need_amend = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) if need_amend and (num_task_to_amend > 0): num_task_to_amend -= 1 - print_buffer += f"/(amend)" + print_buffer += "/(amend)" continue else: if need_amend: - num_completed = len(completed_results) num_to_be_selected = rollout_n else: - num_completed = len(completed_results) num_to_be_selected = rollout_n + avail_extra_cnt selected_cmt_array = self.greedy_max_std_selection( completed_results, num_to_be_selected diff --git a/astuner/task_rollout/resource_keeper.py b/astuner/task_rollout/resource_keeper.py index 8e656885..6f091a33 100644 --- a/astuner/task_rollout/resource_keeper.py +++ b/astuner/task_rollout/resource_keeper.py @@ -1,10 +1,9 @@ -from typing import Any, Callable, Dict, List, Tuple, Union +from typing import Any, Dict, List, Tuple -from beast_logger import print_dict from loguru import logger from omegaconf import DictConfig -from astuner.schema.task import Task, WorkflowTask +from astuner.schema.task import WorkflowTask from astuner.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg @@ -156,7 +155,7 @@ def step(self, action: dict) -> Tuple[str, float, bool, dict]: # assert 'text' in action['content'][0] try: action["content"] = action["content"][0]["text"] - except: + except Exception: logger.exception( f"Failed to parse action content from agentscope output. {action['content']}" ) diff --git a/astuner/task_rollout/single_worker.py b/astuner/task_rollout/single_worker.py index c8864786..c235884b 100644 --- a/astuner/task_rollout/single_worker.py +++ b/astuner/task_rollout/single_worker.py @@ -1,22 +1,18 @@ """Single worker primitives for environment rollouts.""" -import os -import time import uuid -from functools import wraps -from typing import Any, Callable, List, Literal, Optional, TypeVar, Union +from typing import Literal from loguru import logger from omegaconf import DictConfig from transformers.tokenization_utils import PreTrainedTokenizer -from astuner.context_tracker.basic_tracker import BasicContextTracker, TrackerAttr +from astuner.context_tracker.basic_tracker import BasicContextTracker from astuner.schema.task import Task, WorkflowTask from astuner.task_rollout.async_llm_bridge import AsyncLlmBridge from astuner.task_rollout.resource_keeper import ResourceKeeper from astuner.task_runner.agentscope_runner import AgentScopeRunner -from astuner.task_runner.classic_runner import AgentRunner, BaseAgentRunner -from astuner.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from astuner.task_runner.classic_runner import AgentRunner from astuner.utils.retry import retry_with_backoff from astuner.utils.sample import get_sample_params from astuner.utils.testing_utils import GoodbyeException, TestFailException diff --git a/astuner/task_runner/__init__.py b/astuner/task_runner/__init__.py index 3d138fd0..fb08a286 100644 --- a/astuner/task_runner/__init__.py +++ b/astuner/task_runner/__init__.py @@ -1,10 +1,9 @@ -from typing import Any, Callable, Dict, Tuple, Union +from typing import Any, Callable, Union from astuner.context_tracker.basic_tracker import BasicContextTracker from astuner.task_judge.judge_base import JudgeBase from astuner.utils.dynamic_import import dynamic_import -from astuner.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg -from astuner.utils.utils import remove_fields, run_async_coro__no_matter_what +from astuner.utils.utils import run_async_coro__no_matter_what class BaseAgentRunner(object): diff --git a/astuner/task_runner/agentscope_runner.py b/astuner/task_runner/agentscope_runner.py index 42d1e472..eb10e608 100644 --- a/astuner/task_runner/agentscope_runner.py +++ b/astuner/task_runner/agentscope_runner.py @@ -1,25 +1,14 @@ import asyncio -import copy -import importlib -import threading -from typing import Any, Dict, List, Tuple, Union - -import torch from astuner import ModelTuner, Workflow, WorkflowOutput from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, ) -from astuner.context_tracker.basic_tracker import ( - BasicContextTracker, - ExtendedMessage, - replace_token_ids, -) -from astuner.schema.task import Task, WorkflowTask -from astuner.schema.trajectory import Reward, Sample, Trajectory +from astuner.context_tracker.basic_tracker import BasicContextTracker +from astuner.schema.task import WorkflowTask +from astuner.schema.trajectory import Reward from astuner.task_runner import BaseAgentRunner from astuner.utils.dynamic_import import dynamic_import -from astuner.utils.env_service_client.env_client import EnvClient class AgentScopeRunner(BaseAgentRunner): diff --git a/astuner/task_runner/classic_runner.py b/astuner/task_runner/classic_runner.py index 7b7a6719..df0e91c9 100644 --- a/astuner/task_runner/classic_runner.py +++ b/astuner/task_runner/classic_runner.py @@ -1,15 +1,9 @@ -import os -import threading -import time -from typing import Any, Callable, Dict, List, Union - from beast_logger import print_listofdict from loguru import logger -from astuner.context_tracker.basic_tracker import BasicContextTracker, ExtendedMessage +from astuner.context_tracker.basic_tracker import BasicContextTracker from astuner.schema.trajectory import Reward from astuner.task_runner import BaseAgentRunner -from astuner.utils.env_service_client.env_client import EnvClient from astuner.utils.utils import convert_tool_to_user_message diff --git a/astuner/tuner.py b/astuner/tuner.py index 80366a42..b86e6b58 100644 --- a/astuner/tuner.py +++ b/astuner/tuner.py @@ -1,12 +1,9 @@ from typing import TYPE_CHECKING, Any, Literal, Type -from agentscope._utils._common import ( - _create_tool_from_base_model, - _json_loads_with_repair, -) +from agentscope._utils._common import _create_tool_from_base_model from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel from loguru import logger -from pydantic import BaseModel, Field +from pydantic import BaseModel from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracking, diff --git a/astuner/utils/cleaner.py b/astuner/utils/cleaner.py index acf19f3a..7096313d 100644 --- a/astuner/utils/cleaner.py +++ b/astuner/utils/cleaner.py @@ -1,9 +1,6 @@ -import argparse import os import shlex -import shutil import subprocess -import sys import time diff --git a/astuner/utils/compute_madness.py b/astuner/utils/compute_madness.py index e599e2f0..c86f663c 100644 --- a/astuner/utils/compute_madness.py +++ b/astuner/utils/compute_madness.py @@ -1,3 +1,4 @@ +# flake8: noqa: W605 import re from functools import cache diff --git a/astuner/utils/config_utils.py b/astuner/utils/config_utils.py index ea92ffc1..c823416f 100644 --- a/astuner/utils/config_utils.py +++ b/astuner/utils/config_utils.py @@ -141,7 +141,7 @@ def read_astune_hierarchical_config( config["hydra"]["searchpath"].remove("file://external/verl/verl/trainer/config") config["hydra"]["searchpath"].remove("file://astuner/default_config/verl") # remove extra config of trinity for verl - if backbone == "verl": # or args.backbone == "debug" + if backbone == "verl": # or args.backbone == "debug" config["defaults"].remove("trinity_default") config["hydra"]["searchpath"].remove("file://astuner/default_config/trinity") if write_to: diff --git a/astuner/utils/env_service_client/env_client_ng.py b/astuner/utils/env_service_client/env_client_ng.py index d63328f7..6fb63620 100644 --- a/astuner/utils/env_service_client/env_client_ng.py +++ b/astuner/utils/env_service_client/env_client_ng.py @@ -35,7 +35,6 @@ def retry_call( instance_id: str | None = "", action_name: str = "", ): - last_exception = None for i in range(max_retry): try: res = fn() @@ -45,7 +44,6 @@ def retry_call( ) return res except Exception as e: - last_exception = e safe_log( f"{err_prefix} {action_name} [instance={instance_id}] retry {i+1}/{max_retry} failed: {e}" ) @@ -143,7 +141,7 @@ def call(): call, max_retry=max_retry, fail_return=None, - err_prefix=f"[get_tools_info]", + err_prefix="[get_tools_info]", instance_id=instance_id, action_name="get_tools_info", ) @@ -190,7 +188,7 @@ def call(): call, max_retry=max_retry, fail_return=fallback, - err_prefix=f"[create_instance]", + err_prefix="[create_instance]", instance_id=instance_id, action_name="create_instance", ) @@ -227,7 +225,7 @@ def call(): call, max_retry=max_retry, fail_return=fallback, - err_prefix=f"[step]", + err_prefix="[step]", instance_id=instance_id, action_name="step", ) @@ -254,7 +252,7 @@ def call(): call, max_retry=max_retry, fail_return=0.0, - err_prefix=f"[evaluate]", + err_prefix="[evaluate]", instance_id=instance_id, action_name="evaluate", ) @@ -268,7 +266,7 @@ def call(): call, max_retry=max_retry, fail_return=False, - err_prefix=f"[release_instance]", + err_prefix="[release_instance]", instance_id=instance_id, action_name="release_instance", ) diff --git a/astuner/utils/launch_utils.py b/astuner/utils/launch_utils.py index f88bae33..4465fa5b 100644 --- a/astuner/utils/launch_utils.py +++ b/astuner/utils/launch_utils.py @@ -1,11 +1,9 @@ -import argparse import os import shutil import subprocess import sys import time -import yaml from beast_logger import print_dict from loguru import logger @@ -41,7 +39,6 @@ def launch_logview(exp_name=None): webbrowser.open("http://127.0.0.1:8181/") except Exception as e: logger.error(f"Error opening web browser: {e}") - pass def start_ray_service(args, env): diff --git a/astuner/utils/logger.py b/astuner/utils/logger.py index 21b405d8..e69de29b 100644 --- a/astuner/utils/logger.py +++ b/astuner/utils/logger.py @@ -1 +0,0 @@ -import os diff --git a/astuner/utils/message.py b/astuner/utils/message.py index 3ce4f431..66f00bcb 100644 --- a/astuner/utils/message.py +++ b/astuner/utils/message.py @@ -1,8 +1,3 @@ -import os - -import requests - - def send_train_message(message: str): pass # # 发送短信汇报训练进程 diff --git a/astuner/utils/model_merger.py b/astuner/utils/model_merger.py index 1c7da4b3..08cb014c 100644 --- a/astuner/utils/model_merger.py +++ b/astuner/utils/model_merger.py @@ -252,7 +252,7 @@ def _get_world_size(self) -> int: if match: return int(match.group(1)) raise FileNotFoundError( - f"Could not determine world size. No file matching 'model_world_size_(\d+)_rank_0.pt' found in {self.config.local_dir}" + f"Could not determine world size. No file matching 'model_world_size_(\\d+)_rank_0.pt' found in {self.config.local_dir}" ) def _load_rank_zero_state_dict(self, world_size: int) -> dict: diff --git a/astuner/utils/process_dataset.py b/astuner/utils/process_dataset.py index a5fb7962..44f23698 100644 --- a/astuner/utils/process_dataset.py +++ b/astuner/utils/process_dataset.py @@ -13,11 +13,9 @@ # limitations under the License. import time -from typing import Any, Dict, List, Optional, Union +from typing import Union -import datasets import torch -from datasets import Dataset from omegaconf import DictConfig from torch.utils.data import Dataset as TorchDataset from torch.utils.data import RandomSampler, SequentialSampler diff --git a/astuner/utils/process_manager.py b/astuner/utils/process_manager.py index 4705ee17..4e04aa0d 100644 --- a/astuner/utils/process_manager.py +++ b/astuner/utils/process_manager.py @@ -1,10 +1,6 @@ -import argparse import os import shlex -import shutil -import signal import subprocess -import sys import time diff --git a/astuner/utils/retry.py b/astuner/utils/retry.py index a0b62618..b74b133c 100644 --- a/astuner/utils/retry.py +++ b/astuner/utils/retry.py @@ -1,6 +1,6 @@ import time from functools import wraps -from typing import Any, Callable, Literal, Optional, TypeVar +from typing import Any, Callable, Optional, TypeVar from loguru import logger diff --git a/astuner/utils/robust_dashscope.py b/astuner/utils/robust_dashscope.py index 3ac09515..ab8f2b93 100644 --- a/astuner/utils/robust_dashscope.py +++ b/astuner/utils/robust_dashscope.py @@ -1,4 +1,3 @@ -import asyncio import os import random import time diff --git a/astuner/utils/smart_daemon.py b/astuner/utils/smart_daemon.py index 8285337f..e852d508 100644 --- a/astuner/utils/smart_daemon.py +++ b/astuner/utils/smart_daemon.py @@ -185,7 +185,7 @@ def launch( if is_running: if force_restart: assert pgid is not None - logger.warning(f"Force restarting") + logger.warning("Force restarting") self._kill_existing_process_group(pgid) else: logger.success( diff --git a/astuner/utils/tokenizer.py b/astuner/utils/tokenizer.py index 453edbab..f02e311b 100644 --- a/astuner/utils/tokenizer.py +++ b/astuner/utils/tokenizer.py @@ -15,7 +15,7 @@ def cleanup_messages(messages: List[Dict]) -> List[Dict]: if isinstance(t["function"]["arguments"], str): try: t["function"]["arguments"] = json.loads(t["function"]["arguments"]) - except: + except Exception: pass return messages_copied diff --git a/astuner/utils/utils.py b/astuner/utils/utils.py index 8b510114..e09b5053 100644 --- a/astuner/utils/utils.py +++ b/astuner/utils/utils.py @@ -34,7 +34,7 @@ def run_async_coro__no_matter_what(coro, timeout: int = 3600) -> Any: except concurrent.futures.TimeoutError: future.cancel() raise - except Exception as e: + except Exception: raise return final_res diff --git a/launcher.py b/launcher.py index 581d8218..d583b9ca 100644 --- a/launcher.py +++ b/launcher.py @@ -1,11 +1,7 @@ import argparse import os -import shutil import subprocess -import sys -import time -import yaml from dotenv import load_dotenv from loguru import logger @@ -17,7 +13,6 @@ start_ray_service, ) from astuner.utils.pty import pty_launch -from astuner.utils.smart_daemon import LaunchCommandWhenAbsent load_dotenv() @@ -143,7 +138,7 @@ def check_avail_gpu(min_free_ratio: float = 0.95): if result.returncode != 0: raise RuntimeError(f"Failed to query GPUs via nvidia-smi: {result.stderr.strip()}") - lines = [l.strip() for l in result.stdout.splitlines() if l.strip()] + lines = [line.strip() for line in result.stdout.splitlines() if line.strip()] if not lines: raise RuntimeError("No GPUs detected by nvidia-smi.") diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py index d49350a0..801bf2b3 100644 --- a/scripts/deploy_model.py +++ b/scripts/deploy_model.py @@ -38,28 +38,28 @@ def companion_launch(): full_argument_list=[ sys.executable, "-m", - f"vllm.entrypoints.cli.main", - f"serve", + "vllm.entrypoints.cli.main", + "serve", f"{model_path}", - f"--tensor-parallel-size", + "--tensor-parallel-size", f"{tensor_parallel_size}", - f"--dtype", - f"auto", - f"--enforce-eager", - f"--gpu-memory-utilization", + "--dtype", + "auto", + "--enforce-eager", + "--gpu-memory-utilization", f"{gpu_memory_utilization}", - f"--disable-custom-all-reduce", + "--disable-custom-all-reduce", # f"--max-num-seqs", f"{max_num_seqs}", # f"--max-model-len", f"{max_model_len}", - f"--load-format", + "--load-format", "auto", - f"--enable-chunked-prefill", - f"--enable-auto-tool-choice", - f"--tool-call-parser", + "--enable-chunked-prefill", + "--enable-auto-tool-choice", + "--tool-call-parser", "hermes", - f"--enable-prefix-caching", + "--enable-prefix-caching", # f"--seed", f"{seed}", - f"--port", + "--port", f"{vllm_port}", ], dir="./", diff --git a/tests/data_gen.py b/tests/data_gen.py index 931e3b7e..65439513 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -1,12 +1,9 @@ -import os import unittest import dotenv -import yaml dotenv.load_dotenv() from loguru import logger -from tqdm import tqdm from astuner.data_generator.knowledge_augmentation import KnowledgeAugmentor from astuner.data_generator.task_augmentation import TaskAugmentor diff --git a/tutorial/example_feedback_tracing/train.py b/tutorial/example_feedback_tracing/train.py index 57f8341c..6bcfb67e 100644 --- a/tutorial/example_feedback_tracing/train.py +++ b/tutorial/example_feedback_tracing/train.py @@ -1,11 +1,7 @@ -import os - -import agentscope from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory from agentscope.message import Msg -from agentscope.model import DashScopeChatModel from agentscope.tool import Toolkit, execute_python_code from loguru import logger from pydantic import BaseModel, Field diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index 74faac1f..3d83a676 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -1,6 +1,5 @@ from agentscope.message import Msg from loguru import logger -from pydantic import BaseModel, Field from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask diff --git a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py index baaf4b78..ec3d66f0 100644 --- a/tutorial/example_rm_auto_grader/rm_auto_grader_example.py +++ b/tutorial/example_rm_auto_grader/rm_auto_grader_example.py @@ -14,7 +14,7 @@ from astuner.schema.task import Task from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge -from astuner.workflow import Workflow, WorkflowOutput, WorkflowTask +from astuner.workflow import WorkflowOutput, WorkflowTask # ============================================ # Example 1: Pre-generated Rubrics Approach diff --git a/tutorial/example_werewolves/game.py b/tutorial/example_werewolves/game.py index 1abaf457..40cd30d1 100644 --- a/tutorial/example_werewolves/game.py +++ b/tutorial/example_werewolves/game.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # pylint: disable=too-many-branches, too-many-statements, no-name-in-module """A werewolf game implemented by agentscope.""" -import numpy as np from agentscope.agent import ReActAgent from agentscope.pipeline import MsgHub, fanout_pipeline, sequential_pipeline @@ -337,6 +336,6 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: alive_wolves = players.werewolves good_guy_win = len(alive_wolves) == 0 - logger.warning(f"**********************************") + logger.warning("**********************************") logger.warning(f"Good guy win: {good_guy_win}, alive werewolves: {alive_wolves}") return good_guy_win diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index 2f9f8d7d..fac3a135 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -3,7 +3,6 @@ """The main entry point for the werewolf game.""" -import os import dotenv import numpy as np @@ -13,9 +12,9 @@ from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeMultiAgentFormatter, OpenAIMultiAgentFormatter -from agentscope.model import DashScopeChatModel, OpenAIChatModel +from agentscope.model import OpenAIChatModel from loguru import logger -from pydantic import BaseModel, Field +from pydantic import Field from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask from tutorial.example_werewolves.game import werewolves_game From 3bd392063590102a633a21872397ae01f2472aa7 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 19:33:06 +0800 Subject: [PATCH 214/462] clean unused file and fields Former-commit-id: ad6efd217b5db221570f15c1faf6a2cd11805031 --- astuner/backbone/trinity_compat_workflow.py | 18 +- scripts/deploy_model.py | 75 ----- scripts/download_dataset.py | 14 +- scripts/download_model.py | 9 +- scripts/install_vllm_sglang_mcore.sh | 54 ---- scripts/requirements_trinity.txt | 262 ----------------- scripts/requirements_verl.txt | 297 -------------------- scripts/tar_and_copy.sh | 4 - scripts/untar.sh | 1 - 9 files changed, 19 insertions(+), 715 deletions(-) delete mode 100644 scripts/deploy_model.py delete mode 100644 scripts/install_vllm_sglang_mcore.sh delete mode 100644 scripts/requirements_trinity.txt delete mode 100644 scripts/requirements_verl.txt delete mode 100755 scripts/tar_and_copy.sh delete mode 100644 scripts/untar.sh diff --git a/astuner/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py index 701e875e..148f2a99 100644 --- a/astuner/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -138,20 +138,20 @@ async def run_async(self): sample_final += sample_arr exps = [] - for index, sample in enumerate(sample_final): + for _, sample in enumerate(sample_final): sample: Sample input_ids = sample.input_ids prompt_ids = sample.prompt_ids response_ids = sample.response_ids - attention_mask = sample.attention_mask - prompt_attention_mask = sample.prompt_attention_mask - response_attention_mask = sample.response_attention_mask - loss_mask = sample.loss_mask - prompt_loss_mask = sample.prompt_loss_mask + # attention_mask = sample.attention_mask + # prompt_attention_mask = sample.prompt_attention_mask + # response_attention_mask = sample.response_attention_mask + # loss_mask = sample.loss_mask + # prompt_loss_mask = sample.prompt_loss_mask response_loss_mask = sample.response_loss_mask - position_ids = sample.position_ids - prompt_position_ids = sample.prompt_position_ids - response_position_ids = sample.response_position_ids + # position_ids = sample.position_ids + # prompt_position_ids = sample.prompt_position_ids + # response_position_ids = sample.response_position_ids # tracker_tokenized["step_reward"] = self.reward_structure.step_reward[index] logprobs = sample.response_logprobs diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py deleted file mode 100644 index 801bf2b3..00000000 --- a/scripts/deploy_model.py +++ /dev/null @@ -1,75 +0,0 @@ -import argparse -import os -import sys - -import torch - -sys.path.append(os.getcwd()) -from astuner.utils.smart_daemon import LaunchCommandWhenAbsent - -parser = argparse.ArgumentParser(description="deploy Hugging Face model") -parser.add_argument( - "--target", - default="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", - type=str, - help="要下载的数据集仓库名称", -) -parser.add_argument("--port", default="2888", type=str, help="端口") -args = parser.parse_args() - - -def companion_launch(): - print("Launching companion process for async LLM server...") - model_path = args.target - n_avail_gpus = torch.cuda.device_count() - tensor_parallel_size = n_avail_gpus - if tensor_parallel_size > n_avail_gpus: - print( - f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." - ) - tensor_parallel_size = n_avail_gpus - gpu_memory_utilization = 0.95 - # max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs - # max_model_len = config.astuner.rollout.max_model_len - # seed = config.astuner.debug.debug_vllm_seed - # vllm_port = config.astuner.debug.debug_vllm_port - vllm_port = args.port - companion = LaunchCommandWhenAbsent( - full_argument_list=[ - sys.executable, - "-m", - "vllm.entrypoints.cli.main", - "serve", - f"{model_path}", - "--tensor-parallel-size", - f"{tensor_parallel_size}", - "--dtype", - "auto", - "--enforce-eager", - "--gpu-memory-utilization", - f"{gpu_memory_utilization}", - "--disable-custom-all-reduce", - # f"--max-num-seqs", f"{max_num_seqs}", - # f"--max-model-len", f"{max_model_len}", - "--load-format", - "auto", - "--enable-chunked-prefill", - "--enable-auto-tool-choice", - "--tool-call-parser", - "hermes", - "--enable-prefix-caching", - # f"--seed", f"{seed}", - "--port", - f"{vllm_port}", - ], - dir="./", - tag="api_vllm_server", - ) - companion.launch( - launch_wait_time=1800, - success_std_string="Application startup complete", - env_dict={**os.environ}, - ) - - -companion_launch() diff --git a/scripts/download_dataset.py b/scripts/download_dataset.py index 07c1aa0a..565f338f 100644 --- a/scripts/download_dataset.py +++ b/scripts/download_dataset.py @@ -1,19 +1,18 @@ -import os - -os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # 必须放在第一行 import argparse import glob +import os import time +from beast_logger import print_list from huggingface_hub import snapshot_download parser = argparse.ArgumentParser(description="download Hugging Face dataset") -parser.add_argument("--target", default="openai/gsm8k", type=str, help="要下载的数据集仓库名称") +parser.add_argument("--target", default="openai/gsm8k", type=str, help="HuggingFace dataset name") parser.add_argument( "--path", - default="/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k", + default="./dataset/openai/gsm8k", type=str, - help="路径到下载的本地目录", + help="Path to the local directory where the dataset will be downloaded", ) args = parser.parse_args() @@ -26,7 +25,6 @@ time.sleep(2) -from beast_logger import print_list downloaded = [] for item in glob.glob(os.path.join(args.path, "**", "*")): @@ -55,4 +53,4 @@ def display_dataset(dataset_name, dataset_iter, header): print(f"Error loading dataset {args.target}: {e}") -# python -m scripts.download_dataset --path='/root/data/gsm8k' --target='openai/gsm8k' +# python -m scripts.download_dataset --path='./dataset/openai/gsm8k' --target='openai/gsm8k' diff --git a/scripts/download_model.py b/scripts/download_model.py index da48f069..45ce6008 100644 --- a/scripts/download_model.py +++ b/scripts/download_model.py @@ -4,9 +4,9 @@ from loguru import logger from modelscope import snapshot_download - cache_dir = input("model path ( /mnt/data/model_cache/modelscope/hub/Qwen ): ").strip() + cache_dir = input("model path (./modelscope_cache): ").strip() if not cache_dir: - cache_dir = "/mnt/data/model_cache/modelscope/hub/Qwen" + cache_dir = "./modelscope_cache" res = snapshot_download(input("model name: ").strip(), cache_dir=cache_dir) logger.success(res) @@ -14,14 +14,13 @@ import os import subprocess - os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" repo_name = input("model name: ").strip() command = ["huggingface-cli", "download", "--resume-download", repo_name] process = subprocess.run(command, env=os.environ, check=True) if process.returncode == 0: - print(f"成功下载 {repo_name}") + print(f"Download {repo_name} succeeded") else: - print(f"下载 {repo_name} 失败") + print(f"Download {repo_name} failed") # python -m scripts.download_model # Qwen/Qwen3-0.6B diff --git a/scripts/install_vllm_sglang_mcore.sh b/scripts/install_vllm_sglang_mcore.sh deleted file mode 100644 index e8064769..00000000 --- a/scripts/install_vllm_sglang_mcore.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -USE_MEGATRON=${USE_MEGATRON:-1} -USE_SGLANG=${USE_SGLANG:-1} - -export MAX_JOBS=32 - -echo "1. install inference frameworks and pytorch they need" -if [ $USE_SGLANG -eq 1 ]; then - pip install "sglang[all]==0.4.6.post1" --no-cache-dir --find-links https://flashinfer.ai/whl/cu124/torch2.6/flashinfer-python && pip install torch-memory-saver --no-cache-dir -fi -pip install --no-cache-dir "vllm==0.8.5.post1" "torch==2.6.0" "torchvision==0.21.0" "torchaudio==2.6.0" "tensordict==0.6.2" torchdata - -echo "2. install basic packages" -pip install "transformers[hf_xet]>=4.51.0" accelerate datasets peft hf-transfer \ - "numpy<2.0.0" "pyarrow>=15.0.0" pandas \ - ray[default] codetiming hydra-core pylatexenc qwen-vl-utils wandb dill pybind11 liger-kernel mathruler \ - pytest py-spy pyext pre-commit ruff - -pip install "nvidia-ml-py>=12.560.30" "fastapi[standard]>=0.115.0" "optree>=0.13.0" "pydantic>=2.9" "grpcio>=1.62.1" - - -echo "3. install FlashAttention and FlashInfer" -# Install flash-attn-2.7.4.post1 (cxx11abi=False) -wget -nv https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp310-cp310-linux_x86_64.whl && \ - pip install --no-cache-dir flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp310-cp310-linux_x86_64.whl - -# Install flashinfer-0.2.2.post1+cu124 (cxx11abi=False) -# vllm-0.8.3 does not support flashinfer>=0.2.3 -# see https://github.com/vllm-project/vllm/pull/15777 -wget -nv https://github.com/flashinfer-ai/flashinfer/releases/download/v0.2.2.post1/flashinfer_python-0.2.2.post1+cu124torch2.6-cp38-abi3-linux_x86_64.whl && \ - pip install --no-cache-dir flashinfer_python-0.2.2.post1+cu124torch2.6-cp38-abi3-linux_x86_64.whl - - -if [ $USE_MEGATRON -eq 1 ]; then - echo "4. install TransformerEngine and Megatron" - echo "Notice that TransformerEngine installation can take very long time, please be patient" - NVTE_FRAMEWORK=pytorch pip3 install --no-deps git+https://github.com/NVIDIA/TransformerEngine.git@v2.2 - pip3 install --no-deps git+https://github.com/NVIDIA/Megatron-LM.git@core_v0.12.0rc3 -fi - - -echo "5. May need to fix opencv" -pip install opencv-python -pip install opencv-fixer && \ - python -c "from opencv_fixer import AutoFix; AutoFix()" - - -if [ $USE_MEGATRON -eq 1 ]; then - echo "6. Install cudnn python package (avoid being overridden)" - pip install nvidia-cudnn-cu12==9.8.0.87 -fi - -echo "Successfully installed all packages" diff --git a/scripts/requirements_trinity.txt b/scripts/requirements_trinity.txt deleted file mode 100644 index c6ebeca5..00000000 --- a/scripts/requirements_trinity.txt +++ /dev/null @@ -1,262 +0,0 @@ -absl-py==2.3.1 -accelerate==1.11.0 -agentscope==1.0.6 -aiohappyeyeballs==2.6.1 -aiohttp==3.13.1 -aiohttp-cors==0.8.1 -aioitertools==0.12.0 -aiosignal==1.4.0 -altair==5.5.0 -annotated-doc==0.0.2 -annotated-types==0.7.0 -anthropic==0.71.0 -antlr4-python3-runtime==4.9.3 -anyio==4.11.0 -astor==0.8.1 -async-timeout==5.0.1 -attrs==25.4.0 -beast-logger -scikit-learn -bidict==0.23.1 -blake3==1.0.8 -blinker==1.9.0 -boto3==1.40.63 -botocore==1.40.63 -cached-property==2.0.1 -cachetools==6.2.1 -cbor2==5.7.0 -certifi==2025.10.5 -cffi==2.0.0 -charset-normalizer==3.4.4 -click==8.2.1 -cloudpickle==3.1.1 -codetiming==1.4.0 -colorful==0.5.7 -compressed-tensors==0.11.0 -cryptography==46.0.3 -cupy-cuda12x==13.6.0 -dashscope==1.24.8 -datasets==4.3.0 -debugpy==1.8.17 -depyf==0.19.0 -dill==0.4.0 -diskcache==5.6.3 -distlib==0.4.0 -distro==1.9.0 -dnspython==2.8.0 -docstring-parser==0.17.0 -einops==0.8.1 -email-validator==2.3.0 -exceptiongroup==1.3.0 -fastapi==0.120.0 -fastapi-cli==0.0.14 -fastapi-cloud-cli==0.3.1 -fastrlock==0.8.3 -filelock==3.20.0 -fire==0.7.1 -flask==3.1.2 -frozendict==2.4.6 -frozenlist==1.8.0 -fsspec==2025.9.0 -gguf==0.17.1 -gitdb==4.0.12 -gitpython==3.1.45 -google-api-core==2.27.0 -google-auth==2.41.1 -googleapis-common-protos==1.71.0 -greenlet==3.2.4 -grpcio==1.76.0 -h11==0.16.0 -hf-xet==1.1.10 -httpcore==1.0.9 -httptools==0.7.1 -httpx==0.28.1 -httpx-sse==0.4.3 -huggingface-hub==0.36.0 -hydra-core==1.3.2 -idna==3.11 -importlib-metadata==8.7.0 -interegular==0.3.3 -itsdangerous==2.2.0 -jieba==0.42.1 -jinja2==3.1.6 -jiter==0.11.1 -jmespath==1.0.1 -json-repair==0.52.3 -json5==0.12.1 -jsonlines==4.0.0 -jsonschema==4.25.1 -jsonschema-specifications==2025.9.1 -lark==1.2.2 -latex2sympy2-extended==1.10.2 -llguidance==0.7.30 -llvmlite==0.44.0 -lm-format-enforcer==0.11.3 -loguru==0.7.3 -markdown==3.9 -markdown-it-py==4.0.0 -markupsafe==3.0.3 -math-verify==0.8.0 -mcp==1.19.0 -mdurl==0.1.2 -mistral-common==1.8.5 -modelscope==1.31.0 -mpmath==1.3.0 -msgpack==1.1.2 -msgspec==0.19.0 -multidict==6.7.0 -multiprocess==0.70.16 -narwhals==2.9.0 -networkx==3.4.2 -ninja==1.13.0 -numba==0.61.2 -numpy==1.26.4 -nvidia-cublas-cu12==12.8.4.1 -nvidia-cuda-cupti-cu12==12.8.90 -nvidia-cuda-nvrtc-cu12==12.8.93 -nvidia-cuda-runtime-cu12==12.8.90 -nvidia-cudnn-cu12==9.10.2.21 -nvidia-cufft-cu12==11.3.3.83 -nvidia-cufile-cu12==1.13.1.3 -nvidia-curand-cu12==10.3.9.90 -nvidia-cusolver-cu12==11.7.3.90 -nvidia-cusparse-cu12==12.5.8.93 -nvidia-cusparselt-cu12==0.7.1 -nvidia-ml-py==13.580.82 -nvidia-nccl-cu12==2.27.3 -nvidia-nvjitlink-cu12==12.8.93 -nvidia-nvtx-cu12==12.8.90 -omegaconf==2.3.0 -openai==2.6.0 -openai-harmony==0.0.4 -opencensus==0.11.4 -opencensus-context==0.1.3 -opencv-python-headless==4.11.0.86 -opentelemetry-api==1.38.0 -opentelemetry-exporter-otlp==1.38.0 -opentelemetry-exporter-otlp-proto-common==1.38.0 -opentelemetry-exporter-otlp-proto-grpc==1.38.0 -opentelemetry-exporter-otlp-proto-http==1.38.0 -opentelemetry-exporter-prometheus==0.59b0 -opentelemetry-proto==1.38.0 -opentelemetry-sdk==1.38.0 -opentelemetry-semantic-conventions==0.59b0 -orjson==3.11.3 -outlines-core==0.2.11 -packaging==25.0 -pandas==2.3.3 -partial-json-parser==0.2.1.1.post6 -peft==0.17.1 -pillow==11.3.0 -platformdirs==4.5.0 -prettytable==3.16.0 -prometheus-client==0.23.1 -prometheus-fastapi-instrumentator==7.1.0 -propcache==0.4.1 -proto-plus==1.26.1 -protobuf==6.33.0 -psutil==7.1.1 -psycopg2-binary==2.9.11 -py-cpuinfo==9.0.0 -py-spy==0.4.1 -pyarrow==21.0.0 -pyasn1==0.6.1 -pyasn1-modules==0.4.2 -pybase64==1.4.2 -pybind11==3.0.1 -pycountry==24.6.1 -pycparser==2.23 -pydantic==2.12.3 -pydantic-core==2.41.4 -pydantic-extra-types==2.10.6 -pydantic-settings==2.11.0 -pydeck==0.9.1 -pyecharts==2.0.9 -pygments==2.19.2 -pylatexenc==2.10 -python-datauri==3.0.2 -python-dateutil==2.9.0.post0 -python-dotenv==1.1.1 -python-engineio==4.12.3 -python-json-logger==4.0.0 -python-multipart==0.0.20 -python-socketio==5.14.2 -pytz==2025.2 -pyvers==0.1.0 -pyyaml==6.0.3 -pyzmq==27.1.0 -ray==2.50.1 -referencing==0.37.0 -regex==2025.10.23 -requests==2.32.5 -rich==13.9.4 -rich-toolkit==0.15.1 -rignore==0.7.1 -rpds-py==0.28.0 -rsa==4.9.1 -s3transfer==0.14.0 -safetensors==0.6.2 -scipy==1.15.3 -sentencepiece==0.2.1 -sentry-sdk==2.42.1 -setproctitle==1.3.7 -setuptools==80.9.0 -shellingham==1.5.4 -shortuuid==1.0.13 -simple-websocket==1.1.0 -simplejson==3.20.2 -six==1.17.0 -smart-open==7.4.1 -smmap==5.0.2 -sniffio==1.3.1 -sortedcontainers==2.4.0 -sounddevice==0.5.3 -soundfile==0.13.1 -soxr==1.0.0 -sqlalchemy==2.0.44 -sse-starlette==3.0.2 -starlette==0.48.0 -streamlit==1.50.0 -swanlab==0.6.13 -sympy==1.14.0 -tenacity==9.1.2 -tensorboard==2.20.0 -tensorboard-data-server==0.7.2 -tensordict==0.9.1 -termcolor==3.1.0 -tiktoken==0.12.0 -tokenizers==0.22.1 -toml==0.10.2 -torch==2.8.0 -torchaudio==2.8.0 -torchdata==0.11.0 -torchvision==0.23.0 -tornado==6.5.2 -tqdm==4.67.1 -transformers==4.57.1 -triton==3.4.0 -typer==0.20.0 -typing-extensions==4.15.0 -typing-inspection==0.4.2 -tzdata==2025.2 -urllib3==2.5.0 -uvicorn==0.38.0 -uvloop==0.22.1 -verl==0.5.0 -virtualenv==20.35.3 -vllm==0.10.2 -wandb==0.22.2 -watchdog==6.0.0 -watchfiles==1.1.1 -wcwidth==0.2.14 -websocket-client==1.9.0 -websockets==15.0.1 -werkzeug==3.1.3 -word2number==1.1 -wrapt==2.0.0 -wsproto==1.2.0 -xformers==0.0.32.post1 -xgrammar==0.1.23 -xxhash==3.6.0 -yarl==1.22.0 -zipp==3.23.0 diff --git a/scripts/requirements_verl.txt b/scripts/requirements_verl.txt deleted file mode 100644 index abd2afd7..00000000 --- a/scripts/requirements_verl.txt +++ /dev/null @@ -1,297 +0,0 @@ -absl-py==2.3.1 -accelerate==1.10.0 -agentscope -aiohappyeyeballs==2.6.1 -aiohttp==3.13.2 -aiohttp-cors==0.8.1 -aioitertools==0.13.0 -aiosignal==1.4.0 -airportsdata==20250706 -annotated-types==0.7.0 -anthropic==0.72.0 -antlr4-python3-runtime==4.9.3 -anyio==4.11.0 -astor==0.8.1 -asttokens==3.0.0 -async-timeout==5.0.1 -attrs==25.4.0 -av==15.0.0 -beast-logger -scikit-learn -bidict==0.23.1 -blake3==1.0.5 -blobfile==3.0.0 -boto3==1.40.6 -botocore==1.40.6 -build==1.3.0 -cached-property==2.0.1 -cachetools==5.5.2 -cbor2==5.6.5 -certifi==2025.10.5 -cffi==2.0.0 -cfgv==3.4.0 -charset-normalizer==3.4.4 -click==8.2.1 -cloudpickle==3.1.1 -codetiming==1.4.0 -colorful==0.5.7 -compressed-tensors==0.10.2 -cryptography==46.0.3 -cuda-bindings==13.0.0 -cuda-pathfinder==1.1.0 -cuda-python==13.0.0 -cupy-cuda12x==13.5.1 -dashscope==1.25.0 -datasets==4.0.0 -debugpy==1.8.17 -decorator==5.2.1 -decord==0.6.0 -deprecated==1.2.18 -depyf==0.19.0 -dill==0.3.8 -diskcache==5.6.3 -distlib==0.4.0 -distro==1.9.0 -dnspython==2.7.0 -docstring-parser==0.17.0 -einops==0.8.1 -email-validator==2.2.0 -exceptiongroup==1.3.0 -executing==2.2.0 -fastapi==0.116.1 -fastapi-cli==0.0.8 -fastapi-cloud-cli==0.1.5 -fastrlock==0.8.3 -filelock==3.18.0 -flashinfer-python==0.2.9rc2 -frozendict==2.4.6 -frozenlist==1.8.0 -fsspec==2025.3.0 -gguf==0.17.1 -gitdb==4.0.12 -gitpython==3.1.45 -google-api-core==2.25.1 -google-auth==2.40.3 -googleapis-common-protos==1.72.0 -grpcio==1.76.0 -h11==0.16.0 -hf-transfer==0.1.9 -hf-xet==1.1.7 -httpcore==1.0.9 -httptools==0.6.4 -httpx==0.28.1 -httpx-sse==0.4.3 -huggingface-hub==0.35.0rc0 -hydra-core==1.3.2 -identify==2.6.13 -idna==3.11 -importlib-metadata==8.7.0 -iniconfig==2.1.0 -interegular==0.3.3 -ipython==8.37.0 -jedi==0.19.2 -jieba==0.42.1 -jinja2==3.1.6 -jiter==0.12.0 -jmespath==1.0.1 -json-repair==0.53.0 -json5==0.12.1 -jsonschema==4.25.1 -jsonschema-specifications==2025.9.1 -lark==1.2.2 -latex2sympy2-extended==1.10.2 -liger-kernel==0.6.1 -litellm==1.75.4 -llguidance==0.7.30 -llvmlite==0.44.0 -lm-format-enforcer==0.10.12 -loguru==0.7.3 -lxml==6.0.0 -markdown==3.8.2 -markdown-it-py==3.0.0 -markupsafe==3.0.2 -math-verify==0.8.0 -mathruler==0.1.0 -matplotlib-inline==0.1.7 -mcp==1.21.0 -mdurl==0.1.2 -mistral-common==1.8.3 -modelscope==1.28.2 -mpmath==1.3.0 -msgpack==1.1.1 -msgspec==0.19.0 -multidict==6.7.0 -multiprocess==0.70.16 -nest-asyncio==1.6.0 -networkx==3.4.2 -ninja==1.11.1.4 -nodeenv==1.9.1 -numba==0.61.2 -numpy==2.2.6 -nvidia-cublas-cu12==12.6.4.1 -nvidia-cuda-cupti-cu12==12.6.80 -nvidia-cuda-nvrtc-cu12==12.6.77 -nvidia-cuda-runtime-cu12==12.6.77 -nvidia-cudnn-cu12==9.5.1.17 -nvidia-cudnn-frontend==1.13.0 -nvidia-cufft-cu12==11.3.0.4 -nvidia-cufile-cu12==1.11.1.6 -nvidia-curand-cu12==10.3.7.77 -nvidia-cusolver-cu12==11.7.1.2 -nvidia-cusparse-cu12==12.5.4.2 -nvidia-cusparselt-cu12==0.6.3 -nvidia-ml-py==12.575.51 -nvidia-nccl-cu12==2.26.2 -nvidia-nvjitlink-cu12==12.6.85 -nvidia-nvshmem-cu12==3.3.20 -nvidia-nvtx-cu12==12.6.77 -omegaconf==2.3.0 -openai==2.7.2 -opencensus==0.11.4 -opencensus-context==0.1.3 -opencv-python-headless==4.11.0.86 -opentelemetry-api==1.38.0 -opentelemetry-exporter-otlp==1.38.0 -opentelemetry-exporter-otlp-proto-common==1.38.0 -opentelemetry-exporter-otlp-proto-grpc==1.38.0 -opentelemetry-exporter-otlp-proto-http==1.38.0 -opentelemetry-exporter-prometheus==0.57b0 -opentelemetry-proto==1.38.0 -opentelemetry-sdk==1.38.0 -opentelemetry-semantic-conventions==0.59b0 -opentelemetry-semantic-conventions-ai==0.4.12 -orjson==3.11.1 -outlines==0.1.11 -outlines-core==0.2.10 -packaging==25.0 -pandas==2.3.1 -parso==0.8.4 -partial-json-parser==0.2.1.1.post6 -peft==0.17.0 -pexpect==4.9.0 -pillow==11.3.0 -pip==25.2 -platformdirs==4.3.8 -pluggy==1.6.0 -pre-commit==4.3.0 -prettytable==3.16.0 -prometheus-client==0.22.1 -prometheus-fastapi-instrumentator==7.1.0 -prompt-toolkit==3.0.51 -propcache==0.4.1 -proto-plus==1.26.1 -protobuf==6.33.0 -psutil==7.0.0 -ptyprocess==0.7.0 -pure-eval==0.2.3 -py-cpuinfo==9.0.0 -py-spy==0.4.1 -pyarrow==21.0.0 -pyasn1==0.6.1 -pyasn1-modules==0.4.2 -pybase64==1.4.2 -pybind11==3.0.0 -pycountry==24.6.1 -pycparser==2.23 -pycryptodomex==3.23.0 -pydantic==2.12.4 -pydantic-core==2.41.5 -pydantic-extra-types==2.10.5 -pydantic-settings==2.12.0 -pyecharts==2.0.8 -pyext==0.7 -pygments==2.19.2 -pyjwt==2.10.1 -pylatexenc==2.10 -pynvml==12.0.0 -pyproject-hooks==1.2.0 -pytest==8.4.1 -python-datauri==3.0.2 -python-dateutil==2.9.0.post0 -python-dotenv==1.2.1 -python-engineio==4.12.3 -python-json-logger==3.3.0 -python-multipart==0.0.20 -python-socketio==5.14.3 -pytz==2025.2 -pyvers==0.1.0 -pyyaml==6.0.2 -pyzmq==27.0.1 -qwen-vl-utils==0.0.11 -ray==2.48.0 -referencing==0.37.0 -regex==2025.11.3 -requests==2.32.5 -rich==13.9.4 -rich-toolkit==0.14.9 -rignore==0.6.4 -ring-flash-attn==0.1.8 -rpds-py==0.28.0 -rsa==4.9.1 -ruff==0.12.8 -s3transfer==0.13.1 -safetensors==0.6.2 -scipy==1.15.3 -sentencepiece==0.2.0 -sentry-sdk==2.34.1 -setproctitle==1.3.6 -setuptools==80.9.0 -sgl-kernel==0.2.4 -sglang==0.4.9.post6 -shellingham==1.5.4 -shortuuid==1.0.13 -simple-websocket==1.1.0 -simplejson==3.20.1 -six==1.17.0 -smart-open==7.3.0.post1 -smmap==5.0.2 -sniffio==1.3.1 -sounddevice==0.5.3 -soundfile==0.13.1 -soxr==0.5.0.post1 -sse-starlette==3.0.3 -stack-data==0.6.3 -starlette==0.50.0 -swankit==0.2.4 -swanlab==0.6.8 -sympy==1.14.0 -tensorboard==2.20.0 -tensorboard-data-server==0.7.2 -tensordict==0.9.1 -tiktoken==0.12.0 -timm==1.0.16 -tokenizers==0.21.4 -tomli==2.2.1 -torch==2.7.1 -torch-memory-saver==0.0.8 -torchao==0.9.0 -torchaudio==2.7.1 -torchdata==0.11.0 -torchvision==0.22.1 -tqdm==4.67.1 -traitlets==5.14.3 -transformers==4.54.0 -triton==3.3.1 -typer==0.16.0 -typing-extensions==4.15.0 -typing-inspection==0.4.2 -tzdata==2025.2 -urllib3==2.5.0 -uvicorn==0.38.0 -uvloop==0.21.0 -virtualenv==20.33.1 -vllm==0.10.0 -wandb==0.21.1 -watchfiles==1.1.0 -wcwidth==0.2.13 -websocket-client==1.9.0 -websockets==15.0.1 -werkzeug==3.1.3 -wrapt==1.17.2 -wsproto==1.2.0 -xformers==0.0.31 -xgrammar==0.1.21 -xxhash==3.5.0 -yarl==1.22.0 -zipp==3.23.0 -debugpy>=1.8.0 diff --git a/scripts/tar_and_copy.sh b/scripts/tar_and_copy.sh deleted file mode 100755 index e5e67868..00000000 --- a/scripts/tar_and_copy.sh +++ /dev/null @@ -1,4 +0,0 @@ -cd ../ -gtar -cvzf astuner.tar.gz ASTune -#scp astuner.tar.gz jinli.yl@11.160.132.45:/home/jinli.yl/jinli_mnt2/workspace/ -scp -P 1016 astuner.tar.gz root@8.130.105.202:/mnt/data/jinli.yl/ diff --git a/scripts/untar.sh b/scripts/untar.sh deleted file mode 100644 index c2fa9091..00000000 --- a/scripts/untar.sh +++ /dev/null @@ -1 +0,0 @@ -rm -rf ASTune && tar -xzvf astuner.tar.gz From 3c444632172701c7f4810651ea2a24feea669df8 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 19:49:56 +0800 Subject: [PATCH 215/462] fix trinity backbone Former-commit-id: 037592bb34aa20842ce6f9748fd9556f99765d54 --- astuner/backbone/__init__.py | 12 +++++++++++- astuner/backbone/trinity_compat_workflow.py | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/astuner/backbone/__init__.py b/astuner/backbone/__init__.py index 0b3f7cb8..ae987caa 100644 --- a/astuner/backbone/__init__.py +++ b/astuner/backbone/__init__.py @@ -1,6 +1,16 @@ from loguru import logger try: - pass + from astune.backbone.trinity_compat_workflow import ( + ASTunerTaskReader, + ASTunetWorkflowWrap, + TrinityCompatWorkflow, + ) + + __all__ = [ + "TrinityCompatWorkflow", + "ASTunetWorkflowWrap", + "ASTunerTaskReader", + ] except ImportError: logger.warning("trinity is not available.") diff --git a/astuner/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py index 148f2a99..cab08df5 100644 --- a/astuner/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -92,7 +92,7 @@ async def run_in_new_thread(self) -> MultiAgentContextTracking: ) -@WORKFLOWS.register_module("astune_workflow") +@WORKFLOWS.register_module("astuner_workflow") class ASTunetWorkflowWrap(Workflow): is_async: bool = True @@ -206,7 +206,7 @@ async def run_async(self): try: @READER.register_module("astuner") - class AstuneTaskReader(TaskFileReader): + class ASTunerTaskReader(TaskFileReader): def __init__(self, config): self.config = config self.read_batch_size = config.batch_size From f5099f2d7f3ff4b93fff896e4ed5963a413df695 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 19:59:22 +0800 Subject: [PATCH 216/462] move launcher to cli Former-commit-id: 5cea026f5fb6f90f1563d7a1c8b85d53c7e41eda --- astuner/cli/__init__.py | 0 launcher.py => astuner/cli/launcher.py | 0 pyproject.toml | 3 +++ 3 files changed, 3 insertions(+) create mode 100644 astuner/cli/__init__.py rename launcher.py => astuner/cli/launcher.py (100%) diff --git a/astuner/cli/__init__.py b/astuner/cli/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/launcher.py b/astuner/cli/launcher.py similarity index 100% rename from launcher.py rename to astuner/cli/launcher.py diff --git a/pyproject.toml b/pyproject.toml index 4024310d..fc133723 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,9 @@ doc = [ "furo>=2025.7.19", ] +[project.scripts] +astuner = "astuner.cli.launcher:main" + [tool.setuptools.packages.find] where = ["."] From 22ee93a693b7bff7477cba8dd14bda31730cb2aa Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 20:05:33 +0800 Subject: [PATCH 217/462] move launcher to cli Former-commit-id: b82b247ae21805a3f16d835f8154d46417cbbf1a --- tutorial/example_appworld/appworld.md | 10 +++++----- tutorial/example_feedback_tracing/README.md | 2 +- tutorial/example_math_agent/math_agent.md | 10 +++++----- tutorial/example_math_agent/math_agent_verl.yaml | 2 +- tutorial/example_rubrics_judge/math_agent.md | 10 +++++----- tutorial/example_werewolves/werewolves.md | 12 ++++++------ 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 2339c855..0364d24c 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -83,8 +83,8 @@ astuner 4.2 全链路调试(脱离ray快速调试:--backbone='debug') ```bash -# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) -clear && python launcher.py --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview +# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( astuner --kill="python|ray" ) +clear && astuner --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: @@ -97,7 +97,7 @@ clear && python launcher.py --conf tutorial/example_appworld/appworld.yaml --bac "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "program": "astuner/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -114,8 +114,8 @@ clear && python launcher.py --conf tutorial/example_appworld/appworld.yaml --bac 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash -# 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' +# 建议开始前杀死所有ray、vllm、env_service进程 ( astuner --kill="python|ray|vllm" ) +astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ``` diff --git a/tutorial/example_feedback_tracing/README.md b/tutorial/example_feedback_tracing/README.md index 892f58cd..203970a0 100644 --- a/tutorial/example_feedback_tracing/README.md +++ b/tutorial/example_feedback_tracing/README.md @@ -38,7 +38,7 @@ An example database and configuration file are provided under When everything is ready, start the training with: ```bash -python launcher.py --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray +astuner --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray ``` ## 3. Deploying the New Agent diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index 7187e89f..4bafe950 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -109,9 +109,9 @@ astuner 4.2 全链路调试(脱离ray快速调试:--backbone='debug') ```bash -# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) +# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( astuner --kill="python|ray" ) clear && \ -python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: ```json @@ -123,7 +123,7 @@ python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "program": "astuner/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -139,8 +139,8 @@ python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash -# 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +# 建议开始前杀死所有ray、vllm、env_service进程 ( astuner --kill="python|ray|vllm" ) +astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` diff --git a/tutorial/example_math_agent/math_agent_verl.yaml b/tutorial/example_math_agent/math_agent_verl.yaml index 1aafaf1b..6f7ff3c1 100644 --- a/tutorial/example_math_agent/math_agent_verl.yaml +++ b/tutorial/example_math_agent/math_agent_verl.yaml @@ -43,7 +43,7 @@ astuner: test_freq: 99999 total_epochs: 99999 -# python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' +# astuner --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' # ------------------ 不需要修改 ------------------ hydra: diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index 9023606e..c9e0c7e0 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -109,9 +109,9 @@ astuner 4.2 全链路调试(脱离ray快速调试:--backbone='debug') ```bash -# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) +# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( astuner --kill="python|ray" ) clear && \ -python launcher.py --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: ```json @@ -123,7 +123,7 @@ python launcher.py --conf tutorial/example_rubrics_judge/math_agent.yaml --backb "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "program": "astuner/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -139,8 +139,8 @@ python launcher.py --conf tutorial/example_rubrics_judge/math_agent.yaml --backb 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash -# 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) -python launcher.py --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='trinity' --with-ray +# 建议开始前杀死所有ray、vllm、env_service进程 ( astuner --kill="python|ray|vllm" ) +astuner --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='trinity' --with-ray ``` diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index 83b1fc16..5c0cd847 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -53,8 +53,8 @@ - 全链路调试(脱离ray快速调试:--backbone='debug') ```bash - # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( python launcher.py --kill="python|ray" ) - python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview + # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( astuner --kill="python|ray" ) + astuner --kill="python|ray|vllm|VLLM" && ray stop && clear && astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: @@ -67,7 +67,7 @@ "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "program": "astuner/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -83,9 +83,9 @@ - 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash - # 建议开始前杀死所有ray、vllm、env_service进程 ( python launcher.py --kill="python|ray|vllm" ) - python launcher.py --kill="python|ray|vllm|VLLM" && ray stop && clear && \ - python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray + # 建议开始前杀死所有ray、vllm、env_service进程 ( astuner --kill="python|ray|vllm" ) + astuner --kill="python|ray|vllm|VLLM" && ray stop && clear && \ + astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray ``` From 670bd5aa63d8269557fce74d097911cef7458309 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 20:53:11 +0800 Subject: [PATCH 218/462] fix trinity backbone Former-commit-id: eb7d765109526bd7cc5e35d987242dd606c5e3d4 --- astuner/backbone/__init__.py | 6 +++--- astuner/backbone/trinity_compat_workflow.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/astuner/backbone/__init__.py b/astuner/backbone/__init__.py index ae987caa..50fa238a 100644 --- a/astuner/backbone/__init__.py +++ b/astuner/backbone/__init__.py @@ -1,15 +1,15 @@ from loguru import logger try: - from astune.backbone.trinity_compat_workflow import ( + from astuner.backbone.trinity_compat_workflow import ( ASTunerTaskReader, - ASTunetWorkflowWrap, + ASTunerWorkflowWrap, TrinityCompatWorkflow, ) __all__ = [ "TrinityCompatWorkflow", - "ASTunetWorkflowWrap", + "ASTunerWorkflowWrap", "ASTunerTaskReader", ] except ImportError: diff --git a/astuner/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py index cab08df5..1242b919 100644 --- a/astuner/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -93,7 +93,7 @@ async def run_in_new_thread(self) -> MultiAgentContextTracking: @WORKFLOWS.register_module("astuner_workflow") -class ASTunetWorkflowWrap(Workflow): +class ASTunerWorkflowWrap(Workflow): is_async: bool = True def __init__( From e1e92a0b0d75bbd26acdcc40dba04b226870d091 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 21:08:22 +0800 Subject: [PATCH 219/462] fix trinity backbone Former-commit-id: f703970af804d416f722b406bbcd21a49d2e86d2 --- astuner/main_trinity.py | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/astuner/main_trinity.py b/astuner/main_trinity.py index b324d2a5..fb23ebf7 100644 --- a/astuner/main_trinity.py +++ b/astuner/main_trinity.py @@ -30,11 +30,31 @@ logger = get_logger(__name__) +def get_explorer(config: Config, runtime_env: dict): + return ray.remote(Explorer).options( + name=config.explorer.name, + namespace=ray.get_runtime_context().namespace, + runtime_env={ + "env_vars": runtime_env, + }, + ).remote(config) + + +def get_trainer(config: Config, runtime_env: dict): + return ray.remote(Trainer).options( + name=config.trainer.name, + namespace=ray.get_runtime_context().namespace, + runtime_env={ + "env_vars": runtime_env, + }, + ).remote(config) + + def bench(config: Config) -> None: """Evaluate model.""" config.explorer.name = "benchmark" try: - explorer = Explorer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) + explorer = get_explorer(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get(explorer.prepare.remote()) ray.get(explorer.benchmark.remote()) logger.info("Benchmark finished.") @@ -46,7 +66,7 @@ def bench(config: Config) -> None: def explore(config: Config) -> None: """Run explorer.""" try: - explorer = Explorer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) + explorer = get_explorer(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get(explorer.prepare.remote()) ray.get(explorer.sync_weight.remote()) ray.get(explorer.explore.remote()) @@ -58,7 +78,7 @@ def explore(config: Config) -> None: def train(config: Config) -> None: """Run trainer.""" try: - trainer = Trainer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) + trainer = get_trainer(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get(trainer.prepare.remote()) ray.get(trainer.sync_weight.remote()) ray.get(trainer.train.remote()) @@ -70,7 +90,7 @@ def train(config: Config) -> None: def serve(config: Config) -> None: """Run explorer in server mode.""" try: - explorer = Explorer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) + explorer = get_explorer(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get(explorer.prepare.remote()) ray.get(explorer.sync_weight.remote()) ray.get(explorer.serve.remote()) @@ -90,8 +110,8 @@ def both(config: Config) -> None: algorithms and tasks. """ try: - explorer = Explorer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) - trainer = Trainer.get_actor(config, runtime_env=get_runtime_env(is_trinity=True)) + explorer = get_explorer(config, runtime_env=get_runtime_env(is_trinity=True)) + trainer = get_trainer(config, runtime_env=get_runtime_env(is_trinity=True)) ray.get([explorer.__ray_ready__.remote(), trainer.__ray_ready__.remote()]) ray.get( [ From c9d22b93e43cafbfffccfa8862d24719c86c29e8 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Thu, 27 Nov 2025 21:12:29 +0800 Subject: [PATCH 220/462] fix trinity backbone Former-commit-id: e06e4453e6258d82e9634843e299be9025fd05ba --- astuner/default_config/trinity/trinity_default.yaml | 3 +-- astuner/main_trinity.py | 8 ++------ astuner/utils/core_env_vars.py | 4 ++++ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/astuner/default_config/trinity/trinity_default.yaml b/astuner/default_config/trinity/trinity_default.yaml index a2948d2f..ee21381d 100644 --- a/astuner/default_config/trinity/trinity_default.yaml +++ b/astuner/default_config/trinity/trinity_default.yaml @@ -53,8 +53,7 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 max_model_len: 16000 max_response_tokens: 16000 monitor: - monitor_type: swanlab - # monitor_type: tensorboard + monitor_type: tensorboard synchronizer: sync_interval: 1 sync_method: nccl diff --git a/astuner/main_trinity.py b/astuner/main_trinity.py index fb23ebf7..99c0b1c5 100644 --- a/astuner/main_trinity.py +++ b/astuner/main_trinity.py @@ -34,9 +34,7 @@ def get_explorer(config: Config, runtime_env: dict): return ray.remote(Explorer).options( name=config.explorer.name, namespace=ray.get_runtime_context().namespace, - runtime_env={ - "env_vars": runtime_env, - }, + runtime_env=runtime_env ).remote(config) @@ -44,9 +42,7 @@ def get_trainer(config: Config, runtime_env: dict): return ray.remote(Trainer).options( name=config.trainer.name, namespace=ray.get_runtime_context().namespace, - runtime_env={ - "env_vars": runtime_env, - }, + runtime_env=runtime_env ).remote(config) diff --git a/astuner/utils/core_env_vars.py b/astuner/utils/core_env_vars.py index 51614639..5676fd97 100644 --- a/astuner/utils/core_env_vars.py +++ b/astuner/utils/core_env_vars.py @@ -1,5 +1,7 @@ import os +from pathlib import Path + from beast_logger import print_dict from dotenv import load_dotenv @@ -14,6 +16,8 @@ def get_runtime_env(is_trinity: bool = False) -> dict: "NCCL_DEBUG": "WARN", "VLLM_LOGGING_LEVEL": "WARN", "TOKENIZERS_PARALLELISM": "true", + # use astuner.backbone as plugin directory + "TRINITY_PLUGIN_DIRS": str((Path(__file__).parent.parent / "backbone").resolve()), "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), "ASTUNER_CONFIG_REDIRECT": os.getenv("ASTUNER_CONFIG_REDIRECT", ""), From 4f49076e38940a167980401ef836e6462dd64530 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Fri, 28 Nov 2025 10:31:30 +0800 Subject: [PATCH 221/462] fix dockerfile Former-commit-id: f7fb09871c0945743eb76bdb27c642c5d5ad7a1b --- scripts/docker/dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/docker/dockerfile b/scripts/docker/dockerfile index 4fe07a51..b43ba8e5 100644 --- a/scripts/docker/dockerfile +++ b/scripts/docker/dockerfile @@ -34,7 +34,8 @@ RUN pip install uv # use uv to create a virtual environment and install dependencies RUN uv venv /opt/venv --python=3.12 && \ . /opt/venv/bin/activate && \ - uv pip install -e.[dev,flash_attn] + uv pip install -e.[dev] && \ + uv pip install flash_attn==2.8.1 --no-deps --no-cache-dir # set entrypoint to activate the virtual environment ENTRYPOINT ["/bin/bash", "-c", "source /opt/venv/bin/activate && exec \"$@\"", "--"] From 63f59a90791c8dfad1e6251d9ce2ed689b8fffe5 Mon Sep 17 00:00:00 2001 From: "panxuchen.pxc" Date: Fri, 28 Nov 2025 10:32:02 +0800 Subject: [PATCH 222/462] fix pre-commit Former-commit-id: cb39ddf08c8f4bdbb5fdf1fc9707e474559a1223 --- astuner/main_trinity.py | 28 ++++++++++++++++++---------- astuner/utils/core_env_vars.py | 1 - 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/astuner/main_trinity.py b/astuner/main_trinity.py index 99c0b1c5..a01b21c0 100644 --- a/astuner/main_trinity.py +++ b/astuner/main_trinity.py @@ -31,19 +31,27 @@ def get_explorer(config: Config, runtime_env: dict): - return ray.remote(Explorer).options( - name=config.explorer.name, - namespace=ray.get_runtime_context().namespace, - runtime_env=runtime_env - ).remote(config) + return ( + ray.remote(Explorer) + .options( + name=config.explorer.name, + namespace=ray.get_runtime_context().namespace, + runtime_env=runtime_env, + ) + .remote(config) + ) def get_trainer(config: Config, runtime_env: dict): - return ray.remote(Trainer).options( - name=config.trainer.name, - namespace=ray.get_runtime_context().namespace, - runtime_env=runtime_env - ).remote(config) + return ( + ray.remote(Trainer) + .options( + name=config.trainer.name, + namespace=ray.get_runtime_context().namespace, + runtime_env=runtime_env, + ) + .remote(config) + ) def bench(config: Config) -> None: diff --git a/astuner/utils/core_env_vars.py b/astuner/utils/core_env_vars.py index 5676fd97..1cf4eeb8 100644 --- a/astuner/utils/core_env_vars.py +++ b/astuner/utils/core_env_vars.py @@ -1,5 +1,4 @@ import os - from pathlib import Path from beast_logger import print_dict From 72dc65053957da7a8eab44938bba5edd05eaf492 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 28 Nov 2025 17:51:56 +0800 Subject: [PATCH 223/462] remove trash and remove chinese Former-commit-id: d20ebec369ce1abbf40b9684bf412b50599c1937 --- astuner/backbone/native_compat_trainer.py | 18 +-- .../data_generator/knowledge_augmentation.py | 2 +- .../trinity/trinity_default.yaml | 11 +- .../trinity/trinity_launch.yaml | 74 +--------- .../task_reader/tracing_reader/connector.py | 2 +- astuner/utils/color_hsl.py | 14 +- astuner/utils/env_service_client/em_client.py | 92 ------------ .../utils/env_service_client/env_client.py | 134 ------------------ .../utils/env_service_client/env_client_ng.py | 13 +- astuner/utils/launch_utils.py | 2 +- astuner/utils/message.py | 16 --- astuner/utils/n_gram.py | 28 +--- .../example_appworld/appworld_2nodes.yaml | 63 -------- .../example_feedback_tracing/database.sqlite | Bin 0 -> 28692480 bytes .../database.sqlite.REMOVED.git-id | 1 - .../example_math_agent/math_agent_verl.yaml | 62 -------- tutorial/figure/werewolves_train_witch.png | Bin 0 -> 258616 bytes 17 files changed, 43 insertions(+), 489 deletions(-) delete mode 100644 astuner/utils/env_service_client/em_client.py delete mode 100644 astuner/utils/env_service_client/env_client.py delete mode 100644 tutorial/example_appworld/appworld_2nodes.yaml create mode 100644 tutorial/example_feedback_tracing/database.sqlite delete mode 100644 tutorial/example_feedback_tracing/database.sqlite.REMOVED.git-id delete mode 100644 tutorial/example_math_agent/math_agent_verl.yaml create mode 100644 tutorial/figure/werewolves_train_witch.png diff --git a/astuner/backbone/native_compat_trainer.py b/astuner/backbone/native_compat_trainer.py index 38316e2f..a3903fb6 100644 --- a/astuner/backbone/native_compat_trainer.py +++ b/astuner/backbone/native_compat_trainer.py @@ -102,7 +102,7 @@ def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | to reward_scores_list, device=reward_tensor.device, dtype=torch.float32 ) # (bs, ) - # Use advanced indexing to assign rewards (把reward放到response的最后一个token位置) + # Use advanced indexing to assign rewards (placing reward at the last token position) reward_tensor[torch.arange(len(data)), response_lengths - 1] = reward_scores if return_dict: @@ -1712,11 +1712,11 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): num_scenarios = len(set_scenarios) repeated_success_tasks = 0 - num_all_success_tasks = 0 # n 次实验中全部success的任务数 - num_pass_n_tasks = 0 # n 次实验中至少有一次success的任务数 + num_all_success_tasks = 0 # number of tasks that is successful among all n attempts + num_pass_n_tasks = 0 # number of tasks that is successful at least once among n attempts for task_id, task_outcomes in task_results.items(): - # 计算 num_all_success_tasks # n 次实验中全部success的任务数 - # 计算 num_pass_n_tasks # n 次实验中至少有一次success的任务数 + # Calculate num_all_success_tasks # The number of tasks where all were successful in n experiments + # Calculate num_pass_n_tasks # The number of tasks where at least one was successful in n experiments assert len(task_outcomes["tag_arr"]) == pass_n if all(tag == "success" for tag in task_outcomes["tag_arr"]): num_all_success_tasks += 1 @@ -1725,13 +1725,13 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): repeated_success_tasks += task_outcomes["tag_arr"].count("success") num_all_success_scenarios = ( - 0 # 如果一个 scenario 的所有 task 都在 n 次实验中全部 success,则 num_all_success_scenarios +1 + 0 # If all tasks in a scenario are successful in all n experiments, then num_all_success_scenarios +1 ) num_pass_n_scenarios = ( - 0 # 如果一个 scenario 的所有 task 都在 n 次实验中至少有一次 success,则 num_pass_n_scenarios +1 + 0 # If all tasks in a scenario are successful in at least one of the n experiments, then num_pass_n_scenarios +1 ) repeated_num_pass_1_scenarios = ( - 0 # 按顺序排列,如果一个 scenario 的所有 task 都在第 x 次实验中 success,则 repeated_num_pass_1_scenarios +1 + 0 # In sequential order, if all tasks in a scenario are successful in the x-th experiment, then repeated_num_pass_1_scenarios +1 ) for scenario in set_scenarios: scenario_task_results = { @@ -1759,7 +1759,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): ): repeated_num_pass_1_scenarios += 1 - # 记录日志 + # record logs task_scenario_for_cmts = [_cmt.task_id.split("_")[0] for _cmt in cmts] for _cmt, scenario in zip(cmts, task_scenario_for_cmts): task_outcome = _cmt.tag diff --git a/astuner/data_generator/knowledge_augmentation.py b/astuner/data_generator/knowledge_augmentation.py index 9fadcbd5..8a4f5f29 100644 --- a/astuner/data_generator/knowledge_augmentation.py +++ b/astuner/data_generator/knowledge_augmentation.py @@ -18,7 +18,7 @@ def _build_system_prompt( source_task: Optional[Task] = None, document: Optional[Document] = None, ) -> str: - # 可从 self.config 中读取模板,这里先写死一个示例 + # The template can be read from self.config, but here we hardcode an example for now return ( "You are an Expert Question Generation Assistant.\n" "Your task is to read long, complex documents and generate a large set of high-quality, non-repetitive questions that thoroughly cover all aspects of the provided content.\n" diff --git a/astuner/default_config/trinity/trinity_default.yaml b/astuner/default_config/trinity/trinity_default.yaml index ee21381d..9be05b6d 100644 --- a/astuner/default_config/trinity/trinity_default.yaml +++ b/astuner/default_config/trinity/trinity_default.yaml @@ -1,4 +1,8 @@ -trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD + +trinity: algorithm: algorithm_type: multi_step_grpo optimizer: @@ -52,8 +56,11 @@ trinity: # 修改trinity训练参数,如果使用verl则忽略该部分 model: max_model_len: 16000 max_response_tokens: 16000 + model_path: /path/to/your/model/such/as/Qwen/Qwen2___5-14B-Instruct monitor: - monitor_type: tensorboard + monitor_type: swanlab + name: dummy_name + project: dummy_project synchronizer: sync_interval: 1 sync_method: nccl diff --git a/astuner/default_config/trinity/trinity_launch.yaml b/astuner/default_config/trinity/trinity_launch.yaml index 59cb3381..19dfa9db 100644 --- a/astuner/default_config/trinity/trinity_launch.yaml +++ b/astuner/default_config/trinity/trinity_launch.yaml @@ -1,72 +1,8 @@ -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/trinity/trinity_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/trinity/trinity_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/trinity/trinity_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD algorithm: algorithm_type: multi_step_grpo - optimizer: - lr: 1.0e-06 - repeat_times: 6 -buffer: - batch_size: 8 - explorer_input: - eval_tasksets: [] - taskset: - default_workflow_type: astuner_workflow - format: - prompt_key: question - response_key: answer - name: gsm8k - path: http://localhost:8080 - rollout_args: - temperature: 1.0 - split: train - storage_type: astuner - subset_name: appworld - total_epochs: 1000 - train_batch_size: 36 - trainer_input: - experience_buffer: - max_read_timeout: 18000 - name: agentscope_gsm8k_buffer - storage_type: queue -checkpoint_root_dir: ./trinity_checkpoints -cluster: - gpu_per_node: 8 - node_num: 1 -explorer: - eval_interval: 999999 - max_repeat_times_per_runner: 1 - max_timeout: 7200 - rollout_model: - dtype: bfloat16 - enable_auto_tool_choice: true - enable_history: true - enable_openai_api: true - enable_prefix_caching: false - enable_thinking: false - enforce_eager: true - engine_num: 2 - seed: 42 - tensor_parallel_size: 1 - tool_call_parser: hermes - runner_per_model: 12 -model: - max_model_len: 16000 - max_response_tokens: 16000 - model_path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct -monitor: - monitor_type: swanlab -name: git-math-agentscope -project: appworld_astune -synchronizer: - sync_interval: 2 - sync_method: nccl - sync_style: dynamic_by_explorer - sync_timeout: 1200 -trainer: - grad_clip: 1.0 - max_token_len_per_gpu: 16000 - save_interval: 100 - ulysses_sequence_parallel_size: 2 - use_dynamic_bsz: true + + diff --git a/astuner/task_reader/tracing_reader/connector.py b/astuner/task_reader/tracing_reader/connector.py index bc63ae80..913099e4 100644 --- a/astuner/task_reader/tracing_reader/connector.py +++ b/astuner/task_reader/tracing_reader/connector.py @@ -120,7 +120,7 @@ def parse_msg_line(line: str): try: data = ast.literal_eval(dict_like) except Exception as e: - print("解析失败:", e) + print("Parse failed:", e) return None role = data.get("role") diff --git a/astuner/utils/color_hsl.py b/astuner/utils/color_hsl.py index 7f088e92..cfd7808c 100644 --- a/astuner/utils/color_hsl.py +++ b/astuner/utils/color_hsl.py @@ -3,9 +3,9 @@ def adjust_color_hsl(base_color, logprob): """ - 使用HSL颜色空间根据logprob调整颜色饱和度 + Adjust color saturation using the HSL color space based on logprob """ - # 将logprob映射到[sat_min, sat_max]的饱和度调整因子 + # Map logprob to a saturation adjustment factor in the range [sat_min, sat_max] sat_min = 0.333 sat_max = 1.0 lp_min = -7 @@ -18,19 +18,19 @@ def adjust_color_hsl(base_color, logprob): else: saturation_factor = sat_min + (logprob - lp_min) / (lp_max - lp_min) * (sat_max - sat_min) - # 将十六进制颜色转换为RGB + # Convert hexadecimal color to RGB r = int(base_color[1:3], 16) / 255.0 g = int(base_color[3:5], 16) / 255.0 b = int(base_color[5:7], 16) / 255.0 - # 转换为HSL + # Convert to HSL h, l, s = colorsys.rgb_to_hls(r, g, b) - # 调整饱和度 + # Adjust saturation s_adjusted = s * saturation_factor - # 转换回RGB + # Convert back to RGB r_adjusted, g_adjusted, b_adjusted = colorsys.hls_to_rgb(h, l, s_adjusted) - # 转换回十六进制 + # Convert back to hexadecimal return f"#{int(r_adjusted*255):02x}{int(g_adjusted*255):02x}{int(b_adjusted*255):02x}" diff --git a/astuner/utils/env_service_client/em_client.py b/astuner/utils/env_service_client/em_client.py deleted file mode 100644 index b0909662..00000000 --- a/astuner/utils/env_service_client/em_client.py +++ /dev/null @@ -1,92 +0,0 @@ -import asyncio -import time -from typing import List - -from loguru import logger -from pydantic import Field - -from astuner.schema.trajectory import Reward, Trajectory -from astuner.utils.http_client import HttpClient - - -class EMClient(HttpClient): - base_url: str = Field(default="http://localhost:8001") - timeout: int = Field(default=1200, description="request timeout, second") - - def call_context_generator( - self, - trajectory: Trajectory, - retrieve_top_k: int = 1, - workspace_id: str = "default", - **kwargs, - ) -> str: - start_time = time.time() - self.url = self.base_url + "/context_generator" - json_data = { - "trajectory": trajectory.model_dump(), - "retrieve_top_k": retrieve_top_k, - "workspace_id": workspace_id, - "metadata": kwargs, - } - response = self.request(json_data=json_data, headers={"Content-Type": "application/json"}) - if response is None: - logger.warning("error call_context_generator") - return "" - - # TODO return raw experience instead of context @jinli - trajectory.metadata["context_time_cost"] = time.time() - start_time - return response["context_msg"]["content"] - - async def async_call_context_generator(self, executor=None, **kwargs): - loop = asyncio.get_event_loop() - - def func(): - return self.call_context_generator(**kwargs) - - return await loop.run_in_executor(executor=executor, func=func) - - def call_summarizer( - self, trajectories: List[Trajectory], workspace_id: str = "default", **kwargs - ): - start_time = time.time() - - self.url = self.base_url + "/summarizer" - json_data = { - "trajectories": [x.model_dump() for x in trajectories], - "workspace_id": workspace_id, - "metadata": kwargs, - } - response = self.request(json_data=json_data, headers={"Content-Type": "application/json"}) - if response is None: - logger.warning("error call_context_generator") - return "", time.time() - start_time - - return response["experiences"], time.time() - start_time - - async def async_call_summarizer(self, executor=None, **kwargs): - loop = asyncio.get_event_loop() - - def func(): - return self.call_summarizer(**kwargs) - - return await loop.run_in_executor(executor=executor, func=func) - - -def main(): - client = EMClient() - traj = Trajectory( - steps=[ - {"role": "user", "content": "What is the capital of France?"}, - {"role": "assistant", "content": "Paris"}, - ], - query="What is the capital of France?", - reward=Reward(outcome=1.0), - ) - workspace_id = "w_agent_enhanced" - - print(client.call_summarizer(trajectories=[traj], workspace_id=workspace_id)) - print(client.call_context_generator(traj, retrieve_top_k=3, workspace_id=workspace_id)) - - -if __name__ == "__main__": - main() diff --git a/astuner/utils/env_service_client/env_client.py b/astuner/utils/env_service_client/env_client.py deleted file mode 100644 index 19cf217a..00000000 --- a/astuner/utils/env_service_client/env_client.py +++ /dev/null @@ -1,134 +0,0 @@ -# env_client.py -from typing import Any, Dict, List - -import requests - - -class EnvClient: - def __init__(self, base_url: str = "http://localhost:8000"): - self.base_url = base_url.rstrip("/") - self.timeout = 300.0 - - def _make_request( - self, - endpoint: str, - env_type: str = "default", - task_id: str = None, - instance_id: str = None, - messages: Dict[str, Any] = None, - params: Dict[str, Any] = None, - ) -> Dict: - """统一的请求处理方法""" - url = f"{self.base_url}/{endpoint}" - data = { - "env_type": env_type, - "task_id": task_id, - "instance_id": instance_id, - "messages": messages or {}, - "params": params or {}, - } - try: - response = requests.post(url, json=data, timeout=self.timeout) - response.raise_for_status() - return response.json() - except requests.exceptions.RequestException as e: - raise Exception(f"Request failed: {str(e)}, data: {data}") - - def get_task_ids( - self, env_type: str, split: str = "train", params: dict | None = None - ) -> List[str]: - """获取任务ID列表""" - payload: dict = {"env_type": env_type} - if params: - payload["params"] = params - response = self._make_request( - endpoint="get_task_ids", env_type=env_type, params={"split": split} - ) - return response["data"] - - def get_tools_info(self, instance_id: str, messages: Dict = {}, params: Dict = {}) -> float: - """获取环境信息""" - response = self._make_request( - endpoint="get_info", - instance_id=instance_id, - messages=messages, - params=params, - ) - return response["data"] - - def create_instance( - self, - env_type: str, - task_id: str, - instance_id: str = None, - params: Dict = None, - ) -> dict: - """创建环境实例""" - response = self._make_request( - endpoint="create", - env_type=env_type, - task_id=task_id, - instance_id=instance_id, - params=params, - ) - return response["data"] - - def step(self, instance_id: str, action: Dict = {}, params: Dict = {}) -> dict: - """执行环境步骤""" - response = self._make_request( - endpoint="step", - instance_id=instance_id, - messages=action, - params=params, - ) - return response["data"] - - def evaluate(self, instance_id: str, messages: Dict = {}, params: Dict = {}) -> float: - """评估环境实例""" - response = self._make_request( - endpoint="evaluate", - instance_id=instance_id, - messages=messages, - params=params, - ) - return response["data"] - - def release_instance(self, instance_id: str) -> bool: - """释放环境实例""" - response = self._make_request(endpoint="release", instance_id=instance_id) - return response["success"] - - -# 使用示例 -def main(): - client = EnvClient() - - env_type = "appworld" - # 获取任务列表 - task_ids = client.get_task_ids(env_type) - print(f"Available tasks: {task_ids}") - - # 创建实例 - task_id = task_ids[0] - init_response = client.create_instance(env_type, task_id) - print("init state", init_response) - instance_id = init_response["info"]["instance_id"] - query = init_response["state"] - print(f"Created instance {instance_id} with query: {query}") - - # 执行动作 - action = {"role": "assistant", "content": "print('hello appworld!!')"} - result = client.step(instance_id, action) - print(f"Step result: {result}") - - # 评估 - score = client.evaluate(instance_id) - print(f"Evaluation score: {score}") - - # 释放实例 - success = client.release_instance(instance_id) - print(f"Instance released: {success}") - - -if __name__ == "__main__": - main() diff --git a/astuner/utils/env_service_client/env_client_ng.py b/astuner/utils/env_service_client/env_client_ng.py index 6fb63620..6d4dba6f 100644 --- a/astuner/utils/env_service_client/env_client_ng.py +++ b/astuner/utils/env_service_client/env_client_ng.py @@ -3,17 +3,15 @@ import os import random import time +import tempfile +import requests + from datetime import datetime from typing import Any, Callable, Dict, List, Optional -import requests - -LOG_PATH = os.environ.get("CLIENT_LOG_PATH", "/mnt/data/eric.czq/rl_log/error.out") +LOG_PATH = os.environ.get("CLIENT_LOG_PATH", os.path.join(tempfile.gettempdir(), "app_logs", "error.out")) -# map_env_type = { -# 'appworld2': 'appworld', -# } def safe_log(msg: str): try: os.makedirs(os.path.dirname(LOG_PATH), exist_ok=True) @@ -22,7 +20,7 @@ def safe_log(msg: str): f.flush() os.fsync(f.fileno()) except Exception: - pass # 防止日志写失败影响RL主进程 + pass def retry_call( @@ -99,7 +97,6 @@ def get_env_profile( max_retry: int = 3, ) -> List[str]: def call(): - # 使用新的变量名,避免修改外部参数 # resolved_env_type = map_env_type.get(env_type, env_type) response = self._make_request( endpoint="/get_env_profile", diff --git a/astuner/utils/launch_utils.py b/astuner/utils/launch_utils.py index 4465fa5b..4398729c 100644 --- a/astuner/utils/launch_utils.py +++ b/astuner/utils/launch_utils.py @@ -48,7 +48,7 @@ def start_ray_service(args, env): Args: args: Command line arguments containing debug settings """ - # 获取当前 Python 解释器目录 + # Get the current Python interpreter directory python_dir = os.path.dirname(sys.executable) ray_path = os.path.join(python_dir, "ray") companion = LaunchCommandWhenAbsent( diff --git a/astuner/utils/message.py b/astuner/utils/message.py index 66f00bcb..64cab065 100644 --- a/astuner/utils/message.py +++ b/astuner/utils/message.py @@ -1,18 +1,2 @@ def send_train_message(message: str): pass - # # 发送短信汇报训练进程 - # assert len(message) < 64, f"Message too long: {(message)}" - # if os.getenv("ALIYUN_SMS_SERVICE"): - # try: - # requests.post( - # json={ - # "phone_numbers": "18810508767", - # "server_code": "DLC", - # "error": message, - # "error_level": "无", - # }, - # url=os.getenv("ALIYUN_SMS_SERVICE", "http://localhost:8000/send-sms"), - # headers={"Content-Type": "application/json"}, - # ) - # except Exception as e: - # print(f"Failed to send sms: {e}") diff --git a/astuner/utils/n_gram.py b/astuner/utils/n_gram.py index c70600ad..bb784656 100644 --- a/astuner/utils/n_gram.py +++ b/astuner/utils/n_gram.py @@ -3,9 +3,9 @@ def preserve_chinese(text): - # 使用正则表达式匹配所有中文字符 + # Use regular expressions to match all Chinese characters chinese_chars = re.findall(r"[\u4e00-\u9fff]", text) - # 将匹配到的中文字符拼接成一个字符串 + # Concatenate the matched Chinese characters into a string return "".join(chinese_chars) @@ -55,9 +55,9 @@ def repetition_penalty_reward(completions, **kwargs) -> List[float]: rewards.append(0.0) continue - # total 是定值(句子分词长度) - # 假设 全部不重复 total = len(ngrams),scaling ~= 0, reward=0 - # 假设 全部重复 len(ngrams) = 1, scaling ~= 1, reward=-1 + # total is a fixed value (sentence tokenization length) + # Assuming no repetitions at all, total = len(ngrams), scaling ~= 0, reward = 0 + # Assuming full repetition, len(ngrams) = 1, scaling ~= 1, reward = -1 scaling = 1 - len(ngrams) / total reward = scaling * max_penalty rewards.append(reward) @@ -65,21 +65,3 @@ def repetition_penalty_reward(completions, **kwargs) -> List[float]: return repetition_penalty_reward - -if __name__ == "__main__": - for ngram_size in range(0, 100): - reward_fn = get_repetition_penalty_reward(ngram_size=ngram_size, max_penalty=-1.0) - completions = [ - [ - { - "content": "<|thought_start|>好的,我现在需要处理用户的问题:“那CPO板块未来会涨还是跌呢?”。首先,我需要回顾之前的对话历史,确保回答连贯。用户之前询问了CPO板块的当天表现,我提供了截止到2025年3月10日的收盘数据,并提到台积电计划量产CPO产品的积极信号。然后,用户问到担忧的具体内容,我解释了国际大厂发布CPO交换机可能影响利润的担忧,但也提到中际旭创等公司在积极应对,台积电也在推进技术。\n\n现在用户直接问CPO板块的未来走势。根据平台提供的供给知识,CPO板块受益于光通信技术和AI发展的双重驱动,台积电与英伟达、博通合作量产CPO产品,Marvell也在AI加速器上取得突破。这些都显示行业有技术进步和市场需求增长的潜力。同时,行业市盈率低于近10年80%的时间,估值偏低,具备性价比。虽然主力资金近期净流出,但重要股东持续增持,市场讨论热度提升,情绪趋于积极。\n\n用户的风险等级是高风险,理财认知高,但CPO属于科技赛道,用户当前科技类可能已经超配。需要结合这些信息,提供一个既符合用户特征,又基于现有数据的回复。需要强调行业潜力和当前估值优势,同时提示市场波动性,建议根据个人风险承受能力决策。确保不能出现重复引导,比如再次推荐基金或询问兴趣,因为这已经在前两轮对话中提到过。需要保持专业性和准确性,不编造信息,只基于提供的资料。确保不能出现重复引导,比如再次推荐基金或询问兴趣,因为这已经在前两轮对话中提到过。需要保持专业性和准确性,不编造信息,只基于提供的资料。确保不能出现重复引导,比如再次推荐基金或询问兴趣,因为这已经在前两轮对话中提到过。需要保持专业性和准确性,不编造信息,只基于提供的资料。<|thought_end|>您关注的CPO板块确实展现出了一定的投资潜力。从当前市场情况来看,CPO行业受益于光通信技术和AI发展的双重驱动,展现出良好的投资潜力。近期,台积电宣布与英伟达、博通合作,预计下半年量产CPO产品,反映行业技术进步和市场需求的增长。同时,行业市盈率低于近10年80%的时间,估值偏低,具备较高的性价比。\\n不过,作为科技赛道,CPO板块的波动性相对较高,短期内市场情绪和资金流向可能会影响板块表现。如果您是短期投资者,可能会经历较大的价格波动;如果是长期投资者,可以考虑分批布局,捕捉行业长期增长潜力。\\n您是想更倾向于短期把握CPO板块的波动机会,还是希望通过长期持有来捕捉行业成长?我可以根据您的偏好,为您推荐几只相关基金。", - }, - ], - [ - { - "content": "今天,一则消息在科技圈热传——据外媒报道,在近日向白宫提交的一项政策建议中,OpenAI对DeepSeek进行了十分露骨的攻击。一边称DeepSeek是“另一个华为”,是“国家补贴”“国家控制”的,会受中国指示“操纵其模型以造成损害”,一边强烈呼吁对该机构及类似机构开发的中国AI模型实施禁令。OpenAI的提案并非临时起意。今年1月,特朗普撤销了此前美国AI行政命令《安全、可靠和值得信赖的人工智能开发与使用》,随后签署了一项新的行政命令,宣布“美国的政策是维持并提升全球人工智能领域的主导地位”,并要求在180天内提交一份AI行动计划。无独有偶,美国另一家AI巨头Anthropic也强烈建议政府加强AI领域出口管制。它们显然都是瞄准了这一计划,想要以“技术话语权”换取“政策制定话语权”。事实上,以妖魔化外国竞争对手说事,博得政府支持最大化,是美国科技公司的惯用伎俩。但如此情绪激烈、赤裸裸地迎合美国“零和博弈”的政治逻辑,高调呼吁“抵制”“封禁”某家外国公司,多少还是过于难看。更可笑的是,这些话还出自自诩“开放”的OpenAI之口。OpenAI曾是开源的代名词,GPT-2的全面开放一度被视为行业标杆。但自GPT-3起,这家公司就选择筑起闭源高墙,更通过API订阅制赚得盆满钵满。本以为,DeepSeek掀起的AI行业普惠与效率革命,会让美国AI公司反思自己的路径选择。但如今来看,科技霸权主义对美国政治、美国科技企业的毒害远比我们想象的大得多。“层层封锁,封不住孤勇者。”不管出于什么心态,美国AI公司或许是忘了DeepSeek是怎么“逆袭”的了。近些年,美国政府为了压制中国人工智能的发展,动作不断,先是禁止AI芯片霸主英伟达向中国出口高端AI芯片,后又推动AI大模型霸主OpenAI停止向中国开放。这种情况下,即便对中国AI发展最为乐观的人也不敢想象——硬件性能无法做到最优,那就卷架构、卷工程,最终竟能“柳暗花明又一村”,让美国精心堆砌的人工智能高墙濒临坍塌。OpenAI将DeepSeek比作华为,怕是也忘了,几乎体验过美国所有打压、制裁手段的华为,如今已然是“轻舟已过万重山”。就如华为创始人任正非所说的,无论美国再怎么打压,华为也不恨美国。华为原来就像羊,慢慢吃草,变得很胖;美国是狼,狼一追羊就跑,减肥了就有战斗力。从更大范围看,于封锁中坚定自主创新、国产自研的心气与斗志,一直都是中国科技发展独特的“孤勇叙事”。至于迟迟丢不掉霸权逻辑者,在封闭、狭隘的创新环境里打转转,所谓的技术领先优势又能保持多久呢?最为讽刺的是,在提案中OpenAI还在唱“推广民主AI”“确保AI发展惠及所有人”的高调。试问,打压他国AI技术发展,到底“民主”在哪?“普惠”在哪?更何况,DeepSeek坚定走开源之路,极大促进了全球AI行业的合作交流,正让“AI人人可用”的理想不再遥不可及。“闭源”打压“开源”,还好意思抢占道德高地,不得不说,美国科技精英玩起政治双标那套来,也很溜。管中窥豹,可见一斑。马斯克曾言辞激烈地抨击OpenAI:“封闭”且“贪婪”。而这,形容的何尝不是当下的美国呢?" - } - ], - ] - rewards = reward_fn(completions) - print(ngram_size, rewards) diff --git a/tutorial/example_appworld/appworld_2nodes.yaml b/tutorial/example_appworld/appworld_2nodes.yaml deleted file mode 100644 index 2f5452c6..00000000 --- a/tutorial/example_appworld/appworld_2nodes.yaml +++ /dev/null @@ -1,63 +0,0 @@ -# ------------------ 主要配置 ------------------ -astuner: - project_name: example_appworld - experiment_name: "read_yaml_name" - task_judge: - # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge - - model: - # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - - rollout: - # ✨✨✨✨ 编写并选择Agent - agentscope_disable_toolcalls: True - use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol - temperature: 0.7 - max_env_worker: 64 - num_repeat: 6 - agent_madness_reward: -1.0 - tensor_model_parallel_size: 1 - max_num_seqs: 40 - compute_madness_checklist: - - "nonsense" - max_response_length_in_one_turn: 2048 - max_model_len: 13000 - - debug: - debug_max_parallel: 1 - debug_first_n_tasks: 1 - - data: - train_batch_size: 192 - max_prompt_length: 3000 - max_response_length: 10000 - - trainer_common: - save_freq: 99999 - test_freq: 99999 - total_epochs: 99999 - trinity_only__n_vllm_engine: 8 # must be division by tensor_model_parallel_size - trinity_only__explorer_batchsize: 32 # for best parallel performance, make sure that (trinity_only__explorer_batchsize * num_repeat) <= (trinity_only__n_vllm_engine * runner_per_model) - trinity_only__runner_per_model: 100 # for best parallel performance, make sure that (trinity_only__explorer_batchsize * num_repeat) <= (trinity_only__n_vllm_engine * runner_per_model) - nnodes: 2 - n_gpus_per_node: 8 - - -# ------------------ 不需要修改 ------------------ -hydra: - searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://external/verl/verl/trainer/config # verl only - - file://astuner/default_config/trinity # trinity only - -# ------------------ 不需要修改 ------------------ -defaults: - - ppo_trainer # verl inherit 1/2 - - verl_default # verl inherit 2/2 - - trinity_default # trinity inherit 1/1 - - astune_default - - _self_ diff --git a/tutorial/example_feedback_tracing/database.sqlite b/tutorial/example_feedback_tracing/database.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..670372e26a8fcc35d4c85619434791ac11a6346d GIT binary patch literal 28692480 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

    XqM)dGl}M0BHpfxS|gg)YbWFEn%&ycx0a0M zN-m*K?`*a!Ze;cJ=jpY4F)t?LMtrssi5QL~Ey}Hue(pQiH6xO%WS4fN-E3v2nJ+D_ zrHt$;CeQqGa#q<~To-C9tFf?}T3uRRNsoMr)l-v_Fk{DUvnnAY{cLd|ldqi_rBm8n zN<`<3M4w^rQbd|j+ZTf3|E8D-+H*tHd{y{;-wWp+(cV}jFJovFtrSa*^oXVa3GD{!#AyPchxa5NHG z(Tp=SB2h&sBw~eVtco)*XX8FtR$C}Imw!f6y4~Ks-`pJqvUx?)T}Df`qFZzSX%C6s%~DbZEE8JyS65j zHdoz(lrk2=d3k+7TcGrV~k-hI&z7i>$A7HmyiCHa}fnZdJy9m)4ukt*FuB($-EfQ+AgVxk#+7 zZ=U@L`WdDdw(PacjwKn91u&}xdX zT1iW*MY+(9$K1kVqfksv)8$%`oNOr^3pY|L^R+cIwYa1kZu1nIMiFtTs_w=U_1!Yk zB4lRWR7qIAR3?v;r|W7=+i8|-i)CA0uofc~XL@&>4kUTHvb?(3T3*F|)zIyDLu$B- z_Jl~g8B5l7li9W|sa10!rVE|eW_jjp3L5kC%1*O6m!8q``NmqRTvS#|mJpUmEvaS{ zv;_%kbUd-TTNc;NT&J*e;_K

    ;n6!_}F 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

    f5kL~|6dzd0bi>l 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

  1. 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%0D`c+ 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�KKFi=1np~||3_m{)*cWx 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≧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 Q@9R55jfZAiSR(tkOT^Rtps7^ixq^P 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≩r#^4~a#l@bKHhobS}aC#vv+zrzOh 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%0DYo)4 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

    }Sv4}Io8yRkip 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͐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%0DAmeTXq<|=Q2g-{G<^KW$wQb1V6UPI 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 $(+tUE5i(w|6S5+j47X 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

    #|LrH6@%o68%WC8cbs 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 RaINo8W<PXEY3`d3eN?N9e-f#`ZE2 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 a!smp);Zb@zA}HG=byUFhSL^EH;`g}9>Yu|BBk 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

    y!M}VXj3+?-1XB+bPxN$4a!+XIc={q=Eq{Nr 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

    6vYbo|v&A8rL;*Ho0>;K;uW+3v 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%0A1m+Z@o?)`ys^_ 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

    MS# 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 z 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 Z`1P%_|JS#A4&UDKd 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 z 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%0D8q!|VZnhd2y4%{Fy~(Z zSx1>j>iLoc6OAiSW#Wqmr9G`b?8bVNNDk3L*@UH*SH^GD3a`qzGrDDrZ$7wv*9ncU zq4AZOAnWBSEMVJ6hyaEdBuF@Gu{u6h5}SG#t?(*rl!scRq{xLOT zNQqjoK|@I?IWDXxiXIrGqT^~r7Nux^W5+T`8RN334mL>1V*1k3@Xe3q|GW4LWB4!p z2_+CpAe2BTfe%{(-^@MxA?_vk_0RiW0t-9@vf^Z-dNeD_(a5PzBxlb{P*M|nJGphW zQfSOpCYx^ASuJQ2p_kxgrvMY#X}Ql!FgQBUitVjdTAJy((?wA!RPuUrv$)v#VEdy3 zKlJkydUoP4KGLp~W5`4)+Pg)gxNNRe^9f_3m1|bBlWQHB91_MiIO1rq9*y=+5OLIF zG=mZCP%GNuX0$0n0S0IsaYTeWr1Q`%xH zS!*tsrIuKYLnZM2{d52#v|+&h)xiiBN`>ikT8p`bMq)GBs!vQ7jOo&G4o>@G=>rFv zCt!#5J$IZwV}^$~u&|7W!Y!ir;L#SS`1BSdujJ>$6A~1#jdu7U@nFPWl$|OE+U&uF zo4)e*hTH6aHva6-bBFb>z8yHMk@(cKRM~W*Rs_sNN6obTGc$Bpzv2-=;n5;kWk!v5 z4v!Xfq-Ep;)geJ>81aQrkh2at=pzUnxaT7v=fIBNv)_XWcPIfM-0(_d%P{RoMmmoF zAGNzykHZN7Wib+HKOO&n)Cm0lk#R*-fH@o8|Id|=!McQ^r_X(AxGur`|5yHC4F82c zp#(w+gc1lP5K17FKq!G%L;~M<`0Ne`%lz_rA1otf?T8~skZQ=5bt#%bo={uL=(eS6 zmTKAfPX=*H7AZrKCM_GyT5?8}Bsm&I{vpe<^*(FJ*#pZIcS^CmylW<6;yesSG`N6y`Y)%6InO0lU*%L%&ZntOUc%v z-T7eq!7_7|yekwdIgj#yA_IEWA*O(=APZ$6!9C)iL3V*g4QvzOuOSxZ2IwYCBqKpy zolK+d|6Ui=VK;zrA>&X4wOuoFIkcVun+z_(82X@EX@L4>) zh^c0MBW@h3j*CLBLL>$zJrf4koC7L>8cVT((1~)vZPXn<2Pq0%emmnjHvNt{-Unt8Wg~e&20;J%5$FH&e|HT3g+HMLLJ7P|68NRhJ-f>tf&WS1a(7fC zB7;iCRu#msiuS44WWvbRS1)okq!1@oM@D`YQiz9{!ay4FG0GHn2wrz6b9G1|J|GqH zzSPD+&_gG!oS%J}XGys`5`cK-N6I#O?3r- zg5v*Tla_P#S~geB33Q2Yfmq{M2D$R9u#}|a0{enopw7?F6`Ldl15t)@mp&E)F|pQV z3Q6*6!YZ{Xt7d!uKP8(sjX*IeWBZnjl&GD|)b{>=LqxJaj(&{&|1xp{(iH8zEM_cA zH#JZM)RGBc(nooGqMWOnQU09ee{;D6_J4Ku(Eru`{C}wDFM3YBdUO*1d&+-)(B8O6 z2PWx-Z{$McWFR_$Yio`|EU}WOcgv-|$2hlA(%U^ldRw=05m&`oW?4WLEdG!g31dq7 z*7nR>iv;vzVNioPR;>L2HvOHVQ?o>IUI$nl4lMBCHQPGCH_#MPW{Jw|p*A69Uzyl= zjXPw&sa&~of&xK2$+sjgusz??T(GHGh6kxDDe%iWmLkLNYWkY1=mr>&9nqEHhxK$7 z>2T36NwJJQ?vS;{AKbb%FgCGvU0t{_QofU4pBY&ij{SS7Lzd;l06RKmnP4FpkIf-# z=w?fQUgD4)R?E}sodU5;IHk3vd)fQL+1p9N-AxWz+g%o%LUm!WA}IKyunc!Ar4Io8 zG+eajzzK)wi^Yr}jDTL+NB%BSuXEsd$91TH4+8l6qm=UNKHQn)|2(IOB3(q8;wdu+ z=Wh41@UHs8N}=rU(7D-eFjD8{6LN08V{@mKqY$&Asa!X7tBq9u^5jMzq&mX;-Ykcz zvn^_#tJs0!Ns58f_*TA#y%OG+W;Q1gwiDUH(($&-Y~DrGplpm*gPRi*!w;6c2l?B} zljc2n_Bzz#t)d2()#2rZ{^h|{%^IIxTP(Vh!@8Vg7HC7a(hxP+%(Ae3+rloy64G&A zZn=$ZR@QiS{#JgFZSsXTsCES@O z)aZEH&-FfuTuIx?mK0v}r1K>qJ5HFzo^XOe$#x&sCQXXJ+hci?!mh@dlh|YMciSR& z5^BJhzIDp`=4J^@wXO-M=6XBIqr|%2m`SNgDy6Vqr^%GI$fgvwR+~?$L#ZWYnW5kH_fVqH<)ljZ8K<{$(+_f>xrzD*QaL&CP!AwqwdI!?9_}lw5VBa5XZIY z?pu;>ZF_d@4(V36wwPqJG&#N^L#V>1nJ%17SI! zI!=_d*Ai!5eAr8R0Bnfy$|P433OPxGB^zvxKV_v}y{5y$A*qStM(}vZ?caR*P zo6%u3%^=UtT}{uBWbki)f_%!|#!vC%vHX8MM$ehE_|^H(k4ENQ$Rd(be`F;%Y=DsXMVV^bDtMj;1( zXYw#*8(Ca%>$qzf80b?Np2s|4G$;`U5aEF}*uQ)==lCUTwHJF!$Yz`^`5usp(4{@U z7o!)VDhke$?^XyQSPwD0w&uGCL1crzK)`UJSOYi&D9{!#OTrX8^zvQ1SgBHaCv>Rf z<4-Wj%;o8B$n{)74I9Cb`~b=(i(e`gFz?4H-8j6Q@Z*&$!e`mJ{j;o*ur5Goh>e_s z$B^1B1GsoGo^1PyZigRT9OP+UM*Qb$WBzKtNWq)s3jU8rh8h&El4MyRrFXJiGBmoc zyz+`LNml@_o)}X2l)z}li{BW><=CLGWA@vBlAR58fbd(n$uCCx0xO(}8m&m_suapasfa~k4lVb5bLrK=| zo;AXc?rO$2#kJ^!UUSnaCS6?WEE|i>50ccNw$NkYHEIHXYe_>j11(<`CTm4vnMQO9 z!@HHBq%r0q5YNhzpV3Q+)aT??VbnMGvhJ2N?y#D~W6wJd-1P+s{PZ7*heH)#Wsih! zRQ#dn(aUIfmwX6H*bDO2Q0lgNt%}YXibuH3!zXWv?Gt$Xa0l4p@#Rh*Ke+)70Ny>HNhlL{sorWzYj z)xx`>^;OfF+PI==kF0BQ6a~~$-5qGIKf+Md6^8GYDq~jDe6Z+6>S}b?sl_Vx`$W

    KIPKBkiXlf}!x#;&%Rq>8IJlJ&4a?B! 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

    iTs(xqGd4?P4%9SE*&2rH8$DLRbw% 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%0AU& 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 z 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

    ^X(0Foh&F7*w9{MBqhTEZNs- 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≺G|jJo#W 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≻z%U8jx3PV&oMvvBNm*d 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%0Do*lpp;wq30@aaBNi7Yh1wbDq;$ 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%0Ds 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

      &bGRB%704WDZ@S1LA>Vbg} z`o|Yf#x=`aGlH421kkXfyd%JFroXT|h}cJ>8H4Y| z0@BAvLOg%E24C|qKTikWX45droM4^aN758$+C9Mj768#Y@$&!BZtNZZS9N9E5Ccb}!v1sX|IxbN_`hbU zJ>&m|BpTMm>i@g5|49W^*Ee7L@3L)DR{#ISksa0@u5Xsf2#;=R0iSOg1?A5O0ppH{}_PTZxZtEI)KQ!DyEm zA5DaDJJGj&PYo=~(sk4D4POZ)(*bd$hwz;xI;LX=qT^UVbW}7&l@PsCBvrCy1ow1N zQIMCi4+zN0{&vtT1NWp-UVZ=lxo5-ms$C}B$h~6O1N9|+h#K8tKs!GLJPLhNYnDNm zg6|eiH;QA^t7fpKROXkTj>}I^PBtf~H3OZbws9>Z`-K;ku+N|g;j?1hu#qU5Dm#JX z`;KZM1v)?+(oy6jI@}F8HgzB3QN@UyeN=L8*DLN`9UgZb#d^ENh97^R!vCIX((?5- z3-oO7R{+;C3O1GGx_43I2S`E`ss>KM1m42ZZZGBL}P zYRiW}hM8}dMyHXYjEb&eeS04qJ)^52jb*=~Iuqc=%_?95;x^z8O7xx}Di1{Kfhrd? zQ{T2N-Lqw|3U$Wu(L&XwE*g`rv^Iyno2@f{I&)_8IR2l#6Y7IN7cJSVZM z^+AgzoX7EBzBv9^**jr*_G*|?kCc0s^Uib`SQtnt;xky7lpfFYApevl(c@$2J^)Sa z+WUb(Jol;VQW^9N`6~4lXz%GFihmQ6^R5kq43^oSx`9wckNmcJ`o=(i_)Z=Q^n@t) zAZG)A8A5?bO`tN8kiP`;nx}yfmP4_OR|%FASW_$$p33NeyLWB+P$-YM|$1x}ob}Fy{OB z>DJ%)#y5l&q{0Z&17Xs~URf#vKPD;dNvRHMj_0IDI7erthJ=%Cd{yUz6C6s{d%euNSAoC!ZR7gXbP{kTJ5CL6;aYe``_P*QPXN#f$ zfD;1z36pU?%O?Tsd+hYn&2UsTW!o`LS?dG-A4a6sclcjXq{!Zm;s0e*L%l!fGKU|i z1zpuek?;Tptp7)%uqhf{ZCO<_HvjTSwk=Bs-WJS+>#2HVMs*(^yz%1d$wFg%`fy{f zV$3y)mnDx@R8E5RqtaY#bxN}gQdotUU zsbQ2@hJ88y>_S^JSe2jO6H@M$&?`kQm!d}wm>!-wYD9H))U1oIj`cxIH2D769XjVw zL$(NG@0^bDGt(*lq}^ZF@_pL#*5Z;A$YFO8k6n~wn{wIRdH(!6k+!t!^&%*x%jAP< z^BK|hnZ-8Ew?Ejql`x03V_2CB}fQyczhCPgkB#S+YN#c|Ep9m+0mHS-` z3^W9SbF<_FY8W?pwlz#f#@6ryVXGr5*kVS&1@h^e8C%285ghzZ3JaMeN8*SC$Rn=3 zWj9C-4@Jg$1jcad9@Ej%MhtsY|--TY(3dKV6o5*$iYcuuV%e3||ja)$qX; ztAWBoQ>{FX@9g`fC^}bp3FG*}k&Un!f_DU#M`-J)L$4ho$Q}?tVA(J3>^ha&ZlwZ# z3cFTmBEVN{Aj5MXze@yb;nJp%MdGlhqe(o7qbD##{4I|a=0J(dDM zL=Wli1vtBjlB!FOz|gbVg&gy^?!)%*x?J2~d8x4LStdf~z$oNM#ga9YP`BJVbpskb z8!#i(Xlca;NWlNOx-Dtl14pH5Ov=V8gYc4UI8Lp=|SX4 z3`7-@Cou?((#@`CrlUlAlA&QZvSoOV;hKS}*s|%FRzQ>zJ*@xEv`fwv!F3JAn*n`L zPA`#d;=+I)Y5SDuLS&?5wl-~Rq@Ynt1DUur=nh-p+iBSBnY?Z1WSeObkWAEk%F%4O zM#42MA5bSPA1H0NB_5LWW8Dvbg83JT8y^_1+QliKeb+g#UjxsaY8El`v_lUDB00Ur%+u}Ym zAZW0!I0wMF;9PK-;n>pBA~&K)TM;F3Y*i#%u@Xh)a%NI-*@;~hm;J*jCsj$6QZs({-pA}-`BTu(0widW)|3O)a>k_`|Gc}-~KM|<$0eM%%Xrbeq70{pn2a? zWJv~yJ0qD@m(!g?Mxn4Vo9!E7_Ww)&dB7;ZOdPOCXm(E`eMEms|orzV>vR=QaGJ z-LTG}z3lk9&#Qu#S%@&lhlH3DyD&r!}4&%Q(d{u zHJI}gUcS7Bl~%*5fCR@y=73#o?YF=lg$xB51cDE}3j8=oHUPQT3i1KAiA0cbjUiW| zh%5-#YHb&h6mdfcJW>^*2I?zHWJ)D_%@@$$)9$jfI4SHMum+7g#h1JgdS%v7-q)P;hPoZx7_S&>K2xZ;El_(5`| zq8lZivhetk{5aw-#7Rco*Rd?I$5BT6S-)saiO;oU z3AVefa1)6#J9tY*?_H{Fv27qs`rxN-@-)Ka#o!KLn*=%uuX#@Zs3T^7j8EJQzD{WL zM{T<2hRCS7Ep5p%qNpT-9=Rc`HO<|=azhkw`*q}oNIKQ~3;6#)7B4BM$PJOrQBgHh ztbckuZR3l7zkB@u<)Qy^=(V5VuTQ|we|YC<3A*oFH^1_C*8<(QGe@^qSbW(VbDCq@ z;IbI4d$qmevFXW$)f3eG>?o$zX}S5qmq89eI0)lftmVcwuq%1^6nUwig3MI}U!Gg| z6g2uR2eoUEE?34buot+aJD_Te5$2A2U#Y6Cc}cr}>@QUps%~*(r4_IK6k?@u&KIu4 z_*}2f?^hqrnvKPcsUzjM{_vosZ)`_#w=SVss2^w+RT5amW|)%N3(LasN|bsHcj<|= z>QQ)e@dww|JMKXY|OBbj~)$( z1jY7*fJn|AjSVR1Eiivc-5{F?DhKb&w_1Dnr!0y$QhF|1N2PMB%&YcY!>r|#xp7?p z_g&78LCf1kXUAysfYE3=A7ejN}7;Ws$jx7jpcrPv~}f3P#sBi3TmqkL3H*b}r+Yka z;=ldHpo}qMp{AvR;|+{3u&nGe1xGI)8Hz8h%SZCqk})%^XrT2+hdWP{z)c7 z0mI2Z|LDroUHagt-q{M$I}4(%S%zfjrigmfnm_0VzhLQ|pF;nA+pgHXqS2>NItgdp zDir?nt?F3-htQpD{R@QF)tbEnUDy1q!vP^E0vAEk*x{+u>N$1Zwx)v+)(WhK+E94FK*)!f?BzFMo#PTbvCE9=D>|8OEZp>Dk-6^0o6?RnvD>&ayLz`)TePe@v%8b` z$_IC&@6dM`cykcs8;cYauut^^YlXHN!lwY?N{7EiO$h9EqDgQt9RtUnr8f#LxWh>p zTsjagXx=vxjy=UWVBv!MW`N;>XAR+SVMW1AKpcCj=L3n0z8G%Ki|KMq9J^&tR2*6% z%Fw&sUb^*&(S6!{@eY7oe+aovXjJ_|ChZsw2b{OmPoQH9_9I`7T-Jdr#qh%?tbj#Gv;tJTQ^g@xoY}iRMWoppii1+ zfyJ{sv|*6l9Fe=e_wwXcp5xe)nKL0uJY(x-X!~&EW+hVzO@Eni>Fc08B<(rn}dAyzU48Jpr?0klO51J+uKq6|K(SHd+0N7;;;NCmq0Fok4XaG`_9t}k5m8P*TOh8 zD$F^m@7M+cOrnB7wc$y&B{>C2_cd9QMaw|-77NvbeAhDzqGs!|=xaXWPqw2Wti87f z@DcXRaR2*QX^8Qtl4L82uifO5hHh$&z2H+in{UxkX-c4Mz$i54Md?e+o^z>&<^ zL{z7Id&=5t;I~p^YtL#lZ?D!{{I?SD(Diz&2B2Nk#=U(t-tI%VoiZxv(iT_>P`M~Q z{;P}@%(PTEx>DVk%hnWrxBj$D^KaryfAY72%rQ~XWn1o_e!)X-_6`eUWJcgzs143gZS_pWU7 za+2U+pbmM?a+xPJBO8HVe^dAdtynZckO7B6k<8&tdCyqxa9gDM;{J4&wafVpa&$LK zUb$T8?yAtJ?tx;2#qk4TgBw8(JEuKBK~=_lkj8e9J|!6qK{N?jsa8ID+NK`6mZlzN zP}w6~1iJ)u3#3lqV8luQKZ)`fzhY{#i+B?RsS#lb=4f~+pTr$=Hato57NLg9Jw{=& zCqN@}T6@4Qz*%#%?e3`3N_S^2t;E&D&kzJ%Oo>0#4Z0La_X>ZK;OUdsvnS-o>3WI! zWlKp~{}GKq_zj$Dxz+-@0(k?VW;w9-TEJ?w8ie)WIUIN+=Kc#(NSK0&a4QtK*dcSl zHKc6#KlBGf*(w;Gt6GFWfZoyt{?A&+Zl><=f0^n&^58<05>PNB{J%VEDu$vKPJ#ay zN2OHye^Q1D8$Z*?)_OSq|34mj=^uYgW>0?G{w457A3Uvch~huJ89)>@+cbbjlnY*= zpcNeHOe*TdgDA=sX=7VzKAcpJmiBk`Ra3Q=57r}a!6zBJez8zF%zVlWHO6QVrFx{5 z))oDJWBT6m#NDOJ;R8??MIWpam6N`kUl;`&&wXm#Ag#&$Fx=bohldl&1C)T)X12$b ziAwXnwM4)hj$;}CKeKvT&5A)L5P?ho8Zh>OZecnJ=}2c%u44R1s(N)g{fa$)iiVY; zVx=iTq-32?v%2Y7K_@AiR;+8K-3Zzidt3li2GF-~NndD{bgc_xX>hcP*Y0NP=4b2X zXgld?I|p0|N&`UO!E2Q&2UW+SB;&0T{6*wzf>$VBjh3bPMSrDcjV;=xqX+ZO!=ruO zUySC~iS45=T*;}0d_K66e*AA|#Fa1~TBdk&T*-^Um87r67iMqljQ~0IeguO#dpA12 z%_u}fq;5sIrC+R8$kOkEx=3FMV{h(35fL^-Ef=PbvJG?qw$;JwEd^Z<#O z4tTl_>m|6QDQhrb4(j9-0uK?W0Lzh=9d?0GtqTD$E;>UXjS&O}o%WsW*>{@SSj9aC zcX~rmg5VwgS+*+2!eNn~y-{^`5o~Bs5Rh8gpi$rDM_HaD4(|~YJEvc#Fh%0J1nW6+ zDiKgfbm>;&?92ZAYa!NMn(gJ-^ZlWzUaJMRc9#LHc{CEOueta1r?w=uhO z;yY1uyk{Q+B=Jb2f)HJG^2I4ZDD_?l{9M5>4BZhL1%ede3j0VM4=&y6kbZ~g=^9ST zpO6Y%V_w-Ru^iyUE3(@Lt`tcLxxK+wopxgxH%3sK&5#q{sq@o(oq8CLXAJJ7k!bEE z=0OF$Q7uMldZ*<3po5~+WD*6kgLs+{=*v5v<)?r2Tf!7e^B!Z%14i-{YO~4bz4kcx zy#j7_1P;Rmg#|DvBOE!^`>hgYa>#KOMES7(jCR+cWmN&+3=s+_rXpIX;A_~j^qe$k zHm0`t8U)$F5yie+bVMPD6v>w#X+OWkro|QpKm+1TUPu()n-w=H?ZoNibvHY@=he94 zE3Xfvif77h5LKMOOlQ!<5l4*an<)^Qlj{lfRwcpc$JZvn>uwC!JzZ?l2hm6+rl-A3cFa%>*Ua7LT57=6=bmSI>1gfX(wjuRwv6d*dL1ER}FSR zc01aRdoJeP2mqB)MKiVx$ug}zDgdz7@q*nQ0iaQIzXJiFQNSPQjNw~_QA0NhR1Y9g zO#o9O#8P(S|5HsdCHo%_rz;zu+3aEezxu%t{^UQo1ab-F5;%(l{_y70eeM(a3y|%- z{KdDvXcD8MQ4k%|uxv*~zCvDl4*S$MeBm2RqY)wmWNpu*T4*6S(t}w9(;}?=ba{Ou zd46=GQ6k-wn1N&4B(L*zQ|O!B1Zw0taGUVl@jO2|QR3?iH1K(Tbh1`jJh7jDel+an z-0J|xJ{jZ85diBv_d38G3t~r*SC&w%HL&DKLOfVPzDRgs$mPOF6pGc71Dmtb+S}{Q zd}I})wt}S0eUyK?S=(zhuzB$;zTsOaF6F^4<%TR(XovNJ#5|ARq^ptPn@c z;}kjc)R`l;X956P_ig@bawxSZ0YFwl^B?^GsN$znKER;%e-=9e+5g7IE2G`* z|5t`4hd%c^pIO2GPWSVpH=i~+F8#?n0WMwE70Yl?&QMk~RdO^r1;bDPpbV008)H`d6o$|dPcM1`NUE`PU>8Y zaHAh2sDEJIYpy%ZlDThsRb^?s=$A{g(Fg0qrLTAt)qy{m+@E%x=V=~7g{KH(!(;yC z61ah_gDMM3+te1$ODu#Ais2w+M=M?vF(I#sfG@uK6;&J+MZvS2B0q~`=-Uzs>aUTJ z=XkIZ@b!Ikj*u!_1cU2&`(r+M_8L_IPR9B+2F;ZM>yw(JCeJQiPR~ID4Cq~g#e%u` zic0rIXq^6Qz~hUdhul>}#c(Th%>r;Or$|fgo`BRlrwSK1`MZ&Tia)e+^S3$^jc)f3 zm19a@45l<6*J?4g`bd4+z;1{Vv_H}VADF3tKA<339x9D^sw?;M zfnAgmv^mEvgC=y-JkPQy_T<-zNe?w#q@bZNb{w0d+OnrWcNQyvk; zS3{*eDl+yb~bU3s87b7LM`K>hVHzeCpu- zZdIRamd5W))&2XK>ekpLgw5e)PMaGj>oE1YX{`gy`>LX?_|BMeuyfxqR(9?$A1vQJ z-sofAOOw*>-Sx8WEltXIeSKkn>4CGb6Mdq-^A7u(_X*rsC$4W$L;+g_UL>Y~-S8x; zfMLSuT)5-_CPv53Va<_75zZfE&7tw6XRbNF^z+$k4$J?4b7%;E@}FD+xdd_vSAX&|}bU3XfB)|_ETVLdSd2aM_cnN#sg=gh_(DCl}|7%0zLtpswxBl7C`0M}j^RExO>HW^( zlh3_w4n6sbxwx$_-WxBw3wQ3+ciq)ixiaJF&Z9ODG_rt@uQ7aU*h&LM5_}{8j8p|T z%B7?jBrCeXW0Mr`ObuiqTxm6%C}5h5THZj76rti_lG161<&&@oE3E+3vv*YUDwK3f z(+tF+oH_$ zsH^O0vck|<%;*WYG{;e;{n@=#|uK( z2ulag7DcrwD9)bJ2X`v3{R){=_!|zm3hK*^j7%n?+U>8_5e?4{g-=n~J^Csne!6Fw z5|FT!RI{Ybgq?U9M(x#Tm5~O#EwpNEr-2;VXDru1QAORcU^`*D6C$Rs9HpKzBG}bx z6A^qGW1I(;A7rS4;OM&~S4^2liH|$wd5?woL?G7oqmj7ia3a0+r@!$e@gcbgIQJ_7 z?I7+L>%?X%<&KAlFT#~!mqUw~2UbFPY)uy}N%AbEpoxZr!r6N4o(?kkw|H9L7Ttud zuOL5<1IzIHE#yZLkOF5L%`Ko9=s!X-+!j;}^5`VK6AmHwHy)Z>7&%+4R`6|s1|H6F zanOn2!-aSV*0#NO8eQ)Q6Cr6YRtUFrP;y)ND8!P>za^f4KGRn899R)<2MfT7M;?h! z;Bh-2m99I{*GK{$61~qR4I>8QV2Ah|y&YjYI^U)9w)9$jaFI;IH=uu~KEk^lkATsY zl;gYY_hkrV09Q+1dsa(T%PDSGx+VJCrhxbckQ>%u*E?4K5 zcgCfivOyQL#A?wt6)vlR#M)0vXi6jl zd~>Cb#Rwq4qwoQfSmJ4V2(VL-HC^ccY2^=iPho6gMe3Intg+D`UZ)oNfMmP zL~tGsl7#T-82@DL50~hX??xei8afJDCIYF&?-3JzCR%}q;gzB~Q0a6*R}wCE1fiQ&j-MwRG3kok6#$aC*^4LDG3J z?`TwE4G#v=W`)a^+Td`|2xVaD9k=+LxgE$~cu$bSbu@AQlnbdT$yp2OcSoPRg@yEc zubIW!T1A@MEj8EXr}3Z@MG~! zFYe})Uks*O)))KD@{>35#lHKB>9|^BP1DxK*PHsh;>{Ri^%b=?=ojNw7o)SK?Ml&- z^-f3)f~i2%I?#MLg%Y*85{AAN?J+?05pbPrhNsx;;aJRi;SX1yynz?~+aH+eq^{8m zb6*r5CNMOk-_w#5XoPY)2V4+qt(h!;T?c6ht%|MK-l;%+PyvSOHGQJT-#U#7g^Ea7 zVx{>1n=dItul~mAgv7wAvDe=G{swBNrEeYRSgNe4+cL+m~|_-0vZ-;L>sXrM%@s15`GPLcq$nS zI}Qg~=S(eQ-i4U@D$?m#3+C*=ZD1_HXsR?p8RgaSOyMH|m)Jax?sg3}ICal1z0S+q z)cDi~tiNhA5h1gwuwF?Bgsb~N$vBSYkRRr0}^-yt^dIv#x5t6O_698s{d zcH<{*J1n3EcYNFUiI}se^O;b*sexUey&L!Lu#F<{F)%lhX9?~7(=y9$5`F+u`SdpN zC%D7|s=Jt(DrBTOmGN$)I*E=9qJnQr(267!MKOG;iqdr%JYl>;^V!=9MxrU&$-mg@1&_J; zP(lbEQ9hn&lGC~rWFv|y8DTZ#gOU50t&wml?4Dhh(nj@c%k(4V<$JQ#~!_&i3DHm^F+( zeC5g8G>qOeixoxLT_4}@W@q;$!x?vr*ZkuAJ+tYrdutD;rgk?;Q7ne@7+j#%Rb^L^ zB*S+VQ*tcJl62#F46cHRec`#TQQD}MJ-B{z@yX9YsvmyCTsmysTRNzy{&IPF(FN># zqOzu0(Ucu%je@^r7j@zq4)Mt{O(R^HV9`;Y^jSxWikfEGo7w#*U!;-pz|@zQK*P6k ze1w%qbsKj#4mO(iVmJE9>Ya9vxm#llb@mCGHWiW z6aM z6?N3mGB>Ta-uTAQ>qBEhZ~kv@d7uBn&wOrZ?6vC9FEdO2!__BWC3!EI&dkL4(u0ke zGW>Nd^VljW`&04~m-lavJoy#0`n|{I?D}E3wKF!qSXx|F?o2JN*WLP3EBYz}EljJY zEoB8y6-tMUTXh?Sdu`&JY!dTt%_>pxULX0_^*X{ZX@(lLA?tw1npj&YYMnIJVzTA1 zFRYy0n&r`U7|{aVGik8F;~luhqdp&V>opOf51x9P*tC**t`e_X_WX#2xl9*g&`$>wpy;EUx5; zwLQlIQF60h0&0qdxKqSNA)Z478yK}&_)0{vOfQ|%p5G3P?xk&VM54xW5sI~q+ZGDe9Sti#p|kqZ=i==c$>&XQB?MBRoquV#45O(o2ynEQ{H98jOL3 zc#WpIifE%MykZv&&C>0GLkdS^{3A3#aXn571?{`!-@hSl;%Yf$6H zcE+dea(!R3r)y){QDt$bF@EaRG6qXUPOKeJlG7S^gt5Np9XBy8nK{a^P$8HI&Nomp zLjx?r70!JA5jG0z3QZcPSlV+zqu%a{Wc8V8o(59{a7QrU+sEwx7_Mv?9vN9^m2LEa zuEK7}8;PJ6a~aMgo)Ewb-iG0GTD=7gyt*;P4y%qyb@b*IwwU^d?Ye>Ao*COZXv!hu%viVHnBJaXO$dX0)MG-5<58@ zuLUb@{CpFEKp$U^R)DZk;#z#Nx^TxjPHBas^hN8!J-lhkc{+>|@fBf(f7J(=e~+(+ z;ntOwjVck%79&-rci|PD`*@YaiWNP%8vTnz%U79%Kax-~oWC12?*|4Cfg9hFF{eSs zB!Wmtw+(n82L=!E$;_rUrnid!B=xj2Tgh}H4Gq2YhnU&F{jNFh9Lz7c(<}C5alfeE z(|u)p!J9s>nN3VBGu0wKZkd>YptQK%XJ$AV*+q5>Lr2EQ-}OM175Jwy9I(G%3AZ7H z3D`hpXds%o)EFZfZs_P^v%Li?`xO*w-`lh5^l>qz?_$E$_DWEnXkhUf#kv9WJKL~X zh(5uogUi^?%P^Ce)`aS+VR+v{&wJ!Anp3 zEq>?4=Bd>(!XE;Fh8~bs-chk+171qIq>iv^sch|$AU7+VznlkJA&Sr_*B@UwvqcWa zprL1NPYAO95~PJ7Yf(FXxU_t*dbGc=R&&@Eq*$>;8ZI(Tx@dY zSNhHUC%;Tf#ple@u2EfGtIe-2%+4JwtgTIW>!o{fY^Bey6ad*V=|e?>Rtp%IiFyk& zu#%vwkTDWYav5>TD+%<)nPj6z4pK2uly&Mz-cA${kNVTa`KuV zY=`7Enyt&CulZgqm+`HZxsZyt8aCDhqcPG-xN{g1B0FBFD{Eqgmz!5a%O z&Riul+SOaa)huuu6s}BoTev7QfZI7RyRdSsnHha2*`!#db2T-u%ao*zpZg#?v+Kvh zPY)=wcj8O`Xe*eImQ@ge;IO@dr)j3zb3%$86S$3(bsoN&z0s{LY;Jp7TXS>skA@pH zt3p{DV4_5kr(ql;#xZyZSaBzu07)|nwc}Jeo}XGrst719shAePbeRx_;qxF>Ju9c` zWhzgZmlSsq7J#~CN(l{%nXcoWvwKXZeA0M%1_26!Rkq=0VU-A(?Aq)(b_u-S&}2gu zE`-GACB<378+R=Qelre5gMCXHEdg(7<>2-5`as?W(bA}ncwSPRoaOHmSPD_c_xr#R zcQLCUe+yvkyrcl-f0DTd!ID=eFDY=5OA2JEb8w%n;v@FRRp?p(0N&;;QPMSsf=E3J z0HAejqj#_Wr>aKCz#0_*kfQp3A_0JOJ;L0uzMvAdXG}g$(Gr z{=YYF4dGAzlS?3%KrVq?0=Wco3FH#UCD2s@KOBF0#F_Jc@}+<|&-PUhE^o=yR7KNd zUn;=Ojht3pH9gVSJVxI^vDMYd?xxqYeQKf*%{rksWaeT+E+T#dcYWvjJIjdui18>OS()Ej`(cBdG*!D<-wq!VFmeS{z-^aNvV3J4Z%Al`h) znNJeD5x}V+&`RwY{0-JUxI)fSyF*b%yM2V5obSbu^L_fpY!?3?=snUs065;={(t%9 zZx6k`hrjZlTmt7Tfsa1>^dV_Ug|~lr`}XaZs35#ia81#a!5Qort^+`TYKW$-0wv&r zV%XL-B!~j0BdHeHgdGhIWapozRNt;29L6C_+I2 z%`jCfjnL+FS<+FMlbp@OaL1D5Yb=k7uvIEh=mMMv5i0NhXXjy0>bmuL|;2TmWS zo7L>=uO&JsGPkHB;Dk9~HolsmR&8#`Tp%QmFxhK(6~kiLYk&^0;a%$kh|rrA2Kn&a z@QMtG5PF3Js%2iA_x2PZq@XD-HMaJwM)US6D)qA8z@30p`c|#!xltQ8jg=Xh@}{_@ zsG{#^SMlXzO1@Q5z9pKs6qZY$venR)(#AseUh{iD`}CM268`kp14M$Z8brJ0imIdd zAQ%{QEoiftazuiFh&2MNRB4tH91dA+QpyewSha)%9SB9ZfVd{(vJIdJB|pf|L1$3- zD~&_gpaa%;<;kIpCY-9yMHmh;IVh&W(K=Z7kWqR=SS{f%ddx+vLyRvbOeF&@Jy-!5 z5FI#k-iDNZ;7@~dWlCRWL3;Fr5PgYfsS@K%u~k9xiW{~BCnI6gAsY(xaez8!c%>Yb zpu59j2_Snw0k8@K(;iwA!C7WV@I=@H@9WUU+H7XpHh4_?3;}C!YXTRF35%W{5q<{W ziO3~mM$|{cuGesoT}Oy>5+mNGcuIEGW_@^w2 zH&S{oTSujGtIUi$;Tiz!4W!Uj+{Sg{wyhpQykr{Yq0>0#&{NFv?= zrH%2o4fDd#W8!Rr+PSqCABW}^bh}wW3YM_vHE}Y;o&%!Pgsj+NoU5}~vl-?n)^0+` zE3_C<+A=lSmWb)9NA#by?l<}`%UY;4#?gNnD=sa?!?%=CRg#ghafDYV5iDT7lN&V7D= z*;_d%RW-|W$2@CeR%`6fti}a5bN4yZH`{PKlr9K$t>pTDyDq zVEf_rf^Rnu<|2{y4d&k*?pKFl=zdUwoRb#Au)@zpjX6&}hULV+2t_7TIoSVcnzC9H znaWIf{)9RcoFEM?snEpT!yl5R)8Gq3s}UYuCAEeUJ(%kbgBZi=YRRP|%w?GFsG~-N zjHPBN+|#TNsz!nHkFJulj^BYOEdzCrd+U0;>w5X?PVKNu@z`CZQVYR!j(BJBE*(xI zQao7gg)~nPQz~#xdiAMzPNy?b;zAPZ?W-sDwPcD8IaE3SG86PUd@Syj!$(TqrXv&R zJRESbe4`f}M7Y?43QDGM^XTD=i5_0|Ej#I2i>7&-f34qbvcd>k&S{e*Dv0N@N9LwJ z3lI^ROCP2_3`tsF)6#6x_rlna4I^tf68#g7!Y(N!H-?e0*D50i6K=}kN1O2Ry58n6 zsK?V{TNi7$g#JLai4uNl5*$e*lpoJp?4m}rO}f7Jm+oYuT_lYMjolWBpp2Oo|0i3g zSN#8_*Zz12fAXJP0=Wco3FH#EI1>2rx1N57hs^(MEeM$_rYc&pYFM`IxxQ^{ilc*3 z!!#UM^nB1Qt2kFfvfq1*{F z+7S<@Ul=zyqbSl<#J-BCze=2~N#^i82%ZPQd33W}L+tdD1i|4RJzKq{wF=6VzW~Q;SOKB4h;aEm~xY}*bg^dQ9<-{Qf8+>F0M1s5+c47@^f39e< z#}gfJ5LVPaSU%j6@1tlnRj*FgJZ)b=LMbHf6F&J`BcP9tSW^XFk1Ap=#_!y5yi6+( zg};N}?Uktjx4Bw!dn? zR67yX3Qn$&vB*CNihw7trsX%{?**G@@=7|#7j-}xn*1#wSmq56c|T#6Iv}HMvhvKm z3NoLL*uE348hrdMUO9p!xLIK%i60?4Kb=wSCaWiR2yL^%BpCJ4-sere4F&zt8z;L; zifFS^#ts;DLsc~s9f!{GxJ|$um>K^!G;yn7pfV-Z|Lht6M{9Bva7xDR+5fVXlKrnz zzJCz^hnfa*&i3Ab)C&E|ykc@%{y$vxvYrabG&FVN=Z?C^|6dvU`q1m&d0E8&2L1Vm z`qRI~qxk>oaS+9q3#w{ruBsLQ)iyl;O#11?i{j7v&3V1%Ore&AY5ohN`=+BWiv@lr-?bo08%Z=OAhlB(;D;Qlm&H>CX2YJWT zFa{}yO~60h07Mx;GCH5az#e%;+V9Np#9DZ#L|!q$y0UxA-66R<-4+gpJ*<213n3K`$pe&`)qo(um_Q;7>qfL? z1q8PQv<%hZ0`EpgStxu3_F3>ve)=0vz-_>s6UiQNx+mQKbk$iq-2p7Wp>bTUfkCxg ztD*=wezB1Wbwilkr`(IZ1CN{VcbIP}IK5e+G8sYBYgd=A0@pxx{$x-}W3v(p2hAq; zugN3qOWc4|f|e_+XOs;IYH^@9I&v+%?uM|8mOP;~Y}CvCHw)U9icpE?^<)2|b>H^C z4BMXL(_;L8Az}Y(k|HVcsqB9Vsh4S}08=V#{M_5wIv5%J^^)HKw;C|pFJ#GP`F@*3 z$IXGnr$ojuS`B{DghS#?UqXboHC3-8{bWxjD{*+oXEV z**WI#4*nIvt`pw#Z2x(h2mM5sJ$&dV+9$o}{oR0VR@f5R7TD%VXCDFk?8r#AFP%NW zP2qf;>FkEdnq{#&9jE$&mZ!TwFv$jnmTwNXyTO@jJ zz26S^`ib7!9PB+j?BNERaIr&dF+e&(ra~ZtE^!8~=>#`8&2*Hm);ImZ z#ZyXpL&{IB2SB%n4LLH>j}{Pb@~KKde7cJcz#9#w0^k|DDgY@reh<zf0=&Pp1;m z?qIh~Z2c?)>uw%6A2e_dvnxb@-u=ISM17`s zW15)WhOsTkA76Wx|Nq&4FoZw(PcDI60=Wco3FH#UC6G(t zVo2ae-+VU2K_Y)|DJo+rD^L@#YJk=}M;M_0RzHIrnXu6W) zsUVxRM9&aaP|6xPNaT`(L>9b5;XxIieP-iTZ-OMK?xGGO2-K=IhJ<$M7myQD77MkW ztZeTAqRxOGiQgHbL;|NAen5sW+s+4j@dr1#|O!0V@9PlPy(XNON}nt8V~nu5(Sc=LPFDK2|sPIGJ< z3?8F(ueNtQHa)qpdV*G;9Yv7fjAgyQm8>_5LPLN}&o{QOmB2}!)9zWW)wKEqfpn$a z1KV@UL9ohmx5}Vn*$Xp>k~u|>_-?SXu6l~KqmhRB#%J+Htc8bC=9($~3Y-^%6Q4h-tyGYNXXM2Ng#n0l-(G)&ScR zBZXCW1+J+vRu`21sn$n@g(_|W*pg6gf%@g!3>N=w)=AJ7bU52y6LvSe8Jw1t*JZg3 z-VJcPk{M3_V`XI`U6O;b+B8Xc>@o`gkj-pv`EVq=et+h_*{}JpQF)aP^S>bBp;`XF zII5UhL8spbwf{NG-$|?j-o?~6UizzSEtT2-ul?oFoBsj+%71bR0+e=Ge>)-$39L6o}O*oEh%zw+_L5#&Q_J#1!w>6Z1ll8(t)q8BAn4Y7PhH? zWu?K$PCX0R`7o+$$m?NrA+UxG5jJ?GX#oL3wMVDDy0zz41s7Q-yMjEbww;YDg`(PS z)Tdi=6W5h0yI;pcox0FccX8xtTQ4SU>*E|f@LiplfWOC&tBuo>3{yx?b~mVa;l563{4b-ajF6x)g08Sz2M5}lJ#);p6xjH za%t_Ma_`Q{s=Mv1M7mC{oOVggK3A?9?5>*Hk8(OObFibW`4!`Vv(fSvc4j74R*5Hv zV`Ms&(}jzLZ$68@O31{1XljbHwTd*iTWYS&Pgg6Y2X_?h-gYdZE-0b^)ryBq7JE#0 za!?}@`9Q@U)4{2LqK4qsQ=(hX4sXrGx1LA&M}{edz=p+zWFE! zb5~k>dlbpeBrZswMsc|MG|-LAGJltFog4^=lPSzWXbNICaThN!J`gRQ@KdK$B+j(| z;lfQr0LYrwg{^?u|F2&k!k_#nmq0FoTmrcSatWN2!0)X*d!45<{3l~UI)iL$o+aD5 zE_sq}OQNH=vZMP2&$C_Akz7|4Q4d6wJ=u|6Bwve$s2E7ALx#45_@UP3Wtpe^l+i6# zt$1r|Zf^cW<`IsaJ?{v*6UAPzwQ|FR5Pk^oAQ*&0oc5O3ok7uTQ6`kosCiDw+ABTe z1oFf#Ox3Jd`Mp}bO8E#4fq36Q2n}59=w{^`zVHo(au;WE%EMk^2vZAL z+d;`f!L^QWpc_;f3z)de)p~{X2f%CcxOd>uapZDyLjSNG-H)DuIKylBdPo4rl|g60 zMeLz?qXII%sTIo!kFRBf-pDJjBek0fmf>{{J#RO`{?Ge9EFrr*yey~u&nf@e#J=b$ z;2j|8xa^!ztR7-js~iVYhfQrZ#%Z>23_70&0fW7b9otMpzw_ zok|Eaz-!NVA7eIOh9;-X?nJE)KB?GU`SfI{cd8tSLLgWgu&^@P=k_@dw0q~I?`Rmz z`((pt;s;$)NdVlfinWZbL2;K?u#&thpgnl_!T%qu7xX^hh@5ZjHA_g7WioKB68=R` zPAitp55_eH&@W1;5{{o_7(U`E7DQf5K&Lxrwcv#VvW3?Efru013Oz2EApt9I2zpQ_ z0Cfwf@&Jk<0<=)B@q7a`Zn5%=i#*`~AJ3~aD7C?)FE_^x6~j%8UWWY^t_JxLPZ>Hk_m-U3=l_WMfzN9)+3(xU*NdNTcA5-H)IB>+gHrfy27!T-yn zD1?-1{c8nt<8y!BJ^uglOJ5y&^&|Y1|8z>=d)~9pLhGfpdLU+Brr2U`h(`P&v5hdFJ1{Inr7%asJjYeL4wgMFLeKDGcTd*UARK` zHzNN*G^yHL2&;Kjaj3Ptb~B-Bb8>XX$3EAsV0m^e6j&NPDxq+z=zI#H;BM(Y(B1xrF&@4~Q~)rU|F0QxK{<{6ua2hIDj>aE-FW%G%GSFn{{QNbIP}I} zy}tD7xABi2KOfzA_Ic9NkwO~k>54Dex>3+fz2Hkq!5*|`^94&G{ghV3#02X%f%H=< zp>XOxm-NwZ>fibp6GwGJ-tv*Q>DlRtqgY=gGu6MSgJ1NO2ifb(pS=F;bF^MefAwFY z#yiU#wS3>S6-QJ}#DqOCa-St^eDN|z7q=f+-kQ{yztgzy+;O+(8oMhR6*SGj!+wG? zM~8;K{6BsFoo8?I4dMrlkYk_#n1Cmlis{*gS1IKCU)3$iDM*fE8p!pxHC+`Y$Xy)fT{D029=Ysk=_Jgj+?RJ-CeG{5+n2#zg;aQp!_9UQBAp1sqga_%|%WaAG`jdC0Mf!TNNjRf&Km*%9G* z?Y`H%Q(e9@f5+Wf8q;cC#lLg3VmydGPT!Gkkix$hj2bI|j_Sl`MXB`{M3N8&C1osH-tx5$u&%wz9D7}!!Ma4oNnn* zBeK*7N)gV0uBBnu1_Q5!(W9V(4MVS;M{+L%jNw&#CHKxR&fhbe{<^pJaB6CIqcpqU zsvddKJU(4=@2LfUKFPg(SadOTCVIorIoeNI4rY~QN;lWtUX1RR@A%=4-!r3l_(g5A zfEb*^CYwXSk!_TQpMU;P@Gd}*^kqGcjh<_=`3v1~2TBvq6hjoX9`0Sup7yBoP7o)L zV48u*JcYC0{MN$5`=zm|Rl{GGtMkh{LY@y0}tcyNCDa!Y{a{}270A^LLxe*WX~ zv$wcg`oBgQJI3W@6%{NLDQ&Z4UXcMPzBo0#Du| z4|JSH7B+!*yTS93>HIR-X$8bvJk)gYj*2C_)MPoW>|EQOiztd*(84<1DK{6f~ttKk<-a_|C*t~Lu|3A1Z@+h^$2?crJ5%`&Xi{SI%+x+x5p2Q!~6T*I31K2aY z-8<J*+#zq4PkO0xux_HcrW~UN4VqpV2chK z;K(vS!9nY5SC_9|58F)!lEUxd%c14u{xx}oeWDwXRn(Y?X>+rVJGDr>)F<8aT6pOV zVVN4Ul1|scR)jQ;T^Uir0%S0VH-ly{;a7V3ia@q`RNV&)-1t=8Ri+O8nY+e=v1nn8 z7Ue(>zTFoQ+^N6f`S^|3Aa_7t$ z_r*)UEmFqK^V=1JO_BbW+!MpYX*(i5OSk>7YjRHd^7)*6GM9Llqnq%E4r!v#YK3-Mh|OdHn9g-E8gV6J)0Y*8A_j|M_P>6To^W16Z%2 z8V)FsRV4CQVEmE>{oof2)~jp2uE@5CToy%fUCL-F$W#He3l--{5)+v1TZqy^KiAF8 z%1*Ud34Xm6o_SYLuM6)963!yb+z3ubEpH0fWECcwBwr8J`KTQcmka>qy(Dk+T;aR2 z_%T-G(nm3dwhZ02L@gb^tB;CC8f=TMR5oU_*XxwDy=2 zL;!spAfqM!#TYR&w4Mkk3|)b9P=X5)Mh%0nk}px1!CDlal+{r|SS^)_Iz$zYJquvj zJ+BcsA2}l*wTB-Kiy7L2)G%nSn+*I){vuq=Zke;+EoS#4a-hTvVDP~F8BZ^Em0m%m&?C;PK3euHe_F+CD2Ecs( z>{eKLn1^|gNgCf2GyAr1MT$7!0Iow~^dowL$K?LKLcPPzjpsC91Mn2=#*j_L!y*E& zHk_HRFfzg(3d;dV;p)VTie+JBgtfhS^CtE7&O7f2E97V|+!EFhSHa8LC?VS(B!qOip=4gp8{8=!pg9E# zq~MY^(cKml=xyxLE1mBx-4doqR-vRIA$rg7s~4nmfHM>EEvEXGg8z9xBpuvrAVR+C0AW4EPU z4h@)(DNMO1>llG3sK~K-d`Wc9Zw1dB8_a?z-xAGR3Tb5G7V@4PiIo2y>Hn-Xc?viS zLHG23S<*vYH%kAP6$4i@`agA46HU!f+k0!%_gTS*RNgH`FQi!i^myvV+y6(l9!UoO zNd<+gJq^SevCY>#QYlCs0(~zVURcd2Vo3u7;i+?u!!p%3(;*%Q46BpNW81UVSgUbI zt~5*Av%0)uA4CQ@24)?YgPeV%P=WVc56HQ2uT(qI$!jdw>Z zvWz2@hH&Q&$!?OhN3xTB?~<%F?HBAH1MQUT3T!y^|KJ%D+hz9i;{tXS`zzWtd$&*B zJA=NW-7~$L@Rn_RXmDxt@LUC9`)G8EZKds^N!v_Wi$1o~sNXMjxnD7IKx36Lj#6GJYPOCn=Rwvz7 z=aI2M3t@Jttaw`}YR3z@ z?^&tM&>hW^Z zJ4J$Risu_d=TVo~C$Jj%1SlHQ-H7fta(=7m5z>(d)x`0YUKm#y- z+m-`|q~~ri4&32e+`rq-#L0Z?Q&Z(d$Gcw~FFvrA<{nIy<)g;(BKioxDdgXS+aTh| z9iDG&U!$89D~htaKEC12&hATwGwv408~bqrf8Tz=tAvn6-5?v-c2}rXYf*^X7oz&f z6deacIPt#Iu}KtfVkOw9A`y9jf;a>(u1!TMuEthtWOcv@9mGMZjiSJ9rs106D`$1h zQ+?%<33@p*YHyDfm#i<>R z$mi}MYPiE31$jC`xZExc0+^>UI%`%PLF=YhXI&x#4oIkG$z#7U27KJ8o$#Lak`D9~ za_|CNm7Czz2Ln9t7__mGV+PJtdT7`4E!5r{z9oxdCzU?+T(*u%Aiw zJ{-cI{3n+{E`eMExdd_v(q-E&7>+Kw zrf%4(=(`2OLxC2>(>1FgTaqN}if_xdp=hFFE4ry_D83{bimBRdUZp7pWrspP%0cZ@ zA1u$0t*%ZkKN@b-tO{9FyTC0&yN%9}!38^xRV%}3m`6MTHk~1iT9+y)C{A5*%krBr z6=Ey1+#qZ7n~_h_s*OuaZu98S^v8BhWz1ThuTCsxLv%htsgxHDYAY#9rtdVyR86kV z*4JA*=GRCW@XOV!FY zn%qTY`?6Iz=DjwkTckrBmf(-~^YQZCBf)dWSYzWYf#`D2w7&N$hXDU|zY$(* zVaGP+H|EFfX3gBtC-@M0ls~FUYGi_sb8=$@RIZ4cn4t!37v?&izMt8DBQr zE*Xumg$z347)CHR8NCJJ10uHqmn59)2xjv=`dnhUx|q#{l@iNk@=ss&baUei?`Qix z|KQbUU*@sgKM(Wg3%2Ro7Sw5%iq$zzubJPuQnYE^dH(!m%%8_tt^u-u%25?oONx?# zEun(Y2-hL)YQ0`PYzU0$h_pn%Uh*m~XbhoX(yXB%FsZZ_Rf)QRZt!nR66n1`xmvHV z{s59l9uF#iARgS_j&xSur5emOhNa+*f{U19%NwES6`PYRt{h*>7##;*6MKe{bHaE6 zkKberoWUZEx?W!7U!w180q7y%8xoG^YH zWIG5=Z&CfW+rigCcpty=<78>#gpOlDupcSh4IF9bnjc~HJY{`Z*QP#|Y zUvdk&uD5v+r!HLVesOGJZl&%mZ`?mF-<>#EcAST`6{_aWd4^8VYvi%}=SGty=_L1F zRXOII6?<{2YUmH=j%Qoz{(5nIyIP7qSV!!Bb9mgU+a-YU!Cice7<%iNe3m&-gAmOl{J4wGY^$*mB>CBub(|DD04r6Nx(cc&e)|j4*?!R9Z$A4(%g0yDsVhk{S^Dw3GI}l z0-&3AkN+#CvZZMS)2GD#p85Z1-GBT)r2qgZ0mAsdE^3B;%J@I3{H0m{s)+dif1j=Q zviSd-e`5%L@}FD+xdd_vib?XTQwD|33(GgLU8bW!tq>+Yl|q=viC)qJ;nRB8dYMtxMzc z^LHM&cUo)eky0tm%C&=g>P{a~`_isaU0tiquP)5a9W1P^O?d02dvdgo3>LKyd7lA( zqY9ROsa~e71j)QnVYy^ZK5EY)m>-w$J%`Xcl|muRK{~uJHS~@`m8lDmAxay+@Gr7m zkbiLe?3Z}x{V(1MLhridI+|ztl4MG*FRFPd`^M;I1x47u!QhPo$hn9&{RXntJqyK_ z!{{xMA44+eyZz+ zBgjSN!m+Uhg!6rr3_k-WJ!lA9WstmqcX0U8CdwGP-sbQvVUt2_&$rg;8 zz~uuD^r<5AkbkFw+&%uU8~T=|indQ^-JbD(wC*?luNO}8{}%uW2;=`6SX~tjzYog) zpIx|6HwzmtH?oy)j{pBRLvQ@bOaJB*W59pPUgSrs&;A-Wp#I)OU_ccLp5=+~otvg) zC^A?jT-Eng-IAPw8=glVdBrhJPnO!e>^XM%5@MID<$yg5 z6ja4(i_-HBKvG6)N3hD( zR;4L`gRFi`-Qkjed6%;SvP8S!GGaf|**(9GMK@P9a#iEPs~TjdAnb!pJ+@IK6TFZf z!jKvm)^$xWbVX4K9vCF^1huQSYRAoDwX(&^UL{!3c^RzXm`IFfB$1Gbn-w-W6U1bg zukQ&e%8n6}SmJp6JG*#<&+4#28)w;8sj{UL&siFKnch*+jNK->;5x7K#NIr{6UNn! z3{~0EeX*eU{pdz$-LGyW%OFDPsEwq{p>Bl4o`NFlr_qhHQ4KYa;&%yaCh4PwYHYmv zud{WdAAbAUukh&gPd>PP`whwol2j2akA;G-$rPAI9NW>^fDm=f#@iNr#gH9j^Sg*+ zJHGB)x@6dvDoH-ZkEgWls~0bNJ^QeDJhi{GUmv^saL#zp*r{2HO4T*x^D6x0rX> zL&-iAdut$04YtxE>P9jGQ=&~SL`UNceknSJKsWLTiTE^%V&5eeRAm1*5vXW2u-g*@ z0F{!XAUO4yyqXdXQ3`-MK(S1L1;T^tP$RSB!o;IcRGnQ5&dWn0zLb-XwCDNFM8bdk zS}d@heCIQU*Smd_JiPv5!t2S;`KcVjS@C}gv!(8G$NOZM{z z?>ze|-=F_{EkKv)x+7Z!SJy-hr~azE@l6Uz_F{**M`SZ%DWs?%%RwbG0_AAPXS{dx7`S?ze%dUemceKmO2 zuo&rWDq|07X_PK)G_7*&_SJat3C#tjdZUAM5J9ZP6pz(L(K6?cwhv^}*?-t@rsm2E zk(9b%CjwgyO|O>RtG9%!6kys)x7Mf;>9N!-#a?55P#G(ne{_{BHfq>mbup7I(`Fmk zXdA?8>u$DPrSiPNm$Dj-623{LiC20apUat<7+-p@F;iAmrDYylC1rm~Uc${Xtb}hq zx=J2x5+@4+*1ZPmH#2#k!#CqLBRWss#yevDH|hVl?bqr|eW#E5zWBBG62E<|(R9(n z`?@HOiby&B+IztPI^osp@3RB+4}fZ75l1WSAo7L9sSzS5eLCa{kvy# zyqm@jE9e}lDn1?0R`Eaj#b>`tYI5Q2A8y^g{Svvc3XWnqvSRoJOVngTA5=|dyDS@n z;dom8;Dfmn1tsYqRfjxfEy-w*Q(?&|SIlE9KXP`bI92B4$d7`Kil7MG-jnVI6zJ%4*aUXr(GVl|YU zETpS(a~hlId}I4s3EPo=P@VHuYNfSl*(}-am{VWdcjA~}7w1fe5gr>}Ft&M7tr#5= z5K4jtjff>98c9)nj00EBgG`b((QH|!?5SCSV`Ee`w2jaF{p?NkcdtGZNaLRP(jS+? z`RA#gB#M@8*`h6JsO_EuvOZNAE%E5TK!B_sxh}cep$C$tyHEBKx*fiCV|e!v{vPB_ zz~qJ*g@4c};DF@N*vGCB{S)oFVxRyufX^L<4(k%00ALK8C6E2aVNs8UU9aJQ+n>1p z$$A5HaFOAt01a?iDLxy-#Ydjgf~7PX`?9e60iZ~m7DXYjanVD&o^QdsJbX(Q0Vq1z zbJ;p7m0PGpfJ=mHz$-L7Scq=px`4<*^$@@XO6BKi`~2p49l(oR2QXe&Q?&}@s}Zwm zn?ivj-4Xz>zw7#z;yH%qVzBi{0AQ`-G3g*l7r(U{fYs4(EKx*ht6AOkDj4#LauVbw zNg>Eh1X9gVh!1dZ{C~P@kW>|Ef@obo*41a>`y3bPh6vaTqg5$fQW-3xaGHqA)9mDVnzEx0cOH&+CGE`spJlAs^ zN0%MZH9Z%kcB*7(s&&D$09NWVJN5CMJH>;Q=0dABtvE;HEBo2_p1j82bIJlB^*x)= zEymAH?d$g{i{l&a(Y7-qRa@$sTiL%CeXvfH;R5m(KokS()*=}G%{}WFfP4o$b{w=X zxYdV1={v0&9pl_~1ljlNC9mTC^f#V>#I96t7Af@)=6w@&0Ve^_7kED?^~btuvTMnZ zP9_cFY@@Yp!NRUm1wh;p!2gaLjtcAv@z}1QOQNt14+5($7+q=8l`Q`d6-z4H3GjbM zTjV*Aj~P(K@O93V0?_?~pX1j5;mVUMubV@E`vVlcon9$DSQ}F|4qM9;>y0@{b{3?_oyZ}U@TCy^ z7;eGn_Xvj-J0=+_h{H;8L7cW(FkR#TSSYybA$`y`4HpCpMAy*OWf_LRBKLP6fUkl9 z_-J>$SBPLDARoh$CU88J*4`d>12Hf)UN^>gglKAW)R4{L#|sbdm&T@64S!v(&M)tb zOFPHM8xtQcKY545I&ZG;`eU>6^3wFm+SKCl>cd9u-n}{he8s9co-WA_n!2UC zsABv)#QGwns_R;oRKH((G7PEy=#gpeI#b^2cxAaVGgqz~i$+zi%+?~Qvgm0vR3iX3 zMA9}|8HRJ1SKNZ5nu;CK26EH4p-Vo_1CJ{u%&E_N~2x>SLO8a!`A z4hVnxLCN*pTSUxtQ$Wuk0zATh@R(E2L8^YV>ypEpZIRcJ)W6>@L-}S*a zce7(#XHIe2dHL4PZ`8iw-T)OHOYLL20I~(C`4vH;M`~}$`d`H(w%-{-EtnGx5tm<$6=2jR2)iMq`Xm=Uvfh@EF$re ziZIdx@<*c%LsjTnLAoAlEO?8cc$izFk1dp%f_+S7m!U(kKI1-!z#-7vm=L~kb#IUA z93zrah9jB=1@1|Cn%hB)1b||Mm(($5`tI~<<&M=l%Vf6!1l+|?Kjc$5Bxp>Q+GA4~rS@2YV|ywtzLCUJ zbXi61WJYagJ}#r@JDHQ)nTNYsQJ^%Zr{T6|0W(7DYnYQ)kQ@9i{=1Eg-Ybdp+v|8b zbyOJh5#ys68XID4;$oQ}GmE0WYipZ%3gp=!|E}@K)l>-DV?7Vj>~2yh}?#4Kdy3 zwa&Jun(fH95#_Ae{^9DAuad&FWTvMxMYBE9JI|npX66)}yB^B(n4Yg9%JP`9{LbBHsK2)q2e; zxi^G8R?9Sfu?^Q(c2SbM{{|=RCzgKN7Qy0=8G=%rHwC_KF#7($t3iY+SHM1iIZcU= zvfWAJCz@U?)pxN%#r*$lFk=dWBY`x!y}jd;)c}G!GCvA7@doL3;BP@u zdeWVA5Y|ZkjjAD|LJV1&h4L1 za3&K7P#9rbJ^jkGfItGbx#|Ww9f_?Y#kZ@uxSL$440yP-G#hcEo!Z#{f%^7B`Q{@p8o`O06$ z9)RypKeg73oRVQa+$7r zShs2owu>?55-7fnJr52*=*H2U|LA}{=@+=|ggO5>12kV}-8dt4kmtwqQ{|*j+{ZqT%l=ai{XAFfwwFNte2m z)L&y7C5(jdA;Pr~c1o#2U>NX?`*kF$^KU}yA$1?Fh~lWE(jo;;xx{VQa+-L!_G_V5 zqB*Rv_KP+v3)RCL@Fwp$tv%9+$-s4MjWH>Mw`YvLgF(8m*IMP>#akSz1a$m z;ga|+?}pQnZg8R(cB{5N!p|S~Fd|$d^P=skuJfMaFSJ=neEr*egz|^t9o|eHik_Wo zl<}3P*)CLZ)KvAXMf9VMCs(mV{@rhxrnag#CmIi=wS)1wgVl}I?e&sjo#zsH7c@!7 z&@K>(X#^CERQQ4U0uXOx782R`HLuAX2NgQntcEMhMB8jCBd4_peZ)s2QhwM@OO6O; z_K_Drfadf6v-j??k!5Fo7-vSK(MTGtC3&EA)*D?@Eq6D&yXL+ht>I|-rn*TEUrjbC zE~xut70Ie%*Mn?!qn*|4t{$t^KD4{?wvog(>tda1bCt{>kq<=f0{~w~AFHyV*ULYE3uqJ@?#mzkBXE-{bfFKJ*nWFw;1<-dZrd@%}ge8NK&$BMWgGrx# zby=^#hs1hRqfrR_SkfVo*u4kI6uL2dH&{)u^pS)Z3)T)SD_UTSqb-JHprJ9BQZF6tDnvRN&UoAgejyV#WqG)H!K*6q3fw|x4%jPp3n zUfJohDqW3LjH{8M@VTBi%I9MHHMhb^cKUdyTWnRhz@siZ+=r{Id~r!N9&mNhv`kBN zXy}a*tS-NC-?EqQnHvX9yEd&jOSL_3b22zKcjDFMA}m#XAX9&!hzVX_HrqzKQ9|4s zJ@wu^wnPDj%ZM%Apb0o{>2uA-eBkESC5*fK$Ack0o%fmP$8Iz%a9W7_#m`|8+RWBw#}U) z+pG9zO;L(EytLSt>caOBk^7!-!xn=5s@=HB11yzh*@5#HnnJ2Cy39tL1JPT7H{ih` z3^1h5ERmBmQpPz^zsZ#8Qy+itPrpU*Dng~%+S(`YKK~{J|Lfnf?p6J<#e2&Sloj)^ z_E;XDUDKQ1@nr};bk3m8BROXTdh8@V)xswVsUZiFOG7fBT}$P=FbbHntb^^su;k3m z<-O1ScSG+C%?*9_CvWRt+)PF$!7W& zoO~lA{Pzy`;U~iTz+V^mU@eXA#{1&;itgNcfhO>~vO6KXa8yEAB?=2falGiOqR);$ zCs*1d?;)O%%mHo&}Q?at%3B?8RBqvU_y+iIyx&Rh7`eQv7_{pKrajRA^LRMXGv7+Yz#Gwc z!jMr$V3z!{5Pkb9*dr_(sFsI9$tFN9hAL^gX=z#@_OGqer?VZ6p1(?)&HL2B9rl66 z2k6y7W9F^mH$!hMY#1MFZG%@7sqnFs+q%95ZJv!NmT=o(ZUN&!U*&cr-E;tn_d1YD zE+Kf7i3|B;>G>_vh;o&@FIO}aBCU%;bmKYMIlq1kWLQx2md7_XY8&PI3y+o#H@)?l zjls5$)!0N&R=3?|iQI?P$5_}G{o@9LEo_Npt`hQokf9E@7~nBN-7NwH!3=T+`Jf0l zR$N*@-C}9qgDa9W9SYNgwT280&W&?#+oU{NnE{GV{?hY1B&+XO)it=9p2(_cEiD&k zXBsnySk@k#S5~nfXa#!(+eA{OtC?Q{ARYW6ZLpmRsysH2tlH!H*mAMhSUWbW_a4+X9>p>l&`kM$A#cUatKoW4dOF_51E~8DjmU3ILV8RI3%6%k|m4pd`;%ri_VVd9dj;;cN+_GNyPEptb8#S$Lz*IyN z(Gx5eJ^Yn}%pJDQUGn6?Ua6{`r3$$3(sPmIdf!rJ$4e{TLUs23y_Mt2nl>))9X}Y0 zC(lKElQs~(y5^~(1HX(4>KffPoSvHHAaYgoOBSkJkb(csz)*kx;Q0p->aV|R8T$S5 zdaY?Zo}8`78&96hnlp3$WGvLa7x;GbDg}aSfx5M75)zg5KL6s5iDYGJvXuY-xi`K( z^rb(2@1J~e|J}mp^mnG;`1;!;X`BC3{O=#V^W4Cc_+7)YtkqI^=Xh!1;q=(_hGiTq zINHMcU{eC-A0;L+gdx+R64lhLmMV3D`{}Ub-)6cOEY~oK7yI^jFr3e;1mulCh!1B7 zv@+5b5J?&t32{jyBZAEknxwdv5xu9I*O?m2+#HDS)`+Bq>28t9FGzQV2Nlp@6Pq{> zrytt;O%@Ym0YVxrndOs2rUE2@SfHTH9bt+0#t%_k`3_RLU|;X^BO;C<(i}P#1o^Ho z!79pebrJ%I`b7LrP4!2=;;BlF5`n0w`gyYsE1#he=$ZcF2R}mtZunb5^hn9waXq{X zsXHrl=g^_TjD7ZaWS>)XEsW$dU%(oBZgwY+kY5N@vbZ8cfze|loOwq`wTkYJh86`N z!-lff-mt<1Lme8ab|SSSCn3xWz*}jSlmUP(&_Q^_SQ1|3i19;^%wT>4*)v2d@I6zP z9MzXl1yV81o~wI%l#dAoZx^pCdUE=Wy$s2_G1z*~?&ac$?3wQQ-#fXasl! zNhGxFjkr5HCTr|i)CC<9HQ)r&MnCInAe&ziWKZni~I;Nv-st+iRILf_h=^Nl+`q$L`Mndm@ax2^= z!f7WrN?#3MV9PktqvcjRz$fipeDFc&HD&ikGx}8cyhxsvT|MC3P_=Abe*d{nn!_8` zs@Nel)){Hn#Ne=y*vl4fviGcf;mi9QPJ6SeNXH=*@`c&;Y?u9Ga{(rlZ*&*+Xl+p z4Z2ENT9$nUct-9>8U&u9<&Gql;Vfb81qx+l!ciCG!-a`;Yw}*he$c2G#kC|na1kyK zM*`eaHB2dRWMnwYz@V6ceHpGK;{|vjWg~MZXZ(Mk`I901$$xSQslbUP;kuyaIs(5-iAYEe|vjwZvIpyBOE(NAtO$x{9W*gWaf|#Z&fy`P39H^&LJFUM>MUM9`oXrgla64!Q~>H3Nwg)KY%l^QKjs%1`1?D5@C~S zg;^H(HEhhyAn5}oZjweoq8-1YAmGhJZdpp=PHqsVzo#$saBtQ=Htd>>Z$op;>A7=y zZlO^=fC~VqT83Ex(aTk)=WYpg;CnFCiurs|a`Z&mi1UVV?YzFgh|aLcR?CosW#5;T?fawX72( zBYN*eBKzVVi%0f_Jr@*qDZ>#`APGnu=IMynl97?rYJ$)YEj_f9L<=Aj%bh!SBIyvm zlY%`HdTyPZ@SWZWBF@XN0+vi=nt%Ps(UYu4nE>Nk@e~X3K4A zG(7~`Iud?0-79h5gab(pGC9X``DFw!+6ICk(F}vgj}t^bHJUgzUm~_2xL%`eA|-q} z#`l2M!KHen5r)J;yrU>u6b?3dj*hKl71slP$wwW&)RpS(Fo>9b?Fa|9!2QEn6vvZd zhLFoTm4`eLtk>l|)+;bx)HN+kxLyIhT!qG*xKM2$2^^@wFS%A1}|3t*%ZX zPp5uhqi)I5;XUwsVV1;a&Tlca=zHZlm1X&ET$rm|uPyu2JI4H4P`Te6t1ZcM(=yeU zCM5Rgb?yekuc6L7n$z^MMGZleq`(+6G`1>`5-)Ne3oXJmpQX$_WgAgJw9a+C6PjLk zrBpmDAFnJN)li}Rez3MNJvC8{UsyX$?l z$avxM)B91{&UMU~c>M49pP97L?6-H_3gOdmLbPWtd!QSo~-~bl3Qe6~XV5a?V z%JR12%8Et|r#%e(r6@Al<4>V>;Hkwu(J-KD4XxTpRGiY z!4Is|%ZX^jW>;wXwCP|BGu^Pu2cy?d`)SDKA)mqM+OuZHcN#Oh%6fT9Y0SCDB~#gX z5F1?t*2OQ8jr`rG*Gc%-?+Vum35GNL@4Ld*@Jn}P!&}?p%#K{vg!OOtW=H1+b7yB< z-NXG#?!=5M&*ac%&lgI00GBqqocy1$oZ8*mDc|jx{MyW^O1+(S87 zgV4hrch{2oz}>qTbnJ8QA?CYi3ukX?T#1L6yxGxR*}sTMtm7F=3h9*RyQMoeXoj?mho3xM+pUwfp$|O1RVAJVXLp3NS<}lEjz;k6 z38_^gWXPwLqU6!K!Q333oeR{6oO9GH46JV-uu8|^8S{MB2i1$k`KQ;}5j2cE-^?qX z=@!rMi+6F1N8tFhXZ-pzGKIM-EG}Y!VfDK(lNYj=H>`7=5?q+!zDzI8By?Wxg~{v! z04?jr#_F=u@p@)yo;Auz%JfN=;-hxc&<`t-3Oa-c! z=9+zJs#+S06R!-UAIE^4m#!Y=k^Vf=pG5ORZKF;1NwN0lk$%c5ZIATB_@vF1lo$#& zqJTYxG`r|DiSZjnb#Ns9C!(UXoui8m`VJZb8Hw60K<1&v(=ApTXls~^trw~FK&2ao z;*&xfk__mFVLbs4v3$^26S9u=n4*Hj{yM}fepCe<-Nb~f7XNc6aHrl;zh^*vlsyAcz65% z&9~kd`fL^d$$xSQeA*-cck>9${P*sB?I(XN%%W}2itT0QFZ*L|V~i-<3N;^fzQ<;! z7FJKuLa?J3PYD5U=X`zVM#&q!{wXpCk)GXj!6gS~mNJp|4d1Oa_xGQ*`LG#kYtGiz z7w;STL~&}fxHMmzG^ZvX?_g^RAy$m89~VaTYGQGAt_~Zk;%7EBuM>|uLJ)3~GhR`$ z5h%RD-N#CNg_c!Z8a8EgakB3U>b}PnbEyPaRB4Wthh@p@=R@pU#2%BWJa+(_F=OVm zw^1eDpRo}Tq4{6(No>WUhCCw3NWUtN1)LqR#@6qqnp>7 zmDEjnofu%jZx7dCfusB@!0+GXj{@n1lBznpzT2RowLaU_V;_`>oMe}m_TssH{AL)9 zEj0XyyOTILT>F4j7&aiDOoqK5Zc5L;4dPm~uxp;c)e_Fd3x3*KL0G8bCZN~_IY+%A ze2?+leUEh#wngqNXmC+k84t>{?9YCnZKzw;k2i0~K0gcLD(3I`MOKCje9}B=_@|6cYf*-~^!gI(%0|wNTLz z>Gyu~|Ct8YSs_!6%{LFS6*7kZfA_bB@F)MtC6G%Xmq0FoTmrcSatY)Tc%c&b?b^vL zjyL;xJ;a-dif77NAZk7oL(Py3*Oe^C@MTT1WnZ>b&F~FH^i)UGTpN{JZO_Ch6hzS_ z-|U<~aAyyI)+_%1#+(1g5dP#pxddKo3H+_UbaI;qAOE9og~3Nd^dwWW zWydvb)q`f0mys*vW#m#drzl|Xx|NYjs_NxTUZ)Cv^&sEOYj!bm&b(&Vm9N=_Fj7Qc zbqcMURj%tCvEZD^3;drHs`qQPk3Re${6_*a>%@PS7xc_y^6){tMlpF#jM`Fju%+T) zK^WU_pce2BY8K{pEk#pAS2A5ul61ubMTBfBBI0+FV|lJ8DpFvnvZa}# zV;eZ7d%mWELPB>f)sQ^RZ2_`hy=dL|^787v$;F9_YqY?VQT~=YxV(xcfv||$o4!zi7!Afjbdo~rJ#W}>(o}D z7P9tD3bfHVcAs>$xpEbd*zks47^MT8m2^cK4!a?74%C~tnBTQapv*47Zaa* zm1kd8L=N*RLnrUX$o-?;lRMa1kdXMhQ9`2P=&osCfAP)0(gL|xl;Wx+B)%#Ik6&6< zjdQG9YOexleWXa5(^J*QCAYe})6`XCe(uQAEU%RKt};_3=gmrOs#y^s1(Vo=T%@ynsE`X*tI~ug$qf@ggFl>b|#BC9sTEXA!Du4H^26??)Lv% zZ`>RDtohcr@K^pbumt}0-#C%DMevWm5aRbV)ASTq3p6p1Y|9cI`~&f3-;;dRH*{N4 zY*|(eHE8+{ql7D^}o&* z!O+lO{+GXbd?L~dm)`&J*F&OO6w~%p&r)4Y(jCpm|NDF4SB$7ul^t6#EY(*nQB_pK zF)??IWMAkM(?DJom9R@v0Ff71sx)pW!iXT@{~G=;Yd4W(hXlH)t{k-vV^1t-1tcNv zk`!IJ+<`1g(Ipn2*T|!+Z99&MC8i^9EVYoO4jTtuX>87A z?;C$GdGY~G{)w;t{cnU=8cFt5Mbb1+wH(_Py?!Tu%W9V=^1phC{EPl^qgoNjhoA^< zv9#~ie8hB+>53T6F~{+eC2tG6&64X2P@ACQ(8*Fw*l$)`0CY9M134kZb$ovhZh=+8 z=(rgTY6*& zAGC#Uq3GA*ap$G(^NeX0OMJDWv!_bk#~()cU4$Pg`#c8xG;Ry~e&aemw3=`42_6M* zDM*X_e`nt>BX!+B5S(N7H;cc5OmAdlp;>nDdEqOIR)&$0yMn@4O-DxVMGFGHT#yLx zHtb(m4yd8DRZ&{IVe167rImu3Xj>JvwF#X;n3xYQwTe({8O^sUC|c>-l{m?q=i)Pd zxm3(KUac@V5*gN$W*zJV?5VMQltJu+2ZcF^Ff)}6f655~`9qDi`kLr&Vq9a`aNot<9ClXf^yhwH+3D#8k1LN}1%@a$$d)XGZJ zsW(cEW+Qr*LwmpJ*U#`MN<3aE{+Aa2i$u$W0RrixXtKD~GSos6aH$T6DWh_Hc`9Fa z`ad)u(b|?^jmZvl&>rdktTmdYGxl!}H|zEeBfns(aGdI|sB)xg#>Zp{kN_V4R|EzBqL3&-mk4Scgth0w^OdJJv!Q(FFy8S>$5!>>Ge`h@R)-pB=N~| z1_3V}jqQ%lIOW6WLrs?%*UwySvX**jL;Bpg@A4VZSV=%%!9MgOLq zEBZI~uDGx4?F*8`1|~ecPAfHv#$S)T7Wg`@my&Yyo&6Tnh{y-&!VWGJ)(81eaQ^9a zq64Ca9la4LvslV-qT}6|?r&R%7w>-r9OTV_yx8w3liI z!uZL`Qt7-mB*xZ-vO{*Jlu#!-uTJ9rT9IFcj{|KV>qq*g!WJ z%D{2Z{K8jB0*wFf?SDOlKlx8Cfm{N)1ab+y))M%`&!5OVa{nhEL=^n4sA!G{27XVK zZ9@_**DzIhqeVk^Oih&n)l^(t7d_9g-M|Pafx)pgSq^m3_tiXd&jMeZ^clEzxXNLX zk_(-JOGmX5;vN(R50$od25bbeD2fzEp+J>Q(E6~h9`n2NgvPMbGyCPwY#%Q-8%4zL zd=PpgxK+nkk4kQlSh-dZ*t0QwDL%@cWXC@ALFJXSWN?1OshnCBu|Tj?&*B$Uxd218 zTcv2305Y)BArWgq5Y%J(>H@|2fgHd!jiai-x(KfW7NG6I)KGleEwXD7(?9a@A0<7c zeV@_}W~)a+nWCVn!Fs5+k$&bp*q;acU%g;I>bCV4g=bT~^=rnG0?!M5rm+dh{Xv$_H$tc!ozl-GJ6Ca%b}R`Kbs{3FxUPKrh8$0eU7x|8GHj zk>e;_hue;(7v#26r`{Gjuf!d)f!)MIeLEUlST?ZVz`pLuwkRotDh*Ug*UZ2*C8@h- z<20z0*8oh(eU!~1nF)aeaf`4e+^f^xmcXao005e#Y&)Wb{7rHq1LV>`nJF8P*5SmB z5>*S33TU19q`LF}D=NtSdE_Di0I-CAMgRZ+fFvrw2n-PaH$|mm{9mK^|0mh;e`f!` z_3;q?ibwjgl&$k0v5p`R%B}>&+ z*ij0OYNF&znyI;>uak*o2BMi8SFgBnwc^9LBCCheox^=uII=4ZvYF~W!yEzt9oUCe zW+^(<76ucv4;S^6LJ)MLXXpWumbl85=i5K{fdO`5|wX4J)LVBwIR?Y{$Gcg z3Oseq#xRL9If7yny)uKBLRn!|?(vvA;N{`eJmFL27FTX@y?PcG3=5Cyos~3PRf6 z!?(qN*PX%E6IJ+K0JRQ3dcr$Tk+H>pXI~{a*0G8RD<%4R$z=mW2>&ND;J~jQfK%&6 zr>6-Cxg5JrMbvN?8Z(VITAxZ}o(O_K1`Pg^=s+rD;g?%L0uL! ztUBy|tXO*LftVktef7ht7!?pB*Hi1*Fqn9BVgc;&7$2a^;ow79-(t8JVu1_C7O#)A zys~9CKw(#qX280I%xNJdBa~s$r&8-<>!Y=;tJ#a{GzmCvQASXrnlV5=A}87GICeh{v`0Dv1OZjxzoO% zGI=AhwjPbeMTb*%=3o5U^VEyvBH$2wg2zGJJ>lfCttq-8BHz}xVReF+$8zPqQyKYm z+a{50V+W-F(=IqFXqeXVN&1xG${_PI+KRU^SGL&<85L-%;T)e=bRv9J(O$~hw)Rf* z=^MgCSPBobuHuyrOI{OOGMV4}?O_D;O>D>Gz}Gn%ewU|)Jd&KiaNCDU*PZHXB=vE{ z&$C4nhp7PU5W5Ojw;W78OZ#op!H3FH#UC2)Zf`0Zak(K$`R&v!zagg_B}NAfI5Gr(&ED!e{j zB3FziA=fQh)uHxHzEutCxUs)Zxnu?M|MS{B99b;I!tZy!7tFV9f?GueQn3=Et`Ckc%m%u=x%ch0;iH7Bhs(mg% z6AbV&IdEzP_&V^f>5rG^$5vOTmY)vS4{TJme>x0zDJsPe$7f)Ug7&7$>crzTs?2XQ zGMj}b4@+ayt7fpKROgp>$K~DQ8zpb_ zy1lo$q#hm4Oj*nRWNpzoT99|g7PC{auH&^68i^b{*UtdIHA?yv=nu znaDMO2P7yEOXcT`pD+ch`^ecocU_>1fJA|K>0kd~_C)0x#cz#<8igMqqT=ZwN;Ev# z_w{~X_!ZMAu11W!kB#hV4ES=_&zHG)YL>FC2fpS@nTuxzkCSHUoAM}8IaT0t8QR7b96yB;8=XM&%b_(fsx=Dz2i*I$BjVFY=g)JE1E$pTh@)jOE z1$qmQcZR)%C%XXO!WJp$TQb&;=r_C>D097e0XlD&_)hxg1z=9@?bM6u1cYmKf+vk{ zUJQW%z-MPz9PH(L=EgzOu1zb>Qf<%MoD7c5op^CLMHiaR?57;jnqP13vjqPX!@|Il zychxjsi#tKZvFsGmNJE#^9Q^b{(w)t^1$M&T`33p*su}I1Q$TZ?K%geqdGl0Hx=|Uqz54_BTgh;iG2Umk9WEp9S99qUkbxu51Y>0#_BDc>b z0B_-#tmtq%Dl0s`7$cK}=?IqAgC>x!?vjE`79t10IFL>5j&7#iXu))kC z_TZ;rPYkKm0jkvwfNH^N;bc2ls}1&)LO9_LTrR!wS`pl75WrUZfcuE5wvC-_O=pK} zv3K4A+KL|ILQz|-7Ap&oU4*U5fKr*}RN`E$JT{N4+T;4za=VR)mR^~|`#H~jCpD50 z;796utVFV-ttw<>b<4344y zpGqNyUNRNWc5O{`RnXE{LBB~_Exa{X4?|y_+-ubQr6(JE6=iki!O`Y?QTHaZJ-n|G zhW@JIePN-T!6hFYTI-E9w^6blS$43=tEW=F*ilO0f=lcI)4c%FiITnYI*0rI==E@Uj|#?*E`aj{ zTsVXqY1rk1(d&upE2QS^S?93cs5M=bwgkCn87wmU!*_Xk&DOH?EN{==Deld$KdAXL zy5VjvI6IrOmX%_Up*4*r0T0xsUY=(MMQ?e0W23fFzQ6Ej>2T9qpV{btExZm+Bu>ea zQJ3}t%KB2U;~EH&wzfELIEte^6Rs6lfqK4a#KorY0DZg(R%^z@HJwY$Jxg9)hzjdc z&(svP%`g8C+5XI*-##%(k)8PJKd6TvzU%6;r>mZ-JCbE7YOfE!eW7SkWb?Z8uO7R7 zUi~dE0*(x4VvWm-fbR=es0er$cy?wvwU8Y9LgCr3NAfMgJX0SbXS zwV*x#CBaitaRGE}lzjFZG4Ih)&#$|+(g88VLh&IzW%0OC1WK41KxYvgBD3^e6o2;$ zNmw4*7w85^X(A;KiWBcEu#w|6d{+_0+Z}o?+mB1-W|`@I!VO|A@DX_R>Nkltvw8$3 z15h-u4?Vg$s25TZLN5A4YdWD4b=K&?fqJ< ziqa_yRWM1S?2Axt!m9ipo1EWcorG;6)E%GL@*r%U6?dCmPro;!0Wb<)$R33Ys#JHS zR@y1zHmsHcHRSIEZ>_-T@Oh#{v08HRT03dNOiA7j>kmGH#(U>rzgfo{#jEt~^6*{g z(>{b2DZx*Z0<6g_Bpe7$0{V;37LGsVZ-z|h-6lpLkP2ECE>Np&(P>dC5tJK5*^%g; z38TMZ>D%P`6samfPyTEtdCv;WOoVVE6^&zdD_ zzUk?XXQI9)c&9DR7d_Lq5UCJtOBFTUH4H;?d{vb+Q5Ox(bX`@qbTRN-ypvZi%szfJ zwtnBNt!tY{dxzGv_dr`P%B9!=ev0%X53{3o3Ml?7DM$R%XQ&9bRe{jB8$K3Ve?EA) z&NF@RN#@(i?12$1mL5Ktm5MSS6VQ6qUd~$<)OOsyl<47UA`DL0wR_mMb)&TqVXreqp1C>-arT5|H1E zUnZHz0Y>@H_+r*HH8PZT;GLwZfd;i^2^9}KR+Z*hpq}7FXjEZXqx{6TV`29nc!D+7 zP1Jc3+>1$qOTGWsYG%TBaXMng=Uj#dKs zWs6pw$NXQtnE$w4b4mzuRCcS!sJhrZCUtZdTH=1~xFCFt@@<}dj3^8OAx^bPkr7Eo z<}V7?Qw+kVn)8(%)S4#El~u+r+WP@R_!WJ`pQ^&xeyLu!frGJ`rptdtIqvpwhFjg= z_kmgkdsi3?L*R?bt5FOliF!nLWFtDV>jDcfrS#RffmekV&2J|ZZItS&RFCp%ih1;p zO{iBZ`iJtTRN4?D2lNclWh(S~Ti8#PweMEuF#N>3e7*&Sdc6}CIb`ML=@VyEdZjw7 zKYZ$P>SJf|Q&x?v!-p9aHjGOf3bbT^G>LIn$zaftRr(c?&8KmnRLUKYTz(A$-iD)Y zUsK{MlC>oo{cO1Mp!;|c=rEYAt)OPRPi6JlQ<*rR_~5#Y2E&saG!j%oBaCb^5IlF(1Mb0A(!8PGA z(1@o-+%i^J?%@KAu~mT$Wmnyz2f7xCa}32cYaV-8UXeDQcx)Q-^&9iCkH_LQ7*iAD zF$&Y+o}+>iPY_9NoeE$jTVa!*5DV~>U{64U81^{oqc_+4a`_f0i7 z8K3kj0Rgfma=drcY3l&$v-6EH-J*xk)7`HYo7fk_PN;(-b}Nh}nlVwG(nFu+nJ}U9 zT8$}O2s&hREFt28VGrPGK_Hz)ELC+RQ@0IAM3WGL5Q0j!IS2z( zUjT8W3Td$4?+!CbfwDki^%zT)#*N3_3joRmS+TZl*;Z^9{q>0dv({)9K1lcYzoMep zABRW8@qa~CBLIL}ur$k%S~~-vB69OZu#5z=kiyFvRtM`JqeD%Vuln8N|8Ktee-6F< zzvDmoPcDJiTLQm%crr?+qV)ccQ7h<;FTeL?OZ6QanDD@H9K*I0tzT2|ij|JJ)K#-( zF^Z9eFMjooR#AeGf!}x8ucHQT-Mz+>%F;e6&=Br4?n0k zJS^28eTct-%ln8OpntG@h-gU;^H4YfZgkq-uLIgws&DVx^~UHb@Nn!m>^iuzc>n}t z+y-Twl65@7p2-D8vbJT<(;TyNp%+@wjgBk5BFo(hz5L-og}_x8n$S7 z$cHi{8OSro2^3v29Z{A%Ni_qXxkn^PvIEi7WyiF1gez^wmNnc>$(qXcHjhK00;-!Qcj+Ai7{1)i&*;7*_&jpP2)W8}2_k_LgHur5TsBHsp zS&Whqw;XO?qoNU&Dgc_dkEy!v)iDD0Y)CMT4QabvZK7&oxJI`2&k`qTA&g!Cnf^x0 zQ!u)3?%7Hk#)S1q?+bWUJ?&y-F=~ctm{Q=#s%FWi@0o#(g}pDkn7IeGqop502jf3` z=xrji=Ew0AX2kBy&f!4ob)W*IWj=KcK|LX-sR61&fvTkmEZ9d!nCv)$$iiB(pM=+`Wkvo)kY*=RiN!?#NDmQn><`+wg ztLo(R;#$qCEe%xXZgo%}c*H$%7BBee1@C-raMmAlcZUChuaok|+g#xtoZ;y!IT1xa z{_yZQvK->+&Y9Dl#?-+n-g{gx!!sT}+{6ZAVlZ%`+ zVWlUS7d-Y*-{u!bXQIDP`^l3IaD`S7`gN5j*QW>2>MT#%;2sy`FUR)|&7gN_!Os34 z@_>+fKpv0|esem_Dp2G6)9d6pr-muld9;l_zMzVMvMHWnnN?=TODo<&b@u+fmE+2q zHZJcSKN!P>^eCg(V;n5)_ON7I+&-BV0|yom-?<@}OZG0EvjhY45M>HCN1whJ^l7-Q zeR}XGw^8Q4x{uW1;g}_+)z>trq66C%6kBIeb0|KV2m7NqY#a38WvDd#g}fY%hTr>A z6dLL}5B4*F+?j*@FmkgBF?QaN6Qg<%;tIRA(=0A(=A5uur&-9TN)0K=rnzm z0LUC}sDyZCZC;{OpjLi{I*C`I)Z`SEP~pYs3T`t1DBd+&ViBm9;B zp3AlTLiYAhG``NbW@7%v4JXB4Q8^-Dv?sm8W$$iA**qT`GV zD@e6AyM#giq1K+|}E;D)xp~oqgmiXfyZc zpBzmstOXkzU3}}W(av?X>R&JmJ=0&G5Od7AE6(C{)ij>W9p7)R1#89eood3Q5=OhD zP{`JBZx1wf@c);TyelUU^(-;?nfvwGlByKPZF}y?{i=F@!F@EFT@U1CVjb~zIdjVZ zkOYEu$Y+=yRKp5z4F$1lKnTE{$U2 zFt~KjiRdFhT?ZUox{DSdT+~yaNVv$~orc0)f0jg>^&d^t&CukZcp@-Jug?=D@J@E)m?$ zi|{2yaPv*OuW)tdy9q7DGli>Zo9p8A87y86k4(pSHI8S;tNRa1mukTht4~L{BIDC;0Ilw^+(K-^F7iQdBZ*R|_(-^>(;z6KR72_lnc1wJ|M~1jthrYLu&rWYKGq2*sY|vW$#O zRT{{dN789>Ipy6FKek|dUWr%&kvZ;Hf76|sg!G&!g--+Q$8U}L&=2Q#vIvZvuISH=}0H}OrtaWeQwcvVv~clCZA<;2V8(Z-w=}2 z=~Bf5%bVB46iePR+Hi|19t{=?cqQ2jJT>x>y*%zn=VmXr1gH z-TD7eDlh`)B>aC=?++BBRR7PER8bnN{+}*)W`$D07WI~z?N1^5|IN3*JoJVC5&y}5 zatY)T$R+S;mcUOxI+@@|z&}PYfzJ^`q~n{q=$p1ADTXHFKOk*URM*x6$B;}#)lFYB zOc)h`7{lJF3`*avCP^z8Ij>1ho49ChYYMjuiTC=jvDBKsGJS>e(ubRP{Qk`Gk9hY~H zk2fc%H6xm#w%jH0-4^#mxxRy*=j%H+N?^zh4z2aZ8mgyQk1W5cE{zw1aw!|*+tJ~E zWW&3LHKh)(85RhXe+cYDlox=1)**IQEQF!uSP(cH5OaOOs|w%jHBBtQFU%L89eHn4PdTT*s;Tm{Ikq>w)R;G) zOjjqpy1%po(>Y9aCxkLh4-U*rO@iv$gTwJBvT9mO%f;E5#>^qyaS!6{?##$$+6cK{ zkPB;YuLAR|GKwi;7)!Yp$Vtukp*h@pKtv^q`N5pel=|uFfBZFNE)`$@%~=H^C!%fVCQnmM7G)t{s(J)N(M?ya zQ|v0N1Byluiwn_@vX%e6B^#K)u#% zi0$p+J{Gwt#{f0t;>HuJI`;69@?>IR!kJk(!y;$s_si?Grtx@kwjyslc`|Fx%=we? z`yOPGOKKRU1eX>X_P!`1AzZ^izk984Aq$vhWp5iD7BKb-Ixk?By7`sW>;>%S-#VG( zfR;b~a`?@oDz+{uf#)f{q^hRe>zi+1BU`EFv;*ohy znk)2pR?(o|@DBv%SfIZV>}LdQOs1_H2_o%Cw4x2B=WfE_6Q_5S_FaVGB&b=3O{8@X zW4?i?B0&S;Gy)AZLi92Ki zyNOry?Pzes35U{g1Vd=z#S)4I1E)Az7H&iLWLuOJleMj;97a#d>h8O+m~ z|EO7lk_`w2qm>(m^g`%R)nQ%`H1hnqi>io(=gRQ`%rS6T_<*x3xoH)*NBrMZw^iA2 zTv}dw$Nx<=nJC@k|GETn|F!}E5+DI_{NFS*jp_j$9}tl$>kP9gN*9crE2pz2qyqHq z4E0&ueCuyytIrJo|L#8@!k_#nmq0FoTmrcSatY)T$R&_V;I)##Z-3=vngg5u2$_Ez z*yPD5@fnz^BfGW-Sd;C$f$BQ4?OMJi`I7IbA|R=*=%FB1V7Q*_sgkAOKfWPqVvD16 z8nrAbv#C}N`BdCEK6CN0V?wsa(c@X)YE0OUtZW$byZ2RnukuLQ zScrY0eME?@k=PqHV)kf zyPLbq2o%?Bee=oE#;U)Qys-A5*F2^hg)k2G?PEd{Id&cCUk;po1>rl~qsg6CkD7K3 z6Z1CWQ>abqA#`=;pbDUofRd`na|)=GDrZQb*p||AvVlMv@KJFPid|S2C;)}t>TVV8 zM2aLgipcs3Z*-n$6bN5bOU)Ek4ncY`5TvU+w=%&(mX_fG(7J$y$o_w8=+B1U{=eV+ z+xY8>|NNb&C*R?F*q^^0?qPv#>!{VJSyaVZL2+u&fM?kBrNEX{$JSL>lua!#kX-A# zu4^dR%q(zGYmz3Lx@KSTJ#2S+rY4U~KH6MZoGq=+?M?$~+(@vVuk#)@H1z%(KUhAQ zr57%}|65BT!F1q>q9X?2IYcBNu;hMU_!T3V2I$VS73g8EDM^kf;7+xmny4+F#;1`Jk_BY2 z^I}8{*T=+nbp{>zQz3&@gpQW|IFK7U_^x6C0IDN_;T+3oj+uD%FcS-JJ=RJ)Mc^j_ zn2~Jy@*=9RWDD3iF?Bd@p;(2n7=`K5fxD-}mkJk2LOdYORs>k|?ceQIn)7u;l|Q27TMt1eu1^+7hr4 z#wFc$TQHhX5B##Ms~B?$Uq9Ho!r+jkMuj&)-%@<20^*qlfxM9Ug)g1;ne;)42jNoBgz%l~pn|DX zk6I8r0w-Nr#CnVG0Pvk>C;}SBuCKV-h%c6Dvq>mj5S6>4brSO$>zPyxItN%dEaNL`JO$*K~?|J8yhE2cR>{=aG#G}G*8{p*sx z`3wJfwkk*l|5fAvhxVH3|4N*N(~pex%HsH@_jt#>Cs&)=1F!NZv5fJ7*3e622VDPj z>o<_Zz!eB+a%E?uBrn9;bEo~)@yc@L-dwq6E}B)Na{mB#=4q*ChOlo9U&_YDl6Ee5 zYrFKlZNSZqUDkVdV(RD{S%1Cc(UC6x5^6->1~udQq`!T@HdF9!c|Pld zHV~YDdYv6X!%&A{o}R9*o@`&wMUeip9S0-q71A*uuNFPM=sIff_^|378%1SeqlpXo zqHxN8nfBKZ6u9QsoBItWiVG0u#gP7=#VvGh)_=HmGR2z*fnH1y=+mt;oHdCgH$Za( z^okguksk&S0M2oEhLA;Qx?O1g$OUZDeeq0Y#$)7IUTKk`)cT+SSgqEa#}BP1vrBW68=l>qo4)T&JxCVNOs*40vzKbMVsp7Z zyBCz?`O1_rQ7p&i(wTiI*ISDL8Un8`hd^7yw+k@b@u!Wz#CXPzT|o9fDw=9yrt#7t z`=8ag?6^%>qOti`{%Q6`@$=D>dpwf;r|(BxM@STvTuG5s&j|wG?e&$lf0ZqOpgfZO z>P52iT5YQ=$(_R7X87R~eG9Vm_xD+#24w(H3AB2f==J!)I)Y9JuO$@_OdKF~ziYe$ z76clsswx#7fPr+bqN=Yw7r~aIHD4T zf~Fd(0g8Y$n&4R)MpS9;?>{@OKm)V@jXOhu zmNwtKo~=N${Qu9tIfOs?PcDI60=Wco3FH#UC6G%Xm%yh&0zY|jGDj}dnXmuRTVYNm z3Y&N!qH+yKM|l%B(3C*+MaMUEumgZr)v-m*bCE3M$hs@pqA9t4U}}m9W&lfc^cEND z^p)cUcpz`wHy>2$wI`d_liK=}u~=H4BZOlHCMo9yxHMh>WbI}K3KC>#d1FO+Y_3l4 zt!NA7xsBq)jy1Qq6u+=`sP8cRfLT|?Ji6}cDD?SbtFV*Z?5 z0Nn(X!@yn)3@mz~bxfm|KcBMl|1ncCJOE}Fqy>xr5B;;D&-_>T&+GK_!_vtDkH7yk zs)Ev<`rj+Z^{T|*^Gt`BeWf+`i`7=a`b$}7VYbqFmRpua(=F4X4+KEfoG2}p4@|AH zRx3X&&zH@Odz<&pfB;yv8@0LOX0W#A>{gfV+1iGw9T1m(pIH>F+6gZVp5)iI%Br3I zAK7Mc=G%q90JUP_V`qAeGkVwGnPe_FDK zbMST>15om;`%ocTYk-FA!rL)#Q(@GePaAoq^{v({&h|H~lz?-Ku4Ex^Oof#Uz2 z^DJm|`sN$|PqyaFt$t93WAeTTcfm{N)1ab-F61aQ`{6s$anBxfk zpdR7~Y*$o769@s@)JPlN_=UCO2&RZj6k+~a1ss02g?n}#Oo^z%N%V?Bwe0Ux5lbp3z;CXLM&QL@1YX=+=^X#3 zSs-P^&ZHjk|2N+H-68zRe{u=r5_q{1_~Y`)A`fK$Su+e|`(R?XWK>=!!s2?FIIvVY+H zp!zx?Q_&3y*Q@la|G4oq?vu*6$Jc;;vmk_{ZhwLC70HW?Mn4B7H= zm`u^Z$H49)tGsWPAY0K2!fLmP9Dk^F#snVC>$vA|=$LNNL+I)5InQj^2~mj?cLT-} z&6onQ&f^1y(FN9YF4Q!^ILpRHhZJlhW>6wlZ6|rNEyLC|PZb@*QdLJXb=z>nBs_QF zByWl^0#Oq602bNCjmJ0p%J0KlWybd=}`axcDH)w0sw}L zfKOh053Jl*B3yA(}>R|DI@X2+y{#9f1t$(L`{Qu3jW{1A`i}+9elS?3%z(5lC z{kfB69{u<`*Td+C=4zT{u!_l+ZKW~ELqiMQFXym7kG-~K~qtbKyfA0G)yE@ zijt<-vaVkB%9Q4MZG0veU$hrijuuw*hvkj6M=QIrGd+)f98+0g)YY-~5ih78!NfQ! zQDriy_R+3%A=QY5q969;#M<=EOv4^OK3bT6U^wG)DJaG-tUdZMX`>>PP(Lc6 z%o>?Hk|^FO`&9obK%ArAIELYmhfz%wn!*z2K^3M}@c4SG!}nbEK5CuP4!1LF_Q4yB&*=6OR=U1nk)ih41jsQklaPQXvwhnpD})H33N zIG$}6{LnjDf<6QK>Yql$y6u65UV(_Kl0G}iv6-5&qAcdwfYt=By$$#e5O=8WX`hJ(AoaSSN^rt z?C+fA|9`eV^sbNp=#sgM3+&)N9ZX@ttk=68_D)P z)$l}Ba!f}xRZC4&nNFd&)O{$;7hUs^B1ISt{9nF_LgN?>Trjq0H|&=-hA4tT@e}7UACrW0s@o3XVV#K#jRh*aj+c**lF{rC92RAB0KGl-%ssY9Fx!^be+6MG_cY z0PhQMFAexF%A?aL_)UJ4`u0A2HlwSxCjSj#SzOsXX!u^-#v8q!)TD|EKdS}gUT%Ae z?rS#cy`0vvG_(K@NpfXW&5EuxHs`aIte<}EWQC);{^oZ=R99f@zGWE-!qcuOt7gA5 zK1X#C_JTu;2>JqNE3g3@)h0Cfif~jbHIN+)qPOr<6L^vGn9&{e&EZ!or`3I-T8pp; z%yY|qwqd9BB6G;`#Cy6~mS>me8Z*BxuZJFTaFBPEqKPs6#tQ`u=TZJV%75jf`~>R3 zXYyipQhX6?zfM;3)IK0e+opx!okd?Pb{Fg&+ct6LWVA-JG-dzo;bz_5!503M>kiuu zL_R9ODxsu6w0p+K%HEn-{{Ls~A^gdIatY)T$R&_V zAeX?!N#GBD>Er->h~p7CFs6(76ophS1Q^5Y^2{(wLNER)ObbpPzPP$uykD%E%f7y|w6r+; z$X#18lG)lNdKT*Iq+RT?QbA`)~9*xsq6s-}(B^4Laa98{mPc zrs0E5{1a*4bT9t@&%N=V4t?=gzEF7gpMCCMzVpX#ed)7*h68sxsDQswdOr49Yv@N$ zEpP64-h6npKA~5Qh4R?6Ys~DJ2l4x0SdH6fn;M8BbWGk6Gh?c*`vHsB<5{ZB;>=f3|Mv}!d{l?K1aa59@#bTt{~kuMUf?EPSa4r+XOX~ z4v88GJGE-_;4ab$!!%3f*;DmdlH7+51Z0IGqmp%zJWWO~5?yeII{Rel`LEzz{KkE2 z&zPIrU7dfpJiA<1c7qLVZQfMZ<9ESVa!jf4Lydor=PP}ssc078x^O`{pe6fi;G3$7 zScNYJrt5nmdB?g;)5y~`d^cVNhI@Y)lG-i)gF8kerDX+Q0@jphhvKUY&!(x<{@>AI zrxi5C7=G3{-1o!3`urmZ^`}V8E0-Tl&6g&29v1gX*2HS{{_M=A5(~B82@V)IW-_K{ zdz!EVJTB!^!|{o1RZ4sGg_&vEKwFZ*9@s&`( zgJ(UnlxI2{rltzWunds2T|J^4WIm(g(%{5CL&9X)%yrfs&qqbEZX6b*yTDXO!$Z6T z>D;(wn25_-$ae*;QwwA(uVN6Me_+=dv;gBPt77a(pT%eAq0G3*I|~!kQA>vgf=~;- z1OCZH_a*Q%A5C-xuT!2BDp%B#)i+PB)95-%d1aq?bU*eQMui)# zN0U+9L~d)=N%iPo63!uq5kc9iuru-^Ta(Nz<~I7k2KI<;SK!JAXX(xKtmXo?cN0{60HX)A1g;0Ne%IfSkiG_Mb{h-^@e_0r!zSk+{GRcz24?lcvK_b8N*DQPUUgiGAlbOlA z&56n5`re#(2<4(*i7;z%c%3Wmj5tPM`7BV@V-1`$r_iQ+h)RFeX8lwu6n0>w+9BT? zsztr&)cr?IQbXuMWJHmw1tvePDEWu12l#*3_sKaZT1aG=>U2jK8JUjq-bP05rt;pX zslGw#N(`0m} zP-j|uXQ})y>aTMm8)*kTla7r|)6g9;k!VJ$yF|UgDwkxUu@}O`L}VcBvDk1}Cz`QU z;RGX)?O*)bb4u8c%(+s%f1SwlffLkhS+*@-Rf52TX5{tUtlD*=8}@BRBiquyZ_>IfAsc0f9K~N?Ei~6^jl5lL-?bw=01d%?n9{A z?$gc=iIhpz>iwXESnmB$Zo`aVCe$hKN7U$)_d|a6R7<=c3fUo8F!avekJG)d3z+wV zM&7xzt%?D%C(4l}pG>@GRI0T`kp?c@&_wYj^9waAb`Ssu?0anKHzQ+^UAgZE$l6VO zN~6MZ>}ra=JFMlc)R}n9;hBZ_wse5q274P*6^Q~V$~Gb+5f(<8?x_ET5j4uGr&+eC zI~o>7%hWYEYkFz%?F(b{Yyc?10>qL=E~l+Zd^q%S!A4d-P;bJFjL)zOQY{l_)@WNJ zc(CHDcz;`!NOJLg>1C%5C-;><(CEIc7o=LI@7vl4_l*xk_l+k;d}GXyt;#pjzQ4A) z5UuO!8^zC)9K4m>EPb%;hOLWy+;E_kUMqn9F>9rVMLA0b!Mx?#^31GP^H#m4I#-?c zCzn-yDu^|;i?AqV&k(J^_e@=KRA2HfQ87&-;<|8yKq=sDU8+TC5HLJTszXC>Jm6;5 zMY>_X|MdBH$jHNUVqzCN+JHhEZ*7oEl9>5Yj>&5qyI8SMlRLb~tu=3>4QWq)o05c$_)1SrQEt2|d5_LoXP5x2ZbAr|Qo5e7(8Z ztk#b<7Hg&ZPqZcFUL!HnFJh_=rcVxHyUJjSyWFX&7qIAOP1R3UpHGuim#q1*9ea26 zptxEuX?wxL-BLw&owayUU4&F^Tg67C$*u*Lk|)WQ3(rzdEqxHFN@pm27x`ER4H`hM zO14wr3(u$MWBs)03$*58)QmtRp=XU;hbr4T%wnY@LXyIJ=;f%eP)t>ysOpP zn_LQxQJ;MsFr8SzKJ@&hAL?~!M1}-*=MluUHZqXo0%W) z_n$qVph@-(%UM?^p4_)*Rwg$$kC&IG=2!ftu^LOYuSqsbTud#W?Ec$3qP@j>Be{O#!rj?Yr(SEY>e4M7$$JRn^_uk{N zM!9m&S5}($R~}AR7MjIa02eW>Y|GM7qr|dR!%>|;bu`cJtx6BHdf}728BW{78Sk0LlN}`&MP)(Xz3+?yc^O+rd4fA}*VIGQp9MuBG@%GnsN96FZUPEN1wnbNdffOT8-#_^Vkkh!{K&&{-fyV$jEH9>Xm$QlhI0AWWT{-MWoNy zOc7Hb!A*Dqkz-igFM(@2Y8k{w!q&3*&5&ao(b$rU=qDrG4!a~0Um^~sP;KgDsu!kp ziKyQgg9S_&%NPJ+r0_OYtBrbeZ-;(CbTwu^W@5pfA>Jn6QY6)#Y6Bm+gmHN#eDlpp zgO7rU!$EINK2h*!S;@Gg9{Cty9T%I3I46USFCzcdCppt;IFZGNxhvrDm}v5)EohZ02}%uQ0fc0v+z zZc5o@`jYsP#dby>K}h?!Tl_j$YT7r-9v}eKP%O_8eZ!NGO&&NFYG(D;aoYVl{CT(e zax*HJ*maV}jt{d1XCxF3KMEf=iGu&K9Z3QT!>9npS^^T_^Nw61Y~>kkxgLJv|IeQX{f zD4TJarxd7b@Jfi}JtSiJgVN5pGgb0n=jDNvry9}5NpkS=9fe*fn4IeK#6 zGVWVT&GCEX2W#5By1itKDUbZgrNN$j6<-nm24Yr27U?)mU&tBh@agm*Fl_NOz*>f< zA&QG#gvY^Bvpo*$&+n6Vxo%aaY7Y(h{@CW;{EjwNd%S5+*A5>JE+MZ3A9KyGKm&06 z2FiU^gnQLuh2ojer@{0{fy$$reLz*kJZ8+LPSp2(SbZFR0-||rqtMKojBJzd#&`!< zkJ8{2)VaP!Ma!_@v6cd9SWrIrJ!oCBN!_Qn!8^YY(TbUvx*z}2^Lr5O?{8ZVrw#ZU z*C(y<+QUixKzXEj%fZTkq7BtYTFOaYc-#O>3es*PMa!{KkgZxpeTEd0l%wHDSwXo9 z()?mz+{nlzk(&bI$yG}a;WkwJAZ#AKV-y0xC3iIm@>)dYc>(?I!j zC`n8q)x*n#{VLUutMjrE{FC7q(}c%GQ85txT6hH(36yjI5D&KrnL^X|!8|zYeZs5h zMk!S?eWOsNov2peUf|_5QqRtCsQl?^%E0N+NTjgB>Z3rIkUqTu6qN{@LS#03A-ADy zf=8BgLkNrB7JqV@>*3g-gX2PUjz^4!P)0}L?bw3Jl-`LJ-5)oEZxV`r`1V^yHjm^B zl&0Z$N`A*1XiLMt8Nn>W+b73y!)R~s(0OWekJuylG>U>aY_6n3ICvnBPz8PN_l{*N zvMIa1<5{Y!2MBeWK~J!4`+mE1Lz9}$k*IJ{ z{Cn8V2UPAN)kWCsRG+-vR)qvf-SM|{s#kXTNH`Os+eRUg4%ZG87SRh<7stw{+tp6? z|J!eVW$2y1|HU7DL3&Gm^DCeEhpp!SrTz9J@%b_~hTnVFvSwB%8q*WTy~Fh{p%5-=Yz_8WYs0$}?7KD#jNfHk3=oq@NbUTJx} zricRJuFK$zDPl1N!e}8@2u9 zuRdQPWs!>0tWGXgo{amY>Vs;vemJ8pDaPXgUkk+6f@^2iKj7ABzhf%Qqyu9MWry%I zv;|{n&PKsA*{}dQLztgmpD_!nm8sACsKTc0@4uZ-+p9Ef$zw>?CzUV@tEo*QlPCHT zpTP{h5gwnX4+^?L_^~B`l<@pQvy7F3^hoyU)t>>_&k<~^MZdz@!X;Jj@|a z@gR63kRRK!P(T;tc4(h^iK)7->4MY_nFy-m+Lmm9s}G%Yjp?`RCA7?KN6Q>ln}hFw ziFyAxby&es9;Du`2HX5KkO~9cgJk;uv-j@7ai!UP7)TCh$Qg2GmDOskhou&G*5q(V zZ1;U%dMOz|qk#pwu|T66K=*Kkz0dAOqaWx8`aw~aB}=QE?*ML z35Uz^Y3F?v3ZQ-fKcn~ync1BH7J+qd-ZOm<+!0$PK&RLcyoc@oy@ONVml54?e8(^@ zcvj(I4I&<&cCy-*Vk(v+n1U$@hN{PG#XPm=kk`;{);lCuTod3NnPshmSJ0wn3 zlRa~Ovi0FAt#RL`%R)sdcjLC+H8=9DRY8kqRu|f5TjPAh`B1o6?&!z36|=Sr4c+`6bp-;c(kbb4k+_4E*kKMO2AD;kR4G!bm-*h^?p@~F`8kw= z&K8QEgI**o5-c#Ne)41FymyaD=)K4nBHaf}LS7|<_^n+WHfpF1j~P|?rqdEDAg zG%5fvX~SP$(?v@>j$iJw1SjXyqW9^T#;5Eh8}drzd-8bb<1p1b1- z>s49EzyA7UTHs%Bo^No*`d@dvStTQ0sT@-bTQW^hHX6sxs)MsIWULPv>wBCPf$9GF zTq3hJNV>?7OI8)&Bg)MmMAVItS1bq`;;l>Ih&i4<=~#M%BXqUTz5;51GJGTpAWY-Y zPB=@O=RFbduAPE{4OkPfK0?dLs)SAk2CY`fVZU*9nx}Vcr)f1x%#4O_#2xlvum;od z!#LPOwjFF7P%Tn`7D63C=Ru9O9oK;AA5`nn=z}peSB!3{LdalZ0wBx37jzX4p+u8} z`@fH6rPh(z2?1h;Udr#)fTn>?3m3H#kTf7bVbpSWAU#h~HIs#xL8j4fo9{Xx7VOZogs;cxI3A4+0pFb3MINLA!Uiy%D&FP4{7ax7~zdlZSA* z^QeWOEhyvbubvLVWeic2kq-|f&0X3~ydgtuLz^*}!;awpR|OeB1<(tSapPG2f8-wM zW-Y|}#cz}N|5e5Rx`6*brt$%N=TVfH$wV<03?o+AhzuEx;+Tz|oeajZ|EZFmzZ#po z(X;#i)bptu{~Uk45VFcXt$7jYi4wc(%Rzqix`9BOD@FqKl4)D3V?ae1VQ;>J4 z4$L^zK!^n2Vi{ze@V;UE0Dl!(N4>c}c+qfaSY1ZiG2B`{<;gsHpo%Yi!CNHQw;~%g zk)7-A4PX+iv}Yoi7~DvU3EM(c#+G@K!wqtu_;4d>hYvT=;B+HQi!d?D@)=Gy!n8Ct zhPgDY#gzQb$CFPtKmWbYw|MZ050@W5zCpn!M9s8a85|fx9s zsvK?#z}jL@ivT~*otZ2k7)pJ%Suwj5p*Zk?Kr=O%tqW#La$KM@KcE>;s$X&=Ut-bt z{0t8w;LQZpnr8~63&U{v1Cje)Oz1vd>xpCc`4@x>3O)fI(}~KuLHvc>O2-lUTh>aY z*KZmd>yEluu;W380U_BK?k+l9jNmANQUhoL=ttH;0Z}j@lZW|zAHb?j0DN@ZfZCT% zGSoY$1E4pS7_j=nkUbLt`UYMV6WM&d)*L`+615YW#{3}YR!qMzCSFuIIN^BcPIl9z zHjI23fkQ`YZ7?7aYNEUzuP?u^!(Pp>pFap$5fSR+yPn|u`==Kyl)(n3tmq6g3Q5j5RP#2t`0^xv7V3P`NwiIUIT#VlXpnE|6h6Y-%R08_!CMXlt3tf zPy(R@LJ5Qt2qh3o;NvTSpSkutPpYBVXTBjmetdq&MYkT?jtOEc7DJTMvDbf17?1QrjG_F}G57y# z52x@a{0SuxO5i97eE8+(A8>Qh?>_X*NxEr^MpRT?T~G`|a87$>7=fN#K68>6v7%Vsx6D_GZvw zW6VjPDB#R_%tOo!eS$8irrf#YUecP~nK#7w`Sn~b)2_Ke7aZYj;K3!3bvUB>_>&`L zA}HmlBB~GL5DuXxhJgsfun8a<80KjJXCU0fc;Ez~EInuMGe9R!kDVB9^C`d+teNBC z6BiL=o<_=KL*l^pJ3h2yFj5Y!uEWvaX{?M5GJodb!eO`P4Kja%b27lUo{={A!UG5A zW6ZRO@CYG|UkXDr?MpM$exi1c3-n1DKSKvND_?trC&53@9P2(@@*CTPmpfv~e{$y; zc`yt)9g&WW`hyl(rqvsSLZ8@qr*YGvMe+z;0$zQjpU!v%0519i)j?)Rbs!yM|G#?m zx29hI5&RYYgc7)n68Kv7`B!l7zWwmCKiBbGJ`TEY9Cz=&EI!`h{p?7`1{~|o4BtEM zes&5^^O97GXJ<8QHeOonuPn!9gk9U48!XEcJ3G;M*a_3Rx2@c1^jXC5! zGwgvgte5%Z>XKf$i^Yg*3Eh6kw?!hPNLJ3{gj`Q zj`IJ+u>OMf0i5BycPCn|9?pbDFs)v4*dT?2|(&j^8c4K1*XK&%0?h2 zll}k6%zyayPpy;kSN?GF35@&y|I*aWpPBll%W?JlM(g=DKNJ4OHQ&EKW{8euTB=|w zwl2bP&#_#|G6loZ9X*El(xw!ZqA@FKJEHBXmMz%e8Wr)EqekUucqV+s{rgiCrxe$n z`Yw;xU>eP`(=q{qn~r=5%t5#;vA70)h|&kd(#qIZg@-JXDZIrfMxtA5!T7U}EJuJhz78Y5CVgqQLMK7G6D!dzakS{3%F|rXw?Mnw;1lM&?0#5oDry z%9!{XCB*)~JQcilae^X$T1y`Das`a+$l?dkk{F$_SLN`#MyeFYRw)cuIiR5zJceYj z8Z$a%iYwc$)91oHm2Ua0p)B?juFnCTJJ;QCQTXv^{h$#gioY@@0t?SgbjtUJKIuJ* zTrt!hkOFg_%!}*TpDnQ&~LE5&72TeT5K@7Q1dJq!@@$f-R z1%ClQi6MHUpbL_IhLad{VY)o_Bqj@5{;hvH`6Tvpjpska!DYYN^uT3S3+#(H9N^=3L#_hmo{vR&p!K~Ft^!ijo&>MrtgTe?slH(} z8XMJiHZ3_CNy*fLlTg92WSq1J`@d3)&AN;sfFbU=P6&;XS1NLG~Y4 zLDmj3q)qUt(ZP>)mjS0et8&+Id5mx*H5~(Z5SP6RT!UBk-iQ`e*6bJ+ z&=T;M@>Ad!{N3bWHow8=Vih3a#xSTuxJo71sb0QT`QtMd$NT@YDLi)H!PGw1{{O>M z*Z;=VAHE#-|F9LG6bbyK_S~QoPwX>4^G7`wJX_VGcGPrSK~^kVQBSMsxnwSQAMMe4 zM0FTw@h{;Wz(0$>7{@K?BlFvmry|+S_8zF5`9ntJVt!k)MiZC`E znHvdu@5L`=6O|bMSX4wZN{kTgVGf~qBm$~YXnnk;fHb8{jfh4+^_~qv-(oI5dGdf1 zsg%tB!y|8gfxQ#Kn1^cgmXtvG%Bu7p4(dErm3&#E8YRCK-cmKF5E1N;Z{(9I0&>pS zjMR{+XqzznV3jE#67E1rJx-8JA1zKtQsBcc)e#{0aCRnd#0>|RG>;|Q#JwK0{j`+5 zH~ba@;cLAZpsd^m}sDcreL2G)RXt?;dBc6iDcGshf^gg4U{|A_j=;?!}5-O z)LcS&-us(EroXht1N)M-692R`ER*$K9G^8Ivu!N|5Uy-hiu?Cm)XdnL3J zAS8=}@Gw;h_0oXux{3`45o!^p;Dy-Acf^_j2T z1sV27O#1;`;JmhdzgA}5XU)A}`#!4^c6$1+cc{(~VA_Ko1V(dHZwUu5>H^m({CvT)QX~2ka$jW>oC;Kx?@PeG|kJV|O)5o69wdzFShCcQ$ z#}(%CZj8rz!(X1w2uQ07+KM=EG{l%eOM6gJfjg`3E6-g|SZn9pI? zsr+=tFZ~2iD zc*fA)3_iG8vjyw;>Fmv?fMSL+KBJ6%+xm+^k;bHtj{hH*dr9ApDxz!&6LF-{gzLX7 zT*&H-7etf`@_{1|C zB?%~U5>GE($*8TlW=_cN&nEXX`AlJ>q#1#5&t;T6A1aQS!_I??8-lTMjI0lg^UQQZ z&^X^X$G~wMdFEyEjd}+mazm9Lz{vTv5257z>Io-z+S*6qa(?CfDFNpEx*25dgq6eI zcy{O<>z5Y+o?{iC1wMCDYv}k57i0bO*3hxIwg5?Y9F*=jEZqwP)14Ge=Ua1!;dB>a z%w+&Ji2OKX?n+~4sXNoERF@oay}i7?m8hFY2fzgxb5C%zIKMepnhe|t z&ABhfocr-Pf}F+td%kTSR^0P!`XLzJ<12ZE!SF}en8&Z+12&KgwK0DpH~CYU$R~Ek zsZ8XwEnX~1KD%0u_qGIl{^(2cc{IV7xGd-Y`;DpV-#hgim$I2Z)qC!8rRpzypQlt6 zY(p_MN!ArX5rA|z6j9J+Cu(bk9*b&GLzkj(A6HdyoPBn*$!5-I6i%u;7g3dKigm zL9QTR6FL2O8G~nDP2TVClj9H9fVz!#2@Y0|acv%{`hEXFP~<>k-j9sb>EA4dYb8&e zQ)o^@K@vUnBtgDd^=MT6$h_>8X;s#@!L2Gq?eW@CWm?h3k#eD=BIHw(7ye)Qq2~@Q zK69V`?M>gyUUe)-5%s7E`cd7Ao_6sGz3g9cFZ%_y&M{~D8MeGe3pov9#q=XE=c~s^V1YcD(!ruXpR{kztET+K&nEZVF z*RiZaErZ6AS2DzB>aEmvjr>|c_lO2WjNMiZjh$0u!8ypVEj_r?aQ51z1~{T0eZW}p?|db2+^m^9j@7~?`Ht;`^xuYUv*p(p=z>JR$QqdQ5bb+;KY8;(&1 z#YBhGmDU?Iw#G1*YB+1te|>lQ`}g@QK`A~T9^Jq1DeWgrOt^0|Px_JM$rBY?XVRkI zzt1P^nD?A`Ci`z5EfCCXdef!@S3fXkaQ0)LV3fx15L+HUp)rO4g!gD7q6f`=jCES1 zkQWZ@++Dtc0nb+h8u0p4|CaiYo;eJj3u+yDzXpDFmJBl^n0l7?+-rRYtH+FhWj5l^oVEj`jkSoFlN_U z1+Mzkpa64E>k>rIG;l|;x`v10qYlGZtC@$wfHFVg1U`4wAEh}I@VlrK9R_6h)!U~IcU81)?Qk#yv6Y2apuAY zpV^d8eSQ-E$A$h%-Au$cXI5s{I)Y&Ls@axm2ckZODgP9kE!HunuphhKj@wWN2jOXy zJk^HF-Zg2<_39ekLXS8-2X7xOG1zq3+dk55m$l&Njd$|SJFJRqLmKT!?QsM&fLov1R*$H{dP_S0aKw(lx~P1csU4ykLx+;cs#)=&K|hZ z0V*)|`zG7of> zCvpGBetogf25!n4C@3<4I)hAHlkfk`{(o(M>h?dtU*S(EflvZ3K?2`QKQD5-@?ZWz z&#tWLj;T0N8BFbnJY}1Ppn(e%-0h}rTXs~8xw-_DixxEv6-kKsBuj=VDwd8=P_}G^ zcI8*xuDnz$RwG3Nktrh$qZ4T&!eooW7bysdRIjy(rM**X6>(vVG#H4{ny^P>a1)I=CMId*+AQ;R%xqakpDem3-5wr`V-EGW5A#F_fo~ zv`qrt_MV~0;4PqA=c_us;7~2>RU>uy9X_bxe&k*Z7WR==A^sMT%M1y#{o5mW$J1{yYBFJ(?A}xnTtbeyF>u!aUN4>YhH}YZ_u=YXZ~A-23tXLn=Nmr99R*nmd*r3`h>t;f zF+3?kbo!$sN>Qfa1+cAZT67Xo3XTL~bnNb`13{IXyt)3$`ty?K3NYiTY}}ZLD0&FG zBa4P?#vDB+$Ql4wf~0`<$r22#lw!O_GG=}_wA{n8|<`q}j#Et!u z&B9po2-UG@^dS~I+;QE8gJ9RaUAkFCBn<(oVIHtaQL~5}O{Y{jSim&k4$x}U$_|C- zZ?R0Hyc`X-C^#Z?L zq?sBD^Nm}US*qfOz3Ws9xa~scMEFPocKFrf->pce*51W69Kj43X1`b>^fHqXyc&Rr zrkE&$4uQU`3OBWTbfX-S8T~r^rR;aVVf@3{qoJ>SFN{tYdP*?OMC(@ zOoRwqxPZN<6{SLMOPt!Cd|&pBMyUqX?!l>p*o35e;=w`NW)t2oq->yqm_bdrYK999*Efncq*{*E8OiE4;wbBadLo^XOxe6^&Cxm|Nl^T=_aOcsJ)>6L zc_dCNQAAylMr#|nKXJ|YVJp7~g~8Ips)}W91nbn<;QMDD zH5UZmKZ(-p+yH(kz9z~y1n|Ec0RO9e3OOF6|FU*|Tq+sDf8xF$A}ZKbe6U2nB8UoH zeI{Yu$1l-?tJj5M-3MD~xb+WUA~-J`!e5*UJ3p}xPlcUlo8?8L=W*v8dw-_qN8g@@ zt>&-Zzsdf8?Tx=a_4YeA{~`Vp{)7?;B@jv=lt3tfPy&}$0>63ddBsC|-t|JuDN0mw zqq+%uj^qM_axO5+kGj-3NZoK;V*un*|MPn{(&#zzfPm^1MC6)<1VRdec$*r8tpph=7K!-O z;0cG3cq6!lF?#GM45}e>*dVVB_5(_$&MgC2*7kzV=)3R|sqgk?7Uown zPwzDAMwN)e5JL+AmF}>o*y`>eln)D~gd_xF+Gfh_mHt*~CXvzH4Y8I=@5~B2yt%RZ)JD#J84NsGz=x*U(02j!b))TKd59% z8LbvHwvqa-(IbC3c)XRJmI+7G>ByJ3-y09X1ITv+YFy@xTQLwqN_beWL9-ia7HjZ7 zWnQUt&jAk`f?0?oiLDOkuZ9A4v4YKr4Ig7T5i~6d4Mr|{@CR;1ychi-ntWzGh%hbb zlf#0uxJ+%U)dtHWfLrXKICc8bYFe6Wy_u7tXXUvh>z z!rYYR`pd?`dOV-+rPtrPu8P`I2}$8wi-5fc&u8^IO01$`!bhhq{bvCsic@*gJu z#F2iYa1Z$7c^>%c&X~mA5ttI6OV?;NOU;&1Z9(1#)cUMDTSlcmPFIhRv$4q{9yv7()@F{ZaEUi)8HqIOj#V;tOMSSY zl8bn4cb{fx#elb}7YU3rCt^(0c8R#_OK#*#%n{a4e}H+-*w3gi5C1e=+;f_RcX_YY zMtN!ik;8QwCB$Z;dCckToXBbq1dY`ob{rVFFkdUk90bK8&PI?YmfV+fOT4`676wYt z(ZS>z>FdL2a-)i{g?us(&-QT>8}7=8f#z_cK41RBk-fZn7~dW7VEXIyp=B8zPWr}q z1LS~yCR)tV%hgt+1iw=(=7QI*fGdHm{SqTDC_0r#AioocXO6A>QsiA!>QyitNTkF&!CYxhu5-_hZj%i-%m{xyje- z-q0t#2QS}yL+t^h5cg32(p``-uvli^Bp8Wi#wQGc?&~L7a^hO8!#`_V;`?~uP;k^I^J)H5qQ(Yk@e$QZ?`(nevzFVbWZ$A+I z;unT~BTF+`oMZ5*o@{=GaE`n|jGT-@wpNVEFw*DcW@{Z@@K15P!`jW(AqijF1#kVV-)0S^cOM66@X|35Y@%Bm*Q?|fZ5 zdHg?i${c_DSJnLW^~r}u&i`jkz4<*;)=^i#bEN&U{Ctm}OMmmaPj)Ur6nc!{ii!%j zqAa>t*iA=OaCfwA(KMp6ZHW%ZI+0>y5TMz@9jO`d2e~(& zj=2vR6~q`|4F45?6%jNWHBvMJT(0il_h!%i`yPcmO}NqN$7s`o8Aw+qKSE_B_9&9A z0v$=}6Bch898>uiEqYN$T?6<<|qL20my#ergwWA$JcLHZ^#;Yhg65ZAdL zEGmPyqde%BhQ3dvH+%F;OzXrxk79Gv)yJc;z+LKLWP^P-dlOsqa4nRAD;#|`sGdf0 z`2s~oeJG(lfwV2%o|W$h;EO->qLTCmlq z?m9LIhD-@+UOg&;cJt_a$B>4WUIP^m69WW|4)VX1eq-W~d~T>)o>cwa0A%viet!Mp zBMH|uUeSF}pU0x?wiZ-J&jgu0^Q)joQ5jcM?#?U2z1w#}$%3B;9k%+ZkL zKIzd=6r+cahHAhkE=>!HDoZ#%p89MkfKN#qb2dctv}pcQzdQMC__JSqUgu!oZ+_VW z1G}PvYq;$|rx-JF8JD2tw-BwyQJ`v+OgQ+;j;=&SK`_ZCAh=N=hAq{xW11CJ%;?C$ z?ec+v=M%Y9OAwbg^QpyEF`3?!>aB7munHUk1bvLaz=u_mT+sG~%uIuwpuqMx+K>FVp37PTVzeV<65_62 zjz;|>A41Swj4>Or!7*l)=g%jv@pS*ca_g-r{0V zof8O1*E6L`p|`fOm6%E7bhW->$}5|JfKH6De{yHUxsWv5m&xc1v*3_f_C#i9vbV;E z?auUI?SSE#o*l3}kG^V*?b)xG8J~wLJ)`w`&;(|F9)0};1N0#aG*vRe1nonUxe@w6 zM&Fd`S)m7c$qs!W@2DYqkd;i)tks8&(d_Zj=4fOAUOY0ie-lkKtUDOPcS|sCE8XSVy-v`0X9S{GVPJgJCERD zH(-ezzhw?!OBd=~b2&HFQ#tQUl-FsTcW4_rhxg7H`#;^4#`*vA=SSQBuTFh^>a_y? z`lx@tw(-0TT?6@-_dHL5s9|ez%rMQU0#|ZdP%SH_o2r9&hlbz?x+JTPDn@O|jLMeb z=$FO6Twl$*ous<3Y3F7Wf|Y5d_N>BEaCkZhOj%_eiwW;SJI@&%H>6QIPKXwlr@%QKH9dQG`eJ<3WpSdo$1F0`KjK&|qa;fC z@A?;$mzh8FnddFiBF=sK--QT?? z&zg7q`94#N*baC>5NsQ675>UPvPAI3cjCf2?9k2}vk?JpF2L@SDvqt&;Gm+NfFt>v zEyfqZb_KG0kjn)YX%vq{A`c@_y?c8NG&|ULJU4Ie*|Wfr0Gq{=ClCB&o{M{ge1X05 z8J4F(jozL`RWko@SX!R?8`+@FQ&q|LJ*ttpORyUGvq6Q}1&?neiw8SnGcOe87!TH5 z+QteFBAG*kOl>n(kj!U7oQ|ZR(kOwqW=wXg26>ykNKA;_V{&26Ge(5E^u6J?7}aVU zbcs|PiU!9f&W!sSvLx+~kW1YN^doYHM_WxI8 z)yF6d{Qor!Ezkd7RYgHU7H_DX%Kv}j!91FO{r{MJFlYAv8@HzLC;SN|5K17FKq!Gw z0-*#xffD$I`tyAb_51aj2lZ3bm}JBC+`?%HOgsX#?51NWmJk&c)sDq%Ns>)X)m7QB zlvq@VO15MfreNBND!7I*qNKZgP``|_9$#v0DH|POVNT0RVzt+06rU3y4k6U`m* zN4-{svPp=3p5DNSe{tg@mSC!4sK)4@qEn1DT_I`JKxu zgbSHCnF}C9)Vv%-O*oajHR7Y5O5^?iX_Abijpomfx&L4L=TrC-{)7?;CGfG5z^{Gp z^A0z=|IVgwb_bRQ4m^%z3cBf9hM|apE;~_MGeF3xMGakw%8I3`YRp6^@t7P{qN=P} zmZX5#$#q6f^r6}P)ib*dtBDsP045jMSYf@T|N8dz z`}cX1?jmppd-|*?gfwcW$0V+Vo`xuC4kZ>sP!w5zd6#%k<{YwB(;6rcR zL9*VUd`wnpJP*nT&x4nEPdEi6Mk4=*0Q2jBVBc>#x8L!P_GIVD3uDQwwTkS+GVGS* zr9U3L+y9*R2akf62hAB|3Lf!HUY}AZ3I-nVNhk@6H%jIRlhP#ouPf=cCODd|*(z3h zMbl;3B_78YgB75)XWRcG*1a&pvt?-LX@M5eSisAs{+X%XwUnRkxBzR0LKgPYEK6Um?-m80Ro~J-(ds*#CsB>;LaSi#*=oW zVsuLtVm&4QzI)L6G#$v-ZoY?IBP2X#>;5Z6cuajdes}S=C@i@PhfX(yo&_|_v;Rj` zpw*7C|Eo%LI|k*pZlA>dkKBXR@)-NSI)>yGkGTCmI<4!frc1%ndvg1~GOa4YSYWQI zNcn4jc=Y}M>h;Lft^4>Z{0SuxN+6U#D1kr%KmYpk9=C~p_}!jO6h225ES{#MTAFGr zhOIiX=BQAs;ASM^3{6x?w&W-XStUBE4yB1|%7P}khAbIMY(#@{`D~)*oYGb{whXJ< zDWq!YYH6lblgTz0+C*7Qu9wDvtzuI@3A;zCYGmWB1$ob1aH{j#YGSUDO;v*qJLqb* z-f|EM<@bN|LtKersM~{y5FFoiMu;s!y8;(cay_$lYoy?zTfZDBz@piND#(S$K-1WT z`EebGu_h`4d>;Q|rC2Jw&PaE_?UQ~TPzf=sC6ov)SSN?G_%#!0_D~+ls|B8JWO*fX zBT51R>RBn7vqY;%8Y^lc%fnhjzG$$NvH%qhsjRAYsR?hmz~=(`9=FuuiV!MRfwSB> z&67uUQ)r%iIp)c5R39GIlPra*qEEOh==sSvg|DTbcd-+abMBsJOE_p7IL?-ES)6m% z7wf9KTH5L_3LR@MIiE=6Hbmlq;al9n74z_&lC4&+yv7_Kd}ivY*t8Zs3b4~`HBK5j zI=_|LYt|F}L_fZlclOJ1Wqz-)fjc$z20SY!y6UD@^0S+B`HlE~Nmw;kdx_j!wP6I^ zcyd?W^Jx|i=oT)(F_&HE@g3tCdd4{Bvfh|5r?vcNmnY9^hX23zpHJaW_!CMXl)x(~ zfnQUe_qm<_-+#l~o2{7Q2&x%#9nsZ9QPN|AtO3O;tda?360}juwkX0nLODI&9gF(`@yC`GiqK(tNuJ zA{i~>sx_v730N#P^jg`01GZ;Hi8RTE0um51^3xS<-)wgLX3KX!M}06 zWI?l9xLdMYaj`_!awa1(KH(X{Xbn09x7jL?4fp5`Lo%aZhrg8l?l)}U)M*ZV<$EW9 zL5y&Xu~7o+ICUS$2@1?w#xMH&h|yX@Y{Y}@1QS6CF5aALrfoKX@}=83GqagS6T$&# zfZAGbIQy&yfPonRU>JY_ArS_HK`kBv0g>IUEfiq#kl6OwC_iHQPPv(IA9VU@_R0kinlgLsZZC;$kZOjDCg|F)xAqHG9) zp*xc3x|$(HZ3=AoB252-?t#^x%=tqyemofU)M=FH_Ys6Nlo6dki9<4{^dK*Uiezq= zXTx!{;*pAmOAS|u3Ybszy+JjnGwx56>S>Jo0(b{P1N;^Kgc1lP5K17Fz^NqgvytaN%rOGL z?8nJAMO$!Vj*7dJjcDO=Ofd{oas^2@OdX-pqo%Dnt|~dM-9I@$?GE7|F2&8v8n5~@mKis5lG-`Z#@4IzBB#o2ma0!vm95GMNPCN zJ!&2sVDYl-Okp6t36TmzIO3mt!5qX+0%a|y_i-cdB4kOF?8Stvt(OV~c()qWGC7`lVGCe}f$Ts|L2SNbo@%LC`@C3LOK3$~d2P zgVCfB&H)VUU|k@{d=ZpkSPAam=Rp9P_wPpxmw+V$o>@x)_oqQA$TUpJ^%m&0Pqr}cmRmig9Y#8{{NGr|Iw$w z|NplpA9)%6|K{JH!k_Rblt3tfPy(R@LJ5Qt2qh3o;FXfV&k4`}Bu63rO4DO1aiXrE z#Y{nwH52Z-D*orHx*Jto3$Yp0m?D_Et81ohYhbZ5!2#>26r zAvA6+4ul3*F~c@m#^V*}{T^_)pq5doKfWtO1^Hnt_E3mLqT-{d{z#^4#z~k;64kV> z7wW0(!oFdz3O&)%8_T_*!w#a52or8W`QtR|CCB1Sv1dO*Qf9& z{0SuxO5l?yfj`sv))cpU|ISShf?^tu60?<4pK#WK;tz%+zhmj*2lC5G7sK zqNbrD2>}JbZD)##rAunemaUPaV`%q&_3YkDwIaYC6dWqjFglSYjJPc_11o@m)N5_< zD6_*Pl-XbcaNxm?P*pfzHjFyXNs)E$5pl(fK>^s9iJN@4DYr)GdWZf^#E-5{8RnvpFCmi=aDE7p?D3VfegQfg*q5&+-TYNS@y>fb+nM@<~|BG zuuHCsgLKsb9mE?LEJ;LI2^&(BOE?d!9Fq*ZFYx(clxf6aS#- z>74i{_Tg!q_+vtJ8bKpMj{eY%|C8j#KbUjDT26Z^k<1MCF+O)`IS+PyPAlWDH_Uw> zGib2iAmn8m)U?)$9NF)LVamzrvqT0-*## z34{{(*h}DNcfWO&TMNHg@T`Rff)!XXS2bi4)Hev^F6y#i$D)o58=)?^8loN;F2X>@ zVll)rK;#3*bY%e)2iSa~hBTt`xqQ~ba;C7ETUtmyIlJ7_ITAyj#~W;zX= z4M}}N!OQ^>b#_5Q*hD;X9-csg`pQChc2ZWoOUFwV2(oVU2xZP<3A_tc3YZRHH!QLu zF@gW$oBv2rMD>$;!q|tt0--349vK*^-g7b=93`316!>yXftO?;O|tW0h)g)?%SW*H z|J1jC>k8I;u=ju6=RY{8vOiA6e_6at3u!gqZN!&KZai0AbQHa@mo^5DjtAF;S6PuA zz%sm#It?fTXmXiW%kd=g5AK}8C$*&XHcP9GHA`ArRrGY$X)H7nbU8lGiN8AE*iwb% znS41_kmnoSypd?^Zv}hqiG5O^+#yBv%Tp|zL$&aPTnjuf4T9znIZm~OFFsAzvFrTA zt{db3&-!}8svzaR=U0!u|6iLbO}!qun#X@$+|OV5&Tn1k2hP7e^Z4=2Z@c|%x^07Q zRuDuW&;(UL*ja?pGDR(BDXJLNWy^6K*Aip0?n;_%AZoc`gOyRV4MlfFP?}%z1E*co zXI8rc&rk0( z+STn6rLFY0N;8R!=5C0!RC;Gt*y;81bCjET>QLUmu)}`gsyOxxi!jzaRt;-O)Kv*I z8Pi<_%*m#s8HObagJp5NOJndJt7emz4=MY$W81_uQ-gc%U|I$S6Pa1CpmK2*DUiJIy)-?%eY)d>=f$OJckG zC~}v~g_x-Pzxe%&4Ho*1dh7?HU;M(*Z(nS3Kg<|6zD>6EFeU_F*dC}7Td-qP9w&@l z3Q<;SZX?WE>v5*h=D(E)`q*gKTaF#%!M$i4{!-G#ZBsU5hI<$NI>?a;5So$@9lJqD zx{^;$-XDJX$+xc2ES~%HZ?1dL5W%ozQ!$|xFcepI-P6wEk!3rChP-;v5IT!3)N1$x z+yj|#fWttjKOT+`1b}VVuv+Z~uo|sSjV(pMhEO2C67J>?KnCb=Q;*1~+iB7B&HAXr z11W=8&|9Yf2APTM!Vw$?KnM7X7Q3l8TQ%YpY}h~z*nVq(AsKo-TS)O<7N~$`cF+hP zUqW1k{vz5bAua=94o1EVOFkh}hH7mvW`0yldHE+XH37b!5HM&DLNI(K^s5g2s$VU? zY9ONEDFAE}hBf!A9uSB4a|E-&CVkhTX)-!R*bEs=55x-rj-NDgV?k08V9Z=Z9j$eE zlndacG6bsU@cP3Gh!2X&(2R~z1P{M?0J!iO>A|L04&l*YDTxf_0PYH}nY^UXDa@PR z!)pi!S7jJ2lK)>NKh zDGhvCq*!#@i2>qDZvDr4|06fDdD1$X{$G@J{|q|t{*MLre{ouoRY5_BfZ^Ikj_B3) z?(VZO$2)0SmBsPLyO^ARdu8(ZjxPL-l6ye2`lOnxwJ|7J6eE7xrDMuVawfu&bfWTO zKxv#?={Q1v%UY@Q`b}eF-BA|{_TYMrG21{b{^9;EP4LP3x4qmS2?it&88dn7ohNy5Pw8>_KGc9`Eg57-DxzHr?!x zP~1=^8iGe0`6*zaFonO_=b`E^nBrAb$ zj4dwp^LlD#Us&$jsijSQ)veZ+H&BpI-9yUEVPy(+0&autU8YmHh<@N0I>>+cH7`VG zGmvobi3gN83?M(*GggY}6U7@^bPt?6PIv4uYhA~F$~>6)nUyv$oLOn>r=uH8_%P~| zx-Z=Ok5O2hz+Wc39S$j+KFPO3+)rplr=1kEj30pGj0`JBY^;O(k#Dxali;7QxOisd zF`F(jPNaaOThd3h^}@;v^T}6+{LDxu^r60JxVhJeCy7iT06Ykt`hVEq46e`@Nrzk|O%il3kQfS#8<2RS*KLX)@sfD1!+xGyTO&|6xxo1$5$p~oN@`@8W8jkk@}D^`WaNozJmHl z_51%ZC+vblI7pMGV001mE>3uj{;%ESX5`}U9fd9W3L*Y^d zdh6&k_+qpeFapDsoyh*r4%}ljIn+8ef9*RapPw23-4qHX#a9z^Q9jLVZsb5!?md6pN{nl-M}<&7X{ey33a2%Ow-JR^K$wbv?w zG=p$%lpo46z}zdq@pHsD5o!ST4&v2I1s-MwgNc@h0TNYr;`Me?bCRp3T#hS=zOD7k z6vBYR*$#q-zr^WCooWGmvG`LiGp(p|@9nVqloIwPR{_YTG_HuA$FJ+jF=LKN{V7vxE7mmPky!qz8nflt5&riMi z&))pKH-GERpMJCQ=GvR`o8Ni!-`@NeH~;R?VH(~`prLj^U95X zdE@Wh`t=*XbES9V8#mfl{=*x&w~{v=-}wF;*WdWVYgev*{~Q1Cjpy(D4{!YH8~rza z=#AMo{@5FDzW%?y{@=d-*I)m$um8!{t=AV{e{l78UjNkfe|^io@?Ty5r`P}XTYu~N zZ(RS0>!r8;^;_S5J@r=fdhGgVUi&v!e&w})cJ=SQ_It1W*41yk_S3IbUR!%je(gKo z`U}_o?X`dL)}Oxe`CC7F?eAXuE7!h$_4<{sT-&?)FRx{<>F@j(@BDjLX0H5CS94b% zU;CqP72o;AcUtdkz4cGt`Qkf~cV2t@58nO`U-~Q_D`0abQZ{7OeZ~b=~sYQaH@BZ#<`qiyUd$zRFSeoDK=c&seqX<67>ozJA^-oD4ujZ~C3*Y*qqLkbt4WFFb}Ol@ zuI^<^rfV)|Tem)7<(g74QH#$fO65#4vDCI}S;1}G{@+;IOlrSY&!*Bdde%S zJ#aJF$=dB%R&GWpi`kCZTiRbLHIrNM_Uy9Lx~)-KPN)~+<@ zHTPz_i;Z;=?kkF}%-{G1OKYrKrL59RsQtL!aJ#KpHE%9Y{bww#-df#g%q4BRF&h`` zvSZl$TKtVwmR2oi=IS%qUMcUSYu)bJQYyYWf9v~MT4kp?yE<={vXz};dNG}J;`?){ zD*{W~sddy$&Fv}uwauhhNr(pIeeGviT4{dHHnaAuX4h9TDS5N2OP2iBf6da04J+fU zZ?;;UUQW#|u9{V)wE5bP@w6SOs<;~|IbJoZo6UG5xg%>=`FtoUOL=2`tL)VK;+(s> zIooh|_HRX5xk9tNS4m~$!ctS3Us#i8(_87z)L&z1Zp}$=W()H(LUC`dFr$`?)vdzK z-{Wa1BWcyFLSAuNGcA2-c5!cGaq9nJX?e3YyHu@YHVNu^&e$vxqczr zPR{6!R!&RhoAQiXP9@*C&C{yObA2--sFk=@s?6)1om8QH<%ur zwZBw$)_XOv7GGXY7uTiNBj0sRzp}MnH)r!ZZDYL{Ul5eGHY-+(o$qDE*49=Na(!pL ztyuD0YQ~sxn(_Uczs1vZTeSOgbvxS=)+$1Ivsx?HuY852rCRA_t%CK+SZvSPovl?< z6ql}jlf5owY>DN$csq}%5nW+#SzlS6pZhc~rmkmmaeZ-RL)P|6LU~>in`^heouw^z zD_d=8cBM7jh%2?)zN^m5{kQ&SR^{^gUagwk5!d>em2$ef6L0J<6dti+OWAIAL7Qng zI|+=Lc&DD&Z0BD81)e5u&CVOSQmU$~x#`Wlg>-(SaP_xY+Tvn<)>uwga&~Rjoh_!) zo4KBJeV(N)%%PD^g>%vzFA7H6^o|P4$b(Ys)-M zm6Em1xIWw1iYs+-Pqx$U`mMju(&qQfTzzk=pYF@4)LKUGFVA(BukwzKr)L({twgi7 zS?SO3rx(}CZC!nXFLZNGeXW#TZ}!#lT2U_x8{PcM;v4^f)j6APn|n)^xaPz=rs?S2 zPNT5#n#9s(R;sy0p`d08&5fdqFb6BGW#iTjCQd!yugz;(ZFzZrr@XM9>UYF!yT*#? zs#w}m=V}$Dye0Ip^k$Q_{EZ|_Q!|3Hsi+ypYNpNkm5shx$(z^y7nY_tTS}|g5?WjP zO|{*1_1S*TcCJyJ3HC- zRsMNWsbS32eeb^FRPX9{k`?>zAmJ*n^%90rS)nlC%LiQD=sPPc~w&TjZALy z&A-Iby8TY7+3CdNwXL;Pv(U53cB1$eYv*P+wOC!XDp?c#=Zf=Kv&6mT)&Gl^n=KdZ zX4lEiyIYpqZ0;>6LhH)Uv9wOQ*4ORsd~U7R7V~rI_2t%P_sUh4wx27{R&qjXEx&42 z&7y6~%FND{&#<)CW_@94d8U$RD~)D(XHD!b*)wnOZ)h#;EzG6%JE`u%ywKg-Txztp zq&L|R+-${b>3Aw`@2t%zb*JjayX#u+*4KEQV#Dfon~CyFLUyw|dty${?%a&+xpO=;rtLXSJ1fBEFT6uRG=5TJAdAZ#J9rdzD14p)0k9Qs^{A$=S$m z-1xJs&b@vmv)EkBB$qZT?pkiOm7Q}6Z!O_;_uZR&eXX8d75AMjySN=4@O2RF|sU%BAC#ebrp8?u&q#<&);zYBT#OgQdxJVMkrq z(iWZCN=_^nmy>E-`V`yVa$?$0Ia8 zIrZ6PBhhp}#TU;VY|!eSn`#RCJ$-(0J~Pu^-T&0vtlWA(zqqs^FI%g!t!4LiZ-Gd8xIN%J#DHlDM;)*;%M)@BC|4F59TKrQFimzAWk+v-;v(QP>jR`9n(E z?DW^yYdDz{=9lL?GuegZqPt&u=WnvK?uMAq+v&w#sZ>ht%`|3a``L|m{v4&{;)$f5 z>&cnb@@jW}UF#y1XYY`Yuw{90?Kl--)I zzRix1xuv|E*l1}pMyc#di?zkPl2B)F|M#q&i`CwolB#y~cBNF@$Y_iGem(x?4|!?b z&QhvZRJ!KEY&ui#?r*y3DRwl=EzIte+ajqAV8(q;>*Sz~X{TrU{$ zVtQHWEH$$IH~$e&%U9Z&WGa=ijd@W>EsC9mntSa(W@$6+Ua2sX&DHX1Z*OD1(n{1! z_2xQHYwYCO1$lE{S>KS2&eF1~?YLL|JWJEdmcF7kTgm0Mesx8dn`>{>t5^R6mWE4D zM$cteatr$GVp1>9bxZrj8{cGUYQOKgjlOJ4#ae#9qo|Of~ zmL~T$b5*09tvIXd%x1Ofq%wu_+gYBrqqWyJ*E+?urS-L$`Rq=8t606#W@%zM0rYQf zf2&%`RcfVVrjL`_%>+*?t?egz<-KmNkzGpX*K+&CwbiR@Jk3&avSTcETh88cC#5#x z`}^iC*3PYNRZ-WfW@k~Hb(WQtX0=^yC*J%;D!0`xFKL^5H8HW1(B1OfTwhzwnAd)p zrOnAoytuQR*%JlHN!CQSBP8bE-lvQ1jjR87>ei26{l{UY2G=_`_7~L_kHhcWOqxACgOnNIg5P-ZtEz5SU42&hXp&zkcw|mm}L^6{c|0P zu1YykKlG{el0jX5>Gc`{sg9}P-3WV;?>&vUI1edCPxL(yf@o*~kleftUbv{iCqhN* zfPc7Av)fjSbg~3$L}vd(2W^=6oxCs_F5^wRPy;s@TNAIDg1<#&RWr)c%fXuLdCp?btS9|9X(Ohs;4A?U(b&QIElM?ZC#G;R)v1vtB?mQdM z=l8YuKFnfhe*LLFYuD#nD+|q)WwTx|Q<}YANF_JVHZ+q?>-T^3LxeF2bnD*mWFycY ziRkPn)lHASrnYNiWIi0LA@;`Nc%`zhKSpg2hxl+vlgzZppl>M>FICxzwCik8HJpkU z=oVvu0zJX1z}m8o0ACJk0qLNjb7q6Eihe;~JbChY3^tYhmq&~GJQ4=V>H{A`qq~Km zQh~mk`yUKuS)l)R5bI^P83`K9ngR);_6+`Sa^u9L;*6Z9$|f~M;fhX!l-r*k8O#b) z>&NF>_v|FZ!o%tgN>N5{=pp~Jr&LQ2*6Yh86c7_Jw^mk;&&|Q7kaoVrIf;fMi=~_@ zg%ry`YV>VSp5QxeY8yout2LhaPk`ncYO>#0e+c0PD0G<+UQ50JX94~wB?wC*ylzRU^@#o$f#o;CoSK%XRu8j@35(Wr*kqLB;M$u{Jiz= zbVBu3z^FJ$sDG;ZVGct5@$0%)v3q-+YC7Mn%~p9lFo@)iG=1osPrK$vr@5G5tjSsizi&ed7CzI8bo@GWMXyJ>UQJ~S5q7%ng_QMSl>bkz3o#|#<=}O(n zEYFnYwFS9RDOWC3sHThnEV7O`lBO()h`)k(k`l2GAGxTXNvN2d$3`hU?^1<*M3p89 z_9wpc!wdxb(;w)SrZu~692{MaD*V<1@MN04CiHv#gz-*;|RtW&HivU|vx zQ`5t4p8C#rzVn{*ecyX|-seqMcqOH~>$(MHW_Hi7cs5h)4t&p}sa*G6zeegbBgxyX zR1cU=kygYMS!mjTWRPWWN0_!z6omaAmdvF^(WxHnaiUWhT1I30Hn0`cFH5*25>$Qy z)2OJ>uEJVzm95IOMnwuQf?i>f@NO8NDZ6U;ExTmuWayp*=}0P;X5BmKHl*3y#C0O& zN@nDN$?ppI0^91KhWHQk3HxktZDqLqw^Li;#XV`@~ zUsFe3Q$PO~pZ!1Il(UTe{CFaP-#KQEk3ah5-0_h+J~G@bkp_Iq@d29(?0Au*C3M%Y zMV}Sz?%%bOaziD)9kvmr{6DEip_d4b9u?+$ndq~*kB2#|?CxG842&1~hUe-mUsL*8 zY#pOJjrJ8*>sc(Q%%=r)pt}e_kvldvnQSqP+~Cx8S)K9@KUyM!N2prOyk^WB$H>3A zi;H%4x-$21o%Y1Vj<6f-^l0R5g9XZu4Tn825cBpsS_jPL%&pi+20D%c-EA4$H9kbvTyIT@GfxA0|$FT9q2UC&hR~0nkCx4 zqKK&Kp&EvX^0lT-e7HT;)Xv?U9@Hkg-%aLug?k51!i@?OO#2s*#72d+=eHW2(AmWp zp0pYDfJwHA2JJna>ik{iWKA{dJiYyj{QNFmj|oyijm~X9=hVQ*_`|2t>}-Uo<`GFG ze>?7l4O3EjCp^@44p)qrs=LX~99Sbd+qY`G*n~#(<1bs@gOw-N!GohGI~C17oZfBt zkF*(YNR24%_Gj95y9<@H>=0hbXU36l*ZCZ#Y6I1J&?puW zHVMZoo3O`Y+W>wKk~8kI%uEAr`PjnKR>|FMgN>(`97t`zB}X(2+Z7F8mjX@o72h!| zOH0)v>rNuqx#aM9M9+0IB_LXOsPqoG?wD}d^CLGXJKpuA4U~|fVAAI4&bqdT-#G3% za;tXlVW_Dq!&$vl^bP?<(>X=yZ0Z!Af_s=4_#%SD1H=G;Hdj?Mke>MtmjQ z2fP9rzY0hBUylMqYkB3FX^KKP{RlbSy8ETiSEu?>7 zrg6Dp$)X(|UWqnYsCaWUF#BU$izglPS|oKTG8G~-& zeBXf-!!Zu|?uuHbL;Hi(7vI9W`y20DyY)G}v36wNZ&vC%k9H4=%ac}ZA%1r+!l&t2 zwgMIa*LOT1UiHA1WivQ4rZSBCO?&yyH@P6onZXyb|35SGe~)~&@tNyy{_D^GyKAkt z{>|q~pZYI8xrT!u!OwSJdr`t`^u2ei*@OG$!!>y%xH-3%!bT+1< zO-LHTv`IoumS%{Ok1RJ^l2ylX?ZA?aGkv(7J5{6PPYkvI-wV43 z;q6|rC3fbN2;V4GKlnV9EhQaC#jE$vT7zaX`>Sc3*9iS2_@G(^k5c_e` zf46U8f_GpHaQ#S5q~V4q5#1!pZ?n5(<3UUw<1yLIGV}MnQ8Wqj6d9%{vV;jPlh#Es ztYPBsfhM_*>ngV8da5Sdmace;H0TD(=Nx-CP}v7UeMiu4@mbElBJtnj4|tO`BNJC9 zYnWcf298yl^%58#>9(SVbP_X#(T;D?U0M%0zoj0b*y4+A+N&Q}rCoEj>ADN*#KVQ% zX3MhXs*fM;$MgFl_UhsA55w%$D53b$BV}qqGBelB4}R&z7UcR}+j`O!8XC*B&&?}b zH?al)(!}4K(7i~5U2Hs_n=8gI-9-phH5AKpMBnfvQI!J6vSclIDMEe80u`0aS^S;)i*M5`e#_cD zJeYD9cl`U0r-SL)`SscDR;zJ87UeXtQZQJoQ)fhu? zBRs?Ro9CaKFf_6QsUO%c0(y;ht*OdNeWJOz^k~fo7B9Ro|MX{%>CiH4b*-;}iioYl$aTQ7O8$_41jnRE5+7e2jOtJZw!aNeC?S)P{5 zNR*w`DvOTVT8xD}(5tmrF9<7D$4B*6hAe0h7$L?r0a+R2ng|06ZH##&h7cLi!wmAN{S=rGik&6V|PhPvt$9cRS-xKFK)L`3ztLz1S*tv z?56}Fr&iHUiq_9B05ylz9S)rg!I1s`+UtKZf$ zmwfnQbw$?|(Ft5x)dN=yd`aE3FLj=YyORWPQLXQ9`5K zHa30eyRERg^%j!)kRO+#HDj@T_$g|5#Cx3m%(ZLH7ECC5HF(`)($(l{aKtw8GT}`V zxShZrvtO@Qp&c((aS;?qhPM;W-ET8j+qYRKVOzLWw)`es^Q>Pgg~@}2^m{WJ04wW) z#3*EP!9nT?_0rZhKn5(!fEx19HvD@9o`b_{jcr#;F4&`aY3OuD#k1>WjC*f0#Ns?f zotitfy;cLRNtD0w?eg`z&3em+&?3X_^W?^O?YmKc@c zWzO$-WnfT^XtLcE*t)^|-!teJlbKzHLCK;d-x5 zCC+4wpA5UkJE?EtF^AtQ(bCQ?O9$9x03c#B3h;eA?xfH?R{pfxA8pSpct2b^MrSB5 zx*HUKr!Wo6V#I@u4~Oq0{QuZJ$oU_C!%j%GOkTZv9gPrxkI&-$ZB!yz#n+|Bn>w6a z7n>VhxBY}v%k*{I8{xX~f#|yNs}Nt9!S}wJo~a#AKMG!^FBIQTa`2txV(Eh&7mQ*a zJb)564C5UvPevtczoK=a|JQV!&G`Sdf?_Dp zZQFap^4y*n{k%*4ESw6KzvO19l4CeLLtKCRT5taUYoGkrBcJ(2{K!AK1ab-F638Wx zOW-O>;LpcTKFf*6|J4`o-Fx$kZ++1Ms9KUVS z`zwp%#o{!ASB;uoxsFoSyQKZ8 z`Yse(`Zp}P20Iql7+qTqYKz6Cx?V;*ZBOT({(4nb7n-e^udPLwt< zKR58)G|{voIvPezfG$dv{VE(q zFw*gy?~T%#qqm?SMnz%$2TSGk#bev9*B@3|Yb#pgU}q|uc>F{1c8!d@ZT!$V`3y}a z>Fu99y?5_5noMBp7hMbFppIesmOZfZ6;{|DYylLHkE*{H-+v#--Hypa2hTBYxLX95 zq6rgauG2+30h+m0$DE{_v1J64G&bV6je51Lx;9%WfA)BsH$OHOed5Iggu8>O{i^sX>Uu1qY|{BQhzHkS`E*Z}(13);cTW_Rou+|7D#21HocKT3_w zJ;WvM72$Mczm>2j*Xyks{9=|7*7uDQEe9LlO>?R!!fXL8SyE*_&OR>vk+x7C{7OwQ!TUaSjvIeEMjFXbyx3KAK|H`%X%QyBsXqfb?cGTdhJ2!9+xXV`>jqe^fB zAGZiUf~vHSkWxcV)n}vx5X>mAxkt_3A_K_?X8)o4M`g9%NQS{CU=p{F0cFWh0@LmfurWclpdnb13>tH;}g z!6q((B+?IR+zbbR)T90%;s39__J53g@*DV(e?Gbr_^p+bx41k1#}7hxzF{i9qDi9e ziH@&2foJ%d3DmS>fTcuHB~*sdbq}N- zy$h5nV4^L5lbD)`YC!=WiqQe_!|q=vS+($sF4WCBZEROtd%&9ez`a)p!(IoVHqr%#lvNrbYr{qZ1A-DefJ}#@EN1#AcGQsTBwVT)^q5YgQUQ6c zN1p4!(m}3Tu7?*F)8exlX&C(dX3Y3e%0~cQ39mnLR6s0CNgBLr4m>uKDcn6$LYT1^ zDKE@3k*=OWIWCMh1hjmN4{0S-o>)t^1Ryy>iPIX0HB-{!L}?6y7ii#X`MN#T7N9C6U@afw_xMD5(&my>)G84ZZmGiS~PcyrS3oU{Bn z9S)s~2-LG3qL1m?y&bw63Nj=$V1~p`Ymm1?taqy_`Ep5BEu?aPuI2hjuZT za*_KT&gFOLBiujyuFAvm!|thF%(e8E%0Qx6fO8{{(<#K|)}p{8lc`kS)~sF+Ib|1MOEl&|XAP$OXvMuh&YbSj~#v z^{QqKU#+{>^1!pkIJ;PVYEoQn#G?@B9;ixns-Ra=3R{??Ah=!O+-;2d3xTV89{#5A zXijx_^{5UL&qxxQ?cg*7;H1}_%PYvAT|xe=xb-Wk8J`gjmI^3wyQ#X8raNbcgIVju z;o^d57QeL`sK!8K6bx$`hkj8u_f$AoQmiB#tXQID5;2U86@dJd|Z42mZt4MluGIm+SO*h|dimxgix!$->{ z#%OPoku7)UVP<>F%!0lxHyggc6zo2opFfy#j^@|45_c~v$&$vPN3X!Px3ExIR0C(R zR#fJWwzbwyamkKXsJ;;tqhv3H=v0n|;cyTFs75Tz2sJUtD?qLt2-mPONd)zgwWR7x zfq~b#jN_bAjBk)U=iaEFj)bQO@?>`1<8(t^|H4G}9{1BvpZqm$O8>>3aCPt$Mb#zI z)@8}{L{U9!b?D55$xZ1iZc69qu+!+UzEZ^#3yF&`2MAwcfG|vnJa!xfu0xC$va*sq zy8(e&S1oo7)N?{5O0NP(5QO&SFz^7>kOmJBJdo(=84;b3^V)xlYcn!=|9Gg{F6%{ zmq0FoTmrcSK4b}ef8^v#t|+oobpCq6gRU}FeGu)3{1&0yOV1`MHH2;o=QVf z)+^b%*^j<`@^d^G_tW>oV4UkovhASKo}pSMz(1H0y5XSkbs%bn0p1P6l@wp{6dQCt zfuY!lT!O?$26eP9%6fbG)5{l(vz{E49;`d&0VCmnd%G6b0cusc2NLf*K_1gdvz(sPoDW2woMJ<2ERr@D1GAP_ZO# zr1g?%o+b8bvc#_ZD+u33M>s5gxw>vLcie+up7T0F?ZEsmVQe3Nk|0q*=BK_uSz`cjnk_gv9*u{Q$ zMam6#;^EScJK;`Mj(ufo#;@+IK8S_aH!6lze@UX)EJDHvorcEwG75}4T>L7T5WRVV!Ir~9pyiCJUW zZ|L!>dupNXi(_MGAzci|#@Qa2b8>7jFG{9xbL;8VSWj1H4;m1?bOGx=$S^Wi{fl1o zaV1*v(QU64A76J{@Nx1W%RR03;bPyp)broZ&hO{}JL}vnh@oXP6#s6RXggb&i`6rh^E`f`ez>8lvd7I z8Pfs2A-$sp6{UKf*bgbWCymTJ5J!plGz@{Sww-o zy}~A|ZL_(#u&{V4O$Eo!pQM7CIpq3A{EjQAgpG=eMsdPW;@E~6fo!)*lPI-akldDz zk@!kLyz1UQr52!U`ZoFB2{7J30s?+xNW{WM1zg(Nnik{ zPrt$(>3Kmh;lr)23N0uvDAuZht{PT+P`BM@Q8Cp}tCJC9gXX7))zp%*mw7?43f3x8 zQM0i0c|oxTFD(DDEUP+@F_HPIBwOpNC@7XE26#e%;v%GBP}%}j0jaktscZ!92xUcr z>i*MK2^pU#BghK-U5E6-6pE^|($;n}%n+r9yyRi23i(h8 z;cy|`uA%@-_xx9u8oL?N8a_o`_B*w`Rs%~Y2Vq^mi!53nLgRxZtXll~L+cD>+w>2K zOo9Cc3>n73OC@x;s5`0%vb0rfabXgGX^78-8yGi+ox%7Z7eIHgsjG%z8l>aaeY=VD zUNAY_y`CWK1yQ+6ad+05hLz%I$YgvlG%32tm<2*c9t&-`*Y8RN$wWyuG)Z>`u_PeA zZv6i=3bD|=`X5H88tbqBliv3KwKx99ku*r?91d@dg%;@^_m+UN zz0LA!p?{WZ_eQ(wLYkZzqD?CI%scbCH(PV3R(;ifInL;h2()o&ip#e@3H- zr8{7`olwv0A=^Cs{c6JBADLINJBS$Of+lwfBJ$(eM#OI#C;tKV9Pn-Z=x>J+j?Re1 zSrLxQ!nfr=SSqhC9@}=k{;<+oThST^J5z*5>%KO9bo}_kE>48m(+Y|u^;q}^V9BzK z((cjRP>VreGI!hJyLhnH)OO{#oj-DP=R@NKk$^FKZ{B+{sM3GWh_=D>k z56D=u2JtLJTc{lR7A}Aci<$G8^6WtW#}6Q5;!5kk_Vf7PzM+_o7Mv?dCx^yRGzj79Cx{6V!vCO- zv{@c83PVyITwLJqLLjV+#(QpSj~TuK0%QCB>HOrERK|}YJ69vkC5IU25aYYopKY)x z@W%DK!Uh=dN|ol#F8L(`p#m-e#2E3>oGLI!1cZ=;D~$+%DejlWb)(ssXcU(o zK3-T~EA2kKf3)3)M|bYY(ZO!jGlGTM^4k8Q*IHg*URk?Hk8Zd#wC@cU;J@un0MNyM z%aYzR)^B6|3xArue*fg_C%?cg=s*8bI1v%Z_jKQoO&g^EW!+U>%Xd+_2eEuNP#xP= zH6LtXij4Yzil@qf=xVBK_?~3CqVBYZ`*REW>RHg^f`cTRdbL_+nf{U}=v4X-i8g?j zBBZ@nMGU>vr0g3H5p#-x%b9HuCEsdpBZB@2#jGd@PZ90L(-sBMgDRL3wqo9{=&Ij9 zbTPLdazybJqZ+RQevPSc_WR9h`c*)}NH~$8O2qPX7Uiim{Te7TcyiI$*c372mrFpZ zP^TVHzLf@$Bn`@kqY3FZ?v9OZR0Kg_iR0mX1opX6YG8T-K7zT+ChctwapChAbC{+u zkl2TW?#Xp9|NFg8cs5-KXLY;KMnx_NV`G!m z3fzVq4U@WemOsSrp2^Smn~4-w@dc9>WfJ0lNe;(PA_G$j7M$A<{O=st99Gn^@a=Y@^DCK-@2(1P|o>FdFoW?wl5iXw6kbo$H zM#T{AjONy{Y(+L@*LOTib@jlOWiv>H(K&?Q-{ffso2*m=&ac#XnFU_D;W`uSW~qWd z^s)-~=zSa$^oaEy_ZH7u$b|n(ro3q@mg@z5ng1qv3DSuDO!&VdpEmzx9VG!c z{$B(0k)aQa|0i`_FIc9Qp+BnYfBi|e{z&ovPk{XI(+jWvtDFO{KjSxVbp<5wXa31A zlVLRbm4E&u#6fE)lCIdI=31JoiDqyv!)OLkGP{ZWy+H9YyE*gz%HnvjIK6Tz`#%2W z{5kk-T6MXxMfH2)Qjzzk)#BRy^#_OdpH5Ge6nA_4=~HVVwwGf_FE+&{67=tVgmBQP zWIFj3qqQa*p>>-ZZ9tiQqz&_9?9t|Rl{qWJpdf^2DoTFBi|(6VK&FJ$XdzayUf4Zh|4L6mx<1fXwmEqL4{-En2$S$q@FXj2p&$?;_0 zv^3K-6j#w~6FmKzs(X$Y7_K5qlI;fWB~QJv>*d|)ndzN%tN1``%rDI^KAB#f`dDl^ zr|~cxWz*QMw)T)S?IVA?LcYT~xfSd^xY-&+Mo)}4up2Kt^#-;BFf^~fOmG^XG0mrJB}0K zX%U`{l2dl{t}x1oy09K#9*mYeI?}^OPK{``P_r&xa@GgA$?^TOQSy^h!%h!(>?lvW zxnn1K=qYD67@yhc)lU1$)4hc4x;x8Rmt9=mX(xPlcX=;=`9*M}GY>U{cb0;>Tc6V# zYe)9|W~ILKX!oGFJZaT>II;TTM(^%8>ElUrLLxlj^ktA(PNxzP5k32}`MLVBchAX= z&TQ69@#Z?{tI|O~WF4cgjD(BY*AYYog=W9IdJ=xV$W5J-RpwFdk7kq`kT`5;`n%zj<@hI4xZkaiWS}~`610VG z^E8U9mqxKrZIuwvbSQX~l#0QEQ(M$Zq$rQ$96-?;#JWT??c?cHxIVKo#rV?m7CtknI#Ov_L|JAR*02gOi zk_UMJl=VO{cKVxR+S_N&*cj%{*jO|H=-o#O#dZl9No60f2m!NVs|t(~wTnnI`SfwC z^*R{!$HtI=v{AuyE8BQU#>SEvH#QdLK~#}{p`~XX403*UgtKRFStqp{zfL$eX=nnN z?{5f)V2P(o7Poycf6}~7c;@*j;h@87aGv=?Bywmt6Mpy#kJxOJe9*?H2Dm+zI}$Uo zuv8H$uou=~Vdp=8cK93)dyv41tb!`~T0({i7dTB8KDs`#0Hi>2OvP|@#n4p8kW9_A zRkgQueL4$(C2TZ~$~CNMc0z{3@!vBK+8TfxuHEnWhoJIeS)@arr{$J7~ zTwRL(--_`6YQa!tU88(}R55`zP-8d#f1a)@s!~_)hhbXlKlh_-{|DLs*GB%u$m{q6yp!0aUTJ=gu`KhB$2j(TMF2SDN z*xsY^9`RwZ!2Fl##v2s}c~=eIWYa5QJ!=6%?y*J6qO>1LLT7AcMJf?0kK7Z|=c6?A zsSCY>^sR1vrn^C&PTSkx8`Asn6;iaQycDqRhlA2p3V`fy%1$7fW_OgXf-)`LQl98c zV|^ui#rx@JPQJoTy}x)jH1!nSHGNG|$#Tw8!%g}t2a!MrR$SEnk=cp z0f_3W738MMk^T&1E?eh$7j0MOJ<%yQux#HJoK{otq8kf~cG8WNtDN;dlntFgN*&#m z(_;CqWq@?QCLlA^h7dx_w*{r%D|teA7WzXEyT&?{wg zQxiQy*Uq;8S?j*-f76Im^~CZ+-ui9)$UnIRMt<5nxz6LG|2g0k*S`4H7cDS}Y6id)9;k^V)l>)NQOo0_S3Ev? z2^ht1Kf6x8D_|V#2GJvfafsZran@Ner*HNV(qQ4EUNq4m(FH{|QURHC2JKKZ6+FH7 z6|q!6XbuHq{MWD z8TJdv=k5`Vl_Y6X)*VeVX}9kU#wJ@wqO~;zpUxy>*X7f}SSjXW2l!qhw)S*aZCKQ9 zNNlphh+fp{g2cwyRB`PFrYs)+Ku6#Uyu=BLJRV$7c7m7P@Me{K7N13qtQc&)JHG78H|DSY5KKI-B zk$-XtkGxaJ}aDQ7ZIJ@+V4$X-k2v8lD`08r?8GQ8#?cGDI6% zmuQ*3XFGoqf;C+{1rLr+~lIGQaz-SsD(xd*vk z^U7J#p>%6fCbS{JGg^;S<$bC3}!#4UlXAw0WsTqI?Hj`GzKVs7bYZI{}F^+%WHJ+ummp@EWI0N3AiGi3=z- z`T(v@lwG81W}tcFJOlyyqht>>i}UB32go;J;Op`?F!rI4eqku7htzUF$g2T_T!ELY zI};n5blojrP3pnK_WkU-1g_q%JyenK>cXuM9SQ^I->tEKYZq#`}r?td!3m5 z|Js9*H~t-dPMilxa&<@dF~GA%hk z1t7}~R2^l?Bqgvt-S(Y8lO<8KM5x4ICfM6U!U(Xb5lpA}{`(83>detWnjXmA+yQ6G z^}C3ewotp%!%SH^eq0)#DVo7UrMkGXGa>IB9j#AN>$v7;9Fd|EL%%0G2K5JXkafdG zVydodx}IvNqN6&lZOMjj4$MYCiEEosb|?!JFk?vugFqS4-0i)i)L{ijIq}M7HP~d| zvofTpAL@d-Ak|V8V+sP~>LS-}k9v;i2->dpj&QT{N@F3tOL7&^hBWMb-v>a(F) zFS9h6Qjj%q6BGoBBxR8vz;y1q&dZwGt2Eh9-ah#ntxA($`bX2Da^;yO_)iSk1eJ)X zg7#p*RjJJg&-v}H9>3ipa`soM4ytoCu#TbV7P9*7blEJ*g}s4wm926}p#@<8EL)aw z94*{r0pCzSN+7TmmD!>wz0DWu6eR%lPr4NuxnK&z>BO)=t7o3_pQrq@MC|4jOZoSF zWNep-?<~&w@0?LxUiWqe03>e%xWaFr5oEA*_b`K={5jD)tJa7rqmd-{Ph#ps-`)kc z9?erAi&#qkdx`$j)+BTG5{F5*`HS?n%A*9&lr_+lUL^2=qU2${(Zpyuw;h#Ac~)dM zm~KlqOH6l2{-Xv{L}d`(@N;lR-3*T}a;-4=DoPd%zh7#Vv51lDi!VFRp=7Y@hU9$* zxPv%Lo~=Plt0Tg~meZ`Gz#*+glpH|oQFIxB(caNfo`2st@b;Tq<*H)pZnAFoPISBJ zC-^)XG2mq2M8rT6Y6u|pD%Ar*jXehjGFQwmM1}lTFUW~%Zh9(ev-ZLNN3ae;rlfHq znUE7j2G<{VUL^VdN{au_G-TbR-%|jVHWQ*7>V)(E$wmelmZ7eH>8siHKN-B20*sI% zA%HHM>HJ8X_6sx9)055m+U_Iy@lkDU{b6al9ZD93#Kl>3m3 zHCvo)&P*Ef`;U(G@~W#pwr8fsW62EQ4y%I8>ciOOSoSr`YD=$@$v$`C8y&mgxwbmC zf>Sr)u9UU@({>j&>9XO4-*nmX@J*@gHWtUnd-H+wK=0%esHs|H3Be zXZsv!?AWx~bLg=NZd6A5Dec$YMTHqKc)op`=ZO2MG8|P|o~o{{swg`?rB|q%_FcGMCWYKZ}9rOk*L3zo5gLyf!ta4;+LB8HW z-du=TLX2Xoa0XmFEbyDMRuI#lZy{EZZ3w?yn4p0OwPjnLr*?-4$_2wxy4uu+1`>k* zKHIAPv%h&VN{i6!SN_@kFj>#Gso`N&_SR zSfhYGkl*tjtC&Q!c8DJAwou#iQ4ldK^hn5)^!XjtmG~gyLXs>M%|G;Ass*up)Z9j; zov5B_L{1ceN&qAxFyFq9{Qr5f|6hCUyCe9Me?A-u{PEGrEk5V|>1z@3N8mV$BdAQzOmd&Z+ z@@y-9N&8390M5|6VloFkyqucJ=O~&SV=)pCWM>WJu%6qgvdKf&O=j2ZuW~YL8bU_0 z$|on7lCBk$`$Us;SGn;f42&k(xZYPWWp-<)%PDuMryRDNj!Gsw-6|^gQBpbVXEjw+ z`K+qSF@Pkjy-aj_3B(~L>4ccde$)2srhSi+LQx5ea7<0RT)Q`#gng(45y!Zp!Y$4@ ztIESvWu-pRTwHpzYu0w;(xj%_&Xc6f%y1Brp&#_cKu89+F%o&lH{7qVIa!%u$(h2= zAtkQ{Qu5Mw%d^2EXKqmdb#x4KYz)=xk$8~W0+8FVT|)K3vTs*VMb#ImOdo3(RScxM zhDbK5*6T=69UChM!a4RQ8WZ61gYQluI+9N8+|a^7ha=?Fg{%O5SoE*ItqCLJi4Os? z3!bs_pFcaK>9~_TEu?J$z14ow!??n|DX5=BlwelatY)TxKtAO!@qMf z#?!X{OK_*LS`5DEyP6lcx~QqBQtF(G6E;uVzItifd8IH)$wbC^UMVau44xMT7ltVe zp3-!Io&M&t6uVDmX{#_PH3ny21Wr4z6oz2+*<~fNeOB1sz%_fkb|tpj5H<5EO45fEj{XMSOi| z{rtumH76`l-;}{mEW4OqXV#oRYw{eVQuZ?m0CZD|Kq@f-fFk2$c*L*Y6$=I^nM}34 zvo>f@xBUN*vQ;v=TL0jbTmQr__O}18y*@tj*>B-T{>defOCXoPAQJfT&!61p=#>}W z2+=E!j>S_{OvSZrSrr3S);%q-O-XTF$@EP_S3S|vd{uWukVt~p9c!)b8lZqToWKw- zIeKMz@o@4%<6uJH@oKw8W1=yoJgg+ZfH)Et(Gh-x5M!4Oy<$oI&<#9kJ)B=zTzlwD z9#8Hs*^~0l!=3UR;-0+DPzQQta?_DJ{Gw_TfPxHyt;8=6I6 zm(jK$Oxp;1fq;sRsY0XV>@kWd^x=TH(02AgzxFM7@#Lgt3&+H@~Z7K&e~*#>Vv_p*LJj>GiDN1p(jM<^hI*~_2(JC$D<|(@Zv>_N-~DXpzDGg__?#WtK`j$Gu{l`0| z=lN63E%QlpvT~SsuQI9qwZ-wr&B~5GsXcvsq}LY~>$B=~QktcI6lM|o+faT5294|K zS!nkyTmb(+SOp~`6PMM6|DQdnj0H+v|Apn=_Wx_2{5K=`lYepvZUCpqK@~?*&J*@Mj>B(K_wynKc@YElmR+eL2A!yXKT1WW>XkLB(?Ne1D6$G_ zWSRuc>YfMU`#W7{4HBQZ6S3PwW2e&$qO)O(p)=}`W*3`Tlsf=7roHP6ts3j6?w9RS zg{CVKm|e_ExHj2XI0m2QE%kstS;)5{+z?PPYh&YU0u7J;z9*o36#l-!8uAI;aWl9Q zT&fECii$3G3v|yFR=$D2|6&0( zQzAy^A_fXML}>w(gGG1Es;^Mr@mbU`%ydKh=g+8@xN^Yz6&H&Xi+rOb3!TR!;mKHN z#VYX<5g2XtU0S7TXGlsAHy@0^)G#~xBY)@Bj>2ThiUs;}(%lD`2vsz`*QCo|#AH08mWG9g{s}%&8Qshj;0)GRww)Xby zI--beC9{wmOXZ~zlMGnBop7_D{U=2y4>}RMQn(OrWUqo8UA&Qu2EOZRB&+KBmmg%W zMnA2b6uABNpGEeYrMMETHv@$-Rnb+Qv!-X~bk6NJBA4l4k6{cp=Od3f4FzDGHnyv+ zy?zS4JJmzqd-m-4^GHJoGw~=Ik9n9R*L6;m52AC1+eGg*7aX!W7q~ zk4sH3D2q|fYA2FElkfXwAo+8~_2@CAQin62K(e}>4gNnL<9eO|;4w>@l%t3c4OOuV ziOt3hWY~nauh$7#UiVQj`s2WwaBw&_n*P1Q(E$D>0kAGtIMui~Qw721IK?}PM#je$aam)OVe!X5r zq1L4;h~19BJ6CQsn!>kh@MAW=%{mF&A|-CiZ=$Ra>$lO`gKv|rN55YwuTkEyXb%#nL1t@O@KJY~2i0 z7wM|LZCIu!>XwC?*?OC|^%4>fuk6&1bSGG=>^^dLrxw@TWo3<0h%&8HuJQiAHrkq9d$)l_Y1!N+e6XN0ORB<{OKWvP*CMR~ChsC2A zcVV^>Kd_F}tx>Wa$M>q0-b{PK0NUED0$oy43o}d-xP#LrM*Tq4FTFM?NztxHW&>FJP`KGum%+nAA$tl z`$jCKaHJO}qdZ&c)nrRux>u@uiV|7+-O4EPWBY(!mCX;mu4GF z_nq37vuJv&TZ;=x*_Qrs7!iVvYPN8%d{~dA0|d#^z}jGt=fpvt69~!1a|RSL0YfHm z$WwsG&KpC-z#bM7$@&@?6v@s4Br(QCM#0<&8OhLw{Dx11Ba^c^KJqj|GC93}kYv&; zX};Z&k}+1Y4J{cS4e^rkt>Et1E#mL!mFoeT?6WdKcT*elZ{W%VqaE_eNzsaP)+UEYblVn}BmIFF zFJLcVl?HO8{|gjvu=m{7o((iY7o>kLG*Xt&`emSz2HDI|wx<7L0NpnZLJ3qWP2{Nb zMd!(v{~rEi^hfGDI_sADfWiey+Cs$h&z-$l$9voV*RFkWkEOirF#Uw$X zj!LFF-LW7?h0MgRNf5ebtpCEl&0dm!QaVw{>p1zPKQD(f5Xop}pv!?|DW<0x;#o7W zbH=uL9rGmitCz&yQG5%fw}_C?PQBw4(Aq{$kS3H%z>)5<7+1vf$L9r`G<^PaP7x%q zC&iHB+I?+$O{Wck8F?yAxMP@kjj$?~DF_PB3kl9ZAfsaRK^;#c&gspnT$$Gh!z=nB zSF`NjEVzU+5(k4&~s$TJ0cYJ|P<|GH{zT8gY`eK7!_H8#pL zWVIlM*Oc{7d_P;+WcB~voEyQP{F6%{mq0Fo zTmrcSatY)T7)S!YtDa~aD)&c7x_Fb4E)>-^fxT7jz?CJ{1+9{=IJOnw-?pvkfSH>p z459=8ncIPB%BJVIo+$ZNU`vJ?7;R3g%ZDW|*1hQ`3tQ{TyrVvu_ofb~okz8;*c*BZ zn2?tNVRbWJ29_Ki)lAoHf+e56fB)%R?WwkHwicS+?!$_?u&xp^q&rk@&i3~FBVn%! z7&$?}y{fPepEbgKDBN*St?vqeNs*sGb{*w4-Y37D>(`rLuM<4`2x;AD zRPpU5iVoQIx?R~qhoGtxoN9F!*m3TyMx(u;AWYzjt%|!%8No>4jypT`Ug zn>$q`h#&Y~L0H9QY|yKFf+`AS@;vdTp@Y4Fh$0Ooyo!%pb&#~(2KimOahHDI1GpVs zvs0OiQICe6Q1pSIh}y)RZbzQSjL{OKQGB20M9KGh`Z>K6Z}ZhOi-(UO3IB=Oh-}$u{Pd{mme0S9HC#ptq zso~AdxaP{%u{k-dHCl~l5nO_WF2Unb-6QZs*Ej}>-4dD;Ul(b?YO8nzPkme!2D}}N z3KXe56ldfYj;!>D#a+m`X_>kDBFh22*gh&AYxDC@4-RW; zH5LKaJK&HCg%JN9BUDHN+`*IrNa6%Wh{@oQ7KIpnuw>hktU8Ws2bOFQ=VlL7O61pK z<%B~CpG|HfNxkwa6SrC@(qV)OhRrOY{^0EwWeD~6R;{_RJO7|Q**GpgSv_2za)W~> zmEx0Fr~|!M2$YQ?HWuQ^yM@WV`qi%rvqTodxOBs{6E8*`rNAhiKo}c~^@Fjob`61G z<4_XD#^UXBYz!&}*r~(qo=9;cr9k+rU;l})=QscA*Ew=)54$u56e<%GW=Dh_9g^yR z{kwv0p+Pj-6$p$VQX!c35RV|-?dkesV{K{#PDu}gU1OYUOFq)-Latq=9O1GUFtr{V zJFQrpzWWqHkrEZXyEredXvVb-7Uzsb(57jizf!?3+-9d@Dsutgj_%wclpj5qRd62P zagOd#aFd1UB;*tZO(=b=c{eFT5saV4?Xba~A2b1CKwVlvz?t+s@6hGwGIFe}F;TNo z-wm4<*{Z{D1j`H8x++koPWSZ=JtuGn<7eEp!kLCU)w=Z4Al)l`bkRj8m?qje}blo#;PxTxF7O3NDXRT?BzK3{x zLXzS1Xd*=XVMr)E*lJI%c_V9K`u_bF6)a3Y`iA8z%GzP0{K&35%Tqg6M+=VrB!0nE1*)Gv*KQ@-|=(*K{20e39^OyZ~Z4K5Jv0u}4#2bjel$bRTxA2Z2$KP#KFpb8>_*Co| z0gO5t7tAyOO0ls!SoMp1X7Bn|$DJ;yyNO>`{VK8&4M#&Df}H(*xVw!UNmf z<_|3TRsoTAm(!T!n6eZ#?Aj=!-)I&k9Sk|0OwG!gP9MDcqDsosrz|a~)QnxNR91KG zM^DRkd8Syd%nUc3_@)4IdMsIG;yb7JB6_qa6Ut^0y=tRw8*Eb(Mm_IO9 zWbesNt)ZFzQ`vRbyu(;zv3_|DebY5mS5Z|-b+kbBb>DFSbu-R-qj?;4FnyDx|Mhnp zO%Esk%GdEX==FYu9iV@7PQ-5wu5W_GU6iuk!|#6i#V&;Uy+_v0lljG|V(X~5w5l|h z>a$Cao<5vgjfL8$zM0bEJGVO#+ni|_sxI0JAiJ8W%dRS&CDP7Cf=|kXN&&Agktu9c zpxt_4u-hz$WC>V0h({s$;((DQ;C(ktTKqtWuu13OKxdzKgqxkcy~D^8sDIwgt!R;m zx*2kbz~HkU&3BqFcJOGv`$fxMUu`X~ElsG)x>k9*_;6~;FD==FKAObDO!g0|NDyux zJ{1K%RgH$AVu`VdGyzzf7ctMl1Cw>%6#xI^$iE!<{D1n^AAaULpB@|emv5Sv$@K4M zEI+Qj*vGT`lTTZd*R&G4rI^4ns$dsuIb9Np31f0M=j4PbUIIKB2XC>Y;xNgO!2NWu>e73>g8a6a8 z(0;nS2uftB2-00)%EvXZ13@E8+^)^$9`=y%!XD^C;cCXq2R=x0N|Q>`{vEw{LEUzr zNzb3j>BZou`XZS{imE@-5Gzjv=H!%3{roi$-YFjdJ zetty%dTO{!F`G1Nm>O```+)$}ur5pJ4&+IwG`)!#23jiETm3D+&R!>|hsqT0Qc)bX1$sUVBM;R8p#dDkjV4yBpxhNEQ|VcFp_rWMW$KVf1D=K( zl3Wl)E{de#shj7|iu&O9O|F<{rz8?RGYMKWS8r1KZm1)5Do9-b#GxHNQ>r(>UmGb? z>6wu{wCHV1Pp%Kx0Nh5iov4+#zfD2%AtBk37hPmjmq4xB52iM49oaJ zB()-Z)-YGc(M4@& zNW7`#bsop3_&A*1aO5FJMCzAjZY=ez}Gy7{@8nuUaIvH>;$Nhb{R@S zGji9`iVy!)SEUK}gKZ(@%7Rm_$ee1)kjY)!(U%Svg@QAc)S0W*&JuD=Qi+GRt(qK< zkSTFNx-L5pi*48fa`N2Wc=v;+q-{%rv^wqZGj=1*SK-=KR8ezHxDPZ_6J3*_+XFeo zP;0PRf~aXD*{CEpc~7_*ef6#&-y%6h3vAqIsP$DV7^a>zEk5|{iw3Q)->??SPl~R5 z;JN$zlT(d(?~%S*KX&5PrcYNvVvq9m750qRij~Qxzvu6l8h8|}))YCi0;rnR`cY)C zHhk>L9&Qd(Z>@~aheJ#+be>r)R#-h8b&^7(JS z^_kE9+Gqas)9<}GdF_9|fnUadAFTdtgl~DEe=R*;H~ixVN3OG2z5m!LZ7n{$P^s&> zX=@;w^=wsF4NbNs({S9gX7Mmmmx#~z<;vVFpxkuk+0VaJoAP=!;bxeYs@X=BS{aUtJ!x1;@?N4scO zg$6;9&#^J~wNphEn6WWzh1k94&;@6*1uQ@&>>a+u3HX*rd+R<HHEwU39+I)LiJhD|OXc9C1S1R}i|k^A^^p-v7$>c|)N3-XMr-a^@mFR-BS;b#7 zlOBzD@H&YbuT~R5MI%CNkZwZKa1YVb;!!)!u!jv1z9oh$7#rgcEohN{i#<86CE<(E z+fsJmi}OMg4Y$MK4&gfhfJf@)QV~d8`ktUB!-V@Jj25PC_m`zXIS%Sc+7>GB%Bro& zrsZJuJ!|dlj26(#6B@8odY5@r;+G-y1y$$8D*&q)>IPFeH!9JSNHuHg?w#bdikc)A zaVT(R74u#p^iXw9TCX)Sp5N%SDh3AV83j|yRHQywdGR09roL!xK}$E6Cd)@!dCD7CwrA#_)=HD{ z{&OK3s_uBY1hq~VDZj!uWl?uiLMm^ph>Rdx{7VNo(fyX(iKlR zGdw?xR*uc;rB7f*&BQH#_m^HA(hF`|#p8;&;TRw&Ty-ajlH*30TQs)fI&A=a*tg2 zLjmAp{?0o>^rZk?BtW@>6SjaJ0Z;24VVbPA@F0V1$=Dtc){VYrHV)JO*Mp za@c#2Gf7$!S`{uX;ikkybL)2M%O)TYBo^VO!sV9wHmY}u=Yl9ZEVfwgH^axpOg}Pf z*`>%uO=C;!(fEW!3jB=#tTaK3!zPZOj-53q&5d%F%UtpQVn%6N%j*Fr>O3tciLMEOZ{yhx?L%4(U$)7+=PTMfp zEWY1%zoDN1t}FnwDc9B`JF!hj(bbAhK6Q`9XdcUGCvQ*cZWwON7`U*GL(}^`+Y05go)Ts@^4O z$now$GEqAoO?>(29y^57Xc8=oJ7oZf>L$)MsgMx99LAQl4&x zkqx(-T!27-3CR1FB*@P{cI# zJP{<7Vf$&~E#wF=afLQq{Je%zUCn})ji&zK!Oz|xgYCXmSy^6LTi9AzYb_pZKb?4N z?mjH}bFngc5eD0E=|jU9Y-DV_RELX&*i@!N;)9i+y-q@1w6>dpw`|*XwX8dn#qozn zc1zw#H1vxQ>TrSkVT7u@bSoHA)iZ(r-zoj<6Oif$&#Z~1!zFKjd`nxN(3Ilxqw-Vt z{@il>st%+`6tOb%m_wq#vP7P6)n++L?a_MUVj$(vn#4>`=yz}Z>>6(Nd(W)72XjHA zzJ0iDRjUhAwX)oNU^a(@V^0Gsv(J#T45krAY!L0a10+qI<&+Y>H*`wzG+O3Cx&vob z13=sD5-hk7y1;h084VzA&HReA+hEZq4#O6P#fPsJqtpN@WK-S(bkROEh!> zhCRet5p!(1Qp^akEjIDtMdOWF-(Z`hEZgY9m~oihXr5dt2_H%@GgDXMGdaEz?gR6@ z+d^@((Q=xUN_q@*9TS}+V{Q!10jz4`yHUAsH-#!vAh|Kt+rTLRyId}8uKfxrDc zR&RA*^-S6DRLODzMKLrDEP|FVIgTZ2wi{@gX2_QBsiGCQ>SZYuX!%pM)`ICTEIZon zls+G+Y>(h^yE8610#99(5Vh(GpQIS*r z`eI}2X34uZ+MPxvmMNWwUx=FlA;Ej;s@+g_@y#g3`>0?y_OTQ|qi+tC2>KhcsEh&{ zAP_|nM%HLhg|rG?CE{$mw**fzJh2f$=e^NxYdv^Wa8CD%-H{z?IgV&k)+)5dFgF98)p0ht@WW0U+tn86j_Q81Rj-hp8iCV! zD;A$Xm?nBlpFMw$6VpZbko{06{Ufd`{7P1x^a$d4(l(4pmy6(bL`qX-qCJ(&+@6Ge zr|ZHPhN`-+rO~np(cDSv~*kO!jJAYxtYtI`Q|7)EZ44q;3XRf?=#A%Y0`LE?)MjsOcV5{b;~! zD1PlEC+BCwIxSA-(;Bx9;70jq1e7nr(Q2jj%VEJ5|#i zG$;;``5v~@>fUAm%s+)Ui|@a`@a%e{W>?4wzl$mnRPF@_VcuScxw_-KaOXd}UT;-4 znHJE!<_firg9+>cbSXOV!wFhoIFY~V!y81Tz>q{C^A$=wsWkkXeR%TDHfKQ3-3$E8 zoOqE4LYEzUnZ8}VHv>Bx4!lxh6Vw3Bd&PQ-|3*Zsb!2HEh7-4ece0yz55<=^ZP9c@ zeH0<0q(xCw?oyD2QG0h)vMfWSJV#RSt8IyjZ?}2#X5g5zo4C&cxv1>s%=;^g z1h6%_X=&PIB(Hj)m4S0nYGQ!_}PWvrcLw-hZ;NR9xF$p03Z8 zSC4k>-P+9LLh``K8JT`uaE6h$EvW+%7Xbl%VUKzrLi2pZJ_!1P3zxtELIo?xmDhy# zkAYllUXz2IwOe%?WfPj!EpUhs$#M*KVP`RlT;y|xu1AiNM`e<*`OuMiva4~%UY?KOCP{UKG&e7-RhxpL@t@QDJ zcdv@uOO84Wjat)7vXzJE-;L{cg$+ai;1#}^N(k7v{`@+24@yTM z)d=lr|Dvl$I-yV7MKf;gvlS?3% zKrVroAc5a3p4{Vc-yf|-abILR`L1Ppie=lLW~;L9X@PA@isMSAZyGv0MHV=MbVo#K z7?Fa+vhEs&Zy8Qth-@`xD|ECae5i3>OEYjkNO!R%S#=yFdRwwVHRyXR<*E2`SYWyEP{irJ3yDLrn0 zNb^VOwqI&&TasWUXA^t9%-FV8P-JyeHbuu$y2rM)g4{KMkj^yL?`P`|zx(x*uhYDq z{L&wPDa=%n9Yu2uU(+Q=GZZ%%bY8bPdUKM4t4DIMfV!H*WVHpRY!Dnc^(tzsAYW$R zb{YEsC+8xLt-vm$ZGp2Zg8_k#sY0}TQ6CPGBv3c95U+?lYnj@HYZ?m#$1RnlCF-Bj zSUle?d5or$6B;0FjIQlHAV)l~6IYQ#(gHcyUTbTM$SEmFkCia4Rz|_x1sdUK5Ge4M zO4y4BM7>cw9IG?vfWx~=&Pv_-H*(&D>H)ILDdV0bM!OzG?198eRa)S5cG!n*Uyo`s z!(L<-+;!kiLiAPDVK^={!n1YjB~~yNw%hcf@A3+Zewgl6OKROx)E^EHKSI3Ivv%zo zva~p)fhTNH!Ve7%Dfvhg^iXd};7&H4B37?g>jhz{iZYJK?83_fy6JB-tMc3IuEMs2 zMDVF_D{ho~{P>$ozh8F9JsH06-$H#!jP#GvR*%;x1OJb$P|-IX&DMPnw|@rypS31W z0k6Dq1_6L3MJh&&|4;J&CG54LDGr1GR|=NY4gZhPsnYrzh3x&C#s6Rb!U+E4pIidD z1U}vp_=EDvuW;PPKPg2}Rpheez3hy-X}l#`_G9>W-=m~NwTWRsvrtg#mo~YPMnB1=f8aa_kpI& zLCv{u_&(`P4d|wKnDf^Us=9GdsctOUtt0#C>i*L?y;xkId9sq8%FCdtF9@p2T+Kdm zuTNWRbIXfQ*6fLsiGw9;LfT#1Ezd?btP8iXHJo`Pnzn-olFd+RM3J_EKm?(u*%3YC(YCa3+a=;{ zX#uyZKrZxqGn`FjPitD$g`MNo6LoHG|L~}$RHK^_CH6yPemkUqZbu?=;lg+1YLE-( zN7gQhTwu{L%uzD)ONLx{Imm@B=R7lZ!kd77vTeMvXm20ZuAO|3;mSJj| zs%Wk)__`xYq6juP=bHNl#<=6}*5vZ|)J9`w>FIKL_vzw^l)hQMLcYP!(0kwg{?DKO z1D><}%nNe1Hi{5!UveZ%S6$JU2fg9fEN3g|y5$JEr-{C*c(P~frl}I`XOGwKY|hp% z)*H$wKdJMWT;Rd>b2g#*xWDVwF{1*f>%5(_X{EM1n8IwVQ#Zm z?)Ufp!Rfbn?)N|axghr|g8S1kBwz9&+yxfHX>}{V#*-kB2;?^uHuQ6M!C2$OGgRa6FqAFaT{jLZe zCr0j@!}v<;cbVCl8f=XzOPrbNrZqF^97?OR8{Wj!&U9tYe;PUGU3s88uZ>}X8Ms7! zFP@`5=H7k0{M0;reEf8`qFP5&dkt@0opz(S?~&5!EKA(#-jP`GX~&+#K8Y6UczNfm z?-lGySF6VYL_VrAU4XJn`M+N0uK=kHP;hS^fH&>A)l=A((-p*QeOgmhW zR%OpL7M>KV-lL`BPV{Su z)rnx#N+!C3^m%Vbuvhjs`|g#T0mlFT#{V<)_P@hl+0QFI1K)doI)QxM*G7N#vzZ`Y z*DWx89x2~-QS8ge+c+cdRg$+2pb9v9+_0ZC*5_-LwZrD(nxxm~ca#^R(X20T$zqM%f16gcgB41U5Bb{6zQfMMVR74=>7p>8Ti9u z8Zpxg0_u!noPCV11BRd-g!vKt2*a3?{`@vFj8Nrn#IoF-QrMwd@Ri64f}thVXH1}a zNfUcT;M7nzfAaU!_xKUhNSO84L6Ku^F!Lnd!s%@UP0CX=HS;GE?%L<+) z$;$Y^GWqY9BLCgPLro@%d_f-SjpqYHHZ#^@AYeDgbO%Yvi+J-ORzNKcwpjG^j3iTl z&uJDt_8VuadDc~Rzl#00OEVSB2>~;k+g98UGXwiISqGH%L~xhR;Cj9VMoc6@1?Zu7 z*7H-(W$UO|ZXxH5LvnYKV&@tA#yzk&lrkU+89&#ZQJ@2ea=!V7P$gqpRFI8Qb06dk zZo35(gPn#Oj|>lBwgJ4=qyAsl^@62(j-+D2ITrwc*73U3yZ&F5wa_Mx002sq{}=Lx z4um`?0@~38cuztjKPcWvFbS1>GW#EygyQC#)pV1P)&IZyPt5eN~erN7liU=-Y}e7`oyM zx@D`X?c1v7`lyK$KuT&#zNQ$GWXc_(vFk^CGCgjMoiwzSrPlh!6RmMPw>W3)wW3h$ z8IaE_RNQ#&0I!Cc8UT&~ujN*8<>YW?c6`J1CpW6*=H!!ceI~kL-GJ8#FquOcuT(ui z%}j%09D60NkI57MMLYPu<9HT& zhsS#kOdyKEqYc}F@$N=^?h&j=!;GmM9Lm0jc zip8^MrEh3tC>yFn$&<+V81fxgGh01OJE-n~@4w=?ms0d&QT5cjlR>&(4x}r4n4^a| zS^tkGf0F9|bwld``(XM1TmQw-JO2y*%6_sLxEV75YJzDFW%#YPgG^>OJ^Xn*b=L*T zknx#a9lP=iQcj~6CX4<11m#pn1vrnPP(uFhWp(t)^W(#5C~ z!rE!Hwpw1$)y*&0(!<)n`_0oSj&%4FP?y{ycTRN-S5zcl6a_~&WbeH7p?f{)aOW~= zf}2N8knx9Q{9!p6sIM-;6C@TBXvmTTQ^FFht`6=E1RcKy{9zehAX6Z?S$Khg%$f6z znO^yS7#EsSuxym#%jf6+S?hlD|B9lX$^T1~?`QS@0{E6R%^*BL8=F91`G00vB@}(o z=*-Pq|3|u^#Qpz=L+^h7*2A0O`emcMHZ$;BGpDoM%KrRb=!J`5uz*IJB009@tE%Yv zwk8RtWy-c;%cd&IzULXTY-xtCIEHC>mJSU#Jg24$lRUGsZ#bTK5sY19rE28_$pEW< z;58^-FDYtX&F%42L$z!*tCWeDML@q=a&w{-e2WCaVjW*BT1QAflvvt8H|RL_O+L3? zEH$c?HVLM^VyU_fs3J>JG=rX*927AJQSX`JQihLY>89QN{ypx15HWpuEcL6ieTt{1X~5(4*(GhK-aSO4V0zyD#l+N zviA)Rl5U`!rh<2>z~0!0JbqM&`vhf3cW)oC_mBGL-P{Y^r?4C1Bu&R*YI#wT3WB0J z8p%+dgTrL4`?bU51RSOj*XKsFJE8PzJLGyHm;}3oW z{K1zQ{=ijC(bObcl5G>X1Ho{8!SZd}HZ{^em2|-ZowBaGwg~1ZSD-2$OP5T=^aatl z?&QiVyW`gMlhx_%`HAt>1Mf*ut@^dsgIxJ~;SX3eH8sN>;}6s|eWJMQRIJAfPrRKS zXIe6vV~bI2x*LBm?tz((padcqg&NJ4OWL)>^hZDdQE2XrV&jJTpHl+m9}@ZG;`voV z^Alo#kpap=u3UvMUv%^?6eZF0+q@IMSV0V%b2x}<+^XdH&30r!bhuk|bHT8HZ3u?K z&QHXogn{q?R6tOih8XvLDf~e1+0F0+F9$#H3O$U;`G5A9B}V{|DoNjWnEyZY?}one z|KYD!{pUyTp3d=2_Ah@i*kpYhkUm|JZ9#N(ThcG(uULtGBd7^k)>m^99-7)@GOm-BF`T7gt7MezVo zE7u<0iE%hNL4F_#4+JeQi9#QnY;|&V${#ywjI}1l_w2RR<7sDMCQbl%Z?f0U+m2=_ z80jE$MAmaUds=LW>^_}aoLp@kuP&{~&87Ox()#||Y%JN=BS{|kSQuoxpjfh(MU4g) z6iaipVwbAh*NVSsceWULLFgyJ|LX3yFL&#VzjYNHg3QI~<3U!9%2<7@F@Gc-?z)a@ zFCH&W&&=UKn$w4OqL(NjOnTUt(Ab6V)YWhZDxh9K{_vv@8%-BIe*6*s_3HJH*$4C= zfFv%-AP7%UPJah7bMfVvi`Q;hJ(uaPe|@jycPI{>T%=sws&BW-*DE#rfF_ZR#{e_3=bqXbi zsr474;?&R9e;>5hP0O{KR^Sl;G3r_6htpQ60so-bC?M3;e7IU~@!yIS5Ny<2HDt)5 zHg1aZAm{~Cl1*Jp)^H-TAvy3&i@^MO{{O!pdh7ol`uDH8`yXE4_Zp`QSow$tPY%-7 z-NJlC|f6LHDI&v;=X2m|22Cl*^{$L7kK0lo6oM{arTv46Z? zjyL&Kp1g(f(^W@0be)5PiOI&CyRNO&PwdEh>fz#c3M|~As5&#k+GTC1;IB=T3(7V$ zf1#Gb+3Cd6)qxWy;#wfZuLctiTG~{1G656LIP4S69Yqp1f9jXgm%1N){dArTo{4Y# z<-_2$7X;ssT+K!0uHnnFeco%|y-Z|il^c#$$*AJ1FhVLI-pZ)rUteu7ARQ<&O70tH zj%#xp(iCz7U*k%n1sPSm_p$KNhjp*ns#gfS!y=3nX}mmDe1`eYF#k6X^M7TgE3XL% z4cFfIe??RZj-y&?AN+q>9@v zD_A=s8wy0Y0fBxpus2JyFi+*9HUlZyT)J$UB{P;XW9gjQ_+TK8)YDXJVMZ6ZEo3H;w-J*26bIyD&> zho6=crO~OIZ~hPI_Rwdg(?v2hOvCpy z2dok{O5Rl8_XO8=P|&8Ex-Bb;rAlUpnR5Lgf-}XVld*-#g=VW*Syb)yjYjQJtrmrv z&j58Y9>5m{5mcmfA($BcCRvS%$;tf#3wXn(xjHttbMmMaV>-Jbg0of~ltGYJ2a5jC3iNb{1`y!+6(j`g)-kd3fqlQDQIIZhtOj&4n&{Ck zZllK|0Pq3U=SY5V_*KEw59J+xD)duDOMVP6_7+h6PODx==&^L11J6vu!g%~@J$GBg zvLq15AFP8o_n}2)12`I^0X)Cj+TLN^u+J!;%E0=PBGAA=F1SN{fGuYSHwhJlj5M$Y zRR1M0{Kze&CMhyd*2@89We+lYkkj!0SUghFVp0zj5cB`v`I(`w{v-UA{bVzc%|JE- z*$lkqGw=iV^bz-hezYEVLEy}@UBPu_S(Yr#bR|WWTvxJGK~%tv?s$?QGl$3pYq}z; zh9cMsYL_+FaKNS0N$hd`yr8As@kbS1YFdvJPcKi;O|9?GJ{`}zAUDT@ZAAC?QVONu zqMPZqcI*Z1n#)i91!aBHsx3}R-ilWbH%(ByJL&)CDt2E*>l|Q)XGPOL;K8XEpO+UXBM7-`5-a5GH#c z?D0zQKKSS9(Y9avN2i})p8*p0H@_Vu1-l8M&Pxhj7bI?0xCw-N<)G?VO~@}7iU6`x zSuEh{_lE~S%vzPD?d{d#wCOA^ElnLQDKn23#vY@O^OU8HrKgj-dyBfNFO-juoteGO zqxFf+Xg|0JVz!S+dMFv)7E8YZqU7Gi!U>>QRymvU{t263`Q`LCkoo_&esAcVe~7=b zpKJ!c_!;=#%;_>YAL4sI`1?U&nghVOW{9%nxSp$WzChhGO)wydk}P1)a4jTYRNc2l zMRq0IR20t@bXU_APqd|LR+#3iqGLObY?+R$sFG!BvMXPZ*2}3P1pY90R}vtSs@}_u zor6e`u|voFlpY&BH3gOze2&j50K%4CT*68P7)%iD{NghMYY_xR{(?ok46Y zCWJ>14~Oev8wHYvpftRkVy9Ykyil~eUB>&_a2eqKQX%kZ_7A!^01n zC=$jF%Xv$N0St^-28ih)sPpcSR9~$U-zEY^h-NjY+K<4Y_aU*@yn~Px3X%76#b(Z} z9wOP^^lGE_@hJWKfQUWCd~Rf9!YVnf5^wpHaK1J^_e|PCX6b%B+gHf@Ui+$bzE&%olz2pD&A0SfpFn3!K^6iH+oC0fw!`0~M z0KUMFR-=Q(=-^d)hvP9*#Ud~P9{^7v&{sy)qz5DgAtqud0-vx5$-q{kxc{VY!*zc zs`rC?z@AH5^XMwscnmfkgI(-W_3(b~+jjtiz{*$jsmc@60$Z5fW-|I(4dPmSbllv* zFH~@X;~3RQ_=F{q(!LVbTra$vtOx~N0Uvo^csI1}7w;y^diYAmcsDI708oHVGt7(N z|K+@>iirjqFld`UWu;qa#< zw6+^d5%(Qz-Ri759>i*440)HfTiPv;ix@8L#}96~1V{H_y0EJq%yAj9J40VS#9!G@HUrrVWHayrX5jl@Ieo%G z9iL4Epbi1-d%CXaj^k+tVB~}9TU|3yhoIT6CTbeQ+Em5zJwp;S$BvO}39cl*?AB^4 zR*KCcJjqD22%2mvHjD800!bi2QSo6;ZvT`dkMNlY?Y6B7Q!Z-n;Y_EHW(x$F!v03% zPpGfZ*X-@;8qB#RTR4ntHnm(tS? zzy0>z8#a0$7)3>b3rfFZAzMi&x{dxs$G0ihxi_Q<1h zX2l?}dJ*@jWC62~hbv`#AD94#-84tmw#NgUKj)QOvy3!dtLv-#;$LELP zQsQt|0rw!qXswSswGI6lV`-v%td=L;F?nZtZogKXi0;%GNMnCOo{7QIK5p05z&-ki zs$ClHfyh|u>}GI}mjm~Br9w*gpA8eR6LB4@(I`S`8f3_DPeTEh0Te(JU%uFfy-08> zm74m@qIdmP(}D8;$s0}kjp!r)PwUTB=l?0kZLaA&U0QA^yT#d+$n5K3pm!+{2Iz2N<880f zy}gAWPDE}zzYW`%s&N}vAt}h9P^qR@0((kY^%PKAinRHSpG#jofB)mtb)Lrji=PeB zn3k+U)I{ICm@XU&d1LA?#qnJ2@7*j6(-aszK zb$}QnJ(|H60%{NfR}glh-U7cvl%1`#%C=Vr-^2aky0_md);)Ll!Kd)YQ8td*3v#$s zd)ITCWMOqeGp3F_rxj2w5OruJSBtCg$r`dC(Hx=&EGQ;8Rt>6-pSL6(>Q_Ei@6pyYOAc==5ENO$gfJy0$&w{fKFx?ll1T zxX+Gf%md*7ZUX;Bx}AB}%Iu|g1FKI`3!Vl}<37^=tabcQ^iKan>n^mkqx8Q>`ZiGV z7=9q+RZ|BQSoG}lpZ`xo|6_Erv3bi$w_sWR|4WaC@F)ApW+0n^YzDF!$Yvm$feX&S z@7zCq%7HC^4E?xwzy7tao4Tdif+UEJCCdm4xr!&KzTty8!!iXyw;&j2dWtJ5u48F1 zJD{YXd6qA$w&-e}?sr6lt{<>v?{MB}KCP}D>0|R7_07kN^Q($Ssm~NTfDG93f`Bb7 zT$vj8jDaoY)a>DE*{IfidH!H;rlBo8nR~Ps-LNjoo2}smsJc~7z^w?+qPbJ|pwreu zFxRmv4bGSdN2qBz5SN3@L6s>a)T$2D6__7^_%ex6fPWpn{SE)OtK_u! zmIL89h|Ybx3AV;YE;t`p>vpR)oDrxhcovgq*l$^-Vw1GxKwMib-KRdA9{d^)1ZVUy zx)1t<>sAB-on;r<5j3u9$;Fw&!9rnf7V-`y%Rx02h|1%ya(=y94mc?}^BuqHv+T^noMc_+WMHGB!)px%#OhIV*4Xou`Y zeH~uZWCafP1}5bH>2vwK{Qs?gIrPqt@mKbf&A>IDf$zU{`YGAg;(MQ|K@GVo8a~Q& zJYO?C&2|)+*ia#JG|QA-RRo+|F%(NeO}3+Xo?*JS<-4{h<5$?;GPYHesv#6tEfqr0 z)9NRmEIb=-)GQRxJsaLDRuI)4rVlBGi=sOg&c!zf21Dco-zD>EQ0u6+o6`Z~RIC;- zAn#48z0x$xl0;V&JxNg{M>I8Ps8MxMkge~phWyYgV23Z%ylSoFfs^d8L8amPR%OSk z)s73>)v8;7NmXj@9Eab^;QUWG?1NZLAm}EsQA)odc$LxevNH`>K>j*RM;H*Mrwot8 zve&3pD-G{%fa`nM4yWxxR-Df>qYGbH@wkzPHhRI99jK!x7muSwqGYX+mj!wAaeB=9 zcV|yGIqKq1KZsBlwl3?YD7luVijdS8a2@FIv9sdwn^!!(&NE|=*qR4Vs(}R$4&fnW z`(|m?%gtcbgU82Kz1*}_E<%BTni21R86GY?D98hH1CsJF+@*?rD7OBcISZUt=9Lxe z>|{*WylL$rod=K8%GIq37}4?H?Yeb>Q&f>^gIHjoVPHY}fOQ+D*9ZhfX*hNiMjABF z^a!$Ya_->Yq3IfLhKzX8*6(Q6%W`F9=C z^IfOIS1^K^1#E(=EPB(m;Iyv@Z1|YN1~?Z26cw8$7SgeyLW)(U+5(1>2FZAHx%NXy z`0pVihVNjR#tIUzs}Tx-1~cAcz4@j>7cCSkrme((NBk9t-dr;K&gM*HV0U>4)5FRXOHR?I%;+mq!d zM~(8jRkt5aBC&bAD=F)T(R}w^27xqM|Mn0oA7)I=UFOZ1+u30eeL*G>8|@%QQD_xK zW>J@66n~HC1=A$BLfeRqHq|=9x3G`SR}M&yOyRK@yxcq?qQ;_i7Yx^has$jXe3%^6 zON-Yf1njP&(wyEkvyXReYPZ##8JisUSM#0T(n`qrCz;pVV_}Sa*)So7Pon=K@6|ICmC6Eey*Igms&kSz6bcoD zObmSx0AO3V+WLQO9*Au}NVytn^<>#ct^^yMGouk0tAfouk{8MwAH@ICwVA94i9 z5B38Dh^hOMuequsinb>^qNK=@>q-^`1r#4OTtHI;5#mdxtE-YCs)ix}Q(;S*YdE$6 zB*=9`fEbo)TBd6$nt~BqqM_Rkc9)*}ZiF=9JkZ0nYH80ZxYcICE?E^oaT|qzhX+Uy zNy&Yfli}-~ZNwC<3)@8|CXn!b*a=Htuv)^q39aH@2F825Y8M~I`(FsU1FF+sB)$U= zXaO|+zGbE1J7iN%gd{4OzB!j}ll<1s>32B3ZbXw8)KOB?J%z=@(X=U>EDn z9S+Bb9(oy>Q?H(*B5YI|6w6ShXLyk4NF=RM*wA*$+3F#3y#Q~-O`?;!RrC@M79*e( zE~R!e6i0^QxDhChWK6)Twlnua0LX?=FclS$LUQZto`ss8f(0dv;n=~B@d9X#X6-rq z`@^k)znnE{w(@`$g{3@i)%QLKj&u_ramzn7rZT3gW2dOu6AkE zhHOfy)0?3-UJh#G6XYIMPy!Jt3p|G32H+jX;(mJ zMV~Wuv)r*~)$>5<<4>EQ1LSR<-@X%@$dO(V1{Vgi`w^4tE!CHxGzQ?C ztR8^GpkCbG0duF{#2!zK4Lkq}4U0Ua4)EykdV-y5(LsK@0wPcnKnOQ=%6OL%5G@q~ zxZ*zOKSyh&Rs;47Y$DGp4?k$uTON+#u{t^;a-Atw5wK&yM4`w7{qtZrUWhMfprGgk z<_XsUV8%&r0RY7?3n*Fh9SdVPH~){;G}N}5{nY%wq6p!IN0*X^;DcSosmCaj!(cAxjihGko#FF3Aixu&VOp0ApMZP=3Ri=yut#3ie#j^tZ9ijH&vWI?Dt zvTe;)J8BQEAGAnm=wp_>YaQ(?GuG4THMOcd*uz%h_%nP#;TD6W2^As(s`GKad3wo7xp`nNDY7ltRX@Nw#$$TY4`-0#=QqMANIBBM4Xp-c} zx}-|Jt>}WGD?TLmY*n>=TlHMukt{(M91|Q8iXlm++~KWdS^JxpwV$Y#Ja`r*md$EV z?e-pA3uMy+NjBTtE>@VZT2L^~D#6JSVajZWUJ04?Q0uMZc$O1`m_X^6^83+OL ze#a^jvp@dllu%PnZJ4SXKB$3#12WygIb^s`z|=6ofgP*llf)gXCqHvm`i72zz;_)r zsLa_qEH-!Au>off;?i-Rn^l}=73Vji;=Ci-3o1p6+)PN{K8C5@| z6oT+VyMh5&^%<+-EWOOZs!~NFy;!kIIUdh=kjsU%wiR&YZf*H>%Xua~e z^Jq~sM(4ZAWE$i30*gkot1m4#nv-!PD19PDft4!6F|ly8$qA5LXPc-bi4!0z4sC)k zF)lw3ey0ltPA>;h&7yzIFPA0*0U*R#oIT8X$!V1!bWpA2_$)stXJ0_|=Cw=^o8YSThwhB2pp% z8B+NF&AhDW1w}IryN~LB*1F&9zpTnZHE6FH z!P)hA|2t4MG3qFZ`s8{HI9xbh2$7il1@efQc|}$WrY@VloXjJJMNCT~H=!eq&4u)} z?MJy&mwShQ`Dx%Cx~?ZHmLcl~2m(}J&7t@&Ns_E#22uJeQZrDqTMe;O=8}+@D-Jo?LVr>y;<#yYBJh*(VXCEW-dES6gAp zGvcU(m7{ZjtF`LwA>vls(dZWUKf4rgY^H%xzW zqiSwWJ{i|%q8rwY0nBn@d}l*WEV@6z91U`JD9oz%ad*}iPu8u4#}g;ho;rIh8^wu+ zvSLMdr~k_Qwr%WLgtde5bxukoOj)ph>0Rnbi$uDBJTVeC z#u#9RrR7HAcF2ds*^&5T9Nt%ggk1y-7Wy}Q&5e&BDf)PScACEX$g-?zS+gfr$JUOmmb7~ky+6^) z8WfH`?2Akpz>{p9-LxsvZr8OCmP!Q|C8_LQ%bOz@Ih+dvE+sTUTp81y0kN1MUb z^8fK=Xgk7*2gJ$IAy*5OqaF!M+don+8p8lkIXdQQuySk?qxkq$q2*Yw zgqMr%Q72-KeSAsG9M7}1f#z7JX|Orgx+iX~tG_eAIoAE)&^gv^7j`Z@RT_AXo$4a+ zId&ic=z`pF2ZS!pC!ayl1z)w}*f@?ZJ_gb2`_LgH1RCj(v4}iYa=h2=N@vMCFEtui z>8yP)xE`jCefQ`}62$#3WtHVe%TE@zm!Gs24|n#*H;lctqBk2YWl{Qcpak)Sr|4=D z#OK==m(LHI>C%N+e)#3&hclz>C03db1g8%@i z65^u|8%-Cs!^a=tUjza^W*^XhaP>Xd5T1W0LHUS61afKsAl?5b{Qs>t{;Q$4e;t2i zKR0d$zBhHci|8dO(X9tH&bH;dwkT_kW|;zbi7m*Y%P##UyQ*kaY-)qMTJtGXUXSy zG^hxgCu%^&SxsvX<#(vFvvMc|c6R8$kcK+JH`Q$q#}hA9SUby(3RPDEa$9~BMjAA~ z6iQvm8>)e6D^?Cr!%QSCg(AX=OVx^p;33mtX*tbS-E#{}t0h^+h0&ud=)30lf-!$^ z*jikhv5v}*Cl*(V@$y75BUo9Hmdo&BWBV?hY<%fx$vqg`Rv(S4^6I1Y^1d@a`zX4X zeaD*atWwCP+C(XK*Ny3zIq>n^ZY#ymh3BY^yaE9_BQFa|>Qp8y!))#omtob=H-EZ^ z0NoE8r$tIbOnl?d-v|ZhY*fGDr4?n<6*W&k??vu@@iVf58%|bmX7PEImbiYsGaIT= zd*Ep}wa zkZ8JAi9-z3eI&i*9o6a}1O&xH*}`UlzlxMW1g`{>Bndo-I%mgT~OF?yuj-ccYSpbD? zSOA3`ZUKZ}%ej$U!f`a6TNSp`ge?E?}k$ zc!P8S2Qm(Ml`c08d&&QqdDRdKn(qMhftBuD0syq81+gFbKUGDsKhG9K1OOuG{jvIg zF)!(wD4Ly}b)YNK^#90CP4@m(L)m=$jo$wM8}H5z;ZOFH%|JE-*$iYekj+3g1KA8@ zGcdpme5Rc4aSZ$)9EQ4qrlVr<1OLJ>@T$=( z-XF%~%LmfIN^yN^WqxAiU`LraIx>$N_2`Cm=L996N!O zM$WGn12RAgWU&@*(f2{#2kky`hM2q{Kj41uaHoi@$PP3Ekxi+4_?zWhD0jkyFPcRJ zz=(%GJST!qc5x4%(J@Hq@B|Ms7`YbI3~3ldquQ)T|A%rRLO~$7Z$P}B7zF8P92jO@ z!oeeu7$kbaD>$rtYisxt@LTd1)2Ba!RlOWoRruh%`VVWe{vUe^QxZ=->;J!WJoNV4 z_lLgpKfd!TZ{PpPKmXc)_NC)DGA+OXcK$E2>96g6{bVhgU z9H>y)_uJstWoorhR>JlI;ziaQeb0!ySV9;Z7KCewiVwX56)jUv1pkhVsO>#RO;{H! zuYn`bf;Oru=aP+*^VAi`0d!srwr=q6Qu$7<=;u_n#jx{3_L*NE%b758(=D3DXK^Nq z_4ynF3)szM;rTO_euvacNS?|zueRxEJ0F;J*%k5$WehcxlBrhwV!g~v3hadE>#{^q zMRt>)-|sDY;Cr@iN{;22P@VuCzGaH8Lus5IxTLcxEj$_0ep$Fn$WgQ!5bs6Wre5f{ zb-DL*!Gl4%S-~@~RpIyKA%_7J+I#yD>ND*n$<@W>-EnF6_;_>TmsdakGTyddd2CKr)++m&u9uDSHHjTr#=ap^1f0JUj~r zR*BhRRR)XTk#8B82+BC}>|V%!2Nq`1DB_%!#WYc%IKa)H9;Au}npc77Y0R{F{U`gM ze+l#YPrqUs3$s?;oU1P!RxQ<2edp2SdeOMpyoOg8&l%@9j_9@9xuyA3h8%w?!;f6W zMe9o1MPu98z(s%dbLK*A^PsX(Uh|f;g^eR!(wz-y{N!R6z2N=kfK2DHesFS*|`GScR`00sbOrMK(SW7zakcb|lY9Vhq=3|mq<#?4dwp=ZU%o%`gl zf=v)lGIhx>D(PC-lyfWr&7>H4QMtP!o0@y~*(CEXL$@k-SLXB9_ARZT!3gFKI zLog&vYk1AH&*C8>;Wf59^FG;8p+or`=EK=8=k8-mT6u1^`Nexx##Qb;%?HSiis)5&VS6 z>BHTJoO5g--HL95Sq{1@nS$+GmI0utU^}*^+p03C<-qPt;B40)A!1bjB-_=7QoB)v2}Gp6yuGdBYfw zCV+<>F_^&BiGJ_!b9l0zftawtv`XX%F~BR~t_r4V3YI6!f(Vqft{a9Z8x|$`dm6ty zuix%ReN^`Vv#mH)*ZWxb=)<<(2=PzIf11N{sQ?3LL11~2bm2g@7fr0FrcEs2|G)Ic zTSH%a^zQ%kj`!BzylLP16u-V!Kfk>4`Pb>;`o!F5lpEX2)|2JA#?;Q{>~3*+skj^4 zpV7l~iHFPZE!z+UMG<^U(M`npb(;a?Uckfk!XGX89>aP{M(^xE!HIa$f*h-jrQdDyikdsXe>N=#K73>maI?*C!GC8` z$+U=tYnTE{|MumVE-9}{>C>?M`QM?ZYtdX&k0+1Z@!8_j=_kc$eaWuRO+C8Wr%SbM z&w{sZ>w=_Ms$`h9Xy`9u>B7{VQ^IuFbxX=CO6t1xPw##HlbF?CeP*tmOt|}-`+JX9 zXImQw2M3lmU!NLyM{L^>5ZCG04lee_b}QC$6QKdeyitIfH_AfD#uG4!JJn{vt!_71 zKxBu6CSXkBbC?zmkCFr}=m4^3s7<3#@jOz63*#akJ%5t$|Fk@0ZL8^bcmtDt7Xxk8R(z0 zFpj9^c0H6cU}s{%M=-%GSL?hMFBG1O8^8yJTS^C$n-{mdjc(wqk&Kw4-tO!Xp^??7 z(2n&@VTxb?$T{<46&1&7Lf5efG%Qr>UdiHvMF5&g`P!1y6jg|$7o7to-88D2DAr3n zRn5kHw!hnPWarEPQYtN2Frz&<+wPVlNbGtDv0$I-*k#X&>N~P%+NL9Fu5Bu|=9-3R zIof&FLHAC!jeApQn+NPxD)dBfOFKX9Zbx@7^s3{-3+zB@i@S67kgjgGDkZvEUe^Gq zsDp2?Ngan?`q@J-wABfD$w=Mme)az6U%|`w8*iAZS6i?jZA>oj*iYB%`UHwgEOTQ} zqqm1$Vmq=edIkVSmaaJ9DpVESw+FqOeA*mn2o{lY3rv#tbL&MP!2#5@B2OoL6G<5S z4!ebZ4=s-Hn30?S_<5V6Ou_OI5-89iXBv+pV-@xk1aPd@_72(yX9JT#(D7Eq4Zey_ ztR$Q!Y=l!qYBlX67)AP!pMiJ7&pKxv6md?LZ`!d+epn9`brFwZmo+W0rf1I)cAoo? zjI-$QUD|6yg!&2By;&R9&|PLw7{k6I~fiTwj+hh3X(RNypy; zLW&*0&PD9xrF?;js1ynd3yaT&8#Svk{NUN}9u#s3jCG@P^Qd_rk4&f5nI?1k!~^19n+Kn7sixTp@^_(;+Mdj~*z%)$kCmc6kz1_-4-c zNO6*NV7HJ(BFqVX3j_9~L;OunX%Tk9aE~p*T(ZbM13jYO;MAEkdnV1!(yup4ntinz ztt5!y28&QwqRt)DVv`dEB$ES7dN4D~lr8M^>DY@E@QH+P9$xFVOfy~`pskR=rFWV; zwc#s`m5ZSh+F#qSk<|I_27EK^eT7GdV3oGhv(q4fOD772Fp;nvg|#gS_h3>Q_~JHS zcgSvpTRk!oUm}0;`3p~Za|VN>MI*S-_QD>A$7xHS9Rt!gt{sWSO{;#lYF5^q&Ad`3++8TwcWA}2(BN7%{anDR%c;R#d z&zti0bFow^U1{5`{Q#G)uv;tS_2emFu!xC>j^S+fmQ8w;`)E63JO%4eE@lr8d+yn0 z!tXR~@N{OL(Y?>!lC~b=`MJ#w4@cfH*k~i88^$mT{f(BzQP_?d4|L4sSd;d7<=JT- z9Eo1YyYWtXk1PcGI{Bcs%VCdHBFO~~ht&cMT?;#Qd)Nh`Eyh|B#$1ww>o1l(j?6U* z?7*<2TT@`KXn`#`lo8;$0wn4?zreL`Rakp|ap3{oU67k@Q1XC!AnYX?boRu*YCG$P zY;|dC)O~p88B@Ck=Sp4)kL^6>%)m$Zor^};);tUz@mu>aXxKL14}y<6j^X|^4|A|1 z11Fjp&`AhTL68avk*VtW<^Pmh7o<1}=K!*a-xw;D40U!}qf&oaL2Z9m`M;to9Fscy z07d+gW@>U2(__8CmhVjWKTn{Y67!m_o<;w&;pv;XAM~#Ozx9?d^b~O2H8=B;9->e%Nde#V@ ztRgP6>@{jALiX+kxc`Trwn-$RJ{Mcp9YWNTWK!Qa{a%3A7pVV7mXBc+Jk!uLJyHLU zT8JqD08`vtNcaEA)aUWOIMmAaA69M_@3cJTk{(WO+c4Yq+pCYZwr#Ql42cJudAPN0 z`#mq<$|mA+A=hBMR~K^)ho2I4WkbGj+%*{Oiw?Z9K@J*v#X;D<&sRE24#3j;P8AmP zz6W{bLXG8>LHFx&wX{mDMeD({JM0rQ><*y@QP?n&*%oSSogk?M z?8>>Y69AM07*h1EBVQ8LW?noxfNUdUAc!rNzGDM%{=Usu?ttxtN#0e28`=z=z9R$t z4Ce+0I4N3cSOAxJsh~jObq*90;5`f;63BA=(XBnt$CCPsT< zTayp;MVp!!;h=_QPkoDI>oU#&hao6@68#qeqn^dRfM~YL09^v7Is9x3tD);{4L`_j zrJ(>q^DVPKO9k!(hM}jn8A-wdB-x(>sdS{?{dfoKJD6~#`hPq*l8gXA03hA}XZnA) zzB=^IKgM6#&ucvc->;t55SxdV;BS8rK-~>cxG0h>X|CbehO9}7EV-^^se-8Zs^)kS z2moAPGF>Er6;Zt|T7tXg@>737S>Lp3i<6SK;?<0)`N_!B>&^jA0Wf+1>^Z}9gXy+p zRrb6l@Z6tNyiw#b>uw0@4!=TEAVF)@(w;TyR;ej6*Nm*tF4mhnu5}DNAV7X))CU5) z&B^R`ie*5?%cx+Bj|8f&2)upRZyRN8)OqwJC$EhMixChYk$8|Ur5LE^MYC6Cwb88i zs~EWE$tR0rkL1ZUrKTJ`at}A3tS&5JHw<<_#`S>Ud&rg&Wo>64&-#t}&e4uptu9Q~ z%2M;O(WHzq_s#pxFy0BL2aI`5R4_2nN8G;l8wmoYaK1T?HJWPh3vsSuhR>t~HnUwN z<@q!4=P@d=d~S@&+dA$pJqvx@Ts#uUSAubgo-=?bQP4{KWFp~sqanmY3-2wZ&hck; zr-k8>TNBas;kY=-E?%ALp@KMbS~w*Ee#V}k#LY)C)XlH{O#1foyU$Onyt?LJycaAv zj%M4Ii`rCF(@2Vb?vm5JL}k@AH(d2Fe1UK9V$4v&y#gH(*)CIb`VJtU6knuxA{A=^ zI7-!BEWD^`hNYU8=~@cNs8q=UpNs9hAcuo3LLeh)7Q*$h5Gl8!ClPs^D_Os8>F8XuC!NT zDqRah3E`eJGl?S+xslXE{|}zDq^kv4AnI!@v%U5IcA#NQQ7 zHbDyp))_;z5u8WVz(9ar?+A)rzZxsgT5fF|PajEpwluD*8&4PH?HM}?{zjOk5SW!| z39`8Li>R?e#5Ohb8`oH^9b0o7V|sIDYGYx1dvR=H^XcBfdUV6O^DB&#k>Yu2e2hdWSyLiUqdRA()TcYVM#~YC+NymegUjzLyI$1WQ$96T$3c*R48`+Mj^u zG3R*oCWHmSj|;F$gP;j8bbyzz>UFEKjSj&%1cK`-)HJ{!M!*9!D*5@`IL_FrI6D-# zCLQLmqqb6PcGQjqEg=uaS*W>}&#e%A!6o4W5dAVF3_n4@+SEWHM%!7u1CMkM??-kc zZ=BFC*e9a_!gg~(^c@U6V$uy|(xOfy)z6e(>44}u!I^j-c)e4G3kZ^S8oE3%9F_Oq ze;@WOE(%OikUHfz4}=GG$e|Kx0vOz)Ifuqv$E?#4nD~*AXhF6pSFeE$qHW zBM4@Y&Ob5|n)GZCB#Z}iQ*^)SkTI?R7s!RvU1AR${)3j(8VaXpZr0hW->N{ejGALi zV4H9s;5b%qK!!V?0kCAo=kC0F=&zXf^7pykYd8TI-sos}V^*48ZPY#mi)$7<;qe;+vej-WY%`w#qn@B*-@W}|)pQ98mxuQEA1ej&K= z>{Vl6p@%_(xUUcBJ^?p`zoV{EuepjF+5M`t-wm3P;MRpF9cS-p_mG2rN9nc0X@F0P zP6KdybQ?-U&xR@BWA1p*g45t=4eVrFm6a-Hlmzj@&iEIh{4I3Va^Q3YoCy;Zv?L`r z-WpE_)z^h;xs+{7LrdtUZ7He-xT57MuB~Gev>i3h&qbK*tAJ;>kC0#y1mwF5QMlpf z!zgNNTP|q0?W5-8y$s%wI^aQ&3+GDlWVnT5xm9NLGP%3h@putW<6aIcBU>)%;iHv_ zu=ljUfMK~!7K$&MxT%npgZv-#C;`v;lmYdJ3A@A7wN;z(Goz8~HJo~}MqG@5@k|9Y z#?(LIKtaXXMre%DSh=QG4qyYsd+b;>=*DrDQZ5=tuMiCl>pf(aLW-QM~CTW`NH^p!usU)fJK1KA8@Gw?diz-K>y+T_W$KbQ%U zZKfqT4it5CUle3pGDPrFIgTKhj_Ui0;TeuJz3a0THc$iDigkHXM~3EX1K9MHq=WZG?bOTl5P8I2X0YvbY*XGZ{DpL zt^JjqxHP6a+4c#{LeOxNRR?{^P{#M>klQod+jG7Z;j#5dreqj5uyEl0l}F+<7H+N)rk&**!>I zTz=llNYL9jUfy#{hOTg8==!#mky&Sk8i;**?qv)@LCxzua9Q_<2UxrmV_%-GEUs;r?dp@N_C(*UtUQ|R zWAU1-tX1|kT`wEu$-|w+<(9uPTcOvVZ;SmeUaOcxBo&-i$zn1C+)kQ^XxetW4oYT<9Qrza>)50}jj7WiW00WVxf zmIncB{O}O0{2agDzI`?8q-+kdPO{sbxK0|nx%rL%Gku->{ngVJ2VeZfM6lB6j;$H8 z@2Q3b(5>d5x6*X4OdVl@4196(z!%vX%sqXq!RLb`+Oozhxjvc;rf*~~-uN?XqWiE;OH( zb5}hDId@qRRL4*d5=9ovF|0TzcBMJ@kVpX7014YjeB}=*vC9}=NQwI%O&-4IIr*s7 zV7d9!3mYUik4?1~ZFp=SB(M@Al7KvAMkBv+Lo+h6L9yb6E8`gpG;uZT zUH@-rM!^vURVLujx%q#zj@P>0`F~YIv42i>V@r-$$-`^jb?n}KWwvKh!`Ae(_~2C^A=Eob02cTW#FAnJ!s0Ep5=U2uKZ z1i^r7x}xr?wjm0N1dOa@*{*I&g6H|N0PMYEi>@guy6*^(yH*qzoK{vxr1Sc*54dYn zm6^t4uW@2qbMn&chFPwzG@<}}#y;@!08xe^q{j1O_5r1Nw6wJ7&&{r^A0IBZrdJyi zd&MWw4eQR8&7mx)j2fZVF(V*21PrNO_DYb4Lu}6@P!T@QwSCN_&<;IsFP~!yX7pde zFL4%UiKW62D|9Wljjov*Q56@fwemW;D_M=p;+Bw~NS&ArxAbywOV{H$N`n{S)k%&3 z;PZ3*|2O{EA^gdHUa1-QPlivAc*gRt!6J0)>tFl2X`8Bn0y$HcEML@hc~GU@j(t4K zSl+yh<&D=mKR?g7T18DXfm>L93-VUPhJK%Fq3<+uHW-8Ua>XX<Bf} z9T~|K#89#y%BaVRXr$^&Db7(UGe#A4z0ri^0p>YV5aSv|4CrJL-@)0*Lk5*i9c3vl zC|gT8f<_MFaG8P_p1MZ-IA#iB_lGkDF)T!Z)NZ?|?MqRx9jM;_nka~6umY4nWw3%9 z1}k7nR~;KD(84g_m|4rp&ul=FnOV~4Ec+J)jnt7qfP~mjBi}3kFXly2D*(vkI_CNL zf7ZI+{J)Wq|Cc}s5a#~{Ns;6W?fOn zYzDF!$Yvm$fs4$*Z&prEg4E$&kUB)>&@p^jRy^OA4cD}N$`2YMxVc0F|934-G{IWw zE0!x-lHjPCiwZ8)mTb|HU9BVJc>Pj`^Q{GQ^>A69@aqe@aqxKaA_ApOflM1|B4nZqj4bs~<&d#!k|V^LxS)-n3040Z+_ z2JQx;DnkKQ<1#gFV(+QRl7}xRd3ar(q~!D=dqz?mh+gaj-+Op^j1?d31U~?K4oflt z10tH5Ch7QFkTm7IB-3>%z@4Z*TCaI0lRNv{?#yv>a(3fHudhZ+`590_btlk^4*X3} zt|0bHCAbic4y$e{Lf%06E924y$tfDJa@k%%bM!zVb{@xK$4bICbG`?5Q{I7%`dGHq zP^>xXNkJnAhCl0m^1K9`Cp|va@I`!lOQ~=6^$4uhot5^2CNeF;+1*9?Of9n|^e^1}mGrNMs?bXYGnDT)wWA zyYs1VkA(Vvc0W>I-`oG!IsX5UG4xgge+}^Sef{)5CR0y*@3(&L;lnp5yR0adq1dt_ zTOb|x3{mj})i-=g(=Af~3Jk0zrl+`~;yRY5sT$;IG|-aEDj;K;2gDf2I6;dD9o(>D zZ1s~*7M=|^Y8GfTpAGMU^cQrR^dZuK!+4Gv-zL7nzR4+7mrgc{W7DgKzb01~mv_gd z-Q(lU32I%epvI4SVJDzdv0pfIC;JR9IG(y#cvrP;$ctE}ts^XBsS+~hklu|S%%pm) zw(}5OCq|22-9pW)L)*842sOenZAEKsU�zRejW~!HfR3Dq*c*TeFVtJ_u^yVQGX- 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 =?8fB85J0$-4|@Ty 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 z

      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

      COQ3C(xZnV$Z(#P! zp%&NGg`n3xcl+BL!=aCHAa~hGZ#8q5Js)>jwg=db9DEO?`SY;2QzUxzgnHf|+<4l+ zDT}1iAAKY60coOR*^;ZOre#WwtDNQodQp-}XYI;FO`WyYY7gfZ*B|PWd#m}|#Ky^f zck4Dbulu;|0==>U^8?|Y-d9YSMe7F8-KLj@(7A(dc6xlNC`Nf;N5ve}U_ zQ3FFH+cj>9Y;G-g&>>(4opGMHTgFjvz)*8h0ETXk#z@!=&k{o*DWjH=9z)Pqg6jJC zc3D;zR_hbWJDe>n;H zhaD$vQH02{L~7oxDSNkuFw8=2a~A-Cx0aEp$38JFuiB^}Z7php(91YzER4}abpk`) z%$bHHnFz}4JXmD35XCMB3*D)$-%USPe*5y%10IX?AG(1Ys{1+7*Kz=(b$ri~{C?S2 zi?t_YY5tb!2 z#qN*DKgCGd#J9l) zYC)$?MlrF>@$zni^7cvpM3O(SU;&{RY!pJcc7SinI%DS|Gx|~2T=s}k&P&Ks->nw_ zDn)IPoL@$@3T#cVoQ+b9PrV#ZiZFcQU5(Cpx_q>^q44hR;`W=}w)j;(!E5ner*Xof z98{tLMO!CY%7Jvyh@KbIVUGn|Ynn_L6h^G%GR8(MTyLFlYEUnje|s+odut7IJ3w55 zUjx0E(Ex;E6Y2gcF^g_NH7%7_(S`*)X5#Y&iFG(5QqupaTAsKmS`u7Rr@Q}I>t5ae z3W`t$I0{kvKh(9*|F4XyvZ5#h`2QtqRMU+vVj4|PUw_+Am(y7O|Ip75(SL*d{QKX0 z+T>onXP*qbdZvPOGH9ljDmh|Kvd<*v5eU6q2OAqDuvoi3b#HNge0llKVu#uqeRBrg zH3jL8LO~<=wYh`aD{KDvLSg3N!kyaG!zsDfN2*)W3k!Rd>Yceod3iN5N4DFMpNEu+!70i#GGe#scVz8E=xMRi zMQLMuUGL$sje4!FJ}~mj>g?3*=^1xrzvwS$(PQ^)g#}FDOC_G*c#Q;L8}*t13b1QK$>Tom*$!j#bH=9WRCn>xnryo-s0o6#NZ19!3hu?cpu z|6O@}W*-9=89>_8@^iZvT*i&u3)gYnB@JS<2)JC#-r+f{1CBz4g^(Pk71s3p>~1lU zqo?eHQNu-qQe>$V&f*iEPkh4jIL?`_c5>RtOLc@oLCrM$i`Vd>_@!mgbU!F#MKg5Z z;Y#!;+--qpzRMwshN;PB(Mc2?nIE5{w6Aoa)VI=4I#B5JDGi<%)ZI}7hfM6^32_0q zqvmA&|COOBtBdc5F*CHAhx; z#}vJsBb&M->xSprzAH(9ys=Tp&DB&UrLtWaZmSQ~MJ{Q8;L$A&)i+VlRI*UA+|W-g zXxd(2jtibHi&cW;D{qu?u*CW$q`6Y~QkW6SKfNd5`x^4az3A(f*6e#AsMf3HW?Gw@ zLZXAvgWYxy6~XGmiTx3$L}(Yh5H~Y;0F;(=c5|^VW;mBOUC9&WT$+nnSG&8I4M|!5 zPCD!Qz450<+{OG4zY@5ZeNQz_OOnaYY}$s@@Al7J%+4-+JsbuZ!Hh4Ri+KVeoK#;F zcusIX!F6Mow)|Zbb}f6z_9t$Kr=rKB-??hR2h23Q%1dw?Rd#I`;q~M};w|A$B0MZq zBO?@NTrVL#dv}MoDH6gnbwc6zDEy61ZsP(4^ivW5jMZCZn5~h3jqi8-CL5(31kT4J zu>r_G7Y#|Z?P2?KcPQYVCX=VRqeU=KVm34wN(l)LwMNiKIcN{N3wunsp%SCh^c)`( zL;rN64-o5;@1Z}z!Gv}MWUC)w9z_I^?Ba>>oWTr&=>(JH6WA%0T_OdmG0Ar*iM6V+rjmEAN*uAKLo4k`BGn^7|aOMjz)Ue!y63Whdb`iBmFk6Sn&gKsk z?O;q!Jk~ZkWs3fV>fKTZ{>$Z>P8}o>k$rNcG-Fd_5bJH<3rEO}AYcO#&o}kL<0*rmTP@?p$ zoL~~Xnma(sEoJmEDr)3(ta1$e@j2hh%kGxS@!XZHe#L*3$dqs`m#J~`(mEsgu zDUPmUfe1xk018PVN0A$d$)I}QTgmbbc=M-57ktF!?R5XYGOEkgCbUCOF<>+~CH?in{*U!*n5BEjSV!d!M}>jI3!}P8Uu`c3iUWdOIM|v?qsl_hS;vyMKpvhn4PB zGu^3nI=H?2G1R45>dwR6%uXoKwA-hnX)&oMEoLh#CFTS zNOd<4{Fctg-Q0uy?ToHwh#{(&O5M!W{Cr%^t;bDfe9DYZ1S+3md^!zivJY_wYTqfs zPNwO@@|%=w0>PqmM!6>JrcJ6z3Vp3s$qzx(KOxGX`?(mav!M?ZSE4@$jxu<0<(s}@ z08(kzPYeJ_1SdG;K<^VGIlAKiE2D7|^ej;WdYtaMrlH9;QfC~;$hkSgb3ENpJVn-hRWn3MR?S=v zVIKtPiPYm()VM5<_~mo*j>8^bEbKOc>T`hFtX1ZpO+uYH$oT~BHjLo#848yH>0?t0 z0MZ`e{$$p5l%<9HP~}(A6b|0Yvf9y%^6CXSXf-MTqnk|g(dc{}cESgP1rAY!*TBrd zhJ^e009N4u_J?i{=f%E8dL{J&&ur$9%p8(zdA(E)$>l^~bJvB<0tDLj1H4;4g;9_@ zu}jJflN6D$8HQtbr_``6EwC#<1qnzJF4l|r{NuMoibyFA*_!i>}-3fraWWp%}>tjrW5|+B& z)j|Q>1QwULX`{5vz_m`GG+xl<%ixotWgDZyxQd7Aa%byc?8Z2C8YA-??{!d_k8w3Q z$Ti`*a5Z`JwczgXDO-3aTVmmB;=KhX?^8N`e5^kXI$kIrAnb)#1qn(W6zX^(r#eb) zL$NH6N`Xiws)DGFD&(wPwS$CeVZov`F@37GW=aOeUej0m!N zZKD)yuFc@dH`(flLO1C~6g&tmxZN64z-7AIQym2^%cdpcUmcS_#qG&jqgm2XnOgN+ zQBl&ITT)}UrxBGsS4S01HAStpx0cY*l(Of@Vd@T&i0P@?`nzwYt37}3@zcM`)0Y3~ zn;{sn3&1SPGEswFkxZ1p>@#$@C3bM?g-csT-H@r8qO7i|^GB2QwQ6;(d_QNT8`d*0 z;tNY#hNhlstB*aW>ofI*`nq>lonK!sZ?EL1Yqf(%kD?dWp0+%I@p)+I3;%-Y|DUQ2 zz2)Jb>?fl@MuCh183i&5WE99KkWnC`!1+_)Kls|ye~;^4|Mi1F_d>xJUvymCF`-S% zs(&Vv{)?x3XF1sOcl5dqKze-@pHbr+BX7EI*k%Ndgwj$DX|e!yh`}4r|g36$1nElz}W@q z4yIl`OeeaS&LdNRIdyvANsHqX`=v)!?_grSTrIgP<;HlvJ{$4>4xu`U7?+wUFfhf> zCsUvoDdUW(0!&g!C2y80@O)AQKBB@1^OpAvgco?Jc??4s2*sTFS-eOVFY=Pci<}T{ z-~Dij!ziK{`*RGpzu*JEuh99_=kF(Uo*j|r8#~XHTom}#)n}JrSVghdA0CIrUfXK^omPC|MJe|BF$3ubd}6}|02dGxi--V3 ztwbKY@^uX?p2{PE=H0E1|nt)YR91>aBF%{=43@A@W&FeD?2$_3MBrr|LOJ zH&I{Hw!OZ~Z?*&oW_c$sW8MjZZ!f%l-D!!zNee0q8%{t)b={R&v9K06t$;=!tzuy( zXdS7b)j{y~xoRC5l=yca#~YY{q)ELCQQkLuD1O|RE)>*{J%c)gjDVd3UiJ#EU`&*1 zT}4jeLDojat^z|8X?f`Bco^7($T+DNeD;ZFI~)%Kmd33XDpaMAytUY$_nY-Rgb8Xu z$uy2H1R(a_XsjSZY66rU2|HxWhsl*j@cf*O%6r3Oiiq-Rojn)r!$Prv0*1InxQcCG z^Fd>;c1?hlseFJuq%g-O9K6~nB?jd(50WQt42K2isT>%46i_eNMP+B(ck48@)*0M6 z^xX#Y+V}yiF0X9EpA@sPQKPX~LA|V9UM|tKD6f_#q^jrktyBxnnwqAnq7BZJtyCQF1QE4*A8XLx{~ z&b?3?C5&C~SWe2Ks1lo601#TgVQxA(&2)MI0A#J>6?!rNpl0f!oE~SwsC+dKk4dAF zC|f$=0iuc$_66$D32>)e283i&5WE99K zkWnC`Kt_R&00n;Z)n~8pQ1c((4MNRbH7Dt!BN>|J13<<>5g^laJGgaC*fc)6 z7sg8^A5b_kDve#wSIgxhRLoKx0QNN$JJp0OXypL<4jOx?QG%{(0Hww@pYbX(}` zq!oYrEa9*+sY~hpg)BDe`NT$LD?9+H>b}BZyXf?Ev88LIc)E=BllA{sF8%h<>z~6v z+0TnWfe#)(dzGh4{f#R@x|9i##8zF$mQV`NH&s_wRFo?ek@VqtlA&rA@Sk(G2v9uB z)HT;pEJJr(QSp3H^+fvxOP6wd*~~eBfD&~_)iuM^6;JnIMH>J!XN#=3IOA>!>Zpd` zWYodpg}(V0xNgGeNjOI+y^Zg1fqx2b96>p%)_a(dv|23F`G|UnxIb=zbBn%-df|P( zN9P&8V*>@pO8$Pq-}j>dJ8uWRPZ&tu*1XTUh#4tQCS_=Ey^y3Z{X@+OQ%rT!Q&8vB zNy`aSq;4f)0k~uu>oe(R!f)rFeS*h6{N0@(tVnTH&ygI-va@-#Xh`z zu@7LbLdY>8(Yxhb4l+9jw`P!do?s(7Vhijt=7poebjS+@50wgcpl(ErG9l!1CK`9^ z6}*-^3#FY59W(P)(%N~+e3fO?%-f}Eqg043sMFUHkCQ8t6Plh3Iy7bV@#1d4^B)v_ZoIB z*$r4oZVMhg<{IH6-4K9vS3n#AECvAQ zr0xQcQWywOPBpMBuxSZ4Ty{kl(ErDoAgkX9JIHlvv%;fP)eoXD}{JR$+r9Sbb&HfktvF5GGpp>i$<``1*M`M(qCA3HTDGui-ImRI^N3Hv9MgqyC>E zT3xk&MUvJ(|Ci~q9x1#pn&A}UX%B|exug6-)wpXN_{ICRnXRVbEp5+|^^RATYcrf) zNwTGwXFNv%1~WTDwLL>Ld!Whk%=S*fD<0&Qie9Od-@p6F*n4m{qDjvo-y6fr1D#yp zoGd&4xu0F(;l+N_>4ki6R(Y@W{0grICs@l}y_{j}`CgV&j7=6b20x^8j17OK#_*W15!5{Rh#tg!CB~4|=;JYjqJ6`0*#6 zz0Q4ZfBLn+=cYO^>iD|qSUJg6CHYJRNiv_?%ja_&pri*P{DdXgnJc@96Je#Ug8IX- zaZ?@?s?kxcJE)>1)Xv-8;cbc(I!9J=3hHxhq>~A^aiNBe@(2_}e%w~Mj)RDOzvDOA zC@}d`gTzQ|0E+kHC66&=xkOG4+ugxm%>JD(myx}e3kOQfhWdhwP;jU<^Ba)890;VW zRu|>2B}b>}Awahb>pi>CN6uWy_t2l<;L&#kw+cJI3)=vyI^l`&oWTr&=>(JH6M+B2 zB~mc#sl2_L3xgI}V^Cw2=oP&Vt~b(Xi~t38Z=(WQ#dqcqmV$d2C8z>m0RfTB*jOsp z5!6^jVM5&R5ZUR$eI)IHEcAD`deN9d6cO3&dw54rQztl#q*L|n9lC*9?g6goW@Wcg16#me^X=mB7{HKx(jqsr(f3Sp0+#M{AS}0+y4&V+(I(YYD@am|pDeIs3lXQ3R-?pB;#uKLg z@uge0-hB7%cP&Kf>L`jRYN9M!qAH##^zX$>n7Us&D5|si-p>7%18u^6G*_&+UM1a& z@exXxLT!%!lj;AjzB=@&KgU1WPey@^0v|gH{Knj~H#pP(10g}q$?#RtaeT>^-JF>-UBy7IiI-DsOO-v#&Y^g&BzwL|vEnW9-Y*{0M~Ppxv6a`1 z$;t7F)t%My!P3s$$D<(Aix%vqYrOKraiEuq*)gJT1A3UsS&5cqUEt52 zy1|Fx|GoCV4dK7+C!;_{fs6tf1wLXF_?<62dy~f&{XL+dy+THPMN?eQ%)z{)z+qu% zvZ>j&=({My?Pxx-{7w95x|Rd>nP=*jZxw4@?{)SsqvzP~LZU00bu3u1h(qqsYTWuCND#2fK-dzSv0Ar^ZznSYSO- zHIX%2&Nr%YE6<1Vrcj3`k(yqX09zwe?50Ztu;x?MLT8u$F7ULg1-DRdvXCW&1o;T@ zLD&z#zyJvrN7P)FB!e}%ECB(WVreS4wXpB+0!R!BHCa-GB^wr=&QU4=9rsz6n7)D8 zvoM3mcm&N~gx!*7!pBQJ-~#c2 zr`;N?_8uV%mg+E#0`cYnep zluj+s3?xmt{|LE!UQFs-`(OpIu8slfFQ*f_JbP zyaQx4isD9z_%$Nhz^@U*6tH4^Cf2-BN>FK&m@R!F85^aL14kFBF{4X(#lVG)($|HF z2)BSDF#_C)Xc5r0U=bi>i$E#j*|kmgCOcV#>(O~3+!Q*dcM}VZpACE-H-&goVTe|8 z7(&=ODgR%$j7`}TfuYt@yoc3uyoX{Sn1cto#PJ@c5(az##9xvuWf1&-X%rzEUG;xM z)Yd=!&rZ?*Kk<);@L%?mQ6QthOGSY{_|~&ean0@@{dB0=*}m#ftd^V8CB?CQL$noD zlYP;1og5tZzGBF}V{5u^%24_wQ&QpM7Zp_o@U>xNnw_)j7XvsY#DSuw4o>SeRMv5k zop4ZvBEyu80B<09s#Dk~@O$Wr2&ve4+4^SRv_0BIW#%O6^TG$qhL;Grf}#bXj}Ds(3~|2!%gA& zMh|g&Nr2zGN?=L_)ImDswq2@zY=_?UAi<&t-I1lT2*pAz$X=l*jOj!~2~na5iVhRV z(_=GDkWUOf)AQ8IML*L7GfnX2(**lY2V!gmjG+o9z%;xLJ^?lfHSRk+vk1}H*n6~< z2}wTS3Y?Y18*L2LV$n^QWFwQN0prkR^aLd@=!utWi@OSLC+PZ!LoxU^#tf)SmZ-zh zb|mUj(a|HRjI?7J5Fgkd+wqMmQ-oNa2;E47U#Iq%2fK@@kik4S$BCXOnuZikqmwhS zK4sxO%m~VsaGBx3#q6wxYeh<73!kH9mh5KC;yPMkJ}RdR^wN;RM zL%4s56%Az69>eP-*gm%2SRfge8T(K}h7oJGNpB_Dts;z2ic)|l#Lke-L{m(&V=mW& zLWQk;(Oj0<*+)Z+0jaU$JQS{~Q85K-bd6Ana9Xx@MDG-nx{A5KhXqQF7)UmsTYLlB zCBH~c`Z_;_Tl;0ij+f?`(ESkJD1{W>WDQzJNeusnlbl{vQw)Lj523f1;>UiNIuU z$cs6({vYaG%ZP~ThSXr_`ugX8>16%?6PNyW1Gb6~fH5HZX5?#&$!*D5wDydDq3ljKp_7B0f@ zNmXH4xm0|EJUd<%cj4$!VSH-Y%&jQp`Ni$q@^-ViK0&Puw2P>h2)BlP;6*aK+D@~> zgehV136vcsbP_@myNJW2g+)iTle2|M8Kaq$!?FcxABvO{dK-xIf;TV1GY;%(|7rj$ zb?Zz}iO>i>)bbams%-kIg_1XEm%g zzKkGa>qGr%n?W>hf?l9^89G!!2YWr z96tLrmxq1}`2tKHa#hVmUR%zxJlECxf8j5fJe2v8>+l>iW6$~flKVLRv-fa;@8M!k zJ55&r`0~y70-#_54EC$lZ?OyX2MhZTHT7Eyh#rHrkKtR~nzDCm_*8%pfSR4RmVtJ` zKC!TcYNGw*A#bn z)quXW3;Yk397&F_Y8cDGYlx5;xKM&UG0cBBe*Ab8M8d(r(-5PBqm3>MQ>ktjD=80a zrYAq#7@n_fT`ho2`BHs0w`WhT&nl&foi%4|=Fa%|cywsBrG#z_-;3gnZm?LsEaI`x zh{rRPR;37)Uf$}=;*oscP$s6z(`$F{np#<@`*#ncx7u@B5368sF|lqif-``$fur5} z3U})x-t8;_Z@ovnvBw`M<_&kkoO3$ZfA>=oYoLFy|InP@68_c_|JE4*ml^@rJp`^Z z298mvpD4J{z#Yx9ZQ5rSU0N;Se4K0NP%J=Zk!N@{X{mrAx7Hs_Pd{oN&OXR%_m@`p zc5XWl4$VfiucMQqn`%mCMMQO@juNebL{*4^7YYx;J8Q83sRxiN!(&a2N{e)~6#BM#u$aFX$(+UK1=eV&0H1z)9O7tfjHz$Uy zrxplkI|X^{dUklTK>GebMpIu~aNPD(V1ONWCuqQU=O?`9l&bZHsivr{>In!R9|I@t zb9}^80ii>Ur%N7jNf-u%C?bT0rNxHz9vs$3bl7R(VXZM($xy4_nDBhluqWBi2`tSg1rN-fuE+Eiv8pD6v-MIK2Nn)MFl)m8!qR#!T=2 zw0X3(WX$aqX6M%y59X&1*6;4&#uN`+(sP@t9uK^E&PhG)#X)>_{n$`a>6_`t&qqJb zQce&F%QIEFN4uVX%E@W^bQa%_jGipM|M|uDpI|iTehyu*(I7m=Gck`c0eK!kCg#EA zewAYZgzKX}LrUsW?#qzE1f%n|q)=2_96GQZg$~g5^k6rJ|M%%jL-;TI$taLfAfrG= zfs6tf1u_a`6v!y>(Wk&as6Bg!XM6nfMv(2H$T^^#dWNQyVJ9SNSiA(_aE)Z#dUwYnadyQx0eoA^3fXTBQ83& z45R+vzh?FSE*%WL`hVb`?B{t=;8%B_{S}-#C{gok-w1%)fH!IAjw>pjFRGqspH^q{ zMJZ7;ca&eK8h5P&zj(hkv(+@brR`Z_Yu&k%I;sIgYC~lPZ@D266 z<^<&LYUH$3WBm)8>1NK~`~0)dkd!y^*?)kXUIu}$OQtU&p;r-ehAnx{Y5T2xe`Y|5 zFF8=+ht7$xy@7vH-UU?9uwAPafUZ`e8rQKe0a4Ml@-CPjqE~7HP*aHHJ%VwMj7*eE zfat16>=v+RY=@7Gj0qE*@9vj(8$}>>1K1IO`6a@+518`}ls5#HHwtO{49zjZapt*y zXvq2+1vIy?Qz{>fZIlE-0I#555`l~X74kUf?J>M?W^|3+_&C{qseA(`0iSL1wSb)m zb7s(EfR`H?nPjH~v40Ls6>u$nXwcQbzy4#46pdf2`xW}0exnKbUeiLn z9bZPtZ@hF-cT`<7OkMGG?}EIwJVGm!2LO^cs^N5D3uF_Iw#mPt)q~5tG5Zo%T5lcU z?;~*&-4MzTXf9C?amOLe!hU$K?}fDVYiPX{${d^Fn4R~J2$U9Fsgh%{t$lx<#Z&{Cu5_*DSN-x#j?dyPWX2dvdEfMerPK)nFCt?V##D>Q0-wmXNu+W>wr_0Rcj zrCCP>5px6y|KTYhVDrnKpJiExSAQ+uW3Go%5 zQE)V%QxE`kxf20UBEWyF z;NdZGR8vh&j+PPY3yUbso*y17HFkF&cM8S;2!JG=A{Z;{uUtmK7>|O4f{lj~KYgUp_yCjF2l$Pc>In`G+-xpm|Mi~=J zwsc2URLjw%oDSS$Pj_`g(k$6`eZvuL!}9GGquq<=nzbiag*LB9Nd1mGgE!2 zYqiLh-hq;lxn@}{0%%U>4nk$A>89z}H9K$46~^Zty6WBOrPawpeY18QrLQ9JF`#EHF66ui=zn z1wtMF+h+j>L=cQ_rf2cq81BQZep{P#^8WV9!Mmf3>Bl8>Ybx@g)f%0DQAlFbI?rQSpYr)+i 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

      l%JCpw(rO)dBFM4qH_xk^h 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

      LIlr zlERkI&A)~-ylcdfK2NtezW>FK-r#95Kbi^CVk}*Q`&4rURT3q8Xs;VP!LKDp`b|Ja&^ZS$+yw6MjQ2|Pc}1QmbTD5^5ISKTSF3 zw|v}c%||nNXrsS-z?zKJp^g5t5$G^#oeWzK9=8tdevZrJf$NL0`@xbsz#Nq37Vj<9 z3#F6Bw%WAjoZ}N`YpWcIdNjL#WO-kZ-JidFyI;%f{yO+cE2!IbXf+Q_hLH!DC!jfF zEb5#;9i(QDQJ>4l+&%=Xg_UxnXn7jTIxk_xIM%&nJ_oVHz<7%-!K(q|x-hf9`=Yrd zv;SpmV?$Z~sZSrj?*S}-kf5de`$n_;6`{MafzQ)zjqm@=M_&#s|CPY<&uf~aidM-I zUHSiK?@iz%%g*{xwWL-r>Sb)tcx=yjrs!$YGd(?;yD$B7+o_UNl54Y;Qb{Vek?&en zl4?;cDwT!_*nn+f8=J*84um0LF$5kwV#4+aB7r;zNeBsnYC-v5W592)%s{%Zex{IBml z#%ep(NzIiu9nQ zR3c_B+Jpjel46v0Kl^f^=Q;Asrn83VaSML~denPNg(9~IKUk8CWq)nIXI>2SzP%}5 z59o(D$Q*+~_@pdUpFe<<50ouw((4LLqRYyfuGnA)gBX*h34LV+UDndE!Hns1*4|aZ zfhOPbcMZ=uR|kNnqbcA$iU^~ucw7$Tr=6gX>n!mwQXt{F;ax*41Gx{%IV24xP{JNq za$v3_H!+%n2ffaBn;97F0JO46G2IajP;lx%$sjxy17mpe2uw!Wrdfcw1LKtBc_MKX zMh*Xit5%7Ao>{DsAOgvI6j98CY0@sPt1<yfOPf;8DiM|bdPc{_W zbe>29oJzV^oB1RFm{SEmpc}PkGxls(#3~mA(tCoYbf-A_gqM&W!9TjW1o-6Lf=F5~ zda@qLA3?S;X}*{%&=fX=WiUw)8S;?A0tw!cCe8-HPdR5I?>ktARW4Ql=z*vv%DBJ; zkOu)Q#?Eacn+}_0h8*wpWHx9a6AoL0B%F;>7rMcA9uCU02xsc#GazFi5Fn{0@Q;V& z+4~U$NPSG63CC{_^_h>g2uz(?s?U(39DboYN*XkGloh{pCXnz3%ugrE%2$f;WT%@+oX+2qQ93M3quR_+;?n|%CHj5^8KZm2#T z4v9{_P!BGK7AM1n)O^dRbAbJ<8=;H>bKmdLMv*ce;NeF5KgRJ!+drxYT$8hUN8Evj zToyiFF zOYigOLmx+i>g<02VzVFLxZSO%^PJk5Jl3t`yC*H*0cySz(DNOp=sO9cIz4cY0{h29nozr++x^^sT!j zNhkParFuHVln=OVb`#xy73)%B`S*PPp6}oDahE*SJs)?$CJtRMKw|%s?*Vznypd&~ zV|nBZr226@a;VgB(mpx5+&>zJln=iD6Z`+j(4P%m`un46_~#A(^U;mHx4^7;`K2d6 z@mw>TJ*PP)kQZdZkabS85A#7sa9$Jd4%DpDxfvJn^ zcqppcaA^5T23n|QaJ26z-Qy_D@JVZBsOu=qSAPUBs`pFfLMvO6>qav(h1gEPsw^(% zcBb0iA4C~MCXd|`I*2}}ELwAgWTc|+W^(iOYGtJ^2bWrxm?JBZZV*4s07)YcYirrc zRUlImBW91aAdL3&1TDdZT_}r$htcB%`*EccFj*>e-o6rvM#P1X8Hwa=& zpAc0pJ(e8IUOuz1_hx3r|E~9X+f7pi$x?XN5JiQz^!tl9@gcSzJuANNp-f-}5A+Bf z7??cRHT2{HEsiA*4Rj7YjyxpYmxprK5lO^lCMkPHlx9RQczf%A4b>!I|jk z6>@+>ms!m@^fwlr`^q)jsaWM)iFo*va8uamdfa7zTIo5`*b{B3oS1?O8FI7`&?g)( z7p(l?7p3lKy#Q}Nk$_vDhT&#OX2f2Wg(Gfc*(*1S3 zlqoCW)OYJz+1aYWYK;_rA7EL}K|POBMUy5AM5FF+o8ECO7_X`Al-VIm9gaa54bChl zUxF3@iechEWErI@PGR~0i)?__769Tld|pVd8`~(uL|vmaS|)y z8j^rZl7Pi_h}Dv|Zm&rTen|MORzbpevK(n5$d-jt;?$-b)GFhF<;g(HxCxo(b?II} z%cvOA$2E|QPE8Mw4wfpu|Gj%}B2vZ7v%hlLi((a3U z{|VyoW>mxPUx){j$?1iCQhuxEz|XAgJ>gxjqTU5d5gk)k3`^q;o3~x_zCir^3)Z7|!SbP>Xfo`3yJ7Xh z?wmM&-LbA$1A%vrb-lVT=qCuBZ4IPd@3SFaWkB+Pe_uO9^M^%&HBWL_8w=~tZ#e2cg>PqOVl;nw1Mi) z>w@Bny6$MM;wZ?MAWDMl5*Jp77Z58d8ZfCyF0bjbfDmsJ;hj7P}h-Kj@U_n-OCAu;x>+#v0sc=@Tti*!J zLK_pO=bCl*THMKQWxG+B@cucVp?0bSe98a*< zdkNuu>SLm#8>YW9O+5&cgWmr~|L>toAID$*k52)g0zL)a&=mOeoA;h%Qtfw$ckWzx z)8#kmhN!|z%2h0ZQx!wxHJ4WfO*KqaH!WK;6isz)&fy_|BQb^`>z1O4nk|{KYyt8_ zJ>^pEdSN-ySkJ0+wWZmOP*GfpOz#L~U#dL{?ppI|NRij>7Cr`Ea(98Z9gB$7Sg zut*7WS~MdK!w9NTGoCUFOQqG!?sjX!dZgMLv0@GWLqy0ljSX0rVSwH6FcFME#(=q$ z*qkQ1o`J&n8K=VbIs2Qc~BF5xVkr0Sj(8)mG+nVlslGYEJY+qV`IMTYm zH^^e{*?uRoHwN89ulC11c~U6PsTx)AFSxpU-;7m#D)X&*ogyMs6F`_R;D#333fE(%whI0LcY| zz|q|blr|lMU_KQ$x0%lKkFYxiWH+`4L&TXg6>&RsxuB+!@5 z8@eU|vGV%$gMGXdU0p-^b61m&;^T$ZNA>Zd4qUxHUK+j_ab4GLa}%nlNt}q^89iuR z4v5w?F*HfPAOBCA=pX&BPXK~HJ^aT9-~Wft4h@a}1^)7Xd$Jos6V)(dsF_sGT zYsXltbz)3{OKrYpWy!zjBCv^Zv9F`9y8!@KRSVGJ*0V&U$CxSsiF+6GfhBtHN|m%G z9h?+~R{^#L%yyNuZv4?zzAsNr=PW4oo(Ej%i2KdAT(km_QP;M`p>f z5$lUjV>5R1X3v}vqa2xtn>RhrXC#dC=IG{4%+gDpvxF2+O)WCb`;%n3k=m;UFC}S# z@DAiafG)Q}C;ATDtTEqr@7`*r1nO8dR1J;eqtN;`q4(S95~c3TY@%84av;d5dpaN^Z&TPCGWnPzk6r2=J6k^OLAQS=qa`D&0Cufo4%ny(>Dedr46)xj zA-$8Kdjo#4Ip8}1{pcf?ZwJ~*(6Fu%g<8oHrsa*z`vh9iWC9)oxOuaK1++hqtbDK? zvPVirgMBQ_LGZaJyZ7czg?m@;jIj4Mzo#{Nwu}&=&fzO%>9E=8NB{x`m2*jcGZ4G! z=ufy_twP4Y@bus_M9eFLOxgx7$)+soFxRM(DQc$5D=ODE$h0v3jsgES5PgwSZ;h}9 zlGPV%0;x^do?dft63{HYlyMMVfI31dR!Dip8a-j~Agb`^IS?Pf1U=jf72a#w&k&~8 z$`?%Ee$#uZ`@PM6Cp-2#%IGkVj+nBHRzKa{-=r(Mcd+dadlq`&`SwPp-I8~_K;PAF zxkd^xa3SFJ?v0_@EBk!X2qo;Jy(h>&B)1Cf`b7+_r_**1?Va#^&$`E|Z>?}|D_~8N zF;K|6$!(;|-0Mj*tM5SlH$EadR+~rY-}}rN{m+N=^GeKf&{=&XM1bZ~vFI{!uq@ zDM*ig&B6Eo;j`aAH2$6V%m48y;8Vb-fKP!_MuAV1_uk386uzzEc_|JWn4Imn!DxDyxZ{ z9$hLKsg0fbhCQe3wlw~}mjc3J%H2qI^&BqJ1?ZZZ7KszWEKudav50NJV>`Bx+fL3G zjD)If*XqfzS#C5oS`*gmr4Vy=atslGNOf=+h5Km{uM zO(66ZH`kiBh2;C+AKRB1gcROKQjnIxgT%@-<73E6AxL5K&@?b~B$8z5vJH4$*R>_r zu}s|+1h>7vyc|SpEN2hY-Zp){faE(Y3RfwI;wdVZetx4VUGano6|b0qN(4A@QcL+jC(0s`K~^zB_uUqI+l zSMbZ1F&&y(Ly~CrNQX3rOpftH4%MsoqH<%!~d8%f3@C*Gg5#Znd%R+-Qd`1vv3G zk3Zampo?q3iZ(><2IjooBH3;s@cWq?eNstB2g^^N3+z3^9EE=H1D^aOyYMXF1qXLz z8Cw~*z#3I#Ve8wFzA2Qpr9(T-d?Cffs}3^b6;jJVpD4eC)}E!IhPGx8kaW^lK8Kl2CjeBU876}oz7 z9aF5kL7nV-FNM#83y^CdVJP)!A{SiPONb$zdE~SAn8>h3hC*LLjH%$&LUYWf(?Alr zK0{@|d6hbdv45yV;<7`@Qg(=w74br;5=oPs1Js|V!TC z^hx_p;u8n1W*@}!**9bQX3R&+j2UyPaL{SGyJ7v?#X6EU5)U>LUV`|Sy0!5WggKC< z&h{)3zitH>hXV6qJ~?#jwi!(?f4N%_TD^EIhIK<25a|P(vxi-DzwmYd0n~v&fJ8~- zpSyS6vSGb~7ry$6K-`ve;=xAU-q@yv{j}XW*oqjh*5Sy9@q1C&)U5()H&5y#ucRMB z+!R~vGgko_+MSV)e385l9wX{OZw-N~)twvgeyRe!9|Q!GX~(X2QK9u>kNMraIf(t; zyh%Vv(No?*W{?&GBHXL>$jzJh#4?-)n{HRVpV>SZ;8+FT4A-T*1rae&mjMkZH&n%ksTLGKGnt!@8E2uir~-LtxnEFW>8zNu~F2`4vJ5jz~sCc<-7 zA+l_3nG5O+9z3Q>?(VgtoRCxrcOqxxi5!y6qslub`yZ4&M`hPD_kUP+b+_-hJm}qz z&XGxH{oW7FE)sPen>`2TKx#n~a_H%aLE`)jbZA{X)g1Q1jhs#NFb62-NF%aiNV7ib zIob!&&!PU68|1hq4LdY&Ohb2witac%x}z!S`fKTK5P%?$^%#{3mH3DPsz+T!oy4m~ zzSKtt#L?pm&kQm*#4DNSbI=|sQaWDHGO1uRTAdZF7e-*^oA5-CL(oK4F&Q$HLtwJ%XUS`yXa@o-0xVsHgK z5gEq6=ll2kUJc9wjU6B&RJbQGG-gG#nT_by@|OV}QkJ2r)X{2!kJj}QeuHoSL@xp#bm z_uM;>lUNW$7v5t)-IoB;cFYXLr_8-Wuq4GY70GmDUJ_hO7kR}rz-JF+!nq#zj$N9% zc8$f6DkP;n$#m=ePQo+W4el25BuB1S*U|7r7?-pd`(kB`(RuxNL28< zU-m*gNvJ2BB;G>{$p1W8KMTO4tjVTr$l@SB3sLO@CxzRiB+Kde;4|b?^}VlPeimQ2 z;Q3hyBFUa;YdkLtqRgwu-G#oN1<8%^2q(Wd1zD1PzX9KG;MDsK^mFNa1Ww6=?59Xl zzov1DA`)EmL+z(%jb@z|&%yRnaew$U&|g~c>AJ4zoZQ{nt4D!PACNp9C!eTF>5)Gj zeDr;vycZxx-^{bW)My6gNe*W@hHNROs1TRo`*ATmeSvu~A+{aco~`B7WxYCA4`oa8 z{1kz)9iW5v;e#Ixd@xb!>&g*~CYn-Cg|7V zhssjAV5}_aGv)b}bjX)1keb~zEv+r=1hIvQ{X>2%N;=m&JqggzlZphH!|_w57(_3l98`c6O( z#|h~5=7EPgwUBgtaANav%|Xx8ibSqlyN$|rI+kp-?@4foLzV?4&r0EwtOUef;u*m)Y+{lNAMm~J??3Jf3{lfY3_z#W# z<^vFbKc0JSb4(xl%qx1n5ucSBwftn%nzBOH-0W<0YR781m5>t>1R&1ru)(!lN>S7z zaBGcr`H|BgD-!VIp^Gj0Az;=vO_I$V!AmcBD896aV!?a;u(x2fUhf137XsJu9Cb*)c{2uQ z8311H8&?4W=BzyA4m#F1Uz@1b4Z}L#b zz}j%y09b+uAkop$ubL(Z?CdS{0SKYq=Zgn_e#bKeCHXq(70%Wa7G3nd9{$}oZ!YFZ zOzly>9=##sedvie~81l7jF4|w)(YF1yJpI}xEt3?nxjok% zk9Z&3K~nEyDd2Uz4Q$Gi+_TWJLhU2-uQ}KkUmw-`OEs;1!90K4JEQe`*S27hLzHJT zZ)ZGk1eSfEHvtoHDEDVa!x7+%g~J$}r}3v9f}`P}X-ebl=wWJo#1H06U;}N&*2WEh zICJgQ#O_Ki7*1+#N-V|~)K{vMWp5JGrUF$oz_uT3VLY z1+hicdtf$|;^sD+!e$nO&cIH(x#946^X3wwt&tn8i4|XVHjOGUZ7bPasdD?~O>c9C ziUr`7k+4W!1l|v_sgaF}FvIr#O_Hc?{JDEgMoeFYg5e@;w3QEn;GA_oNf<%Mu{Ih3 z#GQfe@`%xOVSYV-utq{>bK-dA>ld*+(k$y(2>ZL%a zXd=Xwe2<8%=Oh&Z{x^TX5Gh7?`>E>z5ksU@L|`kJ1f{lHEPG>ro(>Lijoo8@p-EBJ z9!#e_L_CRzawLbdSs%1>%7G?Zxg_WS_VwEA^!)_61UonjxD(dLEre0#5u!nUZ4I~s z*&bd*Rt*zQ77EDC0PUNRmn{nwTl|N`VLC`P30Ox3%oM?B!5kqw0i1w#nzy=+D&pXC?7hiP2#PvrZ+=vMEr-4N$+sXE zkK{=4l%3m3&ZM3CO4ga1cB}WcH<$AL(#OcyqS$CWbWMjb_Nf1gKBM5K!?-u6MMS zHp|t}iY-3g3U?)0bro5#Ok0!;!_WoSmWlEBSSy@m&;+0bnxo+2~1`8aev&yo}b_}aUfliuVsk@HLs_4$~(bQrd(Ls z78h$VHIx7>R;oppmc-=UEn2@HLxLjEVIt?Kk}imnE$fH59IvFjKm69#G9!rR7DL^28HyorG z3IM}_t*3CV0DcAZg}PI|-Cje2@apyZUO~i(Q5m#?K3spzB|Ga$-CfCr7c0hspl*bf z`lLE*<|4^^{8C&l+Xxs(fqdxrWU_5ow8#B#9_lDC=+iG=X$%!czBqj4gI9uA16N0{ zu3Y`$tABKE?cC(($Ijgtee&G+*nb}T^|7BE`;M`%8MDS_#$Fu#p0TTE|NQK~Is3ny zeeLYmoz0w$o_+c3TSoue=x<%Qe&zh-|8)7+F8}!DZ@>K2mp^oQYIN`N^OrAO`m;;_ z`qEEb`pzr=?9$g>vM7vukS{Ab6%d;IH1-#?xm`GxV=I5+SxZs_xy8LtLM+1`_obJ+`l;YrE{M@_sa0M3~vvo zudWRL2>ZX`_Y7Yf9y{|N&;06{zjx+yXLiqg6}~%gCUoX2ul(4R&t7Q|T6AeZo_cCT zA6}kokO2_0l<37ndia^A$}_2hGO3m5JNwl5_40v@R0QN{!-fcs(2~B&VISK5w|OGrvvi zW|!70YF$XrOS86YRZ`_pA`w3K_gLM6728@bL}XEploq1yx{_0uE^4eUI<@62Z|tmE z>r+d+xpXyna>u#)SG2CL)#>W*(Yl4{4KWnmo@vaj)*3tW>Pj&^xAjk8S`g_-3gYj$=!xsuzOUu;O}tqU%zvut5~T8XC> zVLcKmEZfofOlGwS|IKDeO!-+3CrpR5844 z2ODE6tghIQmGJhgv)!mfR(7NA#(FhAa+%iU^u|V6ayB;Rle>#^bu&>&g|$o9X)LiB)|%EN1fCg>-OQo?IXQ16G%eMdoLNJB?hq zp~kl4<&C5|b>Wv--E2rU8YRO{2E_&#lDKNG&tADe>l`^1OipQLJ--kShte~}jlysimWnuGRmuSAV|x5UtWHU}!D=B=tJ`Kav7HdK^;~X@&4al;)d))S zQd~{uW`u0XD&*#uF8(Hc&RkweBxkhTN-1b9m*t3^EQsY1HWqVP$wxz5Cf-!pX=vI? zaCati{`cu~MlG`)+bCPwN<1Cjs83~*v(uHcW2~++*RTpx;#65#p3Ik(OnG-Ma^=Ic zE?rr5r{+yNz8aZ~MWy9jGGjWIe~Q(W^M&2zTu!Se#NxD;FQ;TTarQl|&RWrOJN1=J zA{LINwu-x%>7~`PyR>dq7K275x||9nRwHIOtw+U3Z2W6zU8?TP6x3yVMsQ{~mbUc# zLr)a*)r_jI=5x_lB5~ngk>^s#YA`3L2_v|)VOpW7_@phClV>Ph zQdVra7)`{M=4a|Vk)>EYRSxDCFMNhRXHKVsWyzRTS9ipGIV&v6!lW~tWp#=bDa3;F zq2&5}te^_((OF@2^uN(MBf4GNa`i;P+6{_{Y-v8EI+^h^v@Tt%XLpmXx|^DHEh}F# zLX}D7+-+L7TFh2lJ%_8=mJwXo4M%1d-O9-Ku{y!XG^P|#bb6){4(7A-yYcKLdibSM z^{layly;KSYB4$)T}Zj{6?ycX^tq)iAs=+ME0Jt1nN>oCjhWrj!UciWEpE>l<%FG$ zhUbO)N-QjubKA`?P4&&GqZ$Qrxxdmb5qr%HW^zK%2ju9 zHMv~Xzk)utU}(D3n90`Tf@ICl*c*BlfdT}*sh9YihtFfSJ%SvwX4CQpGczSMDj3+0jjj3#AIX}6ruP2N#MzMHQ zthk{HA`<+LTjRRp(?O z8{J9BF>zLnj(?8UMV8C8*;;h5Qdpc%?}{72N@}h&M!9urHo7~tUCX3b;!0T1q^0Dn zwXrhF#yL~7jO@%zN?Zc>i*09IXIV5xf0Xt)BPLeFoNBC;inU^WMk+3$+mQmTn@*Oa zW;wVWsjN)xYzv9m!gg(8e38~oB`W#&cA}yiyQ!^(T{$NvQn`zFX&n}Erm$Qwax1~I z;w0y5>8b3>*mHFH^i(*yBbW;-5uE*YZgny-Ik)lG>0|nm9G=gmBDJNRMRmrWQ*rlk z&r&9s(&MT=UtgJNnA1Ysnb#&Kv-9)kzJWbAJ-HqZuO^j5Fg96}ZhG_%ty4oK zw`NW5nCYdOtILoEWmg=ZrFC*+YR3-E=2pW?xiC(*a%6f=yG$jQlvG{PH@2eN#&WP2 zPs#Pda?DI!WF(VZZ9bce26tvMrG;`NqRrLv+e80__9?9xi{b5QLk3&g2vz0P@N~R5 z%BEJ-g45!x-N0LMyGvgHyqxs zr4S-1cs1c4;TAY)7lRIG&@B%M|l0 zI~=x`c3n3dm%~d!C>~D=O18048-F`{Za$fCGNQb@>*VEX+R3a7vFsRQ^4q}$tF;Ukqo>i|gz;Sx_2=rOt{aGrQz$n9DOc^-Pi0)e2QDL)O~*oK{{+6n3KX z;rZcTq;=H|XK{Ng4gn?-i_O^OOkzXKU-(H@x4t_QwSuCh*9tK`Us9cD&N#or>e51P zOKQyKon+Ni#ELOfOU<1BRa#e$8o{bCX~lxZ)KsVxPHl*V`Qe{ub)mcy-YV+FMm8jb zCu>C~>xRbIb6ZZ(FlHAw7Bj0#Hl0;=B4#pp?oIT$Ev1l*?oK;}dOfjPPng+y#@#)4 zjnVJcTq-EcOk zD^ejjACjU*u^y+7&1b`EHYEfjx>YM@bXl1Vh8D)@+FeTQ=!va$RW;-K+)7o8E4y=B zbC;_0xt;2^9xm5|+m@|Q7vsfvNZg7(#@22lpEgTzGZ#{golxAFaaWVp^p!Ya1xu;K z)>LM79v|}un z*Q3dut-1ASw^G0Sd-Sl>kE_nbrOQt9H(bQn6~%F=w$EXRdK z*EGz_>_A-(Swea}l&#n6CbTcbti0=(mp56T%Sw5AV?&83Q}a9N#%jafu4l&Ck+V>W z7eY?h$Vy^zJ)J8}Zzrq5Wm>nCa(8p}{Pcpel`Q0|TdPtgJy{!ln%e(|H;0Bdul&&E zAGmbk;*VYU!1>6T&9i^ebp!tL`{f&#slURvET5de!iT^5wF*%)eFZEZrJ3p2j%pmlw0s$k2ic)n0{_iYc#~7Jy6{juiotA->D#aNlY+aRQmh z2I-nUk)|a5+y_sNq%aM4g7Ek*AjH~wkUzwJ?~ImnhVKHB?es2rcrGAK_Z;R{Qg9ps z(@ub*Yk3%%GJ#r&Zc%Y22y7(leP8lQ@Rf%WMv@ zgR2~8a>#PxTC#)O*g*FXMcq8i^3rPuXQWzd`9L90dx3sfyNKXnbTtFgB5^uux9F+` ztq3s2-2$DTHC6}eb~n07vZk;WY=-W@1PgDhW~Vm;aHU}N^kwLv>!mjXJb4E*Fw%Bt z(e=g`yQ<=`QCIAS z6b!H2+vzrC6mrgH0EQx%bvsWtUgB8#fH;yEzyJ?Z^|E8b?G3+RaosHt^9!6lS{5bZ z_R_XXN+)8M6ekpQuw8QDwJi|j>*Km0%+G2&(!zRdb}L+1n5ybC`BI}rkd__te(aL> zWJA9fyQKEOt&-w|CJnUJeI)r>iBNT3pNiV`ji@=TYvI`R#>|4P zgX0xJ(j`F`G~N^s<2m<2RV?R+Kv!8GXzl&Fr(P?9uHUexLjk*>tRO|sY$}}I$qRGB z;zm8)qU#Z@y&aB-I0Znm4lhJbw*`*ZRU0;R(dIM`Y=tCIKhTEW%gL=`spOQ`Hl0ES zsP^!sAzm1pNJ5me+J)VX;QVyAU==G>>e>N+Lx{h30#cK$k{bMutV*3dzZmH5^#vRc z-F_PA7%Qg>oh~pNRx(Q>#T-1dcmB)W!cA z;gR%6>2L=0@~n0z)%5bFLM~}%PVHi-qH+>`9>Rpo4Rq>+r)-|={HVUXwPa?Tg_u+? zMe~VTBpXVHb|WnkoCH4=WZjk>ThlGgmIT?*6j4<8!`A4%?0gY;TnB~%+^>^|Fd>Np z?_?K;e{1NoXPh&au3h;Xmw$2m$44{c-!=a6@$&fHt6x2`HoSbv9uAKF#&~#~yObDz z$NA~;(To4r*)tda?Z_Wq{6`mm_~Pd-edelr@oPtZ^6JlB`R`Z0>eA0%T)+CSFF$@U zdHK(V^B3Q9@%f8y9=&?@cdiH*{%ZKe3x9m&>8n3*Id%Ew<^O$j{_5=uzjo>W9eeh| z&s_Rf7ryt*7l;4LCGEmDo%!|4-+uM_g`ErL+2W<$t8?eye*WbPvC+Mecb;*s{J{lf z{P%{x?n2=Y_iskdUHR^F|8V#V=YHtiXD|QAxvx2wJGVIUiF0?(zI5)!xi^h|>)8Jo z`*&x5>C&H!{fn`m9{Zk4m&QIdRv$CY{@7Ub%1?~Rmp9M+gERkO_=(|ve5E@4qa)%- zZT!Eslp#-yyfm!p$hjwztb4j6sXG7EkI_;?J!(4zhm7KAn&ujc`Pd43+Qtd!N<0#L zbGEBJ@hp3jYRIZAiki$rxuw4Ot7)leIY|8NxV&y!oW;F4!rJP*fkH)hx->ZB2kR23gpo$Fj84 z;IQ4`>FQdh>gd+hSyt+}rVN)j*>E^lx8HJ&mRk5K1DS6DjOQ4p{FZNErJQKGyy5bi zW+SXx6%^#@5INbo z@`J3cW2m|$;(6JST=&Y~VQ=GkL}9Cjpu(@nG0!|V^0&#`99||6p~xD^fk3ethJmGpfZax@}mZB5<7S$}c=Y+nTUVA$2<^tAYWI;Nx!@`Agcb zZ9!=y^7tB4GarAAw$+fm(zKD+U6BDZ!@uP}&{D%R1>NR!&XrtMHQw?!SXV z{vgJn@`i;kF?mUoT-$o=uV`CS1Y8}5-UW$w1^2PfkNzoXE2x?(IHDz}4hZ=89riZI zz>07T(c~nFQ=a@jTB>oHWvQksD7p$yy(ho(?31Jikz@NrGZaCyF8+7cR>YmsaUkv4 zvh27|if6xpw#7`SqN4DI4vFQRXT6behUMtCX!9yI!IO{CQUi-x(DA!&YA&xld6|{U zqU&m$gF-UC5ap*-sB9C%+T3iWu@Sau8gGvJ-;bSXX0L|$b)ZyMgsgOt+Ri~N;O9V zg$Y9t!C6PxSD1PWUFj4+O9@|*_FX=n~P zMzrAx)|LZKFt(rqg@+^v7hw@ZIm38np>=;?GRISE3kiiIn!X*P3RyD1mkFrt;t3bD84YP-X>l|bD2(*wK za6c8yT``0qHZYtYfb_!R$7Z%vVRVi4z$xIr;IozhrmbI8XsK=^LW9?lV^p>!(;myP zQq#pX2S<}`;ybwU=e<%(6f``bKx;19L;s$YYP^n@IWE?_$;lW02`j}x<8roO3MP2H zHpG@Bwx%s%7%p}jrvBVGYbzO`4z`;jiP+&|zsyQ`8)qr#1y04=(g+h&be@xR9GKuo zri8YCpSIO7i(t_fL=Ya6H2!{8YT<-5Wl_UNa<)4BRbHvCo8V0-F&s-9|8rJqx(N_EFkWD6UJw=_!`VM`qh3vvcecsdZ=%!}X0+9KM;7B$z!Ca@G~blxk) zELa$+Vd;)wjr}#RQ~>u?Ai?k=5;u>sO{j^QsqmI1sT^#t()e}O7JD13&%}YqL6W-2 zs16<`X{ux33k};)M;YV7Mp1b|H*qadOpY7<4b}trCe8~1Iij(T?Tf$VmEvU*_AE9S z@A4PeA+4H@4xX$if`a4IxRj)ARm0U?WS<7Z2Y(kwe#a|ScrYgjHV`gs_0r#DrMj(R zK1|$2OvToQ*pa2;HDH@yw-Cit?aIHTZ4I1ns>$m*_%+X|PqTy9;1F72o0l7NG51er*%&k%h|0LKg9U>RpZV*w6gPMW z`LjV}>?O&4iZNvkVkA;&gWH0dhV>K^K#)3HlHpCLN#GiS^3(?F!IE?lN4G3Ns1>Al zhH0s$C^D~eV4(&Wi29UHOL49kwu3VkQi1N8PkFP6_lTN^b6e8|S$%5Q8=1u08iJ-2 zH0Jnscx+vUWnTe*SxGT4E>+Q8?wKjp1CQN+ zGfx7QbX|Fd?O2_|35lfu(io!cyz?hm4@j2oXb`z&-qlR&ogOdIOnkJ9W81`0B)#)T zXj^huk#RKM@v*DlLMTa&QizTO{2N!5fWW@OH6`pma`u_3U-g4n$=lz?jn8 z|CF``VMH6e0HUqo$U=aL52__XxWX}s0}I!vw?B*958GjO1{ztJ5xV*1|+z%{lZp z0)IkYWIGkBoGTG99Jp^16Lbf91X~B|IfE|0YSO>o+&@xqwfsBs4yj&}Eyp&<&00RYp zWDNhx1`ZOC$nYtko=2&ox$an1GPLdyOz${wxFz@sj+e@%)Tm|&&b1ppWt=Mf954_D3&orT$?w(X0I0_vXkT{na0~|OEP+W27%uUWAPw1^VAduW zCJbW-*<#MZv=(Zcn}kYj5T{qJ_~%G=T+LlkqWs7Yn#4 z_^nn!sx9(C)M;g{S_GsE_JGPs&97~h@j6@3*KTtYvdlv_)!kVaO&OKjV@`77Z61GU zh<{)7KTQ_W!?zB`{~JCV8X8aGFaO79EY73tnsKOmMv*@tBD=y!a{q7V3^~?3C zm10fZ4eE(-T+D?d>*3heVEAo61<(Ua0R-Qufso#}uEi^v=X3U*8LkaKnNFLD4Lhv&ABSoC46qL0E*`OMvnk z5LhWto>_$MtqU!0(Syj#7V8Wkl0~T51dk9M(15lUVjYcFdoM;z^eA_393Q_QBGN&$ z^5M@P4*dD4U0T-$plV~$43MkU15mZU@hkVt${aSGLmvQye@1ZSob03xfD4BVPuxwZi~Q{0|uDYnXwZy-qUBJYBoL*^3VHr59o4A3(%I+(tZG!&^wnqp;5jhFX zh|&+dcA3I-GC1GnwfGj{%arflI{b!wKP;7#C*Xx}!104?e$68K410~L0{UwS*fl)j zq!PhhDV1AYiUB0Kkxsc&A>5=r?Ewus!NP5-3R=svKVV<$Xd}9Oauaj0%~p$ z#lnr-fg4FswMoLm>E^{gG+{2GiEH8Y(In37m}-I7<3&xy$ejeR*@3o7u#pM4^_?5- z>wFvA`k>T)`_cdDOh^Oxl#+hpTMoJZ5B=8A*U&3exVtz3lCU0eL1`W?-~yNi|{LhgD|`?;5urc+Mg`na zk{KvlXcv(ZXa$X20sOmF-1*!~$Pm%N<5xyed=5BKhuJAP{#IT#G?K_OC<;WlU1W3NoZd?##dR={j?72rZw zs&|smH`Cv6jzV=_D^(r4)du&Z{hS!U!>Ycfy6{jJZ(tF%TQpU#XunSfd8JwY69*zK>0z>^``Z zCpsb*i)Y(zh26EZ_}A_hR$-MO`BeZM4V8GIO73-5&e+WDQgMcQXAq&V(>J3+ugfsT zz#xTC?k^+P4y1r^itt+@Rw!zjD#2Qlv&khOK!LZ(O&N5A#0UI$≻V!tl8#0ujP^ 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%0Awsfm;T@l4} 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 q6K=J4zD%h@L1}_L@5i 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 - - model: - # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - - rollout: - agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent - temperature: 0.7 - max_env_worker: 64 - num_repeat: 4 - agent_madness_reward: 0.0 - tensor_model_parallel_size: 4 - max_num_seqs: 40 - enable_oversample: False - multi_turn: - max_sample_per_task: 2 - compute_madness_checklist: - - "nonsense" - - "wrong_toolcall" - data: - train_batch_size: 64 - - debug: - debug_max_parallel: 1 - debug_first_n_tasks: 1 - - trainer_common: - save_freq: 99999 - test_freq: 99999 - total_epochs: 99999 - -# astuner --conf tutorial/example_math_agent/math_agent.yaml --with-ray --backbone='verl' - -# ------------------ 不需要修改 ------------------ -hydra: - searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://external/verl/verl/trainer/config # verl only - - file://astuner/default_config/trinity # trinity only - -# ------------------ 不需要修改 ------------------ -defaults: - - ppo_trainer # verl inherit 1/2 - - verl_default # verl inherit 2/2 - - trinity_default # trinity inherit 1/1 - - astune_default - - _self_ diff --git a/tutorial/figure/werewolves_train_witch.png b/tutorial/figure/werewolves_train_witch.png new file mode 100644 index 0000000000000000000000000000000000000000..4232e95f1095441339d863ab985cce3c7567c4bc GIT binary patch literal 258616 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%0A}i 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
      *y2kj2f7F45Ni#ciM`k8ow2^hZO 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

      dDQAO@l_%q1RUN-rL)a)a#=i3p#JV4cF6)>a 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

      Pw%Sg-XVAfNCV5~Ybv|@XX`YR@-&7HeC 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ⅇ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�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 literal 0 HcmV?d00001 From 91f28b8392f9bfcb30e6310b469514bd7cbbd68a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Sun, 30 Nov 2025 22:04:18 +0800 Subject: [PATCH 224/462] skip gpu check in debug mode --- astuner/cli/launcher.py | 113 +++++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 49 deletions(-) diff --git a/astuner/cli/launcher.py b/astuner/cli/launcher.py index d583b9ca..24511cdd 100644 --- a/astuner/cli/launcher.py +++ b/astuner/cli/launcher.py @@ -74,12 +74,6 @@ def parse_args(): default=False, help="Launch Crafters Env Simulation", ) - parser.add_argument( - "--dry-run", - action="store_true", - default=False, - help="Skip launching services and training (test/smoke mode)", - ) parser.add_argument("--reboot", action="store_true", default=False, help="reboot flag") parser.add_argument( "--kill", @@ -175,11 +169,62 @@ def check_avail_gpu(min_free_ratio: float = 0.95): ) +def get_backbone_target(backbone): + """ + Determine the appropriate backbone target module based on the backbone name. + + Args: + backbone (str): The backbone name (e.g., "verl", "debug", "trinity") + + Returns: + str: The full module path for the specified backbone + """ + backbone_target = "astuner.main_trinity" # Default to trinity + if backbone == "verl": + backbone_target = "astuner.main_verl" + if backbone == "debug": + backbone_target = "astuner.main_vllm" + if backbone == "trinity": + backbone_target = "astuner.main_trinity" + return backbone_target + + +def setup_environment_vars(args, exp_config, main_yaml_fp): + """ + Configure environment variables based on command line arguments. + + Args: + args: Command line arguments + exp_config: Experiment configuration dictionary + main_yaml_fp: Path to main YAML configuration file + + Returns: + dict: Configured environment variables dictionary + """ + env = os.environ.copy() + if args.debug: + env["RAY_DEBUG_POST_MORTEM"] = "1" + env["DEBUG_TAGS"] = args.debug + env["RAY_record_task_actor_creation_sites"] = "true" + assert exp_config["astuner"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore + logger.warning("Debug mode is ON") + else: + logger.warning("Debug mode is OFF") + if args.conf: + assert exp_config["astuner"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore + if args.backbone == "trinity": + env["ASTUNER_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore + if args.backbone == "debug": + env["ASTUNER_DEBUG"] = "1" # type: ignore + return env + + def main(): args = parse_args() # Enforce GPU availability and free memory threshold before proceeding - check_avail_gpu(min_free_ratio=0.95) + if (args.backbone != "debug") and (not args.kill): + check_avail_gpu(min_free_ratio=0.95) # Handle kill-keywords argument if provided if args.kill: @@ -194,18 +239,12 @@ def main(): return # Exit after killing processes # Initialize variables with default values to avoid "possibly unbound" errors - backbone_target = "astuner.main_trinity" # Default to trinity main_yaml_fp = None exe_exp_base = None exp_name = None - env = os.environ.copy() - if args.backbone == "verl": - backbone_target = "astuner.main_verl" - if args.backbone == "debug": - backbone_target = "astuner.main_vllm" - if args.backbone == "trinity": - backbone_target = "astuner.main_trinity" + # switch backbone target + backbone_target = get_backbone_target(args.backbone) exp_config = None exp_dir = args.exp_dir or "launcher_record" @@ -218,22 +257,7 @@ def main(): exp_config, ) = prepare_experiment_config(yaml_path, exp_dir, args.backbone) - if args.debug: - env["RAY_DEBUG_POST_MORTEM"] = "1" - env["DEBUG_TAGS"] = args.debug - env["RAY_record_task_actor_creation_sites"] = "true" - assert exp_config["astuner"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore - logger.warning("Debug mode is ON") - else: - logger.warning("Debug mode is OFF") - if args.conf: - assert exp_config["astuner"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore - - if args.backbone == "trinity": - env["ASTUNER_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore - if args.backbone == "debug": - env["ASTUNER_DEBUG"] = "1" # type: ignore - + env = setup_environment_vars(args, exp_config, main_yaml_fp) if args.with_ray: start_ray_service(args, env) @@ -253,24 +277,15 @@ def main(): launch_logview(exp_name) if args.conf and main_yaml_fp and exe_exp_base and exp_config: - if args.dry_run: - logger.info("Dry-run enabled: skipping training process launch.") - return { - "yaml": main_yaml_fp, - "exp_base": exe_exp_base, - "exp_yaml_name": os.path.basename(main_yaml_fp), - "exp_name": exp_config.get("astuner", {}).get("experiment_name"), - } - else: - execute_training_process( - args, - backbone_target, - main_yaml_fp, - exe_exp_base, - main_yaml_fp, - env, - exp_config, - ) + execute_training_process( + args, + backbone_target, + main_yaml_fp, + exe_exp_base, + main_yaml_fp, + env, + exp_config, + ) if __name__ == "__main__": From 67f823007668666fdc791591205e37bc93981cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Mon, 1 Dec 2025 01:59:39 +0800 Subject: [PATCH 225/462] improving configuration sys --- .gitignore | 2 + README.md | 4 +- astuner/backbone/common_warm_up.py | 2 +- astuner/backbone/native_compat_trainer.py | 22 +- astuner/cli/launcher.py | 4 +- astuner/context_tracker/tracker_base_attr.py | 2 +- astuner/default_config/astune_default.yaml | 196 ++++++++++------- astuner/default_config/trinity/README.md | 2 +- astuner/default_config/trinity/README_ZH.md | 2 +- ...n => config_auto_convertion_trinity.jsonc} | 16 +- astuner/default_config/trinity/map_config.py | 0 .../trinity/trinity_default.yaml | 36 +--- ...json => config_auto_convertion_verl.jsonc} | 2 + astuner/default_config/verl/verl_default.yaml | 18 +- astuner/task_judge/env_service_as_judge.py | 12 +- astuner/task_runner/__init__.py | 4 +- astuner/task_runner/classic_runner.py | 46 +--- astuner/utils/config_computer.py | 126 +++++++++++ astuner/utils/config_utils.py | 56 +++-- astuner/utils/launch_utils.py | 4 +- astuner/utils/smart_daemon.py | 6 +- docs/en/introduction.md | 4 +- docs/en/multiagent_workflow.md | 179 ++++++++++++++++ tests/config_test.py | 52 ++++- tests/temp/sample/yaml_backup.yaml | 202 ++++++++++++++++++ tutorial/example_appworld/appworld.md | 8 +- tutorial/example_appworld/appworld.yaml | 3 - tutorial/example_math_agent/math_agent.md | 8 +- tutorial/example_rubrics_judge/math_agent.md | 8 +- tutorial/example_rubrics_judge/r_judge.yaml | 2 +- tutorial/example_werewolves/werewolves.md | 8 +- 31 files changed, 790 insertions(+), 246 deletions(-) rename astuner/default_config/trinity/{config_auto_convertion_trinity.json => config_auto_convertion_trinity.jsonc} (57%) create mode 100644 astuner/default_config/trinity/map_config.py rename astuner/default_config/verl/{config_auto_convertion_verl.json => config_auto_convertion_verl.jsonc} (94%) create mode 100644 astuner/utils/config_computer.py create mode 100644 tests/temp/sample/yaml_backup.yaml diff --git a/.gitignore b/.gitignore index dcb161c5..4ceb23c5 100644 --- a/.gitignore +++ b/.gitignore @@ -143,3 +143,5 @@ good_trinity_checkpoints _resources auto/auto_grader.json tutorial/example_math_agent/math_agent_debug.yaml +saved_experiments +tests/temp diff --git a/README.md b/README.md index 4261b300..262c55a2 100644 --- a/README.md +++ b/README.md @@ -107,8 +107,8 @@ Explore our rich library of examples to kickstart your journey: - `astuner/default_config/default.yaml` (default VERL training config, overridden by `--conf` YAML) - `astuner/default_config/trinity_default.yaml` (default Trinity config, overridden via `trinity.xxx` in `--conf` YAML) - Auto-Alignment: - - `astuner/default_config/config_auto_convertion_verl.json` - - `astuner/default_config/config_auto_convertion_trinity.json` + - `astuner/default_config/config_auto_convertion_verl.jsonc` + - `astuner/default_config/config_auto_convertion_trinity.jsonc` 6. **ASTuner & AgentScope Interaction System V0.5** - Managed by `astuner/context_tracker/agentscope.py`: diff --git a/astuner/backbone/common_warm_up.py b/astuner/backbone/common_warm_up.py index 04b1cbdc..1c75508e 100644 --- a/astuner/backbone/common_warm_up.py +++ b/astuner/backbone/common_warm_up.py @@ -9,7 +9,7 @@ def init_parallel_rollout_logger(experiment_name): from beast_logger import register_logger final_log_path = os.path.join( - "launcher_record", + "saved_experiments", experiment_name, datetime.now().strftime("%Y_%m_%d_%H_%M"), ) diff --git a/astuner/backbone/native_compat_trainer.py b/astuner/backbone/native_compat_trainer.py index a3903fb6..1289c119 100644 --- a/astuner/backbone/native_compat_trainer.py +++ b/astuner/backbone/native_compat_trainer.py @@ -1281,7 +1281,7 @@ def _balance_batch(self, batch: DataProto, metrics, logging_prefix="global_seqle ) metrics.update(global_balance_stats) - def fit(self): + def fit(self): # noqa: C901 """ The training loop of PPO. The driver process only need to call the compute functions of the worker group through RPC @@ -1523,8 +1523,6 @@ def fit(self): with marked_timer("adv", timing_raw, color="brown"): # we combine with rule-based rm reward_extra_infos_dict: dict[str, list] - if self.config.reward_model.launch_reward_fn_async: - reward_tensor, reward_extra_infos_dict = ray.get(future_reward) batch.batch["token_level_scores"] = reward_tensor if reward_extra_infos_dict: @@ -1570,9 +1568,7 @@ def fit(self): if self.config.trainer.critic_warmup <= self.global_steps: # update actor with marked_timer("update_actor", timing_raw, color="red"): - batch.meta_info[ - "multi_turn" - ] = self.config.astuner.rollout.multi_turn.enable + batch.meta_info["multi_turn"] = True actor_output = self.actor_rollout_wg.update_actor(batch) actor_output_metrics = reduce_metrics(actor_output.meta_info["metrics"]) metrics.update(actor_output_metrics) @@ -1724,15 +1720,9 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): num_pass_n_tasks += 1 repeated_success_tasks += task_outcomes["tag_arr"].count("success") - num_all_success_scenarios = ( - 0 # If all tasks in a scenario are successful in all n experiments, then num_all_success_scenarios +1 - ) - num_pass_n_scenarios = ( - 0 # If all tasks in a scenario are successful in at least one of the n experiments, then num_pass_n_scenarios +1 - ) - repeated_num_pass_1_scenarios = ( - 0 # In sequential order, if all tasks in a scenario are successful in the x-th experiment, then repeated_num_pass_1_scenarios +1 - ) + num_all_success_scenarios = 0 # If all tasks in a scenario are successful in all n experiments, then num_all_success_scenarios +1 + num_pass_n_scenarios = 0 # If all tasks in a scenario are successful in at least one of the n experiments, then num_pass_n_scenarios +1 + repeated_num_pass_1_scenarios = 0 # In sequential order, if all tasks in a scenario are successful in the x-th experiment, then repeated_num_pass_1_scenarios +1 for scenario in set_scenarios: scenario_task_results = { task_id: task_outcomes @@ -1762,8 +1752,6 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): # record logs task_scenario_for_cmts = [_cmt.task_id.split("_")[0] for _cmt in cmts] for _cmt, scenario in zip(cmts, task_scenario_for_cmts): - task_outcome = _cmt.tag - selectors = [scenario, _cmt.task_id, task_outcome] _cmt.generate_log() reward = _cmt.reward_structure.raw_reward diff --git a/astuner/cli/launcher.py b/astuner/cli/launcher.py index 24511cdd..d742c524 100644 --- a/astuner/cli/launcher.py +++ b/astuner/cli/launcher.py @@ -36,7 +36,7 @@ def parse_args(): parser.add_argument( "--exp-dir", type=str, - default="launcher_record", + default="saved_experiments", required=False, help="Path to experiment directory", ) @@ -247,7 +247,7 @@ def main(): backbone_target = get_backbone_target(args.backbone) exp_config = None - exp_dir = args.exp_dir or "launcher_record" + exp_dir = args.exp_dir or "saved_experiments" if args.conf: yaml_path = args.conf ( diff --git a/astuner/context_tracker/tracker_base_attr.py b/astuner/context_tracker/tracker_base_attr.py index 776098d2..3e282d5f 100644 --- a/astuner/context_tracker/tracker_base_attr.py +++ b/astuner/context_tracker/tracker_base_attr.py @@ -43,7 +43,7 @@ def __init__(self, config, tokenizer, **kwargs): max_response_length = self.config.astuner.rollout.max_response_length_in_one_turn max_model_len: int = self.config.astuner.rollout.max_model_len self.max_seq_length: int = max_model_len - max_response_length - self.max_env_output_length: int = self.config.astuner.rollout.max_env_len + self.max_env_output_length: int = self.config.astuner.context_tracker.max_env_len self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") self.generated_token_cnt = 0 self.terminal_rewards_dict = {} diff --git a/astuner/default_config/astune_default.yaml b/astuner/default_config/astune_default.yaml index 558d1e47..e5edc92c 100644 --- a/astuner/default_config/astune_default.yaml +++ b/astuner/default_config/astune_default.yaml @@ -1,36 +1,125 @@ # ------------------ main configuration ------------------ astuner: - project_name: appworld_astune + project_name: "astune_default_project" experiment_name: "read_yaml_name" experiment_dir: "auto" # {exp-dir}/{experiment_name} - backbone: debug # debug or trinity or verl + backbone: debug # `debug` or `trinity` or `verl` + + + model: + # which model should be trained + path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct + + data: + # max number of tokens for prompt + max_prompt_length: 3000 + # max number of tokens for response + max_response_length: 15000 + # how many tasks per training batch + train_batch_size: 32 + # [Hint]: The final number of samples per update will be: N_{sample} = (data.train_batch_size * rollout.num_repeat * rollout.multi_turn.expected_steps) + + + rollout: + # activate AgentScope learn protocol + use_agentscope_protocol: True + + # the path to the workflow class + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol + + # whether or not to disable all tool calls + agentscope_disable_toolcalls: False + + # maximum number of parallel environments / simulate workers + max_env_worker: 128 + + # step reward gamma (experimental, do not change) + gamma: 1.0 + + # monitor LLM's abormal behaviors during rollout + compute_madness_checklist: + - "nonsense" + # send signal to terminate context tracing when LLM is losing control + agent_madness_termination: True # terminate_after_gone_mad + # punish the LLM when it is detected as lost control + agent_madness_reward: -1.0 + + # max response length in one turn + max_response_length_in_one_turn: 4096 + + # max token length allowed for the model during rollout + max_model_len: 18000 + + multi_turn: + # how many samples should be collected for each task run + max_sample_per_task: 30 + # limit the maximum steps for each task + max_steps: 30 + # the expected steps for each task, used to calculate the training batch size for trinity + expected_steps: 1 + + # TP size for rollout engine + tensor_model_parallel_size: 1 + + # the number of vllm engines, number of gpus for infer is `n_vllm_engine*tensor_model_parallel_size`, this argument is NOT effective when NOT using trinity + n_vllm_engine: 2 + + # how many sequences are allowed to be processed in parallel by each vllm engine + max_num_seqs: 10 + + # the usage of infer engine, options: (vllm, sglang) + name: vllm + + # how many times a task should be repeated + num_repeat: 4 + + # rollout kwargs + temperature: 0.9 + top_p: 1.0 + + # validation kwargs + val_kwargs: + temperature: 0.0 + top_k: -1 + top_p: 1.0 + do_sample: False + num_repeat: 1 + task_reader: type: env_service # `env_service` or `dataset_file` or `huggingface_dat_repo` + # when `type == dataset_file` + dataset_file: + training: + file_path: "/path/to/training/data.jsonl" + validation: + file_path: "/path/to/validation/data.jsonl" + # when `type == env_service` env_service: env_type: "appworld" env_url: "http://127.0.0.1:8080" env_action_preference: code # code, text, box training_split: train validation_split: dev - dataset_file: - training: - file_path: "xxxx.jsonl" - validation: - file_path: "xxxx.jsonl" + # when `type == huggingface_dat_repo` huggingface_dat_repo: dataset_path: "gsm8k" training_split: "train" validation_split: "validation" + task_judge: - judge_type: customized_protocal # Options: 'customized_protocal', 'rubrics_auto_grader' + judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' + + # when `judge_type == customized_protocol` judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + + # the helper LLM model used for LLM-AS-Judge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - rubrics_auto_grader: # only active when `judge_type: rubrics_auto_grader` - # rubrics begin + # when `judge_type == rubrics_auto_grader` + rubrics_auto_grader: model_name: qwen-max grader_mode: pointwise language: en @@ -42,83 +131,18 @@ astuner: max_epochs: 2 max_retries: 3 aggregation_mode: keep_all - grader_name: Math Auto Grader + grader_name: "auto_grader" num_reference_samples: 20 - query_field: main_query answer_field: final_answer reference_field: answer - input_data_type: dataset_file # `env_service` or `dataset_file` or `huggingface_dat_repo` dataset_file: training: file_path: "tutorial/example_rm_auto_grader/rubrics_train.jsonl" - # rubrics end - - model: - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 32 - - rollout: - use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol - agentscope_disable_toolcalls: False - max_env_worker: 128 - use_step_reward_from_env: False - binary_reward: False - force_no_think: False - force_think: False - mode: async - compute_madness_checklist: - - "nonsense" - gamma: 1.0 - agent_madness_termination: True # terminate_after_gone_mad - agent_madness_reward: -1.0 # customize the reward when agent is detected as gone mad - # astune_action_when_overflow: "return_warning_as_llm_output" # `return_warning_as_llm_output`, `fallback_to_default_model` - add_special_success_reward: False - temperature: 0.9 - top_p: 1.0 - max_env_len: 4096 - max_response_length_in_one_turn: 4096 - max_model_len: 18000 - multi_turn: - max_sample_per_task: 30 - max_steps: 30 - enable: True - step_skip_action: 0 # skip action generation every N steps, 0 means never skip - submit_oversample_multiplier: 1.5 - enable_oversample: True - tensor_model_parallel_size: 1 - max_num_seqs: 10 - num_repeat: 4 - name: vllm - val_kwargs: - temperature: 0.0 - top_k: -1 - top_p: 1.0 - do_sample: False - num_repeat: 1 - - context_tracker: # context tracker protocol is used ONLY when `use_agentscope_protocol=False` - context_tracker_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - # auto_context_cm: - # train_sp_action: False - # token_num_trigger_clip: 8000 - # sliding_window_cm: - # enable_llm_memory_extraction: False - # linear_think_cm: - # remove_think_before_submit_as_action: False - # extract_box_before_submit_as_action: False - # train_history_infer_token: True - + # when backbone is `debug`, debug related configurations debug: debug_max_parallel: 16 debug_first_n_tasks: 2 @@ -126,6 +150,8 @@ astuner: debug_vllm_seed: 12345 debug_tensor_parallel_size: 4 + + # trainer common configurations trainer_common: val_before_train: False val_pass_n: 4 @@ -150,7 +176,17 @@ astuner: use_kl_loss: True kl_loss_coef: 0.002 kl_loss_type: low_var_kl - trinity_only__n_vllm_engine: 2 + ulysses_sequence_parallel_size: 1 + + + # context tracker protocol is valid ONLY when `use_agentscope_protocol=False` + context_tracker: + context_tracker_type: "linear" + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + max_env_len: 4096 + - execute_test: False # DO NOT EDIT, FOR TESTING PURPOSE ONLY - execute_testing_lambda: "" + # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. + execute_test: False # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. + execute_testing_lambda: "" # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. diff --git a/astuner/default_config/trinity/README.md b/astuner/default_config/trinity/README.md index e54fec2e..489ffb9b 100644 --- a/astuner/default_config/trinity/README.md +++ b/astuner/default_config/trinity/README.md @@ -19,7 +19,7 @@ trinity: ## Configuration Mapping Modification 🔄 Some ASTune configurations overlap with Trinity. -You can configure mappings via the `astuner/default_config/trinity/config_auto_convertion_trinity.json` file. +You can configure mappings via the `astuner/default_config/trinity/config_auto_convertion_trinity.jsonc` file. ## Trinity Hyperparameter Quick Guide 📊 diff --git a/astuner/default_config/trinity/README_ZH.md b/astuner/default_config/trinity/README_ZH.md index f8323172..7d80712c 100644 --- a/astuner/default_config/trinity/README_ZH.md +++ b/astuner/default_config/trinity/README_ZH.md @@ -20,7 +20,7 @@ trinity: ## 配置映射修改 🔄 某些 ASTune 配置与 Trinity 存在重叠, -可通过 `astuner/default_config/trinity/config_auto_convertion_trinity.json` 文件进行映射配置 +可通过 `astuner/default_config/trinity/config_auto_convertion_trinity.jsonc` 文件进行映射配置 ## Trinity 超参数简明指南 📊 diff --git a/astuner/default_config/trinity/config_auto_convertion_trinity.json b/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc similarity index 57% rename from astuner/default_config/trinity/config_auto_convertion_trinity.json rename to astuner/default_config/trinity/config_auto_convertion_trinity.jsonc index 906a6976..15ebcd51 100644 --- a/astuner/default_config/trinity/config_auto_convertion_trinity.json +++ b/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc @@ -1,23 +1,25 @@ { - "astuner.trainer_common.nnodes": "cluster.node_num", "astuner.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", "astuner.trainer_common.total_epochs": "buffer.total_epochs", - "astuner.trainer_common.trinity_only__n_vllm_engine": "explorer.rollout_model.engine_num", - "astuner.trainer_common.trinity_only__explorer_batchsize": "buffer.batch_size", - "astuner.trainer_common.trinity_only__runner_per_model": "explorer.runner_per_model", - "astuner.trainer_common.save_freq": "trainer.save_interval", "astuner.trainer_common.test_freq": "explorer.eval_interval", + "astuner.trainer_common.save_freq": "trainer.save_interval", + "astuner.trainer_common.ulysses_sequence_parallel_size": "trainer.ulysses_sequence_parallel_size", + "astuner.trainer_common.optim.lr": "algorithm.optimizer.lr", + "astuner.rollout.n_vllm_engine": "explorer.rollout_model.engine_num", "astuner.model.path": "model.model_path", "astuner.project_name": "project", "astuner.experiment_name": "name", - "astuner.data.train_batch_size": "buffer.train_batch_size", "astuner.data.max_response_length": "model.max_response_tokens", "astuner.rollout.num_repeat": "algorithm.repeat_times", "astuner.rollout.tensor_model_parallel_size": "explorer.rollout_model.tensor_parallel_size", "astuner.rollout.max_model_len": [ "model.max_model_len", "trainer.max_token_len_per_gpu" - ] + ], + + "(astuner.data.train_batch_size * astuner.rollout.num_repeat)": "buffer.batch_size", + "(astuner.data.train_batch_size * astuner.rollout.num_repeat * astuner.rollout.multi_turn.expected_steps)": "buffer.train_batch_size", + "(astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine)": "explorer.runner_per_model" } diff --git a/astuner/default_config/trinity/map_config.py b/astuner/default_config/trinity/map_config.py new file mode 100644 index 00000000..e69de29b diff --git a/astuner/default_config/trinity/trinity_default.yaml b/astuner/default_config/trinity/trinity_default.yaml index 9be05b6d..b8ddc9e4 100644 --- a/astuner/default_config/trinity/trinity_default.yaml +++ b/astuner/default_config/trinity/trinity_default.yaml @@ -5,38 +5,14 @@ trinity: algorithm: algorithm_type: multi_step_grpo - optimizer: - lr: 1e-6 - repeat_times: 6 buffer: - batch_size: 32 - explorer_input: - eval_tasksets: [] - taskset: - default_workflow_type: astuner_workflow - format: - prompt_key: question - response_key: answer - name: gsm8k - path: http://localhost:8080 - rollout_args: - temperature: 1.0 - split: train - storage_type: astuner - subset_name: appworld - total_epochs: 1000 - train_batch_size: 36 trainer_input: experience_buffer: max_read_timeout: 18000 - name: agentscope_gsm8k_buffer + name: astuner_buffer storage_type: queue checkpoint_root_dir: ./trinity_checkpoints - cluster: - gpu_per_node: 8 - node_num: 1 explorer: - eval_interval: 999999 max_repeat_times_per_runner: 1 max_timeout: 7200 rollout_model: @@ -47,16 +23,9 @@ trinity: enable_prefix_caching: false enable_thinking: false enforce_eager: true - engine_num: 2 seed: 42 - tensor_parallel_size: 1 tool_call_parser: hermes - runner_per_model: 36 # runner_state_report_interval: 30 - model: - max_model_len: 16000 - max_response_tokens: 16000 - model_path: /path/to/your/model/such/as/Qwen/Qwen2___5-14B-Instruct monitor: monitor_type: swanlab name: dummy_name @@ -68,7 +37,4 @@ trinity: sync_timeout: 1200 trainer: grad_clip: 1.0 - max_token_len_per_gpu: 14000 - save_interval: 100 - ulysses_sequence_parallel_size: 1 use_dynamic_bsz: true diff --git a/astuner/default_config/verl/config_auto_convertion_verl.json b/astuner/default_config/verl/config_auto_convertion_verl.jsonc similarity index 94% rename from astuner/default_config/verl/config_auto_convertion_verl.json rename to astuner/default_config/verl/config_auto_convertion_verl.jsonc index 8f7c31fc..2b36129d 100644 --- a/astuner/default_config/verl/config_auto_convertion_verl.json +++ b/astuner/default_config/verl/config_auto_convertion_verl.jsonc @@ -14,6 +14,8 @@ "astuner.trainer_common.use_kl_loss": "actor_rollout_ref.actor.use_kl_loss", "astuner.trainer_common.kl_loss_coef": "actor_rollout_ref.actor.kl_loss_coef", "astuner.trainer_common.kl_loss_type": "actor_rollout_ref.actor.kl_loss_type", + "astuner.trainer_common.ulysses_sequence_parallel_size": "actor_rollout_ref.actor.ulysses_sequence_parallel_size", + "astuner.trainer_common.save_freq": "trainer.save_freq", "astuner.trainer_common.test_freq": "trainer.test_freq", diff --git a/astuner/default_config/verl/verl_default.yaml b/astuner/default_config/verl/verl_default.yaml index 9a203352..11dc6641 100644 --- a/astuner/default_config/verl/verl_default.yaml +++ b/astuner/default_config/verl/verl_default.yaml @@ -1,31 +1,33 @@ trainer: + experiment_name: "read_yaml_name" + project_name: "astune_default_project" val_before_train: False hfmodelpath: "" - experiment_name: "read_yaml_name" n_gpus_per_node: 8 nnodes: 1 save_freq: 20 test_freq: 20 total_epochs: 50 - project_name: appworldnew critic_warmup: 0 val_pass_n: 4 logger: - console - swanlab + data: val_batch_size: 100000000000 return_raw_chat: True filter_overlong_prompts: True truncation: error - fast_eval: True + algorithm: task_norm_patch: False adv_estimator: grpo use_kl_in_reward: False + actor_rollout_ref: hybrid_engine: True actor: @@ -46,10 +48,10 @@ actor_rollout_ref: param_offload: True optimizer_offload: True + rollout: name: vllm mode: async - max_env_len: 3000 ppo_micro_batch_size_per_gpu: 1 tensor_model_parallel_size: 1 max_num_seqs: 10 @@ -61,10 +63,17 @@ actor_rollout_ref: gamma: 1.0 enforce_eager: True log_prob_micro_batch_size_per_gpu: 4 + + # skip action generation every N steps, 0 means never skip + step_skip_action: 0 + submit_oversample_multiplier: 1.5 + enable_oversample: False + custom_dataflow_cls: path: "" name: "" + ref: use_dynamic_bsz: True log_prob_micro_batch_size_per_gpu: 4 @@ -72,6 +81,7 @@ actor_rollout_ref: fsdp_config: param_offload: True + model: use_remove_padding: True enable_gradient_checkpointing: True diff --git a/astuner/task_judge/env_service_as_judge.py b/astuner/task_judge/env_service_as_judge.py index bc17f44b..d408b2b2 100644 --- a/astuner/task_judge/env_service_as_judge.py +++ b/astuner/task_judge/env_service_as_judge.py @@ -16,13 +16,9 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO else: is_success = False - if self.config.astuner.rollout.add_special_success_reward: - if is_success: - raw_reward = 1.0 + raw_reward * 0.5 - else: - raw_reward = 0.0 + raw_reward * 0.5 - - if self.config.astuner.rollout.binary_reward: - raw_reward = 1.0 if is_success else 0.0 + if is_success: + raw_reward = 1.0 + raw_reward * 0.5 + else: + raw_reward = 0.0 + raw_reward * 0.5 return raw_reward, is_success diff --git a/astuner/task_runner/__init__.py b/astuner/task_runner/__init__.py index fb08a286..a07f25e7 100644 --- a/astuner/task_runner/__init__.py +++ b/astuner/task_runner/__init__.py @@ -17,7 +17,7 @@ def __init__(self, llm_chat_fn: Callable, tokenizer: Any, config, **kwargs): self.config = config self.max_steps: int = self.config.astuner.rollout.multi_turn.max_steps self.max_model_len: int = self.config.astuner.rollout.max_model_len - self.max_env_len: int = self.config.astuner.rollout.max_env_len + self.max_env_len: int = self.config.astuner.context_tracker.max_env_len def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task): def should_interrupt_fn() -> bool: @@ -36,7 +36,7 @@ def generated_token_callback_fn(token_array): } def get_judge(self) -> JudgeBase: # type: ignore - if self.config.astuner.task_judge.judge_type == "customized_protocal": + if self.config.astuner.task_judge.judge_type == "customized_protocol": judge_protocol = self.config.astuner.task_judge.judge_protocol return dynamic_import(judge_protocol)(self.config) # type: ignore diff --git a/astuner/task_runner/classic_runner.py b/astuner/task_runner/classic_runner.py index df0e91c9..b673f073 100644 --- a/astuner/task_runner/classic_runner.py +++ b/astuner/task_runner/classic_runner.py @@ -10,9 +10,6 @@ class AgentRunner(BaseAgentRunner): def __init__(self, **kwargs): super().__init__(**kwargs) - self.use_step_reward_from_env: bool = self.config.astuner.rollout.get( - "use_step_reward_from_env", False - ) self.step_reward = [] def execute(self, workflow_task) -> BasicContextTracker: @@ -35,11 +32,7 @@ def execute(self, workflow_task) -> BasicContextTracker: f"Unsupported context template: {self.config.astuner.context_tracker.context_tracker_type}" ) - assert not ( - self.config.astuner.rollout.force_think and self.config.astuner.rollout.force_no_think - ), "Cannot force both think and no_think" - add_nothink = self.config.astuner.rollout.force_no_think - + add_nothink = False self.cmt.save_init_input(init_messages, add_nothink) request_id: str = "" @@ -122,8 +115,6 @@ def execute(self, workflow_task) -> BasicContextTracker: state.pop("tool_calls", None) # type: ignore self.cmt.save_env_output(state, input_msg_ref=step_input_message_arr, add_nothink=add_nothink) # type: ignore self.cmt.round_cnt += 1 - if self.use_step_reward_from_env: - self.step_reward += [env_output["reward"]] # 9. 🔚 determine if the episode is terminated self.cmt.is_terminated = env_output["is_terminated"] @@ -138,34 +129,15 @@ def execute(self, workflow_task) -> BasicContextTracker: success_rate = 1.0 else: success_rate = 0.0 - if not self.use_step_reward_from_env: - if self.config.astuner.rollout.add_special_success_reward: - if success_rate == 1: - raw_reward = 1.0 + raw_reward * 0.5 - else: - raw_reward = 0.0 + raw_reward * 0.5 - if self.config.astuner.rollout.binary_reward: - raw_reward = success_rate - self.cmt.process_reward( - reward_structure=Reward( - raw_reward=raw_reward, - raw_step_reward=None, - success_rate=success_rate, - madness=0, - description="Success=1, Failure=0", - ) - ) - else: - self.cmt.process_reward( - reward_structure=Reward( - raw_reward=raw_reward, - raw_step_reward=self.step_reward, - success_rate=success_rate, - madness=0, - description="Step Reward from Environment", - ) + self.cmt.process_reward( + reward_structure=Reward( + raw_reward=raw_reward, + raw_step_reward=None, + success_rate=success_rate, + madness=0, + description="Success=1, Failure=0", ) - + ) self.cmt.remove_last_context() return self.cmt diff --git a/astuner/utils/config_computer.py b/astuner/utils/config_computer.py new file mode 100644 index 00000000..94e85d36 --- /dev/null +++ b/astuner/utils/config_computer.py @@ -0,0 +1,126 @@ +import re +from typing import Any, Callable, Dict, List, Tuple + + +def split_keys_and_operators( + operation_str: str, known_operators: List[str] +) -> Tuple[List[str], Callable[[Dict[str, Any]], Any]]: + """ + Split keys and operators from an operation expression string and return a callable function + + Args: + operation_str: Operation expression string, e.g., "(astuner.data.train_batch_size * astuner.rollout.num_repeat)" + known_operators: List of known operators, e.g., ["*", "//", "/"] + + Returns: + Tuple[List[str], Callable]: + - List of extracted keys + - Callable function that accepts a dictionary and returns the computed result + """ + # Remove leading/trailing parentheses and whitespace + cleaned_str = operation_str.strip().strip("()") + + # Sort operators by length in descending order to avoid "//" being matched by "/" first + sorted_operators = sorted(known_operators, key=len, reverse=True) + + # Build regex pattern, escape special characters + escaped_operators = [re.escape(op) for op in sorted_operators] + pattern = "|".join(escaped_operators) + + # Split string while preserving separators + parts = re.split(f"({pattern})", cleaned_str) + + # Extract keys (parts that are not operators) + keys = [] + for part in parts: + stripped_part = part.strip() + if stripped_part and stripped_part not in known_operators: + keys.append(stripped_part) + + # # Operator mapping + # operator_map = { + # "+": operator.add, + # "-": operator.sub, + # "*": operator.mul, + # "/": operator.truediv, + # "//": operator.floordiv, + # "%": operator.mod, + # "**": operator.pow, + # } + + def compute_function(values_dict: Dict[str, Any]) -> Any: + """ + Compute the expression result based on the provided values dictionary + + Args: + values_dict: Dictionary of key-value pairs + + Returns: + Computed result + """ + # Build expression string by replacing keys with actual values + expr = cleaned_str + + # Sort keys by length in descending order to avoid incorrect replacement + # when shorter key names are contained in longer ones + sorted_keys = sorted(keys, key=len, reverse=True) + + for key in sorted_keys: + if key not in values_dict: + raise ValueError(f"Missing key in values_dict: {key}") + # Use word boundary to ensure complete match + expr = re.sub(rf"\b{re.escape(key)}\b", str(values_dict[key]), expr) + + # Safely evaluate the expression + try: + result = eval(expr, {"__builtins__": {}}, {}) + return result + except Exception as e: + raise ValueError(f"Failed to evaluate expression: {expr}. Error: {e}") + + return keys, compute_function + + +# Test examples +if __name__ == "__main__": + # Example 1 + operation_str1 = "(astuner.data.train_batch_size * astuner.rollout.num_repeat * astuner.rollout.multi_turn.expected_steps)" + known_operators1 = ["*", "//", "/"] + + keys1, func1 = split_keys_and_operators(operation_str1, known_operators1) + print("Example 1:") + print(f"Extracted keys: {keys1}") + + values1 = { + "astuner.data.train_batch_size": 32, + "astuner.rollout.num_repeat": 4, + "astuner.rollout.multi_turn.expected_steps": 10, + } + result1 = func1(values1) + print(f"Computed result: {result1}") # 32 * 4 * 10 = 1280 + print() + + # Example 2 + operation_str2 = "(astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine)" + known_operators2 = ["*", "//", "/"] + + keys2, func2 = split_keys_and_operators(operation_str2, known_operators2) + print("Example 2:") + print(f"Extracted keys: {keys2}") + + values2 = {"astuner.rollout.max_env_worker": 100, "astuner.rollout.n_vllm_engine": 8} + result2 = func2(values2) + print(f"Computed result: {result2}") # 100 // 8 = 12 + print() + + # Example 3: Mixed operators + operation_str3 = "(a * b / c + d - e)" + known_operators3 = ["*", "//", "/", "+", "-"] + + keys3, func3 = split_keys_and_operators(operation_str3, known_operators3) + print("Example 3:") + print(f"Extracted keys: {keys3}") + + values3 = {"a": 100, "b": 5, "c": 10, "d": 20, "e": 5} + result3 = func3(values3) + print(f"Computed result: {result3}") # 100 * 5 / 10 + 20 - 5 = 65.0 diff --git a/astuner/utils/config_utils.py b/astuner/utils/config_utils.py index c823416f..ae3bc0fc 100644 --- a/astuner/utils/config_utils.py +++ b/astuner/utils/config_utils.py @@ -8,6 +8,8 @@ from loguru import logger from omegaconf import DictConfig +from astuner.utils.config_computer import split_keys_and_operators + def read_astune_config(yaml_fp): """Load a Hydra configuration relative to this module.""" @@ -34,6 +36,28 @@ def dump_yaml_config(cfg: DictConfig, yaml_fp: str): return yaml_fp +def _dive_to_fetch_value(config, dotted_key): + keys = dotted_key.split(".") + value = config + for key in keys: + value = value.get(key, None) + if value is None: + break + if value is None: + raise ValueError(f"[Warning]: Cannot find value for key: {dotted_key} in {config}") + return value + + +def _dive_to_set_value(config, dotted_key, value): + keys = dotted_key.split(".") + sub_config = config + for key in keys[:-1]: + if key not in sub_config: + sub_config[key] = {} + sub_config = sub_config[key] + sub_config[keys[-1]] = value + + def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone): """Align configuration values based on a conversion map. @@ -61,7 +85,7 @@ def align_parameters(from_config_fp, to_config_fp, convertion_json_fg, backbone) convertion_json = json.load(file) logger.success("----------------------------------------------------") - + # align trinity.* to to_config if ("trinity" in from_config) and backbone == "trinity": trinity_config = from_config["trinity"] @@ -83,29 +107,20 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): logger.success("----------------------------------------------------") time.sleep(1) + # align based on convertion_json for from_key, to_keys in convertion_json.items(): - # get value from from_config - keys = from_key.split(".") - value = from_config - for key in keys: - value = value.get(key, None) - if value is None: - break - if value is None: - logger.warning( - f"[Warning]: Cannot find value for key: {from_key} in {from_config_fp}, skip aligning {to_keys}" + if from_key.startswith("("): + keys_array, config_computer = split_keys_and_operators( + from_key, ["+", "-", "*", "/", "//", "%"] ) - continue + value = config_computer({k: _dive_to_fetch_value(from_config, k) for k in keys_array}) + else: + value = _dive_to_fetch_value(from_config, from_key) to_keys = to_keys if isinstance(to_keys, list) else [to_keys] + for to_key in to_keys: - keys = to_key.split(".") - sub_config = to_config - for key in keys[:-1]: - if key not in sub_config: - sub_config[key] = {} - sub_config = sub_config[key] - sub_config[keys[-1]] = value + _dive_to_set_value(to_config, to_key, value) logger.success( f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]" ) @@ -121,7 +136,7 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): def read_astune_hierarchical_config( - yaml_fp, exp_name, backbone, write_to=None, exp_dir="launcher_record" + yaml_fp, exp_name, backbone, write_to=None, exp_dir="saved_experiments" ): with open(yaml_fp, "r") as file: config = yaml.safe_load(file) @@ -206,6 +221,7 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): backup_dir = os.path.join(exp_dir, exp_name, "backup") yaml_backup_dst = os.path.join(exp_dir, exp_name, "yaml_backup.yaml") exe_exp_base = os.path.dirname(yaml_backup_dst) + logger.info("----------------------------------------") logger.info(f"Experiment Name: {exp_name}") logger.info(f"Experiment Backup Dir: {backup_dir}") diff --git a/astuner/utils/launch_utils.py b/astuner/utils/launch_utils.py index 4398729c..c846b995 100644 --- a/astuner/utils/launch_utils.py +++ b/astuner/utils/launch_utils.py @@ -88,9 +88,9 @@ def execute_training_process( # Fixed config asset locations TRINITY_BOOT_YAML = "astuner/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED TRINITY_CONFIG_AUTO_CONVERSION = ( - "astuner/default_config/trinity/config_auto_convertion_trinity.json" + "astuner/default_config/trinity/config_auto_convertion_trinity.jsonc" ) - VERL_CONFIG_AUTO_CONVERSION = "astuner/default_config/verl/config_auto_convertion_verl.json" + VERL_CONFIG_AUTO_CONVERSION = "astuner/default_config/verl/config_auto_convertion_verl.jsonc" # let's begin the training process if args.backbone == "trinity": diff --git a/astuner/utils/smart_daemon.py b/astuner/utils/smart_daemon.py index e852d508..1efec1bd 100644 --- a/astuner/utils/smart_daemon.py +++ b/astuner/utils/smart_daemon.py @@ -61,7 +61,7 @@ def __init__( else: self.cmd = ["nohup"] + [self.exe] + full_argument_list - log_dir = Path("launcher_record/companion_logs/companion") + log_dir = Path("saved_experiments/companion_logs/companion") log_dir.mkdir(parents=True, exist_ok=True) hostname = os.uname().nodename if tag: @@ -195,7 +195,7 @@ def launch( try: # Set up process creation flags and environment # Create logs directory - log_dir = Path("launcher_record/companion_logs/companion") + log_dir = Path("saved_experiments/companion_logs/companion") log_dir.mkdir(parents=True, exist_ok=True) # Open log file @@ -354,7 +354,7 @@ def __init__(self, full_argument_list: List[str], dir=None, tag="", use_pty=Fals self.cmd = ["nohup"] + full_argument_list # raise ValueError(self.script_hash) - log_dir = Path("launcher_record/companion_logs/companion") + log_dir = Path("saved_experiments/companion_logs/companion") log_dir.mkdir(parents=True, exist_ok=True) hostname = os.uname().nodename if tag: diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 3053a020..5ec35787 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -103,8 +103,8 @@ Explore our rich library of examples to kickstart your journey: - `astuner/default_config/default.yaml` (default VERL training config, overridden by `--conf` YAML) - `astuner/default_config/trinity_default.yaml` (default Trinity config, overridden via `trinity.xxx` in `--conf` YAML) - Auto-Alignment: - - `astuner/default_config/config_auto_convertion_verl.json` - - `astuner/default_config/config_auto_convertion_trinity.json` + - `astuner/default_config/config_auto_convertion_verl.jsonc` + - `astuner/default_config/config_auto_convertion_trinity.jsonc` 6. **ASTune & AgentScope Interaction System V0.5** - Managed by `astuner/context_tracker/agentscope.py`: diff --git a/docs/en/multiagent_workflow.md b/docs/en/multiagent_workflow.md index e69de29b..208f653e 100644 --- a/docs/en/multiagent_workflow.md +++ b/docs/en/multiagent_workflow.md @@ -0,0 +1,179 @@ + +This tutorial introduces how to define a trainable workflow 🚀 with AgentScope. + +ASTuner offers two convenient and mutually compatible encapsulation methods for AgentScope Workflow. The first emphasizes **simplicity, convenience, and ease of understanding**, while the second focuses on **flexibility, controllability, and extensibility**. + +## Simple agent scenario ✨: + + +1. Converting your AgentScope Workflow in ASTuner. + +**Simply set ReActAgent's `model` argument to `model_tuner` when initializing your agent.** + +```python + +# From >>> +agent_instance = ReActAgent( + name=f"Friday", + sys_prompt="You are a helpful assistant", + model=DashScopeChatModel(model_name="qwen-max", stream=False), + formatter=DashScopeChatFormatter(), +) + +# To <<< +agent_instance = ReActAgent( + name=f"Friday", + sys_prompt="You are a helpful assistant", + model=model_tuner, # change here + formatter=DashScopeChatFormatter(), +) +``` + +Then, wrap your workflow in a class that inherit `Workflow` (`from astnue import Workflow`), and your workflow is ready to be tuned. + +``` +class ExampleMathLearn(Workflow): + name: str = "math_agent_workflow" + async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + ... your ReActAgent workflow here ... + return WorkflowOutput(reward=workflow_reward) + +``` + + +2. When to use the simple agent practice. + +This practice suits well for most users, you can choose to follow this practice if you: + +- 🌟 Know exactly which agents should be trained, or the number of agents are small; +- ✨ Already finished basic debugging of your workflow, confirming that your workflow works well when implemented with a non-tuned model such as `qwen-max`; +- 🎇 Do not requires changing which agents to be trained on the fly. + + +3. Code Example + + - Suppose you have built a react agent that looks like this: + + ``` + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=DashScopeChatModel(model='qwen-max'), + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), + ) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg, structured_model=FinalResult) + final_answer = extract_final_answer(result) + ``` + + - Then all you have to do is to wrap it in a workflow class: + + ``` + [+] class ExampleMathLearn(Workflow): + [+] name: str = "math_agent_workflow" + [+] async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + [ ] from agentscope.agent import ReActAgent + [ ] from agentscope.formatter import DashScopeChatFormatter + [ ] from agentscope.memory import InMemoryMemory + [ ] from agentscope.tool import Toolkit, execute_python_code + [ ] self.toolkit = Toolkit() + [ ] self.toolkit.register_tool_function(execute_python_code) + [ ] self.agent = ReActAgent( + [ ] name="math_react_agent", + [ ] sys_prompt=system_prompt, + [-] model=DashScopeChatModel(model='qwen-max'), + [+] model=model_tuner, + [ ] formatter=DashScopeChatFormatter(), + [ ] toolkit=self.toolkit, + [ ] memory=InMemoryMemory(), + [ ] ) + [+] query = task.task.main_query + [ ] msg = Msg("user", query, role="user") + [ ] result = await self.agent.reply(msg, structured_model=FinalResult) + [ ] final_answer = extract_final_answer(result) + [+] return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + ``` + + + +## Advanced agent scenario 🤝: + +When designing an advanced multi-agent workflow composed by agents with different roles, +ASTuner can work better if it knows the identity of each agent, +thus providing training and debugging convinience. + +1. Promoting to advanced ASTuner workflow. + +The basic idea is to use `ModelTuner.register_model` to register different agent targets. + +- Let's begin from a basic AgentScope `ReActAgent`: + +```python +agent_instance = ReActAgent( + name=f"Player-X", + sys_prompt="You are a helpful assistant", + model=DashScopeChatModel(model_name="qwen-max", stream=False), + formatter=DashScopeChatFormatter(), +) +``` + +- Declare the tag of an agent, and specify what model should be used when an agent is not being trained using `model_tuner.register_model`: +```python +agent_role = "TYPE-ZERO" +default_model_when_not_training = DashScopeChatModel(model_name="qwen-max", stream=False) +model_tuner.register_model(agent_role, default_model=default_model_when_not_training) +``` + +- Create `ReActAgent` to link with the `agent_role` using `model_tuner.get_model`: +```python +agent_instance = ReActAgent( + name=f"Player-X", + sys_prompt="You are a helpful assistant", + model=model_tuner.get_model(agent_role), # replace there + formatter=DashScopeChatFormatter(), +) +``` + +- Wrap workflow in class and define `trainable_tragets` + +``` +class ExampleMathLearn(Workflow): + name: str = "math_agent_workflow" + trainable_targets: list = ["TYPE-ZERO", ...] + async def agentscope_execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + ... your agents and workflow here ... +``` + +2. When to apply this advanced ASTuner workflow rather than the simple ASTuner workflow. + +It is recommanded if you need to: +- 🌟 Achieve fine-grained control over which agents to be fine-tuned; +- ✨ Define what model agents should use when they are NOT being tuned; +- ⚡ Change which trainable agent targets on the fly without modifying the workflow code. + + +2. An multi-agent example: + + ``` + [ ] roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] + [ ] players = [] + [ ] for i, role in enumerate(roles): + [ ] default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) + [ ] default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) + [ ] chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys # 🌟 + [ ] players += [ReActAgent( + [ ] name=f"Player{i + 1}", + [ ] sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), + [-] model=chosen_model, + [+] model=model_tuner.register_model(role, default_model=chosen_model), + [ ] formatter=OpenAIMultiAgentFormatter(), + [ ] )] + ``` diff --git a/tests/config_test.py b/tests/config_test.py index 1636259b..4f50ae7b 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -1,6 +1,14 @@ +import tempfile import unittest -from astuner.utils.config_utils import prepare_experiment_config +import yaml + +from astuner.utils.config_utils import ( + align_parameters, + expand_astune_hierarchical_config, + prepare_experiment_config, + read_astune_hierarchical_config, +) class TestConfigUtils(unittest.TestCase): @@ -18,3 +26,45 @@ def test_load_config(self): self.assertIn("experiment_name", config["astuner"]) self.assertEqual(config["astuner"]["experiment_name"], "sample") self.assertIn("task_reader", config["astuner"]) + + def test_config_alignment_trinity(self): + """Test configuration alignment based on conversion JSON.""" + from_config_fp = "tests/data/config.yaml" + # Fixed config asset locations + TRINITY_CONFIG_AUTO_CONVERSION = ( + "astuner/default_config/trinity/config_auto_convertion_trinity.jsonc" + ) + + with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: + config = read_astune_hierarchical_config( + from_config_fp, + "dummy_exp_name", + backbone="trinity", + write_to=temp_yaml1.name, + exp_dir="tests/temp", + ) + expand_astune_hierarchical_config(config, write_to=temp_yaml1.name) + align_parameters( + temp_yaml1.name, temp_yaml1.name, TRINITY_CONFIG_AUTO_CONVERSION, "trinity" + ) + with open(temp_yaml1.name, "r") as file: + to_config = yaml.safe_load(file) + self.assertEqual(to_config["buffer"]["batch_size"], 960) + self.assertEqual(to_config["explorer"]["runner_per_model"], 128) + # Test simple field mappings + self.assertEqual(to_config["project"], "unittest") + self.assertEqual(to_config["name"], "dummy_exp_name") + self.assertEqual(to_config["model"]["model_path"], "") + # Test trainer common mappings + self.assertEqual(to_config["trainer"]["save_interval"], 99999) + self.assertEqual(to_config["buffer"]["total_epochs"], 99999) + self.assertEqual(to_config["explorer"]["eval_interval"], 99999) + # Test algorithm mappings + self.assertEqual(to_config["algorithm"]["repeat_times"], 8) + # Test explorer/rollout mappings + self.assertEqual(to_config["explorer"]["rollout_model"]["tensor_parallel_size"], 4) + # Test computed values + # (astuner.data.train_batch_size * astuner.rollout.num_repeat) = 120 * 8 = 960 + self.assertEqual(to_config["buffer"]["batch_size"], 960) + # (astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine) = 256 // 2 = 128 + self.assertEqual(to_config["explorer"]["runner_per_model"], 128) diff --git a/tests/temp/sample/yaml_backup.yaml b/tests/temp/sample/yaml_backup.yaml new file mode 100644 index 00000000..56833299 --- /dev/null +++ b/tests/temp/sample/yaml_backup.yaml @@ -0,0 +1,202 @@ +actor_rollout_ref: + actor: + entropy_coeff: 0 + fsdp_config: + optimizer_offload: true + param_offload: true + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + loss_agg_mode: seq-mean-token-mean + optim: + lr: 1.0e-06 + override_ppo_mini_batch_num: 1 + ppo_epochs: 1 + ppo_max_token_len_per_gpu: 18000 + ppo_micro_batch_size_per_gpu: 1 + ppo_mini_batch_size: 16 + use_dynamic_bsz: true + use_kl_loss: true + hybrid_engine: true + model: + enable_gradient_checkpointing: true + use_remove_padding: true + ref: + fsdp_config: + param_offload: true + log_prob_max_token_len_per_gpu: 18000 + log_prob_micro_batch_size_per_gpu: 4 + use_dynamic_bsz: true + rollout: + custom_dataflow_cls: + name: '' + path: '' + enable_oversample: false + enforce_eager: true + gamma: 1.0 + gpu_memory_utilization: 0.9 + log_prob_max_token_len_per_gpu: 18000 + log_prob_micro_batch_size_per_gpu: 4 + max_env_worker: 64 + max_num_seqs: 10 + mode: async + name: vllm + ppo_micro_batch_size_per_gpu: 1 + step_skip_action: 0 + submit_oversample_multiplier: 1.5 + temperature: 0.9 + tensor_model_parallel_size: 1 + top_p: 1.0 +algorithm: + adv_estimator: grpo + task_norm_patch: false + use_kl_in_reward: false +astuner: + backbone: debug + context_tracker: + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + context_tracker_type: linear + max_env_len: 4096 + data: + max_prompt_length: 3000 + max_response_length: 15000 + train_batch_size: 120 + debug: + debug_first_n_tasks: 1 + debug_max_parallel: 1 + debug_tensor_parallel_size: 4 + debug_vllm_port: 18000 + debug_vllm_seed: 12345 + execute_test: false + execute_testing_lambda: '' + experiment_dir: tests/temp/sample + experiment_name: sample + model: + path: '' + project_name: unittest + rollout: + agent_madness_reward: -1.0 + agent_madness_termination: true + agentscope_disable_toolcalls: false + agentscope_learn_protocol: tutorial.example_math_agent.math_agent->ExampleMathLearn + compute_madness_checklist: + - nonsense + - wrong_toolcall + gamma: 1.0 + max_env_worker: 256 + max_model_len: 18000 + max_num_seqs: 256 + max_response_length_in_one_turn: 4096 + multi_turn: + expected_steps: 1 + max_sample_per_task: 4 + max_steps: 30 + n_vllm_engine: 2 + name: vllm + num_repeat: 8 + temperature: 0.7 + tensor_model_parallel_size: 4 + top_p: 1.0 + use_agentscope_protocol: true + val_kwargs: + do_sample: false + num_repeat: 1 + temperature: 0.0 + top_k: -1 + top_p: 1.0 + task_judge: + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_type: customized_protocol + rubrics_auto_grader: + aggregation_mode: keep_all + answer_field: final_answer + dataset_file: + training: + file_path: tutorial/example_rm_auto_grader/rubrics_train.jsonl + generate_number: 1 + grader_mode: pointwise + grader_name: auto_grader + input_data_type: dataset_file + language: en + max_epochs: 2 + max_retries: 3 + max_score: 1 + min_score: 0 + model_name: qwen-max + num_reference_samples: 20 + query_field: main_query + reference_field: answer + sampling_mode: all_samples + success_threshold: 0.7 + task_reader: + dataset_file: + training: + file_path: /path/to/training/data.jsonl + validation: + file_path: /path/to/validation/data.jsonl + env_service: + env_action_preference: code + env_type: appworld + env_url: http://127.0.0.1:8080 + training_split: train + validation_split: dev + huggingface_dat_repo: + dataset_path: '' + training_split: train + validation_split: test + type: huggingface_dat_repo + trainer_common: + algorithm: + adv_estimator: grpo + task_norm_patch: false + use_kl_in_reward: false + fsdp_config: + optimizer_offload: true + param_offload: true + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + logger: + - console + - swanlab + mini_batch_num: 1 + n_gpus_per_node: 8 + nnodes: 1 + optim: + lr: 1.0e-06 + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + ulysses_sequence_parallel_size: 1 + use_kl_loss: true + val_before_train: false + val_pass_n: 4 +data: + filter_overlong_prompts: true + return_raw_chat: true + truncation: error + val_batch_size: 100000000000 +defaults: +- verl_default +- astune_default +- _self_ +hydra: + searchpath: + - file://astuner/default_config + - file://astuner/default_config/verl +trainer: + critic_warmup: 0 + experiment_name: read_yaml_name + hfmodelpath: '' + logger: + - console + - swanlab + n_gpus_per_node: 8 + nnodes: 1 + project_name: astune_default_project + save_freq: 20 + test_freq: 20 + total_epochs: 50 + val_before_train: false + val_pass_n: 4 diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 0364d24c..79a4d3d7 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -125,7 +125,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 日志界面 -- 找到日志文件夹,默认在 `./launcher_record/exp_yaml_file_name/*` 下面 +- 找到日志文件夹,默认在 `./saved_experiments/exp_yaml_file_name/*` 下面 - 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 ```bash root@xxxx:/xxx/xxx/xxx# beast_logger_go @@ -135,9 +135,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 09ec33e1..7c22e5ea 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -39,9 +39,6 @@ astuner: save_freq: 99999 test_freq: 99999 total_epochs: 99999 - trinity_only__n_vllm_engine: 2 # must be division by tensor_model_parallel_size - trinity_only__explorer_batchsize: 32 # for best parallel performance, make sure that (trinity_only__explorer_batchsize * num_repeat) <= (trinity_only__n_vllm_engine * runner_per_model) - trinity_only__runner_per_model: 100 # for best parallel performance, make sure that (trinity_only__explorer_batchsize * num_repeat) <= (trinity_only__n_vllm_engine * runner_per_model) # ------------------ 不需要修改 ------------------ diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index 4bafe950..3d6e3590 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -150,7 +150,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 日志界面 -- 找到日志文件夹,默认在 `./launcher_record/exp_yaml_file_name/*` 下面 +- 找到日志文件夹,默认在 `./saved_experiments/exp_yaml_file_name/*` 下面 - 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 ```bash root@xxxx:/xxx/xxx/xxx# beast_logger_go @@ -160,9 +160,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index c9e0c7e0..a44e4e11 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -150,7 +150,7 @@ astuner --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='trinit 日志界面 -- 找到日志文件夹,默认在 `./launcher_record/exp_yaml_file_name/*` 下面 +- 找到日志文件夹,默认在 `./saved_experiments/exp_yaml_file_name/*` 下面 - 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 ```bash root@xxxx:/xxx/xxx/xxx# beast_logger_go @@ -160,9 +160,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml index 51a61409..70233a4b 100644 --- a/tutorial/example_rubrics_judge/r_judge.yaml +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -11,7 +11,7 @@ astuner: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_type: rubrics_auto_grader # Options: 'customized_protocal', 'rubrics_auto_grader' + judge_type: rubrics_auto_grader # Options: 'customized_protocol', 'rubrics_auto_grader' rubrics_auto_grader: # rubrics begin model_name: qwen-max diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index 5c0cd847..1687d053 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -95,7 +95,7 @@ 日志界面 -- 找到日志文件夹,默认在 `./launcher_record/exp_yaml_file_name/*` 下面 +- 找到日志文件夹,默认在 `./saved_experiments/exp_yaml_file_name/*` 下面 - 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 ```bash root@xxxx:/xxx/xxx/xxx# beast_logger_go @@ -105,9 +105,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name - - /mnt/data/qingxu.fu/astuner/astuner/launcher_record/exp_yaml_file_name/2025_11_10_02_52/rollout + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name + - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 From 5df0f74d384e3883643c8db521037742451171d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Mon, 1 Dec 2025 03:02:52 +0800 Subject: [PATCH 226/462] renaming classes --- astuner/backbone/trinity_compat_workflow.py | 6 +- .../agentscope_tracker/multiagent_tracking.py | 2 +- astuner/context_tracker/basic_tracker.py | 126 +-- astuner/context_tracker/tracker_base_attr.py | 13 +- astuner/schema/extended_msg.py | 3 +- .../{judge_base.py => base_judge.py} | 0 astuner/task_judge/env_service_as_judge.py | 2 +- astuner/task_judge/math_answer_as_judge.py | 2 +- astuner/task_judge/rm_auto_grader_judge.py | 2 +- astuner/task_rollout/async_llm_bridge.py | 6 +- .../task_rollout/native_parallel_worker.py | 23 +- astuner/task_rollout/resource_keeper.py | 4 +- astuner/task_runner/__init__.py | 30 +- astuner/task_runner/agentscope_runner.py | 6 +- astuner/task_runner/classic_runner.py | 14 - astuner/tuner.py | 6 +- astuner/utils/model_merger.py | 903 ------------------ astuner/utils/n_gram.py | 67 -- astuner/utils/process_manager.py | 97 -- 19 files changed, 64 insertions(+), 1248 deletions(-) rename astuner/task_judge/{judge_base.py => base_judge.py} (100%) delete mode 100644 astuner/utils/model_merger.py delete mode 100644 astuner/utils/n_gram.py delete mode 100644 astuner/utils/process_manager.py diff --git a/astuner/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py index 1242b919..c3653f85 100644 --- a/astuner/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -25,7 +25,7 @@ from astuner.backbone.common_warm_up import warm_up_process from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( - MultiAgentContextTracking, + MultiAgentContextTracker, ) from astuner.schema.trajectory import Sample from astuner.task_rollout.native_parallel_worker import DynamicRollout @@ -85,9 +85,9 @@ def thread_worker(self): obs_window=obs_window, ) - async def run_in_new_thread(self) -> MultiAgentContextTracking: + async def run_in_new_thread(self) -> MultiAgentContextTracker: return cast( - MultiAgentContextTracking, + MultiAgentContextTracker, await asyncio.to_thread(self.thread_worker), ) diff --git a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py index b6aa7d5c..8697e5a7 100644 --- a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -17,7 +17,7 @@ from astuner.utils.tokenizer import astune_apply_chat_template -class MultiAgentContextTracking(BasicContextTracker): +class MultiAgentContextTracker(BasicContextTracker): def __init__( self, llm_chat_fn, diff --git a/astuner/context_tracker/basic_tracker.py b/astuner/context_tracker/basic_tracker.py index bf72536a..58daa310 100644 --- a/astuner/context_tracker/basic_tracker.py +++ b/astuner/context_tracker/basic_tracker.py @@ -3,12 +3,11 @@ from typing import List, Optional, Tuple import torch -from beast_logger import NestedJsonItem, SeqItem, print_nested from loguru import logger from astuner.context_tracker.tracker_base_attr import ( + BaseTracker, ExtendedMessage, - TrackerAttr, replace_token_ids, ) from astuner.schema.trajectory import Reward, Sample @@ -16,7 +15,7 @@ from astuner.utils.tokenizer import astune_apply_chat_template -class BasicContextTracker(TrackerAttr): +class BasicContextTracker(BaseTracker): """ A linear context tracker template that handles the conversation flow between LLM and environment. This class manages the context window, tokenization, and message history in a linear fashion. @@ -72,53 +71,6 @@ def prepare_previous_context(self, mod="future"): message_arr[i].pop("tool_calls") return message_arr - def check_context_token_num_safe( - self, messages: List[dict], tools: List[dict] = [] - ) -> Tuple[bool, bool, str]: - def get_seq_length(messages): - prompt_text = astune_apply_chat_template( - tokenizer=self.tokenizer, - conversation=messages, - tools=tools, - add_generation_prompt=False, - tokenize=False, - ) - return len( - self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0] - ) - - token_overflow = get_seq_length(messages) >= self.max_seq_length - if self.already_mad_flag and self.config.astuner.rollout.agent_madness_termination: - return False, token_overflow, "already_mad" - messages = self.prepare_previous_context(mod="raw") - if not token_overflow: # self.config.env_engine.max_seq_length = 20480 - return True, token_overflow, "safe" - else: - return False, token_overflow, "token_overflow" - - def get_inc(self, text_frag_from, text_frag_to): - """ - Get the incremental token array from text_frag_from to text_frag_to. - """ - tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) - tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() - token_ids_acc = tokenizer_input_ids - - tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) - input_ids = tokenizer_output["input_ids"][0].tolist() - input_id_increment = input_ids[ - len(token_ids_acc) : - ] # get the new tokens added in this step - overlap_length = 0 - for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: - overlap_length += 1 - else: - break - msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" - # print(msg) - return input_id_increment, msg - def remove_last_context(self): if len(self.full_context) > 0: if self.full_context[-1].author != "llm": @@ -332,18 +284,6 @@ def save_env_output( self.full_context += [ext_msg] return - def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List[dict]: - result = [] - for ext_msg in ext_msg_array: - d = { - "role": ext_msg.role, - "content": ext_msg.content_for_future, - } - if ext_msg.tool_calls: - raise RuntimeError("Not expected, contact developer") - result.append(d) - return result - def prepare_world_interaction(self) -> str: """ Process the latest model content before environment interaction. @@ -462,67 +402,6 @@ def group_tokenize_multi_group(self): return sample_arr - def generate_log(self, task_id=None, global_step="NA"): - task_id = self.task_id - nested_items_print_buffer = {} - ext_steps = self.full_context - cmt_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=0, total_steps=1) - text_arr = [self.tokenizer.decode(t) for t in cmt_tokenized["input_ids"]] - input_id_arr = [str(t) for t in cmt_tokenized["input_ids"]] - loss_mask_color_arr = [ - "#09ABCF" if mask == 1 else "#D98510" for mask in cmt_tokenized["loss_mask"] - ] - buffer = { - "text_arr": text_arr, - "input_id_arr": input_id_arr, - "loss_mask_color_arr": loss_mask_color_arr, - } - len_prompt_ids = len(cmt_tokenized["prompt_ids"]) - len_response_ids = len(cmt_tokenized["response_ids"]) - len_input_ids = len(cmt_tokenized["input_ids"]) - raw_reward = self.reward_structure.raw_reward - step_reward = self.reward_structure.step_reward[0] - try: - step_advantage = self.reward_structure.step_advantage[0] - step_advantage_simple = self.reward_structure.step_advantage_simple[0] - except Exception: - step_advantage = 0.0 - step_advantage_simple = 0.0 - task_outcome = str(self.reward_structure.success_rate) - selectors = [task_id, task_outcome] - nested_items_print_buffer[".".join(selectors)] = NestedJsonItem( - item_id="item", # type: ignore - outcome=task_outcome, # type: ignore - len_prompt_ids=len_prompt_ids, # type: ignore - len_response_ids=len_response_ids, # type: ignore - len_input_ids=len_input_ids, # type: ignore - raw_reward=f"{float(raw_reward):.3f}", # type: ignore - step_reward=f"{float(step_reward):.3f}", # type: ignore - step_advantage=f"{float(step_advantage):.3f}", # type: ignore - step_advantage_simple=f"{float(step_advantage_simple):.3f}", # type: ignore - content=SeqItem( - text=buffer["text_arr"], # text content - title=buffer["text_arr"], # mouse hover text - count=buffer["input_id_arr"], # h highlight text - color=buffer["loss_mask_color_arr"], # color - ), - ) - print_nested( - nested_items_print_buffer, - main_content="This is the main content of the nested JSON", - header=f"[{global_step}] Task {task_id} (Reward {float(step_reward):.3f})", - mod="rollout", - narrow=False, - ) - - def process_reward(self, reward_structure: Reward): - self.reward_structure = reward_structure - ext_steps = self.full_context - # linear mode has only one trajectory - self.reward_structure.step_reward = [ - self.compute_step_level_reward(ext_steps=ext_steps, index=0, total_steps=1) - ] - def ensure_terminate_rollout_stage(self): """Nothing need to be done for basic linear cmt at `ensure_terminate_rollout_stage`""" @@ -726,7 +605,6 @@ def compute_reference_advantage(cmt_array: List): cmt.reward_structure.step_advantage_simple += [ (cmt.reward_structure.step_reward[i] - reward_mean) / (reward_std + 1e-6) ] - return def get_generation_prompt_token(self): diff --git a/astuner/context_tracker/tracker_base_attr.py b/astuner/context_tracker/tracker_base_attr.py index 3e282d5f..613d0d22 100644 --- a/astuner/context_tracker/tracker_base_attr.py +++ b/astuner/context_tracker/tracker_base_attr.py @@ -30,7 +30,7 @@ def replace_token_ids( return final, final_logprob -class TrackerAttr(object): +class BaseTracker(object): def __init__(self, config, tokenizer, **kwargs): self.task_batch_index = kwargs.get("task_batch_index", "undefined") self.task_tag = kwargs.get("task_tag", "undefined") @@ -62,3 +62,14 @@ def __init__(self, config, tokenizer, **kwargs): + self.config.astuner.data.max_response_length <= max_model_len ) + + def group_tokenize(self): + raise NotImplementedError + + def group_tokenize_multi_group(self): + raise NotImplementedError + + def tokenize_steps( + self, ext_steps: List[ExtendedMessage], index: int, total_steps: int + ) -> dict: + raise NotImplementedError diff --git a/astuner/schema/extended_msg.py b/astuner/schema/extended_msg.py index 1f16b468..16f01925 100644 --- a/astuner/schema/extended_msg.py +++ b/astuner/schema/extended_msg.py @@ -2,6 +2,7 @@ from typing import List from loguru import logger +from pydantic import BaseModel from transformers.tokenization_utils import PreTrainedTokenizer from astuner.utils.tokenizer import astune_apply_chat_template @@ -30,7 +31,7 @@ def find_sublist_indices(large_list, small_list, reverse=False): return -1 -class ExtendedMessage: +class ExtendedMessage(BaseModel): def __init__( self, author, diff --git a/astuner/task_judge/judge_base.py b/astuner/task_judge/base_judge.py similarity index 100% rename from astuner/task_judge/judge_base.py rename to astuner/task_judge/base_judge.py diff --git a/astuner/task_judge/env_service_as_judge.py b/astuner/task_judge/env_service_as_judge.py index d408b2b2..b2bad28b 100644 --- a/astuner/task_judge/env_service_as_judge.py +++ b/astuner/task_judge/env_service_as_judge.py @@ -1,4 +1,4 @@ -from astuner.task_judge.judge_base import JudgeBase +from astuner.task_judge.base_judge import JudgeBase from astuner.workflow import WorkflowOutput, WorkflowTask diff --git a/astuner/task_judge/math_answer_as_judge.py b/astuner/task_judge/math_answer_as_judge.py index c85d98b1..5ebb256a 100644 --- a/astuner/task_judge/math_answer_as_judge.py +++ b/astuner/task_judge/math_answer_as_judge.py @@ -1,6 +1,6 @@ import re -from astuner.task_judge.judge_base import JudgeBase +from astuner.task_judge.base_judge import JudgeBase from astuner.task_rollout.dashscope_llm_bridge import construct_alien_llm_chat_fn from astuner.workflow import WorkflowOutput, WorkflowTask diff --git a/astuner/task_judge/rm_auto_grader_judge.py b/astuner/task_judge/rm_auto_grader_judge.py index ac3d5998..e9b95184 100644 --- a/astuner/task_judge/rm_auto_grader_judge.py +++ b/astuner/task_judge/rm_auto_grader_judge.py @@ -31,7 +31,7 @@ from rm_gallery.core.schema.template import LanguageEnum from astuner.schema.task import Task, WorkflowOutput -from astuner.task_judge.judge_base import JudgeBase +from astuner.task_judge.base_judge import JudgeBase class RMAutoGraderJudge(JudgeBase): diff --git a/astuner/task_rollout/async_llm_bridge.py b/astuner/task_rollout/async_llm_bridge.py index e7be4cac..c5b35d5d 100644 --- a/astuner/task_rollout/async_llm_bridge.py +++ b/astuner/task_rollout/async_llm_bridge.py @@ -15,7 +15,7 @@ from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( - MultiAgentContextTracking, + MultiAgentContextTracker, ) from astuner.schema.logprob import TokenAndProb from astuner.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode @@ -38,7 +38,7 @@ def __init__( self.llm_mode = llm_mode self.max_llm_retries = max_llm_retries - def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: + def get_llm_chat_fn(self, sampling_params: dict = {}) -> Callable: # noqa: C901 def llm_chat( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -244,7 +244,7 @@ def __init__( self, llm_chat_fn, tokenizer: PreTrainedTokenizer, - context_tracker: MultiAgentContextTracking, + context_tracker: MultiAgentContextTracker, config, ) -> None: self.context_tracker = context_tracker diff --git a/astuner/task_rollout/native_parallel_worker.py b/astuner/task_rollout/native_parallel_worker.py index 65ffc449..e6fa6013 100644 --- a/astuner/task_rollout/native_parallel_worker.py +++ b/astuner/task_rollout/native_parallel_worker.py @@ -21,10 +21,11 @@ from astuner.task_rollout.single_worker import BaseParallelEnv -class StepPrinter(BaseParallelEnv): - """Utility mixin providing periodic progress / throughput printing.""" +class ClassicRolloutManager(BaseParallelEnv): + """Static (non-dynamic) rollout manager.""" def step_status_printer(self, obs_window): + """Pretty-print thread progress statistics for the shared obs window.""" # Histogram buckets: obs_window['step'] 0~5 / 5~10 / 10~15 / ... step_counter = {} current_token = sum(obs_window["token"]) @@ -59,16 +60,13 @@ def step_status_printer(self, obs_window): print_buf += [f"[finished]:{count} threads"] print(f"Rollout progress ({token_gen_per_sec_str}): " + " // ".join(print_buf)) - -class StaticRollout(StepPrinter): - """Static (non-dynamic) rollout manager.""" - def rollout( self, tasks: List[Task], mode: Literal["sample", "validate"], epoch: str, ) -> List[BasicContextTracker]: + """Execute non-dynamic rollouts in parallel and return collected trackers.""" self.current_token_count_time = time.time() cmt_array: List[BasicContextTracker] = [] rollout_n = 1 if mode == "validate" else self.rollout_n @@ -116,7 +114,7 @@ def rollout( return cmt_array -class DynamicRollout(StaticRollout): +class DynamicRolloutManager(ClassicRolloutManager): """Dynamic rollout supporting oversampling and early termination.""" def rollout( @@ -125,6 +123,7 @@ def rollout( mode: Literal["sample", "validate"], epoch: str, ) -> List[BasicContextTracker]: + """Delegate to dynamic rollout when oversampling is enabled.""" if ( mode == "sample" and (self.rollout_n != 1) @@ -135,6 +134,7 @@ def rollout( return super().rollout(tasks, mode, epoch) def greedy_max_std_selection(self, samples: List[BasicContextTracker], n): + """Select samples whose rewards maximize spread to cover diverse rollouts.""" if len(samples) < n: additional_n = n - len(samples) n = len(samples) @@ -178,7 +178,7 @@ def greedy_max_std_selection(self, samples: List[BasicContextTracker], n): ) return sorted_selected_samples - def rollout_dynamic( + def rollout_dynamic( # noqa: C901 self, tasks: List[Task], mode: Literal["sample", "validate"], @@ -186,6 +186,8 @@ def rollout_dynamic( allow_sample_num_change=True, allow_force_stop=True, ) -> List[BasicContextTracker]: + """Perform oversampled rollouts with optional early termination heuristics.""" + cmt_array: List[BasicContextTracker] = [] assert mode != "validate" rollout_n = self.rollout_n @@ -394,15 +396,17 @@ def rollout_dynamic( return cmt_array -class ParallelEnvManager(DynamicRollout): +class ParallelEnvManager(DynamicRolloutManager): """High-level manager orchestrating rollouts and batch conversion.""" def to_dataproto(self, cmt_array) -> DataProto: + """Convert completed context trackers into a `DataProto` minibatch.""" samples = self.trajectories_to_samples(cmt_array) dataproto = self.samples_to_dataproto(samples) return dataproto def trajectories_to_samples(self, cmt_array: List[BasicContextTracker]) -> List[Sample]: + """Tokenize each tracker into `Sample` objects ready for tensorization.""" sample_arr_final = [] BasicContextTracker.compute_reference_advantage(cmt_array) for cmt in cmt_array: @@ -434,6 +438,7 @@ def trajectories_to_samples(self, cmt_array: List[BasicContextTracker]) -> List[ return sample_arr_final def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: + """Pad sample fields and pack them into the `DataProto` structure expected by VERL.""" prompt_ids: torch.Tensor | List[torch.Tensor] = [] response_ids: torch.Tensor | List[torch.Tensor] = [] prompt_attention_mask: torch.Tensor | List[torch.Tensor] = [] diff --git a/astuner/task_rollout/resource_keeper.py b/astuner/task_rollout/resource_keeper.py index 6f091a33..27a86e2b 100644 --- a/astuner/task_rollout/resource_keeper.py +++ b/astuner/task_rollout/resource_keeper.py @@ -146,7 +146,7 @@ def __init__( self.task_env_uuid = task_env_uuid def step(self, action: dict) -> Tuple[str, float, bool, dict]: - # fix agentscope output + """Take a step in the gym environment.""" if not isinstance(action["content"], str): # assert isinstance(action['content'], list) # assert len(action['content']) == 1 @@ -180,7 +180,9 @@ def step(self, action: dict) -> Tuple[str, float, bool, dict]: return obs, reward, terminate, info def reset(self) -> str: + """Reset gym environment.""" raise RuntimeError("Reset is not supported") def evaluate(self, task_env_uuid, params): + """Evaluate and get reward.""" return self.env_client.evaluate(task_env_uuid, params) diff --git a/astuner/task_runner/__init__.py b/astuner/task_runner/__init__.py index a07f25e7..b220eeb1 100644 --- a/astuner/task_runner/__init__.py +++ b/astuner/task_runner/__init__.py @@ -1,7 +1,7 @@ from typing import Any, Callable, Union from astuner.context_tracker.basic_tracker import BasicContextTracker -from astuner.task_judge.judge_base import JudgeBase +from astuner.task_judge.base_judge import JudgeBase from astuner.utils.dynamic_import import dynamic_import from astuner.utils.utils import run_async_coro__no_matter_what @@ -19,7 +19,20 @@ def __init__(self, llm_chat_fn: Callable, tokenizer: Any, config, **kwargs): self.max_model_len: int = self.config.astuner.rollout.max_model_len self.max_env_len: int = self.config.astuner.context_tracker.max_env_len - def agentscope_runner_hooks(self, obs_window, task_thread_index, workflow_task): + def get_judge(self) -> JudgeBase: # type: ignore + if self.config.astuner.task_judge.judge_type == "customized_protocol": + judge_protocol = self.config.astuner.task_judge.judge_protocol + return dynamic_import(judge_protocol)(self.config) # type: ignore + + elif self.config.astuner.task_judge.judge_type == "rubrics_auto_grader": + # astuner/task_judge/rm_auto_grader_judge.py + from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + + judge = RMAutoGraderJudge(self.config) + run_async_coro__no_matter_what(judge.load_rubrics_from_cache()) + return judge + + def runner_hooks(self, obs_window, task_thread_index, workflow_task): def should_interrupt_fn() -> bool: if (obs_window["stop"] is not None) and obs_window["stop"][ task_thread_index @@ -34,16 +47,3 @@ def generated_token_callback_fn(token_array): "should_interrupt_fn": should_interrupt_fn, "generated_token_callback_fn": generated_token_callback_fn, } - - def get_judge(self) -> JudgeBase: # type: ignore - if self.config.astuner.task_judge.judge_type == "customized_protocol": - judge_protocol = self.config.astuner.task_judge.judge_protocol - return dynamic_import(judge_protocol)(self.config) # type: ignore - - elif self.config.astuner.task_judge.judge_type == "rubrics_auto_grader": - # astuner/task_judge/rm_auto_grader_judge.py - from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge - - judge = RMAutoGraderJudge(self.config) - run_async_coro__no_matter_what(judge.load_rubrics_from_cache()) - return judge diff --git a/astuner/task_runner/agentscope_runner.py b/astuner/task_runner/agentscope_runner.py index eb10e608..931e2e93 100644 --- a/astuner/task_runner/agentscope_runner.py +++ b/astuner/task_runner/agentscope_runner.py @@ -2,7 +2,7 @@ from astuner import ModelTuner, Workflow, WorkflowOutput from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( - MultiAgentContextTracking, + MultiAgentContextTracker, ) from astuner.context_tracker.basic_tracker import BasicContextTracker from astuner.schema.task import WorkflowTask @@ -23,12 +23,12 @@ def execute(self, workflow_task: WorkflowTask) -> BasicContextTracker: workflow_cls = dynamic_import(workflow_import) agentscope_workflow: Workflow = workflow_cls(name="astuner-trinity") - hooks = self.agentscope_runner_hooks( + hooks = self.runner_hooks( obs_window=obs_window, task_thread_index=task_thread_index, workflow_task=workflow_task, ) - context_tracker = MultiAgentContextTracking( + context_tracker = MultiAgentContextTracker( llm_chat_fn=self.llm_chat_fn, tokenizer=self.tokenizer, config=self.config, diff --git a/astuner/task_runner/classic_runner.py b/astuner/task_runner/classic_runner.py index b673f073..1a7be587 100644 --- a/astuner/task_runner/classic_runner.py +++ b/astuner/task_runner/classic_runner.py @@ -21,12 +21,6 @@ def execute(self, workflow_task) -> BasicContextTracker: # 1. 🚀 Initialize messages if self.config.astuner.context_tracker.context_tracker_type == "linear": self.cmt = BasicContextTracker(self.config, self.tokenizer) - # elif self.config.astuner.context_tracker.context_tracker_type == "linear_think": - # self.cmt = LinearThinkCMT(self.config, self.tokenizer) - # elif self.config.astuner.context_tracker.context_tracker_type == "context_selfclip": - # self.cmt = SelfContextClipCMT(self.config, self.tokenizer, self.llm_chat_fn) - # elif self.config.astuner.context_tracker.context_tracker_type == "sliding_window": - # self.cmt = SlidingWindowCMT(self.config, self.tokenizer, self.llm_chat_fn) else: raise ValueError( f"Unsupported context template: {self.config.astuner.context_tracker.context_tracker_type}" @@ -93,13 +87,6 @@ def execute(self, workflow_task) -> BasicContextTracker: env_output["state"] = convert_tool_to_user_message( env_output["state"], self.tokenizer, format="qwen" ) - # if self.console_debug_mode: - # if isinstance(env_output["state"], dict): - # print_listofdict( - # step_input_message_arr + - # [{'role': 'llm_latest', 'content': llm_output['content']}] + - # [{'role': 'env', 'content': env_output["state"]['content']}] - # , mod='c') except Exception as e: logger.bind(exception=True).exception(f"call env.step error with {e}") self.cmt.is_terminated = True @@ -139,5 +126,4 @@ def execute(self, workflow_task) -> BasicContextTracker: ) ) self.cmt.remove_last_context() - return self.cmt diff --git a/astuner/tuner.py b/astuner/tuner.py index b86e6b58..085013fb 100644 --- a/astuner/tuner.py +++ b/astuner/tuner.py @@ -6,7 +6,7 @@ from pydantic import BaseModel from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( - MultiAgentContextTracking, + MultiAgentContextTracker, ) from astuner.task_rollout.async_llm_bridge import LlmProxyForAgentScope @@ -51,7 +51,7 @@ class ModelTuner(DashScopeChatModel): def __init__( self, config, - context_tracker: MultiAgentContextTracking, + context_tracker: MultiAgentContextTracker, agentscope_workflow: "Workflow", **kwargs, ) -> None: @@ -182,7 +182,7 @@ def get_llm_proxy(self) -> LlmProxyForAgentScope: """ return self.llm_proxy - def get_context_tracker(self) -> MultiAgentContextTracking: + def get_context_tracker(self) -> MultiAgentContextTracker: """Get the context tracker instance. Returns: LlmProxyForAgentScope: diff --git a/astuner/utils/model_merger.py b/astuner/utils/model_merger.py deleted file mode 100644 index 08cb014c..00000000 --- a/astuner/utils/model_merger.py +++ /dev/null @@ -1,903 +0,0 @@ -# Copyright 2024 Bytedance Ltd. and/or its affiliates -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -This script is used to merge huggingface model and test verl checkpoints from FSDP and Megatron backends. - -To merge FSDP checkpoints: -```sh -python scripts/model_merger.py merge \ - --backend fsdp \ - --local_dir checkpoints/verl_fsdp_gsm8k_examples/qwen2_5_0b5_fsdp_saveload/global_step_1/actor \ - --target_dir /path/to/merged_hf_model -``` - -To merge Megatron checkpoints: -```sh -python scripts/model_merger.py merge \ - --backend megatron \ - --tie-word-embedding \ - --local_dir checkpoints/verl_megatron_gsm8k_examples/qwen2_5_0b5_megatron_saveload/global_step_1/actor \ - --target_dir /path/to/merged_hf_model -``` - -For more details, please refer to documentation: -https://verl.readthedocs.io/en/latest/advance/checkpoint.html#convert-fsdp-and-megatron-checkpoints-to-huggingface-format-model -""" - -import argparse -import os -import re -import warnings -from abc import ABC, abstractmethod -from concurrent.futures import ThreadPoolExecutor -from dataclasses import dataclass, field -from pathlib import Path -from typing import Optional, Union - -import numpy as np -import torch -from accelerate import init_empty_weights -from safetensors.torch import load_file -from torch.distributed._tensor import Placement, Shard -from transformers import ( - AutoConfig, - AutoModelForCausalLM, - AutoModelForTokenClassification, - AutoModelForVision2Seq, - GenerationConfig, - PretrainedConfig, -) - -try: - # for torch 2.5+ - from torch.distributed.tensor import DTensor -except ImportError: - from torch.distributed._tensor import DTensor - -from tqdm import tqdm -from verl.utils import hf_processor, hf_tokenizer - - -@dataclass -class ModelMergerConfig: - operation: str # 'merge' or 'test' - backend: str - local_dir: str - hf_model_config_path: str - target_dir: Optional[str] = "tmp" - hf_upload_path: Optional[str] = None - private: bool = False - test_hf_dir: Optional[str] = None - tie_word_embedding: bool = False - is_value_model: bool = False - hf_model_path: Optional[str] = None - hf_upload: bool = field(init=False) - - def __post_init__(self): - self.hf_upload = self.operation == "merge" and bool(self.hf_upload_path) - if self.operation == "test": - self.target_dir = None - self.hf_upload_path = None - self.private = False - - -class BaseModelMerger(ABC): - def __init__(self, config: ModelMergerConfig): - self.config = config - self.hf_model_config_path = config.hf_model_config_path - - if config.hf_model_path: - print( - "Warning: --hf_model_path is deprecated and will be removed in a future version. Currently verl will save huggingface model configuration files into checkpoint directories. Therefore, there is no need to provide --hf_model_path. " - ) - self.hf_model_config_path = config.hf_model_path - - self.model_config = AutoConfig.from_pretrained(self.hf_model_config_path) - - def get_transformers_auto_model_class(self): - if "ForTokenClassification" in self.model_config.architectures[0]: - return AutoModelForTokenClassification - elif "ForCausalLM" in self.model_config.architectures[0]: - return AutoModelForCausalLM - elif "ForConditionalGeneration" in self.model_config.architectures[0]: - return AutoModelForVision2Seq - - raise NotImplementedError(f"Unknown architecture {self.model_config.architectures}") - - def patch_model_generation_config(self, model): - """ - The generation_config created from model config may be different to the pretrained model, - this may lead to error when generating: https://github.com/volcengine/verl/issues/1246 - - This function patch the generation_config created from model config to the pretrained model. - """ - if model.can_generate(): - try: - model.generation_config = GenerationConfig.from_pretrained( - self.hf_model_config_path - ) - except OSError: - print( - f"Warning: Generation config file not found in {self.hf_model_config_path}, using a generation config created from the model config." - ) - return model - - def save_lora_adapter(self, state_dict: dict[str, torch.Tensor]): - """ - Save lora adapter to safetensors. - - Returns: - lora_path: str, the path to the lora adapter. None if no lora adapter found. - - Note: - This function change the 'state_dict' in place. - """ - lora_params_names = [name for name in state_dict.keys() if "lora_" in name] - - if len(lora_params_names) == 0: - return None - - import json - from typing import OrderedDict - - import peft - from safetensors.torch import save_file - - lora_params = OrderedDict() - target_modules = set() - lora_key = None - - for name in lora_params_names: - lora_key = name.replace(".default.weight", ".weight") - target_modules.add(lora_key.split(".")[-3]) - lora_params[lora_key] = state_dict.pop(name) - - lora_rank = min(lora_params[lora_key].shape[0], lora_params[lora_key].shape[1]) - peft_dict = { - "r": lora_rank, - "lora_alpha": 0, # lora_alpha is not set. An error should be raised to inform the user to set it manually. - "target_modules": list(target_modules), - } - peft_config = peft.LoraConfig(**peft_dict).to_dict() - peft_config["task_type"] = ( - peft_config["task_type"].value if peft_config["task_type"] else None - ) - peft_config["peft_type"] = ( - peft_config["peft_type"].value if peft_config["peft_type"] else None - ) - peft_config["target_modules"] = list(peft_config["target_modules"]) - - lora_path = os.path.join(self.config.target_dir, "lora_adapter") - os.makedirs(lora_path, exist_ok=True) - with open( - os.path.join(lora_path, "adapter_config.json"), - "w", - encoding="utf-8", - ) as f: - json.dump(peft_config, f, ensure_ascii=False, indent=4) - save_file(lora_params, os.path.join(lora_path, "adapter_model.safetensors")) - - for name in list(state_dict.keys()): - key = ( - name.replace("base_model.model.", "") - .replace(".base_layer.weight", ".weight") - .replace(".base_layer.bias", ".bias") - ) - state_dict[key] = state_dict.pop(name) - - return lora_path - - def save_hf_model_and_tokenizer(self, state_dict: dict[str, torch.Tensor]): - auto_model_class = self.get_transformers_auto_model_class() - with init_empty_weights(): - model = auto_model_class.from_config(self.model_config, torch_dtype=torch.bfloat16) - model.to_empty(device="cpu") - model = self.patch_model_generation_config(model) - - lora_path = self.save_lora_adapter(state_dict) - if lora_path: - print(f"Saving lora adapter to {lora_path}") - - print(f"Saving model to {self.config.target_dir}") - model.save_pretrained(self.config.target_dir, state_dict=state_dict) - del state_dict - del model - - processor = hf_processor(self.hf_model_config_path) - tokenizer = hf_tokenizer(self.hf_model_config_path) - if processor is not None: - print(f"Saving processor to {self.config.target_dir}") - processor.save_pretrained(self.config.target_dir) - if tokenizer is not None: - print(f"Saving tokenizer to {self.config.target_dir}") - tokenizer.save_pretrained(self.config.target_dir) - - def upload_to_huggingface(self): - from huggingface_hub import HfApi - - api = HfApi() - api.create_repo( - repo_id=self.config.hf_upload_path, - private=self.config.private, - exist_ok=True, - ) - api.upload_folder( - folder_path=self.config.target_dir, - repo_id=self.config.hf_upload_path, - repo_type="model", - ) - - @abstractmethod - def merge_and_save(self): - raise NotImplementedError("Subclasses should implement this method") - - -class FSDPModelMerger(BaseModelMerger): - def _get_world_size(self) -> int: - """Extracts the FSDP world_size from checkpoint filenames (e.g., 'model_world_size_8_rank_0.pt').""" - for filename in os.listdir(self.config.local_dir): - match = re.match(r"model_world_size_(\d+)_rank_0\.pt", filename) - if match: - return int(match.group(1)) - raise FileNotFoundError( - f"Could not determine world size. No file matching 'model_world_size_(\\d+)_rank_0.pt' found in {self.config.local_dir}" - ) - - def _load_rank_zero_state_dict(self, world_size: int) -> dict: - return torch.load( - Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_0.pt", - map_location="cpu", - weights_only=False, - ) - - def _extract_device_mesh_info( - self, state_dict: dict, world_size: int - ) -> tuple[np.ndarray, tuple[str, ...]]: - """ - Retrieves sharding information (device_mesh, mesh_dim_names) from a DTensor in the state_dict. - If no DTensor is found, infers a simple FSDP mesh based on world_size. - """ - pivot_key = sorted(list(state_dict.keys()))[0] - weight = state_dict[pivot_key] - - if isinstance(weight, DTensor): - # get sharding info - device_mesh = weight.device_mesh - mesh = device_mesh.mesh - mesh_dim_names = device_mesh.mesh_dim_names - else: - # for non-DTensor - mesh = np.array([world_size], dtype=np.int64) - mesh_dim_names = ("fsdp",) - - return mesh, mesh_dim_names - - def _calculate_shard_configuration( - self, mesh: np.ndarray, mesh_dim_names: tuple[str, ...] - ) -> tuple[int, tuple[int, ...]]: - """Calculates the total number of shards and the shape of the device mesh.""" - assert mesh_dim_names in ( - ("fsdp",), - ("ddp", "fsdp"), - ), f"Unsupported mesh_dim_names {mesh_dim_names}" - - if "tp" in mesh_dim_names: - # TODO: "tp" is not supported yet due to the above assert - total_shards = mesh.shape[-1] * mesh.shape[-2] - mesh_shape = (mesh.shape[-2], mesh.shape[-1]) - else: - total_shards = mesh.shape[-1] - mesh_shape = (mesh.shape[-1],) - - return total_shards, mesh_shape - - def _merge_by_placement( - self, tensors: list[torch.Tensor], placement: Placement - ) -> torch.Tensor: - """Merges a list of tensors based on their DTensor placement""" - if placement.is_replicate(): - return tensors[0] - elif placement.is_partial(): - raise NotImplementedError("Partial placement is not supported yet") - elif placement.is_shard(): - return torch.cat(tensors, dim=placement.dim).contiguous() - - raise NotImplementedError(f"Unsupported placement: {placement}") - - def _load_and_merge_state_dicts( - self, - world_size: int, - total_shards: int, - mesh_shape: tuple[int, ...], - mesh_dim_names: tuple[str, ...], - ) -> dict[str, torch.Tensor]: - model_state_dict_lst = [None] * total_shards - - def process_one_shard(rank: int, model_state_dict_lst: list): - model_path = ( - Path(self.config.local_dir) / f"model_world_size_{world_size}_rank_{rank}.pt" - ) - state_dict = torch.load(model_path, map_location="cpu", weights_only=False) - model_state_dict_lst[rank] = state_dict - return state_dict - - with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [ - executor.submit(process_one_shard, rank, model_state_dict_lst) - for rank in range(total_shards) - ] - for future in tqdm( - futures, - desc=f"Loading {total_shards} FSDP shards", - total=total_shards, - ): - future.result() - - # Merge state dicts from all shards - state_dict = {} - param_placements: dict[str, list] = {} - - for key in set(model_state_dict_lst[0].keys()): - state_dict[key] = [] - for model_state_shard in model_state_dict_lst: - # add tensor shard in order of rank to state_dict[key] - tensor = model_state_shard.pop(key) - if isinstance(tensor, DTensor): - state_dict[key].append(tensor._local_tensor.bfloat16()) - - placements = tuple(tensor.placements) - # replicated placement at dp dimension can be discarded - if mesh_dim_names[0] in ("dp", "ddp"): - placements = placements[1:] - - if key not in param_placements: - param_placements[key] = placements - else: - assert param_placements[key] == placements - else: - state_dict[key].append(tensor.bfloat16()) - - del model_state_dict_lst - - # Merge tensors - for key in sorted(state_dict): - if not isinstance(state_dict[key], list): - print(f"No need to merge key {key}") - continue - if key in param_placements: - # merge shards - placements: tuple[Shard] = param_placements[key] - if len(mesh_shape) == 1: - # 1-D list, FSDP without TP - assert len(placements) == 1 - shards = state_dict[key] - state_dict[key] = self._merge_by_placement(shards, placements[0]) - else: - # 2-D list, FSDP + TP - raise NotImplementedError("FSDP + TP is not supported yet") - else: - state_dict[key] = torch.cat(state_dict[key], dim=0) - - return state_dict - - def merge_and_save(self): - world_size = self._get_world_size() - rank_zero_state_dict = self._load_rank_zero_state_dict(world_size) - - mesh, mesh_dim_names = self._extract_device_mesh_info(rank_zero_state_dict, world_size) - print(f"Got device mesh {mesh}, mesh_dim_names {mesh_dim_names}") - - total_shards, mesh_shape = self._calculate_shard_configuration(mesh, mesh_dim_names) - print(f"Processing model shards with {total_shards} {mesh_shape} in total") - - merged_state_dict = self._load_and_merge_state_dicts( - world_size, total_shards, mesh_shape, mesh_dim_names - ) - - if self.config.operation == "test": - if not self.config.test_hf_dir: - raise ValueError("test_hf_dir must be provided for test operation") - self._test_state_dict(merged_state_dict) - elif self.config.operation == "merge": - self.save_hf_model_and_tokenizer(merged_state_dict) - if self.config.hf_upload: - self.upload_to_huggingface() - else: - raise ValueError(f"Unknown operation: {self.config.operation}") - - def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): - auto_model_class = self.get_transformers_auto_model_class() - - hf_model = auto_model_class.from_pretrained( - self.config.test_hf_dir, torch_dtype=torch.bfloat16 - ) - hf_state_dict = hf_model.state_dict() - del hf_model - - hf_model_keys = set(hf_state_dict.keys()) - collected_keys = set(state_dict.keys()) - - missing_keys = hf_model_keys - collected_keys - assert ( - len(missing_keys) == 0 - ), f"Missing keys in collected state dict: {list(sorted(missing_keys))}" - - extra_keys = collected_keys - hf_model_keys - assert ( - len(extra_keys) == 0 - ), f"Extra keys in collected state dict: {list(sorted(extra_keys))}" - - for key in hf_model_keys: - hf_shape = hf_state_dict[key].shape - collected_shape = state_dict[key].shape - assert ( - hf_shape == collected_shape - ), f"Shape mismatch for key '{key}': original {hf_shape} vs collected {collected_shape}" - - hf_dtype = hf_state_dict[key].dtype - collected_dtype = state_dict[key].dtype - assert ( - hf_dtype == collected_dtype - ), f"Dtype mismatch for key '{key}': original {hf_dtype} vs collected {collected_dtype}" - - torch.testing.assert_close(hf_state_dict[key], state_dict[key], atol=1e-6, rtol=1e-6) - - print( - "FSDP checks passed: The merged state_dict matches the hf model saved by FSDPCheckpointManager." - ) - - -class MegatronModelMerger(BaseModelMerger): - def __init__(self, config: ModelMergerConfig): - from verl.utils.megatron_utils import ( - get_hf_config_and_tokenizer_checkpoint_path, - ) - - config.hf_model_config_path = get_hf_config_and_tokenizer_checkpoint_path(config.local_dir) - super().__init__(config) - - self.params_mapping = { - # megatron core gpt model name, huggingface model name - # NOTICE: It's a little bit tricky, when 2 keys have the same prefix, we need to make sure the longer key within the containing relationship is processed first. - "embedding.word_embeddings": "model.embed_tokens", - # attn - "self_attention.linear_qkv.layer_norm_weight": "input_layernorm.weight", - "self_attention.linear_qkv.layer_norm_bias": "input_layernorm.bias", - "self_attention.linear_qkv": "self_attn.qkv_proj", - "self_attention.q_layernorm": "self_attn.q_norm", - "self_attention.k_layernorm": "self_attn.k_norm", - "self_attention.linear_proj": "self_attn.o_proj", - # mla - "self_attention.linear_q_proj": "self_attn.q_proj", - "self_attention.linear_q_down_proj": "self_attn.q_a_proj", - "self_attention.linear_q_up_proj.layer_norm_weight": "self_attn.q_a_layernorm.weight", - "self_attention.linear_q_up_proj": "self_attn.q_b_proj", - "self_attention.linear_kv_down_proj": "self_attn.kv_a_proj_with_mqa", - "self_attention.linear_kv_up_proj.layer_norm_weight": "self_attn.kv_a_layernorm.weight", - "self_attention.linear_kv_up_proj": "self_attn.kv_b_proj", - # mlp - "pre_mlp_layernorm": "post_attention_layernorm", - "mlp.linear_fc1.layer_norm_weight": "post_attention_layernorm.weight", - "mlp.linear_fc1.layer_norm_bias": "post_attention_layernorm.bias", - "mlp.linear_fc1": "mlp.gate_up_proj", - "mlp.linear_fc2": "mlp.down_proj", - # moe - "mlp.router.expert_bias": "mlp.gate.e_score_correction_bias", - "mlp.router": "mlp.gate", - "mlp.shared_experts.linear_fc1": "mlp.shared_experts.gate_up_proj", - "mlp.shared_experts.linear_fc2": "mlp.shared_experts.down_proj", - "linear_fc1": "gate_up_proj", - "linear_fc2": "down_proj", - # output - "final_layernorm": "norm", - "output_layer": "lm_head", - } - - def _get_tp_pp_rank_from_sharded_dir(self, sharded_dir: str) -> tuple[int, int]: - tp_rank = pp_rank = None - rank_list = sharded_dir.split("_")[2:] - if re.match(r"mp_rank_(\d\d)_(\d\d\d)", sharded_dir): - tp_rank = int(rank_list[0]) - pp_rank = int(rank_list[1]) - elif re.match(r"mp_rank_(\d\d)", sharded_dir): - tp_rank = int(rank_list[0]) - pp_rank = 0 - - assert tp_rank is not None and pp_rank is not None, f"Invalid sharded dir {sharded_dir}" - - return tp_rank, pp_rank - - def _check_megatron_checkpoint_path(self, model_path: str) -> tuple[list[str], int, int]: - """ - Validates the Megatron checkpoint structure (presence of 'model.pt' in sharded directories). - Determines TP and PP sizes from directory names. - """ - tp_size = 0 - pp_size = 0 - sharded_dirs = sorted(os.listdir(model_path)) - for sharded_dir in sharded_dirs: - assert "model.pt" in os.listdir( - Path(model_path) / sharded_dir - ), f"model.pt not found in {sharded_dir}" - tp_rank, pp_rank = self._get_tp_pp_rank_from_sharded_dir(sharded_dir) - tp_size = max(tp_size, tp_rank + 1) - pp_size = max(pp_size, pp_rank + 1) - return sharded_dirs, tp_size, pp_size - - def _merge_across_tp( - self, - key: str, - tp_data: list[torch.Tensor], - config: PretrainedConfig, - tp_size: int, - is_value_model: bool = False, - ) -> Union[torch.Tensor, list[torch.Tensor]]: - if "linear_fc1.weight" in key: - # if the tensor is gate and proj - gate_lst = [] - up_lst = [] - for infer_param in tp_data: - gate, up = infer_param.chunk(2) - gate_lst.append(gate) - up_lst.append(up) - gate = torch.cat(gate_lst, dim=0) - up = torch.cat(up_lst, dim=0) - return [gate, up] - elif "self_attention.linear_qkv." in key and "layer_norm" not in key: - # if the tensor is qkv, for each param on tp, split into q, k, v - # concat q, k, v separately. - q_lst = [] - k_lst = [] - v_lst = [] - assert config.num_attention_heads % config.num_key_value_heads == 0 - num_q_per_kv = config.num_attention_heads // config.num_key_value_heads - assert tp_data[0].shape[0] % (num_q_per_kv + 2) == 0 - kv_size_per_tp = tp_data[0].shape[0] // (num_q_per_kv + 2) - split_size = [ - kv_size_per_tp * num_q_per_kv, - kv_size_per_tp, - kv_size_per_tp, - ] - - for infer_param in tp_data: - num_query_groups_per_partition = config.num_key_value_heads // tp_size - for chunk in infer_param.chunk(num_query_groups_per_partition): - split_size = [ - kv_size_per_tp * num_q_per_kv // num_query_groups_per_partition, - kv_size_per_tp // num_query_groups_per_partition, - kv_size_per_tp // num_query_groups_per_partition, - ] - q, k, v = chunk.split(split_size) - q_lst.append(q) - k_lst.append(k) - v_lst.append(v) - - q = torch.cat(q_lst, dim=0) - k = torch.cat(k_lst, dim=0) - v = torch.cat(v_lst, dim=0) - return [q, k, v] - elif ( - "layer_norm" in key - or "layernorm" in key - or "router" in key - or ("output_layer" in key and is_value_model) - ): - return tp_data[0] - else: - dim = 0 - if "linear_fc2.weight" in key or "self_attention.linear_proj" in key: - dim = 1 - return torch.cat(tp_data, dim=dim) - - def _load_state_dicts( - self, - model_ckpt_path: str, - sharded_dirs: list[str], - tp_size: int, - pp_size: int, - ) -> list[list[dict]]: - model_state_dict_lst = [[None for _ in range(tp_size)] for _ in range(pp_size)] - - def _process_one_megatron_shard(sharded_dir: str): - model_file_path = Path(model_ckpt_path) / sharded_dir / "model.pt" - state_dict = torch.load(model_file_path, map_location="cpu", weights_only=False) - tp_rank, pp_rank = self._get_tp_pp_rank_from_sharded_dir(sharded_dir) - model_state_dict_lst[pp_rank][tp_rank] = state_dict - - with ThreadPoolExecutor(max_workers=min(32, os.cpu_count())) as executor: - futures = [ - executor.submit(_process_one_megatron_shard, sharded_dir) - for sharded_dir in sharded_dirs - ] - for future in tqdm( - futures, - desc=f"Loading {len(sharded_dirs)} Megatron shards", - total=len(sharded_dirs), - ): - future.result() - - return model_state_dict_lst - - def _check_megatron_state_key(self, key: str) -> bool: - """ - Checks if the key is a valid Megatron state key. - - Now the model merger only supports keys that start with "decoder/embedding/output_layer" in TransformerLayer. - Shall not use key starts with "model." - """ - if key.startswith("model."): - raise ValueError( - f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder/embedding/output_layer' in TransformerLayer." - ) - - skip_checking_keys = ["embedding.word_embeddings", "output_layer"] - for skip_key in skip_checking_keys: - if skip_key in key: - print(f"skip checking key {key}") - return - - # Exclude extra state keys - if not key.startswith("decoder"): - raise ValueError( - f"Invalid key {key} in Megatron state_dict. Expected keys to start with 'decoder' in TransformerLayer." - ) - - def _merge_state_dicts( - self, - model_state_dict_lst: list[list[dict]], - tp_size: int, - pp_size: int, - ) -> dict[str, torch.Tensor]: - state_dict = {} - vpp_size = len(model_state_dict_lst[0][0]) - layers_cum = 0 - - for vpp_rank in range(vpp_size): - for pp_rank in range(pp_size): - layers_handled = 0 - keys = model_state_dict_lst[pp_rank][0][vpp_rank].keys() - for key in keys: - if "extra_state" in key: - continue - if self.config.tie_word_embedding and ("output_layer" in key): - print("skip lm_head and reward_head loading because of tie_word_embeddings") - continue - - self._check_megatron_state_key(key) - hf_name = self._replace_name(key, self.params_mapping) - assert ( - hf_name is not None - ), f"Failed to convert layer name [{key}] from megatron to huggingface." - if "model.layers." in hf_name: - local_layer_no = int(hf_name.split(".")[2]) - layers_handled = max(local_layer_no, layers_handled) - global_layer_no = local_layer_no + layers_cum - new_key_list = hf_name.split(".") - new_key_list[2] = str(global_layer_no) - hf_name = ".".join(new_key_list) - else: - warnings.warn( - f"hf_name {hf_name} will not be fixed with layer number", - stacklevel=2, - ) - - tp_data = [ - model_state_dict_lst[pp_rank][tp_rank][vpp_rank][key] - for tp_rank in range(tp_size) - ] - merged = self._merge_across_tp( - key, - tp_data, - self.model_config, - tp_size, - self.config.is_value_model, - ) - - if not isinstance(merged, list): - state_dict[hf_name] = merged - elif len(merged) == 3: - # split qkv - for n, d in zip(["q", "k", "v"], merged): - state_dict[hf_name.replace("qkv", n)] = d - elif len(merged) == 2: - # split gate up - state_dict[hf_name.replace("gate_up", "gate")] = merged[0] - state_dict[hf_name.replace("gate_up", "up")] = merged[1] - print( - f"converted {key} to {hf_name} with shape {merged.shape if isinstance(merged, torch.Tensor) else [t.shape for t in merged]}" - ) - - layers_cum += layers_handled + 1 # zero based - - return state_dict - - def merge_and_save(self): - from verl.utils.megatron_utils import get_model_checkpoint_path - - model_ckpt_path = get_model_checkpoint_path(self.config.local_dir) - sharded_dirs, tp_size, pp_size = self._check_megatron_checkpoint_path(model_ckpt_path) - print( - f"sharded_dirs: {sharded_dirs}, tp_size: {tp_size}, pp_size: {pp_size}, mp_size: {len(sharded_dirs)}" - ) - - model_state_dict_lst = self._load_state_dicts( - model_ckpt_path, sharded_dirs, tp_size, pp_size - ) - merged_state_dict = self._merge_state_dicts(model_state_dict_lst, tp_size, pp_size) - del model_state_dict_lst - - if self.config.operation == "test": - if not self.config.test_hf_dir: - raise ValueError("test_hf_dir must be provided for test operation") - self._test_state_dict(merged_state_dict) - elif self.config.operation == "merge": - self.save_hf_model_and_tokenizer(merged_state_dict) - if self.config.hf_upload: - self.upload_to_huggingface() - else: - raise ValueError(f"Unknown operation: {self.config.operation}") - - def _test_state_dict(self, state_dict: dict[str, torch.Tensor]): - """ - Compares the merged Megatron state_dict against a reference safetensors model. - Applies necessary name mappings from Megatron to Hugging Face conventions using _replace_name. - """ - ref_state_dict = load_file(Path(self.config.test_hf_dir) / "model.safetensors") - - for name, loaded_weight in state_dict.items(): - # name = self._replace_name(original_name, self.params_mapping) - if not name or name.endswith(".bias") and name not in ref_state_dict: - continue - if "rotary_emb.inv_freq" in name: - continue - if self.config.tie_word_embedding and "lm_head.weight" in name: - continue - if name not in ref_state_dict: - raise RuntimeError(f"key: {name} not exist in state_dict") - param = ref_state_dict[name] - assert loaded_weight.dtype == param.dtype - torch.testing.assert_close(loaded_weight, param, atol=1e-2, rtol=5e-2) - - def _replace_name(self, megatron_name: str, name_mapping: dict[str, str]) -> str: - for m_name, v_name in name_mapping.items(): - if m_name not in megatron_name: - continue - - megatron_name = megatron_name.replace("decoder", "model") - param_name = megatron_name.replace(m_name, v_name) - return param_name - - return None # Return None if no mapping found - - -def main(): - parser = argparse.ArgumentParser(description="verl model merger") - subparsers = parser.add_subparsers( - dest="operation", - required=True, - help="Specify 'merge' or 'test' operation.", - ) - - base_op_parser = argparse.ArgumentParser(add_help=False) - base_op_parser.add_argument( - "--backend", - type=str, - required=True, - choices=["fsdp", "megatron"], - help="The backend of the model", - ) - base_op_parser.add_argument( - "--local_dir", - type=str, - required=True, - help="Path to the saved model checkpoints", - ) - base_op_parser.add_argument( - "--hf_model_path", - type=str, - default=None, - help="(Deprecated) Path to the original Hugging Face model for config.", - ) - base_op_parser.add_argument( - "--tie-word-embedding", - action="store_true", - help="Whether to tie word embedding weights (currently only Megatron supported)", - ) - base_op_parser.add_argument( - "--is-value-model", - action="store_true", - help="Whether the model is a value model (currently only Megatron supported)", - ) - - merge_parser = subparsers.add_parser( - "merge", - parents=[base_op_parser], - help="Merge model checkpoints and save.", - ) - merge_parser.add_argument( - "--target_dir", - default="tmp", - type=str, - help="Directory to save the merged huggingface model", - ) - merge_parser.add_argument( - "--hf_upload_path", - default=None, - type=str, - help="Hugging Face repository ID to upload the model", - ) - merge_parser.add_argument( - "--private", - action="store_true", - help="Whether to upload the model to a private Hugging Face repository", - ) - - test_parser = subparsers.add_parser( - "test", - parents=[base_op_parser], - help="Test merged model against a reference Hugging Face model", - ) - test_parser.add_argument( - "--test_hf_dir", - type=str, - required=True, - help="Path to the reference Hugging Face model directory for testing", - ) - - args = parser.parse_args() - - common_config_args = { - "operation": args.operation, - "backend": args.backend, - "tie_word_embedding": args.tie_word_embedding, - "is_value_model": args.is_value_model, - "local_dir": args.local_dir, - "hf_model_path": args.hf_model_path, - "hf_model_config_path": args.local_dir, - } - - if args.operation == "merge": - config = ModelMergerConfig( - **common_config_args, - target_dir=args.target_dir, - hf_upload_path=args.hf_upload_path, - private=args.private, - test_hf_dir=None, - ) - os.makedirs(config.target_dir, exist_ok=True) - elif args.operation == "test": - config = ModelMergerConfig( - **common_config_args, - test_hf_dir=args.test_hf_dir, - # the following args are not used by test operation - target_dir=None, - hf_upload_path=None, - private=False, - ) - else: - raise NotImplementedError(f"Unknown operation: {args.operation}") - - if config.backend == "fsdp": - merger = FSDPModelMerger(config) - elif config.backend == "megatron": - merger = MegatronModelMerger(config) - else: - raise NotImplementedError(f"Unknown backend: {config.backend}") - - merger.merge_and_save() - - -if __name__ == "__main__": - main() diff --git a/astuner/utils/n_gram.py b/astuner/utils/n_gram.py deleted file mode 100644 index bb784656..00000000 --- a/astuner/utils/n_gram.py +++ /dev/null @@ -1,67 +0,0 @@ -import re -from typing import List - - -def preserve_chinese(text): - # Use regular expressions to match all Chinese characters - chinese_chars = re.findall(r"[\u4e00-\u9fff]", text) - # Concatenate the matched Chinese characters into a string - return "".join(chinese_chars) - - -def get_repetition_penalty_reward(ngram_size: int, max_penalty: float): - """ - Computes N-gram repetition penalty as described in Appendix C.2 of https://arxiv.org/abs/2502.03373. - Reference implementation from: https://github.com/eddycmu/demystify-long-cot/blob/release/openrlhf/openrlhf/reward/repetition.py - - Args: - ngram_size: size of the n-grams - max_penalty: Maximum (negative) penalty for wrong answers - """ - if max_penalty > 0: - raise ValueError(f"max_penalty {max_penalty} should not be positive") - - def zipngram_chinese(text: str, ngram_size: int): - import jieba - - text = preserve_chinese(text) - seg_list = list(jieba.cut(text)) - # print(seg_list) - return zip(*[seg_list[i:] for i in range(ngram_size)]) - - def repetition_penalty_reward(completions, **kwargs) -> List[float]: - """ - reward function the penalizes repetitions - ref implementation: https://github.com/eddycmu/demystify-long-cot/blob/release/openrlhf/openrlhf/reward/repetition.py - - Args: - completions: List of model completions - """ - - contents = [completion[0]["content"] for completion in completions] - rewards = [] - for completion in contents: - if completion == "": - rewards.append(0.0) - continue - - ngrams = set() - total = 0 - for ng in zipngram_chinese(completion, ngram_size): - ngrams.add(ng) - total += 1 - - if total == 0: - rewards.append(0.0) - continue - - # total is a fixed value (sentence tokenization length) - # Assuming no repetitions at all, total = len(ngrams), scaling ~= 0, reward = 0 - # Assuming full repetition, len(ngrams) = 1, scaling ~= 1, reward = -1 - scaling = 1 - len(ngrams) / total - reward = scaling * max_penalty - rewards.append(reward) - return rewards - - return repetition_penalty_reward - diff --git a/astuner/utils/process_manager.py b/astuner/utils/process_manager.py deleted file mode 100644 index 4e04aa0d..00000000 --- a/astuner/utils/process_manager.py +++ /dev/null @@ -1,97 +0,0 @@ -import os -import shlex -import subprocess -import time - - -def _replace_placeholder_in_config(config_obj, placeholder: str, replacement: str): - """Recursively replace placeholder in all string values within dict/list structures. - - - Traverses dicts and lists deeply - - Replaces all occurrences of `placeholder` inside string values - - Leaves non-string scalars untouched - """ - - def _walk(node): - if isinstance(node, dict): - return {k: _walk(v) for k, v in node.items()} - if isinstance(node, list): - return [_walk(v) for v in node] - if isinstance(node, str): - return node.replace(placeholder, replacement) - return node - - return _walk(config_obj) - - -def kill_process_with_keyword(keyword: str, exclude_substrings=None, grace_seconds: float = 1.0): - """Use bash pipelines to kill processes matching keyword quickly. - - - Filters out processes containing any exclude_substrings - - Excludes current launcher process - - Sends TERM once to all PIDs, then KILL once to all PIDs after a short grace period - - Returns list of PIDs targeted - """ - if exclude_substrings is None: - exclude_substrings = ["vscode"] - - self_pid = os.getpid() - - # Build a fast PID collector using pgrep if available; fallback to ps/grep - # We prefer pgrep -af to filter by full command and then extract PID (column 1) - exclude_filters = " ".join([f"| grep -v -F {shlex.quote(s)}" for s in exclude_substrings]) - pid_list_cmd = ( - f"(pgrep -af -- {shlex.quote(keyword)} 2>/dev/null || true) " - f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" - ) - - try: - res = subprocess.run( - ["bash", "-lc", pid_list_cmd], - capture_output=True, - text=True, - check=False, - ) - pids = [pid for pid in res.stdout.split() if pid.isdigit()] - except Exception as e: - print(f"Failed to list PIDs via bash: {e}") - pids = [] - - # Fallback to ps/grep if pgrep path produced nothing (e.g., no pgrep installed) - if not pids: - ps_pid_cmd = ( - f"ps -eo pid,command -ww | grep -F -- {shlex.quote(keyword)} | grep -v grep " - f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" - ) - try: - res2 = subprocess.run( - ["bash", "-lc", ps_pid_cmd], - capture_output=True, - text=True, - check=False, - ) - pids = [pid for pid in res2.stdout.split() if pid.isdigit()] - except Exception as e: - print(f"Failed to list PIDs via ps/grep: {e}") - pids = [] - - if not pids: - return [] - - pid_args = " ".join(pids) - try: - # Send TERM to all in one call - subprocess.run( - ["bash", "-lc", f"kill -TERM -- {pid_args} 2>/dev/null || true"], - check=False, - ) - time.sleep(grace_seconds) - # Escalate with KILL once; ignore failures for already-exited PIDs - subprocess.run( - ["bash", "-lc", f"kill -KILL -- {pid_args} 2>/dev/null || true"], - check=False, - ) - except Exception as e: - print(f"Error issuing kill commands: {e}") - - return [int(p) for p in pids] From 236752a64307bd98ce6057c4ed2434ce1f070b70 Mon Sep 17 00:00:00 2001 From: binary-husky <96192199+binary-husky@users.noreply.github.com> Date: Mon, 1 Dec 2025 03:25:25 +0800 Subject: [PATCH 227/462] Document agent performance and behavior in werewolf game Added detailed observations on agent behavior and performance in werewolf simulations, including win rates and strategies. --- docs/en/example_werewolves.md | 47 +++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index e25b24e8..fe7331b7 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -1 +1,48 @@ # Werewolves + + + + +## result + +Qwen2-7B is able to reach 60% percent win rate in about 20 steps. +

      + +### Behavior Shifts + + +Significant role-playing improvement is observed during the experiment. +1. For example, when voted out, the original model trends to reveal its identity as `werewolf`, but fine-tuning, agent will try to cheat its opponents and protect teammates. For example: + + +
      +image +

      + Speech when voted out +

      +
      + +2. Agent develop multiple strategy for winning. +
      +image +

      + Agents develop multiple strategy such as misleading other players +

      +
      + +3. Sometime agents can take advantage of suspect between non-werewolf players to eliminate opponents. + +
      +image +

      + Taking advantage of suspect +

      +
      + + + From 6c749e0035118065ddd86812ac5a019c3c6322ca Mon Sep 17 00:00:00 2001 From: binary-husky <96192199+binary-husky@users.noreply.github.com> Date: Mon, 1 Dec 2025 04:00:57 +0800 Subject: [PATCH 228/462] Enhance README with image and tagline Added a centered image and a tagline to the README. --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 262c55a2..045d9f93 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,12 @@ AgentScope Tune, or **ASTuner**, is an advanced agent training framework designed to optimize AgentScope workflows and agents. Simply provide your AgentScope workflow, training data, and reward function to enhance your agents to their optimal performance. - +
      +image +

      + Deep-Tune Your AgentScope Workflow and Unleash Its Full Potential. +

      +
      ## ✨ Features From 39eafc1bd8a124fd076b86a27e59d4d46c48b962 Mon Sep 17 00:00:00 2001 From: binary-husky <96192199+binary-husky@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:15:21 +0800 Subject: [PATCH 229/462] Add section on expanding Qwen2-7B to Qwen2-14B (#1) --- docs/en/example_werewolves.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index fe7331b7..39263b2a 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -44,5 +44,14 @@ Significant role-playing improvement is observed during the experiment.

      +### Expanding Qwen2-7B to Qwen2-14B + + +
      +image +

      + The training process of Qwen2-14B is more robust than Qwen2-7B +

      +
      From ef0320b1d05f5445882087d4770e3bd4e2551f0b Mon Sep 17 00:00:00 2001 From: binary-husky <96192199+binary-husky@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:16:02 +0800 Subject: [PATCH 230/462] Expand Werewolves documentation with multi-agent setup (#2) Added detailed explanation of the Werewolves role-playing game as a multi-agent environment, including terms, workflow setup, configuration, debugging, and training instructions. --- docs/en/example_werewolves.md | 127 ++++++++++++++++++++++++++++++++-- 1 file changed, 121 insertions(+), 6 deletions(-) diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index 39263b2a..b552ca96 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -1,5 +1,122 @@ # Werewolves +Werewolves role playing game is a typical POMDP (Partially Observable Markov Decision Process) problem. We can train agents in this cooperative multi-agent problem using shared-parameter methods. + +Terms explained: +- **Partially Observable**: Agents are only able to receive **local information**. One agent cannot obtain others' perception even if they are teammate. +- **Markov Decision Process**: Making decisions according to current situations. +- **Shared-parameter**: Using one model as policy for multiple agents. But notice agents **share** policy (model parameters) but **do not shared** perception (model input). +- **Cooperative multi-agent problem**: Agents have aligned interests (reward). +- **Environment**: We use static **`Qwen3-235B-A22B`** as the brain of opponents. We use **`Qwen2-7B`** as the brain of trainable agents (`trainable_targets`). + +
      +image +

      + Agents develop multiple strategy such as misleading other players +

      +
      + +This page shows how to use the Werewolves social deduction game as a multi-agent environment to prepare data and environment, write an AgentScope Workflow, configure the reward module (Judge), and complete the full process from local debugging to formal training. + +1. Scenario Overview +- Scenario: Classic Werewolves game, including roles such as werewolf, villager, seer, witch, and hunter. +- Goal: Train a specific role (in this example, the witch) to achieve a higher win rate in games. +Below we will go through how to prepare the AgentScope Workflow, configure the YAML file, debug, and start training. + +2. Prepare the AgentScope Workflow +The example code is located at tutorial/example_werewolves/start.py. +You can also create your own AgentScope Workflow anywhere in the project, as long as the entry point is correctly configured in the YAML. +First, define the AgentScope workflow: +``` +class ExampleWerewolves(AgentScopeLearnProtocol): + + async def agentscope_execute(self, init_messages, astune_proxy: ModelTuner, config) -> WorkflowOutput: + train_which_role = "werewolf" + roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] + + # Set random seed for reproducibility + workflow_task = astune_proxy.get_agentscope_input_dictionary()["workflow_task"] + task_id = workflow_task.task.task_id + + np.random.seed(int(task_id)) + np.random.shuffle(roles) + + players = [ + get_official_agents( + f"Player{x + 1}", roles[x], train_which_role, astune_proxy + ) + for x in range(9) + ] + + good_guy_win = await werewolves_game(players, roles) + raw_reward = 1 if (good_guy_win and train_which_role != "werewolf") or ( + not good_guy_win and train_which_role == "werewolf" + ) else 0 + + astune_proxy.update_judge_input_dictionary(raw_reward=raw_reward) + astune_proxy.update_judge_input_dictionary(is_success=(raw_reward == 1)) + return astune_proxy +``` + +3. Configuration +3.1 Configure YAML +This section corresponds to tutorial/example_werewolves/werewolves.yaml. +You can copy and modify the key parameters in that file. The parts most relevant to this document are marked with ✨✨✨✨ in the YAML. +The key configuration items are as follows: +```yaml +astune: + task_reader: + # random seed to shuffle players + type: random_dummy + task_judge: + # ✨✨✨✨ Implement and select the evaluation function + # (in this example you can first set it to null and rely purely on the rollout's internal reward) + judge_protocol: null + model: + # ✨✨✨✨ Set the model to be trained + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + rollout: + # ✨✨✨✨ Implement and select the AgentScope Workflow entry + agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves +``` +You can add or replace your own Workflow / Judge / Model following the structure above. +Just make sure that the paths and class names are consistent with the actual code. + +3.2 Debugging +Before running formal training, it is recommended to use --backbone='debug' for fast single-machine debugging without Ray: +``` +# It is recommended to kill all processes related to ray, env_service, and vllm before starting +# ( python launcher.py --kill="python|ray|vllm" ) +python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview +``` +When --backbone=debug, the program runs without Ray, making it convenient to do breakpoint debugging on your local machine. You can configure launch.json in VSCode as follows: +```jsonc +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "program": "launcher.py", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "tutorial/example_werewolves/werewolves.yaml" + ], + "env": {} + } + ] +} +``` + +4. Start Training +After you finish validating in Debug mode, simply switch backbone to trinity and enable Ray to launch formal training: +``` +# It is recommended to kill all processes related to ray, vllm, and env_service before starting +# ( python launcher.py --kill="python|ray|vllm" ) +python launcher.py --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray +``` @@ -28,12 +145,10 @@ Significant role-playing improvement is observed during the experiment. 2. Agent develop multiple strategy for winning. -
      -image -

      - Agents develop multiple strategy such as misleading other players -

      -
      + +For example: +- **Misleding opponents**: "Let's keep an eye on the seer and the witch. They could be werewolves trying to hide". +- **Appealing to reson**: "We need to be wary of fake seers and watch for inconsistencies in stories, Player-Y as hunter should act carefully". 3. Sometime agents can take advantage of suspect between non-werewolf players to eliminate opponents. From ead443fda9ee809b21812c40468dce7f67ee64e7 Mon Sep 17 00:00:00 2001 From: binary-husky <96192199+binary-husky@users.noreply.github.com> Date: Thu, 4 Dec 2025 02:50:05 +0800 Subject: [PATCH 231/462] sync docs (#7) * Dev werewolves: change yaml and retry logic (#3) * Expand Werewolves documentation with multi-agent setup (#2) Added detailed explanation of the Werewolves role-playing game as a multi-agent environment, including terms, workflow setup, configuration, debugging, and training instructions. * rpg werewolves yaml update * werewolf expected_steps=3 (there are 3 werewolves, meaning usually 3 samples are generated per run) * fix all pre-commit (#4) * Document Math Agent training process This document outlines the steps to prepare data, build an Agent and Workflow, set up Rewards, and train a Math Agent from scratch, including code snippets and configuration details. * Revise AppWorld training documentation This update enhances the documentation for the AppWorld training process, providing detailed steps on preparing the environment, configuring the AgentScope workflow, and setting up the reward module. It also includes instructions for debugging and starting training, along with reference results and case observations. * Add Data Generator Reader (#5) * Add data generator reader --------- Co-authored-by: Xuchen Pan <32844285+pan-x-c@users.noreply.github.com> Co-authored-by: Yorick He <908536269@qq.com> --- .github/workflows/doc.yaml | 5 + .gitignore | 1 + astuner/backbone/trinity_compat_workflow.py | 4 +- astuner/data_generator/data_generator_base.py | 8 +- astuner/default_config/astune_default.yaml | 18 +- .../trinity/trinity_default.yaml | 16 +- .../trinity/trinity_launch.yaml | 2 - astuner/task_reader/__init__.py | 5 + astuner/task_reader/data_generator_reader.py | 156 ++++++++++++++++ .../task_reader/document_reader/doc_reader.py | 4 +- .../task_reader/tracing_reader/__init__.py | 4 +- astuner/utils/config_utils.py | 7 +- .../utils/env_service_client/env_client_ng.py | 10 +- docs/en/example_app_world.md | 171 +++++++++++++++++- docs/en/example_math_agent.md | 165 +++++++++++++++++ docs/en/example_werewolves.md | 4 +- pyproject.toml | 2 + tests/data_gen.py | 22 ++- tests/data_gen.yaml | 36 ++-- tests/test_tracing_reader.py | 7 +- tutorial/example_werewolves/game.py | 96 +++++----- tutorial/example_werewolves/start.py | 29 +-- tutorial/example_werewolves/utils.py | 2 +- tutorial/example_werewolves/werewolves.yaml | 62 ++++--- 24 files changed, 699 insertions(+), 137 deletions(-) create mode 100644 astuner/task_reader/data_generator_reader.py diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml index 953a7807..e916a298 100644 --- a/.github/workflows/doc.yaml +++ b/.github/workflows/doc.yaml @@ -10,6 +10,11 @@ jobs: runs-on: ubuntu-latest steps: + - name: Free up disk space + run: | + sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/lib/android + docker system prune -af + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.gitignore b/.gitignore index 4ceb23c5..4aa3d03e 100644 --- a/.gitignore +++ b/.gitignore @@ -145,3 +145,4 @@ auto/auto_grader.json tutorial/example_math_agent/math_agent_debug.yaml saved_experiments tests/temp +launcher.py diff --git a/astuner/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py index c3653f85..7a8cad9f 100644 --- a/astuner/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -28,11 +28,11 @@ MultiAgentContextTracker, ) from astuner.schema.trajectory import Sample -from astuner.task_rollout.native_parallel_worker import DynamicRollout +from astuner.task_rollout.native_parallel_worker import DynamicRolloutManager from astuner.utils.config_utils import read_astune_config -class TrinityCompatWorkflow(DynamicRollout): +class TrinityCompatWorkflow(DynamicRolloutManager): def __init__( self, is_eval, diff --git a/astuner/data_generator/data_generator_base.py b/astuner/data_generator/data_generator_base.py index 2d939a91..55975f2b 100644 --- a/astuner/data_generator/data_generator_base.py +++ b/astuner/data_generator/data_generator_base.py @@ -14,10 +14,10 @@ def __init__(self, config): config: Optional configuration object (LLM model, Maximum response length) """ self.config = config - self.sampling_params = self.config.astuner.data_generator.sampling_params or {} + self.sampling_params = self.config.data_generation.sampling_params or {} self.llm_client = construct_alien_llm_chat_fn( - alien_llm_model=self.config.astuner.data_generator.llm_model, - alien_llm_response_length=self.config.astuner.data_generator.llm_response_length, + alien_llm_model=self.config.data_generation.llm_model, + alien_llm_response_length=self.config.data_generation.llm_response_length, ) def generate_task( @@ -75,5 +75,5 @@ def _parse_llm_output_to_task( source_task: Optional[Task], document: Optional[Document] = None, extra_metadata: Optional[Dict[str, Any]] = None, - ) -> Task: + ) -> Union[Task, List[Task]]: raise NotImplementedError diff --git a/astuner/default_config/astune_default.yaml b/astuner/default_config/astune_default.yaml index e5edc92c..f89f386e 100644 --- a/astuner/default_config/astune_default.yaml +++ b/astuner/default_config/astune_default.yaml @@ -87,7 +87,7 @@ astuner: task_reader: - type: env_service # `env_service` or `dataset_file` or `huggingface_dat_repo` + type: env_service # `env_service` or `dataset_file` or `huggingface_dat_repo` or `data_generation` # when `type == dataset_file` dataset_file: training: @@ -106,6 +106,22 @@ astuner: dataset_path: "gsm8k" training_split: "train" validation_split: "validation" + # when `type == data_generation` + data_generation: + document_reader: + document_path: 'dataset/document/your-document.pdf' + languages: + - eng + query_reader: + type: dataset_file + dataset_file: + training: + file_path: 'dataset/jsonl/your-queries.jsonl' + task_num: 10 + llm_model: qwen-long + llm_response_length: 8192 + sampling_params: + temperature: 0 task_judge: diff --git a/astuner/default_config/trinity/trinity_default.yaml b/astuner/default_config/trinity/trinity_default.yaml index b8ddc9e4..bb56c607 100644 --- a/astuner/default_config/trinity/trinity_default.yaml +++ b/astuner/default_config/trinity/trinity_default.yaml @@ -8,13 +8,19 @@ trinity: buffer: trainer_input: experience_buffer: - max_read_timeout: 18000 + max_read_timeout: 3600 name: astuner_buffer storage_type: queue + replay_buffer: + enable: false + priority_fn: linear_decay + reuse_cooldown_time: null + priority_fn_args: + decay: 2.0 checkpoint_root_dir: ./trinity_checkpoints explorer: max_repeat_times_per_runner: 1 - max_timeout: 7200 + max_timeout: 3600 rollout_model: dtype: bfloat16 enable_auto_tool_choice: true @@ -22,19 +28,19 @@ trinity: enable_openai_api: true enable_prefix_caching: false enable_thinking: false - enforce_eager: true + enforce_eager: false seed: 42 tool_call_parser: hermes # runner_state_report_interval: 30 monitor: - monitor_type: swanlab + monitor_type: tensorboard name: dummy_name project: dummy_project synchronizer: sync_interval: 1 sync_method: nccl sync_style: dynamic_by_explorer - sync_timeout: 1200 + sync_timeout: 7200 trainer: grad_clip: 1.0 use_dynamic_bsz: true diff --git a/astuner/default_config/trinity/trinity_launch.yaml b/astuner/default_config/trinity/trinity_launch.yaml index 19dfa9db..f4c64c6c 100644 --- a/astuner/default_config/trinity/trinity_launch.yaml +++ b/astuner/default_config/trinity/trinity_launch.yaml @@ -4,5 +4,3 @@ algorithm: algorithm_type: multi_step_grpo - - diff --git a/astuner/task_reader/__init__.py b/astuner/task_reader/__init__.py index 7a3c7354..9131a9c9 100644 --- a/astuner/task_reader/__init__.py +++ b/astuner/task_reader/__init__.py @@ -4,6 +4,7 @@ import numpy as np from astuner.schema.task import Task +from astuner.task_reader.data_generator_reader import TaskReaderDataGenerator from astuner.task_reader.env_service_reader import TaskReaderEnvService from astuner.task_reader.hf_dataset_reader import TaskReaderHuggingFace from astuner.task_reader.jsonl_reader import TaskReaderJsonl @@ -56,6 +57,8 @@ def __init__(self, config): self.task_reader = TaskReaderHuggingFace(reader_config) elif self.task_reader == "tracing": self.task_reader = TracingReader(reader_config) + elif self.task_reader_type == "data_generation": + self.task_reader = TaskReaderDataGenerator(reader_config) elif task_reader_type == "random_dummy": self.task_reader = RandomDummyGenerator(reader_config) else: @@ -81,6 +84,8 @@ def __init__(self, reader_type, reader_config): self.task_reader = TaskReaderHuggingFace(reader_config) elif self.task_reader == "tracing": self.task_reader = TracingReader(reader_config) + elif self.task_reader_type == "data_generation": + self.task_reader = TaskReaderDataGenerator(reader_config) elif task_reader_type == "random_dummy": self.task_reader = RandomDummyGenerator(reader_config) else: diff --git a/astuner/task_reader/data_generator_reader.py b/astuner/task_reader/data_generator_reader.py new file mode 100644 index 00000000..63ed9562 --- /dev/null +++ b/astuner/task_reader/data_generator_reader.py @@ -0,0 +1,156 @@ +import json +import os +import random +from typing import List + +import dotenv + +from astuner.data_generator.task_augmentation import TaskAugmentor +from astuner.schema.task import Task +from astuner.task_reader.document_reader.doc_reader import DocReader +from astuner.task_reader.task_reader_base import TaskReaderBase + +dotenv.load_dotenv() + + +class TaskReaderDataGenerator(TaskReaderBase): + def __init__(self, reader_config): + super().__init__(reader_config) + self.reader_config = reader_config + project_root = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + dataset_dir = os.path.join(project_root, "dataset/jsonl") + os.makedirs(dataset_dir, exist_ok=True) + + self.generated_train_file = os.path.join(dataset_dir, "generated_train_tasks.jsonl") + + # Initialize + from astuner.task_reader import TaskReaderRouterV2 + + task_reader = TaskReaderRouterV2( + reader_type=self.reader_config.data_generation.query_reader.type, + reader_config=self.reader_config.data_generation.query_reader, + ) + self.original_tasks = task_reader.get_training_tasks() + + # Check if cache file exists + if os.path.exists(self.generated_train_file): + try: + print(f"Cache file found: {self.generated_train_file}") + print("Loading tasks from cache...") + self.new_tasks = self._read_jsonl_file(self.generated_train_file) + if not self.new_tasks: + raise ValueError("Empty cache file") + except Exception as e: + print(f"Error loading cache: {e}") + print("Regenerating tasks...") + self._generate_and_save_tasks() + else: + print(f"Cache file not found: {self.generated_train_file}") + print("Generating new tasks...") + self._generate_and_save_tasks() + + def _generate_and_save_tasks(self): + document_reader = DocReader(self.reader_config) + task_augmentor = TaskAugmentor(self.reader_config) + + document = document_reader.get_document() + task_num = self.reader_config.data_generation.task_num + + self.new_tasks = [] + for i in range(task_num): + try: + source_task = random.choice(self.original_tasks) + new_task = task_augmentor.generate_task(source_task=source_task, document=document) + self.new_tasks.append(new_task) + + except Exception as e: + print(f"Error generating task {i + 1}: {e}") + continue + + # Save tasks + if self.new_tasks: + print(f"Saving {len(self.new_tasks)} tasks to cache: {self.generated_train_file}") + self._save_tasks_to_jsonl(self.new_tasks, self.generated_train_file) + else: + print("Warning: No tasks generated successfully") + + def _read_jsonl_file(self, file_path): + """ + Read tasks from a JSONL file. + + Args: + file_path (str): Path to the JSONL file. + + Returns: + List[Task]: List of Task objects. + """ + tasks = [] + try: + with open(file_path, "r", encoding="utf-8") as f: + for line in f: + if line.strip(): # Skip empty lines + task_data = json.loads(line) + # Create a Task object from the JSON data + task = Task( + main_query=task_data.get("main_query", "[not defined]"), + init_messages=task_data.get("init_messages", []), + task_id=task_data.get("task_id", ""), + env_type=task_data.get("env_type", "no_env"), + metadata=task_data.get("metadata", task_data), + ) + tasks.append(task) + except FileNotFoundError: + raise ValueError(f"JSONL file not found: {file_path}") + except json.JSONDecodeError as e: + raise ValueError(f"Invalid JSON in file {file_path}: {str(e)}") + + if len(tasks) == 0: + raise ValueError(f"No tasks found in file: {file_path}") + + return tasks + + def _save_tasks_to_jsonl(self, tasks: List[Task], file_path: str): + """ + Save tasks to a JSONL file. + + Args: + tasks (List[Task]): List of Task objects to save. + file_path (str): Path to the output JSONL file. + """ + try: + # Create directory if it doesn't exist + os.makedirs(os.path.dirname(file_path), exist_ok=True) + + with open(file_path, "w", encoding="utf-8") as f: + for task in tasks: + # Convert Task object to dictionary + task_data = { + "main_query": task.main_query, + "init_messages": task.init_messages, + "task_id": task.task_id, + "env_type": task.env_type, + "metadata": task.metadata, + } + # Write as JSON line + f.write(json.dumps(task_data, ensure_ascii=False) + "\n") + + except Exception as e: + raise ValueError(f"Error saving tasks to {file_path}: {str(e)}") + + def get_training_tasks(self) -> List[Task]: + """ + Get training tasks from data generation. + + Returns: + List[Task]: List of training Task objects. + """ + return self.new_tasks + + def get_validation_tasks(self) -> List[Task]: + """ + Get validation tasks from data generation. + + Returns: + List[Task]: List of validation Task objects. + """ + return self.original_tasks diff --git a/astuner/task_reader/document_reader/doc_reader.py b/astuner/task_reader/document_reader/doc_reader.py index 7c21d1e9..4095f7f9 100644 --- a/astuner/task_reader/document_reader/doc_reader.py +++ b/astuner/task_reader/document_reader/doc_reader.py @@ -38,8 +38,8 @@ def _parser_document(self, raw_document: str) -> Document: return Document(doc_id=str(uuid.uuid4()), content=raw_document, metadata={}) def get_document(self) -> Document: - file_path = self.config.astuner.document_reader.document_path + file_path = self.config.data_generation.document_reader.document_path raw_doc = self.load_document( - file_path, languages=list(self.config.astuner.document_reader.languages) + file_path, languages=list(self.config.data_generation.document_reader.languages) ) return self._parser_document(raw_doc) diff --git a/astuner/task_reader/tracing_reader/__init__.py b/astuner/task_reader/tracing_reader/__init__.py index a5fe61bd..35258b4f 100644 --- a/astuner/task_reader/tracing_reader/__init__.py +++ b/astuner/task_reader/tracing_reader/__init__.py @@ -20,8 +20,6 @@ class Config(TypedDict): class TracingReader(TaskReaderBase): - reader_config: Config - def __init__( self, reader_config, @@ -34,7 +32,7 @@ def __init__( self.reader_config = reader_config.feedback_tracing logger.info( - f"reading tasks from {self.reader_config.get('base_url')}, #filter {len(self.reader_config.get('filters'))}" + f"reading tasks from {self.reader_config.get('base_url')}, #filter {len(self.reader_config.get('filters', []))}" ) self._connector = LocalSqliteConnectorV1(self.reader_config.get("base_url")) filters_config = self.reader_config.get("filters") diff --git a/astuner/utils/config_utils.py b/astuner/utils/config_utils.py index ae3bc0fc..4535d733 100644 --- a/astuner/utils/config_utils.py +++ b/astuner/utils/config_utils.py @@ -208,9 +208,14 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): raise FileNotFoundError(f"Configuration file not found: {exp_base}") ## 0. read yaml & get experiment_name + print(yaml_path) with open(yaml_path, "r") as file: config = yaml.safe_load(file) - exp_name = config.get("astuner").get("experiment_name") + + try: + exp_name = config.get("astuner").get("experiment_name") + except Exception: + raise ValueError(f"Please set astuner field in yaml file. Current yaml:\n{config}") if exp_name is None or exp_name == "read_yaml_name": if exp_name is not None: exp_name = exp_name.replace("|", "-") diff --git a/astuner/utils/env_service_client/env_client_ng.py b/astuner/utils/env_service_client/env_client_ng.py index 6d4dba6f..ad200400 100644 --- a/astuner/utils/env_service_client/env_client_ng.py +++ b/astuner/utils/env_service_client/env_client_ng.py @@ -2,15 +2,17 @@ import os import random -import time import tempfile -import requests - +import time from datetime import datetime from typing import Any, Callable, Dict, List, Optional +import requests + +LOG_PATH = os.environ.get( + "CLIENT_LOG_PATH", os.path.join(tempfile.gettempdir(), "app_logs", "error.out") +) -LOG_PATH = os.environ.get("CLIENT_LOG_PATH", os.path.join(tempfile.gettempdir(), "app_logs", "error.out")) def safe_log(msg: str): try: diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index 54b529e2..4f1505be 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -1 +1,170 @@ -# App World +# AppWorld Training + +This page shows how to prepare the environment and data, build the AgentScope workflow, configure the reward module (Judge), and finally complete the full process from debugging to training in the Appworld scenario. + +## Scenario Overview ++ **Scenario**: A high-fidelity execution environment of 9 day-to-day apps, operable via 457 APIs, populated with digital activities of 106 people living in a simulated world. ++ **Goal**: Train an agent to correctly use APPs and solve the specific tasks. + +## 1. Prepare Dataset and Environment +First, prepare the environment services required by Appworld: + ++ Download and deploy `env_service` ++ Download and deploy `appworld` + +For detailed installation and startup steps, refer to the [EnvService documentation](https://modelscope.github.io/AgentEvolver/tutorial/install/#step-2-setup-env-service-appworld-as-example). + +## 2. Prepare the AgentScope Workflow +The AgentScope workflow code for the Appworld example is located at `tutorial/example_appworld/appworld.py`. + +The code first defines the AgentScope workflow (set the agent's `model` to `astune_proxy`): + +```python +agent = ReActAgent( + name="Qwen", + sys_prompt=first_msg['content'], + model=astune_proxy, # type: ignore + formatter=DashScopeChatFormatter(), + memory=InMemoryMemory(), + toolkit=None, + print_hint_msg=False, +) + +for _ in range(config.astune.rollout.multi_turn.max_steps): + # AgentScope handles the interaction message with the environment + reply_message = await agent(interaction_message) + # env_service protocol: send the model output to the environment as an action + obs, _, terminate, _ = astune_proxy.gym_step( + action={"content": reply_message.content, "role": "assistant"} + ) + # Generate a new interaction message from the environment output + interaction_message = Msg(name="env", content=obs, role="user") + # Check whether to terminate this rollout + if terminate: + break + if astune_proxy.context_overflow: + break +``` + +In this code, `astune_proxy` provides interfaces to interact with the AgentScope runtime environment: + ++ `astune_proxy.gym_step`: simulates the gym interface. It takes an action as input and returns a four-tuple `(observation, reward, terminate_flag, info)`. ++ `astune_proxy.context_overflow`: checks whether the current context window has exceeded the token limit. + + + +## 3. Prepare the Judge (Reward Module) +In `astune/task_judge/env_service_as_judge.py`, we directly send HTTP requests to `env_service` and read the reward signal from the environment. + +You can also refer to this file to implement your own Judge for your specific task. + + + +## 4. Testing and Training +### 4.1 Configure YAML +Copy and modify the key parameters in `tutorial/example_appworld/appworld.yaml`. The parts most relevant to this document are marked with ✨✨✨✨ in the yaml file: + +1. **Read tasks** (corresponding config field: `astune.task_reader`) +2. **Define the workflow** (corresponding config field: `astune.rollout.agentscope_learn_protocol`) + - Example: if the AgentScope workflow is defined in the `ExampleAgentScopeLearnProtocol` class in `tutorial/example_appworld/appworld.py` + - Then set +`astune.rollout.agentscope_learn_protocol = "tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol"` +3. **Define the scoring function** (corresponding config field: `astune.task_judge.judge_protocol`) + - Example: +`astune.task_judge.judge_protocol = "astune.task_judge.env_service_as_judge->EnvServiceJudge"` +4. **Specify the model** (corresponding config field: `astune.model.path`) + +```yaml +astune: + project_name: appworld_astune + experiment_name: "read_yaml_name" + task_judge: + # ✨✨✨✨ Implement and select the evaluation function + judge_protocol: astune.task_judge.env_service_as_judge->EnvServiceJudge + model: + # ✨✨✨✨ Set the model to be trained + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + rollout: + # ✨✨✨✨ Implement and select the Agent + use_agentscope_protocol: True + agentscope_learn_protocol: tutorial.example_appworld.appworld->ExampleAgentScopeLearnProtocol + agentscope_disable_toolcalls: True + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 +``` + +### 4.2 Debugging +```bash +# It is recommended to kill all ray and env_service processes before starting +# ( python launcher.py --kill="python|ray" ) +python launcher.py --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview +``` + +When `--backbone=debug`, the program no longer uses Ray. You can configure VSCode's `launch.json` for convenient breakpoint debugging. Example configuration: + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "program": "launcher.py", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--with-appworld", + "--conf", "xxxx/xxxx/xxxx.yaml" + ], + "env": { + } + } + ] +} +``` + +### 4.3 Start Training +After debugging is complete, simply switch the `backbone` to `trinity` to start formal training: + +```bash +# It is recommended to kill all ray, vllm, and env_service processes before starting +# ( python launcher.py --kill="python|ray|vllm" ) +python launcher.py --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' +``` + +## 5 Reference Result + +
      +image +

      + Training curve (small batch) +

      +
      + +## 6 Case Observation + +### Before tuning: + +1. Keep using api that does not exist +
      +image +
      + +2. Do not learn to follow instruction to get access token +
      +image +
      + +### After tuning: + +1. Look up to api document first, and learn to use effective api +
      +image +
      + +2. Learn to get access token +
      +image +
      diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index edae4f50..ed154ad7 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -1 +1,166 @@ # Math Agent +This page demonstrates how to prepare data, build an Agent and Workflow, set up Rewards, and finally train a Math Agent from scratch. + +## 1. Prepare Dataset +Download the `openai/gsm8k` dataset + +```bash +python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/store/dataset +``` + +## 2. Prepare AgentScope Workflow +See details in `tutorial/example_math_agent/math_agent.py`. You can create new AgentScope Workflow code anywhere in the project. + ++ Define the AgentScope workflow + +```python +self.toolkit = Toolkit() +self.toolkit.register_tool_function(execute_python_code) +self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=astune_proxy, # type: ignore + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), +) +msg = Msg("user", init_messages[0]['content'], role="user") +result = await self.agent.reply(msg, structured_model=FinalResult) +``` + +In the AgentScope Workflow, register any key data needed by the evaluation function. + +```python +astune_proxy.update_judge_input_dictionary(final_answer=final_answer) +``` + + + +## 3. Prepare Reward +Two simple Judges are provided in `astune/task_judge/math_answer_as_judge.py`. You can create new Judge code anywhere in the project. + +Judge input parameters include: + +```python +judge_input_dictionary['env']: env_service external environment (if env_service is used) +judge_input_dictionary['workflow_task']: Task information (if reference answer is included, it can be retrieved from here) +judge_input_dictionary['grouped_steps']: History of every LLM conversation turn (if intermediate processes are important, they can be retrieved from here) +judge_input_dictionary['final_answer']: By default, there is no final_answer. You need to manually call astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the agentscope workflow to register it. +``` + +Judge return values: + ++ raw_reward ++ is_success + +## 4. Start Training +### 4.1 Configure +Copy and modify key parameters in [tutorial/example_math_agent/math_agent.yaml](../tutorial/example_math_agent/math_agent.yaml). The most relevant parts in the yaml file are marked with ✨✨✨✨ symbols. + +1. Read task (corresponds to configuration field `astune.task_reader`) +2. Define Workflow (corresponds to configuration field `astune.rollout.agentscope_learn_protocol`) + - Example: If agentscope workflow is defined in `ExampleMathLear` class of `tutorial/math_agent.py` + - Then set `astune.rollout.agentscope_learn_protocol`=`tutorial.math_agent->ExampleMathLearn` +3. Define scoring function (corresponds to configuration field `astune.task_judge.judge_protocol`) + - Example: If agentscope workflow is defined in `MathAnswerAndLlmAsJudge` class of `astune/task_judge/math_answer_as_judge.py` + - Then set `astune.task_judge.judge_protocol`=`astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge` +4. Specify model (corresponds to configuration field `astune.model.path`) + +```yaml +astune: + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + rollout: + use_agentscope_protocol: True + agentscope_learn_protocol: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ Write and select Agent + task_judge: + # ✨✨✨✨ Write and select evaluation function + judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + model: + # ✨✨✨✨ Set the model to be trained + path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct +``` + + + +### 4.2 Debug +```bash +# It is recommended to kill all ray and env_service processes before starting ( python launcher.py --kill="python|ray" ) +clear && \ +python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview +``` + +When --backbone=debug, the program no longer uses Ray. You can configure vscode's launch.json for convenient breakpoint debugging. launch.json configuration: + +```json +{ + + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "program": "launcher.py", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "xxxx/xxxx/xxxx.yaml" + ], + "env": { + } + }, + ] +} +``` + + + +### 4.3 Start Training +```bash +# It is recommended to kill all ray, vllm, and env_service processes before starting ( python launcher.py --kill="python|ray|vllm" ) +python launcher.py --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +``` + +## 5 Reference Result +
      +image +

      + Training curve +

      +
      + +## Tuning Observation + +Agents are already able to deal with the majority of problems at the begining of the training process, however, small models inevitably produce many answers that does not satisfy standard `` format. In some problems, the agent writes python code to compute the answer but it is so eager to produce answer right away that it immediately guessed an answer and skipped tool_call execution phrase. + + +``` +# bad case 1: forget to print result in python code. +<|im_start|>assistant +To find the height difference between Bella and Anne's sister, let's first determine their heights based on the information provided. +- Anne's height = 80 cm +- Anne is 2 times as tall as her sister, so Anne's sister's height = \( \frac{Anne's\ height}{2} \) +- Bella is 3 times as tall as Anne, so Bella's height = \( 3 \times Anne's\ height \) +We can calculate these values and then determine the height difference between Bella and Anne's sister. + +{"name": "execute_python_code", "arguments": {"code": "anne_height = 80\nsister_height = anne_height / 2\nbella_height = 3 * anne_height\nheight_difference = bella_height - sister_height\nheight_difference"}} +<|im_end|> + +# bad case 2: too impatient to wait for tool execution. +<|im_start|>assistant +To find the number of board members who attended the meeting, let's break down the information given: 1. There are 40 chairs, each with a capacity of 2 people. 2. The total capacity of the chairs is \( 40 \times 2 = 80 \) people. 3. Since the number of board members is the same as the chairs' capacity, there are 80 board members in total. 4. \( \frac{2}{5} \) of the chairs were not occupied, so \( \frac{2}{5} \times 40 = 16 \) chairs were empty. 5. Therefore, \( 40 - 16 = 24 \) chairs were occupied. 6. Each of these 24 chairs was fully occupied by 2 people, meaning \( 24 \times 2 = 48 \) people attended the meeting. Let's confirm this with a Python calculation. + {"name": "execute_python_code", "arguments": {"code": "total_chairs = 40\nchair_capacity = 2\nunoccupied_fraction = 2/5\nunoccupied_chairs = total_chairs * unoccupied_fraction\noccupied_chairs = total_chairs - unoccupied_chairs\nattended_board_members = occupied_chairs * chair_capacity\nattended_board_members"}} + {"name": "generate_response", "arguments": {"response": "The number of board members who did attend the meeting is \(\boxed{48}\)."}} + +<|im_end|> +``` + +However, tuning resolves these issues, as shown in the example below: + + +image +image + + + diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index b552ca96..1eac0e2e 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -64,7 +64,7 @@ This section corresponds to tutorial/example_werewolves/werewolves.yaml. You can copy and modify the key parameters in that file. The parts most relevant to this document are marked with ✨✨✨✨ in the YAML. The key configuration items are as follows: ```yaml -astune: +astuner: task_reader: # random seed to shuffle players type: random_dummy @@ -168,5 +168,3 @@ For example: The training process of Qwen2-14B is more robust than Qwen2-7B

      - - diff --git a/pyproject.toml b/pyproject.toml index fc133723..2259df3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,8 @@ dependencies = [ "agentscope>=1.0.7", "trinity-rft>=0.3.3", "loguru", + "debugpy", + "modelscope>=1.18.1", "pydantic", "beast_logger", ] diff --git a/tests/data_gen.py b/tests/data_gen.py index 65439513..63f38651 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -1,8 +1,7 @@ +import random import unittest import dotenv - -dotenv.load_dotenv() from loguru import logger from astuner.data_generator.knowledge_augmentation import KnowledgeAugmentor @@ -11,6 +10,8 @@ from astuner.task_reader.document_reader.doc_reader import DocReader from astuner.utils.config_utils import read_astune_config +dotenv.load_dotenv() + class TestConfigUtils(unittest.TestCase): def test_data_gen_main(self): @@ -18,27 +19,28 @@ def test_data_gen_main(self): config = read_astune_config("tests/data_gen.yaml") task_reader = TaskReaderRouterV2( - reader_type=config.astuner.data_generator.reader.type, - reader_config=config.astuner.data_generator.reader, + reader_type=config.task_reader.data_generation.query_reader.type, + reader_config=config.task_reader.data_generation.query_reader, ) Tasks = task_reader.get_training_tasks() - Tasks = Tasks[:5] + task_num = config.task_reader.data_generation.task_num document_reader = DocReader(config) doc = document_reader.get_document() - gene_tasks = [] + gen_tasks = [] # generate task # 1. Task Augmentation task_augmentor = TaskAugmentor(config) print("-Task Augmentation Start") - for i, task in enumerate(Tasks): - result = task_augmentor.generate_task(source_task=task, document=doc) - gene_tasks.extend([result] if not isinstance(result, list) else result) + for _ in range(task_num): + source_task = random.choice(Tasks) + result = task_augmentor.generate_task(source_task=source_task, document=doc) + gen_tasks.extend([result] if not isinstance(result, list) else result) print("-Task Augmentation End") # 2. Knowledge Augmentation knowledge_augmentor = KnowledgeAugmentor(config) print("-Knowledge Augmentation Start") - gene_tasks.extend(knowledge_augmentor.generate_task(source_task=None, document=doc)) + gen_tasks.extend(knowledge_augmentor.generate_task(source_task=None, document=doc)) print("-Knowledge Augmentation End") except Exception as e: logger.exception("Data generation failed.") diff --git a/tests/data_gen.yaml b/tests/data_gen.yaml index 44bf6b86..a213d091 100644 --- a/tests/data_gen.yaml +++ b/tests/data_gen.yaml @@ -1,19 +1,19 @@ astuner: - document_reader: - document_path: 'dataset/document/Anti-Money Laundering and Counter-Terrorist Financing Ordinance.pdf' - languages: - - eng - - data_generator: - reader: - type: dataset_file # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` - dataset_file: - training: - file_path: 'dataset/jsonl/finQA.jsonl' - - llm_model: qwen-long - llm_response_length: 8192 - sampling_params: - temperature: 0 - knowledge_augmentor: - n: 10 # 文档生成query 的数量 + task_reader: + data_generation: + document_reader: + document_path: 'dataset/document/Anti-Money Laundering and Counter-Terrorist Financing Ordinance.pdf' + languages: + - eng + query_reader: + type: dataset_file # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + dataset_file: + training: + file_path: 'dataset/jsonl/finQA.jsonl' + task_num: 10 + llm_model: qwen-long + llm_response_length: 8192 + sampling_params: + temperature: 0 + knowledge_augmentor: + n: 10 # 文档生成query 的数量 diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index 4416286a..0343dbbe 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -1,9 +1,10 @@ import json from pathlib import Path -from typing import List +from typing import Iterable, List import pytest +from astuner.data_generator.filters.base import Filter from astuner.schema.task import Task from astuner.task_reader.tracing_reader import TracingReader @@ -20,12 +21,12 @@ def load_tasks_from_conversation( return self._tasks -class DummyFilter: +class DummyFilter(Filter): def __init__(self, kept: List[Task]): self._kept = kept self.last_input: List[Task] | None = None - def filter(self, tasks: List[Task]) -> List[Task]: + def filter(self, tasks: Iterable[Task]) -> List[Task]: self.last_input = list(tasks) return self._kept diff --git a/tutorial/example_werewolves/game.py b/tutorial/example_werewolves/game.py index 40cd30d1..10246c32 100644 --- a/tutorial/example_werewolves/game.py +++ b/tutorial/example_werewolves/game.py @@ -26,8 +26,13 @@ names_to_str, ) + +class BadGuyException(Exception): + ... + + moderator = EchoAgent() -moderator.set_console_output_enabled(False) +# moderator.set_console_output_enabled(False) async def hunter_stage( @@ -46,7 +51,7 @@ async def hunter_stage( return None -async def werewolves_game(agents: list[ReActAgent], roles) -> bool: +async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # noqa: C901 """The main entry of the werewolf game Args: @@ -99,49 +104,54 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: ) killed_player, poisoned_player, shot_player = None, None, None - # Werewolves discuss - async with MsgHub( - players.werewolves, - enable_auto_broadcast=True, - announcement=await moderator( - Prompts.to_wolves_discussion.format( - names_to_str(players.werewolves), - names_to_str(players.current_alive), - ), - ), - name="werewolves", - ) as werewolves_hub: - # Discussion - n_werewolves = len(players.werewolves) - for _ in range(1, MAX_DISCUSSION_ROUND * n_werewolves + 1): - res = await players.werewolves[_ % n_werewolves]( - structured_model=DiscussionModel, - ) - if _ % n_werewolves == 0 and res.metadata.get( - "reach_agreement", - ): - break - - # Werewolves vote - # Disable auto broadcast to avoid following other's votes - werewolves_hub.set_auto_broadcast(False) - msgs_vote = await fanout_pipeline( + try: + # Werewolves discuss + async with MsgHub( players.werewolves, - msg=await moderator(content=Prompts.to_wolves_vote), - structured_model=get_vote_model(players.current_alive), - enable_gather=False, - ) - killed_player, votes = majority_vote( - [_.metadata.get("vote") for _ in msgs_vote], - ) - # Postpone the broadcast of voting - await werewolves_hub.broadcast( - [ - *msgs_vote, - await moderator( - Prompts.to_wolves_res.format(votes, killed_player), + enable_auto_broadcast=True, + announcement=await moderator( + Prompts.to_wolves_discussion.format( + names_to_str(players.werewolves), + names_to_str(players.current_alive), ), - ], + ), + name="werewolves", + ) as werewolves_hub: + # Discussion + n_werewolves = len(players.werewolves) + for _ in range(1, MAX_DISCUSSION_ROUND * n_werewolves + 1): + res = await players.werewolves[_ % n_werewolves]( + structured_model=DiscussionModel, + ) + if _ % n_werewolves == 0 and res.metadata.get( + "reach_agreement", + ): + break + + # Werewolves vote + # Disable auto broadcast to avoid following other's votes + werewolves_hub.set_auto_broadcast(False) + msgs_vote = await fanout_pipeline( + players.werewolves, + msg=await moderator(content=Prompts.to_wolves_vote), + structured_model=get_vote_model(players.current_alive), + enable_gather=False, + ) + killed_player, votes = majority_vote( + [_.metadata.get("vote") for _ in msgs_vote], + ) + # Postpone the broadcast of voting + await werewolves_hub.broadcast( + [ + *msgs_vote, + await moderator( + Prompts.to_wolves_res.format(votes, killed_player), + ), + ], + ) + except Exception as e: + raise BadGuyException( + f"Werewolves failed to make a decision: {e}", ) # Witch's turn diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index fac3a135..0c0cebff 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -3,6 +3,7 @@ """The main entry point for the werewolf game.""" +import os import dotenv import numpy as np @@ -12,12 +13,12 @@ from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeMultiAgentFormatter, OpenAIMultiAgentFormatter -from agentscope.model import OpenAIChatModel +from agentscope.model import DashScopeChatModel, OpenAIChatModel from loguru import logger -from pydantic import Field +from pydantic import BaseModel, Field from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask -from tutorial.example_werewolves.game import werewolves_game +from tutorial.example_werewolves.game import BadGuyException, werewolves_game def get_official_agent_prompt(name) -> str: @@ -82,7 +83,7 @@ def get_official_agent_prompt(name) -> str: class ExampleWerewolves(Workflow): trainer: str = Field(default="astuner-trinity") trainable_targets: list = Field( - default=["seer", "witch"], description="List of agents to be fine-tuned." + default=["werewolf"], description="List of agents to be fine-tuned." ) async def agentscope_execute( @@ -104,16 +105,12 @@ async def agentscope_execute( players = [] for i, role in enumerate(roles): default_model = OpenAIChatModel( - model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-30B-A3B-Instruct-2507", + model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-235B-A22B-Instruct-2507/", stream=False, client_args={"base_url": "http://22.17.52.4:2888/v1"}, api_key="no_api_key", + generate_kwargs={"temperature": 0.01}, ) - # default_model = DashScopeChatModel( - # model_name="qwen-max", - # api_key=os.environ.get("DASHSCOPE_API_KEY", "your-dashscope-api-key"), - # stream=False - # ) agent = ReActAgent( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), @@ -121,8 +118,9 @@ async def agentscope_execute( formatter=DashScopeMultiAgentFormatter() if role in self.trainable_targets else OpenAIMultiAgentFormatter(), + max_iters=3 if role in self.trainable_targets else 5, ) - agent.set_console_output_enabled(False) + # agent.set_console_output_enabled(False) players += [agent] # reward condition @@ -135,14 +133,19 @@ async def agentscope_execute( ): raw_reward = 1 is_success = True - # check logger.warning(f"Raw reward: {raw_reward}") logger.warning(f"Is success: {is_success}") + except BadGuyException as e: + logger.bind(exception=True).exception( + f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent)." + ) + raw_reward = -0.1 + is_success = False except Exception as e: logger.bind(exception=True).exception( f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent)." ) - raw_reward = 0.0 + raw_reward = -0.1 is_success = False return WorkflowOutput(reward=raw_reward, is_success=is_success) diff --git a/tutorial/example_werewolves/utils.py b/tutorial/example_werewolves/utils.py index faecfb3d..c9dd0039 100644 --- a/tutorial/example_werewolves/utils.py +++ b/tutorial/example_werewolves/utils.py @@ -11,7 +11,7 @@ # MAX_GAME_ROUND = 30 # MAX_DISCUSSION_ROUND = 3 -MAX_GAME_ROUND = 10 +MAX_GAME_ROUND = 7 MAX_DISCUSSION_ROUND = 2 diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index d6023f72..f652bd31 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -1,47 +1,67 @@ -# ------------------ 主要配置 ------------------ +# ------------------ main config ------------------ astuner: project_name: example_werewolves task_reader: type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` task_judge: - # ✨✨✨✨ 编写并选择评价函数 + # ✨✨✨✨ select evaluation function judge_protocol: null model: - # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + # ✨✨✨✨ select model to be trained + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + rollout: - use_agentscope_protocol: True - agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - num_repeat: 4 - max_env_worker: 64 + # the path to the workflow class + agentscope_learn_protocol: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ select agent + temperature: 0.7 + + max_env_worker: 64 + + num_repeat: 6 + agent_madness_reward: 0.0 - tensor_model_parallel_size: 4 - max_num_seqs: 128 + + tensor_model_parallel_size: 1 + + # the number of vllm engines, number of gpus for infer is `n_vllm_engine*tensor_model_parallel_size`, this argument is NOT effective when NOT using trinity + n_vllm_engine: 8 + + max_num_seqs: 40 + + # monitor LLM's abormal behaviors during rollout compute_madness_checklist: - "nonsense" - max_response_length_in_one_turn: 2048 - max_model_len: 16000 + + max_response_length_in_one_turn: 1024 + + max_model_len: 22000 + + multi_turn: + # expected steps for each task run, used to calculate the training batch size for trinity, do not have to be precise + expected_steps: 3 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 data: - max_prompt_length: 3000 - max_response_length: 13000 - train_batch_size: 16 + train_batch_size: 32 + max_prompt_length: 4000 + max_response_length: 18000 trainer_common: - save_freq: 99999 + save_freq: 5 test_freq: 99999 total_epochs: 99999 - val_before_train: False + total_training_steps: 25 + nnodes: 2 + n_gpus_per_node: 8 -# ------------------ 不需要修改 ------------------ +# ------------------ do not edit ------------------ hydra: searchpath: - file://astuner/default_config @@ -49,10 +69,10 @@ hydra: - file://external/verl/verl/trainer/config # verl only - file://astuner/default_config/trinity # trinity only -# ------------------ 不需要修改 ------------------ +# ------------------ do not edit ------------------ defaults: - - ppo_trainer # verl inherit 1/2 - - verl_default # verl inherit 2/2 + - ppo_trainer # verl inherit 1/2 + - verl_default # verl inherit 2/2 - trinity_default # trinity inherit 1/1 - astune_default - _self_ From 8e5b7af9d2c1cc9928be26d6879a13af37905489 Mon Sep 17 00:00:00 2001 From: binary-husky <96192199+binary-husky@users.noreply.github.com> Date: Thu, 4 Dec 2025 02:53:01 +0800 Subject: [PATCH 232/462] Align math & add swanlab trinity compat (#6) * rpg werewolves yaml update * werewolf expected_steps=3 (there are 3 werewolves, meaning usually 3 samples are generated per run) * for no-eos message, pad eos but loss_mask=0 * align math * add swanlab --- README.md | 2 +- astuner/backbone/common_warm_up.py | 2 + astuner/backbone/trinity_compat_workflow.py | 125 ++++++++++++++++++ .../agentscope_tracker/multiagent_tracking.py | 89 +++++++------ .../agentscope_tracker/timeline_merging.py | 35 ++--- astuner/context_tracker/basic_tracker.py | 100 +++++++++----- astuner/context_tracker/tracker_base_attr.py | 112 +++++++++++++--- .../config_auto_convertion_trinity.jsonc | 1 + .../trinity/trinity_default.yaml | 21 ++- astuner/main_trinity.py | 4 - astuner/schema/extended_msg.py | 63 ++++++--- astuner/task_reader/__init__.py | 8 +- astuner/task_runner/classic_runner.py | 1 - astuner/utils/config_utils.py | 3 + astuner/utils/core_env_vars.py | 2 +- .../utils/env_service_client/env_client_ng.py | 27 ++-- pyproject.toml | 1 + tutorial/example_math_agent/math_agent.yaml | 22 +-- 18 files changed, 449 insertions(+), 169 deletions(-) diff --git a/README.md b/README.md index 045d9f93..82e29a05 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ We recommend using `uv` for dependency management, though `conda` is also suppor uv pip install -r scripts/requirements_trinity.txt -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --prerelease=allow # for conda, remove `--prerelease=allow` option uv pip install -e external/trinity -i https://mirrors.aliyun.com/pypi/simple/ --no-deps uv pip install agentscope==1.0.7 -i https://mirrors.aliyun.com/pypi/simple/ - uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation # Install flash attention (must be executed at last) + uv pip install --verbose flash-attn ring-flash-attn -i https://mirrors.aliyun.com/pypi/simple/ --no-deps --no-build-isolation --no-cache # Install flash attention (must be executed at last) ```

      -au%_pl%aieW(90;jMp5-TVi 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�dcpTAV+Vuzl zAHlP(e9>so3l90^JrJH(<=njpxX2sa-{LH$`A=2l{x{DCH*f%c1j0bE* zd#a0tP7@s~Cq30WSSn*kVcG~1DTYBe7(2rQ@5LSkv(s9xlV1QKcQmUA>y{A|v#}7x zAEmbi;z|_MeqH+rMV<3TLYcNIwH;J2UhDBE7a)=Wh#5B1I=uropbWC_EU#n38Bieh zrhX;LEu>u_(#0jZqCk#g>@Ki-BO6ev+qckoV``V`CWYc1H*-LkA$fWbzCbcci0Q|O zlxSPUs6fLaqWe!2a{u{|8R4!ofB+C8m8Rt(0Y#B@68k?=pVa=ZTOjunp0kPlU(@y2 z0l)x@pT_L5`_ELMOPV5`b zA^M-ysm5O092wZT?f0H*92q|1!6u@~`DBYv8a~^&RF1UoEVa++)?4iH$D1sc&$qZ- zI^nq35ze^YvX4LHWZ87e#YOWu$7P@Xq(e5)Ipq#7lE#SO?OBZkTMQ;_8t}gVc}Iyz zYeXMP2g-c)ps@wGcv2H_9%WoF@c!^3KS4rFg|s3_YK{h~jt1+FPOUr|pgnpXNC14+ zoM6#gJBD6dtKXTrH?unBH!5p4x0($C^boilJyy&Uu@gM=U_BosfDeKE$* zEZ6=$!1n*K|7z^3KZd`~$)7)5d-@e&yZWaeN!yhZ0-Ie`BU{xCP^%iFa;s*xt8;F< z$_S-m#=9#yUyv4FA#QCSRE1YqMGr+VLiU<|16Dr5c?AGB>*euWs*l?!vVyXYqcWj@ zzhq>DQW>EXK_>{R)?LKtVrr#mS~Ehaj8JNz#4S9SK36QDBgyb*fKVz6UJuzhgwDb^ zavs1&sfc-THiGNs%6N=cOCcNVGKk)jUWpZ-VUduiGcbR4KMH_F&t3$Z#XTIvLYFKG zg9YBp!P%usY!k56!t@P)8^Y`14+IxE)Y)Y!4LCCmr0{BCPUti_eN?MeYLmI83JN)> zG@%EmH*(+N1N>W@iA)Pb0D#y-y^Mwm`qxA_IA6i*D`-Hsyuvb#hh8g3MKrM1CIJQ} zQ7jdKhMm!NL^!x+5Z2D{aB$PM^M>xYT8NwQvEkrI-PT+T4+pm`r`H?|3$X|X2d2BJ zsfwLUF3t>7D~14yQJnfA?-A>J?{oMQI?DPR|J~pV_@C6D{)h;+`io{9Y^4Dp%noc# zHKRz0tW&uKp1okJwI%2F)Lr{QwA9?Y*RmhqFxMMK8$P_pOz{c@TY>cKKji!WoBw+3 zNAvhA`;+xR)&p4&yy`vhy~5MC#VPlPpU6|r@&e6qRm;?af`&jBEsQiEz-YQ-8?F_a ziW)hVANpb7sfEx99b2{Z(97d=T1ebG4-%qdIs0=FH6e%Ho~v!N&Mk z=#)Ei-fhlFyxU6AjcC1jw>CYsbJuPbZY@Ri*<0-x@UD>Jjq#fmpt#Y^VG1CmB4n0S zf6)KI;j2>4O*J>^N}$@L4g@b2Ie~@6LLsUF^EGz>zc4uUlg}`?wJN*CkVu+>2vk}% zkHE!%e9FX7y8yW)zP=K;`if8urgP4lIYiAe>5H;j_B0RPFA z;L6H63INv1F8qn{T67Opl+&cz@{Nu0Q$-e=L&i1p+ju#C8`&y2^(q(?UX1BI;6`Z= zG3fsK&prK7oV0+Z{!MTyzy7tizvik=K?MzQLAOK8HZ}V=Q{7pCre3&ddaid9Q4jW1 zv3$E}Za-dbddU&mwIg3V^9Cu@{8@1n3{_U$S_Gj(u>49(WJ^eAUKmUds z<93IR8>qnRRuMgK1gfq3YQfV2-7Dzu-cbn;z={mTf%?)7E#s{0&+~5U=4$idmcJOz zJveAB-M!OnmHcEs=-Hnk4nqdsf=md$fXY7PK?su&GF1)R8h~lQVvE;NadWG|EY{$s zEpI}iChi;T81xBJ>rxagHtI4l%dbZ2ajO_Mz$UOJ^QVtHX;_ifslqUnNlST7@c+@H z*8cVbTovqDwe=J1#EMm`@4WH!tE7XN ze&;{?1-bGpLNbGl0foEb1h#$L%5%F`YUadr-kq4v)}C}CZ|{VIx@XaHFfq1W-YyAS z57f_zm9?GPgCR12Nplmg0TWOw)&<))SUJIyL8$tNtCihmDH1fC{6K8QM@f9FOvgKI z&r`97gOZwaEWi8iySaI?!GhWPYHooyc)+|Q+de(LEw*|<+2{V*lXzdhjtxgoibQ(6 zw(v}x7OBs0EO?|Si4OtV@wsZbAAbAy*!ake5QR{yj3igtkTp6ou)$G?)V&H*a8u9V@Rxs3PlcZs81KtS0UgYX;)9& zzMqE&xR^XNdIZ#?A=XU{&h_|&f1k+^#I)g=fh2OiCTS+*h)&4afh2;&KqMTEz+hnW zNAcpOGcltu$S4dxZ(bmBWp;|?@nIMRMT9hPu`rX=E1&=@R4M@et3UyQ zK*JCe2=XyI1_fKiU`9I*VbMWUoZ$JHO!eISdo3Yuf3zYu20F|?1u+9Jsp9?xOHt%QkV=@WL zY#4yy2!2d=?7iB;!-Z+Dw7Goy_T1tP8ueaf}+g58vR?SeupIBk|O^Tw4N#rw>hu5 ziyw7G=|*0loJ-z*u|xy~_#}4;l2AQ@V?|iM41GvOZNctY=Ze~51VI;@yl`O>&Hyaq z;>j@kKSWN)$SYo81n%+ne@=a3`@aTbf0zAV(_;I-GHKeTYZ4v6sP=!BxBH9F2-|sm zda(G+_Wv)wIfnnTKUoiCJ&^T4)&p4&e6D)nclV#ZBdo`N@=Gxsgyly;WLl0NDwa~P z{6Y}uj^aiIHB@Xr&~@8(108s?re*{-SX6DtwOmAqh6D=Xb*PZep7r?7%Ke@Diw_>y z)wRb{<%SnFS2wp76P;sbJqCta4QOm-kZO75dJ9-$EkKIl>d@Ag9v&T$A~jJzC!H4K zb6sBouizCC2-fgQ)$14A=9!$LUsIfGChIqm#c|eSWBJa?{7R{~*IM(82a9g&_N|-7 ztz^Kut;ZiV8V4nWRFu8i4x5f|;nq~HRPYNB7(muITi+>`2<@R+1>)Q;h}>XzMe`_B zp+weSAg1AGU`N!VP2fMoQEyYbUVR7Ow~D*4_zEgWz(xR54vEoL0*OFw6z_mgIs8f} z4qHfkCHHZqbl_E^U&ZYW!|2!>`3 zzQa`x=5GS9l`knLvXFE6_3Cbs0B&KSrVOG-OvvyjzvQAJX_A6-{suj{!a_FpZ#AvKj!}b=HD8_f7zd`2eKZ>df=t?z>~43KQ2u7 z|M+L5>E4D5F6{NLX=uJM!0C%O5hfhP;)&qP<7igEZcE> zvlE6dGu@v*)BUsu%sG~jrw@QqUG(_I0$gk+kB1|yxKk9%gKb%g~>`>H(CI# ztL2EIeiKfva6fGjrX5{L=zIC4e38TLfyD26wMZCn>|P5@JBF#_>jk}}tS57#N&#*? zUKr-=+$LF#;FZhl86?w-EITS4r*^thqkb|qOZBj3RRNLLp!*am=YuC< zR}gC50BE0Ii@Y7&iCW@X22&v+I3Vs^GKkO1u13cL1(2w^somEmCYU?)YCJTRG9Cle z5VxN8@WiPRdY;SWkXFtoim8rMw}+=Yb=RGiM*adae=p}yM7W7x;%SijQu2_mu;&#Z z+`WMK(Pd;RO(xVlJ;12iMp>WCO-w8`OFmjhNqJynjQO~!D>M_t1vdqIF4C5x2)%O! zaE^QM(dJn#e7`y)V|ksx#7`4j(1FvBxHqF|aT^$EAV(H6beRMd=&G7PVPMn&Ox2@9 z)npt2{%E5-fVQ>B%;Q6R2-FCWaIO*>is~AU7P)@p*-G24_FMq~M4&z`wD&QTqlM}Z ztmr7A`gRtlpIPibZ*lsddJF*ZLTIwN`c|by>MtC^6sg~_n_z#n!O4Jwy9tF_$Kf(D zVT=6{+vv#-8s1^k9suxhJ=XrO=|v{%H&)2vYVUN@d^#u0F+xF@~ z!+P|nc*iWxwH`hy9=JER=92;IwnyGR2yv4aSex|{S5IaEWHMfz$^8?w+lT>ZFwvLboGad~v@-G55=mJQ~e1((N7qTRtu; z-8fW}?qSFhk*EpE6XC)#vsGC#w zi?iiv>;B{UyPMX|YSStV#wh4jHj;NqrmKCSx>}sE&m8UwN3){A)KX&%Zi?|3M7w%fV@6QH}d#j7n*2?s)wR>#up&s0NQSAi<;sUfj<$%f$dBaO@CDSK(QZTX=wu3UhN6az33D z-nigRqmSa`V404p(7zYh5t^bT3EznN)YA>;Z^k1<4yZ9&QrnWFxrZa32gjs2+rI7B+k`rNR#W%`6(W zjjk1k;$}?fwTNb0n5z-qSld%vMkvFg1q$&aOdSDmzf~y)QOwSr=IcHjFCn^lH!o%6 zN3E!QwYuA^Lu`iV9eJhkYmHhnLUgk*5>aq-VpskI(b>W-MC<`%a-x5(jjvRIyS59r zba>0u!Joh`6wJLqjsdg^V<|c98_?!XkJkn3tHk06n@CzA_kegis9#JLX3r948ym4I z+{1$7rHp@tYX^CDz^6bZ7l)Z55!VN?4}YBB#Kbl7(Mby8eXCJ}2R?iJbnXGul`EjG}Ka$%(ysncS05J~uq`gs~w(xC`E)H!6~j3IoImh)0ILs?6f`fy_o-gU z!L`KVsQ{3_iHSM6+foWjn{*QWf*HwbUnAL+(Pnv|ET&5lek`Iar zr<})Jg|r(=iq--L4sw@jVSzV*slf5L5pP? zZe$r2*@ophmN*6ZDkB)=8R7unmqDi?R&a>jU_73#`JEEYw2gA|fPPPY!CUeX!aU5q zn~Udr`y8Ym5L05KO#PA{A`2WEs**1l@I)m7l4IciIW_IYDU1D;@n#)tv^4ZQ z2l9;ykT8LMp__KRv$vlact*e!bn`cuN;;(z@K82}#Xnq``< zS_pI%t`+L3lqk4pm%Ik9v6B$E@YCGK%ZpPhE3?ao@;jq6mZ6TZ_Y<1rfb zVxzS5sD7)yTCCrnZQggbmz&0&%;5qg@wJEmwn*voQUbtnLc8`rRsWS_zydwk3~RT{ zJ1t{vCaStOOn<5tCT0_etTp_S_{ZQzC58A*1q82;7BIk0rUF7IKC^j^rLYr><@BB4 z_Vx{1yScimKiHl#SJ&NOZy_1W6Pv&`Uc}vhZ0w!i{Ef}0KS}$c`t|RFPT@6jKm!(r zX#`*b4onKr8hJnDixjIzVpsl^k3YWMv;WblMAybzGFP z(I=h%=V}CE}>t9Quq2CXg6TnDAw~pPib6V zfr^)ZgWeKfHmk73Bx%BaC@~}?82Jdg0mHut^+m4&fG+xOe+7VRuP+V0|C6Xcs=60? z73hzKD16VF#y3{^^1r0>m7#694y|weP^i}k3tcFRxw)UQ>bG4N4$PBPy~ir%loD2` zf2He7q5y7xj5fUl9WZy;XRQV1N{pfh#s`o*a;ben>Vj#nD2B9i4ABNtB2ouavOfA? z&Vv-fcz<}2wi-&9R{D}k`1CsAeoEm!THyg|VeYejis6wD5}DIb-EgeVWeMdZ%HfVo zV`v-OA+gEo&2nYI#gj4 zk*-XZSvn(0a3lRUEV9R2^`+h@)>9#m#bu6Gj{3*K!*@ z#{W#x>vS{daszmIk{)D!atBBO;LwCg&l_QP86x^4vD7kP)K9KV7@|u+jzgvyYTH)< zfQ$a1=Y#M6jQ{_-KZgIZKUojFfFAgxpMLt&!bAPP{8)OZ!=xIzp%Ecy-HCKNJe6@Z z^H9$`)MMAL&w+<}c4ugZ1jO! zqxq``h#Dh6J6!x`1z90)EP|mygabfH1yD{VV`xOBD#0TV14oD$h$=kI;+=?`&M{EADa6y>b)BdM2|G0vM|6=x`e1Ztgh4_7$9DW9 zfC~=e|8piCOV6uDL9unZ+9NIt2Ku~5u~zN-bxh#GsYzXMk^lhP0J&cm{-0*yWA^`7 zCJ|_2=%5HpXV&4?QU)B-(MY#{$8y)-cysvu|MfSYjD6+5#$VZ=tOv3l$a>(j?}6|A z?9-nW9{E3*mmc}Hqc}le`vnc~|A0IU3Yuz%zEy}+N7o(C(skW4HC1u-0>BJ3%XbwU z-l`se5G>C%J75jYo=5)OJMKd}yz!vAwl%k8-?r-YwWT}zgWUi!2*eizfrt~`9tM&W zhfvJVKbmQ-n8vN>_DXH#{>_;O`fQ`^x6$R1zcId81n>cg2g6&3y2FbvE`vBIp@EaTBvA>P%xX~Ozh7DQf2=a0qLHZ7EHo-v@ zLKD0{=pb)4ea&{5(d&c7_V3I-{TZB(03H0^nl!3(!}uI$R5>%CgIQ$LO98imDDlD~ zn??W*yg6I8_7|dtv0T45(|B}afBoUk8b#Vmi#J6-Q3OzofRaSOtvy(oZ%xn5-L4oJr4hW z?2pI3^grXTv-anAEcQ&rol4<;;*GLEs`ASe@3J5Q2Aj5MNpuh*$GplL|L~HDJ1#zEbN=Bke;@6p&==7k zTma^PXd0#W7+Nj|+A^=Wdo9J1Orx2A(s55*ikAv^iJU{1uO#cGy;SJ_B{l%6fB=$5 zKtHoqQ^yI-KiKIiTp^kU^qAXI!lyKB-Y!(iq3loDF_>L6Zt1BhN)lsB?-I^mu0i{G zGG)^rh*oxw+L8yYm%u)-Uswpa=NDcAhOF=eJ zp*XlixC#we9)lc}^Zr4;64R#Bu8GZ%-*TIPA(SUNaXgPBU-%_W;yll|H~?l)j_>hm z$)|JUU?EV^VN!_zo36AHgekt|3uq%@34!se zRPAeQVKU?Kqy88e-_xEvgs|}U-gcK4>(N84;p4@y zukz#F5EK4t4$FaS%4-5S;d^XYv<^uO=q!VzkPEqen9}G=todJ9_ zSeJyfTypXO^js4YL8at_Q4+?`t`8XOPJr~Grtjr0iO(;i<_`V7Pf`KBr^3;|BqORf zexI0#_PwBigUICC1KAG!jOI`;L;FU_S`f~-@6p7AcxbpiJQVaA{ne9#vG8QB=pEkE z)72$`fW;JKMf!b_6fBnb66@WO!U%E{ zlZz@lF`+r_A>{`1o{Pq%<{lcjQI2;$$Oy&40VHNBFodB2$3Dyfod0&$czjSbo!vQWJ0--P6V2XdD+2vnzZ5&;DwuKxn8^#uXM~c z{z5J%`9)7A?}=&Bl>v3xyU8vf7YU|!GBD^Uth;x4xeFz7d)3mS6Kj-H@KqwUsIT!j z=hOAVB2G3VKpxWBMkmT%l;`D>-=?NxX_nDu6A8Lo5ubUfJoADI6(97=N3>6zv8j)c zx~I?H<5}KOUEVU=8xggVEz)3=|z`O)it_1eGq@?U=G|9Y9KfM2aW@o;kg`rGcp z+|uLn+{4AX_h57TVPv&-*6mvD*{=C36_Wkal*M#wzFFDAJ*66z!6SuJn1xjcbFuAX z3vw5otyK>ej8>G3A#{7Vb<+lu)JLQ`;1jd!`Yuic9Hl4=NZjJe%5~uf^hr7wT^w4t z!?dDkhs`iJiSQ$Eu<2y)SA@tpzNh}m&p!DU`t(;l*Dgfia?6^z+kAL%=V8#e)wJz} z=o$MI^+Y60!s99TNs`~wqC(7GOuK6bfi-psK5Y2JlY6qE93^*X!Ln5s9G!_DjF78t(e%t6(`Y6ABO;R_$xG!@ z@;lnz)+|Y2=5{DYd{J3SwKA>A6zsTpQQUj z^G(959<@VFQytWyfBUT`zlaX~eciRT*S5pGXl1Jq*~=|M+jJi68*532j-;!@BJLLf zyPHzsfgzRScpYwmcGvF7fhGDHJ!H#Y|x3}F!WHB!Yla#Gj96gw&Pc+;^}l~gyZ z8n`D7t_hm4G?}IitTZoTe(?*e9!sy+wg!i&GR*I%80?3<;uf)Fy@5LG8#* z?LnpCfhwKqF$Ml^%A+V-O4g=WCDS$xvv|a9NSBAaIizzsW&T}(`Iqutp|zfRo-zxQ z+C^5GrC}0SQ(e&6UI8XXCyMt%${CF$QFmn3 z0en_WTZ1o)qBusu!aigDk8@ zcljPtib-$ljjpFQ^`#VG;(1Lomv8#*+$TCFS~`#TYgw<3YQ7hXMyZ_R^gQH!O6jcO zMj6QbV*bP}7nSAWt|s}{8`KUVM0I}gOcE7aZ3k_H-Dq8BU+MP7~*ao`-pTVMbSt{{FX?`Yob&6u_CSjUeybV4W{#;;+U2bxa0|g zC*1?rpzEq(|03sJQK3t`z=^GsZu~gN`*3Bpzr;bA`jo0fU-f6$qXp4niP0XA;&rcqLjk25)@iWW? z?1xb!{yqK0RdTYY`NJ=<|DdBuwaS8Pe0!7Sy^jll$fPr!K$IUrnsTn0)}&@=gEo<0 z`O1@TlKB1&x4+r@88;EEK<>X6;8A}nX&v3cHt&JmvHE0#r1kr5f3&2eI}+*q6w>;$ z(LG=iG2g=|(t3<5I2;NfwmZ-r0I~n0iS43i)q(e*x4-bmV_zJ*H}<1H_{xnRSslCg z<=4LW=WjV*_~SQz_{QH%Z8ym0GY>#C;ye7&%hXogTZBe6O0h=`HA(A-=)-3teb+ z7wlIeu_j$5De)aREy8l$s?>IfF6II@$#zE27a(sHnM3v|M=hLVjXKKMD5F}jjsSvX z*!Fr9h4B#y-$#$#CZm011O)(pN&Egiy0fU)a?|oo9WPHP^+_hKcN|Ky@}anj$VStC zp1v=TZlBmg#Fwcft@G=2S5Ow{r9^FQ;&@k{UQ`E2i&BjIv5A&{CnGT2O}VA-uq70R2D?39I7XcA9{@x$WH23sCO{TKs0_9i(+IHz%~P=L8vK4Aqw13 z_mpFG2HmG+JX-m9jqq%l;QK-HjweH2t_z+EP{*Qa;;4<2p~dl!Np3J8%1N0|XF>}D z_tQ!ZTsXM?p-kv+4Rkw}P5cOhk(3|@3JFtRy+@0TQ&V;#d%mv4XL4LL21M30nOQ>8 zZ+|noln?!pPLALMPbBZjCY?w-?u{+`#>{~=x47Wii_?vJ>zmEl>7{4ecD6Vxc|0^u*WLVXoD3@4>>N4C$&)S)@F-u}57{N$EjG{H82I-jdmZ z(oburD$hqrXH4R@JE)V##$Nj|AqD9Vr>3{JXUrX=u;bpDnZDPWel%BnwoYE@?9*Hw z?l@9|xlBUtCb-9-C)#XAyV%sw{k2f+*zMjCUIwh!h)qkXeuTKfQ%OOXbH=3Y8iTsy zSMEM3(44#Fn&y4?@eI_Di&0^ITl@dndlT?Bt22MpajbpIp0KnPCXj{1XkXk0h_?hM z4#9B}$GA10q))bDOL8R3juQf8-@LEclXjT?dnwaU=%3qmD8uyj_Mx=Hzr#?5GM!$^ z@bC2Y=}@LmFGDG1?(aR{BFUD#C843nPx4y+biT8^=RN1V=Uu%ub?&uI8)bA{4KBzL zCMVj?r$3P1E~i(z1zL<*q(5?Jycmywz;Zf zS6S8it=mgvN}ZlCIK%ZN-hy0V-tzO<6wD}zlx7*?NT75yU-9-Ta zCR|x#`E7v_6}euzXb2COZWgyHvU5n0v*R(4obt|{;vZCAl2=n@Ornm5GvZ@yMNaF4 z`hQj4KjvwxjgK3u_1hI@9fv_ucJvtq&&3H*YOjA1e2{B6~_B8$*qe z&GL3Ut)oYvF-a8(Iku2ymuZ9~r6c2@Q*ZTUJXQd2Zs%elQr2NcQ4J`0HBP8X{9hxn z?_|EmuAh~BTT={n`5ekpsnU$4O1T(@VwqhdWI zzrdn(qYwBVQs^dPfZIB7u(H)Fs>+gm!w`}wbW3ruc4H{EO8F_AAW|DQFLhb4>YGA> zFQ~kY#o^C@N6@(nRi{l5YL&_vL7#U4=sd$P@RnFAz47=mC&2Ta#T zDqs@}ED0~+1L-t`Kheliad)v-N{xoXFg6EUK@Ui8HeOti+5%>&KC%_oSdFMNi4VCM zp%%Frxx{jtg%lM`951z4Dm+-taB2r-fpzsyV_F+WH2nVKxi7?r)jCn2&j9RS3 ze>QwOK0so02NRtOwUg;#3zPiAjuKK#VcyxkH2sa#Y4zBGF0X@g+c}5TZ}IU?tKUD} zjg;^}!1f2=lI zRT^rpuGs9Jp*Am7m?>Pxqb<-t5CuUs!Eyvb#e&(RZJ-pYyv`P=Wnk3Wf_#9qs-aQy zg<4u*Xw`ov}V8n z6;45+j6ex}DX*}>WkM61Gq$P(x1iGTh!*6Lv;t{{Aa6r=3VTklxb`tX#J5^>qDj^x%^eijv2U4?eZcFsz@*7I-}lO1ONHsyRTH zcH(|hD=Q|qP~2=KN9&Y!*jsVP!{EV+Iyf`j^4Lb}rcb0EV(-h}<>(o8C*ddfyln(=CC*Ly<9sT%4j@!3~&hKWqflJywYN z5ywf#Z1Kif6_aT%T$1EV1DjK63{)8-n2a+r9#KRO=o1@|kmZIkr9_I!(Fj;)h?!Zn1!7wl-rqdI}Vif@I?{qnph-utv$Z#sRljIx5;$$HDZ`^%eY1RVrgL?hPz=swpLQ5MnHlf9GdemJ8oV2gg&Ns;FZY3J6#KwLtTw1HL`Mj4Cm1gW8@k)%?kC+c$8|4#Kw@R7 zGBffQa58Bc%&?ZSxSfcmz&gN~m((89-bUX9>EsQH5R=!TW=GwKFDz+4ZN0zc4-1WHg*Xzrz!>1vuUxa9CVOF-S6HvLc2lcuklzHB;Y`l4yX z)Mq+jdf2qv6f+$%J!on%1x!*2|~G`wMW#_+n~6~lK8 zFBzUSykL0J@VMbI!v(`B!x6)Pq07)@c+{}R&}N7j>J2`_Hp6B^rJ>Alm%(GO8CDr? zH<%4K8WtFg2DKqy|AGEp{X6>C^uN}>rT@A9W&Mxz-`0O${|)`~`mgD~q94(JNqhyTmPUwsE_Ge^mY0g{U-hA^y~E{dY9g!U#VZJpQrz{eu-YMSL*Y0@9TcA zdt3J_-J80f>0Z_SSofmtd%EXzU)Ft7_mu9E?g`zHu19xFcShH)JD_XTJ*3;I3+TR} ztJM|js&&hC8+8@BdvrJJ9J)oiLS2EbNT=1!(SE3XPy0LVZ?wPEzM*|x`-=7@?F-sx zwBOY}seM*^LHoG&l=d<0fVN9}L>tjQs@ysY_==KGrGHQ&~JMe_~Kmo(=zBbq+V z3C$tR! z>R+kfRR2uZjCa)II8B>I3SB)UE1v^-gs_{RMTc zx>~(aU7@~5U95Jfi`2{2T6LlNX7wWV9Cd-}L)Ck#->H71`lad()eEZERj;UCQhitT ztm=a58P$`j$5oH1PN@b|kE*&NmZt*RQXi(s%@&fRGU?+R34R0b-T)} zx>2=2WmJBkQY(M0%2&Rtd`tO`^5@FelrJlPr2M|}dF8j2-%ySyzoh({@|^N3%0A@@ zc15isp!kBK zTCq`4p}0p;tZ*ob6w4KbiklUS6mtsRQ)m?h1s@jtuHZKXzbts8;Prx63SKIBq2Rj( z&lWsW@OZ(K1&*==a1f+mpAVZqc;Km*XVq}cSm)AzaK3C{OQQU zfUk_~2K>fI6!7VhCcvjgIKZ!u>;UW;snq5xHjbdhdEFxwfV)QS28@n)03#z-!0jU| z0Jn_X2IwBS5zsZV0MIc)Z7ms504^NCemD2S;YMwK!H2_Waqgdn6L_9C+=9;^3?mon z+#e64-MQZy#(3v`b9f8jGs9JYmxjv$FAk&Kx#x#5#<>p<-wC*P_zu9}Fxs8V4}Ti4 zYFGmp7+wsxX?Pym8W?&6pOr(^_(md8Yp!L?2AA4x$gHpA2H&O|J}^ z0snRo?V7$lI1lh!gP=6ixj|sSbaoJPVLCGaJeUp)01u`|2O_9BIDlC;JurY-Fzp`z z2276(1Oe*?K96tL4`A#j#{lNSWFNQ-&^F)!Tr^+@TsQ!#GtD2kJulDr>w(Vz{`NBV&Q z0VjsCK2VXNv=5YExUEl{m#2Tfm+D{IHyiNQUbL?NV=wSvDCunloA636)}#KtUf@Ch zW^X;7E$;8Q)f0Dip(qt-pygLZX;J)lF~K#u`1 z+PzzwpZ9JLMy+e@1`X)K-K~Hdx*Gv2yRjSSKGnSqWnS*aZlJrl8{^ffy6?f0=eyhR z`KE5*T&L*%EMR`OGcQm3cimRNf9po;+Bdsz1N=qzrvRVpUIh4^ZWG|M-73JZc4O4q z$GaW^e6$NIPWwm~My=h~g}Kl^)CFv7Yr8Pl+O1ufW$m0Utn|F~U0d+ErmGCl*#-L7 zI=VprT6>oTaC;Z_K<(Tvj9P2zx*5FPe|CY=H1Bi)+nV2YVXig*(S>$3KROu!sp(Im zbPV!Rsb$pwI>lUQFG%Snt{{muzcl*V?F`d~ac3(#-^I9LDn1Snkn z_K6n2|2P56t6w~UcGZ_ofUeX(Jb|95e{cfxtG;kz4dBBkK-KDtCx8L<`4cX{hfb^n z+<^@Mp)dj#U3~9PO(9^*C^=)*lBAsNOk_c2$3S9P_LCm*c>{>O04=(p7IC z$GoeaJq|pmMvgBB96pX&Pz@ai{#C8VfelsUxDv4J7}l36dK?s}3Lgg^RBMk>PwqLk z6Y%b1n0Hmlu>{~P$F>7%jse@M!egHYG#}dxs6B?cP^ph$pHZof0Vm2|9s>m`|MxNM zHp;h-f&P{M_c2g{@_WZXfy)2u7$`yc*fCI`@~@5oC(17!(*l0+7-mP=bqsw_o;=zC z7&yuUo;ZpbQSwJYAxi&I4$ybB9?lru345|AKoDgDMKvAHD@}-C@i~LG$5-fY!s9g#!Cw&_jXkuo_T( zcov}Q5a^^pc?ftYP#g;9<<0)jLrs8RI)pLK{>h;S0RQn2=wbFNhaLoc`A`kuUme1X z%>LaW%*gC79&!U-Is`n-K6Gd$;DJL}BeS<3LVso-JcN}pd;cL|V|MK!%+%~{hp6T*7aqV!^KU({5%9JH zTubhqGQja4X>dci>Zi|LXwoKkMrU<^Vo< z04rkF-~rIUtbzUL$*lhU3BbPnQNX7C81<~O{TSD*#{KBStl)n1VHUr?8ZfjUtRHS711Gaq>|YHydq1_FzaN;NHETcCX@qfNtPCuM3-2-md!qS~1;u(R%v|k>#-{ZGgIV*C3xt)Gnz{7iN9=9vtaiOf8 zx43OqyWbVGBKTTM3u1gkTPSLfpJIpB+;<=RC*!Rga(V78L`<6iA`sI<%0&U$_D&ey z(l@b0q=5x?%N&H5O3OYWtO06@UX-FZP^0kVfT%1PAMP*3kPw4U#z6UG3^^rHNe!m9 znvb_4#uC4rB5lDodd&lSm(k2GD>g5qFhWS`A^gVQlSlI-3s;y2O(Y*&M%hLrq_5co z)d^*fg)vNcO$GE__$w4|XyM{*YieQ%;ja*S7KvVT1lBAYliSo=44-hT$JOA% z%5gcCK`WIkQDdN4~ZD6Q^ z0KKr3ht>%mIW3_*P`m2v!Z*0=6jjXj`aO11Tf(_ zQmQc@7g7eLzAlElhuW(%n!x+i1u~TBh=t(RK^iPEo}4*F_d{ATG3bD7PJ=xWDiz6M z8kNQHHpSK#D}~oQX`Ny`g)FDWC~qB$tS7__piy9mk|*xoef#htFfL;Zn_vvPptw-5 z+luDh(5;biKjB5R@2A-5=^h6x+$h=MWU_Ogz~6udig|!Byr5o_45wKFCb50dfnuEX z|Af^};5Z?EHO4Ng|9+*4Ej}Em~()VBS9hlp=gnrbATG}vz2pz`bZt1Cd+g4 zmvU3ViOH^CNtV`}!qQqAd_lL%>ml|8tTY(q299>EETw5%6E-%lM?VRi? zh>K=3!oC$2+np|HlT1Fd+wnGh>I#b;MGlMC;jpIHmUgF#BwAYbjpxHH@Wt_1GxFgU zud{CMUD*?f(v?5yPkOC+6qVz}U zBEDuBU3qXhStaL*%@ly_ zBYQelFzKqF>edTm!72LnPT8?HX@4kPX9Y9jW&21rB<#0xa8-16x|^;Q?@YGoRyA*T z#C&_!`9f{$cHGac+ZqU#dHi@$*mMPpJp7qy+oh?9@p0JrqQF&|4dEh!S@;N~Z%G`> zgPaC}A!C~;)o(6!{YR6!J|}vD34SuZ#?(bmNpYUM!w}Of2)}dpd^xxZWS`fHdy1gy zT%Z&3XeA+RF3`zT1D(*ZOH7X-E1rTfQoQ5JGURE9lOdZ%f(nFP$Cj|S9{WRpuP-b{ zV(D=)O@!blA0d|n#*nf%q$nmxfKFF>2|vh@fF5d5S za%n~g6)cb+w9Q3ANWY5vs;k!4)RZFw${0f<`I{>@Nl4QLhvUplL6(i)AKM)Fm)UoA zRJLvNSG2C*5!zi+vN8KLeHr95WI;d?Ic9FeaK%;(*T#%NsCCMA43hkcSu)g<3|SDZ z%;egS+!9vjROBj@i)LG_y`ytW$Y1Sl3hlDTq8mEo2@}QWl2m0`8IM_t#*pC+1|~LS z(}*EubZcnO9t2rsHWRSlKxjuK$U(++Byd9%4TSJB3qjP2%;xnlzL30%D`H%vnOTe= zd0iMGBOw7Zvk>ddh+=276DBBl#HwfIkUfs#xgy|Wdx%GEtT&V?yeScBj3I$NtWTg! zL3~+QbHFW{tQppG9b71cUbAZOlF)24f-p2x)-HCA%BPo2=^7P86f`)D2c&xaO+0y? zOSP^?gwrq=f%7zTsTQNgGiFM?9=-e+Vm@w}%r3eteD*r^kN%S#2L&w+$!^l5c@ z18%sRyKOG3)o-;;cW-7KJmc!6E6ktO=yPVF{AJ@(xyc);AOi9t9#gneevtO2*uWO7EZuPg0H2TjKi6)-x$_Xxh-wHI@saAuUOeSd*M0h(=7kgJXZBZF$NY6m=s_ z*P66kp^G541YGlyx8&UHG1|GFW>3QQ z_=f;+!l_N0eD(udERE=D0z*NiCpfj`GhuD=WY6AB`?zj8#AxLM3KoC7R@J;k^a zxdL&Q5V<4T6k)o`_BOc}EQ0)aj-^;Q-j=&Wl&nAqWC0n=B}}YfICbF*J3e{kZh;R& zON146-pUQ6vM$9Uu9iFG`e}laV@p zKaufDn%=a!-DB#O(`^G)EX8_DXG%+$sHNsHO$pCZ+p;CcArglN#4#qLPfD$<{Bkxg zGCC+t0_*c~Hd=8IR(TL&#mNx&6UTs_s-`&e{trHG`kLajGc^4OPd^VEM9N@iI9qus zr)svdl1}mQ$M{swan_2^!D*i4>0JlmXC7weqkI}?IqTv0)BK8+-_zjfGv|Ghd3yPR zC|%Q1wbH~}WK@37n82=*@_P#B-Ib}ng)=Mbl_{tC{%BO+>~@wD8Q|`mdhS9HF(r{f zszXa=4fr&!>A03m`I0`BJGxM&bb>27TAb5pgbeU(*Ro|%Ud`N6a= zbF3nz1x*+GWMLJjWdV?Nx|23fQ?LM-Jh$dF_5bXmZ_6S8uur1@pOs&hhkv=B90q2D zfwP{=w+qhP-_VK9+(ApgZ+8Td_|56?+MV9%%Ieefs5xiukDoJl?pkprn#kO>LJ&hs zj5`xTr!elRB4{vjxogD?#Ll^EMebT5TH&VM9C8w9STsOnF6dCEpiTaZxmKi^j*+2+ zaM!(pi)=28NG^=XwG1O7IM0&CGnxHE)P2fkT`c2<9EZqi-G@ACu%XWu001{>kIUBJ zv-&u%g)I9g3;-aMPD*dnF?UIRJnaF#(9PDJ-@Wxe>(9P4NIyq6wtgq-68| zCv!r3#@oNg<*Lj7L3aJWVE_LQh@e~W4>P*_dx9gTViu|(}SErKMSwO0ux?kgMN?O zmerUc8J#Awu5x{lcZWRNJaviE=14r&7^tX`Cv1#Ce|_OvgnQ)3H#^bV+7d$GLb9jl zd@U3-#2n|5F5YH=rjaLY2kiKwF@IACsm~~T?oy{kF!d+9drG$|lxmH(QMR>GL}w(^ zZG<)CJHNX(0e$jQr+-6AnAq9!KW zL>XVA(;VSD%xIKl-bG|fBtf+l3EK4p%+ZBrsB*@!1!K`La|}oy_OdwZ27*Gy@2)SD zTrZ|;r;iL%;O-`vr<~ErM`Lu7qiVL8Q>i+mTdzQ_nHhVxZ34C4vD+>$!%1jZy|`zw zsFE4$sy3NQrkY>tZ(B=YYl~t$vO=$2SH7ucoaY*QdiA~5V8dM%Z(L3RzH%;5k~#0k z+yx5JLKA*O3q~|O7E!dYSh&un2MuQ~7EKY?uF5T*EuCAce6{zNL<0$%)4vnfY*8)F zvdrUVEJYlZiDkPt9@`Txw}&b#$~ISZ>?*5Tzjb?we7sKCy=vKXBnuKFA;=b3MD8n# zy2P&YS(%Bk-v5%NYSwMymW|o(|HQVp?1QD2)oy{g#Byfqj~K0cOSu^Mh-SXEjdG4w zhy2a^U@$I!UBm3m{j5-9s2ywpPJ55!JUDq#I30%KaE*=cTVa+WfeEH^QhaLg8giUu z1p8xl+}LO)58~wrayA4RL-KRG-{ExxeICxm2Z7G%n`X1|H4qXSe4P!*PuonGax#Nz zA;&D@Rp2k7971R}2;P%aip;JB!MgA*!xF?kVi8J3EV){)#6W>FjNa_eXB zr?fzO2)z|1A2Xo^@;{feX(NL`n8UV$aR0)$%n3_4Qutj71Sle>ZFbR=&kPo>pLwyP zM>I$<($ZE(`H1a8RjZN?UP9G@P=FN|5-OlpVQ_a(Zf;S7%eI(r0XN<;xy}V2>`*vn?hko34*8zMiNp@0(MgmY^slWhl^7zpX8VxKaVMd1VNm>WU6y^ zaEu*MG64l99r6X~j04)1dcZ$ORveU=946l5x+Kmcb*KikHI_QKAZ2gB0El21QOeWE zD39nf*?GaCPoyHG^=^xWd93}+fBt#(WZiE*WEOKlh#sOkC z$i9mLX|tuy7Oad9R9hb*9A@q$iwBW>4X)#zX86{LYXWNr-IOsYEY~z_t$@%d!9+sI zy#tLgjxmMu5LJ*R3Sn!R;Y{QqQpg-LornYb#PCJ%U-Hi+3?~(P!a!x(6*neYX$fB& zyj9sm(JMkhu`j|rjd?f2*pe^GEu;+>ge*#?r2aFsG9(L(tK4s_dIVsekU=gUvlz0z zArmLwNTnHip>*7~P)y7zW}W%DCgMc77#CJyJJ*un8H$%dWGMG^s#LU;e1a);gLo~F zQ6x-4+WjG=*!bH6`*LE`2zQ6<1!ar~HwTP%l6%91=KGl$v7|y*3KfAT^2f=Nr(`wX zXH=NGPBetCv+KmPJOHv%%(OfJ5F#Tx|D6>kwF3=JkNgrC;k7dS@-4P zU+(A1F>rqM<&}ad{QrrtHTk50bT~Mh!)@bv2k&?Lc&E)Dbh!PT&12!*L94}woM!K;}&0KYph0xm%bNW<%h@vfsi!pR+&=Fx4$% zMiJnNZobGkT9o8R1a=s)idGfIz*2`GO-HUb7E!kl*b^>GUDmta1n$`|ET?2Zl>SYO(U|SpkKl?) zC1Q$(Pk0P%TQZ2FPz4jaOj(7Pra?@pUKDMT0x`3KQW99Mkwupo^oJ9u55>0R-hTAg z{Rx$a6z)H(^}nOY<+e6>Z9dLn2iG-;^*<|}WX>kG{O3FlP)up_dojQvDGabnB@Ln@U1-j%l+gqki$R@10N3zjFetp zAxPRDzeSX^d7VCAz{+!8zZKFm&f^c-tnPr%738fRnD=vt(r@RSHY>cWg0Ks+xqM!W z+wZh;5X-qZuQMlUgI#$zsle@wCcwo~{C`r*b;Lpxuodb@$wF&$XB%=EBB!4qsDSws z^nPJky9A>x*rS`pc$=s!hPUHT$%>UuIr6?Qx|i+Ei$i-!x}3zG>u_0mAQ^5QYGz`o=@&)vzDkBS6<7jfOObJX za4qOx0PZYsL%~LY4GLiqVUU5|u{BRy8Por75x0Y}_A;rc`pub~4l<*(K0omu+EEo1@$wq78%8 z9_kj1a8fp>8f;EfZw>0qvT0$fm%2L=%XN79}vDfx|c#j#AFcNw-b7J0;C1$fhgKs)x-1 z66wlk9htackdbHyj6c{JB}(Gin!!N@icTgE02AVL+rXSyEFMSD&4M84lx7DgiJ9WAS@@4O0=CoiR_{ggu5yX|S`<2#B+3YvvU8y{ylnkw;_pm-9n}kUt7dp$DlLG!xT{I5Ch&cTX%JeXi z0KnQ&_Qr$wvzKzo*g-4`wMm$-ty`?)D3fq6uo5SJU zw-h#=El8u3>YYdnoqQs(EyPnabF5k-taNdWFuO4C47XxLNzskjVlTFMiy`%~Tbzaa zHtnemt*xl>1h?6vRnq?KVWO(b|HzT}d8@XUF72vTE(!NF3VX+XMCh#o9 z(GkbimS|;PkkMWn4yw4>#}N~aW01;=_OHykb+wtc!lmZj`0o>{BST9r;zx3)PzFyMUtauFC(nq;G1tlwr z2-{@sOy!eJzSX>i*<}+~zZ)~tfL0PjvQ!m)vz$lMyHQp+3X%oHV_;gV z)#62r7F)K}df?8{PV7^MR9^quNT|7LM?AQWudZqG*_^RWksa=t?^BY&CXEZnZZH%J zGn#K>%TeHgM1}_8zGIy&s~PSXn}C`5!Ul5o9n z+lB*`Wgk5nOGz`>;E;hfE6TQv?k1Go=iSV$YhUN~CDxZW?ebRd-WA_aQy17RqfAJm zfX;|VgZwvfA!Bb4$)pN+A<1^}@CEZZf_6S&vp9mh-y5)V7H%>smo6*GlVd6YejV5n zCN%JqmLnZT%-v?%=Z4Lm9j#kOI|!{?yj9KH9WmdYb-qyBx*hj(>$V1hWgh=kMJs1_ zT7yoT!yB~Q96_hk6M(4AbxqI;qC^^|YmHco*OQH24|a?ufY_spz2R6#MpLvjnFm&J^Tj!G@nSAm=-A zPQh5*h6Fr9&K8)+-xm#ca;?0-8Qzw6nCUCoggX#zWJz;uj-_UL7nQ9xZ(+wRYnin} z7h@aydR2-=KKlxhIuU^#X=bqFT5WV&Wd}Qq&M9kX9FFd7>|`QG9_&%fnWB}Cwzlx- zC2U8KE)H*^aaJ2O$%eBfniRz0xDF?WzEtAS9AM8g`wUscoO#Vqb3M25*W^+z5W zZNt=e-{Ng*@qa_hxQ}Q!gCnW3o7gBG{?JjPnwCtnI`pRWiXQ zA;M}A{4)X^^CnrjQe=Hru4HZ-xP6%4JThP|;{xCn=r18@lq6ID;{=R@#iF@dkNUz8 z3*eW{+zG}uP9~O-MqKe3S4HeDwL=wFMZ>8TlE*MjyWJyH1@4Dsij9NeD~9}pQfNdW zXQk*KLg(=|wbhX_9Qx81jYaNWxsu3O9HjJAD2nw#4=iH;P$v^R2q{hR1yVo}!zlEg zYmCYiB)Nvr_l!M3>*#|&5sT5mN2pnD_pG3G1g?;YZRr`;mh7)D6l-e|89xk^@upz; zJQB-C>@P_Igku>v1HPCa5y{2Tk+D=c2`d)#y8J5-uHE zOcs7kh2bByG+Y`PlZT65pw~no&d7jy1zsbOIBP&U3R4_7aTqe8IKH1!@Q%!)aV(kX z2k%G|JTv)tCIR^*67nn}ayHy65|T?&?{$i?fllJHcfpPC1LOPrDObdD1mH z>4K1%b2qpzB4grAd7GS)Kd0n}O$3=s%s|NxVNnU^8e2|xw0mra7v89#8T`Dg73@hkW9@x{Q&mdmTjBHFreSg~f!EQ&qgwmE}N-Vt!v_#kJuxu+X@07{7# zn5rO0xwKE!+;`u`aY10|A#QhtunS;*$JonYRoTEaZkv&~NeiJ$9Q7;bX4A1EzxMATiD&K^s|dUv<^mnws+Jar?jg%@rI1 z2%1Id#$aC3+#!74TNsYBXL5AsN>AO^Xd}0ai&sJOQ(MuoVO^wcf>5lvY!^%u3Aq5p zZBB8csgFR8bwy$)aFwVc6lst8nVuSl{hDPYumX`M6(H-@?J7&uI2{}KjWw~Ft(9f9 z_VPBLEYlP7H%M!|zA&S4entnLyuA4rPuz3)4uRnrSS>OX7tZn9`0Oa3y`R99RTtNv@tL`*8nzlKbN z%j0Zt_^h0b%f>`N50H_GaCzKywb_{n1;YP*M=^j~?@cA9_f5Yyy>0rH=}ptmOs|@L zY5}P;X~@)LI%YaxddSpnYBlXN1x#Ns)tahJ8%-6adrZY9 zhpEW4+*D|~*|f+s$D}nC7(X<=XZ)SZ@de{|jn5jNF+OR0-1wOB zg7K7bz}RIxVtmxN$Jl0!7@LefW4&>kakH_~SZ2J-=rP)itBkiB&Bhyz3yemi+L&+n z!0@i&9mB5;ZyA1Wc+K##;YWt=8=g0O+wcv;*9>1Ve93UmFkYvg-q5rb}lKzZ-NZ+GBraz#6NZ+n+)$h~?^k2}|>Z|n|^%eSi^u>CI zzDU1ZU#P!XzeqnvuhkdmKGeOZ`JXb&+4AhJ*j(K_n7X2 z?v!po*QGn6dsMea*QSf;nsh#0y>6Rsv#wHCrn^h$(b;sXbhqowx*K&1bVi+8m#_Um z`>ysK?XR_OX@9PLP5ZL;N80aepVxj{`wi{av|rJFNqbH^qV3b3&>qr0tlh1RXD_)tWD8YBd`*6`FfA#TtjE zNV8m1sJU6QNK>GhqtU8ARKKVGo%$8^Z`8k3zoC9f{et?t>SxuDsb5z=seVR%L48Vn zME$sWK;5N&RJ}*trjDqa)IN2+dYgK)x>8-HzDw;<+tjPnx2w(S8`TTcMzvaQkLi9a254+O3MIf~p5q zb*fFO7S-oe>s2+XJk=6aiOQw2s8*_$sy?lnr_!sG%J-GOSH7)$Q~5LHuavJUf2@2? z`J(cB%5N&4QeIL%q5QJ)jB-fXqdcZOpnOQ#u54BAR8}hk$}cE4Dr=P$%6pW>N{6yY zxm;POoTI#1xk#y17AQVcyr=k`;x~$4D&A1Mu6RZ9lHvu$cNNbno>4rhcwF(A;)3E7 zTYev3xl^v^R~Z90-Sfp8upi(3ML1{OwET-Iz-3>g9oled51{^10#J9UB`@#B-(Cs< zzJ19L_`^$efG=LE2K>RLD!`{Nl>kc z?b2MptrzzK#xH3Aw_TbASaY!h(0efk=)TwtIPYQraPGwi0q0!Y3TV2B2(mZ4eX#`a ze_gZz{`TT}JU3n}#^?XI=mvc0ViDkz7jFl=eDO1YU%R*%@NX`n-5Z{`s0TcJQ4M(L z;%vZ!7ajs^yubs7F2n(wE@0F*1TUc78`fQT0PyAu6@V2Nwg8r2pg!Dmp%n1O3!lr& zTk?kss{!A;uoUo*7wmxlbph=z`IieA^^%`nmQ_Cz~cWrkDe@k=R9V7@o&$g4~zfl+{1t`pKAyF z$8!a3xw`?^okJ^&!{0%>i_r0|plB&w<_+YtI1#i#2C4_QmS6yYliD zy?GXxU-XN!XnoNeXBz;YKZ|x3{oUF70iQd2FW~93ptnV*&Vt?+jh+R)EgCtCb{ECY z-T}DlY$0Iu?2UlcXBPn8f7S$e-&xG~qSa@pl{?R(-9<%bK!JGM(Y@{M|G60sj09#=h`pXD}BF|K$u?U--9YFw%wZoxuz){LUFr z;KFCmpg#-$^$hy6@bnqX#lq1u=+DBDGoJ>0=!_O{_{<`}eP`wZ)}B!SZa@79;I`8p zfLl+ahYKC2F$)Xrr-6Zmw$tdzLc?j$-a`H9O@O-7!2g0bPh*uW)SkWvpa1PN@W0>} zr_rAUZ=A-AEcou}PXYe@X<&ZA^QST63r?Q~1{Rz;od-C2>LI|ysTg4VR5ReNQ=tC^ zt*1T@SaYftaLXxRV?p&PjCz6N6ew!`|8ojho&VM;Q1}A(DQd-a3hQEl{S?MN{}-pI zb>}I}`}{Xf-30iZQ^5cHXHTK^`QJVTdYk{PQ~7`wM)v>?j-vJX1EZk2`Te87|NOpD ztho8Tqji9>QS@Q{=SQ~zJ}`=&%-=DJQP1Bt3jEJsGx}M;;!!u?qEW2A`3pyZ?fLUZ z(W`lX7)9&z{%dqT;Jc$bz~7G+0RD6Y)IRT(5zyPbZ;V6%pB`xfd};)8P@kyM;VQsO z!{vY%htclb^TQb9+=qujQFHeW-vJmLM!R$QVNlfEz%b@_?xta^>$z3K8o&+1!1LVO zhCoqsZynkTSU401yk&@5R}W!j%~cIymgjC9!pfSf90K*uRScosId2VZ1blO79pEp9 zKv#2qG=$dY{BXzy_~jw&t8@N(XeHo33<1w`{%yz%_}I`Az%LD0S|K?9l}bV z^T?1MaMuv9G3T!a_W?dU2&$XYI*8ey6CDI*=9CX&7Uq-D58>$Mlmy%)9B8LG;A*w}a@3>Dz7bg1v*1O3z-~n7TUiAy0Gc=cpdT18zR-_87{A!x33#!;9q>Yb4Dd)lFkn2??*}~CkDeHJ^`j@oNIz!8 zxV<0LXx!S5o)~NTF)zj~{lJ4U+K-+XTl;|xqpKg-Fgp8J0Xq7D6XTqI;KXR`2TqKJ z{<(R1hWGnHpN2p5qd$h9_5&w|f9^wn46pXZ0e{kmJ{Vr>1BDo#>_Z<6m;12u8@|?8 z19-geKEPvr6@W+kup1curmqcZ*8$kui+1%ry=Yh8-CGFQ)q4XV-wSHg2YS)E-ruVS^z~xw z`tly&UtiV(%jry3hq{3t17Lp-My+e@1`X(<-JpD3 zq`M6;+>Np8Hgq=vR(AUU@9oBJp!-xe=wEkpH?@9KH*l^~bz|Ojitf(>=63_<+P~|z z0{&Y!TGzhWeH-8}x<3W@T=yct?{u30pY2uwezhB;);`|#5a6R-XkGhA7sjsL*9Dww zAL;_OwY6QCaqYIQEr46QFxT3et};Mp7bsur=mOx=0CeYX_|MsfNjlhyD-<9|L8)ynzv6r1Qg`WQr?({f4QF=267n4VIYTr90q`a zr|T{k3F_syN=5au&*O!98Om&jpZ5g0;B?K2(gG}Af9mDtj<%hR{-&z3cJBtyhPL&k zTj~%IL)KQx2Kth|GN)d?X6j`mGXmZxQ!kf>Dz;XJy<699<~suwl?iuS$V0fwruy>oLr4Od4C?~$T8UlDGVMX z8WwM7e0omFJ91niK6-I|TBg;>@^fA{2|6X8L>9|Ia)@LDltV^{=4euoKsmgcV3sIG zkVI(;O!P6&(J5hrvUFanG@Z;aonn9pfqcf$AVpzl6VujGLf%}WP70Pn$?0W!q>u}8 zTF7LOOVRE{Kr721FXf7qg01kynA9oe>Xaw}>mvJ0axcVmozhEo;hoZP8wJbQ$q3-8 z=ImrOvaFrx0o)Zc=Iw-3_AK51^JjPFsq_H3pBx5q82D%~aMX0!A{Z~8+#nh+`aKq> zKj638?0%Qe>2q5VmCx<5^KP%p6Y#o`A`+Iuet*E}b~^BtFJKS2INt6G*z7?kBAQ)i z#*4hw%X@K0bU55F$@E%%2r1~Ac2Ggd$sWPe5oidJY=j5k?c?+Sz7PmjLq72=1T7xp zY05iyihodfDF$F_X^K-b4I96Y&6uvKDV!5AYbJ`qwv4>muaQB$v&dnyHSoNhw^%dV z!a0lVj!d?2^ro|JV|H7({?^NP(vmEle`&9nQo`qUxV*f_>bJWFfW z#;F|Ly(w8kAd0OE+LDlLoH$~VMJBN4f}e| z&=8=Q&S8os-6Rn?TQ`ithp(Qc57g`T9m zM4^w9g_1XBApkVWic69O0%Uz*560Fq(SoG_l$n|kYL-Gl+bL56U9g0ueRyL zFie?wEJ?UdT$WTKjn9%E61%ex5)0($U>*K*Fk5o#=?s_rIFgy?LVv+^nfETExF{5K zP)aBTVp+9MbwTX@42w&cc7lpMr?(j&B zG?7ds!BBM-(0z5{N=`ulcZGo^nGh{2c0WHxW(p=XCHA!#>rcQe@z7F=jzS@uD2ovv zq2TKX!HzqkKg6|!_TU1DKn0Yug=8#|qz5Cr-Axv!@p?XtaE-o3M-j{J^vSyFPY~WP^I4O; z1xvBQ@I?MN_p)?GBgQL(Z3Fei-XcTEXqoh=f#sbI`CO$@k z0kgj;LnNwg2IH^JX$4Uxh_ODOgi-w$b|Lchd%ewM03> zS!P!JX4%_Vg!*zs#_BXz@GN6HlRwd>l5roYkC@G7(Xw3J256O42-^pYu2}&jZsRj- zH7VOn4cQHcc@Ena7AV_mkc6GokCagY8xr#MQP#Ay?T2#23)_^~N;wkp2}Pv6!zJck z6P1wC1}DC^OsbExmehdMo{N;9tUV#4GH&9c&3noqkrsxs-%t zB|N_6%{8IcWIbyGh$%1TP-Zh9F4n}XRPE^NgVAH!&ps$8x-StR) zj9G>DoL1i&VH(-k?ig1V>jQO3;^&n2#MFdY_5Tj1rNL!!`E3?pb5i|3N~4$;I9E&ROKL+cN6^p%bpV{m3Nx|JkNI{LB61 zFz`vo!0GU1yC?uihynl$7r^ZwH~WC!7UaF|>4p@}2>^U8NZ%|wYklmLFjEgo{Ygxu zIwh?UY4yMb5pRwhAw&=9w$v9=3N%=Ol7StfT4mDo@ucZZ= zmpJm&m*p3jTr)#E>Agg8*|+?Ylidrp$;lKL%;*7mF=V@IS))1)VQzOQoCxE77Us>%$?Ag#l?37|AQsO_P(OYW)U`p- zmKj6^p#t1M8rcXW?*ZgFj0;j0c`b_)6|(oq$Xv1QgcB;|I;lcb%qmTCSP%+9B4=R| zxtgYg*hHEQER#Ml13M%^7qXvNEzHNE5Y|!I9RQpTSAz#?bKjI408l!)93~b3xZGF{ zf}vDW005r=!T#S;zPS&;UmYm^o#|dD z!x@IRxSHH>_@LM0a`7%-z#R;FT^5VS;|W6Yj=)x&#qaQ09M*u(>9SESPM_0;q;P(> z&uZbUR;$bJvw6})MHSaw`n7diH*Ve#Zf@?_uwzF@MMb=^&hLx*vs+T<;^SR2Hyo#P zD)I4rjrTh%HiWlqZtN)AR37n_mb;s(C~uo!`aaeT2hoYbFccwQT<}(IbC_wvU{*q5 zr`kF~eiGq8g~ililNM+^H*>fjz`mQlfRfe% zS5;<)0_IKjy^RZQ@hBivQe@svHKGW$7RNmSO^Ir@P)um_ZVY0^UOdDVWk+Amw!M># zv|`Xg$2(xwBpA%co1%%9036ZV60wNzeHyRb5h9BrXk=5e30G<6d{fQ1yqxSQ-OXp1m^n*MPE1}^ym2{Ye7trE9+Nk{BJj%)qYDglnfPr;-ItFg#f56iwzJ$RMpd{=;@cE(%JeSN%xpii;yz zJkVCdgi>Ox0c=~X?274TcTX0gLwp_mVOLXeOG2au9xH>rKsCTyg_>;TLNK9_;~`)- zYvF^~)h4*|-hD-JH$6ojw>_)J&ZYqxga!^@@fE6q}RCO7i)U$)TjlT~gNRs;FA;byt^h%yD#z|b z(Eqc!&$<)cctdtBmM;9v;uM`{W<3)cQ>EH+rJGYRl%yF{iS@0QZBnyXRIxWFwyBc3 zc9o2(k_JcOr}1W0sYQU9RLd%{GZ@!3Fs%|R$F3#VvrJ-JmD){aM3uq1YD}4I_Elqw zna!ewl{DpKW0hJ4e`GSVVnxsfri!*yW_(0uW7Dy-Via)|Ev--=cB{#KXful#unwp1 zL(9gUG`dQ&smg41l~yEa8$|(Q$S4aUmvp-;N%fL6j)DRvn{C$=46i1$yqbZ`CzI{f z6?^_l)=pWs$7J?t7uU3Y!;YpM?WMeTOG)F}=oUB5XS{eNp1(6D65+6fr**1>F(L;M zeNhA<^3k5$bIdvwaZ2(8lD(U!bNn!oNLKvj?nfWZ{V3;m0)1ssYTUeu{7w*9Wj|G&%X$|wP#=h^T76#sAb zY=54nM|B>*az8l?uUv*(-?qd%TiQfyWaFa$c*=?{YZ&LH}fl)UFqCe=gw` zc*)PBCLm09P26Pl~)D$Sbfa)R^E~ zu1xShS;DPp2>z?0dp1WR>%&pLB(Q7GZd>x!j6v6`HNEa<&&1@CXET;BJS^)~0OQyb|$bh2h zpMBrbB9@szP#n)(I6qNxx(vd3Hb0qHP29AnhF9fZO4B zSR7ub%ja?0C)+t-f|9n=q?wrH!jW7@;Yg5;>G3Cmm)(L*(W?)LHbri?Ghnki-3SfM z*?o3yy2g}g6Mp^K6ouEh5}utM+atBSe`9NTZR_@$t=l`~jYF1Sigp8QayCWR%%%wT zZdrxCNuhev)>!$5nn-j@V5809h*pIv*Y0tIWQ&(3U2M_sEBOZTvOpJ^UBjV<%7Du5ZMSa1%tdg5>=)GoOa+8rhJ5|%trAa%92r) zDw3g7MExYRx8uV!O(k}Uqz;`ldWzW4RgkPoO^y$s!mwl?GuV_6Dq{vaHiimLoUhPT zXEz_%yLaC{DI`TUgDu8?ksY5Ep*L6t#-e0EDwe$?8fob?vqYy>r^xY=ZH*9_sxgIg zV@W|pOB=B!Fn$s6%P{!kI?Ns^3JtT(2_Qmj07gCFmj%AL3I4=Zo7e)e;Yk~wq>l-! zSFptqe2@8E2?*g}uLv_mnB&N)8jH+VmzjsId2(gM)$xc;CO%=KMVu3XOU{z6R& z7%QTrlCk!lWc(K!va?2*^~snneS$L83Q?UXPpuH4XbdKVI}^>!_GG#pm~bKk6~g>5 zJGJCJHF?#N@2IF&$Wp`H5XeK+2Man(urNuiW&!U%EX?Jez+Ys?<}C6t4A zrWo&uO4;yS@Fx<QYdAmn53cn6ckGKD~TozSJ<4tx#(XkIlIRakrXF);jlxd*j0rwaFHR{ zP(zi=l&ginp18Q9zMZ_kjqIY+ed)`0^ZrDe;5)-;#Vn-Y5IpN)5YCwqJWtH{NBpv% zYb85vw)Y4Q7j*Vg*ARIT=EMO|EuGp(+`;%`J{F52{OqPE8iD5q+-VS%@IgkR53)+c zvcy00ZCLo=vSWN49{NeX`Qw#x5Cf3TM{LSd6cPi6SwzGs0^*51!(A?WgVo}-+1;e_ zjUgW>tm!%OW=Td~PbQK>X*w*BxCI3!_6+x0J(4-S>=|xz;ANH>4xZsiKWnw8R|Z0p ztokHd{$wwt%y5n(NUJjopWUvy*%SCTUR@A(H+(*u)#r8ioDO$@cRPcAr^Rdcxcwf#&B`GauHEhQ z+X5cmWAnIO0guZaaM^haA}!nfuAtR>oomQFo672Z8)~c9)-;AY`CVm=_gBVB+_J_l zry*y-3Ni;HkZgaLcB?)jD_CWuNf)R!n-IzZK8lnqpp6T+u3476N~K)rJXTaOS;EPU zJ1S$bvYo!VZK1|Mn=RxjNjP>^$P+eJLtY9`^v)L2Xv9N}kb5;!;sA0*;9yGDg3R}b z#Xt^g2-?Vm?1GQE&2pO5@_M@ZCo5!{ zFR^{fbU|T192SdEG49pmBR^ra)Hcddt$YiF9}q%@+B(g?P)myx=|kx5QV${l%6E1_ zv>_-G#AqUMRME;IaZaL@F7)Y`p!&z)qDY=g5uekYNlVt5%sIGyG!AY#!besK$gZYI z_}OBSAnSW(IS-y^H!-C9e|~;rp5kSI+)oYz*9HSe8ZUoNuz^2$lW55rum@ZmZ+8W3 z_Mp?^2!c_wxIK2>?R9wqUbmNXxvgHmKj3sjo#wLmt`{5lPik)aX_%4wZMOKjlJbrU z&L7_0v~y$JzQfC+q)rw;rgp>baBad-vZ<{kR_2OE+k@_M=N_4LnzD7;GL{EeVrh_V z)xr|nQ7S923uLuGEJYLK_r!0tasknVd`wIirx4QRDj1EkG^|-Ujpi zWSy)t{A>0deQ4$7&k9E4e;pN<8t-)lomQ(Szy+NSkHL{7$#wew)SqQ_=Bs|QHg^b`}2}5QtEUrOQ6melC`-4=AguR6<%wU7a^X)>+ zz}2lSi8xFmz)JF5xUd)z33*sC2<9o2I6^jhO6I#D13)9353H3@r`VB`Uo z4u4N%D-XeL>q4;{UVKQ?>FyssL%UNh=Ss>JY6wTsDV$M)Cg{dzs<(Pu!xV zE`LvUZjtH#H8pwom;1?KAcuh*267n4VIYTr90qb2m>~wbmtS5Z*eHxPh&Bp-zmM|- z18$2Owh9in(}El!PFv9JMyPj=_aVnD(tJC-E~mxm<-oJq{Fb0K2-97s+lSO4{xk{P z_2}hMg+ndo4n#7i{PwsZMxyPoeP@2O&7n3w ze0R-=(9#qQ^F?NmCzJk|TNAO?XdGr0Bx@(92_zATQUcf@kHF|rByvZr{HCb6BN}UF z77tCKFv1-p(?l!|>xTf>$)39D6C#1KtRR6X6VeH>`h{+xLsUBn_aNI(uRaun;9nB> zhsnr-;_@TPqm$Crv8G5HKs~sklp+)3J!ety(O49GBFHqe{+|(G772iJ68-O_rLiA51>na|0hkNJGxab$Q;Oel?Lyx`U_I@?HyAo}S_c zji)8Jk(-Og0-!GDFc0Tlo7QlR95iRXfei}`C(a?||frni|^?1$?kn0U?z zAi%^7q~gwnfB0A!0i?tjMC=R}{|7>xrO1sW&t!y*7yf_t-YmGT^*Rs4y;rk*<;arS zam8tGLsXN*CC}aCIeRmrZa@GeE|EaPboOZuRsp3a8)? z_9CYsGCj)$Iq*U6?HNJfn>xakE!*|;j;wouVd4*6^EA!W99MHK1U5T{YFZ|OWlUS| zu*$u9PQkUMRo~L?>c;K8T4k$Z))xw!C5pivkbW_v_I_bbLCqkF=TU*ntH#{M+^Sz# z-_Y_q=Gw7lS;xoqxWl@gf_h952xupQlWRn&jBCi!Z6mdIjr?&$%~j7y3kQgC2DTo& zy@wzWHW0jA3xb>^%>r^7P_p@mdN0L6OQqp>cfASkUMnYU;Cx;KCba~=A-sG*oknpy z;Uio$Qu%tda@nTTfs3_6aG@dQ2Qke4u|&x?P^V*wGvBZ+RX3wa{PWD zmXSEfwTCg**R@C22OsUf^Yf?gVaIv<`cMDXPlkS=ZokebKhUcZbD1R_;KYxJ6J_N`|3AF(t!y=M)yjULi2V-S8Mv?dVZ_DUwN=KTY+Ld zDrD5$X`JZo)yi_kxb^7JG*%XBx9-o!o7My&qvKl@U{+we0{tCPjIe2eu3kvADAf6Z z8+LcJXw(q{mx!zXYVab#`2RP9Dg2lHWDYj5FHpRa@lgaG*0tPOZVDLbL51;xSeVEu{BwKy{1*yH|pi4D?}3I`;X9zfptDzKUcT zC6Dlk;6C!51~au&(m0&;fiVQ@F;enX>;|&HfH%1+#U%rM2;d@D1cb{~+*Oe}2H8Mb zH3A<}0ha+Rj7tSq0C?&7)1-TFk@k+yt-!;j1}al=N>mVC2HMa+vfUO)nG8WKg%1KI zNgqVQKzf9=Dm3xyf?xj?jQnm z532g1U=IUo*D1p~fb5!e3e=~+*?aTlFMnCOgN!j%PJ_|8W~8PbwcW>DaD zX@jOVnBI7C=$hO!GySG__#)-03CqO9uGS7`W~574Fp!A?Z{3s(6~BgSLm7l3_!gQf z(e(Y%FaA(W_n8??e|(x(gY*)DvJiQDNjj1!e+z2K*^p*t;56#$Dr#=h??=&n`Z&su3kp}VnVGJ&4AmHGHRJYh zSI}YydG%TEutrBKBy-%Ah-x6NZk*=_FCzzpB1iYOtM_XmCxK`~benyCl(z)Ar^-ke zN-IPpT;UNs5|1Lu2;M{%3o~>SqD1a8UV3L{R5R&PZg8Jv7!73l1MX!Qx=O(@Dn-56 z)9Ppw`q8ic4vir61U)8JcoL2&gwyjFYKH_Z(cXeLk-tTBqhW>(;iNBy^iO_|zshw< z_9yH#H|Y(!9SIS?Q#C3!!S{)(VY~XH|KL~HB8M&2D^a==*zd5JHUn&&{J?CrdFVIj z`-J-YQX$g!WK^pHOgb4UC8yo z!Q`+oLgOnTxxzH){mVtafWx6u2xQ;zb>H(H%kgzPQ3}H(Ek%(}p~$QTc)yCo2qKys zEC&=b-rOyQA}!KrMt4K*JXMR$Qq}dvU2zK;MymWqIDx`9dJ1_*42-S3U(>#>)?2HqF-!n9F z>yPyQ<7qrLR*nZPk5K`oCco`s)9necGD&yTkSWH{ZB9 z_36*ykL+hM37jsR&IzC1|B3v}pZfgUpSSXwits(#F-%2Otb%?nwf5EX=|LG=v4Yzh z?cLP}_aDs}b*(zPe=oMSWr2P#i;NiSlr;_+amByoZ?)GNbF+JEg?6yK>NgjbAH^Nk z<Q_~%R+62{u-c} z#ZO$kZbo&aqnmJ^kFA`=HA0=C3q&c3Bi#bSgta#wFr=e}?vf5IExd+%eHAr+7mA!X z0Me;2(bbYy&!Vnz$ruG43fnfaA^#`8Sv|c)8@lqPAAb7g%{OR6_jK1a4aX}4y059q z#CB>{WLUci+Etg7s*MjmxchXvS+}dCr0gLDE0h$vNU7ss2;nSpxPu&YMLwmjo;)he z-rg{S2U=}q{mCu$$?@^l96cSYI)aM}IujL{sZ_D8BvYx#H1#r6DvZX6ftnyE zMHBxJYFV!hbC?nHTvkk$%xF927>3NVTQa#0{cMof(E8dkCpTt>&FnEQ;tOXnXO3gf z?a%&B*ggtso$TX|6bXjzwz*NUckry3wDOi=TX;ov>M9@B&}8Huz^@jb_0hCt#t1gh^{Ilx9D+@rvg(~i8H#wt%2Z7Nub}T zFr=?#tXNnm!a&==GdFy~S&RGqGxmxs9h|RM;KRbBCON7*=GgnK)^WwI?o@4%$I^*$ z8L8Z=wHkiGsUB@uXd4*qBLN)3Cf0x1pD5_!`Gw_YL#QV?z?+Z5u zTU290j(W8nt|@BIAbiLd(gwFLGq8nGX?7K%!qj+%Ec=w1PZU)l^k6(JNdn;TjRi|0 zVGt>Q5WUGX!5I*~oB`o6F{D=IHOgf)nV!s?kiGLj%zv7F(PYTY%!E{sOvK0!>=L+G zqB+BN!J$aX?!bw~D}h)k**2QWmdC|a2%@E`!P!%y@+r~q0UmQ1MgYm%ad>lZcLwXv8B zx~UCjA&>5oL}q5hIvcLifRQ8TIrgITzHlwxzOM1w8Fw^9Lf^x>2T@}W>dL{VsL!5i z)DS(YI@c=B%15hywbt@)kikLPZ(}8QSGY;3;kT!8 zZP4boJsoY2NFVRlZA5|j*by{~dXu-;sB+Sk zXsWPC!ZCF9T0CEp4fa~R5mE&X!8r<+i|}Yc#fc5HR1IoeAsPmBSmFgiJU zef-h+9<6)ZRmdI(CG?Y+F&JvqaA0y1aV(>SjSpW*jbRUI!gA2BqLJ9f91x)#F&0In z#LNs&7R(aSC7p9bR5^kop%#*IYbeg4g63ZXoC(2V zV%06yf<9#=MZZfQrH>RbSonWk?PdQn@=6N-Z|bU{(FK4M@I4p7qJ;8_{7g}n#iSnW z{)g)h?EjY9*Zptlg{_&L!Tx{N|3AAqh5xdjOahq%G6`f7$Rvphv4*y67KKZDFPZHeVMIhoc zPk-dg&OH4@t+pLBZ1-vA>6bzPMds1E9D*!vFuV|7;5XWj~n&G6`f7c;zMVU;M?>+k$rU zUn8**({7qp!7-69&oW%kQY?E?_ew`N(5pwgd3W6|HSU;}b-1y3`|!?_`&yvh(+1nh zvQ&B;odZaGlAwoUieN*IXfn=3wDm_T*5TddC4D*W zurAuo%b7hXfhT|DgPGzH8jg|({uz==4drkliEK9_d$*h@!;#szh z!!uNuDMIo0g@?Lu#l{VGc}1gLBH_Nkc$a8Yh+v*qBI1Rs6h)N`i+KsfL;SS(Z%EwB zz`z%}k@(M3Au*#PUpi`e{@52TZdmjSKah@p0psm|&iMZ~er5{)Wj|>N{B`&Aj^G^l zV>{#=Fl8GN8pubdIcCAi`{&~J&r;UCew+gteb@!0th-oeX+|F=vWunohO_)&bet6_ zz&N6n{@KAiA2NaUrJY9zDLqdVof&=Dk2ycs5Rcfv)LPAL$Igltn@E^%!WBSUqE!l23U1(+s%!Se&VUB*8(S-#e%Du*}?UMs2`8Z9)Ah`5p{5{Re)L^E;X%&vTtNzTqxve6Wo zYz~Q&!#tBoEPWKyU&yJZTJ(Z~lMhBS0PxevXyuUoYt!u}GAYtPn(x5^~KXAVY&JzbCKmLuUfKhT5djXdX{-U_jqQxdW9@ku;KnUzfnJZU*I9WR}1kF zs%kp6W*`%(;$RC<6EZR^aC?$I(n*wq9{O z#N2J~a6Z_vwyeeGoV9*S-932l;3Rgh$FBVllXo-2L%c9Nglef{;31Z@&1H3Oesgo< z=y9d6Qc;)omyS2$4(q~0Y)?O=oYhMpeG?3GNdCvnqP9oMZ9w$0>;~tnl((B=aOjCj ztwK+z;Rz5#wACGOv*EN@jY`M~2GSbnXelAR_y|1M^eU&O$61qZIJHLgy|d@?#HkFY zuOY(8VzpjQtk$bCl%R9;;qB%z(ucWATpxUH|IYmBBG&x3umALKZAP1XLCJ#?TXl5D z_MAd~lzVF3pLJWaJK)RDHT-({c=pc1>PAmuO1?_!_Zc%&3OmEsJ8TY><_=5%E6trN zCFDEHQWO(|bgkl)s=g=DYK9feKeF8x_$!TYp*tjfm;6syspt_}p?I}|E`JQ_$HqiS zT+Y6%jgcn`7Mr#Uo^R0RRiLvYC26%?EYi_C$1UYRud|Xg)L^`NqB7;K*9tYCO5MSM?h4elm9YMyfxBw=DiU?cfK^1bI|2_a8r8yR&vOSIwX7tetp=57*VT_1QQt2oIQR zL-P|M3klH(lMS*aHEZB?#qj_$4(l6H;$H)OaSM|SW+sprgSFLfR4_3apU9ChX)Bz7&20#S%wxRl+$-G?tiQ8wevK zGGMUEf{UM- zQRE(=^65#c;SHGW*(nDL*=_R68RA!>mnbu>KQZWw(uq;DiFS@#!4If@kPh?Va}n3L zzbIJ%OLf;S2T`AOb~IJ7#J$WgI2sCqyqQ@|#oP1@5{%&p%H%Lbo@t2AJE(_UT_U|Jp?e}?iQ6H|YO>{qtS_>d!uZ6KlY4*w(`1!mL_bU9YUK=d~lb5(Z= z0yWvLVx)3{^<=ElGK*Ui4pLW@bwe@Lz`@v5OxF%fRaGY)q})s3D@NR1D8OP96Sm1R z*{;SyjITmS+}I*F@@6FV@cuiA*u|CYY9kinO)(~}i`A41h~`E7&>824qA7#s$G6sg z?1x3SwS1M8ZzI zkgObmm3M=@;#i)V*8|tKw7}QQQJoSU(EkUa{?eDM)d#f=ecsLASz5I3ug)$lIy<`o)TQ)EH5O@K8i=IT8<@6r91mK^ zpioCD7v3J4(xvF2iB;Knb_t18%4Hjein1TH1amr_Q+%7}e>3GH6^s2DTCT~)pq78@ z3(u#hl5@;! z8e4b*s5J1|Qbq|{=iD-Fq)iE_gzBUrB|bl0Mhb{XS{ES}OV>+T4A0{pe)jj=pN^ zvnywpO0;{>LABHQ+iAFiIvh7yH8FXPF;8$FCo3P>5+T3HsCOZtwckj6SdsY8r(^;E+G^@w5h}Ye7tizV+I+m>kwrLo;ZL78n|ISGE|Ff*a zG|pc9N^F@!#QK+nSZ{kL2T!#1#eM(IdeG8>N7X{jXjIJn7-<} zg%`2C>GDV_fD72*ba{|i3IG4GH||Wmap!Y?=M&FA^Uq%`z5lhT&9ARKe+#4Ydvn$; zb?;uirfqKOJF2-hTQ%k%KJj7f* zjX{Xw%*F9#PS{u2)c0$14gi(GxpA#Tq3?=el6r-T`LY!DV!y82u9hlwWWuEMQM=G$Q4J54dmc_V zCI0nF`ioa%RW|kH8MRqs@QLy}`R5Z3@2uQ<I%J61%JkO6U(!>@SwrFidp%Pv~X`M!1%%!-TOOhEchz7b=m!a1r6+y8g_Z;3q z9yhESTwk<=BOGMuI=#WKg)^M27C89EO^Nfu@l1`ERjL;YhRVb0fjQ3YLTOzEyvJ2w zqb?i3NDRW{nwCIVqcD0G>e*9+j8EJ+ig;#0#C6%&ZNuq;m(v=S4Y1X{EYknqihPl1}gT}^s{rzc5{ zr*p?0PIDE%Smchm$>K^CH!oig;#03)UlDZuJkYRj4Map8fYi}_Qvy1VCDF&HOtsn&85x7p#E@Y z)~MuuaBM2{31Lk;HrIea# zj_t`fiSZnZD-0hO^0kGh4@wrywTmgC4Z%C;0O|CNy84Ascj}Y;4LX-OG2A?sL*J)+B5>_Ez zJ-O{Lbzcdq(R(ATO6QHpuY`Rfa+fje91CJ33_i}-F5>M_>+&(gh4rFCMH}ICaa}`} zbvckdU(>yUZfd6EOl;4lzAEx4AQSf2(SG#6H3`k-ztKAU{f+G^svVBcB9Dzo#9}>2 z?xGN6K)fQx)l6zwi`QsaihFb>O}-tU2D-~T6fEDZR?cJs|yXhFW z=WV-m*IY5@3);onx7p!If1S# zj;{weC>e%TaBag6ROA~i6!HbtqqCIkIj&RiUlnZGt?Gk2OU)B~{-}|^Z*Q%bYv#`K zT#OUK4o0A%(D8NiGW&XMWU8klFuQsauWsaraOlKOOCU6GI*7v|Oy-No`OCTju7_U6 z^g}i>F_WWIkDiIWjycMdj5Bu?+kM*i?A2fzi5<{!rBJzDY|4?-^*uB}0FJ`;L=Lc# zj8WDN_}t-B9Edf#Ha!8F>%ofa?Jev#oR!_9n!mGLT4*0XzMCwX1JPXmBXuiyd~*MI zbAImL{6_xp;fi*27Bp8Zs-y$;PKiQvov!wgfoZ6A^J=F!X(D|`kik7o9 zV(KeZ4{9#MS&9UDT!quCZz>njA-z~GMb8!V{MP4wZZMYXd-7>p1b+NJ(oVhk`L{oB zV06-TpV1Oyb+k@L2Do_E9nWPu;AP~ZoRQl>N{faKH2mrn}-CS16n0c7)wBbcrOF)ynNseqQ#3)%)*fI1Q0S1r4y<~7s^ncfO-0&dHTb7BJ=B*c%GC&1-cP` zu>;T(nKfdA$kmBx#0SbNnYyE~F~BGd)f|Sv_?~?OaFL7!0BWr;iXgU}jt1>&3LPMv zLZEg4t|xS?OyBsra3?@|;mEEzPkfj2w0ANbEFAeRSx=~Zfe5W1w{{uEfR90qwxyO| zsbdu*2r-;2u3ab8JipNJ@lV)6NP+hND+Ok<>e&qsUV;{EGWDM_lQl)P;*rILVem!A z`6!Sgsl|q@-H>sJ=R@XzGo!lo*44ph#K)_#-C1o;%7hk&gcH_+kfw^TR-ve zjX(X^ci#HLxBie+!H+%v6pSvvsaTI@SF4W~)t$n|PV>QT0AT!TYuP@VF;#$=u@Fbt z`?Prx7PSx}`@RRSOeqkMFapt6C7_{kiKs?l z26JRP5b-H+GhhpNUw9q_$qiua?FM!XjFj;8)*(3y;DZFZoc^L)UJ0SJ;2J(g$C&zrJK_AXT~=$>!cfoB9B3K?>w>Wz$G$rhXvP{4HyL%U*q~EpH}}yNO2j21XxT4YcZpz!!u+3Jh=us#j4ozsg&n5@av>69x>(C_OaM5j z2f>xV(ZoSI3YqCR4&Zp-wafS4nG?lbyw30l0&wIBz(G+eoiMCUfAPR0MgNbjwkrzut071uJTdgt>)F%vS%Tnaon<^rm7xOYp#Y1|Yh7G_hMJT)Yz0uk;t5{4)^iFa3F|zsn>R>qI;91?ttY?s~?} znibhWoAtNuJ^wTfs`stMx#s<&f=PgbO4`oEREfYuI2=YDycW zO654j$HJfpD>csWY%{I+-~}LzH{1d>gzRDeVGw!+=8@<;5`tz$VH|1zgl+gdg#-%= zOX?H4+~+<{o!GR(qfAt>$TG{8nCLWv*PlH#`6yyQhoBvKxM_v(P2yM=0_b}_)W0dT z86)xxf$Omi=r)QnfWKq8g}7F-!?1E=B&STg5>|}^1p0(o^I?QBdMte)@(`rmDp8bQ zSMVfyq|+JJ=HPUYegP!R)CLqonlwT5CUpD;YJXU2?V<^B0|wP3G(Sax=ZcBfIM^H2 z!|@P;1nn*dyrX}aqyR9|&Hw;D?g7*{p-v8x0@?HxO)UhT?&mc}#*uGgv~D!&7&sda zNO6|qgB8J6KmGg*bQJmvmbt%U->Dwl)ef7R^C!F7^4wRR4v+&gerT6=5jYsMLOYHVfwgB_Bnc9VkIIRJq7+e#fev~Ui>pxE@!Zx}OjT47+E z`!D^w&;JbC{VTq;`)F>*F&{KG*VoO)ql1&X4;St)@1MQhVx>w}MZt$dw!nx)Nig|f zzl6FKG6*qy4sFn>$6#ye;9BZp;i0F`M7@I#Be=dsU#G=!gQ6d?t-%XRMJ5&RrtF~& zK5{dv;BUBy9+HiLJ@m`w^PfZyedlMaMQ!cq{$cA@rBpe#eciZUI%zK@=kkek!S{jn z_kAWv1B)FJYc1=zjxjljn% zO5j<#Y5U-O(H&6IYL>50ZhEKChURglek_IYZTQ7Os)K9N!alqs;Oq&U~0KKO>SA10LC`QyL51eW9G;#=BAEZhD@+Y2u4rAxrh7~le z<2(D!mDa8~zkjlSd*7X3TDu$1?u*zjY&$RerU3w=tmwX*w@g2XgRq^_S3z~yF8g0& zT?VXOLx#dCQe`XdbAhC}DC;`(-8~hnU&;&7Qkd_gXjJz01VTHD(aVUlFRUTIt@62yJK3VhKxi$5{ zy7BPQ9+0*q)SH*Pq205o4HwdO+NH9`G+N||#C9qz3g3Mb0eq=AHbMpQvsl~UXbp%+ zgu*#RFei2du+zlxn*qq@((e+g;95c}#+x}qx@jZnxBs6L$&IMEfk@*dH+BDj+E{S3 zUEr4p6aV$6m&p`z`G$0vYJYe(X?10DF6(+WvXSQ*>LDo+6O=*W7!K*U+Rz;$P~}OaWjYfrdpu$b3imoi9fxWj z2GqddT2YtL;k9Aa2(KPsiF?`+VjIG1r;CAR~NCEYRX;fnWQrG&Gz9R*?qFMT{tMp1_bAvY?Gd+!EGknBf=! zBZ+|H7EU5v#u}l~{o_S4()gD{8vlBn7Dh)&bZpVkVJ6?8Gr|i%;zsYtA;`FQH>N|= zizU1m7?LrF-6C{tU1&%~$EKHU&wZ&dMsLrPg^&#D-$_D9MuTT*w+8gR&q1wkMhl_8 z^}(XEUbi(Ei4Kwrp#~oU1FeE48*WA0sWC(x5fscsMC3WJ%$4A^I==4KY7MAx#CQRP zPGwuu{Tk7?3qzd`=4F&wuQi#mE9bpQK_+{ zaPGo8dqRw8(<2da`X3j=h*MWXm@0Bl`EovQxPBf? z!M>hXRIuyld0X`?Ij<>!lJ{-LDJY(yDT<=1;KWc&O)j`*7I8{h2*QXV^dihI7#U=a zAv1#@$0r+WI3K%{s75YWs9%xumAGI+~^A|uaaHXacdJyygi=RXLU@iFG>wK{Xv zd&F0h*zaL+A!>aZnaRc2hM!|g0#nSVWLPV{+R`d%v;TV{KBSS>- zG)+{IQek+AsHPR7X`h6MDkk3M7*P$usRbDvMl&@X7o)9-SW2DeunDeeb<6zbFoQvaj1_K3^~jwwqTK#Zf@dnm0iUWI4WP2AY~z z0&tQ8rWMGl>v+0{zXG^-9mVZ9+nRWQ(SciYC!>7O1g(phi)g1wzL#!^W|G)LGrat}u;*abnlRzec52FOW z`>E5r;t2Qsp9_z0zHYjn<~w=4064uRD}ibQPp>(?9T=wOQ9>_d_Ht!l?QK^N3Lwe0 zOyv7A0lha(=M_J~&D}2?7F2C(v*zn-!SYfgy?LH1WrARHkaA%1jv!Qy-!;UaBJJIoh$D1`}~+N4uAE zv`h6S41KT2uS;)2GYW3y?bg`;pVe)(R%VOAOocD1p4~1g@)@ zvgHSgCl?$SR*8ZIFjqk_RNXDuuL`}dzJ71x&PJtlaQM*HAFWu2cbAv+<$-I)`>ob7 zNOpIsc4Lo$>dQcYB6TW$A%8(tT4?T-Diqz=MzjUsy_{S)RPq==jF>H2C#nF&?odj) zFeYvmVB$S;&j3`4yI6j5QoN|J_wATUgAz%xb|`@|zVG7UYtjcbfcERYyN5Rx;HEj2 zJo{Mcs3~Y;UCMmuBdyHNF8q2}_XtIfa`1m*?ibZS;9U*gM3Fy`Zc<5%$EQ`TiA0ma zGs*=ZNE2?CV|YbdhdvVI^%REs+#;sAfD)tN?y(3Y>?|g18}ZvEEg`Q;BpLr$WVHqd z9cN~yB!;2T=oZzOT%#UPdhFG*;o7CDu;*tNOw4{cKuuzLWUf1hH8N#a)NuHA1;<_} zfl`pF4nzX~uqyEf(VI32=Im=V@~!7{vNd?Eo`^JgdBHziuRqDJoIGl{?wzCR{4L8I zhcvm;I6U-%lgj-Qr?$RiYVB%irF0h3nR1 zAQZwTxH$d;w1}z7NXkg{psMho6LlV#*^ZOWfJ6NqiEhQ+g|4Rvic6|~iF=5OyB>!9 z@W;8!33Dxa5JtE-2$*m2yGWo!98`*mXx|X#gzOYFt;K+ihC3o>;Xu?7s#?Po=adw9 zRl}?JyqFjOZHG-FRB*>Iiv@r{pD5HvN3uzNF_gynIiuwQGItaP9+{qX*>ma7A;@C#>-41Dg3!VtKJMFla501Q^6E7ad?7GyBJ?XPlgsG`f1oHK zF2+VZQ6$%juMl*kRYM##7O5Zo;`a~)(89s6)Vd)d7d9`QqV*wcWhi8YLOU>hlG-!Y z;~`4pqD6obp*Fy(h@3$;q#1fN1&HxTXcVn52p5AmIUx^v33H`-nIIrkdy%|N2<ku9lj=3ltFNjd<8eOTuC8{wqlMF`+ zKR~2jQXL*;sX;8pQS>5)d8>rwk%njVDus5bDB_CayEcvRsN!CuRwo8Y7DhO5g^V~! zBL-O5CK^%PYM-DP;sf+@Gy%B$&WfbqJE^L~=$=@+>F9`Pn(zdH27~~p7H|4tUV4m` zD!Lkwic+0>pSS#Qfb-z2);Pis!v-e>ItqvwC7h8W^c4{}BnC*a} zMahon^GS8FmIJsG!_T(2Cqca3KNpN`;i!(|VEpM2`KDvu=@edh^a~gb*zI+?qDGe@ z4BUMzsAUk1b-kW`d&tXer-hIj8lCtG{^a>I5RDfWnyO1w3s4DQUeQq)vqoeT0Y?Nw z`ubN4v7~4ZPDf}D(lpVbYMr(|8?l0ik`RF^b66>-`NIm1vPIdo}z1%&lCD4Y>QSta81+m zP1i1Xu9APnt&DdM+l!0t!MeI}w7O?oE2V`;>OqoUCbKfWtf)~rr^&{^BXi;?uHIQ% z4E#dLd|+<1=k}`2#*TM;qt{}9^Y4HAYu`Lwqv5Q4>9198-h6}dsT2a$*Axpz5lyze zf;#DN=BPM^hehc7jSoIRxOEfD9i^(>D^)!LbK&ASAPxe5hNXv!jEJnl2t5E%lB^9# z<>WZXtm}I!672e}_!*>zO4R!ZZ$^uoT68U4)|LKAqhwGeDZK^&ka}TR+*%r}|C6(G%v3@hHc2wp zW!BS=uJv?u=pmxVNoizNM`*t|R)(a62(WEZ5rSr1Vt^FeG2$BHjZw!$JuhT_O> zo1>#Blld*cP$w*JiE)tcf=`bucLQy}Y`BT^KMIHGGAME)6)0IvV$q8X6JbCB^wF}9 zSxok19M!Q;sJbvLUlHmT8YwK@p}iS8T4>;=T)aB@8tId4i-zSAMMUfbVch&VGB#A9tVUmZQH#=Ws9%f>-PAL)LCwd=L5I__&Hk0sRtYO)M4usT0O0B{D zw87MV(Ops~W@b7ptgw*?8*6&GxE8M!BJL{gXf6{vC|gyxa}#+J)O64aYQ{S7OJ__%PYut>r&boE+1 zUy`XpW_PgwPz4TmOPGiN2D34iDlVJ{rD{;)3ehl#+f%`-WJa^gSbDrro}pk^PbLde z$`8n25`9a38gFV{*OP{&Zb(-sZX*`I(50!bqsGyxGOAtN+a>r%W@bon=8T`?jm}U7 z-=HBvau+iOLybTVJgn$j@F3E{#(u)2#y9~HTWi0HMq(RtK!kF{SR|q#Y6h>u5Vz=( z&N(8i2195>m;!WA{IcaDr?sWHo+5jQAPj5;nP&Y2NFQlXxDx*p`p!_*#cu3C5KuvI zNPN1@sl2wQZ_w0ZdJ&pKMf9&1$_!h%7(KG&(dd@$unH5ZiX9K{5Bk0cuWw2bUi#-wz`2` z5uU9f&C%Q$;Gr6JfF7=OW+8cpf;58~aIFI(KQ%(5r*LzAB*Qt)?40WkTxtC#dCyWcu16Yf5KtF{xs~*i5SSOf_ zi<+xwUI7cp@JKB2bh3dAkHk`BRgO#waVQpI)uT`>HJ3-&Q-RX=r2@M;3_#U(x%{l# zU2okG{{3EUo$6=hw?0!DuC8AwKAHUgAA93RQ=j?!pZdpd{R{jf`}vSb;BWr9)4w8| zGXK>==#;VZmg558?I=M(4{Ym02K`=hcb6Bp4sGvn_QAoe%{A5DU#LHfZTuf*rwrT{ z|N7TTr++zgTRaO%ISecBdWPrZ^Dy!w$>^jV{))LR&c-O)o%o5h&@)p6Z%b8j({_^t z4`qHO4&n2V0C#LI!@Ub1RS`uy_BovZ7soG5cC`y77#1M6VdHGOx(d#wG{x}t_T?k| zpUfg@n&A}B@QZX`5EZpr1S62^+5O!YOi|o>AOe?^4)?{!?+rc>{YSOaXJU8zNAS^p zihQ(ysRxb;;JRs;g}^ibZMR%QHv-!;3YM&!o@oY-hGfh}f#`=ESGMyumPXGG%s>ua zamc~L)j7k>>vO7MZB~QjrH!gpd35km+1>upuP>keC9%8x&Rpn}_rTB%PH{WXHP=Fy zPuk(H*zSfnivXz&T_5K&T|w}jVd<0Sxe+$0IJJxk+e;U@Em-;nvgJZkOHtdh;mJM# zG?m!#iBgx{=woo@R$~BYF;!k%tBy*Jq{^+@p2t*fAOhyL#N`b8N?$5Iv~MU+?qsg~ ztjG46#Xf`NBDsyn=&=jh`{lm51;$|h?V(Y=DE~jG6Z5cg6l}vC;QwdV;JzCu$n=N# z{~7=P#=_K3d;@=EKWCG`559PMkM^XwFZ>bqq&Mjh0#udZdx~WMX74MGJ}FSF;}Eg} zR`hbNSmceWc=zr~4`2+}&Vd($SA^(qKrPk)(jP}>p(2w(EutNp7951^@q>ePhtg;u zioiuSy3z?O({RsI5)*>F!cn&yIr_uwas)^t=Opqcyw9GZ=>9bcQ8!Ic!53)H(ymkqyoUbH2~fb z%Li3}V(|`ZjXijFrAvSevrCb_iD#TPWqUj%cpUnWq8^bV(2&D0XaYuv?^EFnm}704 zyosI71_UGm^kuw?2)aNIWKNvQYvjZMp)M_Y?4}Lj12EwrbV`orEXAmVQxe197kR%tKKSAgg#B^NzyDqUnfRfZ~gMA~aQ*=a;cA$+X1m z=2FJ20!VwsF=~G6&;HMYjdOqa)2AN@j^FRcyu1W2C#PXZogU7V@5%FL-%a4hyQHx%oh`I?lznUpeAPePPx-JUXuKJy?69 zmky0PcQ&f|+DF1T_iAO4lXHq`LGJz2=p^w#cONe`8uL$_tp}wYucemqx7zxX+i{0= zvkuK6YW=uOcJyXxhk{KDgxRY zba-yde?$JO|OvCgaX^uPlv7d7C-%2hez znU&v-Pj{S0$-==jk?nAgt@C6K?$c7>8VR7mm53^AYxscf?Ga zJRf0X)ri9sal#LS9!Ez##*pDiwVEL8k*7l{gc08rfsZ|rkMUQcon=tyBNxddyEta> zW8^+bUb=b#sRen()W+Dg@7Z?_?i8H%;==B}wSKhUT;AC7j^Y)w2jPsivj#;Cl2|G_VFo1<-wn68b=>Ay8nqj9J zDrmr=CNsljW;nJbj&VX68tK%3=SeI-ad^{3L^@>$7sTCPNgZ4!O1e0(s}fJ?=twBu z>W6R%py!7~u_4895(p7xcM*a9gRT!Y(UJfEjZgfqQ}{3Y$s~|TAd^5QflLCgy##*e z(&>Ex$@-ga2+2}y;J$TDF&xL#@`XIWwW_Y#x^5~e5?|nVd|y?&4^CNN$C)dsvE@Zf;lpP5;Zf*HRB@Z5ySBIqg*ZcMmA|E_=} z7=NkKG0x7&JY8#7ci25c&K%tEY%ioJC*TJmqQpnwNT652DNNoOz5%+jYKDW#a8Sax z_d4OA`qDWO0}Ewr1nEwQjp~_WNQft<2u-1x8C}dVumnZ3>_@-)JJP)EVY1MiBT6J9 zEn>$SO;K?F$i#pIwjC5O##EH3z?E7hT_Dq;qA1N2MTOQR@B|4iRN`V8Ja@w-gC;i5 zUqNfqb+u!f%i&UiGDA{gz`p2x(DkA<;az)2(AQ8*d^4h*#eIfSqNQko+io<-nM|U& zqM26-?*(EVcJ}fT)k@YHrv#K{$e)CUf=-rUM+owWjT91?yP>EOy+1}E^PxERAwR4Odos*&?6t0$dcGtpF2+4wn0|JF{ZeS1hMsc0%_+`u`l*oJTFfO}fD>*pO=r@Qz=*F3;fH6$E!5wa~ihH6@7 zpxCCZcK|;#?fdo9zCjJxC~?x4Lxx9+7$ZLG+LBwQd_6!_?$+wLFb`U(q8EFz(h@dwFGz_yBmpc`i)2_NC2;Xd|i zwF8La#6# z5Cvi)G>BMux2vFJp7$wt3E~a8#o&)cW<;Qcy<|cWaygoF%*(veE+dx^pv{Cc?s)^0 z&vZRSKpd_KSM*r7r3ZMb5s@%H#}hDSA4b&Gut|;9T>@`gM3#%lEnKmA35hBr*rEGY zj{-512GOf1EVf2mQJ_@IIRhDsV5U&yOT5Zd1$Am~jfvlyzS6N^9oE{g5rVi7@5cq} zRGyCVNbJJU(yOJXqI%FhBcpnZz}3w_^=#kubUAMz>cV%4BX5XjxmQ__gk2OXC}A9- zu!rNINF>ClI*BB?>U-j0W+rX%YK&*P3Yw8vm>nfu?O;C*#|6wk5sZqhj+BC;`IaW@ z1yh~WQS^%O$$W^+b`ubweTZ5e#r2(&)2u(QiE1L);m4KM#FFJ=kS{oSwLdSIoHG@( z@49Bm+ScaaW$g!FIo%Wr=pXr^0$R{D%XM8tEqIDzyQZ9XJVOnT*xGPy-$6PjR|#}0 zZ^#C6mE~pCl>_i&T3`utY}s`)1r+2JmDiY&W7)2h%Fy~K0TuK`_*H5Lbbz4~@m`6N z3xL=Jt`(#=%}EF?#o-Ni>g@*QvxFOqo?!IzX0h_`Q(Z2d*DMq=BPe0}oZC zJW6T9Rm_>D`D%f3PD9Cji0q6|Iiczz`757jM72;MDxD6DID~f=k3=SPDiui_*%e(U z(g5%RaApSj6x}2$k4!twv{P0(TCbCD8QLi_AEz`;p-l1gpefZeMSAC8q|1tYLzr8f zawwfPLv5IHP`vA=HU4qzPG`Y?P3iW{2kKz zP}KJJHPQqryA8kbE>?Wd@545t|SR zP{*TSF-xoPBO3t$s;syo?b6K594Tp(FNWSrzWPCzh)K2XS;TVEY!i7(D5{!UK-J@i zNQ-VFs#+q2Gp%m(2%+S)P^fY0c9E`@tP`kG)CMYyUKb;(yD`0jqIa>da)XepX=dg& z8xZM3No$1E`QtZ3dj2s=MpP-I8ZOZX-lZ4#E337`Xz<2O5L-{0%>$2)RQWB_bu3#8 zY|}7w+g5Ga^ejr4GLg#9En(#yqYXnePab-tC%P#WpiA4we2X5!6$L~j9fJqg;GmB* zc2N{fubW~+jEkM&?XdGX?u;mFO7iMV=kSc)38l~dS`<%n0eC!BN2-fJ0f-0bt&#e_ znJ-#0D6&a(qxF9?KfeAC-ChI>#uOc@3EGZG|2I|HIHUeA=ktBf$tG|CKlQ&4J}5K( z|BZW7_%Hjp015o{Yo`xM@woGI{{WsZ!AI=Chyad#57^Q|A@5IWPUuiPa4rSj3VUS^ z8zcU8`-AnB*^P~b^&U#V_zu>MX-v{5pnRZwu#I-L$QfW)Pac(KZ*Q2v1Fg2Q{^XYW ztvB=8X@LOO5Ax|B$Z1XlE9%IxM{7J-9AX1(@efEsr zh0p}qL>$080o?@Xfds02 zaZpv85AWCZYDZ5zy`b$8#||BFZ(feq%`h7C=2*lJXYP@UA$}Nbfju|vgQ?Jl+@A|8 zqkVWev=2SY{EulHWi>M7dA4D~1btPtMVd}b^*nm#f>w2L`&I_^fB8^<=$wPnuJ&II z6CL+L$p~JJ9c&^7fPwN!CeUaG0Ic~#oNf^I5R=V-_FI)oOIXQhK0I0wH^HD-W3t9ivyz2zAr@Kmi(pafi z41k(J(T73NC&093f*dBu$hZDNV6wWLBm4S~4JfNw#lQrFRUZhH)#d)`zpictBlQ2N zyHoVvd4K*x`Sh{yegBuW(Dz;N9M1v3)<^7#;UYEfd7?gFJ>U1nhGEnmE#6zV-1=tK zTU-4U7Z`^EXb^>I=ytQvD0bE|$~eM8Idm}|$HWgQ>a;|}Xi_wiwgSw#cS zoW+7;iw1g+5?I0VLu+;aVMPs${k6s8_JQ}HHaj20qMg8V4mjv!!HVn(o;+Of1;;CL ztu}x?jAGvaWa|@#3=qW&h**rk052eBF)BKVTI80F6}LF9lf3^)2ZL#HCwV0ObO>V- zt=JL6m|X4`TsUSBs=o#-puv>a$N5pmTi2r>we;`6Q2CZH_j?z z53)G_h?(HU#`zEN)c0RLUy!H%!@G@6?e~zCV@->nFKNkWD>|E@MDv}@83TCy6`0Yvp*Ml5==wUiIgdjgMzKA z!MW%=UOi8O-B`P`dGKg+`M6;0EZx(d?5^Iko(#6HWS)c<=SdhVY4hVJL8X3crG0Xu zm6qFgYKJ@eo!hH%howCU$g}-F{n{5#w?Z%fX6WU&RMRMc?bI~_3#m!mNk{Z6=H<_# z&s)2Qxf&<>d;*t$Ce^W}`a=Exikkni`v3D*QN}u91Oxs5R(}FOtDtVZKUn{#Exy{i zdHEwjj)c|u9BxpMXrh4rL3D|u#Mk!rf@4ds9n60W@4PPG2;ks9C#di*l{8+B=O^PJQZ`~aKk2M$qDQEf@pHMPW_2;!VkZGOgY@9 zK3q8+J$?qVoUn(}bUFN~aS3zq@K^!a{kK@m*vWm(f`PK7S-mR%3alU&d)h__N15 z%VZpXAx%H;9zzHb$-|v-{DqvZ37=yh_P}#<{0(vU_usHykh}jQbds6K|39!3Ch`CC z-hbi#e<=EW{r|W=SpR4Kzqj6;!hhLMCV`Kj1b%pOx=oh(xi9?vpA4zubtLul3whUc zRK+YG!UH&wHc_sl#JMrgiVP!-M12TGPHy!M(?#m|8r z`M6B{hRxDWl{kdkb*6E*rJY(i04XGh9lvGk0Crjmt|2fh$lxD zOW($GM0)I(!TE`pgHr2Qa!Td$H89ne+}*IcmyqNBT1;w5wT@_#qr6MF0Fy-%jYol9 zlAx!%WRV-K1%!#0cS;8!+ovK#?kSRRZ!T#e1th4Nndxo`@<&tL1X_?IDysV^DHPVs zOe`)u6bfu+W=K!qG48MdLgNo?-~%%=UG0?u-xn2`nTh&7Dr`hIaiO6wFc8wj&-5X- z{)FkTP+}8b=Z?Um)D6*S?AHgd)>N-wzfOOB`O9CH?jxO-q}-6^B6jS4W04+Ci7*ym zB)-(}Wl7O@yL*J`)j83$FxJlX4*6%Wd7;OocaYMXQd29cjJ#1IIdylH)pV7+P)?o%$$L;1u)TeW?$Pow&QL&94v|)dT(wEg z?^HIi9H_;Is2#RuD1o8sR-mbRU>K%n+W8dc^@Z|*rA8HUdt=e$5kqEDT0DzU_u+ES zlRT>MWHKN)+ZP_~dUr-budwB{RBc`9di?4{+Q2~BOr#BewGfZ+YM}Q*qu<)Q(}*XO}ka{`8P@zPggy^={8FB7U+;ETKIW z$P3NuEpJ`*;}!-a)(U(KwL#udKT5b^BUz|x*FpU(wp76aP0JNMeGLf~@r2#*Bw7$A?{3aw8XF8N#uZ$mPK(y%* zoi;i%C^afL7142unwQ=Jqw~-thY_3)Qj2`oqB;%B`ZSZECmORPYd2);hN9#YRV%6n zvM6{MwIdP$@YBiQc2Rx&)^38r*Bl-KFb`wJU7B^+&_?|2IEAH}%=y#UI&ECV@->nFKNk zOd^5r-aY*V0apIO!|AT2LF0N{?EbwXKsUCyxgE<1?`G3j!-+f7g_O z9{vQBcB}f}&QkM4pFe8k@7r4|=9;;)JQsIZ8mvrUz`J(Umh2K8$Dn1BA`dOL(hiWs z1UU`G`OLBRC@EJNxf0oQfTx|ta-OFv{+Yq--uhJx@JJAk55t<|bI zX|Z-FRqQJAcaa?}`XuK|O`MIIS;8mE;(_1@R9sGrPFU3G~L`e);-zC<;}qaCD*25t!cYt%kYX7m@mqa4w}|Vq2|JxGCi-ZJ$YQn@6Vsq zmbB8|Ud?SktTdnvhg|jqeWuYSY#FIh;?7n}dn=Ed!5x2nW7koQ#%lF(l0j^2$n@on zmt$3cEho+j6lL%d_FB4pIYI5k={3+pkrID%6^2aYu!JECmY_=g=H*14k4zA(&f}f_ zSo7YchI>&Nu++#~UmAk{7ykdhJ@wY#p5(}zJ)21&lfcWA!1ImMqChG9y}9sE;QE0Z zxK;tc1I1M}Up0I~meqn|1O;Fbpm%zTt{JAQX{M~^O)DR`rs?^nYZs8~KHs5auF&G1 zD;7DZuz2_GO3!Hl*Uo=dfL9_+JtP>z$iN!s9lD6TkX3lk-{&Otls1-N2-l=~*|(8Y zJ>nFEUST7sEWG_1C$yhM%aFTCYPRe3atT_{p$+v6ZH_f0sBQI+>88-naDL(RR+L?u0h36$4YzXgP3Ue;`&g>_hY~)@*|^asNQ^9pN?;q66Q7~N z%YM+3f<_G_THzfe2#J5u=Y;bb)sA~KcJ_HXs9;PDVcTxz34md#Awh&0u(YA+_)VPh_vX=$-bKkfqUhP1+ShB~XGV##Ix z7&R5?7c~~MqK87-uEJgaqhI`CGxFD`Gk~+R5j~F4JTP|`Y=@4c2b%AxvL5)Ztg;QO6^y3H=r?dcoR_H@*P#c1B}2%3=$3Y3j+@(3yNjHMjn z7$7r}N`X(@i^b?U+=~7gm-kL`DP0QQ#eZensWl=GzluVEumDV;){3s7my)kUpsSlw z>b-Yp>EXvkk>Vpf&!Qlzs7~mtu)fi#qsT474ouh5=FD;WJHU?!d0zqE_<0pcz~ z7e8jivrCd!E0=AYIg)e3F1FBUHlzNi{y_gfK)*#r_be;GcSrjF@ibLWEU+W||0bOK z!u%2Y{}mH2!x+H+e+85vN@rmZPh>iXgq#=*692y@8-4YERaLj%`u<>JBkBKde*C*r zpZ$OENA{CRAd^5QflLBF772XUIkiI|!Tk_O0J>S;(9w4(}0rb%rZGf+Ie;Ji&_~*nF3=?XGDR^0! zg4cZv4uTh8bPYK3=Z8f6e&;i%-xTnI-?T$dLbqpNlqca;ffrQoEG-6pp=3TVx7u@i z)n;SIyS*`JHQJue4Cd@7NE^(zr_T&MqxFJG((L1||a!^tUWbW?Q%r|3B3EN&NrZ5d+tP zpZ${&`u`jMX6oa=i9fQRkB9`m{e@Fk>;b>g4EKP7R|u@Y&s&b8nZ9f(x}xf;t?Q}d* zYUXn(d|d3O^lUz!1_%Qc&>X&sARcy*lI^ep-y{A~rDIqTn-ry0-QnPE3iZYfl#rA7 zL`mL6@>zARBKqe!wDANJ4>aKz46eyS3g{7v|ID~ zfv+{mWi)Ex^_!)K`;TvHbNAKtqmzX@`l_wZuEd+~*bDDAhYk)72I~}~u=PeOvTDNC zD>{Uw-X-K5f;qnt?QgL=7*&ics^fvNELopqG3L(cyBHenE+RGc&qafI)je%PK9w zKl;_*k>+g=D=GbUQ@VuEfe5I8_4_8&emH;t)L6s|W31C$;7YBME>I?SJc`mxQB(*M zv739ocLTK|Q^DYcJ={;?#eHUmFdbc2JN5uMS+)=oT!R?{s1ths5^YJ*q6YH`#s|n5 zYIvyav>LYCqWg@5K}*pBx7}zEs)R&yMKiAw_6IS-92LR)S1Z|woKmB;8xjqmq1UM> zIPJ|4sX*uhA`1wEaZxA8^RNV54n;20K!s}x(d7&h6Cvj8Lu1SsER$}KR~*Yz^LpUg zmKOM0$}@JM(1Rzue;37YP{_}Z?Kk{Y2Noc?k6Vyacq@7cU7cJn+AUBGKrj$R^yu}@ z5+YAOmlHofnZJLae3Gd?+TTxIm3jL!nt+TZfR;Zo(!aR0xNR}lXX zrN^NC4f`4F)tL1_A0(dl2&%8-@HDN9nFKNkWD>|EkV)V}DS_YmiBnHtYac%%1y^&CLRnK>FObc=R{*7l<|AnvqN||j>bBNlVte&4HnV&6 zmD`oO!M(tLRH)@EzI|^qxEI@LMI07>4fW8Q8OA2D(nWS=w$p7_AtgaD5esb+Lo!r_ z!Z>6d_VU4OyOj4%miOz`L)STYxa04WwVy2VH!pX2G%hb741vRqnh~Ey)7^!Y1~$up z82m~$C_EYmM6ueewd*-)f#SZL+F_Z3!srqss9_3%O9P=|f>Dl3B@-#V>q`c|0Q?SI z9+gtH-2&|gBJBvUgBXgAg7VT1aq@vFBrG2GJs8h$We0)kNEU^(v=jdM>WHWljRHiy!`Rp)wr)hd0kvjWx$=61Ki05 zcHebnrq8j#+q3>xVH$?;V4J@(&D{6 zz3M-jvmP(h>$?Y!pX3kb@5J3UwxgZtQAF%)NbnB%a`+-ktVNJq5_d;`g=}Bx?j|?g zB{<-s!x4z8@q5%O7Xp8>bZwx}`_P|oFZEsg@>YK9i~rkTkNfwZo%+J#{zqR5XSXa< z76-+Yy@F-ho-=B8TV1O`hdPjX++RPB`-f%S8||^*0Fhp;jKep3dSkwfvfqMJMPz26 z6@j=jkVZi8DJwZ?p418)#pyj?@=8q?r**>g$E!AC;G=&?VWKGm^!QND*3d&f6$YxvGVE0&667liacK?nxG6`S{|sQO?igp+-Y z2J!NjqDlby|8>V;n*MMpofh^Hv`qPeb>{G%h>c)-z_Ars|$6|N8M2rLxPwA$Vnd#m0|-fHMEYT zmbwft8$Vv81gb4Q7T}?-qGlu(ct=rJQHU5k#ad8|1`lu{xGuu>!&IlyTm8N?BlQ%4 z*HIx(5`cpQGX+fM^dBhmNu2&!b^y=MvIFEkV%Y&YR?hPsR0SrW^O!mu0gyKfMZ*kq z)5ZEY5&?jxlVx-`0{~RRUIc)VAOH%mId_5y#*F`miF&{RSl)W`PX`}>ng8$8|9lGn zWj~n&G6`f7$RvSv1*@fQ z1h!`sfE-0iKQnMNL(`1{QHVIMZ0C{WFYxTZ4CJ80r1|P095$9~bF=mOgWK)3du#K@ zOICYMt2JW-dF-su5DvX@NRbi$f)Ea{w+}SjC+SG;RUTIt@62yJK3VhKxi$5{y7BPQ zUff~b2!~lf85(5m1NZ=TJEvVLdjw~&0W83?a0ChR)F#n$9@c7}Q?9vtoVz96)$Z-X5fzy%j8=QuOEQCpQnk_;!5OeE!+)T(m zGE8t8;Nax|4qlIOHpu@^uC63LAz}vPku`)3MDYJVoqFr(Yq{BFmChvax=P@OZ=CK5 z-}C98k9^OX<~WEvLb_$cw*yViJD#Big@R?cw(rO`c>4q0${Vs_*>YZ1T||Tj1qu}C-8KPk5ZPNhAYU0p;_j7NE)g66lCfK>;MjwcI2@L^ zQ*SrwwI;I4&LT z0xjDA&)&NL#*vk0qM8}KpUkwxJJ1mZ$wHR9tE#K3l<|NpTh{2|vGuTJjX+d&RZDHD zyQO~UWen^9!|*1A5QhLEEMXIZ)h%f*;gW=~SuWwSEXySc%d#w+%guvL*eqcQ%jL4< ze*ZaD)em*I9+n4trZt`;b@i!Jr~Y%!fBy47zW*`>*D+xSuA0np#=C_MQR`$Rg-JNK z`4I98!05|8b{JB|5&_`@>z?_H(xd20$_20wkbW4ZjT|F0w+67jARgbnt3SJ6xEt8N zWX9(4=y(wpl1_GPvcS@BhW-z8HU)PRAy}RQ224k9lKpzU6wmE;!_LcmXS2Uzcg2en z)4FehVcv6s7k>^Je9_d*Og9;U0eF0k-Ek7ba@{ct`?J5N0fYAqGZDkg-qlt3K{}kZ za^5JOd8P3XynZdKIKkxYnmT~X$hO|^`4S+nz&a#Shx()N+ak zn@}`cFpJp>N%TSk%t4JFlzAIYb@uR6?)?q{fmX9LP{-&2C#fs!Dd(fB_T+V5fv@xI zbO5MY%G$3g0bSL^AhKBdBux`Ek7B51#!Pjj)_z7sX0<0)a>^}}Q6DoCfBMOWuC22# zsTwYM3H?8N4N*M`$j3i6Dzm&jT7{=LlXBYbVk|1JA{#Utu|IQfSMH2=ZnB0c`%$a~ z)X(ZD@6WB7|BDX7LCpVNK}Mp9a@2o0>i?M(_0Lu(7e4m6;WNK1S}cr-axTrWd3v+b z1K|7X$M(Sg_e=7u>h++l{aF7|JHu8>TmNMl#{Inbe-V%XcKpBJFA9G02FL;v*suM+ zi1)wW=b65*zO?=S-l{}JVfv#D4Bkb5AgoF-{%i{bY%L%wP3E|=gzaxOR+8EL*@Y&#^Pv$wYvC+4}OCi&R!y%@Yq9lkc z31yst{GUm}*Lu!9l%)K~bigOPy~KRXgi?#_d>qW*`kQ}Cq9M-C{%#}??1rUO+6N3F29_5qL(5dVruAvACV@vna0z?IcC{ai%98tWUoux4HwO&IGqI`0+# zdUe7F^VaC)=`&M917c*uHx(G0@H=CAnD|$w0z9~0fvG5WX%_4ansg7)EgVe%Y>B)I z1p{C)Ohs4zv(@5jpX~qlRqRw${q?;c!>_yH=eNA6Fc+Wyc-eAr3&@g=l;>V#L|6Sl ztoJBzXbYN1iLSvciti+^q5EVZsEGn1_km&`@atZWhHP1KKo{=xG+Fxcm8rz~Xnf+5 zygEF!dSz~Tc;WOVX9YZ+#pj9&*MEHcRBDk1+}rjxoR{vozv+He@CJQ4hBp8kxayOE z%yh5;XOP7V%h)!AOg!?)$gZ6CbP-{+?XXr{H3QHhH`UWPH;3Y9S zI(GH6aCLosx}R!?B1=hD*8xkW8!e?Cy9Q1S#+Lz4_IVW{D65j@7d6Qn@aQIdH7WMU z;*AzM`RvkqVm=x{AfmzUx1Ym4_qO-LTq26VohEwaSN3{E z*nNuIS{QH7+dp|O+fxHDvg6zmiq9@;@x-YKWVU6W5I$}%DrY`AL?vSP%sVKFOx%vOh)1u3nRmCx z%;hAx0k!u&icAvND?mMK`-$poBSR&_j0a+&r3Czgz)R1rnE{}>u~FcYn(sCIVL+Gz zQjZy4f}b>HN`!hPpe-em+!@G9cR`5?=xIn*kU$MBW&pn`fvu3$2NR6Oo=HK>9I?U1 z*I*7sjAdlIATd+rOJ4F4_c-|_d3yn^fpj6Jdqsmn4YlJll#>CDN+;kLG=%?8?OKqT zwa9Dr7p!Hib}UR@>q5a=*$bFP(@KKD<^wtbU#Wv}jZEKgH~goLAxj5-ksRVD8D+@1 z3g4ydhr5sMk9*`a%f%gdM=d9j&B=10!bBw3DRzk}h?!^3L>$Tsy+HpUAQYxhBudXj z24YCtbj;0f!XHeh$Ue$Q(19n@+lVA<;q%N)C``Haz}D!+Aav2USx*pipMX)CiA=^x z-+3&H9?oNUE6!saiggMMW&{aOGEXG24;M}_nv(pN_h_lt-Dep2OchB*3Nl;k#T;3Y zXeMI7fOzt9CQb6z;iP0a*g>C*HO@H)lQc1@8T8DZEbxLMGU+=bWM#xKMexo_f)@rC zFxNeU|4}=`gG-zLMbU3dud|8hf*C;$6;Tpx`@h^H$g(KP4zFgdfm7Q8XM1lXxwv?J zw`Az?^}x%kpk$~BzUk+_zPM;e2mV+nn5T{98Ity$%*fV&98nMvq}dWGr_uOaX9yCs zK6lYKFdQDgFt>W<{Mm@!f7U-gsyK(@d=tgNIF|!B@pF-P@DhjC*s-aw5Aw-_!Q|Ns zlcxtmXH_|}(H|KJ%|$Y>!28y!&9v`tqhq==hv635>a4wPpPSu2ce{OWcdUQ88{RGM zc=qO&zvpGHA9~lzG=c5Z+4r2CFL&?D-TgAR;-u@0M}ZA+?;VisG}(J#W>2zqL90gg zlL~Bv``ihw#tQC*nJ4G(h6TD%WJ4^zBW69B=}+?a#LP2FZi|>=*cjbe3JOZ51xAJC z+7U8HWx@1Pg|$IciPS+AQwzwK z{g~UKOUe+~c|&`z-%n;rZx8fAMX6ghG3N<2EbHUGWtx2_XuO*Q3nrJ7Xn_-dsU(i& zQ!CSMX?*5%P?--?h}zZ8*AtIN~c z`77e^B%N{inP}e%8V381DB1#sH5M`jO|q@OgZZ0+iI2d8$=joPNEcVwZ)`WuFRH;5 zdPLPf{ro>D&h_8ln~HGb_9t4b)u>2*4-!xtNZKV!s^HmcHI{S-D#Iw0joY`^xZMq} zqVk!nr2j$LlIW;v3n);Z&X&ZilS}zbhQlHxg#G!k-NKm+*3pGkoK8V-I0NF~$SH3b zbe;3<0gk#$S`3<8c*3zJ;Z6xekOa)-^Z@3eg5S9gDHCvX$x3cP{w~1uuoT}$mfs6x zF__UwgrYENh*8vLIb*;x%h`rzOKBOG>vJs$w-ow6Nt~WpQx-&1Cshan+Tgo6tI^8K z=p<}+0ahE;thG_v0l@D?a6cFH9R~m}+50hZ+j~7dk|HPq`2!p@{-4C{LK+k5oiu&V z-ximi+4;ZX_bTc>isH`x`Q>AWoP2^>Z%zub)Trh9b7koistjF{($B)gM#4k z`u(zBFoLof@ECeP_nU&?H&m~VxLU7nNyP3@t5g0*e)XO5tP> zUUUdIMbbj>1)cC+d5Gyau?f_QyS;)_4bF{J4GypoY$V77Mb^3Fto=xan#MXsn6R{Iu}+a+Eg;CKt+^;t5|$lWqpKhfdD{``NdhQ4 zw32)iGsDppPzHH0=ixU?(~VJx%RO+_1#}Ip#+EjJJ_mYTIR@5|6Jomg5- z#<5ZHaE10>Xt2yIwG)Y9h*Ti?^3hBH2#nsex6v;Ow}AIAJb$r)AqaaFG2QvI-V_S`2mRA!CBMVx@zBA5!u8NEvHnxAdX#>xE0b^Fe=8_el#6|CR;z@X8a$B{y;4BM(XH=MpI9$)U3bL@*n`P8KW%Ew!`-1&V$Zo3zrWuKcNBt#N0baj7EBX>umFLTWJwHqe3~Hoy}GC?K~+_Q2zpck zzJL(Wyg@-%Jf=sNf~L>ZbHtv3Xe_KHz-W5Fj`7#PBV(g|6BB30c16QE-_T*}kRfsW zRQV`IH*>-a$LXZ`sH6E->1?<9-UFA>{;s03q2o7S!6p|6maY3LGy^7K z&kjOfBoW?nHdiG-*>rED(hWL9Ao(+W`Jx@F6^{Cu@du0ZWBydRWaYsm-ow zJs4R`4Iq#3ejzV4;A}|>q@)8B`NGg!v2h(!Jhuc2QktM;kFBT1W6K`ryL0{(#{OV4 ztHA!kuNU84==^_AV^anGm4C_Xk6qYCP*&m;N`Phn^%QX>}v0KlE1PzoA~o&WFoOa=axf9@&@ zeDHKC&g}x9a#?l(X#FKsGBv-)fK!AHUx-_9hq&|X0T|V-UY( zGrnz}XTK?sg=NhvV#?1{#!imd-P>W!XRlk#o<9@m*bn|gVfhTRFEnA=Wi8S;?N_+oj-3CT4GO0 z^cI07m^4|GE0xWZPmP)KF5M3I#+WEOlHHcA2XKSMHlC8HLJKpqjLVd*xWN_YPk2t1 z^e`(5ZE$C9NC!eqC`vEKgK{4cI`E(?u1f%=OHj8UW&#t*3)uhp^*!wW)gP+Bzw%F+ z0%Z!6DNv?BnF4nP1>QTGO7MuUk6y8$9lSop?+K_z&?CdcSvKL>tm&#M>ZTU-!67_o zib^n`1w4`|YXK?fH+8S77=ollC4gcf4bJktfl5=;$@jtVWjw8nDgnMEh ziAb`R6P|F)Ev+F&2+R9eR&{qL5c9E+bL$ch2=BG_v-)5?)LQ!8)Yl?wpI!`|bKCEa zHv`(e8MiR<*AO7qY4!6s#ZUPd5HM~6jx?JAcH9Wkn>cMCUW|p&FR3AeuPgtrjg?I(e@Oc!HCJ~1bZd{+QXlRc*56OaJNE13aV zRm`9&mOg*(jvr%jZSnQ+5&|c}OHp(QA9TP*bi2F6@4$0I1SUNfM3D96?w(PgYQs_iejjAHxq!v6)Ygu7Y%ztkfNK3O?L z{J%%-@q2^-H0sDBuI88Xh4z%QbBQXWA%5Q@bU-B#WRgZAvO&3kx= z4bNdiA);Y3tkafmMRMxV=z=@2nA9z1gH?&#GaCNy>JqVhk_gm_cXinrhj_Z-V@Nv$ zix3k81WXGV%w)-oqAHdKV>?b8J~!p!Kx!NQeODK&F^1VhX+IE*iS-=h52Oe)!wAt- zL)0XHG|h1|{&FGv319;ng1*1=hWAmBs~ryx<`_V~gUQ8S)_+^~2UY;2!Fk|OS@NjNKKxJ9!YewX_6q8OGis42 zLdyX22RPXEZl^yq=@P3^t9dJ~>@;GcS7{qVuOkRWK465+$q=#Xt}X=q;igzT z8li~_XaV|UH4D@MwzIKNX#`n^Rze1z>xOtrX|t&*cPC~MK$`&>OObF^Q>=|u(_8>& zq)=*lJQj`JfK5{?gpJcNkHFt~{JkK+uBDPoZC=SoX=^yKX@;n_X4vdc^v&>1LZxV&(~e78t$Y-5pt5YRZZyKuA1-w2vBm5qIlb{7fuKJSnS4gK+`ujsUxBDbL#NbGiN3iuFm@+ zWBQrCGb;y{qd15`K~Y{dkrX!=@cT{C05*V65o917?L|>1SFHsF5note)MB%cy<(Kj zjDtcTW!;LIbuF*bNw+W)0f7SRS#?Br7mg>{_hGlSh4GxqmOOq?s;ge9DAlWPJR4Mh zqfb@CQEfyEtj>ogCMO3K!#KAdADVM!@`0q+L2biaw3S3zLE&=t2^H&602fTgz+?FO zMpC&DNs3smtJv?c(2m)7yE4*+V}NpJ;KAn~ygZ9i;^K|x)0!Su)#XwB!nrl`?D~bs zz~BWyV{MGAo^vSStl?W&(}s);wm~G6^&*vVK=NrmB_Prv>d4o$7boqK=F?n~9(+;z zdsJC2O4P9%&m*Fas-eWjaByKfdPZ5Ax;#F;Haa*u+;_B$65wT`tOtEs0L$7N0N|PC z)0EpmRG|m>FSnhlN>QrDZakN>%5&ojW9Lqv1IUBkKR#_N>*vl-j9qo6>OL2330A54 zp~z8XBOv<&QXt^d1IQ8|+>569tdfa+v%y#rhrCm6zcLe92(5;YoSQ`OQ(R)RzCP(j zjs!qXXsg6n*9+D;0XAaap5c?Zw;YmH`u+Z5RA>JG%`FwpEzO_EHTrz0k*NUw_dciq ze)AIh`?Hf}bwF7iz;z*IbpX>jaUD)s9Z*&Wl+^*bN~f|q;2_G?J5L?JR7IVDNd+)J zv$&Ar#a0*XR=_aj&}uXZ{ST=oV1c(4VmJ~pQE8V}j7dt+iBSb8`gUo-Ntv-*vBUJQ zsLu6cw*HjPTByw)v z$-ctyPom=)!;jdzu+r ziot+G3QeX??t`k&9&o6E;voadKL*)mnQ{o<4r+5o8Db3(nyoHo(PXBbYeg{~BJM@_ zZO|)N&06oPS8K1>yd0MM=^Z?sT%8MGl>*z%pnBY_Jmc9 zKax#Arf$c$&{)j0v->frXb?5M*aK+{sa4X^+jsD3Xxp$(WlhLTU%6_&j}-be?Cf3m ztAdaqAiX@amRNw?Zoy5(yOevhDrLJ)j((46N`2X1?NXA`&CUa83DL-`mek*Ci=-Nb zp*I2>laX1yIXd~>)~WqY#jdW58XlvW-(#8}tMeh?$->aQNE#|km33}#>VioHw-hxn zu)%>k7sfZt36PUng|Y^Ov5A5VfjEn!%?9tYhJ>|vme6f!jdn9dGyjUsAet4lj^Ss7 z*~QF3*3?D7V1i&?vA|&@$aIXoh)-b6G25r+UN^NEtAIYxJa*e(ThpIglyVG3oNb_+ z)GI#C&L@dwFuMyghZ0@0Cp&xfnVH~6?q>(RKZd@jZ1>HW6KT(R`q_OeDq3T7{;#}G ztf;%Msr5dw=4RE!%4?O^98JIzQ#U%HlzGn;^>QSbSTW~DgU031*rm{rFK}t2Z~dT3 z8LqTP08nY`za9evj=TG#lqZCl&au#=;EP!F*mc;z1j#69I}_+&N(VIH@t!Cjx&UHnYXv=GHd#}?aBn&MY^3XF+nXO zURf_>Kax5RKDq0?Il()n<1~mQJr$~CwMBjsrjh$*6O2>y3iMi%^Cq3Q@P-g-8TBY? z3I_V!;M;kcd8FxLYUL+Z*qZp|w(^>=r+;}(Jj2&SFV9Gj?_MaVnkE`PUqJOMl4%&K zqNrNnpo(_RzOe2Ipq?`=e1HjvaVok#6X7fdtbwH1m$>tI;Y@^9_bm9-EMvN-ES?G* zrPW>+b|i3Aes?y%v4i0)_H>HzRv6wHzi?W#74}S~oaJ>7qpTM^J%YEWvi`BL8^^if z>CzQJn_E94Uk-)No?9R23(sHN7@c=^c)vOnSh%M6K(no!*=B6M;_J*j%`klwC+b`5gM0F z3JW-rJ2$ygGmqy5s7%m7@;qS%a4bx(f^0mzFZ9Kz2ARbz;Y^yj zb{1}zp*Sv!IaS94A(HQU-M*a5gE$sPW9z-}0?stT;-2$%a9ao|{H{z961QI!stER? zS-oZNlqFkD(74fHvCJTNs}u12CI>?F8p`$J5HU=WdSI6h&XX7+*oXiL1miGkU68;>Az#uM*q1~s$2h0IeaT0h zm($+9MBeVaX?q6Q-(;G9xjU!nm%DSCW&WBpoa{!l1|rY06=7RXSs(3GAvur9s?C#y z9L#-0?GZgi?fY+@ztI7P@V0fe|59l3;>7B-Ffl!UUcWl8pPs*T{_^1%0+%wGYdYj# zD5BsUv&4M&@te&zENoQ5|JppJ4$@eVu8oBW;A@;wxQpl*^bPPsK?4#~4nRw^2xS}E z#0iz|g{F&DvDzSq6NF_Tmkm-ovo#Kp-cFW>wH=Dlqi`OITlp-&mPE;NB*Qs~rZj#r zH+`|>9>469MGfoH zi^MB}<@FmZ0eeL>n%47#BaY#~!X!h~w)OlDQVEZI1 zAcZuX>d53Ov~pTQTOx=ung~T!q5&58JsUDkby&N(AeH|8J zyx(I=evb~6EK@Lb*?Z7gdWRv#A5IOHFXZE;q7+cU6o%257GYApg0l{#vdg{d?IArU zKUzEYakB_c29gI~A_Hjx$qi@27?O25Kj0dvJ^P&mq8WWOe_EVb(M)3|Vtt-T|EAugq#j( zNEe zRVPB>@H*3X9|KqiDT#>rFq1wDca10EUjd~Q^GE@Mb6SMWn-Wcv=A5%ShN{67(0DXc z74jU}xTGiH@J707o8jS4_Ly7B*ePQ#l=j{WJElhcYaOI$0uFEoK_lQB{<{}$QWMA-Z>5`sO3w0R$n|r8!kW1{WNQ$6F+1^( zA#I;=pcR}v-8ND9P&ni#PcsTAC!2u@-6QEGt>Hx8?&V|%j2W@Zy$G0Q+P4$jQG&O| zMl@^uN%DY(4#)~@y!k`2hci=w#>R0;vioK|5DuZFvLvA<2-Vj$v~c~J;vvmD;?JoK z{A2Llne8rPqhRyT1|o7=-1V>`Z$x+F;WT}n&JIA8>9c1Q^TK1h8SkZ!^^=KHZZ_%d z4#Jkw)sqR)( zA=bt44otm?<>tIbvA$T5(e@xPONezJ=*+d&Fr0#VHFgy*u>kHkadev)~*L-ZN5&w_bF)YYAavV zI-sn@+T)NqPD_@wbri7f#BY5V<2}wE9fb|xxUtA#F`MINLekk}I)Vv#M6m9Aix{^C z?9Ro6qSP$|yFWF+?vLDM^3%Q$-47?T;M98iBo;1=Fwf3n0?S_ViuL`z#Fc`=3SRIi zM3vpIk|U|`ulE#Ga>W#M?Wq(}vPr#5M&Vx`SVX}q97aGX35Q=;D#@6J9Sr=VfWxd4f&{&37#HA0tzlaa$Y(NJKUX@=wOhdH#J_NFEFn77v5-p54Tz-_=e z5XyFbCc)WV_(7 zh9bgGObW`X9)PEr7Oc)rCS`_W*%@=O;kmKINsv4X0D+}Ssn4GvgX~1uJwXbh*;h+Ok%9EGt zXvValW-fvkQ4A=UgJwkn7I4{hOfwl>RYoht9cD?n14m#d013)c{sr80N23u#gJFaz z*p$rmiKH3Ne1SpacQD;3G)T-dm_nVXZG;07mq8QbfVO0VWmP8=65Qq#@?(X{2$dkU zj#_a@oR_f}octam;D=O(^h{vVt&;Ov=P|*bvO(7_ms_GLJNfRaA zlmh|(;g}q!P0q{0ua$KkfdR}Wm$AL^5w=}X`K^c-$ketcHJ|mY`l05u(4+c_dZ+)3 zu^Zi((~pg+%Jk%gje)2pO^vUvUKle6&jr^`4;*eza}QCb!n94tUiJF1j6-QpM&M=O zy$6QSg5)8JYB9IN$L_oFa=g_WPpTtR%j5Hks!S!##PFIvIHU;+=d{DU6<2^}^rOch zXL+*C1h5g1wvrZut?$I2Oi|4yJ@@$LrgVvgz#Rb@U`#JchKo14KnB3G1(oROg)^7? z2d~Tz_Kgf}M2z8~v4lg0qX_6YoV)5_0y?~EDNETdk{)Jm0oRrA?ksGWDpPnya5I)u^I~@uouqTgf~Ll7VLxA zx12B!ZqT63CdQCm;q7iG+X)azVz;NLtNLRXZ=B%k z`pQ659garVFZiT+X-P}Q<+I}W$dM9M6->XZiJqV;0Lu~%cYZ@L^u45x!w~d#V_9OB zD#h{t=!DN=B3SNlj!{Y`!ztW*7yBUmaj}A50eG|Ic`2)MH3^K55W}1X zN5VaHAK08`K)SXXpofy5gBC&XKN`$`GUSz*c}s2#Fii{laOvw9zjFEFxr-b95qV?o z;)bz$c}%!C*5?rQsN5KWln7!E3vGY-`-vqBLvmNUmma;#uR zeB5sxxH3m5tCzIg@Q*^jj=2Z$Kcc>hSI;7d9T8@|1;3fHzX07Le}*}|dpGbQfqDkRgMs1J z_krU_VQ=3rV;CGMmF1{kWPJxdHZV%qy&dGD5P*dDXQr7&Cj)@ z+p(O+vwhO(Y-jth+s8V1aKH%Uwje>6cFR_O9ZdU`6?w@Mu39N{NCO3qoMG^}30)~| z?H!T28Ym}LkC9yv7(ZGhk<)E%#x3UwhKAv3n7OR_&GCois;+OlNCL?bdkH$2_5v`(bYXab%BD(+W_k&g!IV`| zH6?<7x+53H?i}0Jq(5sVckks8U%C0rOQ+#}ikD4Mf)`#ko`TEfQU9w-sr>esg0Dh) z$c0rcHU};VIAHKh&Mt3Z$l;cUHG+f+tVzUsLQqKnDu5n9)0KW3W;_rJEm00x_!m!L zB4-8Mk#Ivw>@_n0&_^T7a|iLqP_aXI#4?P7Y4Em!8ca{^y)d784#GOGdID%GK?NyhnaeDAo}{YG6ml#1$v zZAo3reYdmxEm-?p#m{5^_{v3ZkZ8dSFTtonW-{h+y9Dzjx0rA)iCGC$1p{^hl4T4n zhBOq(1R@4medfp8<31mSw*iDc1Q&xZGP{gIDqn z*aignrURQFrc&mbz(bPh#*D8p2Px#dWIh@SU|1tbfOLZZcF;Ht4j3yi;4J6wWdseM zpe(tVlsuHYy*Gj2aooc@$)^aVN5*hwp(NBQD>+#J76ptVapke^X@>o@~8c5t;q&5+oJMji!E5xTH zJYw0xWxm$4iRgkE!GiXyetYPgYpRd0&h}p9U-bJFS;%cHXM*r4lj()!k} z24sO>kW&b|gC(P4`>xZScp?Php8Qu|0hR`yR+df5vdLW}o4|jE_)r1}#t;$+B76d? zB(vN&gh*Fc&cdQ3UnI#Sv_&u?3y}mXB(s{jx_ns+v8#(!!z#6NSJ5&=qik7qb>;d6 zvFBT>@)#B?L=M7AgCi;-LqJ-}tWq>fN#`gr3q(zOB~tVTi96`?3A%&bW(h8~bF0lG zoGdGVD9&H*L>LQ`0-S_#3AAQ;$J!0BbZQ(Inpg(C5mS&-e={9*1TZT^`T8{<30>^v zNF-x~aQea}sbY*Kn{tc*P!E3R4ZluM=Mk8h!`vO0Tt&<-Q9KAy;Kpui(%BAQ_U<1LEJ@vIM-w{zlP zXLmp4WOlPSN7Ah{Nx8>R;U=w+6((V1Buh&gh8<8)gjpqEC_!;gX_(jEuQV)*-d)nL zAgZ=FEcQSc_Q=v9#9?obtjfE^Vd|bLO*c0e7l%Lc3#ko`y7@;BpE^~0f7AUcWV@hG z2+AHYfOPhLF{sL>1e8roR!PacHuuD4CZr()^~cQk641@ePD?v@>bCm|-Y)zkI9S&vT)=wdbP2pXYpH#0vIvpQEPS+ zkPgY`mn6m|C();s9_pCeD?s8}L-%wO`bw59(`p*MVRwa=V0l1p7D^n7YjLE$K^y=* z4)0`iyPdw`L5_YZlLaTcf1C)^Gdk!|>y)+^dHc{{obB9MZE`JRuBWlxTXYe*R7roP zaY2gOvfjy}zaAq65)`p>1jfgtE@T6RLv_aOJiEKtSrFO41Zu8#i!a9#*E$VQ$8-GE z0%ClT))|z--z=RC`(W$Q#-SR7=W*=E%$Jdw)v-;gC>T79x&UKP)a8F`E>BMZqSH1E@jud zz3{xED9>sF0tWpBw`W4(kqd0kEJj|Lez^Gd{GL~(MXrzj@T8@W4hA8b22@iFnm&(D z)(*N>a?T@Vee~VvMz%)+Fs5xLehX+{ON7fx@+C@K(*&Ix30WKoqO3kHo3`2BeOH;b zxo0AC%|hofnX>`0nRrr8sRxnt=bBP)FAea|M-+idtgyn9wra03E5L%Q?XB?SwfC*? z^oq6!ioe~*f9jr3oo-kzE@1HU|36nW{A%StKhur> z<@YaBpiF^h6b0V-K>8%N_xze@*?ZvaV|oQ8;5AK8z*GV zdjqOhK!ksQ6c&UD>-DKZ0G1y;=X`bN*?TTeP7U`jj}HgJvH5cYzM-j$3xb+~P1zO5 z|1`4q+)+3;%s0;uJKJ73H&@O0kg$@7jKzXOE9b-UE9VV!{irz`|)~@+e-9e833pvyg>mh zVpZgA;SL~9vep5=1q_^S_#Idu=b;1TF0+Dt$uN=W+MU6=v1&5MCad3MA19S7B~D+2 zS2XJtd)Teu-!Nhq$G<7#Fg!Il3{T&=3Gch>8RrQbd>gLBUVj0xoL?_4ls_?-?!m6q zbmBSheu1U+^TR<#RSZE^WKmZXeXrorF|#j_=p*OOo|w6`xZZc}?D>gZHfVPB7L3rA zyJ^0I0W7e#dx56(uPsSu2Ny(n@_b}ai%!m88JH}}y>k7x?~o8l^puzGJg1xu4lQ2^_6f?8xIP~+*Kqi> z4EYRs5k>$zHozH!;mcB=5Z8x?CdRJFLjw!T(V#s=#?hq)1?a1Dl%{T7W=6Bm(5~#fhf{ ztq(A1xI2H*Nwb^LuvsP)VKnme@dt{t8j|+!D7gsE4w7d-8KBCXr8H-;Ij}gT2j!0PAf)}sgnXY2li8x6ux&pkGn_SsqS+2KbNgO-Wi z0kpW~bP~zs3uwuTUBq9R`tDBdUa@;;3B$`G&K&V0Zi#0^F4_tEsZqp)A-I&;xr+sZ zvzMCy|FQx0;Ew`vmOLpeu0pO5omOYbA4156+k;Ou3oFY~YdZ}=FlK0imfH-v5@C`u z;{I~Gp8K|)S)@5`!`rbOJZ=EE+tD7xa_uJ(k-^FKk;JcXEHkFpfnn}u+VAG*?_1{j zoQW6Z`cB&Ij$m9}KerqoP0TB2mN%9MmIG&oE|&1v%=UXDuS6crNF$V$i}BFI$fb?_ zL-8G5Fgrz`A89oE-r?*JR`TN6XJ$Hp6|gI&Ju9gFC_n@~Qt=(Je0Y6o4zIZ^^$t0j zfJHl@evY(>BY~w3qIg0kSRciv4M(y=Z`s^U^eNu4>7o1Cu<>Grw`=C7S75WY{P*sV zow_7YUSYnTu~^zJ>bT6=HC`78)ryE{XM8+o5 z@9`lVO85KxL60t)2CfAIcetHwTAcE0+Hm;Ncu?qzkC_8~Bjf9ab8LP(+sP37@x3S7 z()ZASd)wZ5*>chbdbuR~4Fhp)0=#y72OaP`%tETg;z!B7 zFW*T!4nX=@gjWV&Lp$Yu6t-XwV0GLGVr9R*0v_T4;t&)7;Sk{Uki|X*JP`^M=u@oXAV)a^yEh$Ek-d6 z7+)w+cA>O6U}v|{BOUvvD$BD$S@!#b1wGPH16~aUcV1OirY{uVdVgg&T|tbY-}N!C zWt-A;k0f~la!^zNdZH-@WehnxLD?hy?(;}L9SZ@-1kL~&pt7_@H`3z}k7L*}3?7B& z$JE@yOS3o{!m8X1w1D_nkNZrL1zrs$BS7xrb|wmGqU59uX9f9K=#<9)CZ#0@B0C0_ z+s%0GF)&^J7vX{(1M8(vND@OxD+C6}y2-E#7?;fJ3e=x0feSs5dK54F#Fu^InO6O- z@`<0YOayyQ_UyIACp^m$WI5ol$V7P0_d7{&$UKk{M;HhoTfJ;Sk{tm-rwD&tbTVwx zBC>=Pe4BSW6M{Oy4&QYf89!jlllk{^?H0NPct3>IJ7gkqtzpx$@feOlw z0j5BG+jENBgNPwh5GH!PxDIkLWnrnXz-Ny1SJeNX1S7vX3%^dUNtx73!~gNxq$k=B z{GW*FXL)C2{QqSK@I(TLpCo!I9w4i=9O1nf{-3wU?~@8jbBZEOKdS`(A07DbH2Xg! z(0!P}E^G)(6O-|&jZ5lCqJMc{Al|opDPso9_lta*$|xYzVSSUlY}V|9(!OOu8JZjn zE?u7M^F^eM!K>5q8PidP9KeI%$TlZtV}EM5r-ScLtdo1}P^^x<9cAxPnf)kxlgeDp z-lg`~rr0y!WtF{AIsQ$S^V1%i6>2dQv;y1JuCFp1R?b(p^8Kvg~r>I)zXmbDgeZ}p{8Ha;~(2(5UzZ^>VN3UorQUDmu=e5lG z-=zxOm&3uK$LpXD2Zdq4_o<=Dcy%~$c@RfF(y|oy@h@BMpBl^k({$_K+xCBC+bt~Q zPwi$~J_|y1m3!o)Lt2c)ZrE%Ol-#8# z^$NQOl-{07*bhoustU!UFtb1bn0V`Yah-oLt8n@HT~7fP|9?+MMdjyFlz)m*;4RNf zSMrFgx4+)9dgbH%@0AzePKn665WW%_Ja=Z|%Em=A(0@_5H0HZJwcwoQ^Ytco2l_p_ ze+z05par9WBM8wtb9H5ICA=0C)_rTs7o%g^cwcm2J;SMshG;DqbHcKJ`20m#ja^s? zj3yQ?j$Nd)*#UzzI>n9Azd2_KqcUDIDyiSZsU` za#B>_W_AmwL>NNLIfKeMgYKf7L8T?!{mHi!qhAC7&JE@1zs-l@~~O%<1&t12q)`Qxg`aqew< zq~#|qKWzDjmhZNFr{!BMUvK$p%a>X{-}2d(Pq%Ehe6r=^Egxz5K+F4D-qrF%%VRCC zZCPnqYPs5Cw7j}ys%5NYq-CJxl`Xw3QcF)uXG?p_3tOJu@~oEnmdfUzHUGHz2hHDW z{+s5%Z2o5RpErM{`HRhe()@?bpK4Awf1>$g%^z;Q(fr=#cQilVywRL!jx^6V>&-LG zmzpm$4>g}@eyCY#7Mi=8U)JnyetvUnb8~ZT^Sw93l;-Smy7uQh$S z=?hJtYx+#nlTDjVzti;5rVlo~zv(?qZ)>ll7bRzf=Fw`VZE> zzy3Y-Z>xV({p;%2>SOhb^}+hr)KAw>)Ss^(tUq1pofc@w$)HeW31rb?>TsqVBP} z*Ve7nE!ADEGwNPlH&r)QH&QoH_sY87I;pOwuCuPa?uB*Fu6tHpeO+bk&uV{M`-9r= z)&5QGU)FxJ_Rnj-Qv1c)KdJr0+E3M{Yd=x@vDy#U-l%ls=ZJ#TNud7+BiPbFD1Z!SXGhH)LbG~M< z=5)=2HFAxormN;y&5LTDTk}9oV@-8UMfFdre^~tw)!(iDPW88{zh3>->MvD)zWTG( zpRV4n{$%yXt3Oixf$H~FzpMI*>c^^ITfI`fRDHGDsD5?zRP|W(NcBMVE312}rRtvQ z&g%B+7gj&J`dQWW)sj`b5>o zsyNrQwSWf70-W4WDXAH+-VuV+|i}xY6+5hIceP z-tdOzH&nf$YNIMq6{(u9(yL~wE>&Hq8mc-|^-z^kB~*1+y{yVz_57;Vs^+TNs(UMc zTKS{O?^pg^9Rg`buSwZ=xodn7^?!-_&wzG`#U+gTQeEm)YHIfHJY8qm1upC}TUbD3^C$jdE#c24!^TQIwIL zD=5P|Qz#dAE}>l5nM8SYXB=f{XAI^1&IOcnJLgdbcScZ}J3}aqok5g=odJ~k&KZ>2 zPCv@ooj#PW-gyY+t9DMIoZ0y$l#lN8qMY7QP+r-QQBLgmP>%0ND93gLloxlrC@<`s zMES_h31nRPpWC>%^+(&dxAmX4Rg^#6_M`mAZM4w({cREDf8WNvt^aKs_qKj-y9edp zZ+D~oyX}{w{IA+P4J{HyJkp!_e}?I^#!{fj97^Y)8Terx*| zQ2wXw7ohy+_VZBw$L;5${KodPQT~VRHk4oAcA@->?FUf)+4i$ger+4GqV=oWm=&%6 zej78P^()($39bKb8#AHx%iEPG|LrzrLhF~dF{xU=xP|%9`lnl%39Vn)x`y)q*us2h z{rnc@L+iiU!hC4``&%KD zpW2#3`M+&pCbT}eg_+R0vt^*%+QLj|O>eyhWoipEp>=cXRVZ(6J&N*^Thl0iZwoV_ z^%Gl{QU2~0WP z-oi|1{m|A~lpox}d}#fRtln&6 zY|)s$Zi`0q`j#8zwJjRcjjb1=T-$m+%GE6z&6O=0&BzvwW_XK6b8(ACb76}{^XeAX zduwQm#&mv*#&mA09%XO~E4|g+szDjpqVd(YXk=frMI-yFEgIRGG>z$_X&Te%G>z$% z^g7DRX&Tc@X&TLoX&TK((lnaq(=?i+X&TLubQtAu8mqf?D18;>!|8dHgJ~Msb7>mW zfi#WjnKX@Qf11YhbehJrFOAjR`pPs`ck3(CG^P)wr%;|s(`f!unntrXP2;GhFQ8P? zG@3$s6s0#!qv=Txp*)$U(L9l+(da2)3tb1fQRN1J7cheYC*LTu1nh&Hsls_qb66N2dPvA;Jn#Qy~P3yESeH>+N zn#QyyO=DV}rZKHb)0kGKX-w}+)0p0yrZK%IP3yEGjgfWzERB(M{WOh{b^RobF?IdF zX^g4s$7zhI>wl*2NBN^P#?1LEaOk-qS|0CUi@&{>*sp}upwJ5)z#+bVPdm3xj z_21GMS=ZmEF|w|IlX^YMzfECGU4NWfL-_}(6_npjVKiO;ITc6wtyB!iW|Z#?=`4mRh^{XkY zP}k>DBPc(e!kD^#KXne}r&1VG*OMu%P}fchBkS5q^`lIuFutx-3gheAOkreQH&fu- zu1}^gzOLU(VPsvuo5E^!{i_s4*7fm}i1N2n7*p5BQeKq*GDRc%(G=FH>mwpDH_dprZAdqqdRD! zZDa>6v<>f|g|>%x&_dhb4rWE$xgFfwc6JB%ww>9*y=|v=Fdy3bcIe($?qDXgy<+D% zC?DFvd}uqh(~9!J9n6ZhU)sTZXzSgAn-gayobEEAg+ewt| z+i{e?xQ)5d=HABKXnXNC=0@8uY-4V;yX@+-NvkFd-gVFMO)jpj^4{gudo<`ZSjakvwyp8$LR<}KgvUVHup{-^cGoh_|8#AG; zYWoqCmD`vPZTD?sKD6Dtjg{V3vHdXC&OdKsKD7R98}p&{e{EwXwElD(Goke-+n5Qh zKi;M}@b=X6P`)h%O1j>fdN#@@QlO;kEh$ja^?2$5ly6Qw3+0-8y6()GGjHOkkfDp78v?m_v`CatN}&Fd)FH$h3)- z+XPizui2zkHoFOWx?a6W>uY8c^mM&qlh)VeP0-UdwMpx1ViWXqjcFW-Ct%C1cs+2fm7DXz{< z8rhCbtQ6PFHfdyEx=AB@Z1aAUFWID#ZQrDkb#FGJeDP*I$`@_Y`2NBsjqeLLu~J+w z*t`$r^Ea_xT+h9U@qOTb+@$e+&P^KM2X4~%-hXo)<+E5OGH^V4vZqoQx-K3GNyh$T_-%S(cy*Fum@3~3iTX7TX<$-^`iSd2l zXE$Gs@_*f&LHX007~co}znfQ3{^Tac_kn-9iSd2ln>R7O4}9b1ILaU2#3(=TgPR!N z2mbNqdAw@HJ$0Y0z`ycOnF3`BlqpcAK$!w%3X~~OrobIffpFluMDCb1!SSIvS<@6;$6Gm>lNS62Cwd>aj z-xoyVE`AQt4ief#Zh89&9+NgM4_}hj*9Mi?TA)8RG8r5mp1Cua3FyYpMNC8ck^yE4LMI#}) z-91Y8jmO+dQWCN>ixMbN*zvR+9rn~jhuv*6t}v1!TaJZ207Tz(ar-|z|5x@_;9vQt zOo1{5$`sfq1%B;xx|)04fAYna*S$y713?3c^8$t@t70&y%BBQa)08zy)&xWK$f7ss zl}%08{a(W-dXX?s01hJ{C6QlG$&o$FKyY^-5Zs717X_+YD85L780C|TE-_>zgD{x@ z;1rtE644l-+y=Epo?0$*kvY1D85SJ*_#sUJBrphXL6cwXgP1nQq%eLZ-VJ%~rL4-; zM~8Mmb>CneK%MdYd5Z zI(kdoNAjoj=D9Bo+^+c$iLs^@VfjoFZn^L+j29s=< z;E#s21W-%~X^N#HpRVZzYA2#(9sBM-p!-0QOgrN^U-D%7$#7rnfa_Su>pI26|cRgC;4>M4ly)`j8nDca#POXA!iMSp+Qa zj5{-x^5-!-!hp_Yc^RiNaVh1@Z`K60D*=8=2`oE-7Kvq=CQii!_XVeoiM|e zQ#)-%0d0wr?6DhSCjJCxBK#f$iw|I>5krd^ZjLO&bO>fF7LE0|&qwi)^=J~_%`%vtS01X%8QF=NJ-vsU0m}VG5YBJODe71=DkT8&k1_-|E$9hWp|NCYC ztR|Y!q+-7A>Hm+~nQ2|x|KF#2clrOz0%kk&{|6kKR}v-BnffbMY{=c{CcPkox14a3#Oo1{5$`mM5;LfAK+au{(Zt8pAf@SIp z>Ryj*sG8w76*1t^V7@aA>@fjD@_O}vphFcCRP>->di{b&GyRh3QT)1J5TS?BgF=qF zWq_URaBl6vj*2thz$0U$eG?OB$95%+cD^CG4Ch}aq9JD#1iV?6CF%UeRH$!YLJ3|H zqoZS2PYYMq*Qfibwv#=hNaAQZeK={07Yy-q?CL^5_FY+$VyhSCmIkz;XGR8=I}4GQ zq=-@gDR!n=SqP0pFANW?YHRA*!LhaJ)5}9s=Zl*9nE1v-L%-r)3YnBbh14UlByhZ$ z3?CrqYC3J3C!l{I37u;}Ajv_}k0i7Z^c@SK)euh&;Ao7HR9jnxwuKCbSz4d$%j~(3 z8lm!W?4Xt{(iXS&k=~mLSj9BMv1 z-C`-&^A+ZMDcJ86%&AKQQ}L0@iZLij;Zc2JB{sPd7z!2T40pd8`Br!e{2PSgJf*uG zY%CcdZH6%$h5}>JJ{D#l6fHQ%$pIfW&#P-^1{CF-5Q<%tCx?a;IIdbbu8QJO%}@2u z>B^~=W+6wna3t7S9^V16voK|f zvY58b;!K9w|7+e_fq&(nG6l*MC{v(JfieZk6nLsB@Sb?Oj=R(R<~=sTtf~5fQo!(e zk#gGSR|RNwydJMCD?Zh)>ZYLtMM3rkB@G!E13`}v&<)AJub|fp-B50Z-LgB)-RDj- zsBM^wNL{$N0DGzcO~+ys$_X|6Y%OmNs#=Kfei3L z!xuC%8U~YlYRq!~j9K!yp!*}p*Vqo50sGwB&ODK3i80~TkQJME*tvj2*qIu3b|vQ} zPi1|Hm(RM_b|GR4h*|pvN{Rid67YYD=$};srlG6o>7M3))J8RnM5WFDq5xMK?l|J) z|MLoz?~mF4g&vRUfwxs|Yx}bQOFe$cU-0~|`2EwhW2Mjk_g4I*qVoSn@r?R;OCa6A z)vNDxSpt_=_xt=ok1m>qCQ8A;UWu&l6!mI36(Xf;zBQdI5@@1V{%qU0`^9H4N5Q@Ka=iqowf#TnfDUy!cn z=c?bmXf1O^)+HYTUOk%P5s)TeuVtRk7IN(7<#W~DcdjZYgo}l=$amiG>l7xN&=z4# z4~IkXIQjKkF6s%EXq#mNDJKU9!n&QJH9PI<(U1`G=)rixz>(o0J6~xT>c1S6@QevcxK%+GY8eUu%adVot+fBY>haBbO;IuR{U`uX zd%p?*S>BERFG43^vosmgDIr(x-UaC==>E_cz_I0>MGnb)TvS#h@o3Ne8u4GeZJ9eAowx ziANq8*%fy{7jGftz&YKJ-Qj6y(#SCsJT2eQHl9!jGLEWaW_&3MQ&Fdl_4eqs4jR{v zUUx^rTuVT|$baMWgIPza!Wp+I;QYap)@h4QT?ij|h+UvRn9egVFaUnIrWQUmfRI!~ zpoZeJi&{K!Y9f~8pF$B>>SM{JglRZ+j8h$%;7zwj?DeRl;?mtaUX*U6#d_|=zdCFM4FzPZPr$UOn&|iWg0e^P`DMfg$-bbe z3Z|&}4TK2!OhNaVUQIR?iuZ>-L^1+?zpm>!%FjD5Xh^*{pv?*6q4kZ0`EaoBQgn4_ z+PCT`(H*Eed(M>c0dE^Vpz1AUQL%%D)XBN9a&AacRI@KRZC=!52~Y#hfaT)@jwiGL zhx-!%+s7jMHJI@MPC$q*ah@I23jLwa;|X&GAw=vKLkR@bpM|PXpz^}{qQ+fm#@V0j z4xkNM4O)dM4K za3VH191l%M=Z5{bkx%zs{5o5WL6qmXVvKM{Kz#0h3ZiE}=IFI08S*;scM#gjJ3=-RCS(GROk>!;HXty!~L^J2LhUtMUPvKVu^}PTuLx z{v}+1iu(EA4i})Od^R5lnDX^n0%Z8xknHk z$b|=r&a(s95S9s4_`y&tYTXU^vnXJQ2{0T5G8tJB!@jIGvvAO|9z^ksSsmF2{5|m8 zfpc$|(64Yfyzhi!r;W+3bgDqjaQHqMcFWAa8^LyTgl)z9N}+;wp2aX@DP?pf&t zY#I`lJA>Ol<_4|U(+TW4jDs{E1&3_8Z`qkelH)cGJWjN+1SMpk2XV;yOm9J3a%U{& z3JxR!kE!?sMF%{x8IV=Q460(r0n+y1z!m3D_*+ie7Sq-ly!_ zIy=@nj`JJLWn4bH+{s6yi%*;5-53q4!b{wgCIBJ!fH7agJ!`XgT#}6^+M};JP4r=n zs&kb*?);l_ASyb z%^yT#F^&zTBzXUt8>pzX!zN|L^Y+6nWMggym2H2ihb4 zpViLnex>98Woftjzt^jBmeAhoh0fE%QUq8m>>&96lE+uz^pEbTp6QxbmA3!id+%o| zs!yXR|CA|k*HGXsmFfF&rUpFj+b69vbv^*rUWWfW2EU^blv-3jVWJY8xin5@FquPiTSe*|~Oim6ehH-8^J~Zc8;|^(jM!q3tzXd?K zoOS4?UEQ+Z_5kz;k!b8>nB$wklhfESYBI9Z909-r`4kt=&RoF7nAz?N?jQ;>$Ta$j z?;yX@n|>D8ZGFs!sg?pro}(*4(-Xvxd20?hW!=`@r`tN1Wv*;Egx1c&tzzJNI6>cC zC}AZOMn$bFw50*M`gAIV*2I4rA7%6SRzuDpafJITJJ zET|SpD_20q;t2pr!YUR2@9$B3o>^T8C_e9g6ac8bUj=}q>;?c7pc5dKV0*8pM^Sx# zZm{?ofi)Azlpxb(*S|LY#Az`ycOnF3`BlqpcAK$!w%3X~~Orof&Qc;`du z2YB$=jRq_DOcQ*%pc#rD5Jkg;Jm>Wx!aiWgy5H-S;WH8Z|Ji#J;5xJHJdDk?*&BN_ zJw2YapD>h2VhHrVFHp1FAhnjkZXNmpF;F z#I{0JRB>FfD~aQjQI!TaC+ z?{eju3a>M`k2F`?wIqlZV3%G-7(BTqb%I4i-`7x-u7OIP z(IPn&1+_-9DqcqjK8)6@NwO#kb#iwYWjTPc8{T4E*0Yr)@M!8Hj$e3^rFD4Uz;kOJ z9x5wIljHlBn&_B<`D!#zvW739o7H-X5dSmCX1`3K`NCl?sI4bd-h$%usWJTHXr?r~ z!qgrsY4pZhPz9+xn;@0%G>jeW|4+DR46)xBoB99mUfY2`)lUV13IY`bo(Tm0&D{?_ zDXhkS_Dj-x!!Z%=5Ib&QxPB6tiRHu&r*A+;In=n1%*eM46V>fg&2wVc)MGO-BU_Jk z$3hJ>v&1=9R^u1XYJ3tdvbEJ_YcZ>D){Yk7*9)iRl)Q550gR+A_E>L&Q5>(GBrY^; zt}YP=Nsl;R6FmEyT~uL$mpE~V+-n3sOL`YR%lra3TyU<-^#=UsxpW#?U{~OVTh5~SrIp!TYkc+#v2Ar{sfUL zP#2_{Q&K6Bsf>_-qBST`fC)yNuP7&Iq(6a=cbkHldI3^XF?n&?xR*74AVbr2=z7VUuq zx4Z)GvV~BmI%?W;td}6n?IWAaoJUm?M;H~hMQnma^S+FQi4uk)gT`PIJUTi~e)QAL zRfU}hk;&Ez-0hMMLI!!D>82I&V#n94)O1m()wd$c4s0(nsp#E?F;Kk~@faQF)ctd; z<|t%KJK6iY5+!*S z)Pj29mi$EQ9=gGn(B96;?ZlH}r|$}cExbbAdA1yg6fp zC>TayB7>|KX{qH{NcwC;k?ras0+UnU_ft!cy~vJ?C_q$m=xK=-T4`b@;d7Sh*-0YP z2~#^jD7K|XA;bRW0I|e0dPuF4=a=Ms6Uk~r% zj?UMj&J;~YKBpsv&^DFfXR{3372FwFo($X-NqH(+u~Cy0UX*>orOzZUwl}Vs-dvib zR;mroiw#=scmtH4c+=81%8UK8dmp|fv=6^>NNOK+(?tS?$csD#$a#sjUD8%*ACLoJ zxi$~04Kgh?Up(!@*>1Z7t~G3S=NAyCiHQB$ZA1bm>uuPU67@W#+>%6f$0Wr^S_4>^ z1k+8lA5}EjIwq74+>N5FeJwR^SukCxmU3WZe28mmUR?yir!|N?f{qt_ArE>Q5;s&z z0tgQjtxswe4xCpBfS~kPNEKlYR5?%xyV;2 zMitccq=@R~{so$gqSj(C7AiZ*@(MgpDHSFsk9$MrQDd-7`s(^6<7OMh2jKMF}Q&@Jfvx}%&-l!pR7>_76e`0i$ z1;4TEpojx(l~1WUQAnJkPACR|z{rV2m?t7FAKSIdr;yCy2X&Oi&0Dh+qjUx0I8q}o zYlKW5jYKH@IBN$@Tp%B-5(P7*$V++Rylhq?Ocmr%61hd8PLLSPlR7L>A-O&U4XLD% za{d$%CcHK1jR(YW=DG|UADuoGK(5cAfiwQF3<4P0%aF_VraYU=ib0jH(+oTf8{ug9 z%_t7ea(o#ML%}$B>C>5Zq-Sn4>g;TaEE)GDl=|lNKz+mTBZYCfj|YW54DG>vU84sm zU!UnA3R(pyvjhtFs1%rbVAD6%D^yJL6J(k}?dvgUdY&*(RbwIf-=6bRKX%it$^Tm} z|7V(xV%7`te^&p`9=C1B@g7C~H^xnW5F<zW~s4mL~vdt-9Car2BZ@6OD(uPvl; z(wXj@3o?LiIox=5WRuGhx8+u^%SXO13s)d15jMLp3(YsUF=eaAx-xn3k9BGCEO1Zp z|CBh2735pFIMEd9J1FYq)tUE%&RBu|7`JEM8Sa#9T75TF?+u#2hB<8a63t&Oj=9N2 znq8$EU8Y5-4!urgPsIy0pAnX`^*a?{9T4tCFS!S zy=7*l%&O#q>f`b$s;7K5oAM~?mF+Vq>dkzxO_-DCNXp+JQ^w%yCO0l;`Ba}oYSoHS z$&HuWO5!nemj-8R9b9aduJ#SAY8zXiAADs%{w6Yc4f6jN&xgzZ6#u_#_vDV(<9&Y* z|5ZN~1S$wr5ZF2de(Cjxe@KMD{>Bj*0t+9Z$VDx9%Zlv~*{vVTk^lKCF>Relr>;cK z?dHwZ#dUXj?NaAncd^PIWw zRi3slfTu0oD7NYrSncNvu%F6;`BdBuSylcm^EPzsIR~MHZZzE6&>8G)==ithhs#)h z=FNw13l{0Gy(?KH4aq=Y4mRN=9r%WeM7i5@q%L_IK7TBdcWSkM?p)MKFSyHB&)r(T zeRpcjsAo5B#UedJ7Ref#B?Mf;KPN_?!Xlq^&?5Hwk!|Y~%`kM*1!slh#^S}5rg`$j6fNaZ~{GV`d>YPr>YlXx{YVa~vLih@j^UBFsyIfb&6Le?^CHGPMpN;kX+d$j%H2Am8&H9hbGbw}rCL9ypfzO^{D%h5*2>&8t z@%8te5#hgqjehW*^ptG$6|1yKHh?F^Ds9UFU?>V~#{q!i!-wm+9?kv_B~%{HFr%3h znm?hljbxMje>->og&nW{B>t&>DhN~%s37qCL*UPU^zgGnrT&{^Ql)PDsiPZ?8Kcgv z>m;aqi+FzDH^U@IZO@F;#Pm{R7}Tu92_mTZlTi1)*l;`tc}u+TIajHhZakmfNRqSh z`kBTxx6!7mRx^X6GUR}6(>T0%O zyu`MFe7RJ3>wrlIIBNy8&`WA}xhTDBeZ}aHNPN&>`0tSDtRy z!k`UsBXpS_%QSTp&=2CzSPh=*D8#phzsS`_4Kk1ypv?)(au^;N=T~PIkOrdwN(^$a zX00L08C!d>uo1Px$S;OXEVrfoU*2rr3zJZz%6;dQc0)E^EDrO_pn%myK(#ilo3+jZ z%5lqY&;o&at97KfEQIYVa8lk6j(2CE@gy3EZ(c@%gC6*mS9`bsnj>8E{7{=RBq04? zxXuGn3O3pRH4*`NYr$RcKhqM=HoQDf&Tx^PYc?xKr(@Gd^+P#ckmq#y*r{Nt zjZgLV+)~i)9Ghu%#V4QuGQMO)>mI_5bKi z|JJUl;l3%v>fbpm2>z(Jo{k)?8TJt(u#}DQ3TJVpygF<6oTDtPW_$x2PVOA7tx@y7 zJpqBvO(a3P&HPFSq_+o7%+hp%<&^=8XEuU-H8(RsrEP!x^quyF&VqO1&b>RQ?nEcf zUOJz#5q&DI2SZLr240=68Y z)Hx0KI|!C6MpwKdVEy|zFF9^xo3jnX&@Du~3@>q>^OtALOKVqFJI9yn%j-d6*;nfK zx@Ysy;4Sl)hdxABuq0U~PMlJ9uOjO(viNe+CIT3-C!BUF;XF~G>deUi*})U7QMO}F zNQ^=_!8{T)G6yr;IJA`j^}+Q1Tg1Z*VPL)l><~=#1UTj|*A7c&_XzODAeV-XF$fL5 z<+Mh($1QERMK(vNi#J@SzPy|?Pv2^syE9*Jw$`F}{V{3HBX9C{Y0cn}v@Kk4k9lC- zaa>YEDS2h@em3^*vgGxg=ovP*Hj5zgCn4Lz{QSt0J>G=i{EP*A8gwgiJr;(^Wg>De z)ss*Us@+GE`T27r&^O46O3pyU&9sr1@xDmW#lq`gM(iosU7xy`Ka7of0+%4M+z*c4 zACVau2%tr{&T-bWjX^rtj``#`)F;iLlFP=1{Ar_?Jw3G6$C~Dx=_bb49JZN6gEw-R zJ!vixr@FX-y$543*FbNqub`&<$P-N(@Yo0Ax#b=u;b<5z(3Vb1%V0z6$HL>A@D=q!_N!j%QwCtgQi22 zFL7cofd17DtT@q7&f5tR*Rj*YHxe^&V>fi|#0c#~51a&byaOwV(KK@1Fns=Mo)~(X zVrmI$p2VK*83=g{HokF?EVlt09+mYV4Hwvo_Tu_d(3(T}=N58slZpokZIHeDZc=#G z)977FjSQ<^v|eaq)<&TxFTVF>Y9@5arN-N|kvPcQs#;NMR}#4ltQ zJeFMX{H5;+78i|6H_t`O^ZxRJac?nd-#yvL6RTwII#T6*><|oBH=A9qVh{EjcORUR zP}d-;2TS#P;9}q&L(XF4#Y>fYm7{eVp2YY>+(n!GVLnW2A94jj)!=9id^$X|GiT$Z z^nOpZK`{v`eZAVM!{eCzZGlLTZ81F7I`{T#c*!M3&ASM#W!rOCGq|H4<69F@OKb-a5A86 z$H$3f-k~lNxkHM7b$;19eb(~)WU_lJxrCgXC|s90r1ZubC;_Bhdp@P23}|xV+W{G~ zLR$dY`TF#{fA02)6Elmq7wpF6@WkYayX2m-Y1jeTs4+1#JyeemP1FvtIdw2MOpT~R zY9>)}PE-vR9n%jJ*Ep4>Bh))aj-LNUT5vNagbG6Ll~67SX+JMgI>4$ac*COevnU{hzesgY5tG zd}H~4=bl45UjA+TQ~gvBs31^5pn^az1mG9&PLE%Jo%%_nYkEkY08XU4j*-N+uSc<^ z>tSSsv7V$}h?1YWYiMv7u;4lXPXWW!kZ>S1SZd&lS6!krAANNG{z!WzK(+DvBa8J0 zRj8$hxX?!so6Kd&@ePWa3qQ{3dpGKnr)IqLn%TT?`Sx)G1zT@TQR~cJpWW=#p^2Lq%Re3^|S{Q^YFqO{dTxXZDc>&-S6>#KFhI$dZ4 zRGvlg^}98bmIs!KO`(j$RdRYY{%z;ql3rG8x7#lPFs z6_n(S=g(hYX6DB7_sn>?;*Pe`D02tIQK>tQ#ab{{| z^6Gm1R&u$ywsz_4g%cM~X3&2$zko;Hf+yn_uob=9WBUa_H#QW!m0!TK@e6of$mA2W z{|`PoxxA}P7kHBW3PZz&HiMuw-(7}>AW|8O+@Ix$!r74tQ z)BdFG|D*-a^%HsgKRw?>{@?X8JMgFasUT26;CX<+&&@ylZeg+d)w;A;d9E8dk>w~65`0Zy1Vfr-p{ zg(Xu$(}TKJY|TtdEm&p`2eEc)aQVngl3RE^?bAP8F6=3hXF>0O1rpD;qqU%RR5t3_J}R;b{1cl1gNQa~;$&9EO5% z@LE=>ThW+*o&QBL_4iJ`~%0GIlf zGf^0MjH0Ur)~YVvRolrcLVJ;bgk~h)IVdySxM@%4poX3z7VB%a{g|Gz-g6kLX zNuZLnRA%DZHYB%|poLf#DoH|J!XpjmfaorL5)NSZN8+T7(4!T~YENEDpiLLoI}4x( z)PRT}g4?ApSv;PjEkU_4Pp)f3e4u!tK9TM-=q}+`Q-k5Ozvty(t-jn{=9(y6hNF!_ z7LB-lgvyy$i3R9lc-|cgC=3C6&d~^rEueW>L>@LXt+zPiHtuT0X^1=BP$xELgXoHy zS?IR8@JKm4kFI1DnP)sWI6eY}n@DAli_FTT?~iM`H|JWuXIq%tCJq4HI>+OU69Awh zPM-sSK?Z+L0HBTgunv(wfXLm*ec?o?@HdsEkzApP(9?>CnJckcdA zcD(i_{8Rl@5U3zfLEy!Jz>midza;GJzi?gJ*<;%_;Fs^)(31qdpZYqg{yDmn*oN<< zaqOi@6nKeaA!i@F^+OF#z;O@S`ywWBTV;+!Mk1OWk(rQPj5xGVissPc9*i6Dwwp zH$zlSiR!UX9E8Cl6&GnPQnE#vEUQi#2wD)yVs=y(?^46K=32FAp&2!o@C|;euVn91 zN(Aa#wnH9-pwUH@wQh$JOvw?(Ym=OBDu`$TaCKfx^W_Jtr<9p3uK8vyiR*AESL4^f>=EypG~z-EH6&vIZ2G2zybYrE z3eV+nDi-Rrt6F76-D+Ztr{tPn9RhL8AL9@}x_QtqBrwq$EF_rv1}4HEy7_Pf_w4Iq zpZ6orIfNBQ7VCQD>6U!i=|)m8JE`(>_$k11IKtyFsMY+qOdCKcTC;%Zv?lG-#jyaZMk!N^}?AI`|jPV zkeH>D0C`l=rmF;m*=C*duHW)+-??(baF5&T_2W~?Nw+(hZPo^!SUsU{q=b4LwE`T~(q_YJ-VHd~yj??%wsz|?zq7IY|I#jF z2mVw)6$B~>Yzl#&Kl|{YFwQ@GR~qMi%?ZrJF;XYgVV!X;Cw4q94h+jOg4m7B$hQm= zk>RQ4Ik9W%v6+~Wt;afYuUmmx5<4s7{EKItKMCVSZME52Y^zF;Z3tk^C0six*-PpH zN=LRh|6RM;T^X;PB-?V>TwP)tFdlL0XjEf^85yyt!aC2rQa~-ei@KcrLYs2e)nI=` zO>HGd)mBhslZ?r#Bd0b`77#?J%BMn(B2%1*FhqEMhh$0~0!A4z0^VW4i~1qvq1%x1 zCrM+C1mUd^H^tB&)DGiXl`*us;mL`UfhUlIk0UaFGpqj$hUNmZYzvk3*HMQw>7W95 zh|s%5Dx4XUnZM`{FhQz*_6L}1HegNdWb4KF0)(TZ6R>%c`IWAJ0?-2Tdk+8%SLGbE z6b=Ixa70G%rm!lM%>4@FXekDTe}EcQTHT%8oNgc+LS_wStA1`uUudq%T;#xsY}bH3 z@c4jB1?_*FuPDbJGAD8*a)vr;$9ty?Q>Jt|Ahc61A;tdtCohfRGwg04R`>wxiR*V! z#lEl@lRPuZrg`FT2pP(V#X}d?LC1z$vCQh}A9KfLi#%)I8IkBO0ASZL;YclQwNz32kp=hqU7?q#< zUdN00Q+Uku4SnX$0Rr_@kD_VqU3qwTCe%W7#BKSR*k(+GJP!y9=H$j_a})i(D+pxa z9nsU5YI2VUZ7iD9msgq~A(WXEpCs9vV|0V70A?8Ylx-K@|o`1kl6rckQF&Q%J z=5ECB#Hic@D))dUl)OktTU&;QVC}2yxbjt|U_zoMdN!YQaB^@D3KA#S3;O)Rxd-s6 z1WUkq5;kFB*jrDD=DPjhpyXZJo0ZgK01%V0z6$G9$ z2z=xC!|xTY4nO-z>FQua&?I@W2EPSgH|$7Hb(AEqEho~D!p~1MSA+jUn);6K`Kg@- zuA4euV#Pj68OB~*(m6eUDFuw=!i{T}?S*CQ?Bw~A-3!rLJ(;?cDgXNdfh$*sr|0V6 zP+I)KDaUhHhui0-qgMBFY@RjU3u`yiWiOrYQ2B$wt_~N1PKVVSqErLa7f_$YZ77eV zw8xbpNU#|Tf_i>j&jQCB3dAZt``N^2zj!z|)R6BCs`dqLAJ2#L`d@$Z;r9qb{*Nt7%SEpx zVl&Id^J2&k&fT5t)}8p?xjQS3)hN7seLlHECey*xrqa(V1vQibxqcq-dSnj)RI770 za)CoY$5uTA&fUDY+MT@Ntl5(bGiN&|o55856qP94%tK(IdD`uI>5clO3pZCT-Z^>2mVw)6$B~> zR1l~jP(h%Az|(-hHxE2KBwUC7lrI@@Gx0oBlT72#b*)&}9;=dMx= zqlBan^?Rs_iM2a13ah-I%Ta?$xIFku$z8rm6Tn_esIXJWO(0ySMjpUPUAZ5POnfXd z9sqjMYo{4NJnQ)d zQE!$!kEr!gIKiPsK-DO^9h41ajVLy`*&44+f5-R%2sQABo_H(ZEF8Fye;Sdx6JC z#`6EpUB9(s-#Y%Oekur55coEOzz==$;Sr(r|IxNeCg^y9mBfJ+N3I(}{P1koL4`UL zvP*m;F$09hhpwF%p`GY~lRPh4|EkQnu9DPjR%m-0>i6URxeJrir!E;+CmYlDwF`^R zwaIgZ%6~%x^rlx%EyNe5PFbC`=2ds{?)C6wqm|p}x2}F4a-p+7@rGBrQo!@2{zMe- zwm00^JwWl!+b~e^Zff?e{nv+Iyx-jQ@UYYce7DjC1il&I(D_DW+h*cFR+WfK7x3cg z0uZSpBWk|YRp~Z~+u3>n@uB&$pI)p(q59~vDUh(O%z#4yvK`NVE-6s?{#U;L-!U?O zP8w~_{3oggQ#u@IP$-f?*6S2nfMj^~KYJ_kzdZ*{yl;|VzXkcekgETjq77f@C1Kqf{fz?>rIJ$VR0F2dYL;aBr|`#PDzJ z|NY@S$&W8Q93|Dr>34o%PDZ=> zo<@e3q*fRq-o^Jdd^U~eJle%EVsqibO8th{nMpg-r<`QUTfUy5P8IEf_-0CX*$9?k z@@yj&SecRPiny0fvxN+uYGU~WjKT!2U|GRZyUA-qmYWqMEyX6u41Tq^ zE9}?}q+~;)(sdb{(?#|h_P36kSX7%qgA6wu!6N~~C2O*70F=iJz}aYDs{ov56M$14 zgC}qdhQ$N{!3W>Acs~5DW&i(IIy>;E`l%pLL7;*_1%V0z6$B~>R1l~j@Khl1qc1-^ zD)c))^^Vl&=DQaVnxy?;NECP|MubyTFv z!8^xl$XzX88^fWxL3 z3v{t4?hKt`9hp&ED~N~*sJJLiCu+7@NrY)r*i5+}atm1qmeSb~R9=9}n0xB1QbOYS zWh7X|B;aa?WWvD`FApgt!&Va+u`xHNmL^Gu=P?6V$kmD2ifbp;~=Fo3QzDxhUUyJ#%?%)Y3BFP6-?wEfkAl_+p z4jbAL{A!Hy2m6ThY!Tir3(Z#j9_4;s%17o6VK@hEj$)$UX_kOg)=R#$<6^5(J{wuR zB|v9KC=qoUK-W&Yn{`HozUf1{6wI$QQK^Z6@xkl}P3mIOS_oDc!s`rdZkhq4+!N4+ zI$CLBHx)X~a~@qRgfH@Hg7Sl#)FMbEv+E79_ zSYBB|L|8V--Yp}|I!%r+pwncHdp1?<93M^gH?7ks4J1hCRyc?PN`MCJ3XORlvarYU z81oL|#Q~To7uLk+v{_uQb%N5?Gn%XtdEw)Rz2#+6`EoMppu8}zl;%Q7-RnrP{e8R! z99SR+b`z-AUP4hakRnvzhG~MxgqWhhX9ii+1Z?njM*>XEep3X@oQRb8s3_B=#OlBa{^EQhW?bwN3FC<_tsPxI!fj><;2GBDivk@3g~5EeDWRA% zQCnluw9eGZbm(}WP?U||6m7*KYlnlQAthh0IfabElHiD=CDtO&2g4*hW{9>}Pc1km z5Spmv+E^^9<@%T*sHGU6PRMFfTgBm|$-)R21L+1)sT{V=DC**BK>0X9I+lr80rnXtyC98Avvy<%{UDU>A#6 z1N-E7GJcfioJ|2BS_lYlaK{mf5=n21ItfPx?5c5ObC8Sv7FtPCy9?9|P@=ER<6Wm} z5XiwF0Cnk%!*w~v9o;N1o3?{bEP%pcuIfzJR+fSWNEhAO)CjMq_4#fqyVsczvH_63 zmRDGIJtP70Tq~f^=`4~0LA!9FEiIMyfI2E363nS*6u^xLkYEgWzKEd-7;%W-DO?>H z!6e3|hs4O@jAG$HS3zfYltvQdM1exC6?S5}0`Z@^z{K!5y%v$gXdv#ezO@RG zlJGI60wle( zJR2fSM5|nx&TfJgmcIs-0e(1HOmhu^+0p~+5!$U!L(f`o{Tpv z$ha2>TknIDz(5ONuq3euLglwmK2moD_m;SsWJBE;TR1B22A(lf&>kj`+HfDBY=YT4 zyr8JsVfqpTj%e#7iku`s8A0WV(gEt5-csU_=g2C#SZpnLUaUyaB>^ZV=ZBr*;DQ(3 z0vBq`&Jyo=-+u6Tyl2+U#>^+(gTN}umhvSU5^d#2;2OXHC@!60+eco@91vKXR+1*d z)q>D|5Y-<{dj~M58}OtOS%ASfK8GMjh}~4v11aGGAspYa29|YpWH38j;xZM(m=QX` z2@_6d9AD{$@|{KNRh$c-bjfX?+{#K2ftY11H6u*EF@%Hka?Toqh*94yA{xYeH;Ff^ zr|Z0Iy8HxZQY?p}*mE^`rfO-nd%29oXEaUV1C!BOs`WELO-0gH!ORG5pV)uG2yvV{ za*lkE(H=l0=%?gSQ|j&evKK(zh^ZC(LsO@fmI0@Lma%($l@vunwXgK9^hE;2$$0?* zjy5h$K|xyyxa0uCq(DY6vORJvgK<(`q~L6Wi46!qk&Th$I}^!>)Hl1hqrvrnw9)iL zu_6gPd{0tNMBft>sX^F+{QsIHNT8S{azp?sausDBK*~te%TR)a!YWG?qLJM-#GLfe zElGz31m&&K%jbfQiXFkKd&G0*aU_v_G&=V!lD2812Q#vR>4OxvXL#SJGM3_U={%9B zOCq(DIeKqri4Z5d5lK%t2W6~hTqtM_dN?J~sX`kTv2x*;SUg5zkfSq$_;Nh|tsnSl zVgX65!oNqHkeL)SjE3sCjx1vLjQYk!4NqYi*ilfBWn!EKGsNE&Nsri~ zD4^N%N(-C{X!J5f7C(t!c3)NU1|<%}E_ zw0K*gg7WOQp+JWsggEJTeYw5_ZIn`qKx4!xg0G+}5|kcSA}7RYNa191fl+KF*GdUy zoB;+(EHAiDb49RqbYVc909;ZC*TucA8=L3bu)R8t@yGg zt;8yq{Np$2R?L?rP!GGT`h~>6_z5aa0WuabNZRqTaahz zRumBKZBF}%P@&Du$y~Gfc zf^M1qmNx`laWBLb&^y#McOWTje&Yyjj~FtS_oR*#BLWR`<<%tEWx^wt;f|t5`dvs< z$LaS1C^yt-u_1zO6kAYY9Vaf9Cy&NYNAtuqXv@kc#tmKqfwrvs!8Q`xjpt=jD^^_K zY%%psI8?eBhF*8sG}9)?qSV8H+O8zHs-iBDYhDiK z{dBcdC)ZYpm>WWAIaV{`H5gk2CrAp+v6{7x2Nteap-DVN^g}<|qYY!S)b573+d9b8 z#_S}lGR6M-db+}#ZMx2l$MS&-4N)I+wsED&Ekpy%=9rwGMPEXT#u_&Gwr3hUVMyx? z(7DmMW4#P}+jkqen(+~}aRntDxO~$5NT!>`tM>XblPhVN7 zwn8BclViun_^_$lFS}>i4#0ArWW~yogtP_Dj+`nP2%)%}hvA$wbs!!n_d&o^lL}I3 zyI6=F0-&uAAHr%lSu`odh^pt zB$ilCzFW9Ttw4RIFF2Z1KxC>GE%8;+tW9#~9}?3G(iZWh%CKwKK)BHv$X{WKvIC}r zG>Kp(S>qlg4HnGvT^P+U-NK}p$B{IS`U4|3Y@xVzA*D{r+d~pz9`NwW(K}@2q~(zr znC!uav6V+^qqW1wr{0~!Zv;ZYj`Q83E*3hK{R5Wz8bcprlVsnVM85`i`~f^Ah+cv5 zXt@eNr$W@VmNFieahGg+8sVarJGUNKv>I#dc|z>RGrd8!U_JYP?2CVB?J{}o-kJeV|cbi0f zqKvx;lg?^_Q;!~(3GH$y@MT7Y zt))iya17{VP7VYq=(QiVGAYQYfo{>4M)}(--B748vG??bpqWFbCA-IJ zRA*{Rv@DuJ;VYU7F&k_AP@}=MHPv3S0mavPT1+=rfh@xr0_e@k>Ng@XXisou$ACvv zCVj|8o`TzkK$Nm(DZ>nTW=gIhxoARnq$Kj9A#jJVQYuMF2SgVJW{ns}$h5@4U=!#x zuS<6uxvI>NDcKxxDffD1i0z{hw$8k&)`JfzpF<&qVU}#-#93pDGk?X$tvE-4iG&7n zKk2;Dff}$#e))QjV%vbKQ9$&iEA&Okp&|-Ux520!b2`P-9x@>?~7+02z{3CDBk`SAAcx|5f>E zJ_kdi4s(MTdJa|~r>)hjam!WboKS<29{)fG(Z+&F;m>T~uzmcXc2W2!|pHrd>ShSiZQ0uiXN42=mLE!Vmb+;(hyE7mt5UC;Srs}*;$li zt7$|L+f6*nX{7q5blBGL!V+F^C3%|U-q&jH*WfS|LfH#NH%~EVas(HZBM>8(BvKS= z5BdP+4Ejcv%D3TB!1X~KL(y51 zSGP(x#y~-kPXcL=aX7Lq3j2tpI)1HsTyI_(A zeaa8HJpP$ZMJ<8%00eZfC#}@r@SvpR7bY{Z0kP97+o+WvuNVsvDP$R}U0lZo%)>=T z*edbMG7ohI#{81hC3jAcl7e_&JOVw42Yi(r5~gP#i!qi`vlhM8n&o*#*}PUgc}EEv1@=hLqV5WpM*e^VUz(9{Hz~Hm=`S@c zG4$j?kWov~tO&v!A@d72gS^yCW{8%n2#Tm8SjRyO*#O$j_XD(lnME3tXU<4nE(OfP zR}gxMT;jB0(8f{16gS8)$}_(c&JZ7m5TlM;b{=#f~l2DO5z( zrdDP`2^B_N!hrHd@?*wmJP&G^eh*b+tu(bN5D#h0X5=A#UK=VizR@yE@DkK*4LCNy z-=Q2JGr@{9zKT}C41s#E84@8QONd4TFVUcr!{;V9vgNxz_Q;2CS~9F|pBY(bdf+%AE zUHg2yD))&A-XI1Hcg#vm$#03ftT3;B-6>7Hh!zFM35voHxI~Q#P-IZB{%fpuiWEmV z#Kl#k9VLQ2QIPi}7+Et!I^Fy=YMI?obOVS5F=z$fe^hNkPLZgKKGg%yg1aNw;uD#i z@jnwCp@Nj!21Ja3navG!nU7paM1pN(jdXs)l$c8IgEi;sBmwem(nmH}!BC~F#Krq4 zyPE5ddNE(&JDD8vAz{eCnm(eriTQYf2p_ZG+5M2q%i>g)G>Ao1{{Tdb-e&(Wh&7A^ z5>6cPl^rc6i9#Mi(X!051|kZ1cnCT+%oB_c4IMHv=w+*s=5IbDTiz6LgO-{50TMr- z2*o%A!YU%}T%nlg#_Wfr|~++ghi1QjhJN=G6h-w!=^qcUu(+bv^v1(~5&BtOGS#%!BG!g!~J zN`#0D5r2Uny-{u1{gQ`C3}ebOobIYnzpdOqg-}vOtcfiYfu9*qBkm%;E#!1TRm4Pc zUPfMFBzk7((tF`a_Dl(aj4!xwq?G`qgcAnx1r#-#Ets_s@g{WTMWI8|dl}rCk$c7J z7AU%8aS*gVPa8sN6EWjn33(tJfHPl*uT;Fej z$>C&I7UTp>4mb;}f%q)~X0y`)<3J4rHu9nfSC@Y=3nyd&qmj0ytkT6ZyvGAR69Vx(xhiSvQ+h#2cK1$8`3}Z~M0W8B3 zfvs7z%2Bcj!2k^}xhz&P+e;t-?Xm()36m6x)5?0Obsj0LT1h`whJ)}e&AlwtwJ?-2 z0<1I*>BJ$qsN56^V*=z%x^YC979kk9c&=m%lByAS;csZn9%R_1<$(voji39NK*R?5 z!hPPtd1psRp+(O^ziY{o^y1CeR_LNf=Pm@3xPF(s5Ew#yIf5Gk0%U4!ma=%$*5RS^>!b87+`r0)wZ5x72LF zdh)WsV5_;H+ks=L?ID3!BuG#WrMy$}0D&qaf)&?FsxmF8^UdRcH(I?1eGn!7Rx zE1EBKjXf@7gDf|No~1~Cv`9sm!_W4(D7q6SaMT0OBR>Feho_L?rRF>{ZJdFD+A^O$ z49xO&fI@|s8f8htv14%8q-2nCjRKC2R`Q zu%k3Zsbk=66j+g80nCX2*D@L-CP#FU(_5!?884({D#a-k>CS*iJwa-Sz^*cdV`dSY zj=Clgge@*Lo&W#}AAN!f%{RXrap}=agz0t~zagqA%93CxIM6!^<&=$q7n=(wV%Zp` zZ@q<6B?vzCrYyr5_3yJIpCYLqp0$t(TdW)*V?)Vytn8}v#rt5RB#nLVSk2`zh1Hct zQwKb=azIyu9TI99%o!nz5|t>XU4?1Dv6mA1)H{+xR<~$RT!XUua*`KdE!<<_?n`ef zmJ?T+fPF4W^7lO9=3;g*6~ZEoQI-jT2Q4R(p%tm!?*v`wK51WBp5v~HyH>_vqQ|{K zlw}q`svgAfOB^eZ_m@Xo9F7re%8L=8fFlZJ6ftg;5;T2U;5)6d_yDYS0bdla#59PDKipn`4WTr`XQ+Ap|=s&@C?fX+S*@DE9p(Pl>#WIc=^V?!7yb|(&I#%4({@T#+|Ib2o=i%dmw zIugCw5HcWLf=~%)C|c61uoax=U|L^TMq%4?UWRwJp3Oc-h8kH_XMjBL0RWZb>pWRQ zbqnGM^H_c{Re`L;3L@~KffF!@NU+5h*EM;~3ta#KLn%ZQ{60Jcn>hUCrP&w!U0z(U z0~A8`zutm?s25mYh7%_ef{jd! zq`>EwuhIdhGwXw_GioTQm%(`Kfr=SsMj~ab0ZhsHUYPNLo!ON_$W0`dRn_P{H+BlU zkMNRLYZ^dF*aRoU0s#bNhN9Uw5?DGhLS~j>TN3w~ZFR<40_nv19u#SYAI*9e7exPgHB{dsb}e-F9Pwhp{0*W(L0}LQszZ39QKtbVJVbO zdB{`LUctA2_{&eqqyISR7q}RY5H)dgkPim&Q$6dF6C308Aasd6{wdh6-_;lq09Xb2 zJ%ZQG)+<5+)k;hJG5ayIF9%6DxoiLE=wP9H2nR4aO2jKu=tk%Xo@n0KC2vfbZ@DRXNg3YD% z(NU3}w;yt#el)fq4w)SXnIv&%@T7#>JO~7v9Hq**1BE4eYMn|z&Yz*a}C?XoHSP$9zigzhz zXYVB~q16|FVqFWHVSDp049zjYRyJ_LxkE&zVk$8Oy(U$ugO^Gt!X1KrvPJ?#kW0AA zhC>ZTN9no-tg(95(}*2lK{Mp66g|#8GL1kT!E54B_A;z|x%QcKB`YG75GqILAmNek zsEq88h%1aEyxCv?02YD)X9HxV1FdG6-IpPP2n`L(BFb<>t5gh9=H`}jS5o@IDHi-0 zxGE}@yh3Led~2EGxj2W?ruh8 zr?gu+V>J-3ig{KB+mEFvFV3EFKMFb>O0F(6&VQc0+2 zZCvG$wZM_G*PFt{%=1=yn1EwM9|bOtn7navp%V}l5}jnm=uq}Epe;Co!T!#0CLa_= zcquhvQ^86g%OcsAdYDt@Tj73&@pBLoN^tfa-e)>X6i`HYItC_kWFcCRK(vE1I|Rmz z9cNBj3@Z*XA8`mOxKisaxSrB_$S&0_27BVVrMQ5ee#D_-xB3p*{s`*C|6((Uc8!jf zq(%BxXdLPG!NQ65tdHg13iO_^^5GhS;LZK@@zgljIa@7|D`$K&r!vKsbJKoru8fb{ z9&0>^Ky#--&c%P;~YRc6XC08QBFIh_>Wbxo|I^0wd zAVtk_A(F>%X6E3FtVOaf8DG#DiX?HpZ`rA|37`l}x785e!+`*XTPefSDzHSQ$G`vJ z0bT?QGl-EozXY$3TCi4;s)CZ|dm7CI;v*i=tfMBB^#}EFRA%8S4mAK~roOz4ve=LY z59%7XqC^o;1R?1rXKCz0aYuY_0$$hB@*af}X_+jAaKVN+x=QhH#NN@+T>Dx?$Kp}g zh0`ou*iAJ(;e^%x00sb902U!&5H8#w;VlDF;J5V^!iluoV1@vz%zj0?2BH}7t=xyX z6@)c58*{V|Xh<%X5S@`Mo4UlFV_!M|0)65p_&>|^(*#0~%wTR58d=y&aOtx5xL~w^ z%mQR1G$tzrEJf63oTNc_3BQ_}c630`(y9!}0-+a&31>N{WBUlHXkj8IMS{?O7ItX_64*A)?zkL$Rx|i z14i!7j3&Vf@DT`&7X)e&14mPX(4%5=uyh<_ZVz|1W@{WCq&N`3abYO8%I zgfc;i^d@o8321ZJU2sm~%bnGvF}AYQZ39cNl}WHXGSO*u6TBl9Bv3?BpBxL>R)xXH zWCd)2aKx^ItZL0@imOW18Xj7{}KYx-k1c=V~R2OIfXa_eb4pBVO+4lgmKsl16 z)x;F$30{15Hbn~c`*{7qeUGz=*fLJlpao7TJ1_6Q$e_y9M#SUW2@;2Wg!p2vVskwNyiPoHAL=22(3v|%hDzhHWg<^k~f0}4sEJPSFqgdlEZu| zX&g|PJ-mP{V(W%k~_mHz!f>7%m~A9qmr}DeVd<0RcR0yW63;dy?D8H5kMyoOOT{_&j*{a@HetF)kEsn(gN*Y1 zT3BXpM?we4yb4{IvyJRQw#M?B#{_=jT5E%B&Ni5&9`1STh@gYKnLXBWf5I@vb<>*j z5-&+;KO>Ml=+fo_B4a~ZqnX5&2bAjn5n<#FpX*TWB;2K@=_{(4Khs>ijdM3L zVUK&h=b1*iw-Rv{Zb~{f`&p-TL%_;r0Jm{@?izcHmF-Q$gU{ z4FbRLg@?8%HT-KI%2LB=5=Dt`M}hBKdXj)}e_NFr4lm8GT#p*7cNVYRoH}1$@ovmt zTwXZ@uVHZb#|~AchFPc_EHswH#@PmdMsjumXo^ifHjVoT92D_OVB@HbBllc8K0QbOe{gh4%bmdhqRCYB*o#)V2E6OEastjG0>t)8Xxf@c6>D z>FXI{UV@;34^okF?Bn}~=uSN}Q9DF31ilgflP`y0=?VfxQDzvQ#l=6{fYg9yTzeVZ zDXwGkxno-&H2}*kTu?Tx(0f!?W0svTt4t|JE#i=88(@%UzVdO9-1bb9(IjD!aGQY#El z_>%LL+J*1z@u4dQM``oY@ry6kj~A!Ow~j+_q}GOIJZ9Ys3Ig61u+_D~zLFpc#+vrF z9@9=UYi&E4<~p`x299azt{xhe9>mm$C>S*xpu^xkNKJxL{`u#~KRUs;c?3(U@*ZGasecJxknD ztDT)alD{&=_9j#x(%wci|4EVj?NNM5@aexkdau6Ql-jF?=%h&N3y;ZfRD8>XzW*CZ z2-O$cq49w0Rw;ag1Yy=LLPY|37uvvFV=|bm(;JVjwuTNIsy-BRhira-mesqnBg7$W zlkm@uJRqGw!AwBQD6U4BXg0W?N~pReQn>-8L}wf5kucGm+msprkVa@125JE4`6lxJ z-oLv8f2yAf0u=-*2viWLAn-y%;3p41bcCD7pI(%19;O#thVDhK9(a-ErFyD|Nnl$} zq(zSFCz`AIsh_64<9mK;rvaQl951nA-wV9hiz_z|6c%27f!#bVz>gfZE9H^`&kZC` zgVzS7I%$w&3M(wgSS;-4$O<4FxZR-**<*v+iBN4eN{dcKfC&#NJYe86V9SA|RkLR# z_}pV^Mbp1yGZW%a?#WRFR zw%m#@{BBfCcEt7W$Q>XzcFR)JvfrNd&n1Pa!7$7LQvsofnXAp!z9}~E&pz?)aANe!{-Q+I#zS@ zer?s6P~1Rv7KsedU!8mmH}$dbjl^{VQ%ilrw<045TwKKA#y3Z3vHZVtSF~gAkKv!{r-DEQfhP@tKlZ&3J%}T(kA3<_J|o2uUDr(8x3nON&B(Eh z&3q6pCkXYPBxmmNR)V4tlc!Hk&-6K$^HY%3$8<0MO3}S|xjhf%>UWB*8Xm4)#MHxG z7!GDAO*+^?mX+Gpg~eOv+l@vyFegLv_NA*gZYqtF>cz{+nbYao@l%=QZ_9S@L%AIWCS~Qip!*M~oMO;IDwL&o95%Pdv}g*=@=&8& zzbcwcpvGWTv~TOT-uT|(m(fo)AG$(t|995qNr}BAw6y@jxa$T%;B0nMdQVm*xWC|n zdyeH+j@O)C0}}K3Bv`1djmp17nfEGd<6LEJBsYzMW5#1x8%z8E8AgR^_c83YRk%?* zYSlSuHkhj_+z75&(%$`K!j1Af1DsLVTub8nJ$w)d}CMjM}^3?pSH{|qbnnR$cQhwOq%4sOx2u$$|Gg| zLbl?aPEigUdZ+h!`ip?~W2aD&1JOS9_S{m??i`yz_&a~%B6_Xv3gSbvHVEj+oip=L zAm20Q5ULv*6#LV!GXnz${nkJOj_+Bw7Kih1-+1q#Pk4X&ouAz&1Kj*jk5XhaF;fSA zEs35+sqSil;o6=PT8VE2K73k2gfK_QO&fVy9D9);`MRz<#Pya`W{4R_q7P(-7)SgG zemnKi_+VZ$~hoACiwz* z`O_KLrRgymkn0ST_9%tiTCd%1hU2yCZe*564`wuODFQB1llKL($Q#g$P0;jt&L~3svzf z&nlkfg+e%}E(Ts8IE;fY5Ii4#e{lT&OH(`Wr}}v`2>c2E;rEFv_&I!DxPFy*;q4r5# z!QSwI$ovYveQr8xbuY)}S<}6+b~9b}()kXBTZ;|ry@GqZ^j-jG*~hqrVXxL4bLcIc z1MzCzUterl$>QRrnR{0*u7=Z%Yo{o}UjT8-hWlAchxLMaNpej6R(u|FXGHds+?sP` z=9Wl~l7l=YdHABQB>NW9Q|Z0f=P$XT8)QC7;W4>k<7{&5Gl`~@^nnjD`(z5g$!tE2 zp{|ozlfhF~4vM@a9)jdmxLfkt2m4UsD+pVghtv;N9RPE;A5uTSo$|?q&BK9l3uo}= zsiuFf*<8P9TMO1o&}};>%`4}#GuS8m730|{GIe0s{3C^{~tQpJXOUO;{OpHF2I*MVe-E>I0K-M=bOm? zyZ-nN{HcB_2viVwjv(-JUw!zVaEJcYk5#&Q9oguO!0=)%G7u|NrK_*f)j#Ly>bJl{ z7E<|DxxuU4;Lmw(@C_K*p=rS%!&!PLBMVMiWC8EZ9zHaEc$SV^y;;g1J}`keYoE51 zLi{mvi1!Ut$ReK2dy8qr`})ctynJy#d1`h0#yQn(mzmD z9^@HdB|0nxA`Zaf90wb@|C{5Q=gj$*XB!p-@l6r{aBDQ%QUUrVh+*tz?^XZgrO zRPLKitO*(-~m>$LxIV)~;(C%l|v~)^@yh3jb6;6$B~>R1l~jP(eUK;2R?k z-xtnJKXXO-7wZOcvKxLF`cYz{TA~%Zspb2I0o9alYPRPYshgsJViIVPPjcj(Mp21Y!bL1m4zOG28q6sk)EmSywv$3u zK=lTyFN>Er?->m_=*7o!DJGx|cciFn{m;hM|NP_FU@u}mazo^ZjjV`2XHxpND7nVMc|@{y{~`ht{?1zCL5 za0RY1H=MR`ebB9DPr7#Mh8c#PpndAJaq{#P^X!T6hJP)$dy_LI#S!&oPdb0&&Xon! z$-B`_I_K8HGiL*1@pO<8`z{QMWSj93A0Bb`Zo#l!l1%HM}IX!U(DId>_H?k!h49?F*F9aD0v( z@aE>upTE!-!HZ{)AG?d9KeCLI@Kq)idRD{fNkrl{K1^#Lawhs(<}9$XL=sn4V?3!L zQh7mr{Q_sLzu0V{a2=N=H)Rkj;#W}T<&ItTF0JLgb{>)wK5Pc_&yz zxB@k`vJ~{9-O0xMQoTK}si~=K^`dDzswWL()*jHS-P067xSb~AZwE9r3KO`3Wg)D- z$!iO0?Uf{|2TQbNx048^;JYHLcLQm!YY6X^!ZZ~Rr}&E+N9eX0GrfqjJzZwihxkxZD_A>jzmceGM=JP>SP?(x+?;LRDE6?K#bBL^;mY!(HO;05&hI@ z1vtQb4AWL~x$i|u&kjq1b_6eS9{j~da}^UDt0_u{Dx+RTT<8l#P%KOo$QV77L~H^D zPSv#O@fAU^kZr&8_>3S<6SbTa(dhlrRixJ&zE)9{RV}sNsqsP!v*k4vQsqO~6jX|` z`BS^G+F_96FVn2QOmqA)W^_bastfh@WNiSzaBC^^gCMd!TQgDLCbo1h^-x094|1`3 zu&X>*si(XzGG#t5eU5RBXFJ=VD@8r9;JTiOt3y3PaoL8vBGe-rkK|RL9vOI1bgk|N z^-bRWmusc2zYLu$-#nt_mnp>q-7fqQy#cIqd+`|H|v5JAUbw_f?dm+rsz2QU5Om;TPqFYo-+ z&gGrg5B#sY_U-&hAjOU4L`;f!&vOf8Xw3d1YzO%{^0l z#`b)A&#&$IxAxk5-`TtR@~^-A*Y^f{|Ki?%vG1?!`*Zt#cHa-||AT$E-}txpUETM= ztF8Ti>D52^+AqF(>b2i_<3HN>f4uw;cYn{`|M`v2@B6MjfAsZ#`da+zXLtUWul%2T z|J^q_uZ-^h#ohD!e`oKHy}JA5Ke_Wi*fsacAKvr#cm8Ype`4?cS7%@OA71*Gd(XZ4 z4`0>xPw$Ukn|}T8z4Vvg_!}>42j1BI;K0F`Prd%D`wqYIU+kQG{RdzFtFQj`eZTqg zXJ7iI*G69b^_O?=f9=4<{oc#JxA$+o@~f}C_EPeOv47;1Yj2!+&3paYYxj2lZ##c} z|Gn4WdVOh6^X1tCUwi%MUjF(kKlj>SdbzddrB}bc=XZDg{u{sb>hB%+AriW+p~_YS-A#RChc}(@dOD8zChA zTdVXmiBWbcGHuiKT+a;sR}P4$E{a~nM(pWYpj+l=E^-fA8hS>8iV?QygZKZ;sCXJ8 z+kj4$?BQM(YX|Nb_T-d;SgaH1uQ3gzS(Qj&3AxpAkLaH8U`y5J`d} z*LkHbdw@xgOnbH$+i9}v|55!ShmdC`sT~@w@yY*O^bn_RXvSXXgq~~JuN;zXW8X0& zH`Wu+cB7qNQ%`NA8wxcuHvGi;^q&wtXd#jh8K&-=7P{E;2mDkI(g-PxJTFZ>%zW41 z;2!WnOCk1{USK1#ao6vPr;(FbIJ79<6*;lK%~$`dcd8LmL3rv6eSwzln|t z#gUn4fp1&E{-5L?P*yB7B0YjQ7lmQ^%AXVcCXo|3hL7~2W*7vYJ|~~rP7nu<)IY!r~Vgyn))^_6r{9py(lo#U5RLm zBvPU7ySi(~h)dZ0RryqpY~O=fI1LQTd+R?GJtSdl`v|r-j6gH>PyFljG(`p~Gq80x z4uJ7)@`;q68jb;Tu@zzaL-hNFBcfm1*Ark!l(>4L`EUL+(H3}a2bN=oCi1-npI_m& zu?NZ7bAl)}Bi#(%{wBA@p>T~TvQSIL@=W~;|5)^(S)SvViDSD4@^*aUN4bZ@^DP^> zJIvS#P0xM(@5`sAfo$|9lFC_{?6%WZ)qK346STBOIi|JpB#9{k7(6Fo2?`|GB)`%U>2$-2;| zhEwcC=_mGczlNiEWPAtYbl)&v`zQQV(}1Cdm-?2Yhq1Z$W6{7^FG{-ihSN`H#yT)EhK=4C10MK+TwcJP?48r!%wn2mmQS_Z+v?Psuyq(5@=6H_w z>SZyrG)!y^A31)E{r|*1`P4#V%hDYvglzpaal8{87Em%L0Vzoh?=5*Xq;9PFNMnrC zWrR-c-{&4uJF>MHr@%Mt(9sY4OJ1990IgkI0~jq$qn+3IDW-3_K${d0(+uOYH^kEj zKt!>kRF6#Gi{ARD;wfU1(#X?o$3)6GbLVlO^Nl9HxLw=kn zPTzT7JWW8q6VD1j5L`e0;vc7{Ns5&PzK^X#@;XmLf=7Ca;{%dxn;xaIOPzNRyTm>6r#d=`bFN+I~b}h0^&@bv< zd+9tKEF5n%M(vzX2a)m|v6)(&q?#SZZel{@33m!gfDMjgCkQMr2@=5w>?F_fsf znZP5-bwgV)D`~2O-2#ygL)89?-;s16bkbN0Kw%;SB>Qc-Ue`e}65TeDVbu5HH^p@U zLT_0H$Vp_Hpv-RzLW_$o#+4i3yaR=eeg8GDHw7ODm9Cbe`cIg~Zwn>}S255Rd+&gH zIp*hoO|&)rAVpqq*Tem9nQ!uCikHD3;*JA5nShS&`*muYYDtPyq5;u;T&wy%W;Ie& zHwE$ZZOsh~cwxQy?{QnhjAF~eP2@!(Zu|ZJfS>B1ZdwxK;s&&+DDd89OivBRcZdtqToZ@WKd?je0OACn>=>n4!B`mY$T_4g?i)bC1PVCm z+k%<_lhXw2b0RN@4ClLkLiAwyXyPSKtVfWL_y00K1(Mp9nVNPS*qWVu_nTs7p_v$- zV?mD&{wR3!zd7)eJKn}|282PmV_;6?hI{@Lw>4}Vhd0I<2CYt_&;Kpa0{|HLHcp^{ zEVTZozaaayyy*XD?@gfO%FgpJ?1RAo1I}fCOI5ulo1+E>zznv* z(pUzB1irPq(A`yyT7d2WVR4Z}%GxYhlp#A-oG6x*V_TjaJ92VlEtaF>BOg0X96M3$ zqeP({Cw7i~?AYYj-Z8|GJ)&lSSNGj_?|=XM?+Zzzpjx40e_WuB z+lZh!uogdth~s=@R>p$aB)H&?3mG%=p8tFN6kNzA(i^&vI(C@<;x2 z9t(QtmYp(~R?UXn;oyhmX}##dVLpDhd7B`#0OTu zKhWIAuI>7p{I#f#VJml_#1?0^|}MS1veMBv08a)lE+#$(ab6U89~Z)Ui@8Xm>BEV zlGrN8kY9nt_5Cl&*g6Wn+K^u%5!g|%e>XjiqX>GIV}mtWRoAVSprgLc1Vi2|LS zE|yh_@Ak+F*~+XIOGMZmxeWa7H^20A9iB_=3A>|p2kq7@dV6-_>3M3SMrOY&C~ao0vGgPT@|DK? z!dxR+>U%x=_A)PPljdRi3gFA9Hgp?m(#%@)Dvq})A%}caWWvUAv|uWRe-5xHUf3w_ z2Ubw*XQBk#;jLSj8`Cpgzug9|2?(t6B6f_D#WI4A1!tI>kk&%hRg5)j>2>Ltx%_Wu zHjc(iBO_!`PyBWUE6IHrp|&fbN;2n9FSOcpDIYFZ|&?u`6c-+iAtT9a*`=E5zSL#1lLewuE^Ux3-3ri1Oj6k-^183`OQ!Fpt* zB>vvIPmjhfo{!(WgJ1+zvc1QpsV>QUbY>d#^`PgrE7~t*3J8%Qj z21iDu;O^i7;63`9P?M<9h9?kn^qLXe8nO$%!ypi^(UDwe@%P#>j){(S$bnFO-4Y^m zyT^u|@U269#OSdI$};2xMn=*zAh^;l?$0#fkR+gMkmD?bkY&jnwgu?nGU!p*R1u`_ z&wxPT6q)qOxs8lqvp5*a&Vv^h`Mw&8Ou_W|bNEkIv{5}p0le`nR<%k4ORo#7`5Gb z8@o5v7KT&7C?+jJtNr1 zixkI=aP4-(hX*6(uLcUoM@9nRJYbFYk_LJP$q5J{=!LU$^8F0I6NG3W6kIOlF4&C3iI(9Aa?h96%bI>K9rG$7S9xW)5C4v0=smAM7N zI#84Ra%K@gj{`)z><~SzarNHR3+p=>H7hu@IimY?PIPMsRK)ESi#Bvuom@nRM8N6Z zN5M>7;LNSjAd;JV>(HqzHe_~!%HW;e^fbtqpa%nlu__M_23}RZLU2@AAw|Mzje_NX z2?U8AfhTI+Zyw`uax4ptdo9We;Ik7n1U?ZGVYiI>M{p{Ah(8DZ*z~(7Sx#gpcUmc; z72;I_Y|`=>f0_W5!+&*8Vvp>IRIAqec1&;XGa<$k9n?e4)P^F{l9{2x8${ z1;9Q@(w_$U$&!SDr{bPs&U9-Gs>v9@Ze(PrAOZG83kGV?dRM*Cocthsn@?eiXcrVD zP_95&_0{HF-06&sjV&VtLOzbsvOxiHWW*p>DnSVr_sQSt1)&;7^ax_aFY$Ji3Wrl6 z^lyQ|YJmZY9711kVCv8SB-T+|AudH^cwOda>??Z*)Ll|>V+~wp{EvpKgs5X5v8~$Vfa%3{h7M2O3U& z_(f*}&@Ie?AV;qmEklKK8fFQo@aIS_Besjr5pr`*9&=T!_tqi);npE=Pm(~H3zk5H zq1DS*u}#uFH8-S=Ahci#ic=z*K(B`aFW~D2S-{o%#^DTeL;30on)GcjFJj9r*050I zT_YfyOE`lv#io?XX3<5ywCX#J?|_NT(G?(k)(9vf3+>EcAAa&XvkbWa;VJ4au`mLd zqrQ1dKcm-V{k$+Eoa&4CCPc>$X=7su)*?ZaUI5>NDu)BeN%Z(AUr|0W(iXu!r7pLY z&Y@rF!(t4`A0*9e4%jbY`RL=4g>e(?gukyvMc}YfG#GhE6zf1c!qPIDNGgy~C|ulL zXhQ@h0FJXgi#I`{E37swk&;Hsl2E5f$~CLjso0UOsQ7*q3T}fU4FQTZ1uU5Mt%#Cl zP4}TA&?$}61twC0Td}h2eCrUOAp`}5k=T)zu(Kdjq>gt^J)nRrq@hB(Lr~bbG7-@Y z6^tfn5p+c)#q6~JHCa4XT4MT%O#qwa%kr9kEZ|?{$T{{-iG&pqXozNtQ9;ScS?ZIy z%;u769{F17tu~WTMrbmF5SFk}ixf0$2N<9gG`{^;V6u!z;>=?J%aEkRC^`ihfDS|9 zwdiDIS5cIPe#@*&3*dTL!uPXikrC)qb(dzzKv5kTgs;)kDI=<7*iHEuQJZmNYB-ik z))36|uhB@urHBs6h7_A6;AGy`hGClGb#2uR;w~B}H8Blz0-lawi@ym+$xDpHM1XA_ z9|mKx;WAmmRSIIDRli;EDB1cfva}YNNFm&*kk$ zM2p_mc1NY1(RxK+;}wZGf^nTVW@9Z5iBuzSL!1ohUP8z2&n!va1--B6U!$3{_|niN zBNfr?hU^H$h52K~aFsH-)FY6QxJCBM%U*?&Ag-Gh9F)mlcy5_@)Gw=$;KRl+xrOF- zusoremu7fH^noaFXAb&=(wry36Diml0lM?VT>DrB?KzJSq+G*Z!*@KjgwVLmbsIDm z5y2IaCeIsF)~I*^%}%q)2I&~^)~fS{kB%t)KE>9}7_!OL5KKn0sMQOgZ7W?$$;d1k z(E4c2DU4a;S5LdG1u+P-VG4X4R0qIRHwcnX7d9TU7|Z?PYoQU87Y{DY8^(=SaxO+H zt8+JZoD4X8PC;1g(SqpsNr-YbE8(5kSj4nhB|!v(h1%D=}~) z`Ye@cgs$IRRBXvwGzeexEuya*4w$*N05A9%dk)OEZXHVRfig5hOI(_V<-EPbqcrUp zdi22lJLKAipEztc7RVSZI@cVQh_mBa^o^Zvl@LNOs}FNJhWi}~QwT+d(mP4$nCx_V z^CVA+3x0qP8KMP2Z4vtaC-7g^WpW%DQ_1@o;xj12l6RlIFf3WfG&4YD^L9!OkKr>~ zh?Ifk(>x}`5A0DeTCO_XRAm0KDK{nj+ToUx3x!HT2KbwR6TU+-sM0>yqAz0xGN{DL zD5sbTR>l&oL^kvjBw9F&zZ}PqDtty*(=sy9cRnu=uhWFOvFL&mAbY*8h}-Alq&rUF z;;4jNi~v-HTTOPs(}2EU15zX)%Wqb+0D1Ch37J3wPzDFF4jc_I;L%^%=YOGfKjrLX z{W1E6=$G&(-2?0OiM;ZmlL(v-5-@UXpOJD%kbubh;5#^GaeHSFC2QC9QxQkqnVj^V z7wwgWNd^M#i3BS5sup9gYNY>AI4X+WS&D_tt6hnFgFW|}G^i9IJ3oUi6eW ze?U|;ZBwk5=!|+)<>QI3}K_%c>kQDsHGcN?J6lyB$Lo! z+G#;hPK6k_UGUQc^VLfZN7E8{UQ_Du~Fw)~+KvYo&|IMaV!B)fPf~yM?R>Q|%ak^+7uuI5iynT#pS`goUJ5p)p#IRrJLPxtGT? z;+dvL=2~esR}iB{)esOnp}B#Q><|?oRPolW>G&>*%6u%ulGPlzJMv5JvMu8A9A2m? z@-)e_FP1)6vOrJ})UQJxQz1v|)I@Omi4>xV=op{_!2ZeV5B^40XLS*TT8JmR3wKGYdi0fini*82%m1YuUt;9waaxXsEQo%d&^RKnargLrI2WT6`nk~@c4m7ksh6#zAI z7Nv8@;hUlT)(uRPVQ@+&5o;ZDefH;Ng*4u3zX=a(K-49SCF0}Dn+W5@FkV0!J}emu zG{A9EX_bKh-Uux(F^AWhUSBwlQQET-L)LwTMUa#Ql@BFLl!+8ZI|!Hs;8RDW&oU*F z`uYJig^h`duN*Q4jaD!iu+fEgLtB)LybI=b(5Lk5)b$VNT4~q=VE~^2 z25%=c6htazkEJGL( zslsrzFoOavYLOJi9f2F)OX&ZsjPo+5p!zba%E^vuUsZO-d`>BgTJD>W2Q2N;pD~!i zfsR`6N#WrL|Ak6hh+@sxvq+{Gc7KSXnOV}6(jgGaZCsGTo(qJ1O*OUUFc%kXxZcTL zI7fE9W{M+)`{=_{nKVb`QwfMHe|#7al?vm_@tkNGXb>B1=+6>YZlqOBnMRp1Y4lCM zm->UM*oulB2dmLCqCr_exCzQ%?Dc7*Y6tw{uTdBvI}jvFh;F$=7cMXStr`i0ujJ|d zFxijL&tOYt8$fm8^$my^6jsi^=>-xZ$q}(wB+^fYZh#(8{I$@OTZbgnNXr#DiPl70 zsEF3w!K(;FIR~~;nlKU2oho81Ax!Dh5_-hE7&kyJ^qW9=ggFr6E1@)MAkB@cQTKVE zczf#pcMt~w@?B)*r%)PVUSOL53arFnYLNcO^$mV3W`aH^0KrOmK*Zy%ghjGBlP08G zTx8wW2&aLY6A(DU`ZEZVq|Ibm3P)PAIna30wLqGZJd&K&!-9wK{q?b2V_3xjDaCL| zz7z(K*kB@3M7z@45+uPGU@3u@O_J5q`gn^e{Y)Bd z7+?q_a$gk%H*}fAi*&Tw91UlXPw5HeI3|I^B(>Ag90%Cw-EQdw51l*?Vgmwt{Dk~> z@&o~gA*Lk5JpIid2&Up$G$W&_d4inWL$hUMAF=H7HY7tr^^c2H2gD7K0D1nHe^CI%S>8uODVnq{R4?wQ6oeSVp|Xg>u!w2 zW5-HgT>PTJ9H`L7xT|dq9hTrKuM`{`Vtj@lkE9)zEIDrk-$aycD3TzZJuLD|WReHA z%Xyw6`cXmtCZD!O59VT>UI5aVAify4 zCCByUWjC=eC<~0z&vG`;utgFCkd#Nr9mdc`t8z(ZvDQp@6|KxAauzH9DA&G-7lqtS5%@Der=5&qj4Z2Y6<@^feeaw7jb5WA9mnOrrv7V|$x8ybXe0FM4<#0ff`VIF<)lLOQlCW%SO0%i2w?EMnqpEv%?{y%PLq!thxw{V2^AOyKyCPDD}^RC9_40X1b`usaR5dIV-v*jFmzZd z5oiI?>08ZKpL0vy_l(v6)P;c+iNR^S8ub6~W_vc~3R}oE4wc-LryYd!6fu(1b_h1w zX2~}#b%1E?h^|3KES&;+DL5IqO6fjIwo--{!<)q;g)==Gjhe*!QL#mosw9#;xfThW zN3ndftPeSZeHllx0SI4CeL+a@qCXeu$OVoPhB@HRY0EfpWdABzNbF{rpHk^Z3DAUV z_ztJvX(x0B$!Qfzbj3)dxgmiS;gWox`aR7#Br+RIg>og^7VZ>i0-C1v?976NZ;^}% zR4ukzviQb^Y}yRf0^sH4xYN)hqu5s3B;jd)q$Hw!`3jO=F0_g%kjm{9DCvOw0Sc4h z`Pf;3ILmKn6_uP$h|3)}xlcvjg}m#J)}l>2pW!`ZP1+r@V8H<0uaXhjB^rt~aiknl zfOYVz#?Tc>1TH^;OsTGXo;ih-sIa&`6dvbBGKr%f$h`-$sSuG=UIh~Ery>n4XI;n! zSLU6X{3giB9P`G0+bF3}wBpQ}XoYGyZHYIWyR;*}it5BU}tZcG$l#?Ln#ngOF z=!Pdbtx)aTQiUz`ziSo#%?fN%-@I>rmtI{cf0^+NlP)r#awa5fIOV^l(cI; z8^SxKa8+sN9I?W`q-eLSGr5p#)hFY6ZH;IyDY`r%M^tgLVdmB|&u& znAVh_lUE`XMj7^i&Iv~EWJJ!A0-;@Or_7x}9|Y;3`o5CW566s_X@67iVyp38oomfo~EVP|f9YkR(8% z$@ip4IQiO4h9!fOzm&16tAXS(Q(+JIaL)T?=mw49IY79Fx!lMEFqw0@(X|8ASL9NK zD5TV@)SD)N62q3nRAIB^?_0HBEDd*}weoyjAWRYUETmzY6{Jy9!0-WW3e!Ir`}!UdZ2;u#SNoPMosLu^Iiyik(^ zhSe)CIW8?>1k+zUl{NB32JNDhDMXc0#!?#UKsFgl6NgZU7s$p%WpvEaX{mX@4TyW< z^2(@$8tv%av~o}?3kWy{!m*b1d}(2MEjbt14=tgZ}eKB_;bVQANtU}TUSx$p>3DCu| zL>MFI8sR}p;-wj|sZq)Vxsgo@mEI!G3e=84y$YH;r4IDBBK9+A15k0lf}*Ip){%6# zVzUfQOXvqnek6u#V9A0?{UceCm<>L>`r3g6e}X!yA}q|beO!e!Y)%<>il@U{dNrUI z46?VDQRz^}vQ&gKeD(hGh6F60qaJu2=>^8IyE=>nqGc-mPN3@n(RV9tSoNCRrvven$9jU%4q(&ku z_#4pPs2Yc66I@}A*bD!Ng}|ypP@(mvOa{NxN<`kcfIk5=T#;`8+cnB*>4|YxT_Dgq zIi;fg@=S88gy7Q(h%~Z(uBktt0O&(WpTQ||ud0$*CMYkH8^a0@$5oR`^f{zaDjNIQ ziBgTfDN)z-HGRQFq=%k`S`ApUlxe`4p~fgwqEcwOIwBlsmL@?47GQF11 zYpUX79XL1=w=(hhg3z$h%KkJxWz!wyIZvkSi4jbq6-~Juh6h$d@*-h^3O z&k}V`7aL$ANGo<`I3K1ad0HFSS?b`h$kfy!Cm{_a2TIO@e?V|uzBVjfG!6JXI%O$T z8jhXyeaZ1k$xX)gjOH`N;x0Cp3O1QvCl%rhE#)J!1yGM-8p${>$8Ka_g~=KbHR%&X zG;A4&lKH5Tiu2@x_Mr7R{xciq%?$b1bu;wpLjoIJYEj@s$rYB)BA<38@#TNBNSjT$ zs9aI`5U~_Ga!C&+)L}vlnpRC|8m!8>$Za9-Fb^5E8hV+DRVFtgJm_N8A&)f&EpyOH z1(W6@np5k`H-F^ooUWE?`wDz1cR5PwY*Z3GW9A-a$|rl_OdO)JD{M9l6*Zllm=UuS z7;+*LTnDB=G*L#0>r(G4^yhiKwAwPt26o(30QbZ)U;v3ktDhjU%o=(uz@O$$J%ooU+XLKO4 zICf}--hcLO$Mw)4XLY^*>{a*vbIJp~|7upbg4Tg(Vt8mAtpUb7wDI!nd^5p^#|}{u z-pKFzhsK*ofO+^Z?O8Zgw#Uo0apY8?>B-H$=ia!5?u1_L=Jr4QF zdW^bwYTH%YD@RFy?nqWS2m zkh8wsR_0lE90D?X#+(z;spDYA@B@bb;wvzwUq>4?W>}0Rq zq>r_!#2s`g#m0$~L1xvg^})l3c=6D~V-F6s!T8bAmN+aiFY=ExyLhm1Nu2eGCqNbl z??&U^S>zl{cc@=+x7C`%A3l#iEiKUAlU|dJ!Pvj~BgQq6KZ{?ByC1_miJxH-<0+xX z;KaJn5YvXp4-T2qJgp|?f#BYM%25B*?9o^%5X$;;U_F*>EtU(edY{ zw=xZdVcQn2`e?rFekP%VPJ<+6 z$tGrP(-;CsCDDcPmnkaG^AmcD&cW$$qI_qpBt+Dx*8%$$NrNvgQHZUTpjOdrX~FV7 zOB5aM5Yn4>}fT5zGo-x_K7%sHXw~%=^7f;K_ zscetlCY&4M?=?DJYG#y=n}D}h&}plLe+15Ar%`j#$Ra0+nN$N_VgYEl*s@@IK|r9+ zm%ooHIw(P!YmK86++`3+tg1N^1R#ne4PBE5W;hfhqyqg2sPP+fsHd-2&~MYpDaq8E-jnJ21Z6Q^2lbcSq3F@ zpv3;<6vWa-mWe)`f{}1|Pc^mc-0ITJs>v}(8q%{XkF{uHt>t6PUAhz<^<^^k*KnEW zlA9_-f=2_l6{w_N<$Ao>(NSH!Kp$5Gj!A{D85jz21xC6~h}sijR7VWL#+FVm>kEJs zq0-^}LNfT9S&C`ou)Lj0EL0}KDh)Z&USZ%3BPCg>G=ekUH(O&Wc>=}TsK5qzHs#6o zmj%_Nol9$WQrzL2RbZ+FB1x$@D%fm#V&K3UwRoc=rZMuFJqKcMM&8f?BWf!tx2FS)bUG)O_vMEr^HNdQWl* z(taQBc>^|Hz*Y;kp)J^OVmjOh#;nKMgiS73j4zTU1DYW#nM%zeZE;yu2SV+TMr`Vc z$p^|aKCV`5{2dn1ZsDI*^nuTX1W`vAH4o#wr1mf z7%FRuK4@czalmTPnk8$k(TMm0!8^5ekR+e08wFJ=qXT7ho8|QwncDcnXWmJG%ex@xJg@XHKxcI^&D7FCm5cM4@;sKIq0yDAu(#Cq9ujj^N4J- zHq};Vxkhan3}8rR%@~ke=mQy3-sZGw<8?{^r84J<-Gq?+aW`u-2enMFsOp5G!qih3 zn=2)!lE2p^=h0Bb1ms6)Yt$cIlA3wc4OD0>$hqo!jxPa{X>zmJMcCLuQYbCPU?N?P zwYO|zU>OPrKgWy@{r^*Fx%@;oZsTPy-?~kPq{1AeP}pt0y_>i3o+-u$=1<@Qlo^<@ znBnA9nMsAnObN(XPqxGNx`7+7m9E8m(ZWptqkT_#Od$0n7drVZY2v1iZX67IeSO^W z?{VifxMi685wBcTBR87kbzR6ycd1~`$ny~aG!qIf(&l54Gk|(Sd%5ujjl~e9Zi?Hv zbRwo^A@Y8i*=`PNKWI@zXqA1x+=Hg#(F{96kS-`?~R( zgb{&vN%c$k%S|pHD8XtvyYVz{Ju$uAcsZFo4<>3PD{WqPH~xgqAbj8ScQeNg`o>=0 z^>ldS+p`Lzn93U&8k)?qiZG#ER#NKr(PYPX(3A)dB9;-lWGNC3nt4od@y4x_s#t0Y zk?KhHB&mr-I|ytleGc;v>GH+^)G@L2v8?1wQK~#|8iSCLqQQL0MxfnF??7or}j`y0QdxCziXy<2o#hEu9I7osNMq-oN-`DP}!8M5W{G&%smaA|tL z@ie44{FO z)60EkfXC1aj!$g8Hr#@qaOr%@nPs8>e-DmWeYa`4!zpB2rav5ySf)c9|GsjMxc+6T zE_9UWNPo1P#mw@IMv?g$g9=*3rCXwIaruvAlPJ@17uM7>j%Or-1IZ#2^Dso_hqxlv zr2Gw}F3~&@xEGKtQ|?b}zFCv=^NLcH=%On`_ z-4!81XCgv+OO?ZntxZdJ(kUr(ywoj;^jHi)|G2)*stK;EdJLLnQ)a5vU*L@zmd@rf zsCBfZp;WvtFM9A8>1~~)#37nQc&WGAVYM7h;4^*XG>Vv^IZLLA;UXPfXJzp#Q(_nb z(^6qsNOqPLrH_yc#$yKz0a&Q&CZ`-qii%|W$>n~Lj&eNN6_8$&0E`Nr{4h`2WVW=i zT&{VQ{teR-FVo*EP1mE}vQ6gFo6m9s9V`F{t$xjY z=6HKF2_3FZgysIkL-B-Uk;l?$F1r>H!ZJ4Fb^9)grR(>y+gxT}Kwe~C@MTt{wc>mi-Y*6UdFP0=ybn1&{pVlkmWL+==5)N*)n&N zy3u9&(eYBGI>EQ3BVF$M(vwaAC;XfZk(wQVAn2@j9+RTiFr6;V1SbqCC{M_6%c{?L zs!dK^vDalf)A6_0*_%$btFrj>=J0V)A&GDol|Y2ujH@6me`ylxAdB zvfT20>jvH;T9E0Y!M|tFf2goCP;zA$O;pu3d16xE`@7fi4=_?0A-0cjQujI@lap1! zf7eu}v#@_1PdlXzTWc{TFkqaBl8 z2$|B;j!#YBWTW}6PuG=$$t6g^P6ZnqqeNc1?CWZmK^`M1q90dFQgJoZS7wE7ck&Xf;otgxcf6D-;v8TH#HK(_hIYK;!JE+Yj_1*=4+kNQ z<8n@CLIqLEwTQ`e%@{?LvW~?9Em3HQrz1MB_Re>D`)lca$L|^w zFM|AFM>Vjw1rwzbbTP6D~`rz^JgPrjB zF~X#VG|Awf*VYY>Upck9et0}~*^YQTBJGLCe;w8pPsVB&M?q&i9snD+QeyimPvTDX z^~U4zbmj%!@$_7)GLX<|G8e^NWhFGzrUK`c>yRfB!;l_%{8f!*G;3CY;$B+$))TAm zlE+*U;$2>IF`8{Yu?dK5oV&VHUT$fd&?}GUJB9KdkEdH6PY)G26ClKL=vw;a@f=2! zrsG(D$2^`(f)1Xbo_T_du}-I0xo;kCW6FpbDMMIw=e%@=)%DKPfLoz^9uK3l8Xgrf z&_Pd6O<@v*CyK>p@1Mk8QGg|`HjNwXqQ|pj-$_;e_hlbF-cLqD0Y&TYq{j&<0LWwR zqQ@&CWK&rP#ulRVEE1_8#})L^(J0ykD+pDXRe2_Hx@LaTnl9Z)Ws(8DtgEXYgS+1cpA)sr z=2qwE0@^U$(}m+R%SKgw{v64#VC2R2RV5hqb=Twfa{SDgP4ZGA$6hh&5dN;vUym2c z^l3jH z@o)M{nM<6(zWzK*KF};V&17wIv{Uv{<~s11Wo*7yr@${kO@*2dG^O=vH`>_zo^|8P zok;)n!Bx*IMXCIyT3Giv1+`a~oxz5{l8c+VGvvMnTNhtfR_<``gfMM#Pd;A4Kv%xp zI%v<|;=X*m9%Y42JM-~ViM<`5YsB!mGx$oq`FN57nwOHhq22iyc5Ca;mwqjc)76}0 z^&R?n7Er)p?nNa>q+R+1QY2SwPM^MX8yoTfqEnxV8iH?rNV&7*S{S4MIz2Lnl=^uN^_VZ&P3p1ApFLSz7?mU&Hal)MXg4d;G z+D5zjDY5{mLeWDI2z41u4vIZf^sX%|2qsPBGJjBI9p(^@M-ZC2F>kUx@Mk0-7ZU=9dF31ABaCz-%ltk<~RNscUwt;SdyoL+l7imAh95e`jG#YA-#(Y!-C}d@& zfn6(X)i-X{T>*Io>}EE70r?RrJDIE}rDhH94ahG&vE2drMzf)kqtP( zdAy8SFni=Q16G<_7^EipuF)%)7Sa=rEd%27pYxuB{t3wH60{cM=mEM1G7z&GHK=VP zSrV~836g0KK^|S0rIubT;m-0=+5)kPwRREY?`%>ZL1SVn^>q^Dk0^kqYSRXK31%nk z6WkOy^2c>F^%)WkMQ4rd3<~vf{RH`UO;L?CDkq$3EiKxPTlY z=-_DXgYG!<3lm4uwtb~+J3qYBXx>w8yl*$6i6ivpkyj3_ssEo{w$T6Y(MtXQeremz zUwS_`KHFOR76iVnA@JqjtG_#m&VC0*Kl0UI@lb@sa)qvgWnG?E0z+VR5N z(&Xur7p5K@>MZ!^YWCm|5+>0p><~Yt#$XW9xJMX%LWePsApCgYog0nGQ&aWin%z2o z`Ob0c&eGD&6EwQfMAt5wMw+vI9<9dGMs4$*X}o;CGkuf@+0oUPD@5Bm)hF-L{g^rm9+FOM znS%=#u3Hzbc&G0!or|yEY=ukb7u(T0=HTeP%)x#B!4YaUcVxVDg#11DMgEJwLmgPI zCmQotsXAn=UCVYwqk2DYW?STB`ZbXbLq_clwMElaj6{0cU|+OspE6@ZSheJwHe^aW zhCzD5|476xZj6@wV!o?QrUw)zUR`H2ne95MBAoh?!d8U*v?2+VUzD4rr)e*$Wm}`^ zZf2X*8%<9~(%}={9F1|_By~TI_Gl1RpoYZpix@(O>=!S?aAJ|PHEYdWc(wUwQ%)t zI_u@hi&*LlqFc3#4Qgn{3Rl!DjZtWsc4>@4n(mv1X&M>WO0aUrG(CL9mT5FF#}Jg$ zk;~i}_ix6GrED5p{@oOn2YDn&w54V`I}clat*(8E&8n2pRPnW8)qV*fvR z0BY0Doxiee-?82QA^x-V&lUu>An?RO;6Hxz-PaF}o*zB^iQoS2iHW_>9eB>OA}_32 zmAaMGU9TFsH7}`_tAQU>;yA8XD}JT!`hFCLNl-~bs~#s#5GK{S=auny+j`ya%v=f4 z^!x<40a7*K??j-$7)kE<`&*aKPfkspygXnfFu!cRrGPrR8(YE6>E6QGDXY<)a_=dkATj-jke-klM|(n$l6gt>)){9&o$nG;7bm%*4#a!r`X_( z4g%-a){|;JFYiRQejV;amoJKK3I|zk7lXyz-%+d~IT4I~{nr=G5z6Ijq;* zx>vX3wH`RWGk2Tzc{}MfxsB4)TW_5kIAD6XfwScg(5J{Gq`q0CNFvw_o(H2ZI$CQE6nqiu;aZTYy zT#h>nC>#(U)waiFOjw_7$FR0F3I9G<{_LkSfBS5wi!v$Q&wcjO`VaVT+-}PQ`UCrj z^kFLFAMAIrKRnaoN6hZ=oAUW(-WJea<6q+_J~)ntj`H zL#tvJc#C92xqLHybBf$f>do5C^TT~bKYH=q;`4K z8iMa6Q4)KuZQ=jwp<9kCU`#u1z(W5k;-s!qkESJT`UFK6v<$-UZOa_H9^p z-vt=%5>+_6ob_9~7H+&9FE*Frx2yA)&Rx1Ub?$Qg&dKgob71|hh4byP(s@*LLUZ?b z*n)}*cU*^zLdVee9U3yyEMZNG{ND5oCY%?FnX{VQ zXv3K?AK)XA3KbhO&{(S{U`1GbUmv5$*zrFPM-Cj*FzCw}fR8Fdhew+sHf>aD+619# z5N&zVRb#EhpD@mn55z!>&M614ZyD+wdiZ_)ApjaFiivvJzB!zx@7ww2wr^~Yw{L&2 z{nxku()NG4zzh5Tzy1IF{=d89L;L^g{$Jex$M(OoKiYrc;7{+b??1GE|1?_ccuy?wvEJ>K`{_x0f*H-|d)u`p@q8or7O|`X>)we0piuAK(7pJsm!M{^{D& z-@W%QJ^jqy|7*wfz5nyx-`)GC_kL~f-MydRdvfom_kMKm&ZqwQQ~$$Lf9rvi4)A zT>q}JnxPi@aow-i?TX_kr9(W{s$v4a>{>}swUWxq|A@yXmRGL@VAW1s34`F}U*e~6 z97IkOI*wfq0?T{($9aZwT(5X`&9!1bjH~v`HGW!gtL4C}#I-oI%C`OTsLT*1WiN7r z$j97P_;QJ#M%BoPBc~qXr?4Du|2WTJ)e;EvPF#jqQ3+}yqsui`)Z z9FGNXYj&L2bw7bP;=S}xo>pzB!%^sYp6@x{OS3QR9Ni9`xgOS?#I1z3U8`57{+Z0{ zl_Mz8p2CtoU~9?HZG(UM+GXI?ZyF1oh`Gsi!uSw3=6s0w*e0o?Vis zwXzfVcC7;21EBWQm*il*@G>RLx4P4?HhV9SDs9FtzT~ zecyjx<1g+=WY?;$Rj${orGHFgEr^jQM_l&p5P&S#4>F$Nsf+zPm8u08yY;8f$=Gr| z#;~BmNEm%w@R!8WxSY6Q-3LxsALf#w~zW9zY^?cJEeCt94*{n7F_|tMc4$$wyQZrE@tPIcekk*9t&s5`LiSXB!)oR2be`fWZhzD{F-E{+3BP!eJn zNtk@#v+^|ZYhhGRJln4NcJ*Ty)Kdq7c{#uf4k*tK!6++m0~{N!ccp5F$+rJV#s*de zRHqJ`gJ%Wtj{jbsdP&_cmu(<>wPtyH-&9X+P#%~kk}$$&U;K(Zt<{n;5E2wEwxin9 ze_Ecpq3<{#W;Se6u65vVsi#$&u68}D!G;wa@a3rueZjAI<+4|?a05=uQ_FP$G`DO; zwW#XsV3^rf#kZo!sYVg5OgZ|%oQwrY^eZ5KQ5^%q7yi6F#fUNpDu7`{ta^gk zKD<{wtyIHGWchy0!M)olkgP;OEv}T~#CK{*5P#%F85`ANFY)nzaTVm}h5u7MErZgR zfqy|<^W&%P$E>y?8*VWT9NI3XNm^{Uq$F5ziIXEn@_OTyQPa_;x?7D6}#xx&MU&Do}g1=Z%7`mRj?f+I| z*O!`l3+8id&8X974^Dfs&Pdzb9jzBrMl)H!VMLe1ET+!A@ewwYOX_LGvY<3q z>NfUWfAJ}P3Zhl364woZY<^|?pOL3vGXW~Eg9`yOgBK^|Y3O2Ic8tpcpx0kGrJhOoi{c`~QY|8bp;4l*IEYPE`HC8F^~O)c}tJ zr{*X1+|Y;eSpN9QYsQX#fOI z>0%Ug$(GewRE2wSjr20ujltdhsq1qmpU_gaUJku-dx4mzlo>G{ghkOyG%U zdC#kP!K1-kB#=#_7y0C^!~tz9gCGYsB**%*e_z&M2QUZ4 zK2QoACqD3F>M3YO1$W-{A%VF2?yIMWTXqu&gmn-V@43V3DbU%8A>;vFD%Otk@)QzO z4fqTG4;-v~@V`(`VYq>mLNbI`33f4i1LEVB)v*W&vB2V8EWASEt=c}I7)21S{N$s* zFEdme+qY_E5Fg-tZT|s&3R)kzuvA-iIjQ>YfnQZmfzZ{&s`?gQah`oio`S%6aozHr zde!l)54P1)xM(0sy5P0-O8Ld#)=yol7U6D$;4I0(ugcRfDua`{K~OJyvGu}F$nE&(54YVNGASA6;nNzna=+m0?X=@{e3>wGsG+4Af4^MlyM?jkv^CX`0$~ zAgp2r#y;(PK^cK&JXS(?5AhJ1=UsmmVLUX{agn3d?4d`Sj5{eFpmd6Ks9nwvRoE$$52jXWAReI*GHB{FW5HU5a`VtJ6dbF6@{~STQ1!<`D+SSt!^o zHq~L!z}v~LDFqlw;?~muD6eh6Y+3Qf>~eJ#=lb@Ii!+mFFWKffZ5((zJ?q5S*} zal?(5Qgp;~{10({N2mjuc(euovTN_(HT%aqI%bN3in*3{J-rYzujwI30p$;-$lXiF z$H8P6JX$)6oB1j&|5aKmf}h-1@TQJ0yFj6Mvb5Gb(iLc74R-h6f~~idiB~80I4B6P z?non|2=--s)ij83lZF*|t9cG`SL62wN624D12eu~aaa#{tczUMMLz2yr}ZX#t=H&c z%?v;CaD(Y^-uS8s$BE9&)yXrb--sIZdkftg{`oMTcN0T6jNeJKgsgLy&bu9VdUKqn zuo*`#$rCv0>}UGYAU5bjPC;w-wpO278Q>{qv|E0pCGl>GUvq4YBGIb-NEuGFC6{Db z^jhSStf$Uo-R9hNk4YA2-fFHz5?GTUux>d3i!xHcP$2+649Ea@RwM%8aghXo$3+4F zzWx~4KV}6NhitJH&M&Vthq3)8FvP^EQPiQzk6VV<(;LWXgTGt{&*6#rBSPI&3SEI5 zfPqMj?9D^q!?zASxCQ5X6yG{TO?kgVqyb1-2xR-dj9Z<+pFIW1GF|=v(wK#f@K1bo znX?+^W3SbUee8HX+{bSGz)#>GDE@!P_MhIi`z8Eq>z^k80$H&CI~IJoK8$C{@)vSg$Zr6f4E0AmT63W8)n38Bju={C{rj_HDkNx6hqBKM;hEXB&vYSCtsH!v0ncR$aBaHaXWo<|L(a9B&0MFNR3L zLpC)EyMYiP%(FF1sh&vaAWI(tKa)ngLuS`5EXwk(5FU`LaHbWuknn-mW>6eXzpLj~ z<52$7ho!lMBAzg1>QR_1p}+beEucx^s!RAHh!-WcaGI&ASJs^46Kl@!wsE~%+&it$=rLjYs0I0(^H zk-j$|TB9#3OmF}RW_m!SOORI6#Zl1TBuC`IA>>_#?ZyIS*gycEf&um768gL}v8f2A zKrYUw1ovo+q*9Ue5t$F5(mf=TE$lipXM|`CSc?vg+vW1Hf|=+2#m0PZUQFyqDd{MN z+!}RWA#-u-K5$0ii1|2btYkjg?9B&=I3+gJMhb5Obv-C8injvjsin07uF!%(`MsT7 zj6*SRBFi61OwE#{&&bEH8Xt+I^9#UEut!3;&|je1A#9$O+X7vSlN*pM+{FmL9hJnS z#p991&_e7q3S`D)C6R37FE9`N0#BmG0;q7Y5c7>uT$}7`X+5^CUch~->55ckR0L?< z17zA<-&5M@(Tj2>IJGg-9EvBWPi|h+(H2FO-5MKq^L>JOBrqz?;$_ zY;I|si%^W_Zs5?{kGD%D*s+PYEKdOFGvroaGO*mu$3mCXTy(LEmXjw4gKJPUL0^6h zU?;^CKp<9q!B(p5p+qi2TMU_?5P8q$S7Dr>^gQ4OG6xV6Po5bfANr+LkrAHhlb`%# z=?VeAGG3bE`saEM1|G`74L*bfsLsZG@Ky58pr2cd@)*<%d3ys-!*i0ap+MNg(|QHM zr&Gb75M!fWZ<-ZaBlKUw_xl6qcg5HgLrr%$`C1{B#sY=4GN6<3os$i?} zXvK14>~up6&?-*#!X?+8JbU$2$M%}1V25X@#XVxxR_ z1;)$3Al7R>sMkD<{p#QQ8L)a@z=F-x1zZ^4Usb?DF)zmLTyMaF$SQ@00az&EkL_(M z8Ql6TZkrP*04}%+nsse<>E2{>cCqSSZlCwBR9~NWn~RqW%`(pPH3bT+8`PqNY&1|{ zWeePfqXl3^8w%X5Xo2@8T3|~m+OSl#a;(4_B#~yn93tv_*4nnE>u>4$(7?qK@jlb_ zp^CDt4K_=$(5^zwSE{fHirBpPh{q;;tSK&`n9-A|KnhmFPOx%Z0@(F3{xVFq_Sgh+ zW(`;dP!5Kk57+62$_L zPlz<}q!Qq7$bBt`Rb-ErYh~o9Bl)K4)jgyc`bb?u;tdj`P<|n*M_Zm?gl5e5mCbu! z6@WpZMEK2gg}+LzO&lUft-p$<5Z3g`&4<-`>ozw zL;;&}Bs2CI1FQS>@cunis42_aymke~$)Gfo#V%ZxnAl zUOaZZ!@=)TpH{BBXco-*G>CfOdWYh4)ct?qT*ubPxt98r)<8TLdQ< zLJ)>}U0|dJ!1J3s0-7vc;CQKmI)AHq$DGD^sm2wWVWme3jD|XW8n!j%9)Vje6QBBe zBT3*3M{z-R7bzo;EVF-k>Czs;_pnN+ z%X|J@kBSa2vqs?WD8*0dc~SXLd_aT2yp%GtZ0xLuL`~G1C{qHlgJf0Y2BT_7>L%G# z*-!$vj_UP~l#ueXmN?U)i(QL6R{^+&$3Lwk&%qm&_Db0bhhW$6Ryf3y91bCzh?$b` zql$8E2(4ZRcS`9wxjJ$s1;IiO>lEXP`|vQrK$i30dS&M}>dB(24Jl>q7!g*>_-`>f zB}~ivZ(RqzS~1re|E*2#T6W)-$50FcY4vM&-&)p~S9c4QH?LB;x%20Tt8f2_`|fEe z$@x1=swAh4{P)O5wJ{4t4p8lRt--=M!SvJKt`>NGS5}@dI*+SW%GV0`@;3O&!p(Kz4+f)tasHlcgh$x4N;&?&u zgmeEJ?(3IO)zL*$imTC?Yj4aiT(li`i~A#Jn#<9@hXuJ&ZfIyYKpORT_UyI!HmafA zIk#}{@>K6;$G&@^bI}}Ff7IWZ)(nN?&(Al|I~k?;VK76ia2It(C|r1+ax7*V^RTgb zWCyC)rKs&w%EMTxG+7Gf{BV{{Z1-oV>4y3Z77%K^h3+3Pypb6#Y+<^?C>n*g-oQg2 z8M&Ae$rwo6&@XkU#TMS9%HHKqNybFHh{7cu#M9G@x}HqbpsL=b1%GKH<#FJsSq`9E z@fGh)e8u}4|Av(Y_bSEtZ}fb)ZuvF;-8aEq&~o_44=SfezY}96r^l1harn;J3t_u= zIkL~#weyQ_C-e1Wx=Sqy$jv&~ak$US{XQ`5V=L?HEG(hE)#U=Xkutur!xV>n4lzyTj8oj)MGnI_S+J2c1Ye6i2=5eE<{7O1Px1d%XNUpGz4`pV z9)8J5|KGmz54PcdTmNi9U<(4@W)OJv(z|CRa^WvrQB2&bqvn4N+FyYB&M4x&Ap`MN z4m+t_@Q1#=;eLOE=H18Cx@Iegcq@o_nNk6Wm)J@e77Wo5r&|fbag>QpDack@CSiCh zh?vS1Pzk10L{G0J=wxF-#9KipTQxXJ@2eUdqI(A(>F4b2JM`pN+$JbJYOB-L6~+dfPHNu{0!kW@XV<~i#KAdx8l!RUXi&b4mt z__gKr{~f!(XWKKsg@0}Rvju@I2y8)M3j%!*`0)?FdtMyvf8sOB(e9!NVckOCqbj<} z!IMrcq9RlTM7z!i-7Qg$5WOXRD?l^Gii@^xXnE~aQJ2$0>mBs6sXyV4_9!2i9n+kTJW?4Lk%6+K0hK@M*sk$Ky0C2T;I`p%z$03)1YXYLd48K9I zbJrR5s#Pw{PItsl&N(3DP+y>A2OdeeFWCp`Esx*o>zA#Hit!LMN1;WKTI8dROIvbX z@G;EF3*=l7$~mQh3&!M){%e{bCIh~@aU#m-_UJ>y-02Tz_4m*2ns*>}&0 zll~`kW@3N!=auaHPl}U%t3Vj#$)%MaAAcoQu=9;X4J=zAYz@lUHwCMS$3SBc!Z8YG7lQg}iNH6a4?I z&SM*E@&6ar|0C*Az4=08IQ=;A^v`U2YTLxNegAZS`@q7siM^lQ^G|mF{;ogR^#^?- zaM53X^rc6&J>Ir&_+Av;yZpwPh34IEE4k*LJhilVDxAJ*+F@|q2P)aN=BRas35y`} ziY}UfD%Gmgsw!9}b!$l$Nm^7gmvR{!O;pXD_o-4Rk{P-7%4BI|#7HC~Bg;uLBO?%E zh_j50z+p#4-HP93Q6?wJjEtnR48M$uZ1i&Wss8fF2n#hl%#p%vsq{iE`bI{I#Fvqg zagnT!p=NMXs^rS_SgSi$O3S$A6KAn0t|=zc5&%H*66)y^;8;dd>9l4Im=4*jqoeen zY(2MAREss0xeQEc+-a&I42X}S>79}3Q09xIH+p)-h=lwQeb>q;c``DBmaG^tGD35p zTv|qSRPtXsWUOdeD4N>0EOmlBVdkS&>979@f*Z>XCH`10*>y^Ol2WKi+YcY8L|e1+ zhYufEnV+$8^}uy?jxDxgQf&JHXpaLls!(d?Jh;kp-*NLs2|@mr$@*V3v;XkSBht34`-(zDGC_ ze!$l)9c6wWDILwt`6?Zl9`~x!ebnF4n?m)QAY9Q8rMk5a6q9PNVjM;Z?)inn0<=Wo z>xUj*c;`lA^3+s4xn{S{U%qqPy0f%&^TbznKN<&p{;KUwy?y%H{LEP|ZiQE^>FZ~v zr;neycwv3?InOLnc%3>LmF~}=+hzlWZ`(0Ks;TY(QJ`**%PN-=JZv;68MA{wWDWAL ziLgc9SiJ>N;GJ44AkZj$C?GCB@&Je*Jnx+iXBHcN)H%6$p?SG`xpp$T=`Mu^5MtK= z!YNi|{+{DgQtX#YBS}$nypa0#EYJ6Cw6I5y^*UNuBg3NZ`Qb`PtV1GGKDcrfA>7Lq z($4i|qax<$X|xWgB9UY$RHq)*396U8<$C!S9d>h z0Ms9{z3J)mSKdg@pTFifmu}P+yY(Br6EnvRP**9dW@tcv1@!fSlxu~j?J5qTDG2&L zbp6}tBQibHB?gQhvF+RQln>L4-$|eMkA(OIX2+bxygN8%aH>30l2@q}(weD;jaJY0 zu!H#WJC9r(#8+STiq*HZ9)$E~$TOu4`Gz;jiCB9Zw)-F2|EP-H|H!20IZ^M#`O{}- z-0sb@H_yABH`+7z8|&P?YNdc{DRq0OyEo^uEci%IN?VO&GMw^Fts&{4X~mT;kSpch zoG2wm;NsLO$gPw{#mdwPQ_qL;rSKO01epkIAN?L6|75;hoK=Mu*3|QoI%RX}l|SF= zp*uDbzetp5p-@hP8Z@X+nl_VK?B-U^Yn3>C8@EDW9~p;H4&j^Iul=kbhx(?}I6p$vZ3Ih9aH?sNe1Rm+grfgI56cr z`1rX$JPL*l97sJq5IS={ZQx!rmUdpc>xpSjqmXW71Z8>16BV(6CvQU07JxqNBGriS zLR%z;-~?%^GK5Sej7{{W{vIPK;SL(K5RO_kwQ6I;fwg3C1pkWkph;ndaVn3!*t6(I=Flq;xM^$<+98V5dl z_1SBt>54EAU173tt10lnt{trUR+9$Y=KDS&r}gQQqXy~6^2Vo2bu(TdNfr|I(kQ>n zFX)%EV`PR=p=D~67Vfg+crodNSJeyViRL9D7MjQFVkqvITdxdbC|_QB^jQ+`KJHzK zE}ZQxcFxZ>>Zhxx?kzQ@FC4!!wLY#u;vKGJKo<|$)+`W%?4CytvhzwF=EUz4N@&j8 z7%H&r9VQz@H`8Hl-F5~Kje&+4TrNHO3^u=|xvklFvyA5UmCKL5mwUj`EO~5&jYROQLRI zEVWB(#Adh+gDX|UBw0+U4m6!iM$(vVL@*1~w~8k+KLx4CywE;IMqc+Doh37Cg$HH4 zK{O}LW|3ta^VkLR+@hW>$H4TvM>?nxn=N$81Q?$y0EsfbE6)U$K|MW5_7%Sb5v&LF z^@sSf8l+&5dBUrw7ifJ|{J)JqS1Nenn0_g@>xTfR6#8WGm^<^;2pk<4Y@xT^kKSh4J9N3D~~+Lhs! z{qv7LM>O#Ss+Z0r=d4;Z{r2%I;dJB1Vy$*{YQfyz&7g^K5P4NUs@s0(I!P6Iqp)q4 z9|ui*%;XStxrcG?FLxhJ0H9xe4(7pn(6w*eY@R#WIqTiLc6ajB=@_k5RqtxUTbgY<@$BrSsduhiydPX> zUOQD^9|4-`_nK3`ovm&+TitGQCOgyZMn(K^DBTJcsG&V&)^tS+I@_!x8b^u)4!c>T z|L@-QliPOv$ZTq9`N5^sRzHz|2);M?b`fPl)e$DaDb}pZ} ze)r1FnfvR$cb(SUJxVl$l>;VW>I9YzM^O>~WXVOiD57c?$iT=EDkCE&T1`Y6i|=0y zD$3XkyUKm^`e>8gl5D^T0-D3$l6DJi#t;%u<%D5kK}<;)!^n&oOC`AWOkh1K19R93 z-bKe!gtfwSs^2S~8(f>GxWX|m6*ZddtyW!qN42^_QR4zDuvxCGiG={9C18&QgHxyS zJRDgZV?EKLUir!9lJ;e3JTgz1~=C;81!Ch)|kCpR}ri5IF)E5N07byL7X7 z0hX}F+#L8+e7A>`Q$F0x0N$Z_nRg+8rA6>gl(D@3oiqY~d;ys=K-$L02%2bhktiUD zmYI<8iSVn@L~JvR!~J{DqaQGiTdL6;#_cK_RuKen6(~;uY=xBHBG{`?fU98B6`+FG z{9mz>UtH?Ww3^uV8ja&MKXRN3Jma<4bL?ux_rh|WdULIbG>P=UP`Rz|2wWkzngYe! z*ok^Bw?VtCT7yG?s4>oc>FE zjzxkD(Yn=S{>dTN!V&pL;+-X zZu(svB+shDC^}W#?mCbxiD{aM-tw)Ko5EI|}}WA9WIFeDw(lYZX0=1BMI zm|Y#3b@YQ%k4|F4U%%wtd}HCxasTe!?!x@imD5+37EWF3+&j6x4a01PIv1sGd#U74 zBNCBh+CJeDVGyN@t#$~JgG4=!Q6s=Wuq|~K;*g{kh~0PMu*;xXvk+lNcV-_M8hD7gudEwCsB2Z6zQLBEg_Rf9pjT_$U$8Ro1^E21qUWyG|*AxSA*-v~_ z*rDDv$a_T87wf02rf6bCu_6OB3L`g%Mj;Gr_?}7s-@B)@ZBOahZyxyAGk<;G?>yby zyZF?-)CREir!5FN5IGT44}h#+vlyRdL-COUuOl+#^o zU9C;tyB?fuwl5jHS`!42zZx#F&SP68wRyeY9<1PGgdMtTdy{tU)`y<^SFSwzZn{lx zc{iG~QzsTCuP!xi#+O@*ipbc4_@hsoo(O|JF0 z1$Q7*)g7L5^vXU*<61F5R91yw(+)nYqxqPknRs!rlR4y3Z*3#4+(L#;Poef`mQ z0jxh<@y=d%Caq3z_RQ4fx2tDP&E9RDxps5CF$X{@I6r%w0t3qpQ6zF}@!tu7N{cXt z)ZlL`O_6tWJ_da*z0qj5U<#b0V2xU7wlN38226_*HZ(NV1m$?TK4sru_V2`<88tyZ z%S3)cmWm!ssUyxJ{GyVec@!Zz>d)|Lsy|ig*>sY0IoVtiBDcBkrtGCs$K6QZ+KlT_ zv4%$Wf8}G3UMAx3ecsvn^_$+EyH{>lwd3wm2=_tMP_G@Dt9n5ZY<#J?%>SgrOv8Z(k5}FvNJRdjN|`z{ld1rzleWr{j&vu zEeLEu;K_o(*M8vLx2X7jcqtM=MFsQm4mXAxb>r|+Zhf`Q%y+2P zB33J&30;p5!Lw8y4uKdU>hs-}x_rnAEtftG){b8g4P&0>UmYps-jboFwx5pL&>tG5 zU>%uB`#$J_9#8HM03|Kv_ni$2-T#NM3#f28?kpfKEk3I13r>9g!4blgBjcqbl<$io z!17=GedT(9Qn_w9!v+^8)@Lzsq18k!99Rlse}3W=LaXq%25MUPo$ka`yC;8ZG$CoW zdkft-GGn5NBWbgtQrR9ad*hZfR;$>z(fuL{Ye#VG>4+&aqUux%i=3l&ZmT1h~z|Hf7q)AwN)(^97g6?}lK(@fs0w zq)&Ci8Cc5#gL#|P_A^W^ajE{<|#H@zoBVc zS}CpQ#n(`A6GpSy`+j@6!z=)+!XK!@r^FI#<^yJ6{s>mFY$P7mfI?KH{Lz%)OrX_W z*!bvg!U!H5isJvDy?2YPEKASB*gZWnJu_-aBWW;@B4;)@tyDF;$lmu0)irIB#Y-12 zT}84kwo$F?+@KpwMpk1 z?K5~^juu2$d9Z0TU>XzrW8Z~w!pmr1*a!eAp(BjU9x$s?ot_`qokRQyPMsS$HP`Ip zYOMpzBDwLeL+J^98j$cUvW>6-h`pTg!*PUW9?C(PI3&Qi3Prfu@^SKhm%j>nFY2j= zLtq7JTKBun^S5Bb&I!Yt3>V4Y6s^IS`n4tjNMWo2!L@5Q+Z{lAX%e)2{0Unq@v(Vq zBSZ?1YaPGW#P|NmLe{y61!8iPsyV$2jJe zK40}Dd!I*<1XGL2U+E#09%B$8cSWS)W3C6{EXFd~wXp=o3reT5IiDE9w8Qy!Nlg@L%~;_CVPKWe>dkJ@9w0o!;T;`u^m@C|w`&?n$mI!Hr_bq6uE0 z5iJH?>cRp`LIN3V3bGAAg$p07ug+|4&aa=bASB;hz>L7f$M53AN=3<9NFwET$5+F> z>s4rD+QG5?JwNyutC?lGJ|??EK)m#HeNbi5(fO%+ zZX^Syx7%~~+{9A3b;wIPRlPCmAqUh+5gZ4xCJLHpRXsAUFbiP5-Hi&73P!~uEoql) z6`*YPD5c^xW_rW-Pp`2nWUL`T=WeVZa^qVc>)R;iw-M}bxdymv#NZwcPLg^FZxM@? zkr{{-IQR=|%{7Yt9K3$DRV>Ogy5E^A)F2uFit^K>C`A4 z5On3IJIsi)Gd?Zsqp3sU0FUt&<78==uQt|BF8u!++&Z*#l({ls!=Pz^Bv$f2VnRmwP$?;nT>=={rc| zZX1dYl!Iv5s*YrGrl*RAD=LyD`jV*Fx&b-|Nwy`)l?+Kk(m7Gm;2D)9+37M{lwQu4 z&&wGx2m=Y~bgG9Q(Z1N6FPPHIX^ zKL2G*ceR;tQDxRFtd{Jt2pI-j6kFJ|n6Z3g!lj;79MM#DujS}s_iBzqg9=`YT=~EZ z5t1C#{WcKJM6<=x9y9bs4Sw%x^YDbWsVb7f9wN%VjctQxY~kC7=QrDxZV>t`-%qer zv6?gK4tNDAQB%a^#OphAnN^*nXhz@FVdaXN#O4|Y8_@0;jZ^%{7&_AX-h7k1uD(T^ z7##e3#a2mbvuXf zQloX8t!_}B<@2Se?FAh2rXyZ}5+g@Rc^G918wa{h6ex7cAf$k1*0+V8kp}VtZD$NA zY)ajXW(+u4qWUJV-Y{SI-PzuZIUb^cyvb$`k-2o$7#l>{xbE_@5g|jN``^^1T}jjf zjncjhbpN9?Z4VibeX;vrmCv~Uk-Zsr!}K~nO*TMPG5`_C);5&?U!0N)w0~3Awtwn+ zfBpXpum0)S>;LO(|0#ZzKV=VG)gJi!wbM=R)&1wy$g7L2ow8x*2uc%uJCKmO^8)J8 z)${6Ztt`7+Mt#q!FF4jMbKCUqY^|mKuEf*u8T9Iojs48Kzy99o1`W9MjUUFqf7|h8 zRZ=w34-nF7BSd_(0cYl1X4s7Zm!B%||8sv1cb#qtE|v{YZ;-_2zOQ20fvF*v9Xde4 zBA;I1fTfDNAbijqr6_Q~)U90a1~^Q&Zx@R)fRFqkEA_O>`|q5oKBT9L-Q1 zO>;z;*L+hCyue4=KN}&qAvNrE@iSF<#!Tq@gf*wU0p23rc0g z_k(4)1tkjaK}Ipprtn?Abwh~LicSgd2gwIAmucyp09R%7Fu&R&%{ZH|bgGO8DB}TM z)_4HhR!vP;6~#~;)mAC!($rOGzI`0knNUcAN#Wdbqx8JHS!+S9wOfmF_@>u;OCn=* ztnnxJo-K2>s%`@SzjdGiz*2WbM+HarPzC_d{B*1A#RdQg%034rrTBkD)o}eE_$J`a;2*9pkMqZNP zNFSoJAJl{PV}EZo@E%mx?^kbY?)@h-CrM}bL0)#l?RH+E1syg+mNH_14L!$*9-GFy zePO7LWqar`qsN6~lQQ#)p)CHxlewk-tb^bZE$Pe{OwWrf$~`t#ZcRU9ZN>!xd@}qq zGgb4wk!8<5ZT-C#`0f)pGQnR4CYc$%huFK8-O6#*_QLt&wfcH{-I({bwG%hl zyUtkAvS49?0On$n&pn!#gGnAjUB56Q87g;S@0N(<7o)3wcBK~VnF-)FiAo@Oy8*t5 zdg*ItnG8x_J3C^|iceR_*A8_p28#DW?DG$aR9lRF5V(^3iJ^m{^b`6Mnd8j z_HDX>3`XKJillen3ELiylv-vqov0;OSX>9O)YnlZgwmyfLJm!ZoKJ0PIQuQ`pqt;+4iM^A25 zI_>?1M+aImAZK=yp>+9kkILof@{){!D;7dP*>_=8-V&*g@`JZaRsO}O@}Js9IZ)Fk zLOKR-9~d*7zfzu)LUVO?xRDf-!af>BF~OeDXG=JrUSi7mdI_!<>m}dYIlad*ct7wX z@?F_U%?|w=?I*a+GenHYpwZke(!<4W>*^bWHz@b7M~83PkHhBhc!{yO#@@%csoMrWAzI zz5Zv#N9OOmfBJx9%KvCGTB()+nrzh+k#Pb5au76Jgk7?vX?Xc)8m>M+<0V=F@@W&F zlNEqtjN+~4N)aoLWELpwv{B3gJi*5WECU~ANo2`y&0W?PpnNOy5oB{Ml=%q!!`;Ym z@(6USlg-0Uh@F9J!sF8rcKnQlLMbaExKElDgV`d1s)!gjE=lBY8ppo(G!i%viBrh` z4*@{5c4Z~-br~%mKmfo>r(0it{(n`rV(Bcw|I1R0{}+M(mt{#k2mYT@@8q%nkualf zzk07&m|^<=*e{K}{+IaY(tmzu>~x!pN`LqtM52=E2BPe`s$n~UqasyT8GeWGIfRwH z&qC@1WOSkUx*J0C(6>XDEEIWW+gJr48n47(m*IEzIl}J-AP!4Ei2o#tz=B7T<+!=d z#jnWIJCeXtXk1RV{2{1PFXjg+r5%sKNNM+=2s|P&Dzh)O{95BN5`(qCXonr)D5s!>O-IO`G(x|!!UCcAeFni7AOFKPb!^BqAbWS8GB&7i=|+-aO<@tq z6l>f^!qH@FSJWj_r#zGcB^;Cs;lQ4QocI+uh4^iqz4Lz~hRYx~v7 zVhQJmKXvxyZ+!AL%G9~2hIYI77 z{5A`LH!0*!@2plIhD}3}?c>E@+h`u$vNs4j#xat;kh=xDRl}aOjy>4GB4US@RPPFo4sG>&43_# zKoq6m5u_&xwFb+_2hs&ct?XGJ{;s?=$loCwq=NgU#IB^ATH6AAAqj|Nr&aYafjL>q}SvKh+9&q9Qa43mX^ z(hYBIxpN$@9#qXmec|y*b#HBUe=|9UNAr`OM~vUuIU~qlif^Jd!r{CoUzd!B7Ck_t0-{{Nd8!cm)OTO@uFFb>r zi72bf80Ir+!pazC%XY~m7kfpAFp*y{hPkwnmo{?YrOLt4m0QD(2)1A(2TK!|p0OgH zy&2PS!R0|2Dh`pggOPf&OgDqf5hf%PT|J*7o*Hr>#8PuCL68%hvY&M>7kH{^~hwYkiLY5d?tCF{`P?S?hDmYDHOk za7vrv_RsuZ#b&kNzJK~5_hJ9NUyOX%k_%G$KnbM4wk6vL0^4*{N3jFjH`G9aA6t|Z z9iD8@5k=8ZeO)(YB#YEtUD6cA>N2ZcJsX$Hr4(_A&ZKI{jT>LL8Uh*Ps$lr4_< zaBW2V_-%ZG^SX)za{>Mdg&4UJ6s5;pyVR?G*e)dtMBDqeMSC%Y}2{^f4W{QS&;w#m9PBd z82&4N${r|tpzMLN2g)8Od!X!r&t(t%=Hclsx3qi=)9LG9f8*`F&VI4OAFWM zkI3Ypiy{mY4LCz%%Rtz+y=tc>9Fa|dOa(!s(RRp0u!p2H0={mweUAbMV4&e)sO*a) z#2p}r3I+{WJ|+XC219HrEGbll(>Mv4orAveDab1MYOmUYMTeOte7kjskbNmMs`c$GZ|&0#NvcpStpP`x%%IMVa|y=uKqMy1S67qXu- z18w2RlwkocCM;l+8Kyq>6S+|TH>G_2AJ+%y|F8Z}WB9N9DSP0v(gT0+3#T7(9Qr4q zt$mfmI5|Ktr)`)9oMxhJc!m||qVCv^{!ycKAb1d6Ae-P4Bi%@@ zw^`&O6;(AvT-G~np8^)~dA`1PSPd&_6=_jL>@FI*Rr2WP71er*A`5l9f#}Pe2FRHP zY~Z!*!?3~L%@)F@@50?hTp|0u+ZMbIm!s-n)Zu}gOzP?&Vv>Mocw4x(Le@3#2r=m_ z>KGQmnN)*Ld2b+%Sa*U?=B7#>lo^5eDXhDZ0-XA^r`N(?i0(^2L6Y?}t>}~OsI^2fjLgS+i`W0nL*yuRzmW|$G z?;Hn~cHJ0Fp6k)ZTx>$w<-{tDtU~&deFQ7R{JxA)Oy| zd4tc6X(62pba{!-glQoicY6BSl$8D7mC5B{{HoO`f;Q7y_D)E6iFBeYE9fRo5E?8> zuSw-5h3lC6Z&Rz^rZyrmv-TFtk%{K4L7E5B@><9+mslO>&1#4`2_RXNCCj#5&D2DK zGI%O9XH!>H%T6JcNouUi$dbkROxQ$V??X8=FgUx>6_t``_A={R&MgC$ZwmBKEzY_ zOz{z!S_%eW6c~DO0*e$J#2GgH-R4QV(x~sUq~Om!ED`7>0{!JepugWH+e9q{XIBjp zBQ{k5>EeK3A)Lms?{?b6A|qgP2BHPXiemvgEg?UU`oQfR0<6LhCE8ni&qM;k?wAmZ}E2<+vL7OZqRsv$+h;?2)}&WX=wmvq9$U zkC(eWj$NmdU(DC6P3gL|YiKgG0d(9z^gl|YSQfEgjQ&@}v*>@u_lJov zJ}pnlWMekFYa0sxkAPhxpZ`xcwC&gb-~RgltFQi#V_*Id|CB#v54_|(@cplxI;8kZ z-}tTfqI@-u>v*ECSc=dgI46Waj4&btq>u6JkChhu$rs`&Xavg{Sz~`r;!ltN9i`KMEcdFaBix1b|`PQk; zt&o4X6ari2HSYeSCf=rXBA$ZujqyMfvO7AGrQ4JJHrxskmuY6o$#32>;wwuS1!$L0xd zqDF$RQ_EoQEA?|&AW17DJ7USA8pju0X%fKYOFK}TPlUDDAP1D7wEc~SR91CbxB4gATlUXtyQK3)ivYxiR~!Ihk8;pMg2MpWVSS zd^y1Bh3q$`YAdSa>#l2@&+d@(dN8%J=I*lQ-oy*XhE~3z#kNs?>qPW&taLYzH7ows zApPHxcMZ{%B*w(i@?oy=cI`Gqo>TPJR zrRB5Z>Xxzn)&II!L?LzW#h9coAx*SoAvXi%j?a%CN+D8nVddV;?ZqXpYCdkZAKI&~ zU(rilC^whFLylXD?1AUs1K<1B zsmEa&zi|-3Gz>-89m8@(+mmEha!2)yUNM-)OJ@=v0WR^ks< z!3(Cb>+7m#sYT!gL(F##7^b!Tpja~aC)=kkEz!kq{V#FeJln8sSp-G78CU>S0m^WJ z5UPbn3$S>2>89XZ#a{~_tgp^&ZqBbi9S@s!eSG@q_(8SqVaSqifPWp2qEYB;q_W&) zD9*Jf534f^n`UrdX{@gA&&vBJC);yWn%QHiERvN`s`C%C`Oj-1yEeWW?p?2XH?OJl zm3?`uRkt=)?Z&;ilf8{K$6qeCE0%flo?G5L0BZ^jmZ_UZUaEBJ57(4~%KV(Xw|3;M zRgdn4$$<4n!j~4fO9%i%@18fk-q7y5t%r9iGt27_HxymzDA;I@E#tnIjO);Drk&>% zjK(}kqlBZ47LRuRfHc;yBqWUj$6{MEkKT%67I9wX1f|i%yr?v~o)?xz*OzkQ(pV$T zLJ2M$na1ixY#RL@Ej*3c6xr=X5o-7n=fz;pV1BR~rsg0g@D=n7j*b1yJmdd+^`kNT zSN@beaOpkppZxr(&!x!!axrGE)@0w8fNBk7TeihuR7I}~0(DprXgF8o+Ja-D@DF! z0A9SudF3^kU}eKFQdzBghIvq{uj}mx_dLh4j%H?-4w4?cu)M}me#0O)*%?oQ*+|&U zV(?}$dUI&_CTr4Q04FPUQ3xlikKoVO)6Gn0U({|g(V{ktIzf};Ui0j2xe&+xG!oMB+^54ck0 zFUfbDE9P^z70Z!j*HLXtRW-z;xk!K}_1{f1K0?MvH4W@v*xq%Hi0_QHY1{LVJ*rVh z6bF5S%i@$KOdu4L7283~4*qZ(hX@h98DB+IUeA58){>T{IJ6O*?l0fVJy)+gXrHG( zJ-@p?1=rNB=2)IC=KI}su=(U2$aJT^y;6K4|MvcAK+AOQr~h6fA`Q@e+Y)`%H+?Kn zSEYYPTBcnV(~`RM<)bdW-Kf-wQn6MILu^Gvua2Z`ZTQ|G`h$ZEG5nQk4Jq0z0Ybl| z2wuxR0s}ho)XfOaq3s?pUV)=Z71U$VcZd-NVR~47LLtnZLy(iv?)E13JlwT}i*~(@ z2jMd9Z1GJX8D;k&gjf@Q0fYjeVfT+gsTqQofNqSVtvxUaKr?CDCnbl#VdJRe5P+6i zYf_p)OsyzK;T7i)2mn7~IVKYd0k#eqNk&Qtky#yijI|q-LVG?Oox=67O7y|KD>HXRQdmEti--xAEnB;WOqOiZAU2CetBOij;t$& zD*MWX1m~*tV2Ad7EmTBIxT#-gEQX8BbIRHF!=?1E$m!I=52S z;qvnRS_>q&`zy`I>zkeJPyrnsn%B$b$>Yd(8O`?7?{@zRMH&Mv(ckh=DGtZ&+uLOT2AI@^H_dlxr>lNuZSmHf`>V@F_5R$!Bfas^=xoj}C6n~bHa!$z z;N1OwIe>wo%x@Qj3@{T~VgHtpffoZAc)1Uup%4TY-1wn4Utrs>1N3!O6#YKV|NQ+X zRedkj`TrtMf|0!cg}pF}_n+^bm+SxMZiSTDE#@fZ*Zb@LufF=LV_%xUKjlx^1D`?< zd~f`8ABy`Mli&Qo*JGOO9@^_cF#_xUjN6{sLuRk3mJb5dnZ^0F%`<_d>?%%#OAaDM zh-w@{T4KqIC?*GC$wBAdaY2CzuGJc-6A#Cyxv}%ccuZu;45}0lthfEUTa}sF*3xVP za`nn~#nT@w<0vAt2fin*k4BkGy4lfbm@CGUBWvlQb!&F}*sE0@Y@PUtAU?FVc&!VH z{wB~|&;cS4UhEhkR$+#^PGZk?cAUns?>$BFXMkhB`6det=PGi-J%q-@?|X9%Y~3LJ z?MK`RRBfLaha5{W8-`pc?annF=Zr#@8?nMnsy6EF}OWY(^HbRkWZpr_1PzmvU@u2`JvmYHVImX zBYG2?;vJS25`Yt=)B~)=A!G?9)APNlRL_K*0ALFp?{qNYh^Hrbeqe*r7cN#2Db~)` zT(gg>wN8zvyS5GAA`o8A)mMDQ3(X(w$vusb1998d%xVU=2vCaCU zCwH1l_p7ertt{P|IZ@WOmQsSXGl+x|IQHCtV=%iGLL5>ENzKKB~ZwhXu>JlLN1|iDZM+l&=27%v# z??iA~zVC&AFtOV!HZoL7!g_@i^7q3-s%{_ed9qdR)4W6}hy*e-JXIy6tEdGTi!mii=Jt<$tN48R-Jd@_tgwZ)AJZd{oyE1A1cqcc@MPc=o=;D^As~%+ z-LqSan*ee8%pBvlT8-9}u+~7>{z;=F)H>i9_^1i2MEfIF33odau42z`gKQNpf1U^V z2D|^Ig8&RCN%i>unGiL={|}i)G!$3evK2_K3=pU$+J+LSs_RN>pxd%;;CtOeab&Mi zuDYMUI=iYLRIA>>OnXj$u=hlfw^wZ^v0IjYeyB<lAUCIi;v=f8FvD0_I@!T%Tvou=T~b(d^m6oVF!+dqU~ zp12$j8zGhJ^2&p|7yNIy3~atYJnQ6rhgL|$jYkz|sQCK`myYa1^hAEX)TZ4+j7$m4Xk`052aNCasL?tA(hjG3O9-33TZPCI<1UIw zQH)~oyE6GFj9;}Hy{Kf0am&~{@z}IBrpwb!5}IhRo>71<%1sK_@g8qOIKn>~{Ud8{ zMd57qqBOR3GDRbTa~Gmg6voMTZt3H0e(u`TczvEoPlSzjY8YpPc8)*YVeXKf@o8ZP ztw87OvWdXn2aE?4^d4VPHC*uPdxzC9xuy`Gf9O_y$e3|Cjjlm_Y&Tjb@im$5<@Lu? zEB-2d#M?qw?QaWR6~7I>^t4W@4&A@Y*2+yjuDr&{=tI|Yvc*SZ53*g&)I=qa0#B99 zz|?>Y@HC6aQa?kgWMrDqlAxv9q%v%VG~S`cG>a*Pefpn9MF;C znTS{ll>P_8*~~|oU4)<6y+?M=iJfy`=bYD(Yg(@MZ^A0@`cDq< z|9|bHG5lBlls!=PK-mLj50pJn_CVPKWe=1+Q1-wDd*J&&f7&GfnDmX`@}s1?0Yb@a z2YEbQ+jn)t7}Y<tRUwd{#czTUO7pOnut%CZv>d_UpZROjks1SuGQL!A? z1*@ZuNEdwn^cuNF_!BVpbw_=Ae8vyXWWs~0xG2s4(zB72rISr8F>RcjWkQCTVM z+!8hRVo+llzhjIM;1O>e$iR?}5tzXPyZ#g~jV(^b9(#BrG$lDJQy2j+H_zSG37#QS z6i)gW5y7gAoXvSf;mYqS8abl#ipmL&0k8>xB5;m07&5}{g>VR7hsO%mu`&pji5AD1 zxS2ziAtplxtN;al3<^OgActW@LL%Urbszb<2f2zjK^jH$&Ug_(HM$;@8G-mICG>HzJ*f8#GHgV%coQCHf@~gkPwJF`OhUnMrrRM&u z{peA8&Bl> zAX$k>9T1ZeJDhp)a~>GNJkEGvYTJonA=Z?xE91}d!Cb#N_VE%r^+#`6tLrC=_d56I zbT{0qJbZBSc+S}hgQQbw2Blq^BqGP9u3qJD4UxT@+PI6Bg>!arvKdbE(#6Vh1AfOg z(zGDUjC}xC;}L?R;E{yyk)^>7+kSJ>Ihmy2(>NCDkl`mL=3-u$h$|*xtBJ^NCMKqb zXSj(8a@VIEuA*LwpB1}VcEIQp(ybJMo3iXg z96wY8h+-T0G5I}@0x}8BrRw9?kSPWo*NBLRwH9&v`9nbrKv8wn;;udnSx3N@-^(*Z zEl%G{Vvk`oM6A`(2vD1-BjYwnXj4wd;uh9IwWx)}Hk57RQo>@?%}CVKT}iW}*}yn@ zSzTG8A>MV_W~#!QtUZX(kLNq8%7*_j)_~sXY1A1n5`z7b05HBYz!MSg6eI@shW@EY zI;JYBDCyYK0#yU8wrUUD&=Q;{BQTyGkK410hCra`w05J3j$Vftx>NtQFc%MG!Ab-@ zaa1C$B%WzEu|_766_I`)J%m>Kw}n2dL7=3~jA9BD2wt>mST!^OZ?efdA;`R*yoP4x zX-_-x&2HMv;#Zge#)7Zb__Ba%@&Q zNUBChTErzs`|8dPPd%-O&)$sh$k2*MhySQYKe=_}!fwC&@%vn!%181g-JZx#7m%k4 z-C>t5PYv{$#k=Hrv-Y*e)ZP;Nu{}6^VgG3 z9Z8XE{$tLf&zx{1tgDy(b!mR{=MKg}m(~}&Lq{qXK z8KuDEiSc&oNm@UMSChG^{pfm6WQUYB^D9HVYc|{ z$y><7y+xE+Fi!BdQ_rLtWN)(BMQoUpuP{nC2ws}HAW$QOjLe1>;&{T@!M}ppv@jJR zQ6#cX#AD-%c6I{L89mjXJ(Y>NM~S}~uGf0rE$ug1Chi|LWnzI#Qls1j0gN`Q=!h!V3(0%Z`p0GS?nC~--TukhJ=Q^?!^8lX&Jn%WM} zj~UlTVoF**{W_^Vd%y4wi5zha@#Esptc7nw+hGYfk!ge4M~{s2Z9?0)nS9Ofo{S#O zKE>yDTK-%|G)oOww5^f;|E00c*pL7FvCfzNEI-*>tv`_4&HaV*?WNF7!^R=dt=Ww<%WanNHg#{A{@z|F%=+#2i2&)^ zBf=xX|GE|54}BNxs)A$Fb!c03BTwMLWI>(_l^yxDMu+Im0*v6E4URPwq{^^LAlqj4 z?R#~wHn9{QtTJ8=?Yk2b8|+T#q{KQ=i=Izvl_Wr21w9k{9{gtPW7t&;&!H;r+x6<< zA+m|&RnqotM8x1N9!I67u?@PNW^PUM)G4SYDof3f1=ds4p5CguUlSYqJ1W!!Q$=3ICliw1jab^FZhD5d>^Z`)6?Y%Rb}|p5j@zlH z?-N}re515m;a5MjPxVCUANj3y$B0R?bg_bY43RSOmx{w^wZ) zf-e)?*P@8o$8JZ3R4JK^s9bzGvn-OkCMGD~^~40`F?P7_wUgW%H4+;&Gt5p*=;AN1 z#NKErmnn)GhOL&p)Z}FE5ygbd?&q;aQ8{km<8Ay7dj@J%!||? zd|zT3^ej5y8N^(44`vQ^N&L4YlFfTuUdoz#UB>M+FolilJn>?4i?^Qj}rI7cj1_Z?f64P~Ht_B{S3)fA^NHpP&H-qUY%my;q*X{J=z zulGK_L;bp8?Qf|wZSQz?&$gdf%MbL~`);#QyVQOKk*cOjp6d9XuUeMm*eg8%iIajGgAL;uJ~izs!~=X$s~#S3PbmqkZsRBvSRxIw_+Q*sY)v7LO;IPj z@#X2UFTe6{#=iJp{P@3n@D``XDX|K_X0SB2OL@T))f@fN!2dmmbN%{AX% zeel>^bnfllt*p+~?rL{#ov)j+hR~%QG(W-r^*=!MUrzLZ;z}l1%2>gDZ4~ zGz-eV8IV*4MHgT3C%}h?6VC@1a-F>ZB?@i%7-bR%Tejm=+u<~u2+U|GJ$tG=OB5Z{ zf)f`H$!TV%&MS=`!&-*&WUWQZWY#jcK+m>})Rp$h_ZB~Xh(Y|JVcolbeCo4Hwof&X|J-%A6w!w3McmkI` z1QmMDo(+`ko^WT5xzyj3WG0!z8NWpNP|>?Ay$uSc&qS4ifSyJPY8bDlyIH(4N@H`K z>7005glMx@BJ%q9cGe0Tlk+H3J-=7$x))x3&qLcAl$gjr29bW~a~AwfG_8)PZR%N% z-h?_fwtaZ8PouTHB5zVSBYMBjy9S#L^2G9aj7}k8JT{GFzUXf7GxSANXq63h%XfXO zKxEMEKX{3w3@HG@cD3DMGk`{gFUNsxr_n+Ssjq;YPQ`Y_~K3>OC{+p7uak5c!{Eh9l zQrVkpK3?54HjP`Ib1r3!LRNq4)i)EbQmpdMaWb)w;Wc&w- zSJfn^D)fuw28=y)W!9VvpPZ0(Rjp8b!1?$q7>B=AvzF%W*S6NT+$DEyG2FiEHq?y; zIhA%t5+AZQ2ex4ajl;tR%W$8up|V|WQuvI)H5( zgElG5AOSVm(eVv7iAjE7;sZd}r zv#p9=0&Obl9&{>ybWd|ozPmB0b^Cg>f1hb`l3*m-Qh}4hkGPpMA@HwAZ zRrQ=e^)=Ao0jgvgUs<)(4YRSP9o)LrURtl+QWrOm?#XwQ^Kawa zCYJgkjv$S;I6ejol8##!I5J$a1NtI>zlg??GX1bG$sfez%UD}6Rnk@8{#f;gu0`mpqM&oeT#&`dknyZ9`F zp-L*AWncbygF3{p6sPLU+uM&1jC$kbiQ&yG!3TX#l{W2=RJ&~YjV8ny2sO|yYSb<4 zz=G1r)*58^Sonrw;&*ok?0M*o%jgPS(~A}yY5B*#_w?yAa&BgspWwW1VJ##e@bN6} zj$<+D>?H~*+B(Q#9tWZ@8mW?7tK`;-cL)~9%-P4vv~Fcux0_Jm5rqmZy-e#?rgbaR zx~0n?8=DQoE|agGM<&Ajz{;-UelR0)Ux~Jlw|OAFB$Q7ApI&kft&&@d&!p#@8S`c5 z)Aloo{oEd=(eg& zviK8uIaI3*(3-?-2VSLP--R*8%V-237>DXky!|9$K{KT~JwLEJhxii~@*6od*X-kJ ztpju%CF-QODqvh2buWC2r1&C$b=Hz4y+uHC?{jW}GN99+JKF5<6( z-ix9z8qU7&wy9~|?>5ihg4NG~w9OP!PRLt0O#NDu%n}qwA=JB5u27Du}Y${Tz3I5h1DCP$KaU4 z^XPLsZomd$-WufLXfaKf8&0TTnirMZ`B~JlTWM5X#3$D~hlkWlsqz2mcn$47 z+>JKJM+m*0Y#w$(Y`mN+etfzOc6i(qTN!AIM7d$pS;&Hh(9=97H>;PutnpBN67pG7 znx*dQf#Mk!9Z>W%DTpr zk8s+GZq~iC*8yS_we2tc<6=I(*z5kHeiQ!x3$Og|V?X{AU%8E6<nlwE^y9hS30X+Xw7X^+U>dZ#apfFk&)15aPu)fM!W0Hk}mK$(FHQx_7FTL+Q!Pt zlXmO=!zE>YJbRBLyI3%+HHIM`XM7-w&)o_V`stXS7#|@aV{$Qmmr{ID&`SEB{$pC^x_B|UF3Kgq*4Fu#0FmzG%4m|9!=%h6{dTeB z_WhaD5NGTgli&PpoUyNd{f)0%exN#TpqmyLQv+9#2T}5_`!jBPX3wv;rwEI7GP5|p z25@iKw4oI~9X~+KFN9upl@u$el1#_KSEFQhuz5MY0t?lsE@-Y;u zNM&VUri^}?%$agy2PL8*G!EzS z$nn1<-(@&Hq6%Wpj%R7r5g?89|1P4B7%$O9^}+JO@sl>;*23$?Hi0Np9NA*}q?Q8N z2kyzw+jVve+cnBVt>DL+9E|^?x+977o$x~mIF`IOj$EsMbT7bs1I~e zcWg)UecuFXLNYbm_IwvKYJn@8y_;T_qOeNlkEz{VU^NeScUM+c&+KlvcJaLprjkNR zlkuJU7R*8vnFOSuO}lNJO{w|>;uRUh5Jpar7z8X=VtTTO|9}iU1aNyl5Z-5zf${e@ zfB;8$H3ZKn1|5MFRZ8iFMWkZEoyqlXc~hhW6fR3%UbUXkW1`2X%P{eSFF#=i90tABuB zSNG?S?9(Hz!v42+BNf)SfZ$OiLj;eX>e#wYAwin0YLcNlfhSwOuVZp*hM^g*C2E?b z1T=vaTaqPN6}x68gmR1*th7_q-FAE7gZ0&!&CPkBV|vctFfJtPu0cX1oGttI&{7*G=?)j)FdvTB+qKHm*ITDK)42W$9%rQH4iXO^*lPxzP zfQ*NGYOMm!j`lrmTWC76X;5 zxaex`sgL-t?Umv~|96j1JN(f9KV z>}lpg%HcQ3X(Uy$%o0qQ)?h84a`H_G6qYQ^d|t z=golZMMgnx=&K&`7!ej4Le0zA#k$+UcvLg5PT)os)P%;=(wIzS$o#PD=w?!3=_fAz z#8=r*oEvh>qyoOM`TC0Kh#6QL>yCvQF(zhOIUpn9>sant!Ngxn>zCzHnV5)HaZ+4K zmMfGU&X7da@yaM5R!O2@iS7qMuu=VKy@Z6pN|tDlln&km&- z=||0*+a=wxHE0HcN}0@+iK(PF%0y5`eUQ1rT2D75QW_Z^B)ob;GsX9#=&e(}DeP>d zuj2m(V|V3136k9s+F~xqof*o6h%vHfJYZ5`+IIGMzLy#pJx;muz`q9E1F>W$(LZUx z4=J&5n-RkjZh#WhpP%?jN{QILnYk;KqB5lFs=lkq;Cd2=fg9*55f}~yH$aF=62xr+v4l``GWYfh~pL?9KEMk{&p0Rg2--*_1D?f9pMMp+@uEiI)jLuKC z=vwjF#!t7XSnv6kv;ju-iyU!DJ<)S=k2!qD#smjlQocU?S%qpY+v%Qt35xJOS0ONqag<1WIaNK*}l%*vm8!&ZCc1arpNI#81O#W z{ByySU+^*OO5s*o0xMn&u%Z+dBKE2R+s6>8(Lp@WljVo)WM{M!V53S!6Xaj1?p-RH z3A03xq6xi-4hC}Kke}@7FiE{4O)7TxKvPTp1Zt*FjM9y9m>xSdIEV49@uxd1ykTb? z83e{J_e>rs_k8~OM`~&uBrrbIDb}Bipij3HAg0K{kgC!#3Z7|leGpSu*V+8}X&L$d zUmg3SvDf}N{<(rbzy2Sdp1?N+RNW7e=$@hKdfoVgd{b8iRaY7;$Xi3G?Mv{$KuA6} ze0h)xGXh+$wtw%Wx-vhr7_K?{M>Bf!;r@0jz=k{sE|*U^ny5!Z8$+&Tgw;I0(bzOM z3ghS{K-T&j@p7Ek1r|(3rs$p~S*EKgo_aB0 zQ0cucz1N>L?{%rcu~VpY6=pS0uupX>pSd>F#DaPbS7E8a?Op*5u0*bs3Hn{M<=rv-SN@beQ1(FC17#1CJy7;Q z*#l({4CsO1{Hv!=$nv=Ot&d@Oe4Qfxb=#0F%eDd~Py@qokUKPxWl1+B(egaYl_k}8 zT-UO7Pf|S1HcZ>H#XxZkaPgQ%&=ogx^+FQ8g?rVx+2xJaisKpKYOtuRYPZ)CtMwUB z&u1tk@k)VYnP6`f0)k!HBL8(Enfi|HklN`BU~l*#l({e2#kH_x{@HQ;r?@lW#`Y z0kB@`rZ3ut?gge3xKdy_hL6n6z6{n&*>w$k8;GV47EB+!UIw^tY#ZDnL`CALdY1%W zVh3J6>;TIh$O77<6o(w4eBk@dB+K9pmbC|A?6Kg{Cb%=@qvfdwSsFV;R<2iwLHqp> zS!+E?3Cxov>cS$@hayycu7Nl!+!H^D1*RQ=JDL*Xu|#<}6@>f|H;~g5IhX2)L#^0{ zL2^e=)k}>dUQ>6LM2aMZ+@2$23z2rk@%F;{4hn|fNWZ8HDu6GU* z?#NOFBO_ol&SHr0<(+zxgHf6mZV^pC5(JaJnbmlc?5FA4;Hge`>U_Jv$^~{}l7hL< zELpnVv*hWyaVl!g+>`3Ph0jXy8F&h@{2+E5G(J3HJ9!Iak{sqOdRG2UJ+lX~H`yF= z9|9sC`HiU&0%9HG2s^Y8QSNg56_O_x?oliWD5a0ZW8;c;c39d>{n=BQ!sS6`#J?G? z*LvP9?Khd??iFg8cBbEyX`v@CXjfX<;WkWOtE?eCv1H&mX8f2qK$Fs%MAU6;YO)l0 znN$zM1k?wz_by9owe&HPf6D6)8eq8*SweW2m zuhllvitq9o=#lZ!i_`LE@-@GEGI}`s6h}g)<)dVt`2+w+`m5;HF7iMl{qtb|KPx?~ z|6kGI-0$)KD++QD5U6T=TAk80Q&G<0|JSEL*q)>PqjiS5{Zqyu{ofyZ&Ho&U{pG8c zJy7<*i|c{k|K{m`%+>5aeLqsOZBq^;MG;j|u{^^!B~#KoVsunY&(j<&5CP)1Wygk! ztr>x1NTv$-lmaGPSyNrJRI`~#%QGllDOTAb3Fc-fEikFk5Xk*Qf#ndUbO)sUlJH#v zTQYrZ$K{Ysp1G3j=nlG_adStvBGK@{Ue;S=gQciROiHXI6!5MK(Onk13wc27L$^Z- z6u7?Apyb49USqm*_^ifLB|Ti3MvUh0OQkkH;QV6Ij)K+)4N3<`?%Zmfb0UL#8cNzu z9TYkkM3fXPYvl_={lIWVO&-D#3OrE-g)%%mQlgrzXq$!-elMd|7W z+d64`V;A2R@P;?>qLM_r+QbCaL1u=e(zLVUB2#(If(@akS2B5lYhlI@|a2=(eorNe-^3uk;ac^MHe)Uj0sc;UgcS=NB4Fhw00O# zIZIt;JXi+9p5bOMNkA#*f0-oRISKVMqs(@@d59 zD|xEpd%kK}l4HBDB8+T9psBDMP2OY*BBf%ro?d0$9e-r1KJTUY65U5*0}I$LTR9j5 zc7ZLhv{dr_gmAs9&bMiZ;&N|Chko?=tyufdRyIigS7mKiLmo8UA4dO2>7n(1)i|U7 ztFjsE|HhQ08!DLtM&Pw6-_yP0`oiA+{Dx_%x9_)#87Du>8V+XZK>7tF zaoGL!+0(yHt6KWT52YxHgDCr|82FxOgF4ldL0meT=6}VKIDGC;(yjot{#3x9`@V`# ze^5$og3D^%51Wm8=wHtxK^&Q#kOajk@zY9BLA$7E?24ism|AXv3Y1V4Emumx{=2?s%pxvWNCq76dkQd z&7OO-V*A?up!jGdb-%t#Nnh8HEC-dR>Q2qqL+ye2SiR-0KU`Uz*}BuHoDjKxLF~{5 zAxcW%WYxbGUMQ|eCNzhbJ#z{MsNUE&s<-cL9WUJ9uilzJsWi81{(3S%LvzS=6Y39w z%wb>bwqOqfH)C@HVOk7kiu?IoVW>GWv*yC)=!;(59DDfrkaNt$3g1NrI~QHbzRx+~ zb3OPuYWfHOx(MDzzX(E?8l-XR07RF3JtT}SDGwVqetMvE$+t8Na1Jm>6|+U>V-ROK z@+uxYhNg=;E{mtj=}Q>rF9A{)KPv;OOP@77t`0M2DDwXNlNgI?bn<=g<8pr69WG3E3(b&MqwzKeDUNGeA4`*rCOs z*xH`n@YZGI9ANOaAvVOy-MckwtzDa0I$mFB?caLXQIx&SWJ5e-QOza;D9kx80(7(W8EmFr%c$%C@R;!0LpDH2w4WEDJj znDdnleAns9e8E{crNsC%q*yjGB2OxbeCRI&#veZ3qFe^~=S}KjP7)YgMlJ&`AAHV5 zl#x;}6b{cQDH!NbztkKIWLt-#f0hA|t{Ve#FtqJj^X9em-Z&K^p$duxgVa#qIgi(u zZa3?X+Ku48HotIkyx{KLOT@0B_0Vg>LeQ8{dI1pH#ZYK0b=wdyw4M4T;m|G{h{n2) zkW}oC?Ah3Z`bv;eykrDNBjq*+k4Bd_GT1Ocp3VZ&*c0hgOsdXzXjbwBhV<+1UTDKZL)CZ(p%}& zjRqhGuNIf@MXW`|b0BN+9lfA6)~d}e*jlWd_W`cu_fH@68WM;OlVva8nT%cM9Ey5A zj%^T-ZKs}tWMiF_VAU9wja_2uc8pTHN%TYkEmp9zwOxve%@AaTN?^Lz?{BFy zZSQz?&$gdf%MbL~`);#QOZNKnso3Wp%F9u)hjW}?Sj&dGLun zyxhXmNXma<$EJJi;QWh`xN+I~KVj%n9X`szNT@tqFZTcQ{C|zHFaG3M;{`zfzyDW0 zd6grlerqp6PARgb04-&SZs2-`>zNAi zff!h_a>bBSj-!Yo0Ewn+SzrxwY*jWC32Sd8b`Hjn3K9;4{y?cyVJ+fxsL&_q1H5>R zlW_OY584Dw!ryT2sZpW$GQZ;;A|Z*&xBQx2ty4r_bkiiem)#KGoGrs^nB+XKQ7I@z zqyd8Iqr0xmg}0*{k|Nz&OLCdwa7MsLl|2iC3LBENulw}ub45d`=BEoa)`5qzMbC1A zB0LnJ!MWR^u4&u1i}%CdJN)Do+Mwos`X7f8Re|VBj$%8m={dUMA_{554XUInc*&^> zHW_*K5iwZPhTQZU%|k|?N6;B)SzfhM0}nL_{pdo_XtW&)1>Unk_JprnZQldOpN|-7 z&Mv^dI6_Er15{9;60G}^L8H@ZR~V}x1rXDQPLzT4m0#Vfq+jtZnQi>O-8wv(5)y{L zs9k(}^*zd-9fFjb+T>GRjD?%Gsv0wLvzNk=5>a_a+}Mu4SFN*iB6Cwo23V2-a;N2keAXTNZl?{>01#qO!Y%IdtTaIJF+N@I93J+b z{xz^=9_~hh(xW54KG{6%gpi$(k=M6tHBtlkEHJWB^3Ma@#oIH@}H zYkE9u@?hKr0Os|8-J*39&3(3Dr`bYh5#Vc`nuGVjLSRd8nglQ&8_u=`TGT+qCWRuw z?afqlgRG_KqJZ#jfCPIs0jx{kV*&mj<1SQ}r2zgo8CKj4PiMsEYoZ zMRy%$S_i!oYaqI-4jxn5JAff$arKp$K{V>8iHUfJVO$H{;ELG8(bFMEm4-mC!rTSG zk1|N2bmld9C^$vJlZ%LTCEXc64?X!Nd)-N*K!7N0M6FI-Snv>?Z2{jhi<;2W3m7cO z*KrflTf5po-8G4V)CN#3u%1iW06!0(VNri&-+7U&`ah`GhC;hdCSt!Z{hy-A@!plB|5LPt{!g0%5reLu zhyPETDiU`!gav%_uvp$Doqtl6B9}kR1(1&my%eb%=&min|W zUQFCTJ$Xg0v8@uG-p{!Nh5i{BHC+V8pdlV6D8PDP-wz+{wfE(Q`Ph4`%d^V7swN|I zJ}|~K2LOz8c9MU&;P9lcMm;^56Sd&{r22+DKzq)f?n5-LXP8qot%#i~0rEDnOVh?B5cp@M4e(rN~5PG8ml(g#wfs zK2xocr3B`{Qo}!MWOzw5{MbGQ({ae`SxiA?-p%|&CsjKyH6-BkCX$Q<04N-ZQ2+q^ z5Wj5yzg~dA^82gJC;QxOikNA=L$!pw)clw3MhZo2iSjI#{cU@cZ z^dPWJM}=1}uzf=fB;5%_327f-`gBB5G*n;LO<4ijz||#9QLNI3_mcbY9#qI<(QNrm zyG1Gy?DpUTulYW>L-%e7v*gNvQ{ylcZdH##W8rq1AsifVyd8lQyd?y!MooYW&v<^L zYc4{#{1)dL=B4-*XeQNm75n%}OhF7QJsfYKQ?4^kb5@vh4g0oRNgpXxkQfZfZ1JSJ z3)?=t4y^2yKuL5njf7*6nwS)TQ?kYLltr(ERAqJ*&PDPfwv*($8thL;tlF+((VM~` z&F*64#jIf{%?JYOXjqg-tfys(6No9I3F$F)Oymh7S19Yviv1X_O&@MjN~S}d?R)PD z*SVlemjIfHUmO+LQIAalCh{TdwFgIbYY!(QDCW@b{D_RquID-bFb^PKVrW^FND+k| zY*&5uiKobUI_~+Q+p0Fng++{QaHM8Z^^lJQ&M%)ix!~bVk7IbNFsUH9vb-*sG}LI% z5A4n%{scVeMo!H&`?y+zADNsw!gaiV=;KWB!ncT4x};Ob9Dcdz)HmUMZyaLAXTy_` zt~zzFaej4Logv`_{3fLkW60}?iMd7{*Z`iXnweh&yM~p=wjaLLbT2iwJ;gf=CMI8{ zAU7wr5BRDgC8>?=1rOw|POLaub!T^`l)IemZ&4K+RcuLu6s=0w71QO)Udy%XJsj!0 z;Yo9Oo2KX;K?09=>>^a>g;T#__Xd@|NxEI6n;GA=G8-!PEuMlg-qG+>)(@M^_Z#hU zlkj&>du6GFFo~W2q4s3~~-Lw)9M;?4H!gtD{h63=o_+F|pBc+AZ7V6D?CAn@`k)=qMX7{V?N# zDnDr=Z!Mj%tiH%e45AjOsg$W5`z#J$Y;>p{+6~LPfekifOCZk7CvZA*zTM)rnHeB< z@KfY8UK<;3sv?0RT2&=rE)CyO6OshcaVu)wdBT3cSdZUYzT`!$^SZoQ-udF{6 zyG*p^yK10&It}FjUo0z~p2Fxh!hv)`dk=7vr#t~(>UXu^cjY$O^qMO1BYS)rj5DHw z6mZ?1U7Y9;8IbR{ZN~tXGl**$=4n6-&se^%Zr_13rT|e z?)YlBcbz!r+{&JP@Tj%Eb~mWaJ-%a}EF6T(DTCP=6a6)~H?|rbc5dOg!N}rB44b|S zX}kIa8zIR}ICW|F!3$O(@UzsPk$}qt$0^hSVfuaeOmI3!1#Sp{^x1R{M`t!AAWH9N zWdZMN@N~w!5p>`kfgFo--bHd?uY?%ycA1?{fa($DfMg8kc0Gh=oSH?i7FHS^9MUbn z-D%b7anL=gbz~#r#h6ZlwH+FvY2ry9`o4wBazmTrrtszNiqfHm&woocnt zod;D-o|)NFA3DozduG0+T8(1Ib9t&==BbuJv&mBmgFX#H3f!q|Z!XuDg4-uY3n#jK zd!-p1-`!3I4AN{1A0iX~&1!~m=uw}t5YFz5Kytm zfVbN`X;&KcUGf35I_ijm!}m|Gu`BEe#DBm|=2<7fPW_C9Kk^cETjF!g=y64PZi0-T zAm33C*FV5h(B~MBYv6B1GiWql!DTrM26ziD2|hklh?BF@ei*bhQw^2XY?Pj^7h>G?b3)4~o=jip%G3qg57V&zC70ELqx5(F`> zLkVJiYzdf8edf@!51*wbf|%!zxjG6B0L7RS^8df`g?~1N|H_}T2g)9JnR?*k_dfYD z4|MsnpN#@ttiVzNLzOkzmSt7aE(91`B|fI9-Cbru*z=8wF`J&B8b>`6M>g2 z)!6>hz4S5wUl+xDF<{nZ!@WjBdu6a*91I(&2;|1>>Mt(Ee(tGO2CGqJ+;AB;Tx|hq z|B^F<_0eAnqg5{uH&v*=lySr4dca=HJP_>2OrZmXBat3-gO!F0#|?L3v8kB^#!kH9 zi3&S{Hd{u~Wg`UVc`P6cZ6S1dUEt0nK*u~r7;6h{KW5LQ$V}I60_M#*S~=ny{w!n_ z^57r_R=e)mEfBYM+HgU!NKUwm8wfaEYXEc(Xt+@8gl*xYCc+KdAF-!KWdT&*^TD=A zF*YqfMBHH#3Hp*n(cuM{VI&g^mBXt@$oxXC+mHoEaRCZT=o!Mi5K&r404PsEY~Bq# zNs)=RePGZDO4Fhrh5*n|&jy{y3ICrsWoV`$>)n-gAy+tQ>RIidX#4WA|Ixcx+pqrn z{`&u`U;MXYU;97tPx({!K-mLj50pLdS?qxyjD7MI9*FUKKM@6DSb=Jrx-Yt(Wa*M; z$;hzcI-=)kzG4JO$zlgGvK{D><9dp$JF4YNri)-i+mmF?Q@UtTu3jL9Wj#5rR-Fg> zMq{Dbm|5y9SSxkPXiL`ho7c`jILbhb=N5>e%EKV%Z$I7$J^jwHr_6;jYU9W-R_EGx zk^v)Q7e2&@n`<+NRhz~6%RIVKKu(34T|dD;tphN7(B~P5$kqB(^qZANIOHT)86aBc zltcw3HT^0*OkHfhd$Bvg2WWi!=I!mr z2S&Yd^2G3FmR9QzZY3wg(6LoSNqDSP1a+yg&qeDYQ9Pd`10PDfqT z6yLB_-L^po<4ckW9?8JdO%Stqnu8pauAsjk_jA(j4g z&Y$u!`P0jc;qXszX9jr_IB6a6>s0HUMF`woF>l=rLXJUX=OZha-I@Tc6eZFCmDv$8 zelhn%4JRUJ(43fnR>q5g-V0%11^3FLZ~!hJo;r^xfA9#m(FCndax((7=;rLz_{kF! zNECIj$2iCk*FR&6R} z(@O}<`0L@NcpMf>Ac776e<#sjQpd4}B&2;&8&Dl`j!aI{uWaIvGGn;>46##jS`$fp z_LN=F7+oL2U7li8pRt@CIUR`nAaUlD?07KF*Ph{K{V(8RGHpXpsN-`S9w#9Z5Lv!t zQGAmoB1;K}ucOJ^Qy9$yahudrHl3I~#aR+F$xMsy)HgHp2dj$mkkPY|+ls2CUnq`; zP!8#s@h{sIeRGIqT+`g~oBF2<6I(wIqyX#dUA8$;`eJkgvZ0BHu0^k=m%B>6Bgpuk z_heecqMPs^I1hK(`oc&>m)O9kC6f{p!u76--=?9A%e{@=fwq?D^INEz`BtxIYkO-X zv~Xd^j^g;gc*gK9J-YP#ljs|G$Rh z(t)TTv-~jrf0Q29|8Gi2?#E3U3F)M4VRC_*Z+u$%|Ji#N;K;J`JZyFzyR-Ayp-j@0 zWXWuS!^|vp2JF7?J6>=Npz$Ccy+C*4Nig7j^%MO-KhS85$D&Ayq%2aB^&FOIJFyj8 zj^s#_ic%>#uE=>=sw5RVk>kXUD=wCjva4*DQ%=fG?5gDZ&$+K|bOUGrGdr`};1YxG zbI-Zw{O6qi{O5ms{}`?fdQ|oo8$+E$!LmzTsuwK5xDN!i+LWxu+S zk(a9}UrRqUygyf5-;gCi7?TyDuO%VK=j&85#ny5$*;-VWH}v^pIi72#=KTrlHoVVQ za!}qh+pw@BA3%xJLCaI@etkEF>nhTf%)y2ZSY}AcOw@*<&~SA?`}h*s#mTc3>X3Y6 zjGnDKlzN5qB$T0m6+*idxr<~O%<|llhA%F-a3iR7xmlN9?>EK`X$7 zhI?%Vc}pMyT0E0EvY}YOUcr4Y%idHs2qzjaJCxdmI^Y#}T{x#X|2WDI&G|3Joc|G7 zsQsJ-WTnro0N?k&6MQ50?567^@WZYdq}!}aS~Xr93-Z*ihWR?$rh$lnl8<+ z)dCQoZoc+mR`!FLpVc=>kdTOh{N{Qaq#uk7VENZG;>0>~GOX5?ruX#n(#phYt-5gv z%m1djA=f4rD)U=TGC8TwRhx6wgCJMHSuFqO*DQFp|B!CsLhS!?tiQWl5BooxpWgR> zMc9h$_228<{vW+`C3>ME@365U1wND%_|D?9+pdd%=$?(17K=%;J7GtKQbll~JE&{Kfi$Ds=s(2EZNu-0J zTL`lx7agaHWKDUi=#=XZNGaWDRd7McWSko1tubpzHwrIfUY)Gbu~;OTqfo&w)ORU7 zFo|+@{ZS&bxRfBC5Oz(cfjZucs1`S`;}7Qg+@payf5ijb*pNW3jI@+FV;7cbw?H}A^7x(&;$Hm}`MP1EL~RV-pxObfIee~L z$lilIcwQ1PW*rZk#p9H(5w}flZ4YNU<3tX1gm-Vd>=PH()Q3F@Oy76Wm#o663d?+X z#7EF4NHA!Z6nVywHHhtz4;pZV`E+PJ85Z>R(tJ5{8%SebAQ}G_ndkrvXA5eNan2o&DOl)Z~ z6H_SXCsricdME)M1$cK`(KCR%H{lzmL7^uZmagH?s1jI*&JtnWH{QNZTxSPn$~vvI z7;M%28)!SgBJiE!f5p8Z#v`FB@3amP>oQz|AvkiaudDRhWASE zGwbI&*!GM;0$rCn$zSVnMCgac{Repchi(VhCp^uq@j->bZ1H`kXAoPwHipD}{b9g^ zi%btZ;b9`%VIo`7aW*^*fEJ~lMiOBpN384vwYvs?IYjzraLh3kC0|4Eu!F^#Le@Fw z$yMM_=NW^;=HbU9%$)V^+9>GQ5fl1l(tA89IEd@Xjg!V{G zi~iwhkAodYT$YB=?PwLB3wl4Az~2@?*|xh5nl_l3-%@2+s0ao0*w1z_J7%r|Bpe*BI=sZ+1M%V z{}Sx{NBsf>KnjRk*FJXq{r~cnU%YfPi(kW^Aq9pM_~0qHDRFo`JkqyUDEklxI1*!$dG$dPzTG5Oc6D39OR5HAL z2II-)d{wD#)R$)^ORlZNYjf50yy@E?hX&&pXE0Wk{-I}q!B|a92<2Q|Xl`t3nVMp* zq}PQ5!=JEj!^#q_F-W!xtp<|aLjXjw-wb=szY%bwJoiECw=^bDUSB3S8YmvI=`GaNeMHfo7%w5yfmr>g3~Db6|BQ zDW!(wI(bs8bTu4^In6S!8g2|il~K;_Vnk>VvJYu<+>thS>1$H>uW@L7CaJ=^54!x`X;%#<-!2!TlR3TTt9&I%wsqY1|Hx;hVpkEZ@y4lbOzG!9H#& z3@z9%#)3WEIi$6G@jIuVNgaElx1g=4$C%WA@{`Zr;wJT#`!1Koc<2v7WrhC}`+0y94mXxhe{p#`e|JPpoXP5Bb@aIEM zf$zTc>|@+|{adPg44E)atA=LBVlhLIwAi3IdWY6)bJr<(5z>`c&w4#f7B);4hHEBn zoptz4!~9O>*kQ7;VY09$(iSsiM4$xW2}WUhi9}#SPxnqbJ4_a)BU&eB=vGuS1Jlrj z8vmI=e3*l_wqrG`Zl+qe2f&O9Xb%_+UCQ*#wCjHPkbCyHPvX|40^XVn9IRS zkSq*l<6?_v+5y!65cHqLBMn3UUviHF?*C(yC}4|J-#jJdu9Ina9takeGHe6fS%Olf zlcRu#wga}neGTC9#*zOuiDLix=0Dc{FOI>5cgFzwu}y*fC)oel(*cubA^Q(Tnh0=! zhX%k7DSNmd>#r&Z_V2R)lS=@P{|Ej*qCj=R0|+@2oXY;+FZ&<$PTsowH;=#nU%vYH zFWvkcehq(y6c|!qNP!Or1-`ZX><@7-ieLJi8+IR6GooN-2=iEoW^7Ydbj?Pvy`X8b z<|sl;Hw}k8Cg4n==+R6pCRp&YFdWmd94n)CD7#)hFA5`}XA_I_$w?_)w-$`W#@_m7 zWyaUe54|W}lotigT}AGzzz@7AOkr|$V`F14lbN5;?DS-9rJ9@$CalYrcJB*>e`vC} z3y4ISU84c-M<{OK*FZWfgx*IC@)cnDrN<(g{8`sQq6FVaxKTy6+N%l^TTLpOvM+>ZaVK7PKUXo6@cilx9YPt;E`pu8-0{N>zMdZ9d* znQymd+KMp0Sj`-)Z25;pH}4sm30_?@0Veg#q5lB=m;1BdfkOY+Yv!6dDEu z{H!6XPK_}3PVzdCQd%V;7vu59T(T6GX49=zVOjK->Z!dBLZJT_qFLyvTeyJue|DYk zD?aqF|I;MNeb||_^~0cb)Q4@WVizze3pcl2i;=S~&BdE0fWFf>!p z3|-ZA(b8=-8jCp)5==?ZGcik0rKlV=R52q-mKBpSKz379lqt?DWhxSkFgGHLD>Vv;Bar)Cr3oE( zoiNSF!@HG(_d5P=;j5OhTSTM0A$mj55?$nn)&3IHGAOGAT{&E|&u z{8?h?Ar|$^9s*mzu0>P@OgBO5KYz{hz0P-Xk0sB51$@K{2690&U#(S`;~06|JT%)6 z>EDp!jmHDrjp(xicOOxPin-IW50CpG=pNc3iab2$l*Se1*^C5qb zaJ2(C31Sn#8^G_o0lV<)y02#eyGZmgIvQ`*j0S?5Njc^9jh+V6a>qsAf;|ztjCQgx zu**7CrJ$XFg}DrrT0r9T3iDdw7DUGK2o18){VEO)PR)C{9s~kXzz~SbvEGW*+o>K? zLG0D-IrX@MhLkBX#5H{~upS5Fig9M@j=O`fRNw1UtT$oN0oFq#HR;_$#(6_s#A0!Y z+R5&_$mK6;cQqhDtH+Y&qziXbLQ-||8uNfOu-?&>)r5+YgSGJ4=x&}y&kh~nYCL%W z_XKYEWMS@5K;UW^q^OVpm?Vi(G^QZ2Qbv*uQI`w~y>@Spz3>)LpA4{MiDf|kk4C&6 z?BLZqG|_MXVaF)wjAabOk;qh!31?;U^tzkKD>m);z~ui?*-0z(RfDe!BpXP@LYwT5Lfel&F z@_T|ZrCQV4!n{@2G$);(O8XPmZO0jECi-Y5K(R9$N$C95PBB+Y$@c7Ob8Sko>e<}J zdV7D$+^lE(xjMBW1L2b|>`Dr`%8Ld$K`?$6F(}Ho)E&(@U2=QTg`Pvro_w z5c}j)V|@HI0%Oswm}#n-jdZYZBC>)1I+%JFqUkQ2LV+Ua1qGzve}C~v4t4tS94XW} zSQuVK*Pr3dYIw6kT0^J!yl++={>sC3*B;*JDV^r?Uw7Wknh*=YS(8q^S}E6^`!2TU z_!l4FBOZ9~QRE&4sNu}z|KjtzHKzf42Wf~tAAR?8p-=DD8#a`_pBE(LnxV|1{eeH3 z+2705H=cm|8&qozpd6RRXAnq-Px<=JE}ZYi(|}-PpMYrO)N0KtAd&oM?D2cObP~F( z>?le`HidgoUj$F21FeN7^i%*qh}>H0fB&b;4h&PIn1MFs15&?w2X?0dmYvHVs0!BW z*KtZ%*2@oG4eNE4DPmcl&a8?>ZAcxF(0(CF1@{QrGkKeK5EEc}D`e>*(#XeEz&ZRF85+|wCvTV)6(7}#M|=$sc^k0mR!HQ zHB0sE{XAIirZA~VGYieeqO!cax0*LI=E5qS5ww!W?;TNkgbx$i9B_1Q?y@uGBK8N5 z5W~I*zveleSpkjxL3SNtWI?Mpj8e7t$)suh^UDpLvtNvJ_E4wON2kM#ilo(nRA|6( zjCEWlXzKv*{l)1~V4jNgv(|>qi!X~7h3$Lh0W>u2`(6)2(>^6{f%rF&X&)9%IweVJ z>`s}{TZjxSs-A)j-}rw*opr3uzi-M6bYLiE_EP|L$jcucF%x$k@&_RA6ZfE?wMq-n zTe3T+@IeUwReeQEIL6ZYzBX&FW><1cQ>7JoIqtJcvMpg<9VZM? z1`wX}Bb=kFr^lj~qRaDG?2S@9wq1r@<@BiDUe2umaEiluBXdXN2naZLLIafe!-x#e zsF=oF(4a5sgz$!Bh@voR_wf+mkKh34=C_JHc`QB&Jn=NVMZrrVN4wbt4o*o<=&h7k z3_TNA&!8hZ+A|^2Rh5C1AH@~#-z(CYk@}X}JQ5~tUSRdt! z$1mp{t3!e^Y#Y9(F+LX&)1d5el`y6`lmlfByh;wTOzRNJGvkiN$2dn@F3LF{iiYH2 zq^Q%`NSG@krSyWh0toqhrp=w*k&OoG&QMA(tYBjHuHzvs|C1aM5!j(wx?n~f*^*4j zG-G;H)Q{)cM;#HlQiZQ?Xs3`vjs3ktYkdc<{yUhq9R>hD9zi-ZK6-osB>Ztsn;l*m zIkE_O{%A$N5?}D+?k3=Ed@h1Fx@&L8C2i*u554DEb-%G-C5?M)*Q?LkbURADKju-t zasQd^GOPp`MwKJygCyH!hWfn&RXSM^Y>Yd$U4|nzlu_M1?tI-l9539j={W|5>$+Zm zp0b0dQ^G>muH2B)m&9Ef~6iaPQnak!D6m`Q7yHL4w z#OTxgGTjF=fMF|OVAwUhfh=2j&Kz|g0FfagK!;l1za@3%| zUGEK7=NmsdrUgFSgn__ak(uSd?>)k0@{L@8fFStb1a(14O|afD&@} z_6NX>3f%)Zf~^qr9+MiTIveki$8mQ<`U?b}cvm>&oglzZOoNx*5r4p%08aS0`{g|* z{|U~Ilb#OI`bp?b{k_F;X73xjO+)~2c1_1Y7P&#n(4IF8ESdp1Hq!5Ej$~T^dJ!c! zZD@*RtCW}V7%96S#||w_I@;ke4t~v0H5j|`ATPkI*t#5bd38`NQ~_&&RL2a6gEBTo z$FLB3)u3tYZoc=%4K$TiNG23IKcKl`_-P)@o)&5jDejVva`GEviUqL!pevS=BqB&ng8 z@*XBA)aM%Zkw<~Vd-Amn_p1|AKX!-_UxIFZWU%vv1>5(d>yI5g-3DF1_5=EKS;|e# zC)IdHSV+##lq++yGtH7u*MUU+&gdmBbRjN>gkTPwN49T*&hwNfK@32qRw;S*tT9lv zbM%9bT^s|2`;Gmpt53g3YbvGpHr4oJ_t(%l)>L1e)UoX1ENja3D>z;i&`H+87ZqX@ zG@&11>HdHH@=ss7{L^p!#_f$;i#M;nX96U5_Vd73cM=qFgh9seT2x!mbC88e0 z+0GfTn^uv{6iem~mQ54j^KU+n6m#eiyVpdpHfR=HjfX4AvC2Zt&ib62^Zg6cjUb0o+BLXAA3%u7yw{u;|>* z)Zm-|pot5P#^OA>PQkEQ^CnuACOoUSTeXoMA!KMO6U@yLDt=sW(Zc{@URy~}KB z#}OGwkFk4xKr&S0wQ#8ieLYDtc;HMTraUI}KefJ^eCm)mu%xG_CsPOIoD|o@{QiuX zC?<`RQ1n^nMTi5oDJrD!A&@UgRW;MpEK`8IbK&B^$+^YPD+?gTP>l7H1wd7sQ?+<7 zr3ka7R?%5pE;lFJ(saWvCoYz%G2F#0RhAV~mL$bAO)I9K7|weZAxnDhV!JXXi&{Ub ze(jGwwLsOMaP+m>x}@({%8i5R>YTh^P489Wj_6Z$pktmmug7*M9=;ClM|d8%qEGDR z4VDXAibhICt%y9646Kn-X)?G-!ZCmc9-Z=EmT;;0vX_h-Ul^2{(r7?y%WwhcObPh6 z+gha51coG(2v8-E4{Mg%1ve(uf^$&Cjh1?XB$vdg@lYK~ZLVe5F4Ixw-7KUi7(4r- z?DyHv-;F{f@OHa@?#qQdrt5tbcVCS^HEG?)^mIEllWRKDGe*9!Dm7AD%EU?~;3fml z5I>Fstg#ZbSMA7rC5H)Pm;{))9H>sn3{5x#KZqEXMUdwnSPYS|ZtUYD&=BalRd+bh zITciP?Z`fq2Nh7hW|K>C?5_a*>h-4v==e2V&zI-bx%tw; z%D$vl_7mB?p82Utw`2h#V~61jlxProY`!reOg?^2_@N(4je$h zslY_gP1A@PcINr;(ifov(e%E|^s7rxcZjT0dSQN6p4zuc8}WEHUYZbc?f87EexYPF zHN`NYGRy$dQ?e8d;rSWcejW#Z|FD81J9hBQWMC8} z2dOKOb9o%RK*7T@{!iA^n20aM+elF{y%K>0Np*6#%B2C91 z7`OvCAe@8kIxI~ipzLwW2oyPSDUXhNiy3sx)eIOMwnu`szdaJH@FN4DQH_qmJW?}g z9tmxTW1YCG8s>PO?VH(NM79|SkQ-7OE~`+e7?jt$S;gAIVRfYW5-{Vq^aK=`M$X+6 z$Iag$8|295;9KLkEfMke1CuV<00V_t_c@YDD& zPt%7ZWV)cd1dq76rnXV`}D7$$WPPxHMONP+I=rv)A6XaTqH=KTH&Dpy($IHVX|l-itO zGiFU(*k!`+Mc%JPymEL<)*V{$qoY2z@?qUvX2lpfKY7qsh6w5LbIc^+H{xR%P90{Y zQgmA;cJ7|G6JQbBFe1^(1+GM=QY%+sJcUT&9%=7Iz5o{=ivQ^%DPu9ABla{4)8mX- zis_egjMoTl(I`+Ue zc8M3Zu?D~f$%D(?y&Ze^J*En7Rcba3ZIGonIvSk2n9c4U(*i+;3M&`Mm#Vvjii)Mu z<`U*8WGGZ22Nlkey97)&Icd@W14s}dw|tU96Vg)@^rzHU9fS9|Q^LxoA@MQPx(DIa zPAiDk8tr4Q7-#aIyL1u9)*vW6x{mI0=swmlHV|20%|UlgXnSqP;OK+kZnTagUa`CU zUAZqT8FGe%ZW8C<%Pi3(mchuvggT;Yc(JpgyIOx)c=9*~PeP=zf*cMSA5BakPaGO~Cbga;0Fksfk6Jtx~;8szpib~PRC;eLeZvFY9r zyi*#H**Lf#S~&-vgzU;f;iQ7z=HOfG?CrFf^2cINO!tn$k3VdZvvihUxaT5 z1Q_ouihL%xpc(vDQD3emR+{Pk zMQhX8tfyBFr|Y>!E#qqj2UFsQZOcuZ``lfsY5uk4%Y~6FoWUX>x#i}q%3&}6+Td%!G&|q-a*(rJ=xZR?Q zxcdk)LD|BQ^I;@hUUw`~LqM;DXT+n=uwxpwdy-B8S;AV1`YokhH3#13z5+)XYli+6 z*n_^)a1~cnB2JhHL8s#`Sc@?kDYY2Q$K4AlqszmH*A7Xt>kv?I z4aGIiH;fU@@+1!pC=rOZ=2(^^YNo17j;R@{En9>Jd#uH`w?x2t3O5%}8)PD);~!2e zZ!$rJ=vXZ9{G=+LqdOn`jyrgM;=6%8Dx5_E5Y;hR?dyj3^_x$N*knKT zp1vk(6Vu|H-OlgLHIozV#8&#iY@ctF(RvBi09zG^TB(=v4Q3CcV#9_++{o7*mg0_( zifOS@NzJez;`3c*;>LpD5`61j$8mv$A3Y$}$^F9(#OCYS13RYIb+%4^?cA|F?Oz4t zu4i1Cd>6Pr)Dc`1@?{wEU~uI%nPWTKH>6voeFH(yQ?!z#8-q&KuS8vAKy*{IsYwLq z&2{tyVmRONF}F0_bLs@Hymw*n<7PnS1{MNupsGQFvYqx&b-P2s%3&p>CdWJE*a~ z)~K)Ff10Q5(AEp$!GbB2rv)d|Tw0&oGp8yCGiTop=ZW}O$d_Plunj0~n$QSg>Egx@ z&WJ0#2@50+CZ=DCyia$_n8NRj+%JGHgFtr?s)be&F=06{*DxQiF#JCnp^yu#TzU%O zLQvrbZ*-Mfl6yI&iy!W}oiFbBN{Sg{jnRU}rpaK7KaMF+9#bZ7yzhudT&TOSnUki1 z`yudQxxI(B5?eG}z~Y657SMN+@G`RPINOA1gl1fEHikpzFH^nwRv*4dqoc%x}c0HF}>e#zxIcp<}lo! zSk;#Vqh75gSN9G#8k_3MY-3hkDN2J5_n0&h2+A~|uasjFFuF7FDT^A4c*a;C-@*xy+hy>t;A_5(+`3Rtc2wif!U=QNu0iGPZA|y+hom@m zTk>`#ed9fUrfsQ=sX||g?gnmlKYBTG>GcP1+`99>Uq84Ux$}Fk|MNS4_43A@KmEqv zy3@R~d1w5M_?;iQbM1}$Z~f!9{=4hjum2}+J$vgHU!Qxc{nnRW|L*I*|JKA?pMC4i z+yC_T-@g4@uYcwCcW(d5+ve@r+wa`IbL(GR|Kqp*?ybLe>(Af%+O6yxUw-4C+*-K& z?yb+=`uNR%dGqhz{LgOw#mkMG-+1Fs+$`RF|EBoHe{}OxuiH2N^^O1S@~_|cFWz{1 z<1gR%sT-9W>Fd{TXg7Z7#-%s^;QHM+fA`H_fAeSGY`nSg=DTl3-n@GKA6@@%um9%t zUwHjv*Z!|-|MRu~^xD63?Z>a>t}R}RUi-w=e|7n1ul}!Bf9LA2T>a+N-K)!2rK{h6 z<=TUV-A(pR)AKXm2NBabpJhQpBbmzaKvhv(oJ1#2=`+L&|dz)5yy|NTvp1ko}tZX)= zm)8>QeKntwgoAWyKj&=4ul`eBHeZ~}ZWO1Jg0!$F*Jn$}(U-XN-}5ph-OkNVt!3I1 zTLp1-ZDqBVlkePSWi$4&m|HkV%qG@r&E!-qy{|MYmwt(rO*gWW`BE~WOeZVNrlzfx z=Ue*gf1H=qHdJ9@Vyn26m8WY5TgFUnf8*AF!^`4prK$P7{bjAF%*|BmVk*BleiCT1~I5$7hzrnliC0!^~VhHCu1xChYZeZho3q7hE>4;^{{@wm4$bA}M&rQV%Cz?8 zB!p|PD9-AgA7y0+?NVNv-l!xhjp>byk(1{Yd+qgKzJ)wVrfE6f+n>eABGf<0?b zy!8oQW~3@BDJ>hHgSDrrrPn6J>fz1zSy^jIT-t9H@;Ou7*xDYT22?QtHsGBmuHj7m1cYLj>gNHn%S_g{9{%R9^D5k$%Ezkej6AG%g$cDW!rcDIxE{K=ZscybEeZJT`&z6S)*qF{t&(3en z=9x_q#ss}ToDd_P-Wxv>px8-c!Qa7&MXZ0#=c`q+1@r7!B^KiDbY0ByB!KJ^#%QE@6 zVz%0|3v$AV7ps{$YklMLzvN}c^!l9pM5D@ZdX zESc$9X*&HT=LN<2_I!OKlh#^}w79Uck*QUe%{LENy~5_<^5jypx*^Q&FBdk{&1G?~ za5KisB)gt1E~wdND_h>E%7v^jKlR3+VrBVOV|p!-kGHJ!fmWEv%;)9{*3IAMWqWN9 zsdQjf*2R^>$=PB{JuF}O6<$`{%azynC(<>ou&B0E$#p5&di_(ZESt#Xx6Djan8?J} zS67!3rTMAcwSU9PGW*)zrlBnCP0lW@EXmFGmZhz|{zhlI|?zC${n% zjoOtRR%TffnZuQ(LVmI_6*u)(NkM$~_5bk)ujsFptmV>V-ci!I6$ge}XRdxGl;&n>Eq9pN%N!n<3paj^)mx8?N-du)<@c19ASDv(Q-+#+0~Kv}CQ+DoFC1yq~Fpn3Fb(^M$$MQcl>PU6K>&`73{m)k`*(+VXM(zR2Z? zrf6-<9@G^5I$zewm9@p(S|Yt+XST}o*_BOIPFh!&c|CQ0R$XmXSJX;VnwYjWmCek| zl^WYtNcb z8Cxq#N^K;j7B2JSVWC)Ut(8~SW*0ZMmY1?CQz_l4U7cX{780VA%ugRWh5gdx+Tz;& z9k9uTh&7AORU8PhO@hY_?a6 zs|{tXx+hj=j6`Fpd6P4&iMfNEl3(4@CN}1@rP=I8vfjwu_$;fZJE^2(*WxY3v}%c3 zLfW?*GuM8Dm#vux&Gl7zwz?5dmZp;8e7c^znqp;YV?8^Yn_k>6Y%C-uiZyIq!+wMB zb~Udi#YUn$nO$42&!ub0wpuD({hz2_@o;PNu+eBuW}A)axwJG_O()kHHyKkZwsZSU zVOp5i>-J(opGaqNNyof=oz*+A4hk7NH8)kN)rHN3ZP^R!sheZGY-2$LKt#q&9i%tZ z^)=O4nJ&Hg9bPs!*Em?5-q_nJtXR22$;_xZ<&7WbWxc}TZrQA?<)jMnb}coxwpyPN zRu_#{O_{p-_gGnz*^c5{Gve%=F|~ELDaa)qM!>T^Dw2-T$?EU)9 zCM#>qt*tFK^rfVt&8Lcs6B|qO>kF5EfR)wFcr{Z!T$$ghE8<(aoU3>P{ zuipNvx7Kd_l}l4sw+6axe)Ho`_n_SQnfLXAFjcI_7t(Xp>atUQVgAcO?@dlv&Ald^mSEEn;nR5tO-qe3Z9~_`jG{1MkQIh7Zg?>{KM_uw zU(TFIJIe!qQap)lq0oB!tupO*3aZE~6wm0yF5I6vwwY}-;fUhLR1PglD z5r>VyJ_O=14JfrlHKCJ-VY!vxg=44J!S}=U=tW`edrw3>w*iVAq!+O65ZWEHgV&r= zh1tjHo%~JSgWTu<{g&&g=5-KNjC`4yvbdu#>uTPO+2WALY267skKs4gjVG-H^8H0j{?i6^+MgN&IX%_XdsN7fQiwL+H*a9NpX01b0 zG*a=rnT9~0StuKpP!8Z~E+PW%Y!;TYL=y|oKS*02)B4*Sf3op(7i9hU@6*l6^7`7O zkl09Vr6Drb7Mhx)p3%<*&J*Nj&p|(Er*cOXz6arbQep|aUC&QArMG#2vFj{~pq7$R zZj+-fd|c}l<_TMmm|$B){t-OkVUV!gL#$vyK|vkwp&X%(bk%159V`;S^~f0=?ZkTs zzZ?CBJ$`qWbrNw3Ks*b&0*_(tp@WR=G`{|wL7yK!B)i~eKJ%GK3eE$O*rP}sPVhCD z5W{iNp?A~cb94gK5fH)SsZK#1@)mGw9UVBG0s)f@y$c)uF5cp~6A;#@04PxELU+f7 zP`Y?F;4acr9nP;qR6+I)pA&b#)-}fpl6P#m0bt!P7V%6zmRa&gdXWA-eDVH2UAUEtZ+Sc@&w2oou%Pw4?7#@t`HIbN`s|{*Ggq%dF!oVuR*5eS20&&4$+XeW2 zI6>jYeiT@d$w?yOqv4#;6Fni+L>~YJKg@>ttx>F?7!5%>Vx@%vatH042fH8wSz+wl z_FfH0BFCNm6@K<>6Dy6vW^qrdq^GiL4S?Jp&L3PXlE~T69nW(1)9fCX1MUb>2M^ZP z##FhlztNAio|Zw@uYF1{q_kFEKisd)q_R>q-AFF9(}sHXJrJxV&(utAm#%BwK0qk| zf^ul znep+ZdM;&Es?HPwxt9=%wL7-Ma=z^BEG{k`$!?7A z&XL?0IbJB03;H_(tw`z1ZqF7fKlGYa` zK`Bxe!B2=TS{>pDA`Dzflx3agP)cs25LGBTmuD-bm(@A}mq<*(5WQ3X@slU07*2>q znc=~-;V=h$1rmmaX~ZzA+&z|qExAb--wRW1m`04!szYXGnUrYN0`viEuVw5~H2VX1 zSHkfa$S1gv1=yaaOvPSy{omuw8dErsqSVWLNpJe#Qq%^}C@~C-MvUFWe2_;+r#xcN zxS5c|dg}F@eC|1#nopWx8nJFiYd`X%2Q8VuI=^LmIhlrO#LB~LweD7<<>Bo$r0C}E zw;qGq0oyop{&DPZPf>nCt8c%GX~f{;U2Jhd3Ynis-rLoMJwP!aVJ;M; zXzB3?g0DdR20$C=69wnfzqV7iYWXS!BDxBgP&OVCgn&2Vib!_oQi(({I9^C%Bvy>O z7H=zKz!`hw5zdzfJz6dq2l-O7#1yfS`y}u=5O?hQ+W4?e*Z zon?!i#e~9GS9HqQ1gfTZ!}Y%tVyKK2J@P0vCc>P?K8G6XASx$w(2I0bd=%9mi7ahv2`|R=g|1MvfxpecN;MeeHNP!^*h7=f5U_c6dd*s>olQwPk)4!Y=AHPo8 zG&z=$fncu?5^u)TW4ekEWDVf`jvz~BR5wLc6OCxpR7Jtc2&$rhRcD;2VTz96#EcGY z+6=S6L#`U*w)mO%lS>on^fYpW)T;*MsK+C?d_y)F@k>Y?fdIxN6BI+P;dyL(=dPot zef$Dfw}vA!5D!arrf(Zrs%P)#?eTl%-0GTXOREdDTp}Sgv)18SQq%9jQVjuc{2tfB zrlyUmq8`cVTOq2Nm1hoIB~&CiV(aS zMyWb}FF5+Wl!TNgA%-UM<^77qlqQ(x@q1MB-rEpGya`KaGjm2;Y_BQGWGbIsIBf6d z7E1nvkuoqmT`-K&OyU2E;-+^1P$kge4X7wd_T))lJl_T{s|0{Gc_Na)pu}@Vz+&V% zT97cwu2ZDlp$|NJ1QURP^hTmmAf5*8uoM(%=J@O)&_8v!8@O$Ap_={1>Z7LK^U3ZG z{o;uJr7lSrd&`q?hx+OZ)K`D_*XT&kT;FWV_m=jx*fF`jzxlCepTa41`{Ad)U2<(c z0^M^2WSPlCGlC&1C)s?G&V<#NAXCa%%>jDI#O!neSoU3q5c~Gx4#3t6FAXTyM@UBd~NeH&3bpS9`!PyFzT#UkAN2A^Pip>fwVYgnaSwJ-Vmgdlb1x z3I&w#fARSk&4PDapE42RJ?IwP1Kqb3;Z1`aFYG#xI=w0TBoG4J`#+zGz8oPkd&2$y zwZD7m+JBB;!=Dce1-_Ae_JedGiGA{0kH^PfqYH^Bsko4sl40sdg{vA!Xq6F!n4-m^ zx^3&05ChbiW$A`u$3$B;ROC4~q8ZUdw5YD(7gVOuT2*#;Jk4s=~XAHn0f*;p+20rWu86U%rT!fJ7al$P0q)83m+rVy zon*<5phaz6v~AIfnS*Zi4&B4hljqg*6lgkP9VI2P@b(`*LKbzac^hd|IFi`?);tIAdGi|TmsIP-wO^p zU+U0S(TOoMW)6*+FSRi<9CPJHR-I|zBGQO~eLkcd3|-q3PD!Vmc+GC0^do9ZIs0rk3#e!pDXWgfVM%rV^w>FO8Fh+YRaISoh*}v7kYh~ za9-*4{7v)@e26jGviGYH9K~MMO;fL7CAz)+SwB!2+R`ViIZuxC0>9`L_zrmuyT-(0 zsE@=lh5RirMG)3MdXhFyi@xT6S(0~b0so^6iYJ=?@iZPgmHA(kVe99b;K2N^tDgN| z9*fDcrs$omb=(R1+5e+sqNev09%VVY^@+FpOOJHnW%1G-4#pp>K?4GBU*$(&&;Z~< zDV`|o#}`Z~nck}A4=VNo>2$aSs>`6U%|g9GEaXEk6H(?IZdW>kfrA#*ak@QE54$N^ z%BJiXa|aD)Z=toM*5dp7rauX%*1v6!be@LbfZoY9@SM5lpU8ytKRMXJ$Qs9?L;t!!7opS9{pN)8ksT&|x{G*Xzq=pPD_+%^t5k&Ebg`xajII|jH~b{Wt>G!mOzw@(vxQ+@`+vf6<=U-#oa%TG{&h&=U2foABabQFsqJi!P-g3w?Q9q81%7_%*$;8s^RLLR?Kx(}WW_ct+jgv& zfL~EXwqr=;ikYeJ9!{XG)Nf3EDskdaFM%pa=S?4ei)B&%c;&x$ZavsLdvX$~m#m}ZI z*m+p(48M{EN(8%Op7t&64ZtRM?+pNedAozQ*NHnM*vIhf;CWd&l5-y5#FZAd_K|#? z?DatXZ2+DJxntR;ruXz>Aq*u1oPk`>!8$l|2;K?1Fo#<1<{iN!oF5Sfxlbu#3FO#t zH~rhNiF(yTtfjjyC2|ewLQP}a=sQcU>l}cJb%z=vygoR)092B39pWOybi5>)z^W!x z<8C9e|8U5d{RK`Mu&E&5@A4Fxw_Q#5RH%S>VbI|xNCWIXw8R*pp9U~fV>ydE*;}Zh z+qH74X#!BS(e(KvH&L9}cVhVHA<^m~unc|sG}o>BWWa*rX?jmGMVp#pm{9>)5DcV+ zP&7?aGPZsEoiG&G<~n_L_ln1}_q7LWsi!OoAIQTEKMv<&J+%v%<^12+e**(w<&yx0vRt|`b3-V|5sl7txK=} z{FT3ie}+G=0tNnj``M@YF8%ATdEv$)?2A#+iAHq^aP^sUUAtbsU8)Pk&DN~mDCM%{ z(sDwdPP7W8)JJ8P{)wN+Kl`IJ;jvGC^GDrq4#TiSJLAMmRTH8X4yOU{*~~7@)ZU)n z`U4H;cy1?qhyT>^j&9Gb58f#cegDM=HuTq(Ki_}`U6FPWPh?8begO@dF7y;abVc1- z=r4o(T>jY)bEVQ>@WNCf2xS~eCUsFp6BSv=#0<-f+P3V7D)7_6@C4D;m6&PSqM!g* z-H8Ff)IuWQm>}EYP^t8aE0rd8^9D<*Aao^FC>gaPCA9$%!9){xlrr+puz%Upxb3(( za6F)b(DQIdMy?*ag0w({TEIWD+!IkCy0T_NXae+H#O=nuGgSW!)jzME`X}sT$$EcW zmX}`p0UC{mgY7R~JFao z>`VZ(d*4;`9O?4go-W7Ly>PuZ)4Tv%5V>v4HvhMYz}76(Og7~eJ25ywvdxU-$g-@8 zI>H-GBT9frgKA{ZfqiGku# zdo*GVCCiqVEuG=1U!AenfQVBr5B_5J_FF-Z~5s_>Bnsi&-^>GIa?pXo1b z(RKG_^Z$o@*w-$w7{~i#^(NvkAv$Lal~a1n8Jjn*x~1h zXDJ&UdFc7|%YF|}c6L0Sx1-;**R`G=k6vHk^XNUt2ods)d^^<3K^z}X>)+8^RKnUH z+`psKy^;Aqp2`Ul51r@*+0za3VjM_Lx7Bl2MO%@qy^3Mf>KlcXia4{`PW$Z8M>Xt~ z>Z31mHR%G^82>9EN!J z07oI7_K%s<9E7Jo2gC3Sz0bgo6VN~Zc)g%kCm((;*p1vOVzW@E7lzRjY!h|{j5}y*e8>u>#>Mn(Ugj0%)j>?qt zEW3*YL9Co5_;?se0xgDMmK$PM+07LKS{1kXh+|l}vB+ezfjm#hL*;`BjgBHeXt_Q*3hZx6|1>&Ub!wpuqqh}~PIliK_tIdaz{Hth?xCwK`~KGBZR!CUo2 zsUvHnYSe(j#Is{}E(f45g;qVA3R=o_z&1IQkB}{LtZz^@yj!}LkvB2NE#=WsZ!u%X z=V}I0$Zn4W6|e#Q6@Fv@G^){2fT7n6nn!GWo+ZHDyjW1u17JK6)D*y;M7CZC5*GkU z2>gSx1K4pja1EYO>`3z^qsRf{GL>enk#qONaq~xv?X(+&%~*JI@U3y&mWcTKfo*oS z!0WVWf@R8A8O?o;K;$arN0B_6VHdDE*v$96u41`XcboNKKO+}Bc**y^@*T7ta|@3U z=f3cEgw`A0&PUA1LoYt^Xepn~H6o*?GsxA(V1in7mxD|;W13=AfD!XFGwrGmj&bTVU8AX`)mkGZYdB5hD=P*kSt@zPVpIcRH6^2LPF)PN<`N@O6MjEucU4D+4 zEYhSKkPTYM2UaP%EfYI;PumG_*==M_rIQO>iOCYViZ3|0N7{RlF93xNG60@EH*fSf zBaV5@7iJd{3rhxCMSgq6!PxmRfxYeSCj48j1Ktwpu-RU7hf8RBtqP+I?NEq9ZWlu| zp-et>l3+QMBfEJLDF`*3WGWJaXuPxwcJoDt&R|w^6rzQ9KqAE(`f0dlJDbZTWPYn) z1|P7M#7b>6jO1$#_c8uTwgB1rig}^A*dAf^v8ZSg4YS`1X%4+Z*{i{qp*tN|eZhhZ z`pUWF1fAeC?QAT3sGNW_c(5sKKrW~dM|8?Zb~Eit#e1e>Lo?PWhl`GIMXKz-fVL3L zOzYSK+t?*u*v1-wP-zFdw_~9l6-Q6I6h}vca~HGO-D6rHtz4d@qEdA?55j{eZMFeM zM*o!djdr8IAVngYasn6-29o z_VE}K&YAq@E?rn08b-sR4GyUw=olM_EU@MP)d-+wA{FfjI^7|5rrhZRwE`kEIN;COd z$z72FRoEhQ$3TBG0(s&oBa7ETTq~%H^bkfzed1)hOM~3r#;&HLJ=~8FJvM=6LQB>= zrGcUkR{PM(IaZNhSxy_-59AzCvQ$}COj(i?(=@G^K5%3|TTVNSyYHj~ieh?OYyj4%)8IluK$~&Ac<9yA!FZrDN$$f#R`Su?_KKfr71IW;h ztT`AsZs8}OJ+h|*HHZb-44;~HBkNH9ZkBA^kMtKM(eqI7zl%j>d`XLG)?Fz{i+6rm4NKme4^_+M4@6`rrQ<{{OYVcj?W)jbFo`Aq9pM7*b$Jfe!%%zEOYn z8SaVs?T@>jn3k-|8C7%))evMgDr+%WlU2)BOf?30U&+ZBvZUy`rRf0t1)`n^g|g`A zqNZpFZv@QV?k>(Qq)PH)Ek97q$PclEGJv<{hnNbUy!3oLIzK>%PGtkKdVNK&1T#RztL;YmeZLWZ%L6OeURZN96 zghO!7Avh;#rXsIYZkCyRt=@PL*>%Ve8f0l<<6x%QKwau7Ph1lL(~8sfbCpg^o9Al( zd{qjW;kb^FjAwN+W&;2JNAdr!dUlO5X7Pjeh-WQ%*=>HTqojjm)bXsgq&D*h4V9B; zOT(c07{;l9n8`cbR2wq-O)n)nae639B@@0NgFrByMwhv!GAt7h)J>Z#$Q1 zkhOqSHi&W1t8+^8AbWgp10kyx-t3(w!p_ry$^sjqcR+M7PkJOU60+7m+-5>HL?&7c zW+-I!i1G9^6|&NcFct>g>uWCbdU8gCA*+5$li{h1hOEJEvmyKPAzAo53l>|Np5>4} zoNPLzr$BN#vN~*s$662Bo0lpL%>1RRQF5i3dAoBPg8LRF+iriy*LHK%5@JrsN zZ=&oUDdBXAlijrS+xmFo@>G1kn&L`e^B( z9y}g77M1nIU--Mdm*F2uhOVKrKXX}!huzTGA2RLG*`H+lp|gLNSM|`@-*u;dZ|Lm* zTtcUY&i>u*z;L$qu5lf@hoQ4SzZ(yo{fEx}FlBXW@}T+%;vYK|c_=!f#qZSP!E^e< zt;NFt&!EFYt-cyOlwE}W&g)oT?H%vK8FhE4d`it7i}nA|Ir|?I+}~UO6L__Iu73E& z|MScl7G6pf-ar5VeaSTt005L;7aRXieqsIm#k6DM{~7+@>;LEy{u}-bDKMnKkOD&r z3@PxTqrm@g{n_1*JzRP?`{^J1cRkEl(a5Nd9u*ATl1*E-&*c~W@?pkm6EpKOE35Mx z^KvQ~PnHVVWG*H5w-ydDV_ASKoGJ-V(ySaf_T$G-o{+Z_h{n-SeW1dU(=cqKVT_ZJ z7E#j_Kin`%)$w})22&&|K8os(L?)Z{H9!XD-3_56=Hd;zvM?#GYmHic>TqW5(4Vkw z%-D~bMa`cCmk^tbM3W*(zK~0;;V#Z%M+cR8j|*2VBFi@ zK8HWA>kY!L?5FVPWh=KgmKV8%gq!hnB(74Mz`W>@Bl;22HJ%pDi}lt=!g(=xUhJLE z8PSWq-IqN-ZdmYqU@zYF(?ff)=lvx{3!z zzrY8U!Qrtv@wN-sHUf$PP+sBv(uMNHUU;%5(Tm7|ZyfyN!q9WwIA44o@z@0-eZlwt z$5{OTrTt4+>-hD;e!kIu_HQ9b?e@b@efvE(NKMrY-H2vHQ_Wbqre<_N_zOZz(PB~E zwvjai;i;x&>4sv*L|ZnJ&V<#N$O1ELjPk*@CuXM;>Bl4Ws!=BF1%L+G2peSI0xop~ z4ygslYEV(FN$yoBOdM|HCuY)GW=*UtB@2^6q21n^qNf>h13hchvh|TiU;NU8kz$Mg z{dlBQ&!X~DJ$s*=v{G|xrFf#SA73z~WO}QbKd9IX4gbXGI%MG3gCk35h)r4P*)g8Oo>JTutE)x z*Exq%L0}0rM<0W?xQzn<5y&qn1Do%BfLfub5raZfl;~%DNV=|gl&14-z($P*+&%N406Pz#4t8??EgOzQ2n)s?&h~uF^V0Y(F9A?}!wA(^JVKTB#z%=O z4u;?z#PtnMBz{74O8?#oG3I{V>r5COrBeaOVSUa8Ru}l)%om{o&p8|~qob!jBp7%w zUjOhRB%1(3+e7y5JcrmpMbB~kSAK4N-aX{pV=c6L_^HT``_-waucKSB$ZmNx3}3H0l*a(rEL>doDTM@Q@cnmT-6tpVckJ}-TH zAfsVlN)2K(#0;L#Y}g^iQn&_*wvRouG2gg5fSnij7f4SH;5C!53>h1Mb`9VU(kEI# z^snvIty;cHQ4Nr)h|z~u7-&n-na+V@HG!Ks7Azi!c93&PBBNytsf@RkF)%eFkHl#7 zL64S8#zDT+EHQOlu&?Idl(bXr2AJYCZ1Ny1&PdDpX&aro5SdJ$`0OILj)gBK4sA#fx!SEpf1&yz80053fRZThz{vVg#d!ogt zF?s9iAL}oSGyDIIKXeKI4S$9d7*b$JfguHk6c|!qNP!^*K9Uspslu~+q@JDq^eFvmMzCD*lSclHgvN? zJ^S)G%1pPb%W5mVkyJ8`#Kg)%DZ943tos^%-{-@JWuBX(j4DJy_mglC%&J^i zD`e-E3rm&FTuWX^PsSH1D>L`f=(4%pn?Sf)zMQv^EDT8{U>;#fI7owMRggjoH%!aQ zmr0)&QRJwXG$*131}_&RsfCJY1R99?SO87vX3gQPAb)}Fwg41=JZ|OkyEbfn@1c8V zwu8Z_atvXH5C$&>!rM(ss`M3O9HTZR1q9o%1BW?CPmGtsH%W$ zc4SlSl%1By$zg0~haoHNEG{k`ad^RZq%%LCy9`c7wcBVN`O1*a3t7AuxzY(8eBz$zx zYn`%oO*)MR($O*GRpjDvV3)w(NQ{Va;_Wb@AWt1I{uq&rNR2v5COtS8bJ%8}FBnJ_ z216@#nf%7;5mHTKWUM*v-$Tu1c8&cCGI)BeQ4Vao<43ck1L7GCG>_ zI8K-)jE+8v#KIiu5z?U@Qh8nCUSjrcstV@QwSwanO1_*u85X<`a!#(kE$ zAuw(eq5gC?)j3SKY^>s7A-Zs4<;!#=u(JT+{){s-N{^1Z9q{M|Clyqsql_vuQa)@{ z9`iz$M&vIT(-oRo@W>Wc6mo8zDbR`@Eua zP-}b%aK9TCTdzHNEYL?OJRolddyPu!9#!XF2@i?(4vohhnm0K;mI{VKbK2Py+$%eK zPs`5hYY{aJJ2gB0jAJPr zec9)zr__Ge#t(WKp3{1DyG&D$rj9m` z+ELLsml6k;Y6zbY)5f?MI`e*VX(FATP99O__$B98>A>HuBZ7%sKm8b{bjisd#1pHf zy?s$B=~5+?-4}zX*P#LI7(LJhM~drFqWeh(Fgdljc-W||ZOn;_`7LST&{^A3C;A$| zhAJqg+hX!7(|)>CFndYN*ovb|(8xQ3a(#A*V>dg`xBi1o zmpZ&oKCkO!$0coesfR7&gSgatmum_$L3B&ffz6{_ckX+BJ6{YXD?vmUSnEBC45L&f z?{b3=sZ2f}efM*rPw&YUb;AOudT3$0^{`wM>sD}ev3@&2FykrIv0>$< ztGc>)eXQR#x5uu|j_YLIOhsX>Y{&3?Jskr=g1WkMZckFqh6hN>xASUeyT?K+)6>v; z(?lr@priF41>$WVH7y&bx_VpaZSwc&xna) z(ntwKUnD$ zpYzTicIxp_RmdXbdqSmO(u+13&OQS(U&E=wm=_t^_(KNTp^d-8Yhh^Pe;k$|FW$xv zV=hSoqzd9_3#TyeyT)WsX#}3*{|P*WV~zj7C~KDBl8JYXJlZAfMp>fBDj%yma+9@#}^Ed~@vC11MdA z1NhT#yZ+LWBr1kr$c6;Z7aiedQAM_6rkrt{n3{2PEvl=c;K-703yPqdFAEN!Q^^!t z%f)1CQC;59=Zocdu9=$m?+S1*tKoyEin=#n$(18!lTi91SpyDR*~sz~^U1v%6A02T zG6zH~xK#r_g`8^$%zH$o`f-3=?_Ua5cr?8x|YpNnx%xQWwgV5Yp&j!n`vRwy3DjM z_+Pr6n#nbt=@}zmSd|*7EoEY*65Id>Fv@_W9BwG^$>a29D}kupI7)2DKrCv;O+Z zUs`$z-CIqAG$Jl~3Xr-5jPPI&~Of@#;lbd_;KZsV<~}SGn(c z{CwFAJlZJ`$AsFvNHHgNrG+yI&}tFH*;dJ)cDo$=|Ji%9;7YPHJq*w5eG(%6w z9tTrkjj9@5bvyT^h9HHt(1oS36@Ws6gU%JW1>6O9!B$fe#hD>FG0o9XL5{m^4lOB0 z;~9nJ5G0Kqj*uf94l5Mi!f$riVTTnAJ=l+aari+G{{C}vyGvf&i=`S>onW)7aPP^J zC;vR>KmYlc?<)xG9ijNPfjXi66Tb72I_tLgZIxxVrGG==?bl*!OkImYC(py!D^v;OA46H!ed>sjsR?DDl|TWN z4!bz*mSL?ClJxDigkpvQ$oEz><{o&4PWT=d4fa>m#UTHjWV1Ly_=KU;ej@b+ZQ{v* zpFGURRHLWyY0)V3z>%;53$m8>WyNf$&iKV&O9yp+_96Tf)SFefLfj) z8FFO7SPXcWVja@Lew%q1a!lQJL|F*}+f-fMG*vzDJi6kfN`+|g3Fs;gLmlHDem?vh zWwl8a7mYJLTn-q`0{WRFO&mk#9{|4jZWvai@FIeM-(nxoKN6#)OSk~Fzb%PeG)#W1 zyo8u?5Wh4);S`4=WDAg&i}3V%tW3`*d)tQ3q*Mjq={_$!bnPl3P_qko+?ezNwMKCq zRo0N5&VBd1P_b64)C$5v1%->qD?@n*R{V!7!to*NBy0-}y5lzhQi=7*0|^O+_e%%j z_i35FcoV$BhL>w{s}~>j0sw>&sw&&Eid@e=DgapPL{Iew0Msl!N>Ydc097DalHZ8{ z03}0LE|C8Z{684r-R)`B+L{RbR$ z9#6M5+`^gzKKK!`(89AC9Bv~WL-{tbUNAAnENM=LhJagT^(%{ru(Nx8pUK9I&JyvZxe9B7?s2gu~bN^iL`kmqKgWJO||xI zY*Dz=RdPkqi$hBL?|&qm-KV|v;n#oqeu(5}g6z@>bey&EpK1WYPx1jpA{jQ2v2|aP zeN%xO)s;L?_iRg6ebqMu(E{-j>Yg;OWpACnafM8kF?U|k%$dsCT5;N{JymAbDtZtH zVLB4FawNY5&?bruTnXhRbL3}61QN>2&4m?vRo3UtV6s*mU$<+<>|Av!eqn7PNT|GF0+pA$;@S| zozS!zy9I7P_1f!+36dKDt=oGyW2(cD;%3w+tZ1Fw<@i6Ps7p$0R)1TFZ6{_JvZybx zGZZ)+y&^pJO_Y$ZQIegoOX2lO`GHVO)BeTQyl^)fDnL%E`^|b{jS%RG-T1|KKSAG8 z_+^K1?#gcqWVPV#vC+>Bl#ZsQ;?8bE7;*d&jEC{sk+B-SB+wFuc5bx-RyrI?zfE$E z((P;heZ-8s2f{DD`!h1h>5xLvladWTYqQFOAZbcWGMrLYZ#XzGyF@dp!=5hu;=6y$ zXCTx+n}T74#x6O0wNaO*)ancD5soOMJ~w_G{8hY%rFFbFJbC)~KNSIXcSgR`4_ z>ww++w(x!gJ2x@{JifY5Gk#=*O&^*nA)FTWT%6wUguYEjSHI+7%ZA&$L93g0CE!hh z3Umj*QqYW@hWVYDiNF=q7$(*hP*&)AXr*6#_a`_FS7MQbC+cqt?;*^GJGP6o{W#Xo z#Edi}MGLthL$L*z994u6qPXFGVT=HTLzRc{QXPpu;JRdMEqq+c3OTAU$&h>zfDMP3 zk_l08(&E8%C=2_*Kc+_ryA7Y0R>6L8&)+|}C$K9=a14z!4_*$&X@?SK?{XdlS{1y( zdu%4LZ#{Gjnyp6IjNg(?K)hKff(m;VTf@<$qL*kpSvRD2NcW`q5M9BiVfZ>Q`x2)| zGFGl7$LjSa%c)||!XFiagaGN`5njatWUm_vfTYr~nrT()QJaRE;+9SE9Cp&xeu)t1}pFfin zUaEFGY>&GnBf-813D7JhxUg_WCQ@OOFnk93Hxp1eOfD9#*CYint29Jv6l!|@JxHqw zQVy${wsrzwi^h?X$CJ>T6z$TeeZ|I2V0Z3bD|%UvV7@2Git2(cKzB4%)g8xiB}+H&-cte=>H7lDECeOhqMBzBm6JL{C{G>QjwWNcz`_TiRBWsKud6T^8_FuBIDM9 z|7UhR{cF0m`T9T2KL4}$|C|5G(3b`Lk^kfp$R&_VAeX?6l)y*TGm*#h{-_eh^DJL> zz$4*_fu-1i;fN-}d7|M54*112FYpzll*x$i1)^fvrlNwDOBW^C^G#ouJoARf^VW{F z((1f&I{rjiGi;+Y`*3f~p*kw6+Znx+$MaqkFd^AF#E90t!Y7I6Io0XKqxt#y#pdSH z>fuvU88%3dh00fRi!#1XzOnZJBb;L!TCr ze21y|{7WVJlAVZ=d=CGg4+tg%>gY6&Vm1c==_ry5Q|fOcjXkWm3lIE~`0J>HtHW`` ztFn@gFqWC9UXDmA$Qx;&T&m8kw`}vU--`+Ry)siVD?W$?oN+?1dc+5Ruyyt>_8e5` z{^-pxKeIjG^1S@an^K{>A(xchNuasSjw|bCqgJ0donAYQH+a%anD-;mcf&W>4!`H;aE}?lUb_!bZ2$> zWEn}qOEdDy_^f5m)x2>(e!cyd>JH*qfD0KF1_T}#I~T5?o|caD*}H9LJuR1i#_BdV z=l-8_&i_M4LvNhnj~DmzL;XzVYUK~CsPNwcx}gi!SP;m{8k9^R*{&mcp5`k?V2Q3B zAlDl_vyO`|^&3<8|LAa~?&*uio-$D%Q!7V?F+b5*jOSguS{d6f+RPAOy&@M>xffpb0PB9HzNpt%<_^`9%}0+;X4Yrc_O#~HKGywOZC$kv z0m^hdRh`ietE&f`FI4WbTgu=>x{$)J&w3-s1-;QQR;R+NM>W{1e0RS*@x+*L~GB$tZA7v}7Kbk$0 z=ny>d%l}Y{0RRHgmpy0)O?MSlJWq3|ZJMU#5S#-5ynFxv@f5!)I`#aDj&&aO<`t%h zf}>)c>`9iNl+crfQQ&S09nov#hp>&J&kcfK(f{^C;c*PJ?Bl46>>wN#hqK-|`ZAMl2>he}?#aRJWpwQFVKa zg$Eqsj8TO`!I-kd6Yt7x!$JGj!6dA0cf+Fmjv*uOi#-vg!r|f&Tn9T1c8@xN_Bki~ z?>W^kQgaqqp{hGO?}$h z>RmyhMvzvjiHxXx>vd?uBkAdug9XzwMKMq?9b5R;B>=keB7LN4hJZz^ZXWuh)+`s2 z6cBC!0d?WtaLqqx7I8ErMjC274C#dt(2DaEzCCEuVZdOywPKb0d_aT9i}d~d?GU@_ z;K(oEr!-#(mjliZKfrO@htRlDItZXw z|M)+%zcb8fdGmAU#Q$%-h5G;RzPQ7Gey3alxdd_v z-*0he-n<(9%>!p;XIej)3r-$y&TsgKQztWPNt`av>3MNEJqGB+&d=#t@vZ8dwX=6J zf4n|%x~uPKr|Zny&y%p)16-5M8ZWr3F}&&;Dkw`u(A_dH>4v}W9~SF4#oyz#oVJG$ zN~2i!8EQR39w-N*zze=7vNY-mg+awK(5HEly`6(mI+P)kba0qQZJjgii? zP6#VU@Y|7hHA?kCJux2+HOCi73W_=iN8s_{(?#?EmkN*JaM(k_d1lXx$?SQ>CS+EA z52jj%2f*x+-$VKTw{HELA^eyBe8wd3v!OGUhf@FI-wi{lhH0plscE9_x`v@!gHqnM z*dBQ(_2mnt=ColsZCFklMq#E;o0v8o^`7WLO3RZwRn$D22zuY6z&AoU&q6xdFb)#O zzWd;!Ek9=AX0m**jfyt?P%SjHEP|gVp^YCXO+efJROhkJrXJ}k$Y;}|&uPObGFB3R z3_z!-nvFF>`O?w@6;XWl-8TPjo2DeDX^MhuM4(3a?;9^M6YWb!8-}?0-Vqq$z!-oi za84aSSxtFXLd`D$0mTz)49m-AxQDa{aQX>sgazWph?0+XD@7Mj^}Gr{y!M{(m#GP_>3KY^T*94 zkV_z!zzdMTN7H9IkMjKyJZ)e2rLX*wg{Yp5_?_!2iU=N4+gAd~bR=0tHMD4n4yY^w z(QzzY1Maq>N~qsgBvrCyl=thRqO^G0ZeEmcrVe{zeEN8LY0s@~Oq?tpJ#~xgaaB$p z<$G~aK2yvt%}FZv$BU~c3ytyV!;QU)G1n-LPfpi@jrfJNNBMx63FK`=*J7xpuq+KY zf`H(wR~S%Vo$BMMl>_qHJ^m>xQNzdkl{!LtyY_y-*$0yAQnhL&U>975&$I3I zAI_a=*hz>n+Ye(lAT@JD#V{04@-@eB&WqXHlzMz^Wp3`YQCr)XQRa%9>g=h%wrPxI zYMeYWammO8BwMTO12!krg$j<)=W%gA4CZzk>zno2m9^Ou`)F!;ckk4g ziRa733w~^QQ0kA3*>9Kf^u5Dfa83ov^(qn`RmEhCizW@H*v*CKxM&aSJ zVUP)+P;r<(q_RYS*s}^ne1k{=XNg`o-6)PtubRP{Qkh?VIxaswIoX_`*2QwQiDEk* zeA%X3v0pgaE4wMSX6%GTx&<4FuetCNV1%kEs{v57MO#<&WV7tX5uLgZE2n&bSWm;= z-;P-u;8H-HtzUCNn6hnq&3zxL)o$K- zAl#u)KMVx^H-0~#aa>ZUrny&9Gc#PGmk}C;yr6V+8uT+T5sUS0O3EEwMR_UvjZs$A znpI@?#%;VV_M>7JG+Ej9T}zhTJ9zJjg&9E@n*~)9yO=O^rM@|rZNdD(gENC?vHb^M z4NpXY?0Ysj)l9_$)15Y`5@_+QI$pC*i_yrL@pfBDF7$>}l@`W{z)Z4dl@<-e> z54q<+096z_?8A{sK1+Z+-LQ~5p^ALw3=gbKW@aTjQRwTyUZpDPHW*J4XMv?fsZ3bn z+cv=@WVA-JG-m(3;bz_5L7D_G4aww-gZ*GCk2d-EGr|Pm2>=8Dpo&^+Uo8ewHvYdM zci%i!#oGMbf1bU2vi$!yzchsZ@}FD+xdd_vd{!m!(}OdM2kHOpAPmw=iZ4llsCpuz z@~ShiH=*Sqar1)oQ)TDT%uZ!zM%k>&{`lO^#9Z;wqu8UK2kBo_ke(fKGadd(klv|k zPuHIA%q%{guRPg3(q>o3C+D)^^>4;82+wuVxRat6VA%8_n0eW*S8L0U4^B54PmHC9 zjfck49wF268s#3bq0sn6(>q0vTq`~NZq$f6q-I?_Z>$fp_wfC*JLG#~u9{BgTQBe1 zK<>8z{BKHPE0bTT%?s2kG}!kmD!S{H^~t@`<|Ac74aTa|v%cnS z;%596bts#(w~Jm9FmU0iWHP>j_r#&m@P5*_xgMulBI5WN2azw1BWgAnc%FIkf-+BT zh)3xj0u2b_<0u-hS308t{u<7FASfcXzyST&NfBpU7F8gXhN2IA*+*m{Jjh1j5A+`Y z6X)45NZ&>Kp&@EZnheJQ!+S;)!=Ar2Oa#p>K?ER%A^>q?bl^Z`Jel#B_zevA>x#bw zyl7YVIl0Lb_eA1Wr_Xzz|6d#WCXp-rs&ZjPL2HZCaA8XdN8ZdX*w`zP()cfaj@A^yCj_sB5m=xNaKU@pp@qKq7m*AiX)l!J?= zqHRmaiuZ!7;G&^*Lq{Z9udep`^a#oU}3OtH|mT71exkK{twM7Bs#Sqm|7H6Eb)AGz)~@-EJz3h zah=TALJ%O*lK^DWMcY+Sp7C|ydtq#Jgvj510qIi#ia&0g$0I?ofLLt~OkTR#@klzr z;N-&2G022L*~mUC^B^|1TE*G-O8|#s)Cmq^b9+Lu0ZyZ%atn6?W6qEY!pO)f`Cn42 zV`St3QLlAftyDnFtRhx7EYsyT< z6+Hlq%gzT-yFEaMR!c^YmztJ3dtDvP0dkLGp#;tU{^Y{HphC|@6Mm+{L) zIR0J3_qj3L(-`g*{Wnx|JMay|vBUi2TWNm=n6&ff6eec<`=g$jp$-ukHUG*3ARKl7@7w3`$ z%j1tXHZ~4|;L(`rt&Z20s>@T;u_w5_)bORXw_<4yUT~w(8>RTgd9qwOlFRJ8tP8gFhX101Du!ehTVCz9 zOZ)D7Ui+5)H+?_Mhl_5(c;DEB5#}RZ&BJ^=iw;Y#C6L&4Bc?_d3?!zGdECpF^4ejt z$6mW0ZobqNEuOd@e!i`8hkFjKV~1YLjWZp6**o%8#39)p*oVe6$CesTpX?o|mDP!z zwFVOGPahpG#2Pc+`MPD@XU8Eg`kJpM4%v_U?b2aLxX?1in};D^Oc?T|wT0M;rB~$g z;`T>*t9%*j1D6kCdvFV4aMR=JEDx5A!Q71bLBEXBwO9I}-z$RObLU2B zr13FW0zj6~2T1^6+x1n)|0$ByE&flRXP^Hm|Nr${|6u4V|LvQJ z5QPNj%kNKxQONeXM4B-KA}{k5;xJPUy0cwtlnWw^++M_l7crO5&`M>Rrx zvq3l?CK?KhCym`o8RfektJ(z&0m8UIA5T#hqs$asQpMoKoWyQMZvDB(syrdI7br#K zk!nGu7|b5b0_YgT9^}{zmoNws&dSTo^D^_7DXrtemV{F|M!+((BYFY3V_!!k*9Ibx ztiVV*Cz8urCx_?Wkz7^QBQqLHN3CQG`7CIbg@Ioe6*F^+5$W%ISKX4@!# z^3K^e$wqnj^?w0iNCq(s-q65SeNAyZRaZUxQkjZ3uX=GsDL&m9I|-cAlC|kQTs@qr zX-CJ|j{G|a_mF`>NqR^EL4iJ!q3c!OE!z9VQzU{Q`G-=Ch#InFBiAQPHVQpVlr&za z5aN4*@E$WMc)H0zYNy`ZgoydaNAYE0{Bz`=E008_imoY^oZ7C(4xm zRIUS?gt^M_l%Y93H1sP!VfcST?+v}B;*ZPx{CMZ=uX7vu?-oNFSwhmitSgSLSdODf zNNxZ zM{Hg?O<+c28p>qk13%iaYjxz(9{K)WK@e83CGd6t+(2?{+(z(W*Pj4sni?Y4wr;aE zN?B1zpl#sNF~(XV=}`+1$a18fxDN~ixIY*W&&ER+zLzJ&<_WP3$f@xeN{CI?BvvEg zvu7;F_p#=LWJS?pW0|pO|4*`rX<^k+VO2at(js&D$Vo=0&N5OFWTRGC+aL+cTHFQX z=FmRedgGMKDY<1GBVwI}9wx>hC+W|hspMeVDkB-E&0UqcmX<$_GkL6V^d6&@PJe-W z_+|9BRi0xx$C1l{GBwddoS{kkf5WfBMCcw5i|+GyRcsjVn#r>Siyk*zHkbWKw(k~3)(B$(9QOl?zAH^1m-o7z8` zIr}y@wLkv)=;&JnJ1Pght|^M+>z*bDS`fIlXv>}{d%j}Ws;l^c3>(~rapTLHjy6R7r%oSEFzZZoy7D#e!hsxz~2 z5}=S`vp#7ouT_d`#j%6+y{RWtlkUN4d^T!Nv0VXP8K~1>sG+i{(mZJT4JtxVP*-sZ zT-O>=b%Yk$4pD9})(&`WY4`B#=FTnv7Vj~CEfi`Q$06H=ekJ8f1{x`J8=--^k3N`A zM(!!DJGn>oN%x^fYhHxA7?4QaG9v3;*o%AAHV#(|-NYKn{W5efII;=d7XM|GMSOA017oPh2z5AMK2* z6XnK+y=2DV5iCx5uRk1%%cg}*d0x>cOV5&p6Q9nTm3~6qBBz5G&<qigwMo@Zuwb*apQD@fK|nU3{3v#-EsfF zH}vsuK`Z|D+t%Y*b+-0o>9Ms`nXk`ShPAZtu)KFMt@sEiWT=L<;nTVegfvu~$Gp7~ zYRJ7}-GwG=FlBH%{NkE77V&uIhJUd4O5=PVw(-qeg-QPlP3h7mtCKR#hFVSaS{dmKZi zC_b+VWD5#LHK5RNK?3KbcqR_tzG6CtMbH$s;c4!<9)&1VD9#e-1HFi5444FZN2{aJ zQVsX>?~vzU(CMTbVy0mK>c=NEo%XDU@|ap$^=91K<0)f)s;tPRPtBuv7Q*Cjy z=qye`9mfZ`*1Uj_6fIjwuYY_@LVDMlTU}pil=Z2JT6M{kjWyNP)F&6T#@Ze2+@W44 zmplX`n~7f!QXxyGr}B}_D^NX(1-2|DbFQp>d_;@zee3B)W!Lf>Zf&JeT$(vKUS2$& zm_3f?O1$VUu?Tff2a9W94a1pWM6m{)Vm5uDl z`l}x|Xw9x$j~9-ug@dOkLZ7!5HyY-=e!6(D7)y0v#l~ItZUxR5BCn|7FjFcv8j%CV z_TcSr6ze{R5A&L}=$jfmIqayTi}yq*ep=IMRi@)Z@v79BsAii{s~^{C!Yx^<{&eBV z>On9*d#Ww02XnQlgNcQuSTt9$j#ULbNWP;5nj@>KV%xT;8pd@@I3~X9opPifbt_9h zQvCmoq5oy*EC2VK-~Xb9f4mw$zxU23Lzpf<{+rh9Y_Yt&ymGu*oU@)TKXf*0yYh)1 zPnUsK5{~7RJi?(k*hXL3htHALO0i7&sCEOE1KaLVk;ZLw%EX|pQDK%r9dd_R73@}QZNjgyiYObd(ZXi? zex2DcxZ65VWF9X325 z=deNHPHwY?^H+nMCL<%P?fv`rskd)@;~T;XLS};WKzIy4F9yyB7I%`2HPJh)HXKd6 zx+>z~axF!g3M1{}(`air=6Mhp#_qs9BM>MTfx^(`rkZ&3pub zwziI8{NiW7OG7}0&=|`QihB-^NnEwFL9r7jMx}^tZysS$xW}U0YZeq`C3zI3#OsFI zY&i{_;~X&bz)%%ObPQ8fJJ;rgTMws9{mc#X4TGNe;Fs;S>i(qlz*`;U?Tn|u^m?@Tt*Utbq z=oA2(11Bi5KJW``!!iX7Eoy`#7AWHBV%(0YDmW=iO&6eB{6No9^H>X96PE3=1w>t@ zzJ1U#uK32uO+6nv3bzS6_KHD(7*iSA(eWF|GUCCf)(48Dkh)Ja^2hbaT%t_?FisCb z&DsemwMv40pE z)PQ9|4TO5BXV)x)5l_M1QtP8K^*=H)5hGR63xmRDVogN;K8dmIh0tv9d;|%>#^!tX z=rkQ)N#F6;%?{e^DcI}n2F-yl2Gl2xtLl#8>89qGs!pc}!&l_AC}_N+{v zTV*z{_$LIBYiKklzab>@X%oU$naMNmqqWcbe1U}hwRe>k*jBj&@x|ScLo?NJq^*)R z7gSf0VrHqUABZ3SO{l9sc*|Pc8{b_h)ymDsGc$)fr#lOQ(>MfOYPupV_G|SwU6|jj-hUNe@>5O9&$nA?RA6wxD)U{U<-?}DS^-)h%mp5vUbLJ0 zG~q@@zzNH&k-dS{sjR}3ljc!v1@1QSqrMGkiKpyCFs4P#2GaJLM@OX&EBPsF- zO10_WWal>6>g$jS?#CkZ;r$TB4{ErWgv{i~6$e=eP#dADK<`-K{8ps2_|x8vzGe1W z^zA#*MRbGYDr}$Vj~gCX(IIeSbSCMWfPYg&|$IIIE8+j33Sv%uu*7@9Wdn&#O} zp&Z$>Ax8>!L;Oig1NM@!xbSeP7D;n@ag<|~eLXWh!p`4;?>_D*wlI>bFS=%p%r*Nv zzx?rYtl1yDZ%xVT_SELeX=SNquRNVEuDBZ$8|#Cv*_1oFJ-!341z_zw$3OrWr)Syp zOe;9oU(>E~x%7{aeOIHI2d^{OPJC>aPNlY6sd(EGn~?3FlF>^lv9)R2rF4*LX}}jA z`ij!z@J!yebFvK=F!0kGyEUKUOfA<)Sgb7{P$w-PC~dc;qeS|#qNKYnH;dGGOMmKx zriBPv!A!pjo&Ucu^s}KafB2;@zV*+(@bl08>o;D}3*_%HfI(_5+y7k{&pF7}t z)1Q0^6Y_U7YjMX|Tpura3zL(zJ#V#HDnIfK_u26GzWvD;sKp)Y;X`+7N^2}sc9*S_ z@!7}n+{ux7!9zT49Fh9z^z-vLTF>kvoThr^6+xYm+q=m@p*tgQP?KQ^lYAvHD5aq5 zYUWNo^2z5R!XG`i)*F+R<;nR;@9EN*UiHhtP9 zvdl3XC;0LX@U)R*hS!1p=f3bBx9PDBm+>8TaSVW8pg|X7#J^}DbcBGtLLVl3Hy$8-B32|3 zJ`1KWj0ti@8Fc5Y7D+&=yU^&a^Z@(?ky%9c3~l2mW2>WYjxPky4!t*=F<@Cm$pC1~ zGoQo4Y`i?bTyN5_TsVAemjplHwl2vCns}-#n}MfVvJ1bfj1BD^KY#na!DJ1x``R`{ z1BJ`q#8#OE#XcrU;&UTX_3Q$C(0btrlWcrJq>s7!W=$`ojImmk%+>n6l}|oL3h#Yu zeN3&oo59M`;`)>Ir6X&6(KZk4c(q=IliRfeI9MQNC(u>b)=a~bf^!`$7m2D!^0kLm zl!BHWFaB-)lQ$vO?|;pbr{ukvwUXg4O(`>hv2d{T#9eqAi*+DpFc#st`^bKUc?MXz zEM<`$?Gmm*9n=BX9mc2xicSYQKOCgKgccx}YNXM^BSNjQn6}DOP)Ycvf_&Qu4}n+u z)rAlBg7~3u*QTAxZoJL(5@`~aL4agixLsI62q~HH_VjgF7Ko8S2ke4ZDpWn}cI2Mz z;TzPiCh8*>G%GuZ{g*#^18?rP=dHEM{6Xb()~YXVP9Li$wbR3t@bsq5 zD`?@cfCXW7s!gl;`$!iI1ZIOWkub%ZsMSP#aXt+$y@HswDi=^4khQ6QZ~2qgNlnZn zuH#LpE8{!IV=LOpqhMoov7uVYe7*`baWP~5B5DGnyWU6`q-yj?)LQ=JH7-@Re0*q~ zG!G}#vDtOguTLI6w&t%kq^)Qwas*Hg>!_A0+JPmS&iP)ci%1oU;o7CD>Y1MHAN<-U zw;2vC;FSMRK(vXE^%8} z#{Yr$PueaqtL$nptMBZ>VL=Kfx~Z ztBoRb=1c_#IHt)pA@HfrI_jUPaYX)@JvHzUy5Ur}4ZLLpki%_3S%$F-n-fxi2P%wM zHjwm8dkS|AEw^07{8M@~{=Y*6`G&$N(sbCEg0 z>L;ZtQo&2rN)1l;lahl{|9isJ0Xh3n(odW3H-t$RGzh=mDlfxi44dA)vwR0m9BMQb z3TUewJs6rz9o$t$*n7DL8HFvGc(!V|0UY_rH$!i9ue;H8_k`uxF%&hrkjW_(WGizo zq4WQ(FE0<_zx*ecKrVq?0=Wco3FH#UC6G%Xmq0FoTml11;0GgTV}y<&eeI)LA!)a- zo4V|4vg-K0BKqo}Kwt>h?E_~I1UnI?{p$PgBg>>-waddGrQbtl1koDfL&87CA^j=x zKj@oUli-%|UH9TVY8@X4*$wDcbYYaTNH=YdZ~HGLdJ7&kslj>`A25Q6xfX(J*@Pdh zmm`fKT1NsNC3tT*4;l!ul}4xGYQk^D`u0AO`bJl4P5v7~o_?*?tRhn>ZUeOL1d>J& zl?S5rfK@n&+mdQaw$q*98UQ>}H~4>68@2g38_R~B|8M>GL-;TMdATL8dHP{rGVzz7E^3LG$H3y6T=U(@d|&yTIHPAzvR;`p0OXk*k{ z)`uT_fTG9**|=0^pT)TLlj~0(IWzjvytgv3u(Dc~O=oFlE=IZG;Sc;8*3pjUutcnI z70&JikpD`UKbe|=pwDBg++0|(S7m+P3?^&E@pZdq%+6J(;unUEww8KbTf+%h-OU7$ z+!~GuQ^TRRZ2-*i->^&7Zd#oH$cU-)JfS^Rj%OXYJSF=qo8$4 zXdk2~39p>uGkG7^4;~n$p#Z)P!3>r;bFKJ+5tK`eAjr#|TH;12I8k2ljF1b3MRr~JCbxi z2=pO)9>_&M>D#of);r(ixgAtR^)2z6@1}nHX1(E|hi~;`lU|bbk=d1*;>~f+UJTAz zqIPfQHV8$9qc+lqaP;b0PW*ChS@_otp$&i#koxbfnqH@_v>= zm+7wPl6ZaOmcb|SKjB2_8Hk60-(+wDm^9C}hDpzD4L=aJFp7pv3YR5gd5DXLu(r{D zbJg3>V0;7WME^&w;1YWNK9;a~^r4l283iun!${N7Cer;p8 zRtGpos`->W;DA^ZRb|^1B}q}TJmAQN?gYSPS8AJc*&gs8pPo(7q@VcZzlTZx8lkxx zn(JyZ@Y_M0WU4j_83&v6EpF3!7&iNbZDv<(Z_mvk<+Uwth0iYUD22V2iCi{(6~srE zs+0G5rKd;&8-r9XqqLPa?eH5>lEe^{&|XY(Ga`%p*ShMvXX%E82RgzqWf zLp2u)qm^i&s>-+B-GcBwYR1S*glZ5J7(^XVOTy?v9xv$?r0-J7?oo(Rk%iuc+~cT& z?)Y6f&rQyA!`+lG8P5$vJV^YjSqtEt>5o;&h+8GUZ8 z0gvUmr&lLmTq7e9xXWr>g{ifT;2vA$or}K^!opDDD0dl?vjHbusuzv?-3;W5iblD9 z;H6*iLjZY&;QLV67=F_-5~eq3v{Hs%q2d6hR47j!l>yO{l2DVLT541I5Mxn<#i{Hq zB%_F=(Na1}Hwvpq8Hx+6Ko_t$97Y;-Rs>&53IFFIMPHk#gs>t@3rP;rsaU%%ZwI#M z*n}u?E^DNv6PQexF4CJdQjx95L`zsBH3L^O+DN$|s|rA(T6=3TEX&RP{pVdy{{~9@ zGs6G6w)usBnQi^>`2U{{-TKqd?y=|QKl#tr&Zc;1|3CYUFto2YwrQxED+Y?A1eSg& z8};Ue_T}c2+UESu-2C`V&3+inOqS~n*U668y{C}u(r_tomb4l#&go?YxK^A@&KT``;hROVveC~-8(5B%ruwBP8K#- zkDZI=0lY}lip9NAkQtdAu|<(O`lO93Rz!F)>xx~PVP0h$SZsjVCRQ|_0cO*jIYMi`*em7BVVQQwY%ZQKLz9K2A?fbeV z29hMZnq}BNc<6jLF!FGrv+tK8T8)YT5>7aWpH!L*edee}m}!K*9%aab1>QzgBN43y+;^|&OU(J$O9k1(apg>Ly$&b*9vykt~FS?TR||jU#E76 zL=bi}1rQq{dc8!xaj;1c%rxNOfGwnpQQK4(ZC4SGXmnk@063x}p=6g&IxeV`0X0cz zl~H2^2Cq4BGdl7ok593N#F}aq4S`XzpaWii2=6}@$&FL4b&(Wx$WF%hQ-bYy_V~i| z^W!$K(C&A`S&D88%)TOU;<{eW5i`YtnFMd>c{pk&JN(C^Z|_Eq-$5PY4~H@MyB>V} zEpsJ$09}luPssxS!D(cq{Q)|rP%?VF)U?!@*gBfC6%9D9I3PqE4E*^!xf0rM9>0WS znWPvKGFzu)ou*P~WjRd;s1Q)+TnZt?DHdv|oIJZ>W73dinwcsq2BxoiF4VuG`jTYo zuE#jw!VuAw+Oll1Y}?6XWkA`eGO-)moD%@kooW}DPC=lNP1X^<$Wqs(ufPn6uOMCn zv4H8(^%8o!+if@Ke&hRCK;eK|y2pLFIo{FL+XI>9ewNS&G0T5slwz@{qXTR}Ov}eO$DspQ@0MS)Y3O`JXFht~ywnwbCaO3m} z$&m`B$;dW={%65QIH>3jphW>HJ^rbP;=L|Cm+a$WsR_;iidx@=vab6OuvdRuK$c(S z2e6JN(jK5fpr(9`5&;VzSH(b!1Mi836>UU2Oy2(~!(A1|MwZG~D>X*OEeH6-*j8{jwQ_C>8$ zsTG8U3hWKoAmE-sy!}HqK|f?q6}E-VvEw(8jt*gCZ9!t3T!MaYL<3+D*pNMg5{G1J zK(5DaVwzt5PVm+WkOw_HQz*L?P;_zD;r5im66KL?hcoa1MSu6J`^`GuD6cXfe$YT& zIfTXsNv|`W{6y~>;`I}NH*OZ#Qw3c~g$ ztP~>-n66zgxk5C67Nin*@U1g&a8?dq#f!qt(H*j$KsA-sCjju)$+GI5002(g=>5bA07?8`Dk!F@ib}i?SZ8>nQBi3$ zFOsB%DEr?mAWygJ>0ef)%{QyP%0&k15_#xT9dp?I45R^K1|o5S!Du@9qI@IcA21 zSBl{HLzrw>-k?aNV+8C&SfNF@wCGq<0y8THeT5tL#G>oDYL|yHnlX1vzy5!C9wwWU! zIt!*xhhfG3&eQ682|TtB<>@Dt;^}g6?6I+vqTgdIHz`L!{GQ}fYk9XaHRm@QrDM}m zSH>1*W(bgpoDQRR`UV=hL+bh^@+-ixa5>LHi*JDe0rH(D#=?LMqeFZM4ajz@EMzEl zoX?yLUGo2F_Gp<(=GR{9eg41o`u{P6|MH()0=WcUB?)}|^|SYQuEIZh66Gq$#IOg( zH*o)1ijIG}I&u+Q%ke}-bsb$pl7ivds;cRlX8De-db&teCdgmVExqN8nU^-de7Oo> z65l}uerdWhm`64-elp5$5IlP5Abe7k%;94?A+pc;VD^i9^dW{6QMn@gL8$@Mh6RIA zGnxz;&yA!CL?kEfgM4DK7Xb>Pcmdo+=VbnyQB@ZsV4ZIP_AQQWIByZW+Ovh zO{>nNk;y{ar5r?}L#t(vig?e}?xPAHx?BObSx1jtd>FueTs|sr>1kK5J-N7uBH8wk zDTz9DHZ1ULB5Mx&NlK%(26}lFdNLKlr{OaV8Ww$pI+j0*NzBW55{pTjW%+~v0AWTT zi!Qg27gI_AW-!Z!ivr~oj)!Lgpsgre>XR*!m z61J&Zy1tAA10IjZ?+-$JJ3gZUZU>Th_HU5PBS{9E$2MNnHrsGOUW^18w$b7P?7R_u zJiqup-(x#3j4z6y^3r|0E8vddY}*cn3G(CAUG7J}vCHGmlDRV)&DQ98)@RrSjlM_I zxbwKpR+(+g+f}|(LnK>ewm-AnBDNu8@obe*Ap%^$_7S(s|j(-aVbN1j1RD2*8n32(*|ybI*~_{y8zj& zS4+_WO9lMunK6YV=x;2H$>rU;+}wC#1~uJTT3wfq?f8YY2kW{Y_$V7UWzY|B^lLpD z0%~mB0V{OJ|Qrc}ZXU$@?KXtfd6D z@2QsVxjv3V%Am@NovK*ob5s`bsS>;8=R590efiIKEvKd=`#nF@*SBBYLw$6(raBnB z>1DrOt-!Z(H>`sgy%gDs_382d(cZ1<+rH_Gj@A|ZnEVh%7x;g6rPT}lm<-*=J4?Is z6Qw0>aWdZL`%d=Q8Xmw&%rY$iz0uuj2w9$9q@S2UVYb>F7jqQ1xr!rrCOCgD<1F4P zUxBwcYiL*LG2SYF$}Z!!9G*)#jags7((2D`jMi`*pHI})-MGMl8ys1Smwl!@$h}?2 zu?Ke`A98$EmJ@j}FLK;n?DxgWXmdl88#!**>e%gQ+r^LE#gW|AlYBu}GDgO5|66>? zR{?6qytjSW;|~{iPBm@bIw~#At~CvH(~&nPtFg-NI7_GZJF316o=V`rzNj5 zyex-VAKU8XAkFyJm?_;ncl*WUZg=1Db3eiLr=6UK@G*e-h63Ck##v|mS?+Qhj@(HIg|=Vzh-m z2ms0Ixl;Z=I_PU+*9-vqym$Qn^`T!Hdh>sN?KS*0H1zkD&K7ux>c0ZM*%yco2^Fb< z?F6n7sJg0owq=0c!9+HLFKenJg8j=d6<9Iqay3$N4{2lJZ>B>G)ku%*=F@CRF?|3{-69{@ob*E^*@>q-TIm)+DL5jd_@a% z!yovC-!Qkn?&(S(1uCkf0~O45mZo9yLW}o+^XW|6+Nl86jl4NJFl2U%?w((!Ux}QQ zeYI8gn(iKbbeA`MM~IreExb!fP1WKKea)M(lqs(m1jvOZw3Jca3)1kYS#;J+8VpD> z_sTr;wK{dF><(MbH{T5zwTW5VuhqWAKA?ZFVy?E*EjTcIyEHm&@7G!N@ivisjjjTH z=N>W;w;7C0tyx8SecT2`kO^o@$TS0$tx58>r;3u}WqEZ~rF&VICTW|C*;@T4f9-6J z*7U?L|AU>d@I!S?&qNJ}qU)kA0iW_RN<1(8c=-xHP?Q1)3xN&nOsc$S z907ZZiX0etWTd+a!h5{3Bgw$!3Jl53yY_w%6@GA!Ygh%s6(DsQb(0`uCH*jch;D48 zm8VKbk_PNX_XMC)@iCPuc!IERj_bw#1Wo{Tm6urLB^IB75(_G>PL>E?4Om1wsMrDo zULE!cFSlrI7p+6ek>?AYil5s0!P&jS!8mWw|6?2C%}xu#2A~$-jMY&!5R0-;+j!xLNCn`cpRD#z9wh4ug-5 zDnnu^AOto|iCp_949~7irDUjVK)k@~s>ARGLXFI@PUt?}?w{Czd=%`Jgi^R4Nr4SA z9!a|D0mgXDy@!{duG$IlO*vpBX3e<;5U-3?`JEo{f2u5P`$`~N9*zj-=KrI0;vqUG z|6i3OYc_`elNsM1B-^lY$-mrw8-$DPRW*O` z=od~2qzNSTA@p&>-<@u%i{_LbSblTiNPl7~%dya}H*2I-p?BZ;SfycW!)W*FW9y3) zDEpfdaJz1QsSPl>;0m_Dq%&-*@!eC~V7w7_ZiVebWt(Br;f1%uq>J>Jk}a`)NU3cx zx%5gl#-zLSNZL2YR>{!z7=FSx$fOe-`;!!p{`bg!vpu@+lvpT(XM6C8&Kyq}o~LtN zPhEUZxF*y2)W!RB6?qP9m+C{wJl&}5T7JW=tu%^DGbhK(i^mhQ$FY*RSf0a$U&z(u zIrQUcx^$ugyhWMf%@ZA7Orpc9Z)dPm0$Cc!vyBn1$W*QXQlyMZ=Rq<;c}hX+hTVN< zr}To>b^~ne(Lt4M9bGqd4j-AHY3t8lu`_LtfPeQrAvw;)QU0q4_}_?ae4tQwrg)N- z{!M;3B&36HiQjxT^&5p!uyuZmZG1f_{)kk(k z)AwD`@B;^lYMK`ix`Hm-5-@!f%Qh8NlU!YtWDg~Ey5yNH32J$6!^@Z3@CX3asFe3z z@Z2H3SpncA=r4fK7Cr!eFx3@={_!)iLlO%s|g$EuBa9T5VyEya)s zuXTmo3kxoT3b6^29I)0XUQJx?TCI+cTXC+xXvIAk8DakZ`@#e* z_AoaIixEQ{zmHbsx4`O-2;n0+|Y|8~U3!jHzwG$-v%r zT1_N_o{SU+%1WR|!r>>69Nv+o90+!a=@=&SQ6V*o`$E(Y$#9*3`O88X;%$w2^b`G8 zJkxhwUojoSQhmp?4Nr4}-Us;3JX-buz(&LyLG~=E*mne`Y2OjJc%s*buf>9taF5a@ zQRyas-0kpjQ(fMV^=%Zy;N_aB3(mv;LxSYC?x=?Cl2a48p2+0fw#l!VxEzukPP9%O zM(4%<&CdA0h|kFP2-3}hXo-eSzjLz2{`vom0=PiBdPHW&r2nN9~94)UF}NudF)O}RowIiKPUer-Cr)?u9qn}8GUAY5dossllh|uvVAX7-tP-Yey;N)v zpgD}JhQIG07VEI&?jiSz=+!;gZ;fKzXZ-6NeVnLH@jaz(Q%{OeDwaVmTL&z;yIT<6 z2NXE}g!FFI0ktG81Xy2{nR@F)m3jngkjzJ>(nw23!=dJU6N@?sN8s_{(?#?Em!YOo zjDjJVnNdH+4%;tr%;fxf&74#YX6+}dR;| zPt*dBv#4exX>}oLVQ;IeqBh{t{?cD$E9#%DoGtQW@1Kr^i=F5hMA4TVN3}J>bI)7s zL7Q^OkG%}XoM+DB(1;8-m_bj#{7g2|QLP9bXgV8)u+Hto+92bG$ytgGDPm9t{dI^k z&C=yKqF>l)-|2Kt<=FS0J$wE zcVItbvw@LYv>iHDnNbg|ZIgc>y(4ffG&1r430o9nUX8O1wKh$4kL@g-8x9-+>`I1t z&+bFkAe~PDXOG+^#%ieGcS*xX;Vy-V5gsBY$d1NL48Lg^NxUOT8G9Mhf%!&8-64T( zWQ0E{?PN($^B_1cMn@Gc^;i_3?;zo^tuGlxBn^PyC(l4TW&+86FJ3nM%*L@vXu|i1 z*Q$yHedlO_=E$n5*tRXIhLM=xR~oP7U@v%p5rKyO_CTT2%#kLG_x#W)+pBt2rzKl+ zH{|)}-$9o1-Vx{L0|p+--g(7)c)YlXw7`D?R~tw?(bF?x48%)s6n*v^gS*G4aKX8? zVwIK(A+ce4@C0+r5|5Ux0P6Q}yj~%Bc_^!c!2}(^jzb6?(;YlNurd8`I1)jf-q~}> zJ}#D;B}V=!+y&|=PVbenSASbT8h+&n24UoYh;CkMmQy$71rWo}ao3tpJT$&H{NMwq zSRnO7dZDB$&QrJsX=tq@m^$`d7>#TR@Lhx>|MMrsXi(YYm#VNr_xVoZ+EwE4V;AsP zIjuap8%i%4*lR$)Bk+VXzVp;-m0CeqsNg2pP~a}aYX6YU%nw;7VOt0l9>=XRtwp|) zl6tF`ig1Kx%cT^1ivbAPQY}cE?T61m)!Cx}z!1%C!;%e+s2$FA0HAd;iF-Q$G)nI0 zuPiPAP$WL#haZRqU6%}tejo7s&+X6*vr^i8?UQV?lAZrw|HaVf|2h81e{u=r5_rWV z@PoCp6*@RdU;79ofVT+H!;%5g;aaw>D6XaH1IJ6@I^Kr@1B^~&Lwu^R&99JO8YV`B zHbCZ2xDhZ>kd1t` zJmPd@i5aTLCMOhG4mRDD@s;Y6iIRSxoSyE+j>eA4kXHz*=cW~D!e80L>l{(Puj&sE z%HvPgHw=@KCeT#$OR59z2;C} zuk>Q-mGUJAWkNW#HgW%AP2cn-2j4|!V2LlL3=e>Q4*uV*Tdxn{zt8H=AD^79ax?0` zxD_EDNje?Br`H*36Q6eJ+L%SwKhVA;#h-5eKkrRpUaiTq+ z+oQWL26Jd|vWCd%EW=9=qPu zj9gLF_2x#R+d9tleX&|x_=WK3%w<_E`tvzm8t(yqqf7;tpPydL`RSF}YoX|#4flj~ zcoF*>Lbey$-6;7c&+})6M%c7^=lLVRoJE1qU2i7w?I_-ZPvUi21@J66we@OJ>lkX)tCr|)*S(mKF^LJu=xLL-xzxH zf5ad8PcDH@3H;!%ovpz?f--}T{z?QU?yJ5Th?eVGo`|esfCr-D76rDp1$1#=l6_Or z5qpw6PX}Lwd{fE{HWyaxRau`mgUMQPeBG`Yvvbv{_^j6!j@TNWEtc+}uGIE~BL;;@ zWu?gQ1n569guN4rHc*)-k0J;w@UruEs2LKZqz$k86jau*j#Mw3)uo2nT2z-h7Estj z(xVo!H$HVADig(kP<@J;26W+j-`*O&)B#!2QI1DadM!Zhxut}wWY(BqTxO|O(Vihb=$rN*^D;E_VcrRUCxf1YU z_06yTVYV{=$-8Hd$&(4#|C6XR-c^0ww=B_D49&5f^H!?bwz69S!g*=@%U2_C(^Xhs z$BuesA36^~(0Y`o-0XsAf130JJwa3$oPr`zYK=8taVo z6mAxvcI=s?KYyk^XZPzspiK>zt3h0tJXSb*#Ent;mi~eYUdtH&R+&=+wiXJ9nBnLr zD$YhzIv`{nDSXS(4KFYxH*nR!@J&=As#G<6i8SG7w( z8YVr;vLk~VSM&|Z@@x%U&p;HBWXp6t(GM(;OL&1}`iA98sJ}N2RTDKsmVvnGo4P07 z^xBa%KPVrVbCb)Hb5r)oZguWtcg$FeUCkYNCVB0Ma8xAFOSqb%3TlQ)vQ>uAcv@a8 zwCD&px`2uV)I|_#MZ+#tyYb$VADi-fisi$K%MdlTiy+9QD^VboBKVqWcuyWzJiMu$ zWAo(k(&3XG?NR)~I)XLtQ4TlCly*^cUvJzK=Iz>^fK(}}jYw)SC@(JrY})sM{={3v zET_9T0OM-@DLM8mGtLMH6w!_!;qbAJnd{HcK=&5`LD5YSGGgCeDm0r_&NS~d4GPea`q&QQP;!Bm#)i(5%{9*D8B4V=aSgp zlo)l+YsfH^VoKD@)R-yf@fyM_*)KZY!ZfZ zZLCaskLriPlfy@2*4oC->F!3nkM$qpCckD98RC30{;><1SsuPgz9X_b0oY6wCW`iM zMWHa!WEh*j`h{%osJ&I7X? zyp9FFDOMA`+BCy+6a??4I$+%9q~SSfI4hcAFj*HOMC}>-&twq0j@W-ru!f-Ow}^Mm zuhqWw&3D6pBo;~z5(r?;93+tTikBWFFtK&}wS#&1pIgD_#Q$}D+W{tyL4Zr=$NzO5 z&C-y4_lBEwdj|;;&xVWTYO@hz{pqR|Wj@58NiqIE@c%U6nW9O$vzGh{o^g@T5VSHM zc76`8fC2o!9x0w96;aw_XJmJ{UHuySz*=iX!?(cH%=G(SI=!{g-_PX2$;wGb6@k zo)iDS^;&HR|K&fq1YUpy{=+YxeZXV7|1{$7b^t!@$&RNOw&RGBB?qpqS%zylKo?M5 zN7rnkGPG4y(=}o}vsF(QT`^E3Mb)iVn90?xQhTSL1be}b8Fx^-k1BlVas`R49g~ua4+FT5 z%SQz+J?-kJDi;@3vD==92`%w=0T2~;52kr~sZ;U!>TVNIDT&#h$T)nOcsir6a6LJU#Y z5z7v1%$XKM5xauobG87sX#s3wF>m8tZZiciDri)i&XzeofhvsZ*!hyV&y`;1mC036 zReZXWcLlm>I48G5k&lMUhu`OZ^c%ZA=`NXKqtT>}I^eyA_n}AV(KhZrZi8DeHM(8p z`V*4DM@(&QLr-oqJ&9$84>{|1`>RzeDLnx==o)v^7Y|nApE*h5D(B(zdH<}u z!aryI`>e74MJOXgu!_Y3T8t9&+%yuiC8g)BQ1!t1L+OCvr=hA7vYd)#8!n{?(23>0 zr8xkt=fnxvJN_@5%C>1rfH&(W{*TtlCeXY7-!KvEZ{z=yQ}KUGQACCC00!s(Q?zar zLVy%7jm_8pJUhdd;s3qy{|}RY+6Q4=%}^v;kyX+5 zG}kiy0LYfMuPKh^Sf*xpo-68sB+9z!dzP%auCAy)JW-CXiy&4r#2X%0TQ--iUFGnk zG<#I3OpQI%CyvYd<2X!{$JIcuTx+!+uB-Z0wtAs%Msc-ydDUDkmlnnXS*cc=)8)k*K3(xX=UyjHx=-Ki)0EAr@E7w%(Zq>-6YO_dw5fgyIuK)Tn3!on-WO z$=I4~WizSdv9%WzTYCj&VOD$%%eHHLjXuw|uYd2?&bF}A06h5*-wZ3*+M^feMLTXv zVXCn(CYN{Xa&zN}8Ps%VX?0ybwlg(ScSmsU)4y(?K3>R$Ig{jqq3h@%3z`9*xPHrJ zXY2OdjJ^}h)gPUx6>Ay>mHp%dC*||XWgp68YH8J*achsKjQOduBA1R2CgW)~Sh?(V zc@-FdH2ezmcT`{t*8=$#uB5^i$N9|H(51qby|)bQByIlH`E32f&i}W5KJ?~3{>XoB zm;`?C=xm$s9v|7^?xAYP>Juf|^G#ouJo7wi!ke;t

    IvfO=?A!Gw+*ip^(yA<5 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 z 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\yh5 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

    t*4&_`&apJQqwh9g7*RZBU-3jH-OQd*KJn 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

  2. TGpAy)dWlMAqf41-XcWXw4ZNr`IY~M^6{$-P+dD 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 z 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

diff --git a/astuner/backbone/common_warm_up.py b/astuner/backbone/common_warm_up.py index 1c75508e..c1b0ab10 100644 --- a/astuner/backbone/common_warm_up.py +++ b/astuner/backbone/common_warm_up.py @@ -12,6 +12,8 @@ def init_parallel_rollout_logger(experiment_name): "saved_experiments", experiment_name, datetime.now().strftime("%Y_%m_%d_%H_%M"), + # machine host name + os.uname().nodename, ) os.environ["BEST_LOGGER_PATH"] = final_log_path non_console_mods = ["rollout", "token_clip", "bad_case", "env_clip"] diff --git a/astuner/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py index 7a8cad9f..67b7ff52 100644 --- a/astuner/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -1,8 +1,10 @@ import asyncio import os +from typing import Dict import datasets import openai +import swanlab from loguru import logger from trinity.common.experience import Experience from trinity.common.models.model import ModelWrapper @@ -14,6 +16,8 @@ from trinity.buffer.reader import READER from trinity.buffer.reader.file_reader import TaskFileReader, _HFBatchReader from trinity.buffer.schema.formatter import FORMATTER + from trinity.utils.log import get_logger + from trinity.utils.monitor import MONITOR, Monitor logger.success("[New Trinity] Trinity imports successful.") except ImportError: @@ -262,3 +266,124 @@ def read(self, batch_size: Optional[int] = None) -> List: except Exception: pass + + +@MONITOR.register_module("swanlab") +class SwanlabMonitor(Monitor): + """Monitor with SwanLab. + + This monitor integrates with SwanLab (https://swanlab.cn/) to track experiments. + + Supported monitor_args in config.monitor.monitor_args: + - api_key (Optional[str]): API key for swanlab.login(). If omitted, will read from env + (SWANLAB_API_KEY, SWANLAB_APIKEY, SWANLAB_KEY, SWANLAB_TOKEN) or assume prior CLI login. + - workspace (Optional[str]): Organization/username workspace. + - mode (Optional[str]): "cloud" | "local" | "offline" | "disabled". + - logdir (Optional[str]): Local log directory when in local/offline modes. + - experiment_name (Optional[str]): Explicit experiment name. Defaults to "{name}_{role}". + - description (Optional[str]): Experiment description. + - tags (Optional[List[str]]): Tags to attach. Role and group are appended automatically. + - id (Optional[str]): Resume target run id (21 chars) when using resume modes. + - resume (Optional[Literal['must','allow','never']|bool]): Resume policy. + - reinit (Optional[bool]): Whether to re-init on repeated init() calls. + """ + + def __init__(self, project: str, group: str, name: str, role: str, config) -> None: + assert ( + swanlab is not None + ), "swanlab is not installed. Please install it to use SwanlabMonitor." + + monitor_args = ( + (config.monitor.monitor_args or {}) + if config and getattr(config, "monitor", None) + else {} + ) + + # Optional API login via code if provided; otherwise try environment, then rely on prior `swanlab login`. + api_key = os.environ.get("SWANLAB_API_KEY") + if api_key: + try: + swanlab.login(api_key=api_key, save=True) + except Exception: + # Best-effort login; continue to init which may still work if already logged in + pass + else: + raise RuntimeError("Swanlab API key not found in environment variable SWANLAB_API_KEY.") + + # Compose tags (ensure list and include role/group markers) + tags = monitor_args.get("tags") or [] + if isinstance(tags, tuple): + tags = list(tags) + if role and role not in tags: + tags.append(role) + if group and group not in tags: + tags.append(group) + + # Determine experiment name + exp_name = monitor_args.get("experiment_name") or f"{name}_{role}" + self.exp_name = exp_name + + # Prepare init kwargs, passing only non-None values to respect library defaults + init_kwargs = { + "project": project, + "workspace": monitor_args.get("workspace"), + "experiment_name": exp_name, + "description": monitor_args.get("description"), + "tags": tags or None, + "logdir": monitor_args.get("logdir"), + "mode": monitor_args.get("mode") or "cloud", + "settings": monitor_args.get("settings"), + "id": monitor_args.get("id"), + "resume": monitor_args.get("resume"), + "reinit": monitor_args.get("reinit"), + } + # Strip None values to avoid overriding swanlab defaults + init_kwargs = {k: v for k, v in init_kwargs.items() if v is not None} + + self.logger = swanlab.init(**init_kwargs) + self.console_logger = get_logger(__name__, in_ray_actor=True) + + def log_table(self, table_name: str, experiences_table, step: int): + assert ( + swanlab is not None + ), "swanlab is not installed. Please install it to use SwanlabMonitor." + + # Convert pandas DataFrame to SwanLab ECharts Table + headers: List[str] = list(experiences_table.columns) + # Ensure rows are native Python types + rows: List[List[object]] = experiences_table.astype(object).values.tolist() + try: + tbl = swanlab.echarts.Table() + tbl.add(headers, rows) + swanlab.log({table_name: tbl}, step=step) + except Exception: + # Fallback: log as CSV string if echarts table is unavailable + csv_str = experiences_table.to_csv(index=False) + swanlab.log({table_name: csv_str}, step=step) + + def log(self, data: dict, step: int, commit: bool = False) -> None: + """Log metrics.""" + # SwanLab doesn't use commit flag; keep signature for compatibility + assert ( + swanlab is not None + ), "swanlab is not installed. Please install it to use SwanlabMonitor." + swanlab.log(data, step=step) + self.console_logger.info(f"Step {step}: {data}") + with open(f"{self.exp_name}.log", "a") as f: + f.write(f"Step {step}: {data}\n") + + def close(self) -> None: + try: + # Prefer run.finish() if available + if hasattr(self, "logger") and hasattr(self.logger, "finish"): + self.logger.finish() + else: + # Fallback to global finish + swanlab.finish() + except Exception: + pass + + @classmethod + def default_args(cls) -> Dict: + """Return default arguments for the monitor.""" + return {} diff --git a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py index 8697e5a7..0baeed9e 100644 --- a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -183,15 +183,22 @@ def step_track( ) if token_generator == "manual": input_msg_ref = copy.deepcopy(converted_message) - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response( - input_msg_ref, llm_output, tools=tools - ) + + ( + precise_manual_token, + token_logprob_arr, + loss_mask, + lack_normal_eos, + ) = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output, tools=tools) + llm_ext_msg.token_arr = precise_manual_token + llm_ext_msg.token_logprob_arr = token_logprob_arr + llm_ext_msg.lack_normal_eos = lack_normal_eos + llm_ext_msg.manual_loss_mask_override = loss_mask + assert ( - len(token_arr_method2) + len(precise_manual_token) <= self.config.astuner.rollout.max_response_length_in_one_turn - ), f"Generated token length {len(token_arr_method2)} exceeds max_response_length_in_one_turn {self.config.astuner.rollout.max_response_length_in_one_turn}" - llm_ext_msg.token_arr = token_arr_method2 - llm_ext_msg.token_logprob_arr = token_logprob_arr + ), f"Generated token length {len(precise_manual_token)} exceeds max_response_length_in_one_turn {self.config.astuner.rollout.max_response_length_in_one_turn}" self.generated_token_callback_fn(llm_ext_msg.token_arr) # take snapshot of current timeline @@ -237,6 +244,19 @@ def patch_prompt_tokens( prompt_text = prompt_text[: -len(self.generation_prompt)] # prompt_token_ids = prompt_token_ids[: -len(self.generation_prompt_token)] + # split prompt token ids into message level + split_prompt_token_ids = [] + tmp = [] + for i in range(len(prompt_token_ids)): + if prompt_token_ids[i] != self._im_start_token_id: + tmp += [prompt_token_ids[i]] + else: + if len(tmp) > 0: + split_prompt_token_ids += [tmp] + tmp = [prompt_token_ids[i]] + if len(tmp) > 0: + split_prompt_token_ids += [tmp] + # split prompt text into message level prompt_text_split = prompt_text.split("<|im_start|>") assert prompt_text_split[0] == "", "Prompt text should start with <|im_start|>" prompt_text_split = prompt_text_split[1:] # remove the first empty string @@ -255,6 +275,7 @@ def patch_prompt_tokens( # try to recover tokens for j in range(len(previous_ext_context)): if prompt_text_split[j] != current_prompt_text[j]: + # if prompt text mismatch, we can replace the tokens print_dict( { "expected_prompt_text": prompt_text_split[j], @@ -266,7 +287,24 @@ def patch_prompt_tokens( previous_ext_context[j].token_arr = self.tokenizer( prompt_text_split[j], return_tensors="pt", padding=False ) - + else: + # if prompt text match + # we further check whether all token ids matches + vllm_token_array = split_prompt_token_ids[j] + tracker_token_array = previous_ext_context[j].token_arr + if vllm_token_array == tracker_token_array: + # good, everything is perfect + continue + else: + # otherwise, we throw a warning (do not worry, this causes almost no influence in the training) + print_dict( + { + "expected_token_ids": split_prompt_token_ids[j], + "current_token_ids": previous_ext_context[j].token_arr, + }, + mod="exception", + header="Prompt token ids mismatch, Please report a github issue", + ) # remove extra messages if len(previous_ext_context) != len(prompt_text_split): previous_ext_context = previous_ext_context[: len(prompt_text_split)] @@ -372,29 +410,6 @@ def group_merge(self) -> List[List[ExtendedMessage]]: def group_tokenize(self): return self.group_tokenize_multi_group() - def get_inc(self, text_frag_from, text_frag_to): - """ - Get the incremental token array from text_frag_from to text_frag_to. - """ - tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) - tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore - token_ids_acc = tokenizer_input_ids - - tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) - input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore - input_id_increment = input_ids[ - len(token_ids_acc) : - ] # get the new tokens added in this step - overlap_length = 0 - for i in range(len(token_ids_acc)): - if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: - overlap_length += 1 - else: - break - msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" - # print(msg) - return input_id_increment, msg - def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore dict_messages = self.to_role_content(ext_messages) prompt_text = astune_apply_chat_template( @@ -445,15 +460,3 @@ def check_context_token_num_safe( else: ret = (False, token_overflow, "token_overflow") return ret - - def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: - result = [] - for ext_msg in ext_msg_array: - d = { - "role": ext_msg.role, - "content": ext_msg.content_for_future, - } - if ext_msg.tool_calls: - d.update({"tool_calls": ext_msg.tool_calls}) - result.append(d) - return result diff --git a/astuner/context_tracker/agentscope_tracker/timeline_merging.py b/astuner/context_tracker/agentscope_tracker/timeline_merging.py index 0d326bbb..86a273f1 100644 --- a/astuner/context_tracker/agentscope_tracker/timeline_merging.py +++ b/astuner/context_tracker/agentscope_tracker/timeline_merging.py @@ -17,7 +17,9 @@ def can_merge_steps( for i in range(len(target_timeline)): if compare_level == "text": same = ( - source_timeline[i].content_for_future == target_timeline[i].content_for_future + # TODO: does not consider tools, may aggressively merge responses with different tool calls + source_timeline[i].content_for_future + == target_timeline[i].content_for_future ) elif compare_level == "token": same = source_timeline[i].token_arr == target_timeline[i].token_arr @@ -56,23 +58,24 @@ def can_merge_steps( return can_merge +def toggle_author_and_mask( + source_timeline: List[ExtendedMessage], + target_timeline: List[ExtendedMessage], +) -> List[ExtendedMessage]: + # if any message in `target_timeline` is author == 'llm', but same-index message in `source_timeline` is author != 'llm' + # change source_timeline's message author to 'llm' + for i in range(len(target_timeline)): + if target_timeline[i].author == "llm" and source_timeline[i].author != "llm": + source_timeline[i].author = target_timeline[i].author + source_timeline[i].token_arr = target_timeline[i].token_arr + source_timeline[i].token_logprob_arr = target_timeline[i].token_logprob_arr + assert source_timeline[i].need_training + return source_timeline + + def merge_tracker_timelines( timelines: List[List[ExtendedMessage]], ) -> List[List[ExtendedMessage]]: - def toggle_author( - source_timeline: List[ExtendedMessage], - target_timeline: List[ExtendedMessage], - ) -> List[ExtendedMessage]: - # if any message in `target_timeline` is author == 'llm', but same-index message in `source_timeline` is author != 'llm' - # change source_timeline's message author to 'llm' - for i in range(len(target_timeline)): - if target_timeline[i].author == "llm" and source_timeline[i].author != "llm": - source_timeline[i].author = target_timeline[i].author - source_timeline[i].token_arr = target_timeline[i].token_arr - source_timeline[i].token_logprob_arr = target_timeline[i].token_logprob_arr - assert source_timeline[i].need_training - return source_timeline - absorbed_step_indices = [] reversed_timelines = list(reversed(timelines)) for i in range(len(reversed_timelines)): @@ -85,7 +88,7 @@ def toggle_author( source_timeline = reversed_timelines[i] target_timeline = reversed_timelines[j] if can_merge_steps(source_timeline, target_timeline): - source_timeline = toggle_author(source_timeline, target_timeline) + source_timeline = toggle_author_and_mask(source_timeline, target_timeline) reversed_timelines[i] = source_timeline absorbed_step_indices += [j] diff --git a/astuner/context_tracker/basic_tracker.py b/astuner/context_tracker/basic_tracker.py index 58daa310..32a66c23 100644 --- a/astuner/context_tracker/basic_tracker.py +++ b/astuner/context_tracker/basic_tracker.py @@ -3,7 +3,6 @@ from typing import List, Optional, Tuple import torch -from loguru import logger from astuner.context_tracker.tracker_base_attr import ( BaseTracker, @@ -190,18 +189,45 @@ def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context= self.already_mad_flag = True if token_generator == "manual": - token_arr_method2, token_logprob_arr = self.get_token_inc_from_vllm_response( - input_msg_ref, llm_output - ) - ext_msg.token_arr = token_arr_method2 + ( + precise_manual_token, + token_logprob_arr, + loss_mask, + lack_normal_eos, + ) = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output) + ext_msg.token_arr = precise_manual_token ext_msg.token_logprob_arr = token_logprob_arr + ext_msg.lack_normal_eos = lack_normal_eos + ext_msg.manual_loss_mask_override = loss_mask return ext_msg + def get_inc(self, text_frag_from, text_frag_to): + """ + Get the incremental token array from text_frag_from to text_frag_to. + """ + tokenizer_output = self.tokenizer(text_frag_from, return_tensors="pt", padding=False) + tokenizer_input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore + token_ids_acc = tokenizer_input_ids + + tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) + input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore + input_id_increment = input_ids[ + len(token_ids_acc) : + ] # get the new tokens added in this step + overlap_length = 0 + for i in range(len(token_ids_acc)): + if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: + overlap_length += 1 + else: + break + msg = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" + return input_id_increment, msg + # generate token def get_token_inc_from_vllm_response( self, input_msg_ref, llm_output, tools: List[dict] = [] - ) -> Tuple[List[int], List[int]]: + ) -> Tuple[List[int], List[int], List[int], bool]: llm_output_role_content = { "role": llm_output["role"], "content": llm_output["content"], @@ -231,14 +257,14 @@ def get_token_inc_from_vllm_response( self.generated_token_cnt += len(vllm_output_raw_token) if not self.generation_prompt_token: self.generation_prompt_token = self.get_generation_prompt_token() - final_token_arr, token_logprob_arr = replace_token_ids( - place_holder=completion_token_arr, - replace_with=vllm_output_raw_token, - begin=self.generation_prompt_token, - end=[self.tokenizer.eos_token_id], - raw_logprob=vllm_output_raw_logprob, + final_token_arr, token_logprob_arr, loss_mask, lack_normal_eos = replace_token_ids( + token_container=completion_token_arr, + precise_token=vllm_output_raw_token, + precise_logprob=vllm_output_raw_logprob, + begin_ids=self.generation_prompt_token, + end_ids=[self.tokenizer.eos_token_id], ) - return final_token_arr, token_logprob_arr + return final_token_arr, token_logprob_arr, loss_mask, lack_normal_eos def save_llm_output_do_not_register_full_context(self, llm_output, input_msg_ref): return BasicContextTracker.save_llm_output( @@ -402,9 +428,6 @@ def group_tokenize_multi_group(self): return sample_arr - def ensure_terminate_rollout_stage(self): - """Nothing need to be done for basic linear cmt at `ensure_terminate_rollout_stage`""" - def compute_step_level_reward( self, ext_steps: List[ExtendedMessage], index: int, total_steps: int ) -> float: @@ -423,6 +446,18 @@ def compute_step_level_reward( return step_reward + def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: + result = [] + for ext_msg in ext_msg_array: + d = { + "role": ext_msg.role, + "content": ext_msg.content_for_future, + } + if ext_msg.tool_calls: + d.update({"tool_calls": ext_msg.tool_calls}) + result.append(d) + return result + def tokenize_steps( self, ext_steps: List[ExtendedMessage], index: int, total_steps: int ) -> dict: @@ -483,26 +518,19 @@ def tokenize_steps( attention_mask += [1] * len(ext_msg.token_arr) loss_mask += ext_msg.get_loss_mask(blackout_token_combo=self.blackout_token_combo) - if split_prompt_reponse_index == -1: - # should we begin split point early? - if input_ids_len[-1] > self.config.astuner.data.max_prompt_length: - message_dict = self.to_role_content(ext_steps) - logger.warning( - "Input ids exceeded max_prompt_length before encountering any training message! trying to fix..." - ) - logger.bind(exception=True).exception( - "Input ids exceeded max_prompt_length before encountering any training message! trying to fix...\n\n" - + str(message_dict) - ) - assert ( - i >= 1 - ), "There should be at least one message before exceeding max_prompt_length" - assert ( - input_ids_len[-2] <= self.config.astuner.data.max_prompt_length - ), "The previous message should be within max_prompt_length, something is wrong" - split_point_message_left_index = i - 1 - assert split_point_message_left_index == (len(input_ids_len) - 2), "what?" - split_prompt_reponse_index = input_ids_len[split_point_message_left_index] + # if [prompt_token | response_token] is splited at a place where loss_mask == 0, + # move the split index forward + MAX_FORWARD_STEPS = 100 + for i in range(MAX_FORWARD_STEPS): + if loss_mask[split_prompt_reponse_index] == 0: + split_prompt_reponse_index += 1 + else: + break + + # no matter what, the split index should not exceed max prompt length + # make sure that the prompt length does not exceed `config.astuner.data.max_prompt_length` + if split_prompt_reponse_index > self.config.astuner.data.max_prompt_length: + split_prompt_reponse_index = self.config.astuner.data.max_prompt_length # check assert len(ext_steps) == len( diff --git a/astuner/context_tracker/tracker_base_attr.py b/astuner/context_tracker/tracker_base_attr.py index 613d0d22..0aaeea54 100644 --- a/astuner/context_tracker/tracker_base_attr.py +++ b/astuner/context_tracker/tracker_base_attr.py @@ -9,25 +9,104 @@ def replace_token_ids( - place_holder, replace_with, begin, end, raw_logprob -) -> Tuple[List[int], List[int]]: - _begin_index = find_sublist_indices(place_holder, begin) + len(begin) - _end_index = find_sublist_indices(place_holder, end, reverse=True) - - if replace_with[-len(end) :] == end: # remove end token - replace_with = replace_with[: -len(end)] - raw_logprob = raw_logprob[: -len(end)] - if replace_with[: len(begin)] == begin: # remove begin token - replace_with = replace_with[len(begin) :] - raw_logprob = raw_logprob[len(begin) :] - - final = place_holder[:_begin_index] + replace_with + place_holder[_end_index:] + token_container, + precise_token, + precise_logprob, + begin_ids, + end_ids, +) -> Tuple[List[int], List[int], List[int], bool]: + """ + Replace token ids + + input || token_container: [begin_ids, ... ids_that_may_not_precise ... , end_ids, other_ids] + ==> + output1 || final_token_ids: [begin_ids, ... precise_token ... , end_ids, other_ids] + output2 || final_logprob: [NA, ... precise_logprob ... , NA , NA ] + output3 || loss_mask: [0, ... 1 ... , 1 , 0 ] + output4 || lack_normal_eos: False + + + + test case: + ----------- case 1 (with_normal_eos) ----------- + (NA = INVALID_LOG_PROB_VALUE) + + begin_ids = [151644, 77091, 198] + end_ids = [151645] + token_container = [151644, 77091, 198, 1, 1, 1, 151645, 1, 2, 3, 4] + precise_token = [4, 3, 2, 151645] + precise_logprob = [-0.4, -0.3, -0.2, -0.1] + + assert replace_token_ids( + token_container, + precise_token, + precise_logprob, + begin_ids, + end_ids, + ) = ( + [151644, 77091, 198, 4, 3, 2, 151645, 1, 2, 3, 4] + [NA, NA, NA, -0.4, -0.3, -0.2, -0.1, NA, NA, NA, NA] + [0, 0, 0, 1, 1, 1, 1, 0 ,0 ,0 ,0] + ) + + ----------- case 2 (lack_normal_eos) ----------- + begin_ids = [151644, 77091, 198] + end_ids = [151645] + token_container = [151644, 77091, 198, 1, 1, 1, 151645, 1, 2, 3, 4] + precise_token = [3, 2, 1,] + precise_logprob = [-0.3, -0.2, -0.1] + + assert replace_token_ids( + token_container, + precise_token, + precise_logprob, + begin_ids, + end_ids, + ) = ( + [151644, 77091, 198, 3, 2, 1, 151645, 1, 2, 3, 4] + [NA, NA, NA, -0.3, -0.2, -0.1, NA, NA, NA, NA] + [0, 0, 0, 1, 1, 1, 0, 0 ,0 ,0 ,0] + ) + + """ + + _begin_index = find_sublist_indices(token_container, begin_ids) + len(begin_ids) + _end_index = find_sublist_indices(token_container, end_ids, reverse=True) + + if precise_token[-len(end_ids) :] == end_ids: # remove end_ids token + lack_normal_eos = False + precise_token_center = precise_token[: -len(end_ids)] + precise_logprob_center = precise_logprob[: -len(end_ids)] + logprob_eos_tail = precise_logprob[-len(end_ids) :] + else: + lack_normal_eos = True + precise_token_center = precise_token + precise_logprob_center = precise_logprob + logprob_eos_tail = [] + + if precise_token[: len(begin_ids)] == begin_ids: # remove begin_ids token + # precise_token = precise_token[len(begin_ids) :] + # precise_logprob_center = precise_logprob[len(begin_ids) :] + raise ValueError( + "Unexpected situation, wrong llm output (unexpected BOS): please post an github issue." + ) + + final_token_ids = ( + token_container[:_begin_index] + precise_token_center + token_container[_end_index:] + ) final_logprob = ( [INVALID_LOG_PROB_VALUE] * _begin_index - + raw_logprob - + [INVALID_LOG_PROB_VALUE] * (len(place_holder) - _end_index) + + precise_logprob_center + + logprob_eos_tail + + [INVALID_LOG_PROB_VALUE] * (len(token_container) - _end_index - len(logprob_eos_tail)) + ) + loss_mask = ( + [0] * _begin_index + + [1] * len(precise_logprob_center) + + [1] * len(logprob_eos_tail) + + [0] * (len(token_container) - _end_index - len(logprob_eos_tail)) ) - return final, final_logprob + return final_token_ids, final_logprob, loss_mask, lack_normal_eos class BaseTracker(object): @@ -45,6 +124,7 @@ def __init__(self, config, tokenizer, **kwargs): self.max_seq_length: int = max_model_len - max_response_length self.max_env_output_length: int = self.config.astuner.context_tracker.max_env_len self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") + self._im_start_token_id = tokenizer.encode("<|im_start|>")[0] self.generated_token_cnt = 0 self.terminal_rewards_dict = {} self.discarded = False diff --git a/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc b/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc index 15ebcd51..a91560cc 100644 --- a/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc +++ b/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc @@ -6,6 +6,7 @@ "astuner.trainer_common.save_freq": "trainer.save_interval", "astuner.trainer_common.ulysses_sequence_parallel_size": "trainer.ulysses_sequence_parallel_size", "astuner.trainer_common.optim.lr": "algorithm.optimizer.lr", + "astuner.trainer_common.logger": "monitor.monitor_type", "astuner.rollout.n_vllm_engine": "explorer.rollout_model.engine_num", "astuner.model.path": "model.model_path", "astuner.project_name": "project", diff --git a/astuner/default_config/trinity/trinity_default.yaml b/astuner/default_config/trinity/trinity_default.yaml index bb56c607..028eeea4 100644 --- a/astuner/default_config/trinity/trinity_default.yaml +++ b/astuner/default_config/trinity/trinity_default.yaml @@ -6,10 +6,27 @@ trinity: algorithm: algorithm_type: multi_step_grpo buffer: + batch_size: 32 + explorer_input: + eval_tasksets: [] + taskset: + default_workflow_type: astuner_workflow + format: + prompt_key: question + response_key: answer + name: "" + path: http://localhost:8080 + rollout_args: + temperature: 1.0 + split: train + storage_type: astuner + subset_name: "" + total_epochs: 1000 + train_batch_size: 36 trainer_input: experience_buffer: - max_read_timeout: 3600 - name: astuner_buffer + max_read_timeout: 18000 + name: "astuner_experience_buffer" storage_type: queue replay_buffer: enable: false diff --git a/astuner/main_trinity.py b/astuner/main_trinity.py index a01b21c0..e5184237 100644 --- a/astuner/main_trinity.py +++ b/astuner/main_trinity.py @@ -4,7 +4,6 @@ import argparse import asyncio -import atexit import os import sys import traceback @@ -25,7 +24,6 @@ # register trinity backbone modules import astuner.backbone.trinity_compat_workflow # noqa: F401 from astuner.utils.core_env_vars import get_runtime_env -from astuner.utils.sms_agent import send_train_message logger = get_logger(__name__) @@ -203,8 +201,6 @@ def run(config_path: str, dlc: bool = False, plugin_dir: str = None): load_dotenv(".env") - atexit.register(lambda: send_train_message("0000")) - if plugin_dir: os.environ[PLUGIN_DIRS_ENV_VAR] = plugin_dir diff --git a/astuner/schema/extended_msg.py b/astuner/schema/extended_msg.py index 16f01925..7049932f 100644 --- a/astuner/schema/extended_msg.py +++ b/astuner/schema/extended_msg.py @@ -2,12 +2,13 @@ from typing import List from loguru import logger -from pydantic import BaseModel from transformers.tokenization_utils import PreTrainedTokenizer from astuner.utils.tokenizer import astune_apply_chat_template -INVALID_LOG_PROB_VALUE = 0.0 +# import numpy as np +# INVALID_LOG_PROB_VALUE = np.inf # when debuging, set to np.inf, if anything goes wrong, we can sense that immediately +INVALID_LOG_PROB_VALUE = 0 # normally, set to 0 is ok NEED_TRAIN_AUTHORS = ["llm"] NON_TRAIN_AUTHORS = [ "env", @@ -31,7 +32,31 @@ def find_sublist_indices(large_list, small_list, reverse=False): return -1 -class ExtendedMessage(BaseModel): +def blackout_specific_token_ids_first_encounter(mask, arr, token_ids): + index = find_sublist_indices(arr, token_ids, reverse=False) + if index >= 0: + for i in range(index, index + len(token_ids)): + mask[i] = 0 + return mask + + +def blackout_everything_after_eos_but_keep_eos(mask, token_arr, eos_token_id): + eos_position = token_arr.index(eos_token_id) if eos_token_id in token_arr else -1 + if eos_position != -1: + for i in range(eos_position + 1, len(mask)): + mask[i] = 0 + return mask + + +def blackout_everything_after_eos_including_eos(mask, token_arr, eos_token_id): + eos_position = token_arr.index(eos_token_id) if eos_token_id in token_arr else -1 + if eos_position != -1: + for i in range(eos_position, len(mask)): + mask[i] = 0 + return mask + + +class ExtendedMessage: def __init__( self, author, @@ -66,6 +91,8 @@ def __init__( self.uuid = uuid.uuid4().hex self.build_from_uuid = build_from_uuid self.first_message = first_message + self.manual_loss_mask_override = [] + self.lack_normal_eos = False if not clip: self.generate_content_for_future(tokenizer=None, clip=False) @@ -170,30 +197,32 @@ def generate_content_for_future(self, tokenizer, clip, clip_token_limit=-1): self._content_for_future = _content def get_loss_mask(self, blackout_token_combo): - def blackout_specific_token_ids_first_encounter(mask, arr, token_ids): - index = find_sublist_indices(arr, token_ids, reverse=False) - if index >= 0: - for i in range(index, index + len(token_ids)): - mask[i] = 0 - return mask - - def blackout_everything_after_eos_but_keep_eos(mask, token_arr, eos_token_id): - eos_position = token_arr.index(eos_token_id) if eos_token_id in token_arr else -1 - if eos_position != -1: - for i in range(eos_position + 1, len(mask)): - mask[i] = 0 - return mask - if self.need_training: + # keep eos, but blackout everything after eos msg_token_mask = [1] * len(self.token_arr) msg_token_mask = blackout_specific_token_ids_first_encounter( msg_token_mask, self.token_arr, blackout_token_combo ) + # in normal case, we will blackout everything after the EOS token + # but EOS still participates in the loss calculation msg_token_mask = blackout_everything_after_eos_but_keep_eos( mask=msg_token_mask, token_arr=self.token_arr, eos_token_id=self.eos_token_id, ) + # however, if the message does not have eos (e.g., finish_reason: length), we will blackout everything after the EOS token + # including the EOS token + if self.lack_normal_eos: + msg_token_mask = blackout_everything_after_eos_including_eos( + mask=msg_token_mask, + token_arr=self.token_arr, + eos_token_id=self.eos_token_id, + ) + if self.manual_loss_mask_override: + # assert two list is identical + assert len(self.manual_loss_mask_override) == len(msg_token_mask) + assert all(a == b for a, b in zip(self.manual_loss_mask_override, msg_token_mask)) + return msg_token_mask else: msg_token_mask = [0] * len(self.token_arr) diff --git a/astuner/task_reader/__init__.py b/astuner/task_reader/__init__.py index 9131a9c9..50ff4ac7 100644 --- a/astuner/task_reader/__init__.py +++ b/astuner/task_reader/__init__.py @@ -92,10 +92,14 @@ def __init__(self, reader_type, reader_config): raise ValueError(f"Unsupported task reader type: {task_reader_type}") def get_training_tasks(self) -> List[Task]: - return self.task_reader.get_training_tasks() + result = self.task_reader.get_training_tasks() + np.random.shuffle(result) + return result def get_validation_tasks(self) -> List[Task]: - return self.task_reader.get_validation_tasks() + result = self.task_reader.get_validation_tasks() + np.random.shuffle(result) + return result def task_to_standard_dataset(tasks: List[Task]) -> datasets.Dataset: diff --git a/astuner/task_runner/classic_runner.py b/astuner/task_runner/classic_runner.py index 1a7be587..2c891245 100644 --- a/astuner/task_runner/classic_runner.py +++ b/astuner/task_runner/classic_runner.py @@ -108,7 +108,6 @@ def execute(self, workflow_task) -> BasicContextTracker: if self.cmt.is_terminated: break - self.cmt.ensure_terminate_rollout_stage() obs_window["step"][task_thread_index] = -1 raw_reward = 0 raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) diff --git a/astuner/utils/config_utils.py b/astuner/utils/config_utils.py index 4535d733..ec775b9e 100644 --- a/astuner/utils/config_utils.py +++ b/astuner/utils/config_utils.py @@ -127,6 +127,9 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): logger.success("----------------------------------------------------") time.sleep(1) + # special: logger + if backbone == "verl" and isinstance(to_config["trainer"]["logger"], str): + to_config["trainer"]["logger"] = ["console" + to_config["trainer"]["logger"]] # save to_config_fp with open(to_config_fp, "w") as file: diff --git a/astuner/utils/core_env_vars.py b/astuner/utils/core_env_vars.py index 1cf4eeb8..15b353ca 100644 --- a/astuner/utils/core_env_vars.py +++ b/astuner/utils/core_env_vars.py @@ -17,7 +17,7 @@ def get_runtime_env(is_trinity: bool = False) -> dict: "TOKENIZERS_PARALLELISM": "true", # use astuner.backbone as plugin directory "TRINITY_PLUGIN_DIRS": str((Path(__file__).parent.parent / "backbone").resolve()), - "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", + # "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), "ASTUNER_CONFIG_REDIRECT": os.getenv("ASTUNER_CONFIG_REDIRECT", ""), } diff --git a/astuner/utils/env_service_client/env_client_ng.py b/astuner/utils/env_service_client/env_client_ng.py index ad200400..75819c86 100644 --- a/astuner/utils/env_service_client/env_client_ng.py +++ b/astuner/utils/env_service_client/env_client_ng.py @@ -4,27 +4,16 @@ import random import tempfile import time -from datetime import datetime from typing import Any, Callable, Dict, List, Optional import requests +from loguru import logger LOG_PATH = os.environ.get( "CLIENT_LOG_PATH", os.path.join(tempfile.gettempdir(), "app_logs", "error.out") ) -def safe_log(msg: str): - try: - os.makedirs(os.path.dirname(LOG_PATH), exist_ok=True) - with open(LOG_PATH, "a", encoding="utf-8") as f: - f.write(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] {msg}\n") - f.flush() - os.fsync(f.fileno()) - except Exception: - pass - - def retry_call( fn: Callable, max_retry: int = 3, @@ -39,19 +28,19 @@ def retry_call( try: res = fn() if i > 0: - safe_log( + logger.info( f"{err_prefix} {action_name} [instance={instance_id}] succeed at try {i+1}/{max_retry}" ) return res except Exception as e: - safe_log( + logger.info( f"{err_prefix} {action_name} [instance={instance_id}] retry {i+1}/{max_retry} failed: {e}" ) if i + 1 == max_retry: - safe_log( + logger.exception( f"{err_prefix} {action_name} [instance={instance_id}] max retries exceeded, fallback used." ) - return fail_return + raise RuntimeError("Env Service Timeout") wait = random.uniform(min_backoff, max_backoff) time.sleep(wait) return fail_return @@ -60,7 +49,7 @@ def retry_call( class EnvClient: def __init__(self, base_url: str = "http://localhost:8000"): self.base_url = base_url.rstrip("/") - self.timeout = 150.0 + random.uniform(50, 200) + self.timeout = 30.0 def _make_request( self, @@ -86,7 +75,7 @@ def _make_request( response.raise_for_status() return response.json() except Exception as e: - safe_log( + logger.exception( f"[{endpoint}] _make_request failed (instance={instance_id}): {e}, data: {data}" ) raise Exception(f"Request failed: {str(e)}, data: {data}") @@ -96,7 +85,7 @@ def get_env_profile( env_type: str, split: str = "train", params: Optional[dict] = None, - max_retry: int = 3, + max_retry: int = 1, ) -> List[str]: def call(): # resolved_env_type = map_env_type.get(env_type, env_type) diff --git a/pyproject.toml b/pyproject.toml index 2259df3a..55ae7c50 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ "trinity-rft>=0.3.3", "loguru", "debugpy", + "swanlab", "modelscope>=1.18.1", "pydantic", "beast_logger", diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 3a7afe9f..353e420d 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -21,7 +21,7 @@ astuner: agentscope_learn_protocol: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 0.7 max_env_worker: 64 - num_repeat: 4 + num_repeat: 6 agent_madness_reward: 0.0 tensor_model_parallel_size: 1 max_num_seqs: 40 @@ -31,27 +31,27 @@ astuner: - "nonsense" - "wrong_toolcall" max_response_length_in_one_turn: 1024 - max_model_len: 13000 + max_model_len: 10000 + n_vllm_engine: 2 data: - train_batch_size: 264 - max_prompt_length: 3000 - max_response_length: 10000 + train_batch_size: 32 + max_prompt_length: 3000 + max_response_length: 7000 debug: debug_max_parallel: 1 debug_first_n_tasks: 1 trainer_common: - save_freq: 99999 - test_freq: 99999 - total_epochs: 99999 - trinity_only__n_vllm_engine: 2 # must be division by tensor_model_parallel_size - + save_freq: 100 + test_freq: 100 + total_epochs: 100 + logger: swanlab trinity: trainer: - max_token_len_per_gpu: 13000 + max_token_len_per_gpu: 10000 From 958cfc9bae211daeffeff8c59e56a475d569eae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 4 Dec 2025 12:45:32 +0800 Subject: [PATCH 233/462] add additional dataset shuffle in task reader router --- astuner/task_reader/__init__.py | 12 ++++++++---- astuner/utils/config_utils.py | 2 -- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/astuner/task_reader/__init__.py b/astuner/task_reader/__init__.py index 50ff4ac7..6116db16 100644 --- a/astuner/task_reader/__init__.py +++ b/astuner/task_reader/__init__.py @@ -65,10 +65,14 @@ def __init__(self, config): raise ValueError(f"Unsupported task reader type: {task_reader_type}") def get_training_tasks(self) -> List[Task]: - return self.task_reader.get_training_tasks() + result = self.task_reader.get_training_tasks() + np.random.shuffle(result) # type: ignore + return result def get_validation_tasks(self) -> List[Task]: - return self.task_reader.get_validation_tasks() + result = self.task_reader.get_validation_tasks() + np.random.shuffle(result) # type: ignore + return result class TaskReaderRouterV2(TaskReaderBase): @@ -93,12 +97,12 @@ def __init__(self, reader_type, reader_config): def get_training_tasks(self) -> List[Task]: result = self.task_reader.get_training_tasks() - np.random.shuffle(result) + np.random.shuffle(result) # type: ignore return result def get_validation_tasks(self) -> List[Task]: result = self.task_reader.get_validation_tasks() - np.random.shuffle(result) + np.random.shuffle(result) # type: ignore return result diff --git a/astuner/utils/config_utils.py b/astuner/utils/config_utils.py index ec775b9e..a62e26a5 100644 --- a/astuner/utils/config_utils.py +++ b/astuner/utils/config_utils.py @@ -211,10 +211,8 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): raise FileNotFoundError(f"Configuration file not found: {exp_base}") ## 0. read yaml & get experiment_name - print(yaml_path) with open(yaml_path, "r") as file: config = yaml.safe_load(file) - try: exp_name = config.get("astuner").get("experiment_name") except Exception: From dd2bd2cbd5d7d040065e0c288d6875b1aff85b5a Mon Sep 17 00:00:00 2001 From: Kanaricc <46213939+Kanaricc@users.noreply.github.com> Date: Thu, 4 Dec 2025 14:14:04 +0800 Subject: [PATCH 234/462] add deduplication filter (#8) * feat: add deduplication filter * fix: spacing in deduplication filter db_path configuration * refactor: remove unused chroma_id variable in embedding client --- .../filters/deduplication_filter.py | 34 ++ astuner/data_generator/filters/factory.py | 3 +- astuner/utils/embedding_client.py | 338 ++++++++++++++++++ pyproject.toml | 3 + .../example_feedback_tracing.yaml | 8 + 5 files changed, 385 insertions(+), 1 deletion(-) create mode 100644 astuner/data_generator/filters/deduplication_filter.py create mode 100644 astuner/utils/embedding_client.py diff --git a/astuner/data_generator/filters/deduplication_filter.py b/astuner/data_generator/filters/deduplication_filter.py new file mode 100644 index 00000000..6a4008ae --- /dev/null +++ b/astuner/data_generator/filters/deduplication_filter.py @@ -0,0 +1,34 @@ +import shutil +from astuner.utils.embedding_client import EmbeddingClient +from .base import Filter +from typing import Iterable, List +from astuner.schema.task import Task +import os + +class DeduplicationFilter(Filter): + def __init__(self, similarity_threshold: float, db_path: str, model: str, api_key: str|None, base_url: str): + # remove old db + if os.path.exists(db_path): + shutil.rmtree(db_path) + + self._client = EmbeddingClient( + similarity_threshold=similarity_threshold, + base_url=base_url, + api_key=api_key, + model=model, + chroma_db_path=db_path, + ) + + self._similarity_threshold = similarity_threshold + self._db_path = db_path + + def filter(self, tasks: Iterable[Task]) -> List[Task]: + res=[] + for task in tasks: + similar=self._client.find_top_k_by_text(task.main_query,k=1) + if len(similar)!=0 and similar[0][1]>=self._similarity_threshold: + continue + res.append(task) + self._client.add(task.main_query,hash(task.main_query)) + + return res \ No newline at end of file diff --git a/astuner/data_generator/filters/factory.py b/astuner/data_generator/filters/factory.py index 594f2924..9c9d1dff 100644 --- a/astuner/data_generator/filters/factory.py +++ b/astuner/data_generator/filters/factory.py @@ -4,12 +4,13 @@ from .base import Filter from .llm_evaluate_filter import LlmEvaluateFilter +from .deduplication_filter import DeduplicationFilter FILTER_REGISTRY: Dict[str, type[Filter]] = { "llm_evaluate": LlmEvaluateFilter, + "deduplication": DeduplicationFilter, } - def _build_single_filter(spec: Mapping[str, Any]) -> Filter: type_name = spec.get("type") if not isinstance(type_name, str): diff --git a/astuner/utils/embedding_client.py b/astuner/utils/embedding_client.py new file mode 100644 index 00000000..8346f4b3 --- /dev/null +++ b/astuner/utils/embedding_client.py @@ -0,0 +1,338 @@ +import os +from typing import List, Optional, cast +import uuid + +from loguru import logger +from tenacity import retry, stop_after_attempt, wait_exponential +from typing import Union, Sequence, Dict, Any +from chromadb.config import Settings +import chromadb +import httpx + +class OpenAIEmbeddingClient: + """ + Client class for OpenAI Embedding API. + Supports calling embedding APIs in OpenAI format with rate limiting. + """ + + def __init__(self, api_key: str, base_url: str = "https://api.openai.com/v1", + model_name: str = "text-embedding-ada-002", + rate_limit_calls: int = 60, rate_limit_window: int = 60): + """ + Initializes the OpenAI Embedding API client. + + Args: + api_key (str): The API key for authentication. + base_url (str): The base URL for the API, defaulting to the official OpenAI address. + model_name (str): The name of the model to use, defaulting to text-embedding-ada-002. + rate_limit_calls (int): The number of allowed calls within the rate limit window, defaulting to 60. + rate_limit_window (int): The time window in seconds for the rate limit, defaulting to 60 seconds. + """ + self.api_key = api_key + self.base_url = base_url.rstrip('/') # ⭐ Ensures the base URL does not end with a trailing slash + self.model_name = model_name + # Set up the request headers + self.headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {self.api_key}" # ⭐ Constructs the authorization header using the provided API key + } + + logger.info(f"init OpenAI Embedding client, quota: {rate_limit_calls} times/{rate_limit_window}s") + + @retry(stop=stop_after_attempt(4),wait=wait_exponential(multiplier=1, min=4, max=60)) + def get_embeddings(self, texts: Union[str, Sequence[str]], + model: Optional[str] = None, + encoding_format: str = "float", + dimensions: Optional[int] = None, + user: Optional[str] = None) -> Dict[str, Any]: + """ + Fetches the embedding vectors for the provided texts with rate limiting. + + Args: + texts (Union[str, Sequence[str]]): Text(s) for which to fetch the embeddings, can be a single string or a list of strings. + model (Optional[str]): Name of the model to use; if not specified, the model set during initialization is used. + encoding_format (str): Encoding format for the embeddings, default is "float". + dimensions (Optional[int]): Output dimensionality (supported by some models). + user (Optional[str]): User identifier. + + Returns: + Dict[str, Any]: The API response as a dictionary. + + Raises: + requests.RequestException: If there is an issue with the request. + ValueError: If the input parameters are invalid. + """ + # Rate limiting control + # self.rate_limiter.acquire() # ⭐ Acquires a token from the rate limiter to ensure the request does not exceed the allowed rate + + # Parameter validation + if not texts: + raise ValueError("texts cannot be empty") + + # Construct the request payload + payload = { + "input": texts, + "model": model or self.model_name, + "encoding_format": encoding_format + } + + # Add optional parameters + if dimensions is not None: + payload["dimensions"] = dimensions + if user is not None: + payload["user"] = user + + # Send the request + url = f"{self.base_url}/embeddings" + + try: + with httpx.Client(timeout=60.0) as client: + response = client.post( + url, + headers=self.headers, + json=payload, + ) + if not response.is_success: + logger.error(f"failed to request embedding: {response.status_code} {response.reason_phrase}") + try: + logger.error(f"err json: {response.json()}") + except Exception: + logger.error("err json: ") + response.raise_for_status() + + return response.json() + + except httpx.RequestError as e: + raise httpx.RequestError(f"failed to request embedding: {e}") + + def get_single_embedding(self, text: str, **kwargs) -> List[float]: + """ + Retrieves the embedding vector for a single piece of text. This is a simplified method that wraps around the `get_embeddings` method. + + Args: + text (str): The text for which to retrieve the embedding vector. + **kwargs: Additional arguments to pass to the `get_embeddings` method. + + Returns: + List[float]: The embedding vector for the provided text. + """ + result = self.get_embeddings(text, **kwargs) # ⭐ Calls the get_embeddings method with the given text and additional arguments + return result['data'][0]['embedding'] + + def get_multiple_embeddings(self, texts: Sequence[str], **kwargs) -> List[List[float]]: + """ + Retrieves the embedding vectors for multiple texts (simplified method). + + Args: + texts (Sequence[str]): A list of texts to get the embedding vectors for. + **kwargs: Additional arguments to pass to the `get_embeddings` method. + + Returns: + List[List[float]]: A list of embedding vectors. + """ + result = self.get_embeddings(texts, **kwargs) # ⭐ Calls the `get_embeddings` method with provided texts and additional arguments + return [item['embedding'] for item in result['data']] # ⭐ Extracts the 'embedding' field from each item in the returned data + + def set_model(self, model_name: str): + """ + Sets the default model name for the API client. + + Args: + model_name (str): The name of the model to be used. + """ + self.model_name = model_name # ⭐ Set the model name + + def set_base_url(self, base_url: str): + """ + Sets the base URL for the API, ensuring it does not end with a trailing slash. + + Args: + base_url (str): The base URL for the API. + """ + self.base_url = base_url.rstrip('/') # ⭐ Remove trailing slash if present + + def set_api_key(self, api_key: str): + """ + Sets the API key and updates the authorization header for the API requests. + + Args: + api_key (str): The API key for authentication. + """ + self.api_key = api_key + self.headers["Authorization"] = f"Bearer {self.api_key}" # ⭐ Update the authorization header + +class EmbeddingClient: + def __init__(self, similarity_threshold: float, base_url: str = 'https://dashscope.aliyuncs.com/compatible-mode/v1', + api_key: Optional[str] = None, model: str = "text-embedding-v4", + chroma_db_path: str = "./chroma_db", collection_name: str = "trajectories"): + api_key = api_key or os.getenv("DASHSCOPE_API_KEY") + assert api_key is not None, "DASHSCOPE_API_KEY is required" + + self._client = OpenAIEmbeddingClient(api_key=api_key, base_url=base_url, model_name=model) + self.similarity_threshold = similarity_threshold + + self._chroma_client = chromadb.PersistentClient( + path=chroma_db_path, + settings=Settings(anonymized_telemetry=False) + ) + + self._collection = self._chroma_client.get_or_create_collection( + name=collection_name, + metadata={"hnsw:space": "cosine"} + ) + + def add(self, text: str, id: int): + """ + Add text and ID to ChromaDB + """ + embedding = self._client.get_single_embedding(text) + + chroma_id = f"doc_{id}_{uuid.uuid4().hex[:8]}" + + self._collection.add( + embeddings=[embedding], + documents=[text], + ids=[chroma_id], + metadatas=[{"original_id": id, "text_length": len(text)}] + ) + + def find_by_text(self, text: str) -> Optional[int]: + """ + Find a similar text in ChromaDB, return the corresponding ID + """ + if self._collection.count() == 0: + return None + + query_embedding = self._client.get_single_embedding(text) + + results = self._collection.query( + query_embeddings=[query_embedding], + n_results=1, # only the top result + include=["documents", "metadatas", "distances"] + ) + + if not results["ids"] or not results["ids"][0]: + return None + + distance = results["distances"][0][0] # type: ignore + similarity = 1 - distance + + if similarity >= self.similarity_threshold: + # Get the original_id from metadata instead of using _reverse_id_mapping + metadata = results["metadatas"][0][0] # type: ignore + return cast(int|None,metadata.get("original_id")) + else: + return None + + def find_top_k_by_text(self, text: str, k: int = 5) -> list[tuple[int, float, str]]: + """ + Find the top k similar documents + """ + if self._collection.count() == 0: + return [] + + query_embedding = self._client.get_single_embedding(text) + + results = self._collection.query( + query_embeddings=[query_embedding], + n_results=min(k, self._collection.count()), + include=["documents", "metadatas", "distances"] + ) + + if not results["ids"] or not results["ids"][0]: + return [] + + result_list = [] + for i in range(len(results["ids"][0])): + distance = results["distances"][0][i] # type: ignore + similarity = 1 - distance + document = results["documents"][0][i] # type: ignore + # Get the original_id from metadata instead of using _reverse_id_mapping + metadata = results["metadatas"][0][i] # type: ignore + original_id = metadata.get("original_id") + + if original_id is not None: + result_list.append((original_id, similarity, document)) + + return result_list + + def _embedding(self, texts: Sequence[str], bs=10) -> list[list[float]]: + """ + Get the embedding of texts + """ + res: list[list[float]] = [] + for i in range(0, len(texts), bs): + res.extend(self._client.get_multiple_embeddings(texts[i:i+bs])) + + return res + + def get_all_stored_texts(self) -> dict[int, str]: + """ + Get all stored texts + """ + all_data = self._collection.get(include=["documents", "metadatas"]) + result = {} + + if all_data["ids"]: + for i in range(len(all_data["ids"])): + # Get the original_id from metadata instead of using _reverse_id_mapping + metadata = all_data["metadatas"][i] # type: ignore + original_id = metadata.get("original_id") + if original_id is not None: + result[original_id] = all_data["documents"][i] # type: ignore + + return result + + def exists(self, id: int) -> bool: + """ + Check if the ID exists + """ + results = self._collection.get( + where={"original_id": id}, + include=[] + ) + return bool(results["ids"]) + + def remove(self, id: int) -> bool: + """ + Remove the text and embedding vector of the specified ID + """ + # Find the chroma_id by querying for the document with the specified original_id + results = self._collection.get( + where={"original_id": id}, + include=["metadatas"] + ) + + if not results["ids"] or not results["ids"][0]: + return False + + chroma_id = results["ids"][0] + + try: + self._collection.delete(ids=[chroma_id]) + return True + except Exception: + return False + + def clear(self): + """clear all stored texts and embeddings""" + try: + self._chroma_client.delete_collection(self._collection.name) + self._collection = self._chroma_client.get_or_create_collection( + name=self._collection.name, + metadata={"hnsw:space": "cosine"} + ) + except Exception as e: + print(f"failed to clear stores: {e}") + + def size(self) -> int: + """get the number of stored texts""" + return self._collection.count() + + def get_collection_info(self) -> dict: + """get the collection info of ChromaDB""" + return { + "name": self._collection.name, + "count": self._collection.count(), + "metadata": self._collection.metadata + } \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 55ae7c50..86e9e407 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,9 @@ classifiers = [ requires-python = ">=3.10,<3.13" dependencies = [ "agentscope>=1.0.7", + "chromadb", + "httpx", + "tenacity", "trinity-rft>=0.3.3", "loguru", "debugpy", diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index f9acfbd2..6b36cfb9 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -18,6 +18,14 @@ astuner: temperature: 0.5 print_reason: false max_thread: 16 + - type: deduplication + enabled: true + params: + similarity_threshold: 0.8 + db_path: ./.similarity_db + model: text-embedding-v4 + api_key: null # load from the env + base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 task_judge: # ✨✨✨✨ 编写并选择评价函数 From 299968a8f4b477cd0fa45250b0bddbdd8d1802e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 4 Dec 2025 14:33:11 +0800 Subject: [PATCH 235/462] merge TaskReaderRouter and TaskReaderRouterV2 into one --- astuner/backbone/native_compat_trainer.py | 5 ++- astuner/backbone/trinity_compat_workflow.py | 5 ++- astuner/main_verl.py | 5 ++- astuner/main_vllm.py | 5 ++- astuner/task_judge/rm_auto_grader_judge.py | 4 +-- astuner/task_reader/__init__.py | 33 +------------------- astuner/task_reader/data_generator_reader.py | 4 +-- tests/data_gen.py | 4 +-- 8 files changed, 23 insertions(+), 42 deletions(-) diff --git a/astuner/backbone/native_compat_trainer.py b/astuner/backbone/native_compat_trainer.py index 1289c119..986ca005 100644 --- a/astuner/backbone/native_compat_trainer.py +++ b/astuner/backbone/native_compat_trainer.py @@ -1790,7 +1790,10 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): def get_eval_dataset(self): from astuner.task_reader import TaskReaderRouter - task_reader = TaskReaderRouter(self.config) + task_reader = TaskReaderRouter( + self.config.astuner.task_reader.type, + self.config.astuner.task_reader, + ) tasks = task_reader.get_validation_tasks() self.main_val_dataset = tasks return self.main_val_dataset, None, None diff --git a/astuner/backbone/trinity_compat_workflow.py b/astuner/backbone/trinity_compat_workflow.py index 67b7ff52..13542502 100644 --- a/astuner/backbone/trinity_compat_workflow.py +++ b/astuner/backbone/trinity_compat_workflow.py @@ -223,7 +223,10 @@ def __init__(self, config): from astuner.task_reader import TaskReaderRouter, task_to_standard_dataset - task_reader = TaskReaderRouter(astune_config) + task_reader = TaskReaderRouter( + astune_config.astuner.task_reader.type, + astune_config.astuner.task_reader, + ) dataset_segments = [] if "train" in self.split: diff --git a/astuner/main_verl.py b/astuner/main_verl.py index 0c942a97..0ece5c48 100644 --- a/astuner/main_verl.py +++ b/astuner/main_verl.py @@ -241,7 +241,10 @@ def run(self, config): from astuner.task_reader import TaskReaderRouter, task_to_standard_dataset from astuner.utils.process_dataset import create_rl_sampler - task_reader = TaskReaderRouter(config) + task_reader = TaskReaderRouter( + config.astuner.task_reader.type, + config.astuner.task_reader, + ) val_dataset = task_to_standard_dataset(task_reader.get_validation_tasks()) train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) diff --git a/astuner/main_vllm.py b/astuner/main_vllm.py index 145cd355..dd1c77b2 100644 --- a/astuner/main_vllm.py +++ b/astuner/main_vllm.py @@ -103,7 +103,10 @@ def run(config): from astuner.task_reader import TaskReaderRouter - task_reader = TaskReaderRouter(config) + task_reader = TaskReaderRouter( + config.astuner.task_reader.type, + config.astuner.task_reader, + ) tasks = task_reader.get_validation_tasks() print(tasks[:2]) cmt = parallel_env.rollout( diff --git a/astuner/task_judge/rm_auto_grader_judge.py b/astuner/task_judge/rm_auto_grader_judge.py index e9b95184..4b954f83 100644 --- a/astuner/task_judge/rm_auto_grader_judge.py +++ b/astuner/task_judge/rm_auto_grader_judge.py @@ -169,9 +169,9 @@ def _parse_config(self) -> AutoGraderConfig: async def read_reference_samples_from_dataset(self) -> List[Task]: # read dataset from config - from astuner.task_reader import TaskReaderRouterV2 + from astuner.task_reader import TaskReaderRouter - reader = TaskReaderRouterV2( + reader = TaskReaderRouter( reader_type=self.config.astuner.task_judge.rubrics_auto_grader.input_data_type, reader_config=self.config.astuner.task_judge.rubrics_auto_grader, ) diff --git a/astuner/task_reader/__init__.py b/astuner/task_reader/__init__.py index 6116db16..4341fae1 100644 --- a/astuner/task_reader/__init__.py +++ b/astuner/task_reader/__init__.py @@ -45,37 +45,6 @@ def get_validation_tasks(self) -> List[Task]: class TaskReaderRouter(TaskReaderBase): - def __init__(self, config): - super().__init__(config) - task_reader_type = config.astuner.task_reader.type - reader_config = config.astuner.task_reader - if task_reader_type == "env_service": - self.task_reader = TaskReaderEnvService(reader_config) - elif task_reader_type == "dataset_file": - self.task_reader = TaskReaderJsonl(reader_config) - elif task_reader_type == "huggingface_dat_repo": - self.task_reader = TaskReaderHuggingFace(reader_config) - elif self.task_reader == "tracing": - self.task_reader = TracingReader(reader_config) - elif self.task_reader_type == "data_generation": - self.task_reader = TaskReaderDataGenerator(reader_config) - elif task_reader_type == "random_dummy": - self.task_reader = RandomDummyGenerator(reader_config) - else: - raise ValueError(f"Unsupported task reader type: {task_reader_type}") - - def get_training_tasks(self) -> List[Task]: - result = self.task_reader.get_training_tasks() - np.random.shuffle(result) # type: ignore - return result - - def get_validation_tasks(self) -> List[Task]: - result = self.task_reader.get_validation_tasks() - np.random.shuffle(result) # type: ignore - return result - - -class TaskReaderRouterV2(TaskReaderBase): def __init__(self, reader_type, reader_config): super().__init__(None) @@ -88,7 +57,7 @@ def __init__(self, reader_type, reader_config): self.task_reader = TaskReaderHuggingFace(reader_config) elif self.task_reader == "tracing": self.task_reader = TracingReader(reader_config) - elif self.task_reader_type == "data_generation": + elif self.task_reader == "data_generation": self.task_reader = TaskReaderDataGenerator(reader_config) elif task_reader_type == "random_dummy": self.task_reader = RandomDummyGenerator(reader_config) diff --git a/astuner/task_reader/data_generator_reader.py b/astuner/task_reader/data_generator_reader.py index 63ed9562..4ca80869 100644 --- a/astuner/task_reader/data_generator_reader.py +++ b/astuner/task_reader/data_generator_reader.py @@ -24,9 +24,9 @@ def __init__(self, reader_config): self.generated_train_file = os.path.join(dataset_dir, "generated_train_tasks.jsonl") # Initialize - from astuner.task_reader import TaskReaderRouterV2 + from astuner.task_reader import TaskReaderRouter - task_reader = TaskReaderRouterV2( + task_reader = TaskReaderRouter( reader_type=self.reader_config.data_generation.query_reader.type, reader_config=self.reader_config.data_generation.query_reader, ) diff --git a/tests/data_gen.py b/tests/data_gen.py index 63f38651..6a72f74a 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -6,7 +6,7 @@ from astuner.data_generator.knowledge_augmentation import KnowledgeAugmentor from astuner.data_generator.task_augmentation import TaskAugmentor -from astuner.task_reader import TaskReaderRouterV2 +from astuner.task_reader import TaskReaderRouter from astuner.task_reader.document_reader.doc_reader import DocReader from astuner.utils.config_utils import read_astune_config @@ -18,7 +18,7 @@ def test_data_gen_main(self): try: config = read_astune_config("tests/data_gen.yaml") - task_reader = TaskReaderRouterV2( + task_reader = TaskReaderRouter( reader_type=config.task_reader.data_generation.query_reader.type, reader_config=config.task_reader.data_generation.query_reader, ) From e2e87bb4b4d1ea68af7e4fec7ea34983cb229fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 4 Dec 2025 16:35:42 +0800 Subject: [PATCH 236/462] re-align trinity parameters --- .../trinity/config_auto_convertion_trinity.jsonc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc b/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc index a91560cc..e5c2569d 100644 --- a/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc +++ b/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc @@ -19,8 +19,7 @@ "trainer.max_token_len_per_gpu" ], - - "(astuner.data.train_batch_size * astuner.rollout.num_repeat)": "buffer.batch_size", + "astuner.data.train_batch_size": "buffer.batch_size", "(astuner.data.train_batch_size * astuner.rollout.num_repeat * astuner.rollout.multi_turn.expected_steps)": "buffer.train_batch_size", "(astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine)": "explorer.runner_per_model" } From d9755a28e61aa9e8485d7bc44597c9768b9bbee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 4 Dec 2025 16:39:39 +0800 Subject: [PATCH 237/462] fix test expectation --- tests/config_test.py | 5 +- tests/temp/sample/yaml_backup.yaml | 202 ----------------------------- 2 files changed, 2 insertions(+), 205 deletions(-) delete mode 100644 tests/temp/sample/yaml_backup.yaml diff --git a/tests/config_test.py b/tests/config_test.py index 4f50ae7b..42e480c5 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -49,7 +49,7 @@ def test_config_alignment_trinity(self): ) with open(temp_yaml1.name, "r") as file: to_config = yaml.safe_load(file) - self.assertEqual(to_config["buffer"]["batch_size"], 960) + self.assertEqual(to_config["buffer"]["batch_size"], 120) self.assertEqual(to_config["explorer"]["runner_per_model"], 128) # Test simple field mappings self.assertEqual(to_config["project"], "unittest") @@ -64,7 +64,6 @@ def test_config_alignment_trinity(self): # Test explorer/rollout mappings self.assertEqual(to_config["explorer"]["rollout_model"]["tensor_parallel_size"], 4) # Test computed values - # (astuner.data.train_batch_size * astuner.rollout.num_repeat) = 120 * 8 = 960 - self.assertEqual(to_config["buffer"]["batch_size"], 960) + self.assertEqual(to_config["buffer"]["batch_size"], 120) # (astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine) = 256 // 2 = 128 self.assertEqual(to_config["explorer"]["runner_per_model"], 128) diff --git a/tests/temp/sample/yaml_backup.yaml b/tests/temp/sample/yaml_backup.yaml deleted file mode 100644 index 56833299..00000000 --- a/tests/temp/sample/yaml_backup.yaml +++ /dev/null @@ -1,202 +0,0 @@ -actor_rollout_ref: - actor: - entropy_coeff: 0 - fsdp_config: - optimizer_offload: true - param_offload: true - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - loss_agg_mode: seq-mean-token-mean - optim: - lr: 1.0e-06 - override_ppo_mini_batch_num: 1 - ppo_epochs: 1 - ppo_max_token_len_per_gpu: 18000 - ppo_micro_batch_size_per_gpu: 1 - ppo_mini_batch_size: 16 - use_dynamic_bsz: true - use_kl_loss: true - hybrid_engine: true - model: - enable_gradient_checkpointing: true - use_remove_padding: true - ref: - fsdp_config: - param_offload: true - log_prob_max_token_len_per_gpu: 18000 - log_prob_micro_batch_size_per_gpu: 4 - use_dynamic_bsz: true - rollout: - custom_dataflow_cls: - name: '' - path: '' - enable_oversample: false - enforce_eager: true - gamma: 1.0 - gpu_memory_utilization: 0.9 - log_prob_max_token_len_per_gpu: 18000 - log_prob_micro_batch_size_per_gpu: 4 - max_env_worker: 64 - max_num_seqs: 10 - mode: async - name: vllm - ppo_micro_batch_size_per_gpu: 1 - step_skip_action: 0 - submit_oversample_multiplier: 1.5 - temperature: 0.9 - tensor_model_parallel_size: 1 - top_p: 1.0 -algorithm: - adv_estimator: grpo - task_norm_patch: false - use_kl_in_reward: false -astuner: - backbone: debug - context_tracker: - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - context_tracker_type: linear - max_env_len: 4096 - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 120 - debug: - debug_first_n_tasks: 1 - debug_max_parallel: 1 - debug_tensor_parallel_size: 4 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - execute_test: false - execute_testing_lambda: '' - experiment_dir: tests/temp/sample - experiment_name: sample - model: - path: '' - project_name: unittest - rollout: - agent_madness_reward: -1.0 - agent_madness_termination: true - agentscope_disable_toolcalls: false - agentscope_learn_protocol: tutorial.example_math_agent.math_agent->ExampleMathLearn - compute_madness_checklist: - - nonsense - - wrong_toolcall - gamma: 1.0 - max_env_worker: 256 - max_model_len: 18000 - max_num_seqs: 256 - max_response_length_in_one_turn: 4096 - multi_turn: - expected_steps: 1 - max_sample_per_task: 4 - max_steps: 30 - n_vllm_engine: 2 - name: vllm - num_repeat: 8 - temperature: 0.7 - tensor_model_parallel_size: 4 - top_p: 1.0 - use_agentscope_protocol: true - val_kwargs: - do_sample: false - num_repeat: 1 - temperature: 0.0 - top_k: -1 - top_p: 1.0 - task_judge: - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge - judge_type: customized_protocol - rubrics_auto_grader: - aggregation_mode: keep_all - answer_field: final_answer - dataset_file: - training: - file_path: tutorial/example_rm_auto_grader/rubrics_train.jsonl - generate_number: 1 - grader_mode: pointwise - grader_name: auto_grader - input_data_type: dataset_file - language: en - max_epochs: 2 - max_retries: 3 - max_score: 1 - min_score: 0 - model_name: qwen-max - num_reference_samples: 20 - query_field: main_query - reference_field: answer - sampling_mode: all_samples - success_threshold: 0.7 - task_reader: - dataset_file: - training: - file_path: /path/to/training/data.jsonl - validation: - file_path: /path/to/validation/data.jsonl - env_service: - env_action_preference: code - env_type: appworld - env_url: http://127.0.0.1:8080 - training_split: train - validation_split: dev - huggingface_dat_repo: - dataset_path: '' - training_split: train - validation_split: test - type: huggingface_dat_repo - trainer_common: - algorithm: - adv_estimator: grpo - task_norm_patch: false - use_kl_in_reward: false - fsdp_config: - optimizer_offload: true - param_offload: true - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - logger: - - console - - swanlab - mini_batch_num: 1 - n_gpus_per_node: 8 - nnodes: 1 - optim: - lr: 1.0e-06 - save_freq: 99999 - test_freq: 99999 - total_epochs: 99999 - ulysses_sequence_parallel_size: 1 - use_kl_loss: true - val_before_train: false - val_pass_n: 4 -data: - filter_overlong_prompts: true - return_raw_chat: true - truncation: error - val_batch_size: 100000000000 -defaults: -- verl_default -- astune_default -- _self_ -hydra: - searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl -trainer: - critic_warmup: 0 - experiment_name: read_yaml_name - hfmodelpath: '' - logger: - - console - - swanlab - n_gpus_per_node: 8 - nnodes: 1 - project_name: astune_default_project - save_freq: 20 - test_freq: 20 - total_epochs: 50 - val_before_train: false - val_pass_n: 4 From daea1107a50586dd118d1b0edfedcace4313dc61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E8=BD=A9?= Date: Thu, 4 Dec 2025 18:09:08 +0800 Subject: [PATCH 238/462] improve dynamic import --- astuner/utils/dynamic_import.py | 46 +++++++++++++++++++++++++++++++-- tests/test_dynamic_import.py | 28 ++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 tests/test_dynamic_import.py diff --git a/astuner/utils/dynamic_import.py b/astuner/utils/dynamic_import.py index 63ae8cd7..eb9f1f8c 100644 --- a/astuner/utils/dynamic_import.py +++ b/astuner/utils/dynamic_import.py @@ -1,7 +1,49 @@ import importlib +import importlib.util +import os +import sys def dynamic_import(module_class_str: str): - module_, class_ = module_class_str.split("->") - protocol_cls = getattr(importlib.import_module(module_), class_) + """ + Dynamic import of class from module + Supports two formats: + 1. module.path->ClassName (dot-separated module path) + 2. path/to/module.py->ClassName (file path format, can be absolute or relative) + """ + module_str, class_name = module_class_str.split("->") + + # Use .py-> as identifier for file path format + if ".py->" in module_class_str: + # Handle file path format + file_path = module_str + + # Convert to absolute path + if not os.path.isabs(file_path): + file_path = os.path.abspath(file_path) + if not os.path.exists(file_path): + raise ImportError(f"Module file not found: {file_path}") + + # Split module name + module_name = os.path.splitext(os.path.basename(file_path))[0] + + # Load module from file using importlib.util + spec = importlib.util.spec_from_file_location(module_name, file_path) + if spec is None or spec.loader is None: + raise ImportError(f"Cannot create module spec for: {file_path}") + + module = importlib.util.module_from_spec(spec) + + # Add module to sys.modules to avoid duplicate loading + sys.modules[module_name] = module + + # Execute module + spec.loader.exec_module(module) + + else: + # Standard module path format + module = importlib.import_module(module_str) + + # Get class + protocol_cls = getattr(module, class_name) return protocol_cls diff --git a/tests/test_dynamic_import.py b/tests/test_dynamic_import.py new file mode 100644 index 00000000..936598db --- /dev/null +++ b/tests/test_dynamic_import.py @@ -0,0 +1,28 @@ +import json +import unittest + +from astuner.utils.dynamic_import import dynamic_import + + +class TestDynamicImport(unittest.TestCase): + def test_successful_import(self): + cls = dynamic_import("json.decoder->JSONDecoder") + self.assertIs(cls, json.decoder.JSONDecoder) + + def test_successful_import2(self): + cls = dynamic_import("tutorial.example_math_agent.math_agent->ExampleMathLearn") + self.assertEqual( + str(cls), "" + ) + + def test_successful_import3(self): + cls = dynamic_import("tutorial/example_math_agent/math_agent.py->ExampleMathLearn") + self.assertEqual(str(cls), "") + + def test_invalid_format_raises_value_error(self): + with self.assertRaises(ValueError): + dynamic_import("json.decoder.JSONDecoder") + + def test_missing_class_raises_attribute_error(self): + with self.assertRaises(AttributeError): + dynamic_import("json.decoder->MissingClass") From 748da7647f070630bc7aa23ae06bc732ca82bfa0 Mon Sep 17 00:00:00 2001 From: Kanaricc <46213939+Kanaricc@users.noreply.github.com> Date: Thu, 4 Dec 2025 20:21:14 +0800 Subject: [PATCH 239/462] update docs (#9) * docs: update docs * docs: fix images, formats, typos * docs: add hyperlinks to documentation sections in quickstart --- .../_static/imgs/example-appworld/after-1.png | Bin 0 -> 782030 bytes .../_static/imgs/example-appworld/after-2.png | Bin 0 -> 646150 bytes .../imgs/example-appworld/before-1.png | Bin 0 -> 544786 bytes .../imgs/example-appworld/before-2.png | Bin 0 -> 785950 bytes .../imgs/example-appworld/learning-curve.png | Bin 0 -> 426899 bytes .../imgs/example-mathagent/learning-curve.png | Bin 0 -> 467529 bytes docs/_static/imgs/example-mathagent/log-1.png | Bin 0 -> 757385 bytes docs/_static/imgs/example-mathagent/log-2.png | Bin 0 -> 361038 bytes .../imgs/example-werewolves/banner.jpg | Bin 0 -> 2984326 bytes .../example-werewolves/extended-curve.png | Bin 0 -> 187547 bytes .../_static/imgs/example-werewolves/graph.png | Bin 0 -> 654956 bytes .../example-werewolves/learning-curve.png | Bin 0 -> 98454 bytes .../_static/imgs/example-werewolves/log-1.png | Bin 0 -> 589738 bytes docs/_toc.yml | 65 ++- docs/en/component.md | 1 + docs/en/concepts.md | 1 - docs/en/configuration.md | 524 ++++++++++++++++++ docs/en/data_generation.md | 291 ++++++++++ docs/en/data_pipeline.md | 117 ++++ docs/en/data_tracing_feedback_training.md | 113 ++++ docs/en/example.md | 2 +- docs/en/example_app_world.md | 27 +- docs/en/example_math_agent.md | 15 +- docs/en/example_werewolves.md | 38 +- docs/en/installation.md | 97 ++++ docs/en/introduction.md | 136 ++--- docs/en/quickstart.md | 355 ++++++++++++ docs/zh/component.md | 1 + docs/zh/concepts.md | 1 - docs/zh/configuration.md | 520 +++++++++++++++++ docs/zh/data_generation.md | 283 ++++++++++ docs/zh/data_pipeline.md | 115 ++++ docs/zh/data_tracing_feedback_training.md | 113 ++++ docs/zh/example.md | 4 +- docs/zh/example_app_world.md | 168 +++++- docs/zh/example_math_agent.md | 164 +++++- docs/zh/example_werewolves.md | 162 +++++- docs/zh/installation.md | 95 +++- docs/zh/introduction.md | 94 +++- docs/zh/quickstart.md | 343 +++++++++++- 40 files changed, 3666 insertions(+), 179 deletions(-) create mode 100644 docs/_static/imgs/example-appworld/after-1.png create mode 100644 docs/_static/imgs/example-appworld/after-2.png create mode 100644 docs/_static/imgs/example-appworld/before-1.png create mode 100644 docs/_static/imgs/example-appworld/before-2.png create mode 100644 docs/_static/imgs/example-appworld/learning-curve.png create mode 100644 docs/_static/imgs/example-mathagent/learning-curve.png create mode 100644 docs/_static/imgs/example-mathagent/log-1.png create mode 100644 docs/_static/imgs/example-mathagent/log-2.png create mode 100644 docs/_static/imgs/example-werewolves/banner.jpg create mode 100644 docs/_static/imgs/example-werewolves/extended-curve.png create mode 100644 docs/_static/imgs/example-werewolves/graph.png create mode 100644 docs/_static/imgs/example-werewolves/learning-curve.png create mode 100644 docs/_static/imgs/example-werewolves/log-1.png create mode 100644 docs/en/component.md delete mode 100644 docs/en/concepts.md create mode 100644 docs/en/configuration.md create mode 100644 docs/en/data_generation.md create mode 100644 docs/en/data_pipeline.md create mode 100644 docs/en/data_tracing_feedback_training.md create mode 100644 docs/zh/component.md delete mode 100644 docs/zh/concepts.md create mode 100644 docs/zh/configuration.md create mode 100644 docs/zh/data_generation.md create mode 100644 docs/zh/data_pipeline.md create mode 100644 docs/zh/data_tracing_feedback_training.md diff --git a/docs/_static/imgs/example-appworld/after-1.png b/docs/_static/imgs/example-appworld/after-1.png new file mode 100644 index 0000000000000000000000000000000000000000..493b083ab48bc8b79b2b820486c4c63c9f6cc037 GIT binary patch literal 782030 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

7wd;nHlb^lLn1gbG;EXaF!|NhSWQFKB8n*l&E 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

YCgDj=~I9c5Ek#ao5-IO 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

wrO++#VX1zek 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

    s3VVjoSF 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�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

    3jZ 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

    l^5TD@F>GiLSogyUjSX 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

    @Jrgqxw~WfVsLEyGQr-rPS>W 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 literal 0 HcmV?d00001 diff --git a/docs/_static/imgs/example-appworld/before-1.png b/docs/_static/imgs/example-appworld/before-1.png new file mode 100644 index 0000000000000000000000000000000000000000..97f44f89e68f623b5bde7020566d8498050c5897 GIT binary patch literal 544786 zcmeFZeOQv&{{K5|_vCMOqwE=HSDIn%O22b8W{ok33e-3==JtWgy(=}b)QOaml*j=D zYTT2xv$Xh5rXuKMqC3%iBp-m9%!g6Il)wjsN(A9XD0xzD!NctHyY}__p6mR1&h`DB zefA%~1=oEq)_ULf`mEP_ug|@%A5Mt&`kmkJ-h1youb4w$9ewY;-vaNw_nU|RW4-&A z>Q6rS*!{7Ncr^OU_nO51I`@~~;ts|ieDA%Mk`1e;-*H4@XMeE@7(x_lwk;dG5H@GA3chld0_B}8}j)geuvh4|osl=q zR~yzNaUW_*X@?+#*w1yAUs784*!Yz4XX-M;OGl?Xlkm6G56kG%z}Z^W_%HiCcoKG; z)v^(m!tN(O`*R^XbUkqpRqL42mf)=k9*R$KVNM}4O zL&VXCusi}a-d4A{lcI}0KOXN0=Ea4MISfO8#t@FQ&1bRTaj*qM#@-@B6y<>JP7L?B z@(!s*^m5ogP?Xs$;|l_*i65p2Ecd_A1v>8@tMffevt|CB%dekW+ArQx=VxK>A&@6rnMdiX0S{_v83{<%SKqU#a--9XxdYACSctE+RIF*)5KUS zU)VqL@JLAC0#PaC)3fWj(R65a8GTCPT%3y&p-GAfZK36A0l{8PEJu|j7Z|jWEfEDA znkWromCoTloSNH9z${Q7w%rAJ^96L2-bk>BC6(dnup|y0l`Y-SqAHoR%P?M6%b>)= zG9ChUiD)dHoqLPwC@58yniioK_e^My+$eFff-V)A+Dvw!hD}*5-cI$`EPg;EkYstH z4wgg`J?p%wTp=e$HwFR|lIWY1?KbcuQ0Zu>VMABQm$8m-(RO}GsM96Q#c&|wTb2Z~ zh2n1=k=gHBIOaa%Tbj*DM@kb*IQue7p7kPYOgwS2k$=~`vQpn8dJ%yp=-rag94qy1 zG3e-YRSFs=o!EhfjKzu!T9+-iPQ?i~>dXfzQ9?d-tSgQa9gMOO*^^s^5}~TOh@yWN zdexA7j~`?ayi6K)%JNX?0FoU}(Q4zjwp27?&;c<050j>70~O$2rBKw`brfBhQ=vkM zEnwmRl7>1&7_?u4gqP{e_0I?BVxOL8_9;7PJ&Zxp`%97DX4_wd{BV4iDp{=6-Z#3w zF|GDC>^R1>>a_R25&Rx>UZWA5(!-dN)yM-O&Q=aMGf+-v=pS<>o;t4;rSYKla~iZ` zc~U}7&tFD?bP-hFFd*67I&fOa9*JbL0JJ9Sqw#lXG@xfzW6q%pl z<#y`c`7!h8F-|vI2h;5&{Zw>rUWZp&cOw08(oEFK8Tv_<{VRMPDh2|Jp`Ih3&&qtb z9*Os|=}VFK@)lOkJjA3*EEN~;gujUDT(ZDSlsnLyq1m5v3PRC)#MGZ)2u^KLMJ=+k zw{w5%UkceB>#3wcXdJ>)(DstsgrmfV$5btBPa!)h@{utm{l2hrjIcallNR}+f`u86 ziXVrjU{n02+`%)sP!OI8sq?1@r}T;PP(ff-ZGxqg7fBoKVb?~_6<3S|sYXg}nAvCJ z#X-87z^szs=HQ#>URL9HPqABDJrli=s&m!`pd8CgI2uG5JjNDkQZeKAbH9n#FbSH0 z=VVNKpq6Pl%&Z-lVzi3C^saqWgBraos5M*m%OodF(mw&)?BN@fG1SiE;td_Lr!uHD z6`de&$?yNZ$$4trkIPP$VA{?eogp$e_VT{1s({)?pDN1xrr7JKF+$|T&Ai2E2vU2oV`#pSlpH5Bf#WX~>n(%XdTHbEY?zQeoIR&R3TcHa_& zZoIhY$&`gzr4)L_*UV{lW&5l1!GP5Ah~TXe?-biUoQw^}U^1K|)&yR=cV2VbtEzS! zb-wp7e(Sl#BP#3M#jRA_XA9GiKwhrC!MeKtMqmdLp7nGlS=OLCt@0nKieWAKJ}SG& zX7@YFfvV)Jt!gapX+)O9_6xa27Ct$BUkD87!foOcV;uo;$#c>~U?po~d^R;_{Cj>! zW8%a!A>v*HGi)aGRERDTdD9vykLVZ=9~6kc&mU(m{%HP^M|#u|O_P^QkPKBV)p+#1 z_WlO0%slZ~h18~~eV>3&;?@<>h*_Uj~ z`@-7CzFKZMT;>{6Ld`OG_9Fia!4fK=?Js7e>~s0VOt(5AtJzZ6a5p(Y=BJ(Z`FA1z za+-wuyN0?~L)($RUBO*!0C8uTtXKglr$nhVm}r^?&-At8=1IHFTt7r!h*WKG(utZd z;c5E3--#;fp-E& z4@T;npN2+PP8T#IiKa%6Tv33uT4Il-te`-(CG0>d@|E_S@{Rr3ZP^xLo(P4g{B>Oa zr{Kcl_uv@h|H&fgk_uLl*en<`!Ev|dsMdT=eW+1Lr+?A0f~9JdNuF=$==y^kQ<-In zW*gGwUhbwmkxcbIHx=#R!8K|+E$@q80V)VlMgbI1fq>S$m%yfM`v>&Vp)drbN=vO# z5ybujcD)I81gD@mSI=de1-21En|Gg+ez*{&3enAj2Ij=vdnD^+P8<1#3KE@67#VUp z)aQOBRZQLx2p@P`c%1G;he*lRyGCL0%F0p?pQn3)XOfOZmpTv(r$I6scLtQMV z;$spk=?7Mo4*b1zwc z2`3cJXAHE|L^nuTXZ44aRANeZx60k36T2-!w3sP%Q+^rv@LH>M73Zi zz?-VLk~NUK0AD%NJVX(9q-8fAw4eTE7j9Qasd7B@r!#t7h~1C7_Eq-yeL=O8(isC8 zOhS}x9mC$S%Fc~GX`c(TR2H=lVP1g;V%eHgU1c4?jk`mp7CY6I{!;6xWwKriKOm zI`r)d%h`~#BKG-lkGx~zZ#~<~G6k@d(7lUc-p)Xk0hT1`vc=wnEuiAM)Qz-4~S;6zYcgeqq&Lr3>8nq|E2mO8*1L{uZ z9Xq-~7mVDIT}QX&HRn1owSma#4b#oIO3P)|kHo2Ui@TBtqp}a%7iYyzbJ2uryLOf(q*`8yVJ-&gI`~_b)ZJ2 zt`r0U2syo>W&Lc?r)8`krC(BFCD$q%I06Np$IFCC!9$Wq#1 z9uv3b#t2KJSf-VQ7fDYP8lU~=aC}Z4Gb#l14RBSFo{YW%m3HAXbZ1#$zaq(V$?|*m z{Hqq?j1*tkX^poPQ|Y^N4D*Xww(N;w&cm8-2#(?;;ukdArLf^Dl#g(`vvIz~yGo19 zYTctr&G##m{nU=Ee#y(j_u;huMnolw8o`=R;C!GerOTF1xC1|Xf6^v%Q-tR~ z6d5W!L8C@F#w2qeMjusWN*-(ZZ~C!H_L=4{Mwh$%vMqIzdobJtj!@L5(1pIDm z0%K$)GZ08ulC)3mxyMix`S%YAghK%iGVApreWk(IzIseCIXp9AcvTFOsdWgObGb`X&*&J*8% zY{g}cn&GB`LFfeMMLfe{dprfn&f7!!UU`ycC#F#@ENv)%i@e-qwejY)4`iz2;L5E& zKbpN^JAZ(O9uT&KDqn%yfW>IT`42Vh0(Z!m*S=4Ms^-oyusOJDkz{TR-7&&VGcF1K zOR)yRYwCNcz+%dahzH|?4zZG;jj9Q`P)uifY`+ME88U9^PSu!JSQ5*3w z-ZIO*s(|uc{$RiOyFyc8BR`;pzwaJ(iPq3^m$S)0E+}bplDn#|xKJfgYtqj-^sZt1 z--o)SA5e(aSqV+|v_2L|BCHXsL3q2UGE@X}qVY^xNZoSGgiGWTg zWbC!8!J`@O!zRtkP#kE^i|}yLphd2RZ&A*?GSgp}#0DRWM&H8$#|twU8&n<($plq0 z9h>c>b#P3F8eimd{PL&@2hp%4V$MqlX;squl>MiSL-q&#?!z8w-yy{|?fj+n4lvT& znK)eFnBSv%7^poOv@rTIA8mi&IpEqT^c?F@3OiPNr4BF~t-5{Uz6k|W+a6oBlkiLZ zTM7a)1RMw(oc=1Dvo$T-6-d(W_rwWh9iytJ6RX#M)jj@nh z&fo$_HC{l&uaFz8_Lp?wj+Sp!wCusfTtL!7Fcia=QG*olBkGpIt{{~=ey@<9vIp#8 zGn}#+-vyI7%z_Cv>&kixnk!hbRn_q0DyO0h>JO$YLl4L)plr!}6fiw>7DT7t6oS&y znK>CJLpAA3cuOm_+IGm~o3FXSql#prnW&Jjk3`lq!BQm!OKitL*7NR*=&6bBX8SM4 zwzg_-**5-zKf2E}MFZPmDe%mA!*xL;2HGkww1pN4roW;N$-I{Yv?+ALZrKBHh%KWD zj(55pjr?~0;~hg&$`>#qG8xh^)x8~`jxl^oTPhVm+c^ls%fRW_&P#54aM+cb+_GmD zV{118g4Vwj8M^KZo^Op2+io?L11~6tMrB?}KGgIOfLUa)Ry#*dH-GU0+uBiBKuEKd zO#F?cqqlNNX{H}};hB=Hi^0Z2d7b$eM^Bc>qOv=41}i3gs7aj2%x2F;oHw=Oy6p~c ztC|YBN$Xf+?605&Qku`XtsCQ6LT>b(Ho<+ohSCl_+D3|!^|2?19qR2=_}j957I&pY4BBnqu7&YVlo^Al$#yGt>hDoD#S7(|TRU;oX!(fsEVA|taJBI| z^06+SKBvbcq{W#XDt>xv0a58Jw`8UYenUA8ursQq$QE_Gp;(y6Z_5 z;$mY7JhPEqft}i5@xunlw!Z0Oc*31e+bi_o;KA4_B-jMM2@mO zWM6dU^3_K0n~b;4Q)rw+@cnuL4M&4?!QR$k469#>Ytw#;HWs-ejUHBU0&S?m(*a%x z2qFo$Ta7*)%2G4sce&zc?W(BwV$i9tLkY6d(rB0EhW8L>dwCYpWMb z&uA>^%2lb`kD)|~flvDokO?{jw$EsPSn06T(XJz=`{0?gaKA#6Cy1CZ{bB#YVgx`P z8rG1Z8%{lssO4}~YSszs?Np%{Mig zw)593E!V3!gXNZ3%b;_NGeE0WPBnxinGY}mjB~YOc&(E5lWa>K7PDPUzGtJ>U(Xe# z%}TlO#n_P-fx_*8@Wti=^rWPm-duf{fx4{~833x!zmYCM6 zaTBIuAf}3NNC1AtgR6VlU$V@57ww0A=IEmC1`J`k?B4zOf+!j7{=Q}UBTlFji^z3a z<(#A6Evbi|1xsP^ZP$M_P~cbR9HUZs)U8TPUPvj9r8X86h&ES!7B+ z{#P8JNa6+8voNw#!};m4a_b0DmFqmC2euE426b&33{A+(?;qVy@X9MPtmG_aV_J-C zUJvY7>=9_|lzr_%_($^*Ee`;Srpxr09%{9g&S{v64Qk(@u86ra75w#GQMLm9r4H_i ze2HwyK@(yYioDJpkR26N3Z#`l+snTo31(9x7a#dfMNrDr;^ zu?Gj_-29b!OkEA|eTzeW=T;KV>AKluV?>iGj)qh}UfF5?4Y@zYD1Kb7;T<%VB2~Q9 z#ZP6kZ6y9Tzp|ZOA+5Y;%k=6j2kFUgg$=rK zw5Q`C@_9G4(Qnv7QkeEy3LY~(Q-Cp52}Zi?wz@q>c2f~;#w-Hn z`#l{~{HA`t6I$D4*dUvDDxlSPj&iMA>Oq$GQB0hB1++r5tXtUv&m2X(kxesgU#KRi zxDcXIAZUn{{(==ZQm1E_)v@PoyoW98-G1UJuU4)9WKm;8CG@8~)&ojdixLb9OjEt; z?P$t3cqI{UJ?^m83P$Y~<qQqZ{YrQQwDqF;+HQPQyDpR?ay!n}W0{X_qjuBL7Ox^H&>xdeX zlALi!BC|A}AWTP(2Z8-loJSDE1_U#FtcNyZI=MPC&`XM^JX4?kkcpvQ1F3=5>T6{XiFDl1;lU+TX2k@QR>gsary%$+j$Z39U;IhgXz4OMf>7Vi`$K+ za_Pe?R}+Nm2DnxgCTdzD*v?`Tq8y&$*GVvak#6v(aXp~&*9_J zJcfh<-j*?K@xI3#Kf!9~FZx~`^|t~tP~1?70Y5g|{+QnnwM0%zQaI8X42GmesAx|^ zNUj3J!U9)$B0vNoUcjP(bYpSyg*0}b{fg^4y??@Gn3?HbM-y)@1RGwM!4Y4A13F~l zllrBjT-tRq^>#!CgaS2ac^Lg7mm9vsG6`Rmg)@Zy7cGf|#u8N#BCMH1+L!-L@Z%87 z8}Pu|SLnGchHdfu>}3?L_^DI6utL)m!)YaI`%HL-UgJiLUcq2hizgCdGs}Xkwu!{8 zWO07l+t?~}ns>OP0WKRbJ@aSDCEfQT?r&6-1-+wHGk)T{Ye$2&&YT0B(EeBSY|AQ& z*k37(UINco?IW4pB&5Wu#gm0>Pml~SDWI<5R;0EkWch)Z6XLnmDcu6h*-v|m0bJ@x z)sYRxVdgSw4E;j#-86?rO@UWSd^0YfVH7$CF&D4evEu9$-|Jp+0~;YE4`(pO6-r`FoGMP)v+=_$Cl*#h@4&fnA(YOB^hr7In^N;>85J0vT{4fF=HcKBd4+S>0}rrj$vJCZgL zankR>rJX{E1!Dj#NK@cT6V>Pp_&3yh!zMGw$i zxaaI~F-fIle77f+wAZtvf3MYim8I*34Z5(9R<@v6=WT zuL(#GI11s-m@n8Km&e3@`0sQ7_tJ`(;~ENYx%5Uo#EgEYQw!YgTDi@uPU-{1178th z(x?LbFFirB8f^t}F~HMI#afa>$q_RG3yY%Lom#nnNSRP=Y7!oF-Ys$5VpN3LtI#zU6fEZu_M3S&W`*ku;WhK82QV1NJh&Zu9*qsi*yt6fk?*{ zU>)SUCzL18P!yVj;d*Wr+f~)0<=;r?v6}vsF9y3}APu?R}Dy#S=RkVwkVYH31Gg*Gx zZM1E;&I6%3NT5v|XVX#zO)lV}JjJC62DrjCMiakpMCIx);hDe*zQ2R@FaetExj@~y zR(wG;e6O3l=9>+?;pED8n=QA+Pp7sR;mxWQU0TXiGp?$74dl zY)wf~vPzBGd+E5+75N;U$YawbS6Wn_T`(;I5wck5{n$yaA4);z07g%(Wye2<+(5HM zYvkmAsoFuu4sMk_Zm0ywyreR>vBH++dy6%Tdz?>D*5XkjJ8J8aP5bFGS13x`X9KtK zHIYHu2eh$ud^7|`1_sX0I$yEqeg9;xOtwqmG$$-j`y?B>p83H^M07I@xC7RxCLHee z^v*sAnB=ls+-lWFxvTvCn$&LJ-A@lt%UD`Jx*Vgn<4mgCWuYdk5Mh=49*YMk4gEqw_9hL^aJa8H4j29Tq^VF* zVP>()YzI9Ru1Kkx7r-ak3yF@8{>ceUvV&-sMAVo*LWiim@e1jvvscy_Yb>H;fCx{V z`BEAE6o=BUK}c%6$)Nd@)kKx5c{4~WO(C+G=5f@*VG>$_IiIT}kEke4Tz+ivR(1YL~GDMI( zyqK7Wo%Y;%0W=?G^63iMEJUn}{wIRPX>^iVwCS(H=+)lRh{oJRxZRxGw#V&YA$cZ$ z*62*C;|fjhTd9pK3Rf>m65nEI3{kqlelTa0oFI+`t37fU(Cj5y$xJu+6ydzabx!g5 zBo7B`DAL&lYOBWV*EpNf~EonoDaU3mS&rY431v!lChhPcR znHlftO4X_cu7|_v2B+)~c63M161bM(w4}}MH3Mk#eV{v$pTzH(%{uS!e*-k99#18` z?6x^3Iw}?Fz@iAMyw_|Q@k$#XA}zi=-uzHWnN1R$w96jKULH^D5xY~uOWI5YDl0Hc zpxV2Q0{H5qDJJJxl_}D%z&ZZ^eUW}o|bY4|a(Ytts@+yZWlKVqorxYd(8e^2unc?==oX`}`rlUc^ z5NbcARxZc}L}{4^agQR6W?0Uydu!uCEuo`9pKq>Ni`b18G&a6S;d*?cMV8 zB|oWBo4=di0_pHEtv#^rKwrqKT7D$rv-2L(RUN=_kp=;rhEOe(pMBVmpys!pO*p!> zxe>o0Fj;{j6qpMfELnbQT^>NwY0LKm+OZb>1ej*`;0U1hCq>QCXk#w$K?$vo@??|q z=hN~4!Rnm62&rBNd{jdF`Nc?v>=|_F10aRI=4bnM_fT>XgiSZMe` zauQPT%0uoUTHXXPa}!dD-$|YYxbC%?R_-;gyqqw7`nKoQZ$w4;P4cy&G^jqmYa-Q~ zzf2=zCe1w`WjOj3YVDidy!;YaM*ii{?4WpCE1@w^dku;7P#$P*xf}Yq?qzP?@oe4} zoWvo`7c0U#N=Z3@@=h0YEd0^cJsqR6rp)2td%}J2m9FJK0kavSlUrXEPscC?hAj_= z5a}4nW%wAralSZ?LSiX?Oa}U=+ECW2Pj)$9 z^gY6Hiv2|BCC{+?m&P+g!2ayKTay!^ue>aNc*G7Sc56`n16g;jtr0`hj@(S#kfiN2 z2A2ctcpmtLqci6g|J2!AtlL6la&9!YE0MC|*>&Rjs{K>L!j=lw4x8n}?>q$k$>PD< z;{!vf4IMcwB#@{=5a*;{%DQ;eSPkU>@WiiM`bA35o#2pvd5KIn>BAwOw)9OGh-_;k zj)!qdF{x>;`81)@W#e;RnlTec?%P`ez?Pzll26Qv?Li4AJB({bBuT56UT&cqaPrDY z@CI5)e{;xu8bj4|<40Z3^J#jA#pHTMTDrn{Bz!j`%B5-U?>WJ6AUQ2U!;kXjhYa;| zV0eu|NaY&WdabRdWt%lVg#46ZsJeBv$yH;0!?51~f`MPGtIcaR>!ND)CGdU#87$OR zs=k}0C`8M8Yb(K3XN^yLt0oPBYjy`i_$oyXOxmZ{+ELoGMqV`Gv35XsLGacG)5xLE zZ^^N^;B-5e$5>5eJZfS*F+)r%K_$IYlxO)2$7|#(`@qO+`rK|A4*jkLcmbh}ILew& z0>5Z`&k5cTO(a{y(t52TI>)Py?Y5y$RE|B{(XaE6a-Gshorivr@SMU8$;1>3s9Z8o z?X>1Jv;TtoED7y>k@u|-*_d068!0iHmE)UZftTeNoH&hdE8Sv zqxzdQA#ISonQBik%MOCTEEf4te4>@^zmPm!Ks_;cKyoiYs}(%hcUSf>ltXcQ>Zi_s z2`Smkg&gMC63w-cdcNonK$Wl*xzA>-((npx@*V-@SXE1=GiKNe{!MrWSE4g%KieE;SAl%## zftI(|avkqkv(PY%<1z(IX;JDnO!;J(lv&E~vkbw^L)=T>SXqfjD!!Zm!TT@xn&(z~ z`TP6FDI`rIM*0BS7=IYOdM4F77sOp^(6$7geYw`gut{W2W4_4x{ifbm)itgk(w2V! ze%al8l4C}2h?n*_cdZqFuI9W>g?y)>=)aA2%IPY{YdKa#Uy7zL)!Qen5VjbdTNdyZ zA}=Wz2-x~OKb2z%L1)aaVeM&>waJo53&T-HcdvcT;^;o_Bv_H_l_38_Nx?L?k*l(w zwW%ZIGv17=%ONsgZCTyzEJ9__mJ&_Wx2yFbYwxTkv}-%i1UN{}uQxTOw3^}xCmFf5 zYxg;;udUy#vMnzG5$$=9yI=ooN?p^DH$jyb9g>}EPd$6JK5XleB9tj+2|Q(5fzO*c zCmC;dgruleD&;Jl;%$;Mbc`OYIpBrP@wOUnv{fHN)++5s@Bw)YEEMP$sO(9@_hx7g za^nZd*6cy^da%^>Gk6)gOzsnAhS)C*_6noRLVGfJ+WE?S_Xw-8?s+U>1hESw(WMo zzbpPPqIi`vU-l{L6UnM?3bkSA1d^e-%h)u#A#M3*>qC*_Auu1pSb4p=6tcENd2s{V zzNdTPr)R|r%>i9lh09kx5o$jfuy);!>Q=SWHChqD`SZhDKM$aZNZm%8^VD%3T=2v4 zO@QheVtO;A)(_IYUtXXE<+K_dhD}YFo`DyYDk~mHK>-=E9nclKT<)Ci0HjrGPbn|B zO5l)HY{jb_U4V%(=^<|uy5O>o=rvQB(C`j;T|(AV#9G>O$1eo%hi3%wJCqXCh`JoV zPjkKUY_8<2MCJ?4RbnApWuE1{>w|n(^7azi)IDsL!(E1l@(`yZpfSzmz%_1At#JWS zftZmjB1-R)Z%V0#Bj zPEZ&kiAhqvx_XC3*mkTLr!lrivrJdmMJ%)V1W}nR%$Ec#Fo`&CeM4>@rv;RL=^&*w z8=_>@&c9OhPlQ&34~TswHWi|ZPQ=qW^k)K*N^94~(dk1%`0pReLy7s* zJH++_k|^;Cxe-AKR`qBhmZ7dtPpdSnOEO8z-tO#fK5pBNAESSXB%M-GY}aWa7qs?+ zoT$b?kt8z3p&)pTyxVbCsWO>CVjx1G& zQC>*NW+`w6R7WX&R=yi7g`Gv$u)`k_kYJy1(_=GOE!lpIslu^?X-58f&GJXFCX;=| ziC}WlT1{Skdh3Xy%683+95a^^=}^2lW!P?9@u1}yM-C!k3C7S%oa93yBk&__(660y z7_)Vf&!(lTHYiqTW7^+895RJU?xO4|9>mpa5A1eu)x{c;giP7jr&}p!j0x1f73cza z5P>d%X?gQh`|1@GB41O@_6xH6_F#f*)9lt?P?=uSn0l_aAw_~}F}-hGMJ*7oy;R%F zaj_hbcLhQ38wWueogr3h%M4VH778*npNo7`0I@`>S?+*omMsaWt^*ua1ks(S$OMaL zxf{ouLCUuQt?L(qq=}w39*#3<|4lwUz~a6umcWs=2NI|3i9b4B=X9b(Xxx%H)+V@e zLclKXnSkaBJt@#Uu_R-Zj9*bA8PynZ6{4QoKSb*{CT`HlX@XWrQlYKznW$~g7LBYk zZ zS))}5Z!|fs24D#%%NnCa3qdl|+H^^C8Nj$c(iV0I#cr$qvFO#eR z(aMEIPi4La^_!9#rabMllmu4qr4@-xhoq%J-zFGB=d!A-eF)sa)a*r|9Qnwb7t8DF z;IYX0f3w!wzx$YIw81vP`adVf5m{0S4t-?D6z5HoF4&l*`l~RAq&^kj9Qmqh64yTw z4qPXSzwee#%R{NBwkDS)6Y(hsv+)xk#`JEdMzM(BlU@An(mhRBgH=rb>6=#c^VEqH z#f0z!8b&|(v;s?h644?l=8|MSTGsodhK^>O?MZn1o{nFyjb`>!8B;kIGtxC9KPlZj ztll@8dlaa0eswdG@wc8j{$no9$HA7~E`$k|F6XCnd@(>{kQlK+e-xi4F?P0b$V zou41+No))f3^4Bz`ORJR`|b{9RLs@NBEai@L#|Kq;|aMKFwlZ**x`w%%&#-`p+ecR zBn*qVQTjk8WKVejW8Kn{vdNkTwX8FZKd7XA9lGnx#(|%ST%cCLNJY_Yc1{lBd$52y33)=$4q>E>TnxFbl z1eRpoVkVmmLD@UOLCc1v)2b4`7RlU%oQgcE=vX}XCRGHz)^h8 z`Q12WRXS3K{KqXi`t{A0IOv3bP=|5~BRyo}KE_jSP^aNFrkJgW6BD~3-v!yq-?fV= zZ~V3HMB<`_Qq;Ozx}&4 z;y8~4&Q!Vb$E&&xmjG|Z$}iS8%_~A{sK~DAxTVhzTUL^0jc-CZItb&8;LQO2lCx|R z?Kx$>JoW8Z5JT}A{-L}?aKU-M+1X@GOp`m-7)pBE>6wIQSqE!>Xw=fDZkXe}1UC1Tn+pz@nql(08@Xt{JJkqQT_^Jo zx38zzCUyhW1X<@{W-_iPaGBb~cjiaY3}Ss_%xQZ8kM;51^Br_iDv?)i=P3#DXhqr{$OM zh02a#X{~Ik=>r!#*ei}8`Ii*s&NFvX31dBcNEmo3fx|S1kcVPr#~Ie+0qJ<Zca8VT<`_XaFxAuuqUk-wN~%arLEEcE4-_K zW`GyGplEiWbDZYrwDttnYKPlhaA<*|J>Y`%c63j{97QTRp|X5xkNlgegKqB;<j)$wS{q1}L9T~Z!P>hy+2YiuM{{qlhAwz6m)}PKjP==5n31Yb+lgV? zmnDTws;J6KvN*WYY2h^e~ES~?jMXNBtHqd_`mxCSSzzG+1(N&Si?*dvf zl}_m{$`w@+%$`&@0wU?|q~0f0!~;r`*<7Ke8Va$eAg$hAn=FNvXr}8xFnGO-*bl{b zVHR@7tkn8l7VDf1%-WjC*`cvaY;c%0H}^Q}nOslPj=Lj0obIne-hz)bD10edG$3&& zr9LKl54vduYc43EjcqU-lx??vPcLaC`tFeJiDe7#(*tA*oY&_j`!acuw=Q42jx3T$@N82HgmMKr z7_P>SLB<2(9UdKqAdT3U+BlD@88|36)!ZGEyUlqnsg!o>-UKFOK~f3tw%ku(Lwie3 zd~TxaKNdVOJ*xm44{DrHv^#D3l^C(j4Ta=UGtzc2BkO7F6eCcZk2pQbm-o9lFi?^H**@AD71eRtC_{5{!U5F6`?hUBDfJ-w5M#d%B5mc|i@+IL?t*`XdZvnslD|wt=ZHA6 zgEmBZ0$NawCj8I7^cIyq)C)GmT7Dyf;EiqT%k9+FNVV*8g!Xc;N~?uQ?312?C(z8T zc_9m)x{^TWm1LU_QClow1I;4WfBxj&>x#W~q3F(*XHw54-sb7(&Wnj#4fDa=rk*o` z`Klm!LuG1j4nwC~dr|aEVU`P~ENhJ6<+q4oT(rSiRPyTbzLEk~N&% zHp7eE6P^mdt0>wRO?K>s{rP#$S2!faIg^$Qyhw9ZSeLX4o1yXxmCpioX_1g5?=?xg z-;U3OxYqT?1X;w!FdshlXpnA~jS6WOk->JQ>l2gpwEpRTtz#k$--N&J%p~MA3m^RG zepZMnLqzObc~CZKLXNpKixU(uu~%Ny;F%aO$WK2TFf|@edQ`@bv+}x{cG;MME`j6j zG52##3CUVRpSld2F0vm0EBP2;5%UfkPzQ~pZBzZNhL#x%fB6)v{QM_jKtf~N#)6r9v zGY<(_yTAcmElHdZNB{p!<0@wjXNtBoZl$*wfA8-lvnG@?`zhZKzW(+ZNG)J zK%*|)4oz}ztyA!boDNxFY8A(Vvmgu8|B2zZ)Bgzj$5uYJT~o2hOjcY)Z;h5xHNZfz*sZ}m)7%Wp3H$C023|N1O}S|Kg6{io%s zP4~Fm79ZMXER$_Qy=sH3L3`Rx+SJzPs@1;$D|X>)Rl~qJ>KR@>3!mCZ3ej!@5grIm zcb#?IoD{m=J?j~5D3tz5{A9o9;>`c0Olr5S>dZ_izM+uFyU}5s_s>M*wrLaP?N|y5 z-(TH-q7FeSO&;>Sr>Uk@vML>8>^sUa)K>U}FzXCPE}U@xZ7}IV6RAZeU=;fRf1*Tz7Zq_}T{$upOlVsy?~p$2 zl08qh=XtksLQBmJ_~Z~I2bOU-06*pZQ?`+0{i~BeI**F*oRatsk_q&-CPc3LDUZa}@?@9x?8<2PD~Z&B z-c%WTdG)cdtHt$YFv((O7&op-dzwKx_luGC_s%tLkdvC}W z3B=b)YxHK7eB*@B6{+J}u?sZ1XxugHxk^EwFxees;x{)YpYpGBbryPTcM4FZYj__PSToM!R_oLDqLT>nnM z3|NK^*)i+^>*&oHPO^TKWvkaN}HtNN&R4$l@sP&{Ir5D7E(8iz?caW_zKP-pqmHq|3@7NI{7j43f+_ zH2sU1VA2YG(6mV*r_nxF{Y+~p8?j#4v|@3_xmVik4%+#BixVm11VAtbuF@YkdmzhJ z`Xi;uYSt9{sUlXcm~I!WsmUi*ipS1|2YXbI73cS0cQZzl@;JomUd=WBkt5{9a9mET zs5!WfMu~Nt7i^+%RL$)S`#O;lB6Bxf$vQGe4MM*~-Z60^OMuEPd~}C&9^5WUyWqC1 zh6*;=A7DS1KTB0l*h6&_A{Aioc;1d7#E5wIFWt`Fk2VvE#c-_zJX&*SZ|zxv1KWPE zL~PP)vcrpbzAc^Fpj3F7WhjNR#~nP792&kFi@K-0+uSuRiw}*_Q@tB;ijID0?Xhvs zI^jh~x9CBB$-ax;DWU1-C7AA}VRLgHvT=tV}X37WCs-+88Qn$5X5dvZL8pzCtS4oiWJcZITYijpGKWT(JKcQ%+1 zkJ!0#KWb@mOu#+IIC8;tSBdN&L!2AE)`3Lpy1QyI%5kE*GcBwbQar3nPc5AVqc1yi zDq@bRh^LTqO)#6gOQQB#A5h1f!2)V=4RNyKBRrKpP9nx|dLL-rp<~QE#b2+VFVvl1 zsd#vPc0aRLsC`1|PsJPD0f=@=A8W4$Qz-V$QQAka9WvW$EuguBBF9R;MdPZqZ3Hjr zu;;|g672X)cUE8wO>)Ir+#{QGhg-)JX_@h$oo_MjyDC17|E6(qB}P8Fi?(!^J?xGg z5}eAfz6?^wpT{?Kk|yHrIM^P5Z$7WZ9e*rW8bW3ZjRf6n#)nnUWW^_D%*>|BScf_o zS>}$DY>5zdI3ysBFf2cL9;hqdX+?U{_8N6aa7V) zM^uEgqlGEUs5+Wc30!dWP z1riP+ky9da$e92+L5|Pu9QL05`M>zTeV)DNO?bm+Wvy%7x$kxVuIu{#J~ba)0Imo8 zi_4f>ZdgRaeP78lj&_~zgNDg%9@Tk*H`?1pH3+ObDW!>ckIF0i4&wX2(9$d3V zPhFaCz8fh0R4TZWtoch1q!2TmBUB9xYSklOTpTd|qRBXXZ}tm(SEyo_uK_3)RSHW& zX(j5I@=Bj8qlmCv!Q94Y`xO*#I+o14v|;{AWsL9+WPYmn zp`w4TW=|C}pIvh)x+x6@K@%F0BJ)}aZ*2T0c1fbH5a@4_6Wo*!>a2orY_-o?^Q1hm z)4yQP!}3x>q=(@l9&_OrpMr+2GI5llJ|8zWKB}*gkCLM`E*XI+bci9PX$bW?-CChc zuLa*?XS>ejq$w_yzKIpH?^N^7^0sFZ&|`g3!b|AWqK2oZ%{Vq@ zQT@LVaKvgUecP2lWsDMIiUJ0 zjbnNJqo{Cx_JEON7u=vumMkPMqV0k?W9O1K(~l&NnQ8N(13HXq%xqabrmY5v*ZJxc z?j+M8DJM7b7=_AfF`vOh&(k1RyD|tgNbgyaP}lz^Lt}=!%6bRnZjM|7JerK$0fSu| zDOm931&**LJvyjtK25WaW_nwCJeZL*TnSEHFh88rN&h{$|MwyXHdz9dM**Of(KYE{ z#j9`g7Pj4O++}{iQIFvs67rl*22NG?K6HuNZTMXJNa{{9Q}2E=-s(Gran}eM!3pXc zI%QxSsVly6wIwnJ2|sKy2%QR z1Uqzu$b4!Zm@Nemu5`$KGRcF^Kcn79^OaNU&VPa8){i?UlDHC{lb zxDk?unVOa>6>P+a_44vD03j=MJHqAU2~jm^Mf{>v{+XK3#|m_b{MvRwaq9hX`LXb> z$-$^PZ+{TPPd;HhyKh)bmy>2vfO*Z4n~!^G3&EhNeQl?OEx3gZq@v7IdiLbJ9eE z@=LwDYegC>B5#l1i&LsFUNAr0WPmu|dx1x@BuB-H6=Y^2*Tv?sKWCBh=#Tf9`Her_ zz1PZ}+pPx055s9xXGMI_bH9td*1fkC7hck}%i*UBumAQgrM zI5Elq54MZ%NX&D>LHth`A-1$UW#La{FC>`arc&Rlm?eCbxs4pGSd(-z313xvZL6Cy?OLzU>u=M0Sps``mCGEa7_~vy7 zDUD*AUi-uLeL{cRHsrm|Nm$-)D=Md0hvv&Y1%s<@xeXmXMk)4#|3cRb%;ORzoMLn7{pO4~ZvkOdVf^iWrfr!%z>^-e0Wn_9`2*I&e?5YvB&0^OK;3b?&+`}j zbiA*38X_1W!;QM@I{6v;Qj8~Y9ZnuO^9?Na>QmsEn|(ekaFlsrVHfKBGfZ@DZJ2TT zz(7mKu=SR>p3cFLm&2TiFp?{Bs2A6UAYBrg?qUOqj6)+mV>lT7lO^a2;Vv^GVfB#V6I`U^mnWLdaKef8?-9M! ztT=bvR2DskpEP9SeI6O+nd%iW6}5M@!pqEdAS7wFpdP3&b#snmVS-DfXZf6nAoDE;$1xT0PXSSB?jCA;_9wjjv&*}Awva7V(s~yd#Dlx z8FWlW46w`t7bblKB&0z%4AKoEAxuaQYtZ;5tthCBdy(&Q(m`PfGK}N~vIQQi>HhQQ z7QVQ+!PL?KgU5nFN%JEkq%x2wK#+Yun znVw03`Zi~i+k8Zxqpm=e9vpwLl-5l)C07=hcEP;60oRe6*@s|wgEUSx^J*Z2zybj& zMF2lav_Juv4VZ1xj*mz?MyZ$Cy03U`-p>mD9AVxi6 z${u~n&-c>bi8@g0&2~ruRfztk1N4^1hH}}Q3TNG9KD2P3{HMRYkOLp%peTl81(MJR z2Xug9D1s&Mh@Woe=$v{W_hbGhTzKT>d~P+E9>fe{5vGg76(N695JtrGIM@}o+kLWp z6bc9ziKYbk$^W^Fl}3KBkZ`zbxaf{y-z};dny`upL6<}+5RgKH|4iFfI8*=-+j#B! ziVu`aD&Rm@Ss%HZP)v*n^E@7gJf5e|mRIJk&IX5jCeM$YB_2e(kB@96G?|~zVO;6S z@zogp#c^r2_CnC=@jg}qKw3;n6Lbzw+K~K`5aG}pr8gxDnX$3j<+M}(EE?i0BU{yRYbJwQ8bTWf;z zKC7q>NQzzDvRpIQwzS2>^fR)&oMrPL46D6!(WkHsKF3rgh|Khj?m75dQbc9EPunR-n_1i|Yv$o038)TaJ9keIlI6mecLHk2G zK=a@kXG@ZSMyHUee@--(sH{5?{1y~tw^zw~g427QmDSltr4V6lYruaglg z+JVTPhg1)v)XPa{)@=b;LN{32ctNp8KfoSI<#|HVXbcBH4Out<#a(UFnn^Eq>|YTl-UYOPnU~> z&WmZ4WmtKblJ4yF(WeaWF_4Dhr0N15d)9XJ&rb%*Hy>J3l+T4I~ zg{2-0r=SmeTYt-~UE>SCKn=WkKqA_17HB=YCRbOBscWoFi_&7?hylRN`O!OMMxaS0 zv&I1@9j)?%KQv1JB+G#FwgIh8WI;H2SnJZ*oa)>t}HWB0=E4YnS>7QsP|J1R{ z5dw@E%$|83U!vO}W8Q>GN^WM$(^Du5?+$X|m}Kxp*Q!9qH|+G+Z7}#DDKUlD4784w zCoShu`Th$kL^sIw_=u!vFbwvJfj&5p_fUH5GoG=r3#!k!y9ZCUJw+YldRkWJzqpto zo3n5K!t&nSlh7L$Q%^RaC~497DIBUmckTgXj5tYk9)txg^g~9M*Ww=FVnY*^%i=#; z0iV`~CgC}ZS15@vYxy=0uxfRPuV?xe)VaB4w!A?4r2pD-tURlQ>2*)BrrhWTOg!0ex-??#I* z^4CvJm>cr_s`6@F!r~DH#w~J@N%cy=Tua1;Dn@onD~kZb)NRe3o=HIeON9sB+w|Bw z3PgO<&WnFg(-_iy&Py$&ED%SZ#WcQ0BxO@mN}ON(U%r~-d2D)1wqCZi|B1DzH-gvs z%(s{7+{`qhJTb>TBK`6OOI^}~fFaOrB2$A(q8mV{lRPfpUipI5oBSIQF zWQ2MLO8kd?!+XT93{nWxB~Dxz2Ss~Gv|@z^AdJ=ff)L~6Zefn6rljzN@Fn2Fkfgpc z?lXkay!RKVE6`Jm37gm+SfDBqs1fQvJiz;62CqvGF2MlbCcj4whP)!6!bW0kT-1Feo9;?27mox2x91@;LriH1KBGFeALsSzwcgG~JfRZfpW5Hn4pik+Du5~#)&v**C!Y9Eq-faTeTQr+s zOYi@}O{9^w_rt5}jQe{EL(v-ny9Jdn=P6_p$?y+vi1(c2A>v-3@{rm20?azbk+MhO zfc|v}?bh_dnnQO*i2Z%y=r;h1hpF+Q7pTX4@jv`1-eZdi@Ohx_u<4;8Sk!B5W14ya z`72?dJ-D^I+p4u`(mIbU*ji+E^ z3Pb@t{mrl;uqiDeUHbpGaSnDLu-!4r<|D}>%d*HXZS5FgVTPrfVj=t*L9K^sePG)A z<}Wemb50T9l(eGaBP2r7=*8h(V{k$jc|PKcJjoVf%)Dt^rQ1_e%aw-wGX+$jLhT#( zdyV~p3oRva;k;i3StX_O?k8zfgm2-#P(vQIj<&kFZucLbHvQ{nF653Cg^6$;w9cQvt2da0I{tT_J*?e2c` z9h|(d?Fs7Q@R`208ERjlaJJ?ssb?%M>5qDO%Xh%*+eMgso4F8Pca)4!r57quC4`3x z>EnT@3(+a_2(BI>;#>OpHDJptaNE#XeosYRetP$NN}7{BWSnoR;Rnq6mtS7Kp|qKp zA_Qgbi830qGNxy0i2O0=Yyv;=Cqg3;SlAtX@g(4Bv84bOH)Ys^Z1ZZH0pht~&qZkG zD#HhNG=2=s0HY@#McVx<60*)te%OD)ANhyC$qQg5VE(e$^i>9D-kV(Q(u!k)(z_uA-27$6 zXXcmqpD7!0;9&`2q3DP;S@WrZafw?l*d;GM6Nc=``0>(mu}%DezlJa5Zc)ooHDm_4 zBww?~PJLMQGsZTLfm$w4fh;dU8P|<>-uHZLraU#c`?d74^mGi{X5rf{D%gq2+qQIR zDPH&x7JJw2q=#uNGy5~FWzjL7=wAU^ag!Y6T1nnAkyXx)cHn}Zi&O)sVAfS!ZO%(jibww{d(VSJJksJsp%>O0aLVvo`k_ zU(hZt7}p65DM!GI5Y7#u#_!q80hbDJ`3T-b>pv&Ou$yYF;~)%6gT##`un7JHrsi$7{C&wOiw2| zpEV3NXr6Ra{4FSkDO1nEwWG#~x#VrZ^JLn=MDHx!8W;^z#-|)I!{N>E7Li-DTC>gQ z7K*hCiLGnNU`xSC{4UjsGt3@>vWI2x-_JskSE4t6`gDQ#LjZ<2HnV^=_+9?M6JwUb zj9FQHkZI1wrXj^IsrJP;M8<9mzMb})az5sAhWMF%Wzn^Q3rJ6f)m2rvq=0O7LtW!@ zGX`iS)^L_;mGqlN_KuQGk{K77l27DJmoMP1<(5&V0&4@!)DqD|Gx|OZLmUuh*oqpv zZ6YMrIxU^Utn6DjrQv6qbV^Xl+WrVWrWQCaf;CHw&y)+=ExHjSMrABc7?2{;T__u; zl=;q7YujQLK%?Wlbw=V>#{98ffQxvG#N)WqV!_2*r5-Wq28|DINwgQ%fTv|>R#rz~ zFpAC6&lFGi_RwhTwR8#1?zmC9dXHsk%-8gh?ldS!FntE-0L|y6owf)DQzU?LILNnJ zP@L8&b&}FmbFKTH_;AL<<2~GRFG{&nvv1m}?o~5HHkwjd`=|i?*Buo0buwQG;&d0P z4sk>z#Q}d!g88F}%us%5U6ijOrE4o!aNFN+Tz~+I3!M zq{HTFlD%LQ#Q{!;r(d^mpHAnPV$nO8x*o%3&HiJt z(%rTdjME;RamkJR%|d2LBKU&jOL>dWsb^g=zz-}7>?_WDfmG0g$uO~htkbN*U!{}& zOtv&Ck->ylspWoKVlT^;K!AbYE$IR|%~GPn=g=y-O{LR@W>9m4XmAAFlb##%63J-W zd8ixT5x8vKK?nunTbYxm(Pa9Tt`qb(-NGqo-ti)10x|&#X$13Qp za1_sE&$^UG?zVZ%Ey{@195y;RMY)cJ%s{PSr2>yB_ zP>>#b%&-fqzrXzgZp@FFU!;N$zW;`yku#IAK?A60&#lUV#0}|{;EPE$ZmfLB1qfSv zuG^(reNulf^162Q zp2XFuYtkFpuU2b%EBcCU-@>D?2Q=J;1hz3MqF}Z^a$xA6gYwAaEa6IJ^vPn=t(eEP z{}na5UAJB~V7~X6Mwi(?;Zil{gh3Ms|1~ICWTyS~aO}o=Sl;~KCc3~_m&2Z<3m-ZN z4|-$Jz+CgJKWMSLu`y+k|XlV!mrc=i^t+T?J3 zh3}5|RpVyB|MDW}zXiZjl5%TeyH()#&uB`{C-7-IFG7q@Y1?CaCer`0{EiaK7~v_B z@?V>LWto`D8=G7sYy)v4yJ;;`pQNn#G^XqvQ8HpqbFDg9JzgR3W-zYx?-Y4ZB;Ps0 zu0qed!4w^3+;rY-pu2axKPJ2$wD3VJ8y<}xWhoLX?d@Ujq(c*Dof_(x#<`$DzqR_) z6nkY&NRUb5O=mwL&9ez+%{QpTmR3z$Wt{z%5f6i*78=CIow*?C zCJB6Mn{@!&MMA^~Qp80U!INvc2ypFvE?G9mcPYWu{$qU8ZEF9fe~gE{AU^MH zci4oAS8ic8cM^=Pm=))DKY}(dJHU+J1rz0rtFtT@q6~IuZHu!yX(b9G|Y{dgimq<0ou~XsHP;} zaMSDtUC>bo`Z3g8tt=v(a0GhfP+spIM%o(Bb5B0&-SqAEUF!Fn1aIAlm7Ym31)Hg1Z4_PrGLtk;$29z8OX z%Q5Kehf6YEs!BQ6NIem-RJJ*g+EDvPN)H!_XPY5To(Go1l1Pl1CV76${)kPiK|leO zDDhZ^nPA<`)f~UEKKF8xy$s;XVSxHJDl9`z7-3i}W7ezBJTmyK+1EP%jYSC961VoQ z_ljCC1Q?WAVqHt^wQ0Hiy9k0QiS%@GJ@2RyOdhz2@?EE4%ih_xwUOCMqqr`~RtAce z-UPMT2PAbi(`h707foJZ&4fTG(J4bXeZW`ns&Da%q( zAbCkEMA-I5PhW}oKqs1*mvA&w7mxf^M`VZVE)_a=B%A}ZA^B9wZVWjNS=xxoGm zHvu9VSSyz?2#u+n(qL1FDAKY(oMO41h{4l5YP1rwLf<5^X!SxLdq714#t9?NZ}hOf z#ki)_*|M`H(Gb;ZvPiG=qs-k?dJG~{CiJVhZ3$DVjdnaq?{W-}HB9>f0#C1GMX7gj z)ZER9$Df6_%nXPK-4g)CN#aMRwal;81d6BY^=-Q`4N#qI_o|ZH7SEPZkfbUP&gyr3 ze=GOO`q?(530o3?YtYYzOkyF@wr4`A#e{IuM>tC^lU|iCT)SpG&9<$Dlu-Q}$qO@J zavIo}N0Bl4gb4JpDbq3KZgBdLX@+LX(?d{~k4+l9vc|zyJ`5_L+TIdtvuLYeua22< zd|NuH-Oip@;<&YyD~&0gCDY=HmY6h7P-}7)4yy=)i2zntlwK ze7D%7fkyiaVk}j60e`Q*Sg3lj$;nBwl&NWhnw$!10!t6Hkd=Jf1#1?}koyUeWt(ot zaBJJ-8%^8{ty0KjJ4x>HZAAz41}2@hV)d(~v76YKYtEXF6|2~S686X?e2}GxARBU8aG=`dKJu0W=4Y`c9Ifrdl#O?G_?pnFQ}1+*zQlS({9%4;X2(u==3)kX|qHMgQ`IVdhN>e3SpT$p>5AkI(k#r`B z($LP}(=0drT-yLGxRq*6=NK5`HjbLYos&s>b4IuvH;NgtgG^dtuPBvow^1bTG!6od z_BxT_JY||vj!>4uQ4;yaj#begbw+9bG-{AJSA_=F zQVUIQ_rB_nn+g=ZH$ZUF1hyaQ#@uFWbwmcm+;|sONG5d0?Tyi};@LJu9_oP$LEK`T zZ3HY1YFYELCw`W5*H;9Al4M!5GvO^UT^sn0HXCUF9w&d|JlSLH=taZ%)Kwb%F@D)q zb5``jH-MSuSzNi_%k$jvaz0r-DsnTuPO==cud|L2;!%>+wIp4DGW{zNaf_gW=_72q ztbQV%V6oSw=3$1lyrbB$nb{f)z@w=CNnn^1XvNDt)|TD+>wrxTOZ)`tyDd!7AZhJs zxYdL%%Z-tb>8T(3%GKG8^hjd0u_+1jo2l7iU7OFyS;GN;B?7={#P4bZvNCPVARrU_ z7f4wsy`mOh4G-^nU{V>qmTMlVx68^;6VlkIL*azL*hI82M!}{}6d&|kb%$vB_Z2{n z@l5$~$4a+{Ci24}8qZuHqkj@~<>c;aWwat9udV`WX5S4$Uuj)ylKo7L)ruC$N{RBFv2vcbF8;V@DE!i8boxr6$`G<3^nUoM4NJKGfPoS zlZ+N=v{_&=c;cHAWF5E%C=LW`iApiw@&MOM&-qr0J4P49YSM~bcymkyoHOx6 z*`zcm*Hd-(^)PBWO|R-p;w*G{H_v(*BWW4-3AzWVhc0CE|4KFguv^3>zod&wF)4XC zX{#7#Ev}rzK#WH<$BeBK)4WFvhnhZ7?55_*S?}ua@;U1>_&R?<^~W#x*H)}TJY_Oi z#ARzdMN{4_@)LT4QcGKT>%tC%`Mt;j>NIeQ`aa=l8#{|mvl8)$T=u|#s5EyU@LUmO z(dbL3!6rwsUS@8!>{lj(QzqJttLK@4*3%!eK@?rE&~655211Y-IwY9idTz>o)Z4$+ z#}Lff)B|b^6fZ3{(N<-xwcS&OEm_RSnM5#7xnAVjz8ivd#A`nA1puR$NWcEfj0A3y zKfYWVv)2XvM>D!bjGd{J2MbF)EwEVf?Bg%xMa~^s(BeGDUP}z)`r8I&F8(jUFrNscy22L z-eUe*+2rSMB5LUvCRD!1h(u!f!Dxu)5gq~eH=*BM4$*M=Q<^rLI->S0|G+QO+R1gQ z$3hHyXri{+P8cg+cmdVD-Z}6g^9-D2XA3Eo9)xS0*I5u(E2j;GOzCw+5m3hsBbW1jO;l% zw=l?h{&cOzm4ys`nO)iI){Vb`nHEX=s2O%WT!R~W=kc1sHH=h25?06j1DQlx&VrpIso6QHC>wO~mr8Qa7#9Pvkd2WN zLrq9c0Zg_(ix$k$KDQrTAZBlpklR&qjiz3kn~LJVfE*mYZTZ&*Si|}x+=MgpiTAM@J$IpgrQ?BZ$fG+?ZvbhO7hf3&Cz3Ltv-Nf zLvkmfBLbF2QbmC4+$S>)+)AKILifrRM_!7Xl<=1Nz#{EqS!*yx(YC%)SVdjZw% zbZdjY8{apBlw%&yI^P?wD7FFCD%TXIH@QRwK@iMMV9)pC zErl=^k7J&&>v}Z(E^c}q3M^i{pKGaace$p#vx)mW=GvT(@HE>JCdzX&cIdwquiS=5 z!gSJ%9KTx40h8MzQ7sBej!y0z0ZAM%AHy_p43`T)jmOi%c4<(6{4>F@ckGeeJL2=I zaOAz#pn3Hxe`i4eD6)?=Tf0u`lSI=U4+~FJdVo-+jwpIyUPA=GEq5>rFf#5r6Ky(5 zJ_o_;Hb9OMe%Gk$+d3Tk7{8S`a(c!qH=THu_hBP1SXl4Xf_}Z4J>dZnoQ#+-^|nV! zUqvc;vnqj)W~c5m^f}kPrwX8X;4^$zNN{eR+hI@Z-dnndGS@D#ZnU{CR_s=SJw(^u zZv?EfimpOu456S#fuM=Jd{vl!Rmk%357hUYe+Qte&tzqfKH<+g3b7&l!I_Gz<6+$F z&mitR1IE09Ybdq}S-@$Je5#K$5vFN7)+QZQGB^wG^c1e`fu3mR`-l)Z3TN@suQ&yc z5hDV3q99)Od|bEV*_LBA8mbnyLIJ<9%}y*d*k-wunMe4dN_uP1Qk?QB%I4a;f<4Bk zEtJ~DF7YOJ6y7z?UDw}C8V>gKZKT`#G|jTbF^XLlxMBqpI^WqhXIRnP6!xl!+G3NT zy#u0Q0TgY4=8T8f{7jk1u(jasc9RXP*~hSGjQuBbjfkv_6-`J|rde;r$md=Vy+){J z955}|ERtH7CBIxF<7SKyjCZntH(%QwWrv#9?A7)bFATJsdOXDUF-L2HyA;a}v#Nmw zLT7*mW9ugHaee}f{h^exUToAVF*a?c2+dtOq4cC+r&*mOE|5+gPf8c<77>&nhKQof z6wxyHxixuG3C3!#HiN$WQ=gB@g}e5C^!V%HSBFomaTz$g@!XR)FK=xpUI?$-Wq8oB zD}VE=ePNHUd_v6qu=U(;Uwwc5CQx7>ofg-+S!ypa`bhizo%sz9jKo|`pbeI5Zq}Ip zEX6@CT^>um+%$dYGtb#d{hBI``dq&Yc%qI^zR(?{t#h^7wj;K5)|}z=yAAAr;T6tl z1fA}(N0e+&rtfX74T(T=c5+S)4qP0MVjL?N$;#R3;r}wwo zUhaLyCDfIgUmp#`SdO}^3LlqcO&;K0O%gm!JM3}+=u7?~332MuO>WDZ9s{P$N4N2T z?neB%58iA=Y(@$NhT7KNr>A zBA6Ri%R!P6f~dNln?u{O(2hk~h8KEAKdmFbCf(26-?8~WCTC>QN!gzJ8k9Vv_1(>F zkHoT2WjPTCLW=@~4_B6)r^yE}mekfn`To9q0W(+cWYKc^B1pJHry9TAkA3Cm;z+kG<9XvWy(li(#Q( z!ex&gXAcM~+-_?!eY&9Z?Po&2eljq?&T_2FP`#Tv|Ki5crvhHkW4fC5r;L8z;=}}) zYOHHBzP3||Gw3xkDD$kHCvXiVwmVH+>e?l z>D7ry&K^l@)o3%-_t&I4Kdf|72B4hlPG-j9&wWAcu#WAHh@+%?l50xsw8;HybJTw@ z$SAO;pBTIsS|k;v!Q?D7KV6#P=X*ZyqtU2bZazvGS)6}@l%De#S{rQDyCjGW@5pQT zJ1=)_QvdX&Gk@a&N)^R+cenakDXx9B-M953_o?vOOjN6SP6q9dZs3^xoY_y)f*H#e z{wJ{Cy}L2~f%>2*yM2dk`xm#1?`5tOir)gq3pdWS>-Sdl87`^zT}1V;L)z+wy7=oB z@~>-^kfaA}`@*;86>6rcurIfXn??{oOM}MT!-)c3sWy;!F>2c9)o%eROcNw^U`D9X z_#_T@gzk@aZNHu+zMZX6ARt4`UC!KjVqsq;L)j68kn1T&k z&%sDnZhiNS{ev%TN0-EDLN2tSFwcE#77nW;5`xfpnCof4Up1*Uu6@oR46)xc**oTg zY@~_4c-52Er02i(iR*GbGCrE?Z|n{UvETk#yOpPL295ElG8E|8-BbxJ!KZR6o>Z<{ zZ}*v42uw!Fh`bWfVM!pqiHUWi6>6sOj*vJ!83m_B{Dwzh_C&6E8k?hMrw<%=ZwDqzo`q^k!4zk zj$JEguaUx0U4%E@Ru1L$c3mvISkXW+U9WAViasDSx*4qgxus83a_yBJ$03Iy7%A11 zJ#>Jbg=QIt|8J^s{30nhtHo z$6XB^SPYm^RKwV>c1%-!-2I6Bdi>!U{g=wsk-|DRLl{>>d%o8CX5^_!MT3^1=~CZ= z^Lcp*Vh4}$r;~m)iz`03#}5_1H#eF8B>WGP(H~oI4~;=`U%b4QI*6H6{>Sct{^!5s zmQ&V(Q}TVMxTwXtZ)P@;Q3KmaS6uQ>ZPu^dp3~e{w7(?byT0An{HTa%k>A`liZYjgR9gLTX++`_ma%1yJTXm1bMQVB20gur^+!|mlS`h!!pn3 zzxwulF;bD|n?tUvMSy9F-!cB<;dfuuW6F^+iv5ASdT{AEtOoYkSqF*t+dA#FNEaW| zcQ91fpOrL!;2PZ1d;Ertr7wRPzyFM7@5teaQ|!-Jw;j(!Ry3po2*##Er_n>TdA>?w z*(krJJ~8aw+4*v0&Df?vJ${OUaud7`SeU%R$oOcq@$0l+t&hs!+38sSE%^cW& zUf-0Fl=?{`ugg_f5nAYq5We}QG3neryzouirJtS=v4K}|fkgY`0pXK~^?{dZ?$c8- z<1T~R%B!?g`@M8@k@f0d8Z%6ne~PvZI~$br$?nyjRT#%U&#TkMl*W!cn^`$d5uXi| z&P5tJom%W4xq12}O>E2A)7Ix1qTyX?GV=ax*0g22W@4YC${&-nKi6?d-M54na%(&pRUcVhPklGlpOYjx z&bxGz#Qq$8&&97UwrF2{9wPq-;)R9b*LsHDEZ-haaW zikVhSXF?KaB$vomCv^gC?PcXJi`%N$2}kY{n#coD#iE)P*NK)E*Qk{*Vy7*0ijNki zyNmX0FMw1`I@NL^lw9z{qc7SfKDoF*v0?6nQ%+^r#3$(U6Nz(0D=ViGvSD+#a@QLZ z+p;2Y_edYlmEGdH1%Ye$C z;W{|R!?cWuk#3ZH&)O47L|=g8du+9k-5FLet3;Sk8)W};UhBKUM|USZ>@h7_`FN! z95Gp$o+U6AS*r;NHRjUsBBK2Cd6mGuQtjyAjkPOX5?4k&bS zljk=>ZHXPBX=hV|a0)?PeWn?}Reu_2tRZFc0q46IhxnSkCgZnN&U4=ne!Cg0+}Cv3 zvuP}AQ{|iS#X8|9yFEPx=Sm-*N_%^ri0GaFGlF>`ht$OBkLq6?o)2;BD!nSdDQrm+ zP(qXKJA&4Z&*1K;{Z%5v_+OXOP8b;b-#rXdizkhtzok5LPz~}nwueL&WIzZ0?9%jN zRXgv9v<|!H7iu}A=Lc*OZsEzcC-ogg`=7-&xWiwp7S9B1blGBBa{xTnb?MY8$e8;v zgbQrlU%%?6Ds!b-Y+)ktxn6br!l?38mfQaQNr~$@F~=80>I)L^luyR&uDrPTZYPMa zDct%6xd6G@!Sj1x24no=?n5$>dCha!Thy#`EvB9$23@b)5tX~W|I&uU5A+|X-RN0c z)wyY<^7iAy3VHUlS$Yua+bk{eNf1=htUgXxa|`ub`5D)@svXaP0=3n5eb@3q`iJ}- zE8Et83*J9Ecl7xw;E}Q6FmR8yu7T~Ok;ktqg88DMNBXK)XS)X1UgN|WuRuDkP+lmH zf^R)I1xIa=z#NyWUqM7A=gXm16)pKXvA?GK+Pp)@71#&FH-+%%nmyOZRoxl$FZpN6 zOwX&mP~SHKkG%6AnMigOXl2`~Ze;DZU;-z{i5{|Xe($aQFSX&VA z1tB1I#pZt>zHy;teuIl%jfo=<~=>T)6j28w{EEaU^&BW;81t z=fA1uyWHcT%t4JAMS02Zsif^MGYx8SsaGKJUl#0nv4*NS=MBC@q^)G*SV5*aoeupN z`Sp5H?w;G;afAK!6M<*6SZX8tmTd~?D~$+zYZjd$2@bpqpHP-HHN_2gK9#6G*=K6I zfaSs4-H{WYar8#3nLg zAgYN@U$i)dE|b}IPB}eC1gg&?Ga6rV@(C+9 zjhzg?H?JS0wCYzfRYefx*yGOKDopVoDVc;*52|AwahiDMj`7|kHRZZhxpGYCeUYVf zdG+_by0+nk61e8z%LVTlfx($nOqQpU-vcMh%lCxK-jiDNzJ6b|A}dF~u+1M&MQl_E8-fYn7-!CxwnOx9?wF&HvVPsH-Ub*t_l@a#4H_TJB4>$lg|swn_gQ;%7d z%zym0deaSt)`c0*_uepVYz*{ieC42{Z{E~6R^fCPmSwhr>y6uy{OSPwQ~GA&&xqrfFDVsWB{5v15hrVz=EB-+xMPyuygr#_wqXBXUT#5de=Y1u2J)H3H$#D!}JBC%2n z6>eS15WP{V)}5JzCF&S4PeWWS?VbZ?>%YCAGqg~^BYt5$S|5wqh^U17vWgtN(C95Q z`NA{6c=91K@g&#VHnJz)bU_C{IGEObR&m*CYOeJ(YU%ooGKnxid;*U_;>B0PD-$~= zXVQ^?v+ef#iHb$?8&tp_og&aeX3<8~aViWMCEO2mcG_2N44P)}czeS(c_qx+Na**0!WhBaA`Kmh$5zE4 z_WAUqf?KYA5ZrkR6O(uW>`*|NEy;2IdF|pR@&j}Sp{;4c%c{y&TR*&;`YL{t+r6XO zp`tIsESyRF@QVU!47&i1Ijy`e8$Tb_*GZjg%hx;2vos!xo;w_4snr_ZB_ed|Rs-lo zSxb+nfAY|t&4z5|oKomcqa?0_=GRnbjBv1bIgBN4Jr6sF>Fghl#`=5aYZj7^b4Pp~ z((A9`2d@Bp4Q3ANUm82OouRHvi5O?@i^aBDQq4Vj4LbPhV^xPIU46i9xK59)QFMQU zONI+=oz(aS&|qOfVN!&ve$PeC&T4h>uIVU!ft@+0SUbaCEs2+T6HuJ-{gkB|55iQO zMD=Lt7GUW|)APb%IZ^C`*ZK3P7o;Jy7t=WjP|U->sFz&g0QAMXsb&snz;IE_OK1+^ zJuWa0<~Qvs_HxwB3Ce87D0yY`308AMGej!}`xmaiSW2T0gLhs(w;!IEqBpYkCrU9T z1&%DA+jGr_ytVY|h<+K0W|T)1T@Oqs*bBd>JN<$4YT?O*o5i8^qu;UmviDJXW_qo2 zqgJny&{_Cx%leuikn(-=2Po0{n9r@Uj4~Vr`rKX8R5rSu)7w(CYb3kkP~fjqWWtxJRE12F+gIAgM)OWp0 zr0k~m(|9+3d}C;JUXi0Inv8!)GGJEI%EtYYMyhK>Sr{FRF9WC0%&(HsX|o@h35n9N@F z`m*t^)1K|m#S2cYn8~?VI06{&&*XPA#^=>>_%<@KcgSuZWpZZB6mam zNo6&Ci-?nVk&$E@^bxz}_s?(sje=EX^-gGWM7F(>&n`$EcZX4An7#X-A;ezW5DH9P@Suw11^1>r5QWXy zZhaqYGvtw#&`qBE0&$)9Luvm~B{=$gaG+`{k$d_~GW$Sibli)6Ku~ zWo?L&*LI{~KL}~)gSyfD%*JExWd6C3Bo|I}hZ?4RVMoc*emD4savA4lhG-IjS#&~B zCuuXtXFs>7eFinMg||a8?ByX%Fgb%es5!Gj_0B!#u7dcsxyz|RBP|hJq3kkIKYTs- z`99@e__bk*fTdi`=DmRm8@Mk0NW%6Za3x}t5bGYI3+HvV{3C$txbA7%nd!H1-A__$ zPPoCG#AF>(41c3V^?G-PkCcB}ALy=I-sficwL+VHOh1GQ`_-!kZ+-g-UdEfmauPke z6{zRKHVE41PlP3;;^tc3tN5+j7(MF;a4ZZ-aCl7Js#g&O&OwT|Gn$8g2(XLn6k#7k z6n}ho1ZCW~fom>?L0xs`*gUeGZWj;QsaTVA!k++wxOU zBNu?}Ng640kN5U|W9zEOpjE((kg4bQmDFy;Vi)bLO7V>433OQhOpVh;CxsVmn?$I{ zXEJus{j%k-ptYy$CcMw*ay;kSv7cC)^?*3Hwv>O2SWA<)Yb!3|j^~{*ZaV={$4S8+ zYg>q#*l`B|-z;ff#AQ=mNDk%+-CdGT(%&*A@ATRiHk0CyYhYCkoJu?niyBObbr0}C zKJJP&5@YyU0%3CK?FZZ<;)HM|m0K=8Sh3+@?JcOxDIXK5&UTDHI} zYIb}TcNPCEc(-R0!Yfn2?Tbu%@vL^?<^p-ZSpKHcgLU?$a&;brwc&WPUyW;JG=|i7 zCH*#oYw4cGP|$|1wv6rYa_ZQ%a@Et&sYi=>q_%UkbCt>L3$9W6K-IfhylojIqr`q| zag;8_)u7r;;}>N0;CS)F+pVWUw}F2g-D~HAWe@&{`(@C7zNl*{Y|Ja1HI3@KTMhNx zHa`xWb%KH7YoC5S${DdrU=P})!fPL0^-lWy8FS^P4`{kRcxK1~H?@1=?mMvZ!`Lp- zkK88HqX8G~54RZKJ$agcXy8rKef;WuRSn<(_8(ts)?lH3^zZz94O4+6R&@pNPASC0 z{%wu!$sfO#k3C#SN^q_jx+Z)$cXKLi<;iPmZP01c#H`t%#xmDEw8dxw^t@#8>BpaL zclS{x?0dJc(vi=C1WahDW68Ax$1=ulf{$JIS-??09Ls3#g$`gmfs>&Zfqb2TPR(Im zz+!U>M|&fKdoo}G0gHhXRGeCLRt z7*kL-a%t`TzPJKstFWXWJ*Du|w7FXne-u9bW&p_>Blu`es*qaoDETL1E%$_7M0!H={!TJ^{bK51a@P68LwOo(7;q`UyzRB_1eN7Q{wcnh!D7qx? zfzN6z`+hz$BwigNNj5dk9qK6MHXWE;4|q)zM|C zPE?QO`^aju!c-bE?&CsgLW1m@0>}F=p1O@3sXo$D_Y#(?fAsNSjd|FP+Rw?PXXdp3WofMng*QZ~4K{Wo;Qx%-4`zfj*i z-O-Q~2?}Iji{Ex#t#7Dr*|&kA;^Ocl+Y~djnFp|__D)ETh_r+`{E0+R+ePsw}i2GJm0#C?~PcX54frZqi^9!zo}k&kOt(ZGGlPSOu~nmx~7+k$^z z226i9Fy(>%wqz7HlK=%X`RblN)|mD1eUwv!<{qM}q{?*Qpec~I83nOjQp(g3-f}82 zYx5j`JWuIo5E^d%JzBVr3G;>#-dlD?;`R%|LrK=dY8bo7m6(GF&tsQNgw*FC#EtM4 zU(r$%NDWKxpC+X(701GO5TsbQBqCaQ_jva4Yr(s@Wbh&?AF1HH%xMwAhRO8H@eG@a z>FlLZ6q{$9*jCB_{=c9)`J=(DE``TU%^wxD_O@<~v5{`g^EXP~9sO}fVp}4CLlnOf z6mt91vqPQ_3`JxL>U|1k!B?Ku;D^OEE6+slotKyEYqW?DUwIdo$(Ym{`0~3r^^Np5 zy|k(tf^Uh(+RF~)^__VPW+Z5EUt9Q?Xf^uZ-mv=IUD4<5GEyVoJhEeGA8B;2VZ%_Z z8?D;JG4{xpGLMy_Tl!~ba*;ltEjC_0qoTdJ<+y=s=a!PR9(Vio|3q8+1sy!)!ai=* z25pjFgr`-peP{-y4!R{LKZT7G6`5XN4VQd=v~sCJZD8zOZ`YUv2U1O57G0|{L%&h1 zjp&_gUI^-;y${p5?S?o>yq(&!ZlOgDZ>db)vTq$B|MV$zGg9JVnIAawOEuCV3rrU{ zw$v1`g%ttz&tQ;Sl`tAE!Q>I4a=xzxv+C=U7Mn5BvMMb2w54k3DwO#TK~Joty1bY6 z&9*ks*FKkM<#dIvdcedpPpxYgK7LmV6HF(FO%u7j8|y|c{Fk@?S^TQXV>pajG7w`OWvkvf>$iiM|Cd&mRQ zl{5NOvo+;8@L-3jD&1E`rZG5IZwh8@Bw8~-nR_F&D!KQhGwskR1o!z!NAt*og+pyf z7Oej2BM5yffxneukPHD*fYDhTGE`vP9|hKD`!?du6#5x;RgYA8`djObKic4G^J~Jg z3~RzMlX;ard`|t<72PC%Xds3LD=eZG4*60hF0A~xvWCWgm(iV_yM8tvHFF|C5LQ34 z*P5|*WAb@nt-oS{^+3XWqpFt9%5pD91nV1SQLw=33Z-PwD>%*c;}PLw2_yLXOIxEr z+Ux0a1HHVxd{xLEL|HXPB-nrK_%(jXI3$U(Z~aBr2lZQQvj*>@*A^mauMH`}2qEfu zyrK%jhY3cPOR2&?_kv9IOHO2nhes~@rfYJ7-zU?tA&hD4mu$_pV1e0~^dn+j!a$ZK z3H?TqteMKH!ym!K@0q}yE=IvPu{Rjd4OaDk_z+N5V`r5%qSLG7zCL%s$~^K|J7k2m zu3}1csZw2;)+es>k$6jHwnuG$OIi6g#08H(ikO6x&Scfy_mNB(UuhsT4W8=WakA|Lqlvbr>Va4B|isvoZ*_?IgM7vK}*P?Qn?BXGkFy|j; z$GdHO2yfS)_NdT60ApZX7 zg4lXseN0Khe$AQC!aF6M9M{svwZLk^P4$%`bHQhQZIT2~y0Mw*JhDTfqk5oVCd~|x zj4;oPcQ$?To9PPrmmj3DIfPDDLEOf+n(l`~WeQWE1jIIKI9%;Du2h&FzOG&LIrCtX zc0@}yP`teWvYP^A<;xcxNl{2g<>Jy>Kb`kL8?XeTe>V-FE7G?p6MJ#Fc=Rue%0jTY zxabT%X);k)jCPN1X19&=NKXIdbC_Ixih3+KWfA^G771e6WU?3qczbah zL*$@O(t&SlkJ8=xLR)tM{qu_XdC?}i8!Sqwx!gqYZ7>sovG!O!zJ0;#7f-ln z6Q!t!soP~dTuc9sOOl&8lJ!^|-R_5%Y3xmds%svw_3%*pw?nttUmgN6T>V-%5*TsY z#MKAGuXe-8x1kJCI2h$^tmaf0scnb)`ccq_j^V3IIa@eK1f%@KX(D|=34ug`# z&{j8$Vun|CN<~AtGE$3d_Hzq{9TLYy7G{J5oDSB_gJvRxLkQk+MS7?fqVpf-&uTET zsCNtz`C}#~$<3mw!EJgl{W^%=T}$-hUwZ+8`)3>CWDBKc>wR-2VR4x$LRyuQkeM{U z@%B09=TiSEznX^S4W5D`)-Dqa1q+^J&}y2s7QAXEoFrW%TaCCjHEVfG*ZNog;D`5X z@$dG%yhiNj*Q{sRit5*KOSqlcP7fF;1>`Yda@6ZHXYcqKn`&CavyAz&P2oUB!*R-H z;yY$Q*F8;WVE+yM6U35RZUU4;)&OHY==ap02xYKD(jeygP3^7`1DWJ4jXcywU=0Td zM;~AtadW!z7Gg7kWgAXAXsExaiqM8gX-rt%B1Hz2xQ+L93!@&|TkqoX+3bc}HN#uU zrjNOYsyv^Z5pL*EC~;SLBUPwkAdH9XN{JF4{#-p|JnD$Jomxquc?8g0pHiI)Olps~Nh)61 zN@_Q<>u84k74-a0kDHX6C4%giM=`haI|-K6B-lXJFDvHQWqMADI7sX9+#^+2i}nY6 zawDTmJT4(sMaD(px-&OTf&%+WZ&@NN!-xxGEIp^PTHAuMM=Si1bwf#|nej^HMmGMT zGJvTf`J~)}dcWJ4RO$#`o_Oo0{HdkIFl2&&b>og&;!O236JYtF0JLjZyh-}Lngc*N zm*00}jz(%mRHthG{7A?pO%Ij?{k|SqY07r04ouqg!HGqx@1E|09*Fda@adH=t}T0n z+X`#1Q9YaS4V8ymu-Cku42bt(Vs6z-H-79E&uon<_Dgr5QjeU+)Uk$BcFm}0DfzL@TL4hMqCYqd1w$pGF zH{b`vh2x7=uP!n}^L8+|lk_ z%U*Bpv#32s?zx_YL`wm4bEl9-Rb9pGD=wkR!|VpXqCuYSnpgZ>oJm>f>+R@UW$!(x zS9Vo^T3&^T^X2T~h`$zvOw~;ZyWNdg6g|BlP*o3f z<98IkiQJ(_ehp}HSQ6`|-2@h^+KdlDNImCSz$Wk|CypJY31;%V5Xpfuxop^MR z?7xG)da4zDXCV}4t+eA0uSF{k_D!YEw<>mb0TVC01q@96kusld>uWRz7}qW=;lI`! z&)$21MF~2MYIYaD$T*wgK>Y!QGn|0bNl(GE*I$QX2(9>?eoJ=P3H)Q#R&Z!Y^(T1P z4%=l^y+f?N0Avk>{;3)0kZ@>@W0_MqULM(L|KrC3*ZXEIT8nz4QHEd#VqXIkF#+EU z=H{FMjJ&;dAy+Hf9>0ZWL0XEI#A)gev&-BPs++u1@ItU&+z{i)T$@#y9(d4HULgO+ z$gh0ZRxmFyr@Z`SnjhgWh#$H}ToTsS*t0AdZTJaVa7Lwjbfr5biIfozn?C&X3rd*D zJ@JFNXCejAq#@PY>N%3v_S4ai1n-O%m%pTK9)aYi?27f@O5~CBV={tf6SQ01E`dRn zVAV3FzZ^mIeUjYX?s4|();Ec5*Bdrmu7&Y8#(AU-m28b=yN$E;aEq+eW=GSc}ls}k(Dc^vTXlxR`Rj2+Y7%itg0WA-taw4 z%4E-{c>61F8x(NVCxXthy2FX28Na@R4W@HL`P4lUyQ`%R!_*_S0DfStDQ!rXR*?~F z<_c7*4NlC+COuFw{)Gs?uKLf}CZ)>mE~q;3He?2v=oH@kg1-PBRu}vWh6#d0Y^z8@ z_2VrWaR`rHuUv~Cjk5?WbFxNMsUyz1skZE{dz~>0_`>E+vSb|9XyS5ZkH__8Dm9My zOCIU9^LJJY%p-dqsNi-^^7dDKR_^UO+8vJxQNuwM@Xjtko`hgFkMA3%1;?%h10JEK z&~fC=byB~AV;nnZc?_}q&+W0C$;AaTx}$kh)iFEW<1fq?AM~HTj;UNh{equLS=9P9 zF~(*wxk}xuCFm2=B`-zLT~FSzC1V;-QtpV=>)R&b*Jk&My$>p&h%wp{sFM$5>RpN zR*`D7(g7!ngz=4goXgInmV=npYU3okKK9`7KlL$>Lzfjr5W1YF0Rw+pWJkSs9&FHf%^nPVU1dVebJ(j99kbfAzMXKkJL3$JS-g?jl=v&HcbH&?L z(HFGfNU!GM>dF3Wi^FzqC^R65+R?|GSZr@E z-z|h>L%|m`A4F7CY4tdh206l;(S(3(`|(gDcpthFPywRh6Y^m6Rkw z0Uy)j~h2`-C`kgN4HPVLPg(;o6Df}6u)S(-xV+lW>rk=JNTQxNM z@CF)C+~GXvJ5xIRczOco$yCo^cjTz_psHcK#_M_yAG@ALeAPYU1I4_3#0}VH%Bs9r zaUsC3`Ms5g8hc$X8{){0J(*!1iPm)0ZS)V+;!@~3b-vpC(51$kD;<=3*d+Yhy442_ z2dkl{f1zxCMK)XQJ~8g7c2cItKdQ3pd+Zl4dKhl$+=F|2N#=2!n8+7H+9)qaME4H) z(ATjuy?C<&O*W-HK-<+8%At&9Q`Y5F!g~?G*%70+weZz(Z7f?|&ni$RU)vh0hLu}@ zsPzS0B*o$iqb<_IDxVHl<}cpceL9owNoiJJZ7zGUI!@o(Rm_jkHd;@v`$tCVi22^C z=}FL!6-Ll+OJ(LS8Ux%_ejGTQ*u_Z@QlvV2)`50A{|P91I_$>wW{w5CX0nAVe$X(e zgEZgx4aOeTxskw8<8K%fwu9c(I$ogPMS;aDsPweS<9=_|8@FU4u8=^B9$y{hbv`mlBmFdwG+-h?7~~i!AQI zO(||!vlCG!t&w_pm61v{fnB8<+8?iz&Ws_L^;4AmKYGB@PNPBe#;}f0nQfi4;YCCX zBtGax#JXQUOk|;hmOm_isr@43ibG76St6&o+Zyyg8GU8faOw?pHcNiYf(%gJ_*Xg% zA$)0D!C9x8cDs^P`>>e^ht}d97p?W@M@{=3W3TLRHwPa-QS@)!BdilAWy?X|i?1Ze z+NGbvOZPEcqs12IQQwTKjXS<8EfTx?!h!ORKWGw)`5EG$Zu$@_tZdYebJ0(w3aflc{QazeIYU zgRjHmP0o(|#vYv3O2SKm0O@mYz0L>pE?aqGK0M^||4M+|=f5QI!u3K=9R~kf3KQ5% zP^BdQ)Bh`gY`~MHa{UMR(!6mMpYT;cP+%K-`ZMC(rP`kU+fDgnZ)2DAHh zlirXkz)2#Ky9#5)@BSOc)~_GfOA5@z2eBjXN6q>FhjlA=XgzVTMN;5Bs$^407q0a> zk_q@1j3cZU^K3l=<*7o%zzz74@>dX=?uRHXFf-V2$lh39DCKQi^NBoZet2WwqjSjA!NU-3FlCJ0}C-sfw*G-LXaBK`sM&<8VtTERtX3jIXu2i?I7 zlS|tr+JgX}9Kyh@ZOJ6;X|NY;uqm0ogI;oY0z_c9dJ=Wh^P(02qsC(9zKF=?qSzrm zYP^XoQ?>{U_P7f$4TXnPfO(JT_)tRbzAAf}X)q>JG{D1h@Z=9g%5ziKez z>(9|LmKQFftUdojfO*^Dw^^z#Y!er`>B)iBsPow#fpeY`x$b@Vwl6jr z3)}KQ!6yOqqw8yjWK_^A%_Zkus=4!MJzd&d`GEw97eT9!_kgGaoGa+an zP5#2=EAfB3tG7G+zx&Hf74UFdVC2;aD`~Xkkuo?g&LhxY9_gH?u~HYW&AS&XJr*hL z+R%}bCHblggLMUv!90(OLwI+;^ zXIXFT#{nWH*VI=EIcL3y#hdHm$&llN;JE48Y&2_yqpqw1pSJS;A284spDwTS#Px}9 zXbOOft1hITxNx=x{5;cm{M#4By9wE3_Q7xdiS(U+OH?zzYYC8xulsESadGi`b4V4S zfNDp#e_@)z+k?MEQchNu;#>1W`&RDYSq#YkSsXdG&gU4#Z5$M|G;lYOsw(r8&LFDhZh7Vp(*TyDYHWZ`byhrpX3+>~F?VK(nhxIOz3d@;* zYX0zu^-4^&!EiJkFt7s8t@m4M(aNFK7(B`6i6C0xR#MPhg#Tw$GQBWa4k0g{<-yW{ zx~Z>A3QaMZg|=5XGwQ>k0t`rg+Eoj4niu0A3GN-O4o3oekZxMP_b$}QItI=Q?74t=Ef(8jx8^7Nq9-6as8q!Siz3tjW0nAcN zfUm!;;*tR4-Ocfl*~7~(^300!2wgtbz2T&3b^5_?KhIro1I+Ch5JyB~-J>$%;ZL61 z==X%@q>tNLoG|g=PjGLpD=s`_s{5USBYCUM;jN5_Lfc{|f;S)D)K+thz-bw~yrv91 zSOgrnOq({(_HD8isiB&VdE9w#RkQfpCBG4mb1l`79MENVGO&W;0)b^_bZzC<%y+*J zJJY|=t5;ldvRXX}So{tDy_qF2d;$=(h0 zWh8{u!G|;MHP!P^jL^JIY8|d&-lk`DETrcor?3DjM%cexBwyURZyXkb{3J0Y(Po(Z z?vlZj1>#8U^5+-r1MIE-6NW~GmB^~qO;@@AmbM$&&F?SeMcS@i)Nk*h44*|GXV3I# zSb$oEByOy(0U}Zn{*~@t4qgn6mZ)6%Clyk4h`431f1D-utPnNGyHfVVd89mFE%41eLGY2uQ~=jFZH3ogwb zTbK?QX~3T*xhlWwwh_WNe69JjqC^@onyGGgD$@_32V`|KPDD8t7BCMqVWUrN3ATt+ z@xZ!fU{^*^iTGL6zSjfG|B0z@A|nOc`O*k;`;))&RFH_q=D^{`Q`S>5y+W;?aOKF3 z@7EV^7$&XedTrdIgC4)91YPeZ$IZ!c=cp-nEp!Uqd!5Ot8W7wuOb*oQ_u*j8z9|?S zDe4Q@B8s8!80dLfm=%sFG@<96Y(u?F#kb_T+MP__$|_f#3+!U`;AzlH z8HNW1^%{OlATlMw5BflMn)lFu_7B#@CNOI+uh(D#()2v{q+UTi^;H8LdAaPhLDwdK zC)Ek%^%+g_1^vP9oy!L1E^mo*wdi>zNoH*tiO_n#%E~@;DYZGGz?U8Qp1@E!U)jO41O|087@W#~0cb z$%S#p9qSDEvh|)?$5i%<%kvKPKe& z1nDZS>q6C$PN1Ic6&s&i?36O6Mwc|LMwz7U?&`JdD$^Vg%O3k5`s#b^Qe$o<+*s3p z_4@E>4E9O&jNa>xC|t|*o1xv)fFz^hSLTOYOzSv;YS2-o%%uJ4l^z>&Y52ckI5n*IcyCY#^I-f z**rio2_mZWhLu9dXn|4E>qrAQcf>48pP4qSCQ%c6`jk^B1YxRY3x!81nDeU8ZiPXP z8)ciV1d((F@$kVIdF3^$B@S15;RRD| zhJXF^3aM=-%E~*CC;L;s6_f*-?-Yv%nE0KY($F>W6%|!Ry-r0VYd4RB3wPuxdw^D# z5NvGuWwj=T(|Z`O8`WUBCvcA8DriR%xu#xlrg3j% zse|Xtl4@VVw7^9t`Ag~pjC7fE6^NbAq)MKi{}ZM~UJ$%!PMW!ZQHzR>tT5+roDfpG z<6O=X$5DKI5IB*o_hJWAS6*kED6s+0pH@1TWUcZS6o)!zWCvYI;?48c9`AXtx;Q>? z9~eAG?raW5v)f!n^=x?G@5PKsQL|xH?Gmm?(^LDBHg;OBx;X>iJgqpj9$5_1P^gVM z0?eoO*?^@guK8@NVIdez-9=R5Y4>H;bEaO7Bb+t_1Iio7UUjd`1QC*SFXgFus zR?kjsiEF7vNub%LRP}lFxp&>ykx1pJ@jD!nfpi#X^8`mn`FozXM$Pg-X2aU}3V;|@ zhMl6&7SfKBXHtD(Y~u=1xQcNEMUrKi;??LmR2Qz)MH}5U7qB# zXxM4k;7dNggseFDVu8QPFN)Ni2i$Sc?0o364L@phUhzsBn?ooaxVR>kDtAtca68Kw z^6#-A)5)ctX}&qR3Ix7{FMUaZ@V&}p*U@0Vg9E%p*?98MNO%iNqXJk6viy5?|8nfv*rzT^&3!MF31(AB%DY$Aca{lHf(!rsJ{*g5KZmR5h zmt8`hrY~smWc$b!z;TD*)0m)BsRs?mjK9h=hi^oee+=u0N~sRf?86loEbaejt1t0O zZ&m!Bl2n*4EpfPRCdCt%J_vPL=eEQ)swo!as3kCc!Q@?ZR5{{;1h!`wX!c71)2-$g~)^w@)7 z%wU1vcMC>#P}P=3fuF;`or3$Od;#e|oYoR_K&`Xi;F4Qr_dz>bsa-w1pyq$83M*XH zO3c~`aNq0$wXM4;=y|^Oc!kT+l#Czv82vK;;6dR%dPm;yv_qu%Y_HSnJ!Pr$YEk9t zoSy5FULJIM+-aU~?=o_&(rm6F2WSZx{Km@}OI4A&ZBqj7!#j%~1=j{`#iKFo)gw?u z=I8Xah#RzaP7JA`;hLMC-Fh`%yrwPaGG*`nhWd$x(&GIf=!xWirg~}mvz>-&GLLy` zPEajNOf-{tg)Y_|pvJJo=7u|NixDQm0j(O7O#eV!%c)XzL1zi3YhUX{Fi?oZ?O7m6s1ZKc7NYq;GP3ucX6#1{jw-XC^#Qee=-`1VONc zsy5(j0DQ$n9~x4Zq%$F+ot&dSBN?gF@r=DOSwRNXQ7Hk@C;yR>)D!OlsdPf_oKIV| zTrDg?tH?}W97ck#;kRwVY6&5SyR-`V9Jp<8Xx4pt&~|y#wG=~7itM^Mr3T`oW`+Of zK&Qp3iShpr^#9C9+^?vL>`sn!WM6D|g@ShMHpp~;Gg0awc;)i$uMdB5LAT@G7X#gP zl@*m$vE#(D?Hs0Ao!wi8X_3JtqEE}VQ+KW<|W#Xd8rnA78u!P z1ViS9c`jl;FwFij59M~3q}Fl}(LFY)1K-=7HRL4exmr7NAM(&0vrD+9y2_C;Vj{2C^w297WFFOQI76(4CWTV&Ni0@3bvUjsI4OKEs#_X6>3op*5uL`qffs@`Wr zfe21OCs>MrP=>PW=i+4o9pG-RU6Y$_%M}nOb zrL5T<-wTkPYSIv^qkcdQXf$bfCeo*H8!OzZog%+}Q2*&f`kMi%>-AuyKI@P4s~mJM zGdu@9U6|C<{nD(V#zlL`L747aQcudsPa%;mxleF1>m~4Wc)Rt3x(P8jLyuT_wAuYi ze}D(zIGqt`-`Wx)K&i~Q?uw`Ut^Ap;*Dj&WdzFd62JhtI9|W2E^3b_a{y&eCV5qfp zbIy1{q3K8R_b9U`ls5E#c%~JtMqhQNY#vN2$0y#?O}bFBK&_i@ffl~BC@JUU{xde0 z^ms^>2n%c0?#a{&5wda-7>W~(lk4^db2QAwA# z=LPwRoA+`?IU0~u?*XyviaBUD{iMH9b+C70`6FRbQ8+@9xPLAUZNKqS!rJ!?p5l3;7mdawRLTDOP~`FH59It^Zon<4*dL?|78pgHx%SgDF@Bz zl#{^%{A2n5RZO={FLs|IoM#)WUb+3I2pFeFV7dMMVLSSB=XgGk6{9Op@yj1hvQI4= z#n~Y860F(AGUn|0O0~#Ehi3jAeI@D5I}J}!V38?_- z2(NSl?k0MtugVAeYvw<0EoF2q#D|`t-6^m0Sz~`K!I+G{*HLejtC8YcUgNnLh#C?D z&vl(%wjf8Uew4NZECy>j16%1L^^rc~ZYKC>G?H31q%BAuFBq{&sN;%TE>HO2>9X+E z)R12V%t|6*wQ_9KR7iqt7Y5VtlB27t67N>4;k$yj_y~u$#DN=c@y+V~> zT@J4|t}X&eUle_`?w(gw*(*7?fgJdf_zJncn8JvCT5a6fkDKeA<{zzi$Aowqs_FB4 z>HAtK!>Y0XJ!-;7c@VEgOwp3glOUU=4;{($wi%#8{h=3rO7V5+u7j^5Olanq8j(3f zp5mh@vf?xNDSi<=_$rbFH1czJQ6OXGb#a_LW69{&Q)*ClUXr;Ad;2I+NzzuP+)l2x ze$Y@j1V--^?kIpKsh(ev0JgWuRS9q2*X*AB$Wc`OVUcAOqJzUwaergw?Hot^ba4wv z`+Q&aaR*V6Z3czXs)67{hpGjX+UonLA*d>*bts>$skNzFwND5T4%jO4#*#H!_JtVm zDLK>p-jBQcz8g7#d5rM5`lt7;q#JHMTl0pY6lCC4$bsW_9`gNoCJPk1RdFBiC=CIk&6*(-`u9%$n)dd24=M zo08`&%n9ypU|caHEhcc{tL*J7HBN3{=LTx(Pn9!t+nq3@dm(@BoLZB0N^A2DkET7# znDThRh zFCpA$c6CHG{Qjz7x0ThA%neJ+)7GR-74S6`@vOc1+)VDNuj{D>Vn^+~{GZ{_Y~!`#5L8l$69q}Kea zXCDI+=A6EY&#dF7yLSw4jjVsiyLHikWf>!5|gh}j{HrS7}!E5%&H+@**SQ!vQkjtnM z7DL8BeIN9Jce0OiEt=9}Dom^6{B|*<$xYSPk~Ur)}71nI0?QQDB13pj35O@C?tNkeqXO&0PzS2&#d%h~# z+yqknU9>GQ3l>Pt|0Rqh(iy@Vld2UuK*v^&Q_d@y-G3KKih4A(S7}}JeCBw!p3TIC zIj3Nj18m!rLfww~Fni%(lNPUD8c|Bw9|s_iV`0^Ww)pL2re21q`vTNxeZw)rWE=Z4 z>&kGPePh(d)fw@2z>7AXBR=V!tIwP{xw4((w7o<&sEAxdIjANmacus4#?qRzstqEy z>X}t>S@F;7u$W8Wh|(Ar)DJj2rGK)#DE>@1jP?9V!mRA#d;an4C^AF7<%Z?T+Rph` z=U{UH1By_cdfb_$axD!(PNa-i9N1{O1Pi;ToT<9{&ZAbSmmzz9HlsO+L!ctMSsc~H z-~Xwvr+@4GG`p_q`I5^x_Mg&mh@4Akr|n>V=?CeK!tw3d4u3nrN!3*G0qjQWLh!#r zye9je_1?32dlfdW*;>NEE-03ozgH>Lf@oJ`Pb?J?3>-1RTqVgK>54NfV&dkWzUJGh ze9-tB6B{rZ%ndi4=82qupP8txQQ9EVYqSlJn6pu z`Tle6(5W0D^v;*x_2Hh;?#mDz= z=ZVJE2c=yb%3gNa$dcsF3h5||9iulHz87Ke&BNbx1lPzPJjNEc$7AfU_uTcrP8uG6 z=prZWV1G@g4b}CIl`1ClRQszw=2Mo@{FAo0p~8OK!AaQdN@-r5G;r42c7xDz3t2bV z5c2H?f>^tH{XyjBp6+$#69lg; zabM1T5LJS{qRolDgqFlI+|qaG3<2S)_`@R zJi%g&Q2^_qQLZR7!G3Tzr(zRx_zfV+dE=?^$cMa!kt3w(b;#TV%Jj>ZZl3!_T}Ltq z_m`$V_J!DT?Yk(bRJSjfoE1ef91|N$?p`q^f}G&D^MauxmGtqt(7I3o{;#CO?vCEx zdflLzvn8F);g1=6=6=;7xo2|Mns>uAR;`0Rc*PHOJpfF zoF5-J&$SwZY7mnRkq;Dt+0^qxz42kS>nAS$Aa$D!Q}vYL>+~+oL|XrPs$jPAv1#0W z#-uw`IE@OJSTf30ylOODkDYnX`!)YlKG*7$_4)JJ*uM<>U=7}2OsCjs_5@+gBY<*q z@BNvVw~dn$8c4}T#iU@CpeN5pnHL#GU9k8L=84L{XU%)EV%3e} zMjoDlmGbv#k8tYwA7&nbY$tT5f?H=cuO?7jRt6*F#?bwdw-G;|ihBx(KwjJ?waP9L zot%)0-nzZ5L}|V95``MwbHy63wvm1M!=b zM%oN<=FajHU>c%vsTiQAlPM8Qzha=QLHrRD@?8oTYnZ6^vC}`v# zNs$K|9`{l^f(^?ty}@Jiid?c+uZU4NYZ)I>dpnOYgj)lglFK;ax<&zio;crEsFmF) zmK}8v`kbzF_;OMc5v;`r!JOJJpSvG*s#u`VSP9Y~Xor*?9KvU_b2L3E02TEn&K$x@ z+f9K|QEG!BS@)+Ssx>%?{V%bUj(y>V??+z`TEM!DJ^E8$Z_1$iYd@xYT}%+AyU|>9 z34Y%n1?l<=q^fHKpF7n2gZ?!#h&l*X4)UY3;7OBzXo|hun{PfHnE$0ly;Cni-LpS* zXZlR9-gWb18F*&-cw?3(-t*kJkZK8_*u2QtosnN4Yez?>RD1S23(oXfcKQW*IP%^i z$Ng-D#Mfi8Ta&A(vON;H*k|a)zIT5~kL)6_yNAh(r&mgdW_tSQGf~f)v4YtgTg3b+ z&jJUOrB3yhme=9bB11rHKL4Nv<;63oaJ2@@&d@CN;rT261ks|GUbryOMfvh-o$13J z`QQBDOX;da<)Fp2s7n@F=Dfq#xgXEN>V7JX;aq{qEdexO!?l!oxG6i`*GVwIj)T?x zI(V(+E;VWWv(LMwP6ss?D5p!Vz;YUAbvp==u&zwW8W&QCp7yOY4BmU&k#Q; z%JtjyYR9PwQMHCD>u*@mufselV!m7n)@Zm`^=~Vgd5}8q%~1f_IkVoStHziDt`jPZIbvg)b!@MwLofMlz~ zy>mZG>~-uh-@ILendR%qZVy7|U#!0M=5xUNzefKL*51Rb>FoXY#X&(u#4?If5*-UO zgMg?Mfh0N>WEen1=_DXhLqJ3Vl8~SXsFaKa5D)?)MJb_#UZq8)1OyTYohSi95+J0J z!pZk{&ROT4yY9Vf-Mj8Tus?h6&-2-zy`Ja&yxu?^;XDYHPd}?UsXu*7rJ8EvErS_U zW>L4=p;>FsZ7^F7;*Ai*O7&toHt=@agV)Iz)U%e=&=tIRBa~0+7SKi(fhDGtI_&g# zl@4TIHhr9*kiVOHcB7IUH`ko=FDr=JVmPtTjDE?=;7;f|ly2mFotx~BWc{s+LMDN# zFYxt*6D~+Pe_|zeaT2rod5`$VLekU&I$ebN;|F7v6dzqIeT0q%2ro36+$y)L=e*C^ zg(5uS`D#XEGoh2uc6x>unVkZNH! zSnmNLG|hv7>#o*NQC)O6WgK~z{?9{fb^t`Wd=iDA>CBm-&#{cm*Irw%=#WV><;4|X z`2E#KzggrcsYmTd5|K4aSexnj;!|cia>-Fo=2S$bG`!J0Jsm=P1zC^`Nhuo*mHf$d zXF9VjsTPP0ebTbIMEbn7Xs&-{8MBA$arfKm zNnf%cT5w=6nP>Nad|rpvij-yz@sa>)^%|y@5Yc)UIyxsG-&$de)i=%RuS&r3pYp`w zzQNuP8RuDPC+0Ow_gVy>jy~+cTokR+v(9YQ&(Ve5c3@S|z@z1{RZ~g?B!QlkV;+j# zioSh%awd$CLY|p17U;Pl*HuJe_d80Pf+l~A6)-%%ciBCWO{7cyu&}GZ-r~yikP94Z zmikthvp7MM}@xdxv{hIHuU4M^UUy`Aw43TWkDXW4)EGE|4M@4pA_8_kHO=H5^0rZ%n$_tY+4Wck@`=tkKx)yGrOLAHrz zO|dv9y#b;w@jOf_7YpL;7Ke}Y_1(FBUUm6cid>?`GX(FVJb^I-Eo#o9rlz)qYK^oX z+Xz)fYf(pTX2Ems-?2X>93#%(Sol~bA``(6V4H@W9>1{BvxCP9`T~kmud#SW z&s9>&!@+0i^@Z^?iJ6sRC*v*$v7NtMql>U-PuyY~lmDk(mXPDKXuzX6=|}KS`GjzzobbcovwfK!=fE86;f-S{imqBu!R3!}^h}LF zF7pJ(fA>wi+zzet?wGg(V4~Ev9B}7WCvhIKLKyDSBU{&o0J+P0% zyu~@cZ@Evv#DSAP_qks)8qVE2Uu;?L1f;+A)DzZ}_jFF{3nZpvOYFVR=rMAoIHeo1^Ih3k&vf9O!`SO}(9rXv zoR)hb{D#lvILVsd!``6P0!YO`LsThte#cB51=V#?tR3-+CHPso`UD`ptMwTSgT-WD zd|E46%ZZHh82f|L`^KcY&+zX zeycHFOATyd^M`{rpW-@5r_#|v-;H;Z29l0XX71Ghh@$p|0-$7mYyCW&^)5@lDmtI5 zR+X(!w2mh+l-u6U?-*V+kXD-&kPtopFFkW*V|%IP1=1=>I=3d!;EF)s2VbgV#?%IbeTD7c{QD+9CS01#2#9hWst1GQ9w{*qi zVfacZ)1Wf?MBcv+ZPgz4KMR7sIT$de^@#B39DK7uR8IZ;VxdezZJKo>LL&mR}eQk)vn+aNZnj3|6a&+V~)4F*3e0C zPT>_+y?1|MzlVl4IZbF7wz+FgYu2!-(1w!>K~%Oujrf#<g zZMl#zA~v^CzJFXYwlZ5@H3H^ppZ5;u%LR!Q0^YWjzT?Ct(T`Hm$_ztMuGfjw&fQF6 z@U~fD*w1@@0ku^uiAF3GAY{ADLI?m@#7M0DkRh@F@5O>E85-5g!?qPO4S}s?H231} z{l!j!Hkm8-W0p^&Mm2**8#9|hSyO?U?-?IeN4Gkqbq(Jg%RXH|kG%_ZquzE-9oa3t z#tWpBy~t7D4YW?kzNi2^KCyd(Usj9mT|k2dN_VC8OaI&oJ+Brdi`tLASNLG`)2jXN zw+0E7FAnKG!BKUDb&gNHyUfMK)ZFGtjUO`AJ^K>X_c`7UQWXoM94Eeg6RLSFiSC^t z?~pvhp`IC)n3NK~P4fB}oZ{L;Zgtx==?aupuBpFu<~Rh0JHf7#Cm-Q*8Xappim!H? ziu|WS2gvrSvxuy$(G#`J_ zTwkzsmbaVk*9pOe(*}&diGT4*~~5Hn>&iHXD+$4y))VXz1P_tDFDX zq6`9W7iG0mecFXYUg>CW_aT6S&!6K=c#zbHmn~JRww+)T|1h2cU>aB3)_>30>O(x7 zTkDO-TvsX}}n{}HUP#y#={|tL@p8m=c8AxV6 zVZh3Q_`k9?EA}#U%ytZZNcNmseiOzTGl5mr)m=4$V87-d9=*)2hBTLSN^2sR^J2o~ zeBZQjD0iUrik=&+9KWgK$IlC7>5p!j4r2}Ryt!#Sl)M)KPIaei&{$+>cUrHSOJY-s{kM52vnM?>bHA@2v zurjxU02t~Tl|<)lqeQh_uC=WMj^Kh;y>WPL{?ZZ6WZc+wMG|Vb>6Bvw7?TnY@ZN@z zL(jK0<%C=U(s7c0Cem%(8~H77Y903nUuk30u?1x<+$nz68&a776LnCO?6y%HqWPBn z5)o4vyZX+U5r3JIPx=GN%_`voL=Car>B@U72=leU<-oc;36*azdJ3p^(o1q#f94|Zl&hT= zNRDroNdmTral*`Qeou&PrBq2mD{O?(E)8N?zrfL5cvTMJt1oFnQ~+YVhm&ie%7QA4 zINfb2*U(tpYiRtzLx*`Wx2Og|8Nx{TeCK0-F)J}haS-a>Jso&0%#LZYssN{8lk^78 z)S}ej{zVoqE5}WMo~oMsy&T&wXiS|pjrcNrW!MB3V!M&(Hkcd*zrUDl%>QodI9;CY zfkY7@!s}UXjH8;PxsOw!7r-M6k9L!^l8p@BAy|B%j{xI*6fJ6f5cXYaB4x|-cFnJO z8e?R$nn2GhvI{x{H^Vt4=ACJMVHEpLAS6nKii)*q&WjjvGGJ~&{$8pc;aEaO9 zEAotlpP3?W#V!04w&8OmnZjUKi<|HPMgO^Mk4rI4oQAT?u{fQ7IVT#`|3=Mtdh0Lw z>j`MR`l$Ynivhw;lfSf-ugtCH%_sJxNJy+bO6TAge%Xv8D2h{B?>P#932+GMP-4(@D@@=w1IzVR2 zq16}bwEUAbv>SWP<4lP#Id-4a>pj2cEjd!5jlGNcD0-C7z+t+Edm{JDK=NAo37_fP zh)a#Rb-!B_dF-1?EZyo+(>x3^C__iq8;O@tFCiEiJ-R@emqSsgDEcgW_29`gbt@?+ zOv9PWmX1b63!+b+p3d;_wv*<*Hkv7_OIR)psAte_iSt)5QeJ>(N7{RLU1c%XDmY0OpD`qV(#7E zGxa9#@P5nz6-LpVmmr=SyE!tvskKEC%v7bXQ~?SorEVM5`yrN^0-`3Auyc*Dm3!Hg zkfCGy6#}aShlf)zm%Q4(L0cnXx`;&lXiEoK&Nt zK4I#f07@BmU1{)(#6T?y>r!*jsZ)b(`PyTIh{4volDjD83u)=p@s?6-`U1ssRa$%Y zo0>)#@Q+QGamI99-Wi;tr?hPnJMKir$y5!E1rlMS$6#*ylm*`s*)CIdCO}!GkHq`= zhCQs zPUwHq2Pp8pqsfKU1A~}p2@!mMdJHH4296(G5Z`#gGt8;F>@<;okTFK0D~&rrj(SBb zfRW0#?NDpTfg@2`3SlK2ZNC=i7QrTxbIR?(_sUwQmR95s`-3d0por#nK7Qh*vO4p_ zWgE(z`>SM3-t=u#+h*q)Gl2>^l4RX5{_n($3XsudNic=YwAB|<3XMJWYL+y9Wu&SDXv)_Rtet<_N&8ji>)M?`Af6#m6yA!J9(mYQYTAaB>VT|zpuZ(iT8#!>C0-& zU~un(JE_Li=Z17v{s4+)oR#@Hy9&8cQaiMsW5UnUwIjBKRrV!{odeZis5&F*Pi6iZ z95)6GZu_inaRH-z^qDsjhh}Ms!oRj6mp#Z6Nk>B_M)@Y@^lyGiz)L=ReD?qpnah1g z*x>`l7SpX*{;#Ob)KTM~4WYF&0VJ1_*#HfX-h$dQW~rjF8{Tfb>%GQ_TahZv1I-Sq z*gaPtW79Jmppregm7X#)_?^RT^=f#^kWti`lD3l@JBuBvYyO-$k-OKo-23lRtLjo! z*=W-oxEs_PO23qx_{YepxUdh=b6PHsTx43?DE(<_RV4sv`vO{Mr@8UdE~pFWd$rY< zQc6tqxQ~_Wx8k1-n2+U4L3EN~R1zYNw5F=~WJ5pti3iFiU+y|U9?ONb9=za!-^^pY z15anfLn)t#jROyOq&%nBN2J zPUW>R`b8F=L$1LAWKh|~e#ZT?mP3tz1%>R7pN*6sXU8IeSNyM(zWSBv9e4$<*tP)v zBOdcVx7{)O!iBUbvx6%wdnHM8eMcaQrA7dhJZOaO??XpE_ZfX|nmr7{Ht?1&e9Q62 zwAf@B4cG=ABn4{aLLZMC=l2s_@+$ z?T+wFZ}h8}&<<$^SB&ebk3V_Ti(s0kyCeiDH?64 z3F-1P%UIV57i!ny7HBt+Sl->SJ4;sLYs@yGcNjeA1eVvjw6T1Ve3dzJXSS5@4eX&l>V?GjAUDIfuMK=zk6)D4`g}{J@I{&{>o1rH z%8SLf`6L5CqIUjPd5)ttAkhQMO}*n}SEp;PUal6dfU=(z7#*ei#nkk86O26+@zxho z%-%Mf#`Mq86?m^a_YP)gWc;I}`2eknT4VijapE@0`_@OJ$T=JF?=L!=Mou@c=VV(v zys;`*i{{>$w7eCBXgU1WyUlFrftzUfXswUv$>K%7IMDb)=js!qjA+unribFUix*Ev zrNAnt9VZb;QMX{?#efsd&ka^_zRH73w$APdJ&9MGG54bxs-gVhL-ggB`#&G*9;j4T z$JKsSIeZm2n#%7gUP2CoLY}_sTPR{xeKw#~Sm_3dns*Fw*AtA_3+(wNlj^_Z+aip@ zl`cEXS2|^tKL&^7gYk9ML!vn@-vj12k!DxkhX=xN6^G%)YW`Dq7sd>58i?UGNavsL zN$mF`-LkvO{#o}o$Blyn&``gb&=?h_V@ z%(HueOCBx7=cd!;6xVEvuF`Wd-MmjExj_r9fgd^++p6;}co-(F0m;7oyJ{c#@7Im0 zVFQ1}R_h7bmF}o?L z27+bM&?eLX71{zHeef~4y@1tEy&5X9u2Kj=>5PYy$Gi;|C>7M|)f9W#9VhfVLAyS; zb4?lhP@*;^z>gh$>C$kjWUUnk{)NJ^39QCLW-8XHgNqxb7 zO$l_Ex&RR*O|1?&Yu3PY%(>ZKe94ml{vvME^&;e)diS{j<{|Xdio~Hw$;}s+L-C7o zY2p$p^K9t##?kT46GpOphdA!;zco@b`q7;|zkW>OVvi z9l{Gpj@zvRn3Q7UyIHAzL7NlwPMFqH!sXa80^>NjHM%sUL`bg%sa_WV_$__pq7yX(A*S-Vvp>+o=Auoc9LbH%fQq?PR%&O;;>o*wpZD?^98e zCjJMqaYqRg%pnfqI9TAk(b&ag?y2|PZhF=p{!D~JSXW~)Gr{qV*R2a*T@EPO_ zw2Mk<9{dK2?DYK&x&E5JIVfhOoPbtPi>_5p%v7%tRIB$laKe=`2}YF^klcx8?BVa1 z>BBlJFYly}kCin2C>=V#nQAh==zkq;Y(ABv;S`|$Zc0a1Kld%wF?#W)`8xe0fB#lX z*08VL?*E$b^UZLzs_}B=WhW4~qGjCMqJ!!oF>6j?Y&nThP)PS#8 zBRWPdz5>GU7OGYN;D#xS-~erM0p&tq&_YwlkF8rlkps9vtx+mqCwk?Iz+K#M!<+V+ zzqs7Xnr1e-#(vq0U3%;^euvcRCxEDLp|_7v-3i%06hr%wlzgnE?zpp;?qQp{kIYP$ z2|{54qw7895}R?b)z_2#qx%}9Kl(mmUMCa6}HkLMw~3)YI% z%AhbN>h?x8WHbCZMAxsG8zsD$OfzNB3}QTRiKv?WJaxYESb;ikSDX53Ye~+k7dtzm zY59M>lLOP(1oBAW`VVSO)yh#F=e9}9&h@K0j1jKJL_V(hS4_sXGaq(H{hoCCq0Qaz zVMYDZ{ITbtmDS^lWm~!2AXjoVV&?bL!mwjGHg_GTFrDOzPllukuUK*&)^cm#=1PG$ z$W4@U&9Jn{_~t{ci~cJ3T{&31_HcfJ>Jf`}CBA7lfEkMONR_v^nfSlqp`|*M=ynBh zKla4LMmnpt%x6tK#ZpMtIyeLQ;wvB?Ck0pUI7AvBl+Fu5d(C@XZL;rzl=-_f`tqRP z0kPtawY0I^EI`HiHsMR{(8c!qXGmMEHQAAW?NlLZ@pLpNr1s`uGs@$k@OI0_>yWyW zFmLklB3A(w^J@wZi4Kk04mq!SE(3$ySUP0P@9GSiRRb7o=A46^FA^Ksjg9IOYEDD} z0D%AsDp$JRIcZR_UncVgEe-~&uV?L&6k9 zv}|dpHcjN1MLd@hvFJWUHEE9YoLB|5{!Q_(J~>r7R=YK{qSFxaT;nQmn7WJZm}EYbkJ3GUov z4_*n!O}w=v)746+D33A3rW-*`o?kVM*Sa_fkTaLJwmE?V1S?w=+CUF$_r%VTFltQ>Ioy1uv3`kSUoYeVR{rt+vbTKbYbZ1K5Gq zuOeRLOGSAH30?G_pVjV1Jfk=W{nYzrp zu{M_VB8y*}U~6uw#c0O|5urn2@Ky@+3X2FZn6Q(}t2ZC3PZpT*ay?#s11d9F8vcO#HSl~c* zV0uc(j4;(mjKaM9%1tX3RfH-C7cC*~=@&TuWxZ`RsnuX&hV?w;+y_qriRqV1!U<0& zYbF>4W%%}&T4dgFA{eY>(18`?p0shr=q$HRDY>c=*bVgDEqbr=C$y!{%p@eF#kOU# z2Mn4@Ym$`)OQvdFaf3bFUMv;V_RBe`L>i&gq@}+ zzmh+az9u-;WtP42$pl*Q5)bvy{?=PYK4d`qw3tro!#GVe8N3S`#tweXGzN9(Z;`*{ z7Dao4RtUq0Ad%vb!9~?l`cdzoKw({)A z22*4HFXlzLazspxUn zviNv9x#~5&h>X_v1pCrrIJh6oUGgc>zQxrB&ZJNr16h4PpxG&3?m5yrQZ-jz_HMe& zY!gQMK$u}G*~TdH-)^nMdZqQ(o4FoL#T9P!5B{+Lf@m)CXO4%g|Cio>TBlNyqL^DP zvOH2ROs__j>9`$2RttYj8N?`%)h=mC`>Zn8nxpN8#T{H^!Z4>2_a{9n=`p})NR9fI z7d2>GL1i-iVkCW^uGLnBDZ{f9mC={sZW~<7@Fite_3Gv29Fg$b3luIO_@@{cpgxUk zvk^vJvBz#-6N*N5!IY27f2p#_e1@B()K@#uA1my#AD*Ni&(hmv@M1k`kF?j%xNuxL z_bx&MWQ-j+1kwj6ax07QsDFuMhNb*egN}8G$gGP8g+~csJlW_A9-o<+Id&4t70@NH z_&dc}zJjNX-__+vBvdw0f;a>(EBug}YUJuoerMiZ_|BXpi+s0H+whGN^zkcDcUP2o zoy*V7<@==%10bFgJvZ8db>ZJDZc+tvf-fIS%R_9kOjKtK3&E$BjwsGekNfhnhY!J}p#?(CDX_%>@~hSz*9=|{9~06U|0OP=GATU zKh$Pvj=ovW%)@Jt!-w$JXi!H~Q;$J~p{2*&aq&zoyz%5lzjv3VwKQ>ae?8@n<6&^) za+ncCklL?b8LFf04TBm@$j%-sw~xo+mLbPZd?&u(&#k>v71hry+I_pT4*Cf=(L57F zxtX2$$!KovCgu0H^YzQ$R^3UPnI!OCw`7ES)6gfTCH2B)^1t9;Sf4b|7IjuK(@S6a zdCzb!mc4)ZmHG^A3d~xzBxlEQcAwH<@~FXj77H;w_U8Yh(C^hPTGy}Q`ja((L$NJ> ze{Qy)c4Zp)(D*v;v#^!cZEzO&>w|p2dxo;~#NMP57hpDh5rc4nV%0(Kwh+AcjIWC{ zCG&x=#*#gMPEN!;8vGRSE6DE6;mw{fhk%Xd1kU=s{#g}VzT7x?mAc(+?#Oe#;|IE@ zmUqm;P`dB1#rw(_)HUvHHDS&B%8gS$w=7lKxi?c# zV~)c2YHXJ+HyDhMGN8T$lh*bg3Cq~LL1kL7W9F{rFzUnjFn)Yge9cTaP~sLfR%%D6 zN|`hF2qwylf#5~D`P*O%|FmeN4XJ)wQb|EQ?8zZVZ+`~z4|%sXly+^axqZ{aH6TJ? zD}+(^HJ(FjSehNb*s_Lv6x&-i-W7*r?7v)CKV8Cb>zs%hcd{=_d1>H}1@%N}TTHP( zVMgZFKI>OiCZtrYI1I0Y{E&{cBvJ^`x?D4)fRS8d83GK@e!xjmXmvu-AHeUsoXC^iL6v3Z*wcN}{G2!d-)aUGWx6lZ@rzPfRLfyn*KD+vaPWiJGMX8qO zd5nWLcs-R+9i9hzfPpmK?e(Z#O;ssHu-yg1chTy2l^?V2bMF5%HC_>d3l!TLt-NExR)xyG=@DdDU0<&LRS2{Xm5UVU{ zEV6MCsxXhThlAtjuf=Z!+N}paPN+vb4XYB8rKJ;3OM*JNe(@1DPXVW4h@X~DV+Y;j zy)TE*csG+Q8MBPPxYi&G6MWD948-~!B8RRr9**H*x*FE7TYy2+8hI+vpAqg$?#8_o z=KOBfgU&9Ss~p>^`n2lYoQrsvE>|C^Dr0nF0~<1f6252F6?qjo8Ux&1ESfOj!lfHST&n#ZNBQKjra!-8*kAD6W7$Q=}b&v z>#32Po|%F>k<+JK6@@jgaM99p@W@9^t4Edx#_kM-`H(7&FIeDhYT%i8ADbDdXPX5v z*YaG3$vW8@%~os$tbq>nbe7|W$DpRu5)xr;>TVr>503LaA;FD7)hE7STu+G5b#OD< zg}4{7xoxdg_y{V#w+CNmFoQ1Ai{kwSKM1mejja}g-ZHk(_ zO1mKe`|3t>%xWe9Ag`A#NUto90o{iW`6ov`Hi}x2?M><9FVqcoavtoN=}kvrj%IrJ z3joO6Xrwr8@uD!i>HXXx%EOK)9vH9)KN^WqQrQ|C-YZqYt#I#o@1^COU?Ud)X}P%#(RJ^ zj{DSGt5Y-wZmd4p=q!i#81|5ca5&Ame0w=Hn6lfT_y<^NB1$+Y#}ThRxYUMh zQ<(_3E{wDI&VbrymA^b#9?e!q0!eZL(+~Q4=5Uoy@2d6LL3uAOM(60t$T!ZFf7TLT zKVoTt)$V(IZ(hB-hyJ$rVpqKQcQE#o;ss@J%7xo_xVxK$k^AgtIVY=2P!92YI(v!8R*Ku`=mHVgOCgtn5 zH;j-}zc7CSNSkkOzTlez_5S99+DR|tm*IdsJ^8`CoM`KH6=&XjKUw{g0$17>IWK;) zci?k2)R!dIH(-Kua&J z#^Dp>g-*?f%wBIxc*SYzkr+d83WmL;Grho#DSu9-uXszLVYBobS9q@j2d_8dt}s9J zC!Hc5-1MYsWk2uvy&^yx$OxBn*~{6_X|E(*q|o@_uQHwSXa}dUQt>8DlcA~xJErFR z8a|W0SzLhHd|r3F+*fqBWGAfpW}r41+?&!{UZ=VSfp=_u?Ma*&DH-^wlw5-wlj05y zobrr*65%;Jvr|}XhSvJVge?0wVJ`ONxYrM!mIZ$Z?`z3Vi4H_pu+B6O?wX0mf<5i7 zF-`qa^`QF%i8xBmqX#A>#m*tMK`-?tHJBGzCba9wDbG|*Nke+v!_Bt-Y-(PIqVCApQa{xC*kt(sLfq`%e|Tb2W3(D$sEH;B|3IN`@*;DWXyMV zHtn-5K;BZH7YP~wQ#eNQ55YpwwsuIfhxV2s3SQ92I?sk?y(Kff^9?2gy*bf;Osapb z^^UcX+d$kJ?BL$w4g96I=f9>qm_j;~!(EE?2z#i6kQ*m`CQKg%^nQqv-Oj2!H!y1U zX~%8Lp{UFf)RVBM_-^E&wDhYH{m5&9Hm22MioZ>~1YCPO zVp{7kH~mCtwDGY7N=RXt@on z;Nu!G&luyV1ly=yf5K6#>5Kon3&(QnKe$P}Rd4@`F-^)3eN zxL&-(v)DLadr8-v)#}!n_>@?ZLLGMJ*#pnwYex2t^vFwL3S()YM`_`ppr;5hR!-eqev*~h?(k-VKlJs0#+$pS({|1O=W;sqVR-oB^L@eJY4ba)8`4 z_v3{YPhEj{gEm5KvlfC&3CWm_8o{uw z+X0Od9vYDwHF8hOFL_SmJhgq|jy3N{5hfQouuQ+%B&V83Ez&d1pmt%SmeK8K$}RJo znp6$kHh+djF|Oef^=ajF`mgC}YMRoga86Nn?a9^mQ!|Cl=~!jOwg0gfuLJKcXp}~- zq2W%`17`DdXFYOVcOAq(oqZ6l{b)I^c1|5sCY7C#=LZsK$q^A1sDuk@mD%J{BG~U& z>g+p08~H0zHfKj$OtY7eXTD6Nda0cu3fN{}&5Xu)?gxJSWbSGC%3i)tPz@OUY8Jr` zI$?6PZBR)qD#Is2aHekEcGak^RgGU^8La6$?h-NnxIc>ooC}&J11whTn^^Vrj(MCr z{P}CFQX*o6DPxsMB-fA=czsol#g}_2#MkXxvteiEF2-Lq z;o6I5&%H~RcSSEo_6vW5*}HFl5b+h4`@gogH|k&xw(A_kv^TzfOZ2kLd`w>$a2_?= zTGVL}klC3LPV^n*pbJ1EY6`zS@2A|bEZvL+=>uEL-(qGC=cX+`Dznvb_m9qj3}=R~ z_&c@P7k_+|=NMev@~nZ5SYfy@>zf4l#s7*ars6_%8qKNo;bXb*&A4&P%&o~$eXIjE z9g-fAL|4X{&HNe6+@DSGLT*WZfQgo)6eF*o)o96^sg{ocGVRLUk^oU@?B#ksh8AG` zmv>DLLG`x$^P-m;y8E@6^x1AcNUJgD{g^cW+&EF;P&kGvv8&B%fOJ^ujdEQ#K4w>M znvUcYt)0~r&-)lln`Jzo3^*@)#9QCqSaH@iO) zY9@NG$}hPxaSfLsGzdRXRv@iXVN{H3I3_T)Dauj=V7iOzj zn^|3(P=f}+G;b<`(XbUn2(DU@%{;W(PR1b>p>4Mopa1yB^Q@r|15_z4!$DsJD`l3Z%q5$KEU2Qhme1Rb38Qqe@)HD?qJ> z^E`wuU&CyPhk2LZ!HNrzxyI#20L8%pqnp66$K|`cTX4)(Lud5q!&m?XtJQI3KYGD< zi9FPia5U;U7GQ$bD*jW}YTm4JLcrceQ8U~>Vh`G^0n?Xs0;Kz41|MO$yzi2BfpUFM z>1I1MA50HdnkGkG;vL1|5O?AY^hvPrN#2Q~0O>C)uTz}7d6FpA@@)bQwcEhOwUO(Y zfLyg|NSgw39uWmr2)~WPj5*IRUK3@{2NEDw z*s2eC2`M7U=@S&C3PoDI@_&Y}D|HE&$Rh6I4BmoJqcAN>)EE>Nw1NHwlta5QthnLD zXQ;Q^HrvSk+ftT?)HIo5^eYN*jrVGEhpR!q8X6k|@B5^N1}&e5`prs9m2czM6p)uR z1;@%@G11@G0!wpXgwIB^Q2OI##s43MYylX64?M=c4){Ne8~f_jfr(l@8RSRJex_b6 zgm3Y68EjI$=xtjXH;#uXn6DXwfX5btN-OSUou?45Ih4SPglN`e^8h6XaS!3z6*4ES z4QweJpZ-FtO@e%4;?(`4M<$?^J+;Px-u-{8kAqrlYt6_5J4v0>ms)e)8E}+Wu*}Ru zj>E?`f0l+GSLfEv1Xq3r~K>k7h#FEc`q)vae&9*UU^K@PTMsN?ClfPw35|UifhA5jNS4*_U106i^%7wHg#H+LAE#lU{#`&_CeQmWu(>ipo~<|BUlV(jj=QYwThsr*iqYIc7${s*)?3Z;0OP&OsSp zB^&wl_m&G3VUZ>%3= zx9u!TUr?q2F&IR}Vw5Fhi-=uNgyA-ms7E6q%x$B77BSj`J)l8M3sAf%Z_lw|AAGf} zWFOFdI@*mb1Pt1ZsNoO)(kK9TlM1>^$jsv8hQBlSt};))+IY>EJ2Gvf?P384 zSCCF5@#R~3l)224OP|vm)A=;wg&uJw)fA|>sAHw!t~iCl&(pupk21nXdfZRhC=0_6 zSZ!LN|YWU3%=}Vdj0CR~w$zCDtf}s|H;<27ia!w(} z(J@YM{|lP4+*W3E+gg;DaG0HEV&HGol5+M+ytHu4sqW!dxO@Tj zc0-XphpAIFZM#fxRpaU{p6S;F-v2ktc|BJ99dMBs3>S|a(aaR5P&vyw9wny#&o9X6 zIcD-IBx2qOpdQ9q4gnR-crx)8Cz=&lOnV)x3DN-?2%4}`o+60-;9A;gWc58(uS}m+ z6A+Lj@Fs+Ul?LrzU8q<3e-SzDg&~>V?r%lPr_uXv9O%n=ViH~VJdk%5tN+;xSy9M2eF7|3mG zXNZmvl)o?kK5{BxO@n0Q-9S0IsBso*weFAr#}T%@rL&HGB^eDmcWAvAf2djBM#xww z%GQ{c6USF<_jm=lCefPpS090Un2(9_tG$(LbB|XU%(&0YOwmJe1!RR;o}Gz~ygW#U zE65)2YOOD*DK5Hb6@F-8pIq;7M=i4d0)#d4`GZO?+?0${~52nt!HHGr~Sq?K`F#M zad6G9tqjjZ)T9r-CAuKIJEHm`V%}(2LUibycrJ*YdVV~~Cec2Nx&urmMS}iyw9M1D zN~D^WAMLFfxI~Rv`}-B%%pHYRZPyA>wvx95_Z;}&=DLb}vh^sG)2_%Ww~0k8#@x!1 zN|?sgpX2x)euD9{k{yrtIh5vo7(HGys`UT$3G-6Vh`T$zhwqLogg+*84WViuM(yPe zO7mWJVtmmxPH88EwgHU4l(?v|@>|-xb=KwY8exb?)mvF7rNLtJ$oV(5AAh6fSvw7gEcMMrjIie8I zN<4b9%#a#SJysL&sOi0-yCPfq&wpd@&BL0`vb9kyTIo6{sVcif5E5;)=sGG0h>S^8 zxEkx~XBs31`&M2I1h5sOl^WD-h|DM3L78Ny&hh9oG;Adnzr03?YDB#?vz$V3tn zzEt;l&N=tq@7#OOea_QgpYQhHdG`9P{q7;}-fQjkg8UWpu$XHb{gV$Zq+`mTPp=Xk2l-hO05z z?|zd6pqR;SOvWoR4xC7;-h8z|UaxPAeDhmBm_=(Izq2vJLOARM_lIr?TOnWhZSMBy z9-sX82EQNfc>8#I=g@y_vxa^UG~%|@9BI}oIeuW{3f82hl_xZT`wk7yK3!k?djSgG zp1aq|&clSBguKaTT~Y70naC=>Dz{R5 zjqL1|QRz{h+6_K=HW8m!HNWs|3F$#O?}*KF|H%?t_267CQ#vZTVYlQD>Bgpq<%&~= z(Y8QVh22s;6RS2Qh&T0?mz^6%r!TR-FHZA0METHTitNQ)8Z*6iylhGcLI75m7O$`W zR4Y=Xb7mv-AG3TKYcs(c-AYhI7ZWImnVDnfRfBgnH`ZgRV zY$Z&VXS!`%_+5f2pjmxpbZC10(+!|oYO`&=C8kH8L5lXiV$6r!%sz`Rg1{v6XO7%S z0DLC-1X$`^Q>%-NF-iYCIg_{_mTQh-h3?ys3XTQ}Gb({U6ee({7w5D`d`z{>4PzU@ z_0E?ZOl9QH`B3uXfPj-67TIJNF72hnXDp$8#w%#?-!@6K%lkpQROKC}hwqtwOsh}fB(0QmaPEBeVegm4 zs&&(~_YWwpr^mm{d}LVHJ5pr|{f=Q}rmBT2(;t^UdmX|Qt#25lsC%r_B0~U}P4Q15 z+-*|7nA+3ZvrP3gfvVGW&n~*|8OF6krD&SZkhwp&#*tfZ%85|iyv~6`^wpcuVKJt_ zDZir2|N0}#{lo}=*Ie_Ot=MgofODG?C!r_7!y;gU>;@DFbUNgt!U9J+A`_sc_xjva zO?~B6Vnp^!{DB7%l$Y1RKxuF^FBob~};nj5ry{)~wgem8ykH(CfW-_Mb(czlTY+*Co_F8jpjdCNr;uiLY)ug{dx zsGB;_z?*QG{byytffM9{8AUhK14NqXsW%bRUwZ3)W2RWkbM@S%AHuMq6w7ZqE#artY#@pd)d%0lMm}Ib&1!}17C^O znc|lqbL`$nyn@P#W`D1t^}mtVC$lSIy=hUTk}8U~zB2MAKEG-nnU4joSc|3$un)gB zQS9G1Fuv?(=K3s^7sPTU>`14Bzh6wjwTEV1pk3_I(#jyObT9uq|73XRxucY|YcV^8 z=@W(c)6i~6;Zm{4t*JU&`?TV^UGJAVXGw(H=UhmRDNFX9?QlRb_*qDXj%KOOTED10 z{35PP=UjI%CjZCZVI~jU@`Uhxp@@fm`(AmlV@rke#lGhqm)f(qKI9wV#Gz2THWX@N zOyab)-%K9};@bWb;tum-moRO!^l}VM{3lpu^3V98jx#4-QF86W#{3TWDe~h03#@V) zIRhNC4vYVy(VC1OdOG}Y*Y=mhgW2bEay27NTVe3s{ef=Q)oC5VlMe&1j?-?;gmXdL z6{r1{yt3?-F&s+#SB*H^m&K6Bp2dX+Fqcfq;y630wb=(n#?|5Ls+cp0y}KrUuYPuU z69U_ni5KqAjrckF>43-Zm|Nzn$WI7savIDGGx?D0^$YjB?ITcY#Cga^>(X~OU^O3ts{YcPUx)zwZ^-CGjO!2`b3OLdIqd?%}itcF)QRm?`2}6=O2V$ zkp{01D{M@~EwSuiQ_alZ8y+GXihoW3`88GLUdj>f9tKXDgw>?nR(C|Y!VC{j zmpJ<${0W?B(_;&gKO%V!Rct+98t)RQxHkM~f8k1GZvv6qO*|;9%lU-d<~P?@pTOQ_ zN}>J94fkin0jJCAk-*Jjz1O(w#%_`M$KoY%U;Sj3f6JHB%VXPwE7t*rq4Pk>@27t# zNG`5Uu)Nv+TI2##bZt~WbB;#-f!yP91R57r_sz%2zAsJMg2feS{;ip*@h1h`mqh1v z5a{o@S)l|Y;P|>V^KWijt&8Y(H-Gj}xclY9O0Po;5t$g1($72FL(#=sk1ap>h4mCek9g7u0%gO7O|Plu^o@UyWujPy}o$5cHbFQ z{((^`kh3`Xv)dnfWr3S}cd^&UbG@eYk(0ND>vW^f4&^&-CiQ@WqZa9x?me@4+Thv5 z-fA(r`m{n|U;1?lIldy$za$Cunv*(YWvMWz*=%F&7WM8r@cRFFQ zOFO#gIkknoVeRf#|GGz$#b##{n|BP8y$&IKC~uy^@{bntdTd}NO}Ac+^J@S5pooLp zmD4RhTd|I^G;DJ0hR5Ao2l}w-Qs41l!;quF_7HT-@oj??U2XMAtET8ltdHISjg2Ts zV4E4S*RT8B?(2@oBm#~k9)cns`R&X5H7LCDKjv{@TU*DpMr$RIlDJP(~(Go3jNG{T{%Zv17%l9V*JbooT%X~2r&3H9=5M7#NTOoL$^`&ESG%ihoA6~K3jCumz* z^o;A)s~exi!~xK>Ing?QgXv_f(i_(!*Xy4Q_q7rp_f@;Kp8UJh)D-?CQY2Oo&r3-cM&4~5*%$364HMMiCGUfY4fSeMR)O*c`Rs5 z`x&|%^p8RKFB=5?S|7h8Ga=#(s-y1V(}#82>aL#4oA~nNdWWl7Hd}UPl>4(@@3Q2T zU8?pjPFt+3NJVuk^A2bCmR7QlTPELr_q*d+A8tSXWBj^`lN((A@Q0ITzGZTwnuapO zFLiZ_BOM4teI!#=4{s3Y8bmmHlx-_U{?7*(=8UE z^ML1YZ_QGX4`lcLJG3n$z{}jW&F=trqvfs}8LM)LvGD?P|MEs~O6Jhv-aM~BlMEv+*qm4imvJ+GbB4?GHS{{ZH%zzl0@N%fM-=3&o%+dQVLsY>6zzDt&| zc$83GWWPD9>p@-iw&4lh)a`fJIjxVAJDFS1__e}?4G5W30(s}-pT{zfC0Lf;iSDH z$t2i0F!*H=pNZgNpv+!fiTMQq_lGF@pZA>{MD)Q9yvAu)KjCU_ct3=$1WK^i8lPh>OT?lBIt5TYJj9nW5C9 zTAvDan=kUzW2k+PVMk$kz!6DavC`Rr$|(}dVewfPS=E+DC#5%nK{XR)v>^wcYqR_G zJ?5`|@nhyX&*VVO0zQ7!6`|IkbHAfzb?pF`b9cJU#{{AqT-gFDYujK=kX_cZ39|~w z$yRS%QBVi`LQ=0i>01D$g6`*m^JdJ`YENwLbajE#aYD>q@x_@9^XsXWwf-Q)XhK=7 zQTC)a>?lrru5uW-O?9J~H$R9S1#iK)0=37}Di7kyNn1qM1hVRHz^-rtSrf(@?6(*- zL))DyfCwwOULgivKz4JMj`i|b33$KQ%&l{*P+N)lMjhv~T(o>FQFjRHVDf+$bOIg6 zFv8@`HHG*7W@9k(j!<%B82G!(zxsB+0JJz!=6A9%{7CT*$%q8^0G=B9_#51qtKtsK zexH)YYI&aoend3ofuouB9aT;P9nPJ5+#W*^@nPzVQT2C}MwiRj;} zi0*}6{a#8mX|{-Wzs6sn9Kt^49$w0^6R&^cAl~qyH?-27|nT8Tr&^T&0g6geC>hjrm?CrPs-B}wHfukWKB46 zBI-`D@&t3p0iFG9M1N}V3SIRx8hyhc2ItNd({@RErH!oHx}nnUP5*%De+JWn5^((3FK^bLizRs}Br1j8!tqwVV&3d^{7_vm-L^KFo79eX^N%0%B?SX2x0XTL;ZDsF zSFI@OH2&#mBBr4LhMV>2FSXh4P-}e;Qf}pmY2jiW6?O<|xLm7Tf5A=2u8GcJy^yp; z(u;Rd<{vR@%un47Bu%vzhV6TCH$v|tf9k}fa{S4(6ku%N=7$BWtYe^&yQScX1W2Ja z$5UOe!RppE+bH5$PJZ!Isxa4pA6VY?7;v1~TV-6bW z?lTs$#~cW=Q#^|O z7M?>x0UOu{SyULA)-kBFoua{Rs+7Mb0!}(q*V4s(Pwq+U9~3wxTD~_h-QKA`it#J^^cfcJf zN(`r3e*>QCwpXt*Psocvge&l3ENQP>1^O{)MzIdPQ?CD7VjqNSjgyvTJ<&I}vd%Jz zl?0-JhQ1@O&`-!MUpt!0F*)fw8U;?wa-ywfy0o1&Di0^g%!w21CMg$Ge>i^l;;_C} zfoox9iSOX^m}YY~yX2wuxjw4l;%1b~16d#AR1z4IZ%k9`#k*;_GC1A)i_UYb=`N|H z15fwKK&MRQB7~;`=x|&I=z3gePfIkRX=ANhp_{y#p&2;k`qV*p7y>A_TBezbz%8@f z6MFdrVI3gv0IEvruMk3yO9VCP7ko2eETty36qBAUS5)ULp8ASp63`EsD{zFmJ z=0UvSrA;L#lG8=<5;z15*AVB-wLa;vem(w;u0KRjZ;f&IS9s@1a5@?GNk4~IcbYX@ z90fB5Y5xLlpTXlF;Qrr&D_WJ;w|<}>c~m1Wekl{ai6onj#-=GSge1cTVayPl3nydt zR?zNQwm>KjYE;?r*}u@9W=MqxwSG6%{K420Q04Q4Ed76#Y~|RnmW^*xd{{I z;Y{K#1h0jl;vK5B#Pyf4!H7}JInOBF;rPzp7jn)yl;T1ow*}Bb1p5m+ zLdh4&qHi}l*El~2792AVCrxhAcLr81|Ap~}k%0OnzuS~2gma(i)-DB9ZLC>9&Y}Cg z9%jlMLLfpvU=g$QxayERGdR%`9NVbrJ_Z0gQQesrAgG7SfhR_(ssib}mTysEyhX#HCDDm6a55|0jXh4>7L@|m{>=hz1zm>Cg@y=nu1rPBSH+uE6WiU{9DV94 zy}TkIDF%nJ>j3(Yrx3Yl={<8!F0t!*U|6fbhimw-y^RN^GeuWA5O~r%AH@E*@W3i` zxu)kSRUO$OzmqA2vIquFr#PrFBAV8z-2dEs6f{ci(W9p(GsJy?;qHWJp2c!hVmnGi zy7E_0^<7eDrXADcQ#yL7)^8uK>M_w~-@1#)*`o3EK(d{}P z$XVgigiFw=!srA8?-*L`?I2{M63H5} zUuJ-Oxb-2^uBt1f;98Pl7Y0q!yt=e83+)%75O+T3K9cN|oC9`{j%y!+(qbV97q%G{ zbd)ly%xmYH*@Kl`O1{rs?bP|V-fk{BLV1}!(Nt{Ae*mRi0VVEtxt|uZ-38f9l!N`n zCW9js;SNm0;rQLSb3YWqGJ?U>QNj+1(wy|WlV-1ynEb(Z<{-@QUx?J)8<#g#i-cms@-?lPH<}WT`K#Aw7CdG9+k6$k`LMcG=TiF zh6tO7KJDo@Yw=6%3p$#H$b+;yXxH8rtE4ynYNAFv>_rRKv=(A<)k(kjt55vZ8qkpZk;b#VofD~RIni!r2L^uFrx;1_v{_8#CI-h5nZeHSA1*)Ac0#o-W8gkh(o z$b5NJ5Cq9Jh+7*)EbD$GG^IU*N_;u4pA83B0y>d}H4^PRMI7!IJc%E}&}V?p)i(-; z5d?aC*d?9*!MD(ucYUSs7(=Tccu?e92aN?Q4#9MKYaH-@4~w9!(3|;dnb5)iW7lQ; zR3^63?U9;5NbFf%8(05W7N&F-O^j2$XK)3u09~fr+a_)sXet6=m1b? zk@mnSt`c4>EzT-}vds+IY*jhvc8K|F&iWG&fU*OQ^C&RaBP>-utr#m*!iS<_{Gm;{ zG{&|n;rdQD2_)BadU%76nPXa5>+wU)i04pBeuTb2I>5Z^6F@+QC|m+h^wNR`w&@hx zB_H*>1MR*L>HP|rW>i@?h%xihSn3OAO8IYiHrK1FKwo6wiLSS5)4Hz=cQEZ4gZO5F zso{}c8VDgRT?lHZ2URPBL9PQORu^iM8|QuggiItn=}}rn9Xw#cf4PwAB5Uu`91x-e>C#*N6NC4&rK8 zf2%Uo-OXv56)V;Mn)L`uZwAt$Ke5&)(+CH&J|hyM>f>>slk&!8vuxl6WMsr~wOrJnmn!NX>FZV-`4hgy&u1ZCzbCxh1-WJCb zeJRpT)SAgRqt&9DSvaV0-19vt!oR^l1NED_@B*Q$D=98aj(1VxzV96&2_EA4h4Mm# zI9)INH|Y87e}n!Dgp;Wo%+GYe8UF%N4g`8ulua}KpFw&efEWJH$M!Jvi)zc;4Q9ny z;2e^vyZQ}4EwUA-#c3R6oNiY)L;AMgdT@N$EH#0H117`NcMT@rtX$Op9-;!0)xXWh zzrZ7M=k#a-O1*Y4G`Zi9%+b77Na;X^!7~$0oS@$AbXz=r0=i?P!3Vx6L~(B3zr_=! zkUBOw&iH{3K?>96v{LK&Q)4J`dj{Gq4;SBR=^1o8%G2JTE?tP-M@@+n4(}5cjSmv{ zP!*+}gRPUZO>oaB^6W&Ka7qDmoP+&uW~T^-|LRRChTpS+cXzeMykF!3DAj)ZN5#Z+ z5c{zD>AbgU>M+%&A3_PwEOmHYZ>&S+LGNvdukMdP&khZh#DEO1PckR|JzRdgxg2c) zA&I|JXG@&V5%RZlC$f`C_QDqP2b~#iYUwaI>YVSkt-CeAoVyFmC9)j{{1Qw%wws^F#+Hu*K^fR-phczj6LW>v4f5s7S?xEeZ6 zk5_f|)z?+q(Vkj%$QyN?WY}3bKV3jm;i~OUGb7rf69w1L;uh<;+`faSaqt^gfDY94g{@E!SIIg;5Pm>1a-F6 zo#P${P9q3D$F61ulH~kMR3WPH>pf@KW1#j%BJ%YON~(G_6sy|9cKcS0%zI@-*X{=ju5K{>5J?Czy!=|wP!eZ^ zxZ23y+Lig{c<0cJLXG!gcgKg<72+xTGiP`>Kf^*{V}pkO{4vpRJ4U=@u3R(nT-UsG z=NjtA0=-&bD|u|>2({z^I)8O_b!fSfLyhL6`g~-aPl+b&0dbd}%cbk55(B)%xtNt? zRTo>shC@{gy6#o2x}lGV{(<_T#w=m2VY?(ITFZTcDZ4(EA$b*ZhP#9jxDyEUwVNg4 z-Zz?i9%~gMD7u>Iik#x=Z&0)fI~RRqkWW1W5=)-ECP`GeM{60Y%-uF(NlxThDtM(7Pz{puUazM03a_M+~dtPH~@;K|Lhz*4^lXT$%?K8U|6~ecZ$%&5YtF zqgDV|)h78dc5ajh7?lONjUw9@4UH>9I^Bm!imEt9O*RufwUeW#8zd4G9j}pg1%VaG zfU~+)k!{MK4bmP!t*iQM@S2Mrv78y*)qZd{M=u<^REDaBQ zXV@h|(1-pnD|!{Z?!SB$_9&$EHKT&C`5^LjtEV@A)>l_8CG*2F4;pD)iXiX(5^w9)^w;>>)XzT06TMd%!`34pNOJs07$;`6e)$&NQX?10Vh_pyoQVdX6uDf3ijAoXp%C627qn9(dtdLyK zF5+^YuXw-@6v4dSe;C>SX_GvUS)g%~$&;$d)n>pSpoSWxYG~TBA=61MO`AKfs-NB( z*Fr=OJwiU#72QIrw}5_t9vp-sc*eW(7^GpfAh*E^dQC71SFeFTy^fI#2c322sO;whMcEXq-Rwe85q->VcDn%gg)V;C*Ot}7tzCGz|$bCtVe9lk%da)Y8T!E>O!Ha zd#aD3vXdfEyWFSHc%xbmBf_(Ap|UH-Eer&L!NxRM=1YE zL97G)U`4`28peb5thZE6UA52ZijL}FM=OVZ=+}XQpfm>bM^c0{*)DWVHIyN8>ldZc zoUccxB1-Q>>nlSfrvXu?^~@AWj!z3rp$w5+H2;wt0(`a@PE?HeiuCP$cFt>FUe~I; z^+N?>IuRdR=79;yv^^+E>$Ml3ZUwGJYDM3ok6qV`42Fo4}UID9@9Jt#-h?P~Cxg9MvmF&k(;4+jBrIA+PD~V+^xwJ?# z(MEK}w9)l5Zr)UYGZz}2Qmewruo`<2>Elg58CW0BuM6}M9#+)_nQ{x7=GtYyhKMyp z^fjD(CuW#|;rROjn?^9BzHx+&rs5@<$YAqE&wAME&zankoQjqf$Lo^=Dun|mG64?s zgU;0GOcIMHnI&&bYtKry)Q$d0Xxf^{ZN#+~Xo)?bc8ldC{G-A{`=|#~&SYAQ3QYUV zwl0A8+QQ0!pKUl3J$_!XmdcVcg+;AvFs&fF+DF+m0Y_f~FExQhq&3p&$Ylj{Z9Kzj z?IiF;syZjP0pxQ*t!m=Z6i|yK?9>fKc)M{Q&G?ln{mOjWR!q&mu4a{Xe!beeAc7He z6mg2I`GJnyS}xHjOqCfO<~O|7rl~Noya-)2L|^t1H$I$vFx84NIGlm6atMV4$@n`B zWry+cMD(FTX3u|S*8v}E`tf_SH$`R&ocRT-SWxA`dDndD;W4mFwV#YtbwD^;(B+0H z2)2}lH-^?%-`eI;Z54*dte<@gLm}^o>ff8a=Io&E!qiVVm39W6;G|Rav6e0Fs2!)CGNEcy*P{`L(7`i2{-KcZ2J3@yCQ=l~!3 zar0+dY0^&JL%#auCLI(otTt0WHH$~!er;E1Lpg6+C-a4e`#5`YChMLLAKf<# zTq;L%UhWa^i8f%VD?Ons?}JkzdQkEugFZYPP3Qi}T-WaOn#)aq{v?=^8g;B&c57s@cf18tWEnnqpSs5q76q74Fgm0hjHo^K zO-62ADCClSvSS5hb_!~^=f|A zf>737=*oRvr?njlw;)Cf_2g12(}_jKViMR!Jtsu? zl%kpp0X)4gFmTaJ7;=3fcIGYG=tnLKJu`JRk(#pPdi^DISVp}-@>*`1D5U@zK#`rO zDAYosPAYYyv88_ z9Bd!xA+LX5?TB5S)DpZO#D@|Z9K%-SUrYA6GmTwSD7b-lzeN1ATV1>ab%jJQ>dKb- zDXmb4*0paK#=TuLzR_iC;U2=5er#7OL)iWf`R`4bO-#G)DjKs##fR7+=KcA_)PX;l ztM_vEa6)`Hm5y1|xBGHZE|NPtUL!aQ>n|ka!ScZzsTCut`kRDqKF-B_qQsQOutUFt z;!nC43n-S|^8}|_{_`rF<9nUvn zX4d~9&Meve`_Uc`N_Zjb<)vHBor7HzR&S;mXt)-t^4<0k0zmKxhX2+MK(4Tv%=9BnS{jU0yLgi;vQ)*77 zpRUT!0lB~U{E*BgX`d-9WHSiaUpOxLiB*}ItO>Jx#&fb}hckZ8x>%W^eA}6`dem*i zoBDI9PU)U>Wu^$%9)P|9Qx^w~+T+G53cR)r?~g+jwLOSHoXfrldKe%@9*!UFd4bt$ zJ}E2A67Pi{>2(=BjGm41!&lhMmBEe#;&dhM?#n~8som6bdbODls-=8VzZb9l2(2Wh z+0rB2olZCK>n!W_5=Lj+-cs_!nYN_pV2P#YHCbJsMPPVH-&9*IWM$yJ2tKEHho;-L zqI@z3S0_zOrVxlH7^cyL6G=<$no`x3&Nf*wPw{!Cnkh0-uFIL+k8M+DqG@nvx9RzW zGaSA~5ETk*|F9%`|D5v+_ze4V2Pf88g&>*xW5Z^Y<5Udqou0E3!;6-*M-vL zgQ^mgeC5`Sc5V`XX)3>YoSR?)vsgTFyAV4kLC#9kP-^cQnEqkU1O83Qbf_#GDW@VO zpUR-mRJ5nmGi>{u1}{nZ{nKX;a;vYz3LogEsxa~Tw>WY0T}78gf*2;$8D(_`hv?Qn z#qszU*7rX0=$e9SqAY+V&sk-yqA<({aXSguYlo0A=5Vj+ zig!%*AcWHX{LcVMO$g}Vn$7C#&1VZ!=IA~cr#{~(L{T71#?9k(*xcsiOd^cpT+|aj2 z@}}_0(-ZT~o#ymFG1#&JvsKo7jB%Wx5VCH!Bdcvgoghm76Xw1mOau5i5jDf77F1&EOR2%9gq@!7NtqnE`JKr8<8w*CjLf^#yH>{NiR~9wfb2p8>gGC*2LN zCz=-Yee?yUG~c=AycUa|QKW0y{FG8HHd=P1lmtppYVR24&(qtn^mC=fyCmJ=`@D^> z#mn08G{QEX0H*3q2hEA}`Tzel-W`OoYeKO(I6$2MGuk6Y=6cikD_}V5P4$p5mrdrK zmdFLIf!F6gSH<+%o`PywZb)f8N)FZ(V}|6dYrc~3*0mnZb2&d!UaFl{v@RR>chEJ# z%r$32m7iUhJ3%t3qwMo080=osSsj}7$d}<$iXmOMEASNDi4%R*bPSrn@L=*4Wmy2) z<3~9-{tZ>b9d5lYqiboOlI{lxJ#Jvf$aC#c^NcPP&L1ep$a|w*dml~fc{QQg4l!e~y;!g=yveredG{g#G znDfF2^kM~<*Tk~W`SRB*Lj!o*>NBW*W$1WnJP(ExWxMZNjk>8{h%yN&00=C9)gavV zEM50HL{i2CS22p&bJ|=c9&6xjFr8%>Ml3-hP7qV3^iRDDjivOJabHO_G4+_8tAYK&@njvX{c3JF%oKON!eqYH_skj9 zPu({{lML9keB?5Reb$u&8Z{reP8jhsb#5k$-P$?Sc`8U+6y>tfZ7(S(7Ykf8s&5m) zB>7;}ZG|Ex8v<>Hf~D?-aw}6HGuFAhec5^(aRnbWUt+qIzV*&<=!EX#@u zD2SssoM*EASY)tzF#@H(rPB^>H75W5P+!NqYbeK4uDb@FUBkBHMbT}n!uHwE`s*qEg?SRyBGTbH5hUv_%qv>=w(-xnzi}-|M=9 z+B$Nh1*6$aV)it!}*$$_#W&%{1Pf(T+>Q&^}uUkhPU&X4EjdGN7oWz+O>MH zCNheyex1qbY2!uGmu?J-Z<B~MCF3h#I5q=% zzfd!vrP-7Gs5S53(OZc4-X2L}u4m1esg_5uHH`(d{l!Qdyn!xzixx&>pTjTWL% z`w8^@9sPRv8Hi~fzZ5O*B_L+$L-M72XEil3fso`Spf|CNS#XhV+zM^0kiBSzY399! zp1Ls<6AU^fz^uS1s?IjncdfY`yxV+Rf##D>Oag?wYT8`)2}9(bq&~Fn`bLC0pQ(=} zfg!o*U@pnLBd0Y$XWb%zsI%U{M2NUq+zvUw-f6Maz(|J#Vd;&^VT5{n&m6w|8-q(# z<1Jn>K0i7-PvcjpQhq59fT)OywEF5?_k1;iDCN;*Cx|)nE zeUe+uQg7om#>GLVzl{cm&y&n^e@qN%FbADFFkMeVP#3|Nj5apHVK!o<>&^;Cmz zd^hgTnv-=TOdl{Ta9ZpU0CKBcaPEj29>Vs9(9kXY-qo&eXUjV1Xvshg5&q5sIs?_@m{N#)*~t$e@u%L$TWq!*8g`o=-YfZX__LG^rMEg2~Qt5lm$qn3Rw_Jr=^8CDHy;@Vs3zPoVwI6S9c z-^3weQ=(S;*%ZTr?cz}A$}n19hBq{W_OE$8^}a%G8zL-R-AVs+D~TOsWW$AmQk)Dr zHLR%?Kj=(d)j3EP!yXo(hD`It=TPg4+l%GAiU+ifb?T^98=v|dXp?xdgcc4WfqQNd zs8tYDpV~|Oh4Efah6E`x#fPACG~H`BJ(8^Z^vXSJhy3>;nzz_qh}9R0+@vnq&p1g= zQd9`k6h&i0na^fIe}prhPd1(Z7#abkBuice-D4O_d$?r!6G-a9W>s%4?__j4oav<- zxfy*~ut*_uHxSaat4ys1uP{zl%SzTft2y#XK~(%HNtvs|)U>>@9X}83vrQepaIsi9 zSQPM@;LS&VoR)0qTksyMe=34qM@L;7{bT^*ua>>g;8gb|T&5oPK>0_S#5mCzNs+HI zKPxuE4|n(x;{HER)vIlmwd*xs@_ZZcGCNbwcXr+MUL33PdEZ>Bo2$Y)NGl%rqr8;y zr$Ut2C~k15Koh@X4(%4Qhw1yoH+YBZgZT){{jyGjotW2S4R%6j$2Zk=#8Ugv*8ws9 zo0Soc;FMYfYCSTh-(%iue<9^tyTNhZHY(%}grm1UO0(}DD^N+BiN!;hgBz!5?*)(e z;L>-B$K0BYolgTenEFi3{s*i>1&wBi@RHHyEME3INx@tUm2`f_ z`zIf8I1?zT9q59`{QbD&eZZaFcZJ$^2AFcm@YYvTv}U$B*W=uGiM*CY4XX?{^%40Q z%46m>+VHJ8XXja24Ir}pdUb{+i7hfo+w!NDPcNNp>Nw6+fmT zW5>=X7^Y{r98zSoYHCYPy=$E7UD6Bm=u70#Cjm;u4c$9Om<|y;wgsM&r+FB=uq-s-dV13}j6+dx;3 z89G}n8@9+gTOrA_uiW#5xGkuwcp8Y&ICK}Lm{bYUy15^I`TD(hOJP)qe3el(xnEzA zJoFJzvZhmYn1cS*OxbmbR8kv=IR@5r>&1IQ37wAZnslw}GOBmUNr`q?1or0J%u(zl zJ5>dJ3!$2+u1EY1qY?c&Ig{<0>mBa~2NyeqoPz zJ{Nl|>gvoZdMf&rDMsYnnyck>TH(<-P|<4L+dY=xlzFCBfK7uH3wk=6;f^~+We9h* zk%?8l3($Bhz0Q!#QQMgE^HG8Arq~+dX#w=R$(K3 z>KHC>2J(BtPMJ|31ms4Fr=kw=wz&j$SPorG{Jzg6)%_?r=rPmG$ne^BC$YSWADK@t zu$cdDicsxA@GHJZkKL3eC{3DDl|SI2)p3D@!fhA=_+?onf%vm4QdG-C5D4MbPywJ* zv%vtCOn=WhByI(j7TSEMhaf)JN^dG#1z|25#pqaadnKK&{9~1++67d4Pj2OMt1F4& zE<>LjyaL9!R?`ErsC43oz(#1$tD+7COVm!M*N>6pnLPbZMxrWtcl-|31b`8+`RW-` z`_EYQ5#2=6UTZTXxP==zDu_mZ8Dfqp0xRx>1mZy`Ni=J%ssAEPRfnatTr0x&0Zgc=A5*+8{ zPSo4A8Pp+j_>BH$)=qheBD)jFYB|f~56#QJijk8YUKB`}1y`$NKB_dC+)1Jo>CbCu z<))``k#}s4;nW$5Q)Z=X(|jRO^YH5J0lkavq)r-yl14)JZUKg@U1!{*Tv15Z{$xoP1g#OW;0E$eAmR^c7a9#JAPh-nXRZHt&(usoM6gR@!+&q4L+*4?}M? z76wO+0FQ}E86H+GNmedXN+dCwQ38RNJlvpapLkf11FdpI^Q90c?4PN^m#e#%EC|u# zY(eP&PnHpc_Hmkz@_O&bIf7ISRWvAw&{c)t@lpuA-KZ6sKv0;eeI(QQH%Sr2 z)XoI$x2EKYPt)#GU`ce8)AiLJkp?HR&Sc@+_$QNeeI+8I1gbIBl1SVmR`&T+IU4wx z9P9V)Y!FuL9l&RNEsEpo3u2;Q$Zt@t2#Wd+XR;HRUNroIbc;9?uHO?BHaB5xGKl9E zG(+^97R}B+NbJW}JbwxK@_&%`?qNyi>;Cs@waPWSN!P5_WGAJ5PPyBaPMMhppu$?4X?(dfm_x-u=`}HofsT#Kkjtbh+lxC&-OA1AH!}6^3 z_NN!nLe@R4guRzQbeBzmPsuiN)6B@IN{^Q%c#^N=Gwuq)TRT|NJ__`Bp;vd_JLZ&7L?v>_dfIQ&jg)V zBF~k1(DeFa45icA7)9knGIYzVByrd6>T4nte7Aq#vpBNiuk+GnGblkr^5-IBHv$_$ zrOteN$V+n`w%bSU|6e<5!c$*~>rc0!pQH@ejx;W~&ixbi`Tf5Xm#s7wtkEYfjxiqX zqu*IO+nA7F4bHub@~y3#-k`bO8&LI1{I}*q?4zjMom5%bc04i_39m`?%v?&v{G zu$LjY#>@m$sm@Hvv*YByaeNgA+O|r3QkXZ^7%Ta#2tzz8ygN>9NqhqxLjS(@heD<= z7=+QoDTS2YnY%y)59P?M+No$;`bbrI2f96IDdjBkS8}01SDBqmS@bn zwh8qkY*e!DI54K;TibM7?Ti0b$jRlh3no}YP}{Jyi&fj|C~nm>S1|TA;(s&P-+IuS zC!Y)L2Cvx)rmwy7f1$v#&N#NW(-O3&Ufp2&br?7JTR(0lFUJ+~{eGzKpOsd^CPGW@ zbF5IeMmzs2PbZxTP_J2UHp4SJkA)3djnRIe+#$lgIGQawdpfl~dc3tDCP^?IFfW9A zf_?un{`vvZ&tv=YfU7|3)X1n>onr}h^FF0q*Bm=e&|lI6u=j+UV3VOm$)YlnZsIGH zDEpMB0=$9m3Bx~Igwwt!0lGP9Xa)slD}2KUpKgsJ;*fym3~h~TYeM7M-Ul8F$}byX zze!hMD-(;=Uj&N3$+I3sO1>g)llV+Bjds>FeJ1dA-p&Ydkt_)c_`o9sQ&$F*4`dul zXUu=%ZTu+cT99X&PRWyAe>HPh)9D_W7Yuw2j9dC!H65|T{r%B~KTPyJY_S*^s)*%R zR|bl(u_crkZ(jKBm`IPFOq20#;NZ>7y@yQ^rX2j)ybDutc__SRbvEmlTT#c{9DW*U zG;Ix*z5zQP-ItZ77;Gb5rvHzylsZKZbv90avz%%!b7d1v`WUohElwO$vi)iXi?DtZ zgKN-w)B4F1ODV+E_vL>P#Vn?O+yC3B_LTJzQ0?(6H`aWrNg|}CJ-Li%_@Hgow0g;( ze9?XYuWE>#g^@IwkdI!!c}so8f7QMCptH4UTIYgPyD?9Hn6Q_xppPd$v;752z+fGz zXAY+~w{6F-CRh43y;Ck8kDeE%jBVhxxhZ8G(O*0D+d{P?q@Ou-u8ptBGIRrD-Y4%P ziCZsAGy(jinR00)xqR2~#vJ&=e?uqJVrnz5@!uT zszEuyZxz|W&1&FBsMe#}*4j{KW6iw@<`w!gw7>7Sig*m%=5piM@I(3U;kqw`qQU(; z7-VQh-V-0>ks@-T<3r-9$~eNw2`SjTeh+>2L6K;$U>V7@qNi*ALqA6X^{*-$N zt;VYgb6jMoxxsh1$Cr`d3$-^GUqbA>)|7^=<8K{{#xj3!DC*=Vk%?i7c3HsuF(8V5 z{&VhWb-)gZx*%|%_k7f^ZQ+VR)RVc64PV1yUhfQEXoV{*NMrty(+{|!mmU&l+ z{#eN=$neW}BF<{NW_VCVy$(**WXx|(>K>10+~Oj#nHD2s*;qY3zmIE1;P(`HzpQNK ziXKHhEm>om2M+0C!EirnN?K8ZHW-zue#(b_4Y1k>tHRHMyZr#ATTQ4z`GUQlWA(<> zrD|OFn(3(>zAwS{s!yvsO#Dl}N^z{b^_x8McyxEwCfwbOe_@dPj2aO2q47yPM?MY? zA(LbO3wDa_AkJXLUn2!Yq^^g?Ez#5ij=|U{Hj<#LQs*F@@rjmbU0sV~x&yyvsr!0N zKh)7b^{{(2DoO*ayL`bC+IJ@E661}&lCTH#G4&fNpZ5F%MYt$X#jKknR2Ox~*904R ztn00Tz`L-=2mJK!;-YQWungZClmxXiwtC9Ofs^8hq-H}pJm~}kQ@X{4RW+q%A zdIU)W%!GZQ-ysW|S8F$ld*-$VXH6+Lh!W2v<^lUFXpEL%7(^D!E}BR+oX#>78G6I6 z9_VO<><*3gh=9VsFnx&0FH;W5L;tBMQ(zkH5Dt!lddf@Vuw8PXk4D)ed}{+I?MnXL z!-$LSwz=yaSLVTGNw;d1>yA_kTh}nMLxSNLEI7%t9LX3P!(tDlbKm*>(3)`vZ1+FmHjI5f4$`jVU8kQse6WFHg zaabM0W7=&pH^A3~a^KCFcif2?MH%ehdl$qq%#b$>f7D}p*f)70>Xb}x)#S&P1OL(T z9ajY|XU?t*2UE9EJ~`6SFQ6WGbS}cw`RNrEa%ku?&8L#`V8_%>s-A7`VxiQl`;PP6OrqDNo4Nv_#6cYJ4D z&j`!5N*2fIf}2*?UDFN)O1D&oBx8U`)28tNXl}`9Xk0XrJsAhb4f58jD>M*7nt15y zcS)3gaf=zr9sbT_03)nxOfwDqV~-g`$lgBc)!3rkNCL?t-krUlf=XWOJd+VJgD5aY zney9rtA7Z4xE+2wYxAYfl#L{-U$1eGm=p#6ao2X`u<3QRyL41v$OGvY9urfhC@@0X zLJ&t+T=DNF`r5(~G~-S%Fa_-D9qULQLTIqzVDv=`KK-YKC$++ z{pDx!^}%xm4#?d=r?nnG>~b_Me?@MVwS0v44WTEO(~4LGaUOAxpVx zMnV%Gh99cXx79Afb)I9l8Duo-i!w*?{7k7XrI#1#%)eg4D*`i+@8~xyia*1lU8pkr zA%5EEcq9@@q2Is~Kc{0A>1*VxZ-M)AQ_6^>3A7PyoRHG8-wZu0g71_ypFQmQF8qFpqC7#S4zSdO3Z*%ln zhw=7&>zfs^{kRqo@nU>Y!mH$yKi&f`F>5FMcen9v!jZZDRwFeAj(_ei3fDm&ySM6# zYXhit&IPLL4D=$qHj+B`z&f*BaDri}gw$ra>CdVVe`g(NK+y4M5lB(c+`g5)y;{d3 z2oaBqEq$}!`PO7<7_X&1iSSp|ayrwP(B(Xe@eLdRZg^MH=>RR{6FVY0qe@Qi+YiE8 za>H`>l67G1@293dRBCKUgjcfbxX^pXy7_>^lw7Y2G366OYd}b$VU^L4sStfaSCAS* z!Oy&j+eqgp&wj2VVdxxB=6M*lZ4e9vZB^-}gOcd&suo`~RMJ2dje=MG*!x}8Rmy;> zs88gKqVbs)kR^eZZt?L*IwB|OX}mMr^rfS>qeK??Sfju^Nx$Owo3rDb^b^t9%NEY7 z5P^h0VlI&g!>T@^B%sm?3TcN2$lBR4|MgNMNQjXx6YpSf6KB4{6*yvoNe|RjtBj*X zO?35JxN7#nQfu&=B+-x_#3F;7i2tU(doF_iOS1tl{_NG4NPfFtsCFy_Jy+!zehRpa zTdrAOL7Yh30Gs-VzYy&@&ah9Gs5pYO%ZY{;LBpO}DU9tJ%yHe1azGe0{^a>0BM?h@ zfM}i>Y`yTqLXaAdFf2R4wp9@v4F1B5^%owchBA{F1ULXksaXW}B-tPzW5}J%FDly< ze&SalmKwyo4@6&CmduXFs&+&{SE0a`^+3f2Xwhb`Nt&#ybXYkRY}-iA4REWJu^vW+ zz1}bWM!xwl@yfQp;QRj^Sks@FzU!1Pd^nOanM65Wq&b0(O6;t0o9NqXdej;A0JY;` z7H!D3n`3PcLkS+_rzy^eMw>)8!U^4F)1eO|@>xqhuvXvO)WnSxE>%xf5qt78`|?u? zc`5xhy}ONPXu;hw(Vc9=p+{E=utW&zB%?&BDKTspuFEC16^G3Ivq#(ta@Ee6H%)uS z0)0decHw)ZXDaN+{VlihEk_SG#?}YpR#$n0%a@j~(HGEres@og(oOWK^z$@FA*{1B z>nKKY%-4Hr1Ny%1_f62&mA|%K__<7^@C#ncEMllO!soZcYa>jxfmMDJA~2m@Pl`$M z9tRh3k?rDSi8in_@z`gL(M@bwDrH6ln#$e}I=5S#kCEY~~GqOqpRi ze!aHriP^x*F|9Q>#sgfw=5QY2Advi>TX2;*?Shd2w#Y<4 zCiUS zHQPOAN)OGfSKgsM6D(EhCR62DMtpE+v_m*Aj+7xGP(98#g3>NTCV6CbMvIo2DJaKO z)k#rvB>Zc(s|ssEYM|Bh`62jGkMcSc1!>vicr^}Bkh`8?c38ic+p7LsM4+fr*duqN6gvy~+!aX!WQJ?mh&gSF0+6HS|+8yTxXu!ME zI~$B&pQtK%CFK&_@ZE%hCXE}zQ_}#MrdApZd_Qc{tQIOjhm~A%Vgsq zCS_Xx?O^~9)CBy+7ADN7F*|M*<&qhRiznyx^L;Ft*{3GECWNe&75#NdyowKR5*f50&}BcvKZVFAfn1Ka%CzQ4o-UsT zf*>?&)|W6!P#H!(Bm#P9c;n*Vfmay6`4BuRgxSf`2*M99>%FNI}WPO)<*f~ zaIkuJZGnD0TIvDwf13oKbZE-wmpX`42~IOdQOyO2SM)tBZq-F^3*@!s2Ll7joHDxZ z6QaaKpw0d}?@lSFN)vgy@M9h^IAR>Fq8xuYo8}hROZiB6?rqzkL&<*+nwHqwSV{Tj zn0!V9{fu9eh)hkXnHdM+BG+L^ks;Ge3t8L%Ok6A>$|1o$Z_U!cJ$`V1@TrmEg~U6x zL%km~W9?a?lVRQQrYvBY>8%F=ZhO?eS0Iz)yh!Z~qCMC6Cv43_tt}?*cOtjp3$`T~#|1Bf zq~2KZZT~R_H0Ko74X-UHd)X2|_$u1;j81}mWc^y;K_;L)>^Lr>1X?O)kw*|c~l?!D3d&_d$pK))JULNl^FSAw^uS2a&6L_3jjGyDD z%sYh}be~_&Zif(nU|(ZFpxmQO(+disy@QpNyjAY-?Tq8N&Fgz%|5$V{*;^yN5x1}! z1xFo(PdjDd)j8fik5c%^0eI8oZqBbZ^0PHhbId1-%y@SK>c`MYM>k0rTm#+;PzFFy z9_SMDoA#HmlHl#aGH3w~7=p8>f zYc_V3emkaHEPj^Q&Ms>gV7o&Xk8RL}%do--XmYB z*e_fC&Yb|Cr(>g38_;~nPH73KclVsU)4u^YAC=3w;4!HzA&Y`-{Kid_#kR1w^(#0Z z1B4V|0cF6!%Rk}?J#c6^Q*f7>(vx=K3$yLVz{{Sxx=lLWx_RLr@ZGjsW*YXGN1Wbq zw}-E3P`GO=2{*`o*mJZ%(t5Z+Qz?|1ZwGE@8B;z_t+?|GBh7@pZphN=$UnDEZ$DS7 zuq|=KMBWU@c`A2fUTeFG3?xvM1^A^;_sjCzm9!#acbU%Zu<3k$ApSC>KT?A&T`|Fw zF1A?CLvTVqoB0`c3g(fae!112%V7jOfLx*Kd_>>oe^EIS1&<34Lso^|qx0q$8&Qz) zC%?O0C*2~uhcTPwmt)9y$}vuj_UWY)UYVDNUuU_qTa#igCH}Mjf-JqmzBUbe;r@wi z*EhVWLTWA5`4SFDd_kcP#}I^H?H#s7x$H7*((A2~f3&18f2Z{jA$i+&e}WbU1`{~u zX7*Q(JgJRag#APR_cubiM}9w0ZI0V>aT`7Nrwp=XE1#-pn|se`vZ}pz2ZkZ_wj%~o`Zo=$xl3pZ1h)}WMAoh@?bIEaglwI^tSvo)m|_3>n#z~BojqDxo%HD{C)Sv zT@SxdkyrlZbnp17yuY-CDN`}|_t2q}q&yD3q1ahS4sJ1TDuw)DD4p+)KZlqfBZI%( zs#7tD2tGkhky8)$XN1HoE~)2=cOOO z9UV=Y9&xuICNzo6hk|6Ja28Cx!q<==g*6u6DG9?vz^Eof{CjMnvs2?3>k0nx!jo^j zk}rMdBeHE>-(1|*ux3LBK{zh+-Y?1MHm^bH&TVsSw56x&4)1^uPJ?LkrkCxLT-&ND zZ&Aae_CiAt*bf#ZT(q-tqiQ`mX3aerYEeVeSl;lT8+x%?lWA3J^M1Z$H^~z{<1a12 zk}!pqTL&1M^O+kJ8-ekz-Nw5&1E+335Ns#G@#*e&S8qG&7Kdd}M|F$tLjfj(w_sCY z*}-hel#iqR*405|R+F_d|6=@|2(5UF>NiaP)Co1ay4QspwWsRi z3;g%&P_i(7DOw+|Qyf`OW~Zs+_oeB@)id$ygIbaKi}JX%vy_*tD?ac$^P^u9XG&nD zC}1RAuPME6`%VzKub+4h)Mppi6fu(yv>- zXdBG4pLvamoqmY4Cexwl-hK}1H|-XO-)Dj98 zGS-sxN}F-jz@6UJig3+$LGxLg1&Q}cC^JO_6B8VWqi=3y8`{1SF?|(9eOz^UPMPhX zo0y5;!Dw)N{qP!XV@m7F?mVp|X-|?L>JFq~%XqiPBYVa#2JVdK)lP%WJ25}h9ASKb zMIz)BMZRQvjsTlLfuW%W6|MFL<4w z7VQ6A+(%eS4L?<1J!3H(V%(zdre?>36ASf}?2$46l*|~c0mKFlwdI zUNi~mr3IWuT$ZS_#S}SuZ|Sk%uU#cqyC;z>jK(~^APiWb40?jG9PtrwFnUbqMvvnQ zWWIloxg2Dh{U^Z#gn*fayZb-VDsrCxKGMj~M<$kgqV);iKQ|Zg?>!CuV`J2GX}$X&&z^=ceV)Rksa zu!Qw1}ok!Hzr+`@)XD{8;`X2|z24;pu}ZMUGv8DZKd z6OfFnYi63hLU$H&wZp3k`FE*1Bbig}^u@LSx0%q|hit>x!J!DM@Cr4%6xot}0IkQnR9Nc%2v z&f0Ihsr38LuQSWwH9QzgOnor(!2G*=UcmT0;8tJ$xr6LJUu#B%MVJnYQ}e;O=Q2cO z%hAtgZd<;QvjXIC zLSOWF&`iLwA#{W|cOyvV4w(1e>-xU9Tl;mvY|g$^z3>a9ck%IHG*^kg!KcV7}xE zqw?B#&*<^nB@rIoPT}uCS0LK~I#l(R)VB{UL)ft37mnMwNmZz6xZt6rXXWlq^n-?q z#yE6n%9+U_U`D#3WXpR^I|9q%9Ggh>e_VC44>!2DQ4lb-d_265gUSyvd2*%F$XDSA4(OjGkEw!-kE zMt6v?-~5GMBdxs2>)QH6G1~+;i;@{z(D(g%ywRr1+TiY0qNzd7{(h)hTDkN9%t51j zrE~u(6siN2AzK2qrazKWUV)YH^|sI$*#P-v7zrc|=(aDbCy-_VXrNU2x~%#WRRXN> zy6;$u;~F$aumI6ieeG5>yb6__!1|e^C-!rN-~Au1vUdRNdMs7h>Sm}-0&#m9=mle( zltD^q1a1c&ElJJ~B<(h@Oa2_xA&0t*9;#q8A`TKKS`=tD#HmWR1)lMnQ5rM_y|*uC zAlSi@xSF&U&$lsK6d9Kz94}h2>iZb&M{xTZjl)Cl%yFHkB$N%4`Y{5nStYGQHW*fa z+67t}7bM)w!ewRny`w-eDTsz;Ig6(~MJh1`SeT845^X zplD6E+`IE1cddH#nm zrs>dc%^9F#jOPRTLs`hF-nZE7Osl#iOKULe|4ycqiQ%{3%e` z-R+BwQ*UpBe&Cw3tbJcpHA^&a@V{wi>A``12ceNX+~eW~rMtx-@t&1}c5};dc?dPT<tan_jxKzV)Z4#S)j8_vO4YogrTI;BhV_9v7~5@Y8j3>zulaIJ+w3C2Z@lvp zofZ6MC6bZ3y#K^v?bsmcN0c8n$}`y z)MBw>D`lzAK(N0<(I=qb?Up~Fg}?tlyKsCIicLu3Som zBJw=GlO8%bgcRg*`0HZIV5g(O6h^JjB zv*zlQ1?M4~O3Yz?}j$KQNqtEo(dw6?>8)$}FXlEZNK6I@A_dsIBM?cVWvraq*;iiLiY8kfO7pcSnN5dF6%m0m$tG% zEjx450)k)}t>o!>=OmM~@(E2(DR6*8?gkLkPCGOs4bbYp=|9fPl98`K8dyt3=cC%; zfmdW*^i0Z(4D6!b|7)CsfQ1bxzhf%N1DCZ>;UCk-*Y<7ygbt2r@ko?0XgJ`fVyw&q zEc@5};soLCMVmpO6`5XLT8kfO%h&pdhktDCyJ4=nF0{QZ0{q8A0SEcd+w0&Mp_?_~ zhOymajgZ$Bw}(Z_3RbM$Po=0#_j+wb9Bte{y3n@Q1kU>p$U&t0j)y4VDX=0i#^_Eo zzahVDU2~))c+M#rAV5g-mWLo^M&PmG!nkV+Sr=pCJ(lqn^6I%xtDKEJnfNtO|5VpW zbP3=*Q|Jd#h%Evo*_^FAUBxr`;6|a#5E6S!xTKb`@G%VWR2OJebZKMZ&iAi?h5i2Z zC#nQ2KkH0VN`EWP_&QETI>JC-C}`8-qw2^MLyKw_fODe=8Y#}yfKHhz0`V&Hr+0s` zX+iRX`L`JL)1fGK*E$aIq^qKpI8&a|B7wUkI`)KnaBWoixY3ZUjqReFZ8+mfxl%69 ziG{UN=I+N1*Z9)ot16mV?yz~1$}0zc<9Jg8%(ynXW*8mK@(r_y;yH>ZR*OJz9&y%b zC(nXSzc@YqvW$_+uA^E+BN)Mu629$Kn_UfBG(qjZSIDM1rH&yg{xY5189Hagi#*oh z4|-u0aX4{Loti1u}nJDp8U!ge$HOZblg2|AImE zGiI%LNn}1UM(vHys0g%a@}W8}+;DRR+(TPMkp*N~-TP;a9&oBcQz{vr;V46m)ehBd zYUog={(i_Md5PE!Wj@g>nRpFx4TK@)-b2`AVBr_54sIC;nXIl{$-fC-D2ykJpw%Br zAZ>;wvRtfIL*aykdP4UP#-DxrOi2J6pGlrmV-(k%{W(ZM6*T# zO#zM)r&#f6rl;+4`vu?OzCvAnWiFi%n>NTUr8K9)K%zp@@JT zs7RZ8;f12Y{0Or@a8TgXP*F643}Z6|iS3>X{1v+TrSsUCg?7<^Mfsfmsoi_^%dL)$ z%Ee^x43W7lSIQ=~u9xthuhZw}tVOG*6g24&TM zJeC}exFFvcqAAxFb~NCG?k*lO9?q;=gezU4i@r2dj@$XzG=>FU_5Bg71auwScCR$S zef=Z3J@Xk;fHnlkft0t#fP6-QnQxj5v+ech-VLsG`+|M)lrWk{Ny+U|dsK!_W@5QY zaw`=%J-$K+byMBbiRa1tWuC-}cFrJjo-iNvl9`EoXN%sp+t+bpCJ4Cyf7@mNkubTN zl7@m$F9Pq>FYj8)V65x4)JUT9wi6s@uVm9Oe&+UQvu+uW^n$D012v4t^D*7Fee5Fq zNoyo5T6W{kZQZg=SIrXT1Ne4_BF=!%qbO`~%iAalJ)uWwdq>l2+@R|xG;YGqclx5F zV7Sp*vwagAo(q6XtKpgwU{b$6dE%n&X*tRVF2UtFj6K5A2*YX20=D=X1yO zuyKLELHn7KzSuZ`M_c$Cz)B~wHt4uX7ALevf{#YmJ&$yTB_~0R#Uk|9LOo9UVd4wYM1jfS>NhD*VHQ|&^mxmCI5$mumP$13 zF46Vb{*0pR(2ff}zHXg`BTuMNy7>`fxq7e!5-QQtly;+8be^MB1_vRD2%gR^XHuV{ zOqOwn()b%zb{cR_S_$&Q_{>K_lH6icmuwxI0MA4nS696aN!VY}_~8Z7)qJVRatT0m z0}J{{QyreFZ*A4K=HXspm@K?q9IBB2^9bL8HkJcd&tIZW1mZ@UI7;p%vcu%fu8!r+ zwnbv&I@kh>?bJYmxeZ_`Df9MLyCP2yoN@Fi1!0t~HVp#<^G9~YI-iv&sDgn}26uqd zC6UD;7o33q6yNd)CEB9pJ!Q2KOvWHvNP?@gHr8Q)h^~L@!KYv{rJgGHmO#Dgn$_G&upc#o$OoH_7I~bTPXmd)7ouH#SaN=wBUe9W zHvCmB9X;xklE@QE3ECURsmEF^QuM!eH?vX9X{kIQY9&^1^kXa3y=TYA<0_`+z0xbWvML~1=cEsR zRY~clq)SK9cj3JRFRV0)rAsj^#y|G+iC)iWG6V>*@}Wp33KO0OvQ0x!O0KWCq@%Ts z6Vf{sI(Y!gi)Qr59MHOm1C9d6WMhkD54BhyqG;?&kPlD0Y0o4cpznd9XHYaHzpCUE zAiKHds9J>+3bD~l|7;u{g)8pGcjqaH3|JA*MmkxPYu#Y$Igepqb8c1Q`p)Nby==E| zvLz_7&82eakHwRR1wCQQjtxRXW9MRhH~+Ddw=JeAfwo_HCDXR?qlD{JTk_C7Kpz z6AHJSWY*|h*L3Xq62wVKs=R%`)woRkE)Ps{)?%1zAy-a9Z9hh;8qq6HuXQ-}r8z+H z)=7MOZ_!E!#`b!JQa4}N!b8vbmaKeY-8h**AGeMDqJJIFyYMY}ZURzM=SfXTAHK-a z&D6jxFCHq#E{jTyP@Aj69^8^SooIAokw^W*en&2m9a)k4Gq`7 zN-*6~x0NlUnr`DJHRwM@WjdFsCIRG8WcjNt{Eu23=-i_wbybfugdhQcHL+~ z3Bpk3%RBHQbL#~>p0HxK~wo+yDb4p)U+Sch80@UwF3tyVp!y6@+YJAi=#wN@* z(E;GQ)SY+=W0-?)G7eftqf@KvzrTPyVh>hfq0yFHlZFBOCPOTC#0k}RdcCpa*hj5NB9jyMM;g{FK{UndC;1)vT5b>i`g;W$6}hM+Pv*?P#N)x{m&p~}|y zmhgB>tsI(UdkIuwWgUQDc2n<||I>V2Bzz*w4CTEfnlePc#>cX;8FbP)axk+kw2qU& z-=DfuVl$L##^s!{WRZt7`evZ3x#Ga)gMiC5v>|=3mEPkv2_Rcx7d09}Am&qy8h@Z>>~M`zRY9@=v&}>qF)T65Ot&oPC9` zowSdhjpS75+_#tzO)>S}nHRlQqew;tWXI`WgG5$!?ahR?j2ajK$-G=2*D#@*8btMA zbgx2LPaAe+qQ6a?w^oVcqQlU9A!TrjnztoL+({kZp3m1dOg2@gmHg7Cxmr@APgHG) zK}>fywA}^YOsCRQg?D%ILTtY}R8N=56H3OfXY3!pJZrLM%fs-_x~E~v6?A*81uL7Y z__FDJD5qqhM_yg!CqBit4)B}iijATDtNJ6`tJ2QZD__C*sl_|jvg(a;GKr_^iM}H* zH$KT>v6@=gNb7;Bfr-!Grb&#r+3QKFJK0zHJregcEfu)sgfZ?vju4Qy6Nn z&hVKYXEL`puqYqBK$zc>U-;U(V!kuOC7@=qJnNl~5dGs5IL#7Ie+p|(R;=ZKBA~jP z_4{vz@PsZihJ`0vt`khxTD{D-Ze3?MZ8iagLZ0)@uN$rdn6d2`$1!$lYed~v+K zvm-7*l&4A@?SY|gG|@|FC1r-6b5~rcnGGQuGqMp`VW*=3EoMAZY>a^8lTyTc;Ynz6 zH2WLf)D>~^gGE<}+`H;$A%UbFn2Q+mk)T@qC0`qDqnLJgg!2B%D;bI_y0vs*X6h%_Vzo%q)84=vPjY%3N>1{e z)b%ymy<|JT1iu)mG|D^Ox)>ehM-by`li8qY+k zymZnd5LcxO;VYPIe}yTiXJwhWkNCI=cg)*#V`MSL6W6|YavZJ0koE=@NqJG!WEWuLD z=w*U^z3lgti86wHG@21vtWCz`Z-5KN2qox~iLsKg$6rT7b?LUVZl3Uq+5g_{TTD1~TI@?v!TG-1O65acA*C4wA8WxW z*@8g8X|xUmX<0@{W>jL@`x)a%uhZpnu`SHCRgi^DQ5)o{JmJh3BS_~v9X9G846*7% zx)MyM10+cUko2GoI`LqlDNEOpkpD(~n>@)x@ss@TM)JIA!&Br_4*laU4)Jm4{R@6? zqN&;mF8b5&M4I&)5YDq*Gxsm)bP)8EpM)Goq5dA6jqN)x2*g5{IyT^wlr`BRuqhPQ zXI#ZYNW+ChMX2eIts0u+Cw9CDriM$WR!^gfQB+h}0_>{HH`W>T7?okW zanDxjb`B_Y)A@?@n)Za?EeuFlRk%v;*hC!47YAD(L8eO?`PIYG{zh?(?+hr%9SHJ! z>vd6a6@LO#NFi2xDgdfpA_Q|sHiN8u!5@EhsoB{>d;e={-ur|;|2M|iA)#I-4M_V zUeXqtdmh5CUT9&gYGn}Cn`nfOlzmV@*n68ZZ+VU-K7h$F_k$eYS5#uG*XS0@ukjAU zF$@$}NGa8wieWg#R(EkYXD|G&SXU|AEvK>GU$E+2Qjb6c$BTTkj!x?_cMcqC5V;Y}f4a#cmDhH_lrX)ZzR z{zklmDRUwj? zNPbBz_#n$O%3Kyw(>%QWfp@ckb#)p=mOmD-O=P(yS z+@EN;?d3W)BSym#ku=_)v`;3;4yxT+&Ra_vNmqY>yPpFeH-OF;JVrEH?zc{}cWFOz zE%R0l&V_N>%nR0Aj1d9F1sB}oHxuRpo}%R8V zuG&*iA=b3eLm~uycxFvB6-{*!dCT8(mM zngoRxn3*rl!yRyYlFXT1Rb#|`YyY-w=KaP~?n|%{DJ#Vw5MixzKX0~n z#_jS(Ith`UN_^U$jnk!ku2ubAY<0R-yZ9xY1jQ#E>7oZ%rF;!4JmB?V@cszblSw38 z*qB&!g}263)BXTsy%Tw?D875uqbu*Y%8klL*}bGwW>)7rmN4K>mgX8u4cnvPO0Ypo zahl*t#%wPoV`t^qaRC=m(pOc2Iyo2^A*nmdcpYhdl+XPtu;v%ANagnb^^$si^W}qb zAoXU6od51iJ@wSS{z{5Pr_PVIj1&9Ha9~$`mw2QJB@U;PBOGr${GH>8fb|z*$4HPQ zIJ>?+$vfi^^u42MI3J#QR{Q-*luoSMoe$JlyW^H|Ziak#LIeWf$8NaF=cNsX&x|oR5(T*f1 ztbIu$EGPIeG8b@MD-q8MDDm~=w;Z+E^-#54K#br`Oa=k+sWjhpvEg1gQy8wh5Lny%8Lq#Lw3f8j$#7zb=!fieJE+lN;C;-~ zjC+>7{`GjCQe*AlxYrDK^~v6YMWI=a4CX5NHZ-`T)Ir08fWmM_tUuY_rhXwsUC{vK z$wfr+Tcw33WXhcj?BOPOL$fI{$ac}Yxmis6$T520XEo(8MPZlVJw#>BU+4&#{k3u> zEX#);qk9*7+)T`Hd?*)-Un!Y2I1b=^>&s(Dk))d=Da7BDbhy67uLfxoMxtjm74v~l zZnB?8>fZKbHyIKF!Z315RE4>5R4s{S7-2ediHzI&3rc!K=eU83WT?wZ5@H2TI5ODP z_0JcOX+}Ha?Nbrei@Gac0c>JSG~k@GsNp5pswKdeT{O7sbHBSV*XK9uOZd)*##gcH zPM|MXC!#XHt>3MC@#?13UMD+J#f)3v;QCYnY7gPnaL0%_>?0I}SC;Ba@xsK@7*`KU zVs8K8J%q3*5KM7<+O1)nLRLg8V!7=&Vlar@x3MN-Tk_{IAs@%|h1j8vDJYW^n{+u= zxf-0G+9Sb1)|wUIp3l~7nF z+6PwM7XwiL;2>y%tfLhlxD=10KVO&ZaV62b=p4YKw{5RZ0#-XNB2Api)l-{nEtf`{ ze;>!o$x7EgN&5^PBX;v|ZNF(N^&GCLyPzC}pAfjjhmHH;W@gC63r}W-1V{|e;ie7* z!ZI63&;Qo`^Wwbvj$^ae;dP#HTb;3S3$>2E10Yv9r@@N~B)NasC};5Zd(6B+J=2N` z5di03<-He!q@E%C(Ph%|2e8$~n@>P}@WbqmgACk32sHQnq>t&)Y+})&VG=wyMe&uf z0GwzXui40>qqZ|b4-u-CHhKF%#=42mG{_*a4WGDP+*n7RN)T-Dnht|=X9+f-U> z2KC|lB2*io2cT^+kwoY}Vg$|a*$^&`sK4kF*vf=CETlsGT zn(&8roX|PGt}QJR?FYvZGpdRWMEa{t?blNkYq}8!8T_31ZrNAHo@)GqKsF!EWXCt9 zIQ=7E9Mr`PhI=HTQ5avMV}R(CnIuRZAdzJ+^P6zC~gkZI-AyPD*ND2@>Gy z(-=WR>L}%MeIoB;i4v^rTxXURVG^$pE9P&@S^b#MmR+fDPmP-4jpB8y@ZUqN@Vgnh zVvvS2T6dCNFU1v4^9aQR%Frd;MB-`m)N_tyuEd;!eJ=eF=dklG#mA}Lkqb77qNzW? zH5$8>*Q>2S^{nox4r)4`3f{Y+abAS!*A?x`vd|#$_0Sekt&|jUb!x#Y6~Ubd_=VC! zyUmFy;n%o1H(alGV~zem(G~<#8gtos+er0v!H}D{OZR?JQ`>K$ItKThkdt+0c0qrcb{qu{4HX{eN{wCrP1SwG#BmYc&GPeL9~cZJIE*^n~L zJ^s{>zreTXtt+*{wd122_f!EV)(&3egAn)?|a@ubQZBGsb@tk}u#Dz{s9W1-uAV(NR!P z96?UWu)-1+wmCk(A3+IUc~V2pB@4WX#O{Q?;e))y8Vl;+0EIsva+;H zC8w*bRmLJ|-0gYB%pXjfOWuV*)C9O)YOO6?8q^kP(s_K9Z~2?kY8QEEqe zI@p>6xkoLpQem~^w)ViFeM3bQcoP7rZTVW4qgziU{{a?w+C&CiWbkd;Rr~C}fWwzJ z#wdrRUb<~>syN1KHp4ojYRhcE5pf@K4wKuY$QUbwahM3=7rC>? zNrCjzftpAmU$N@^EFC*a$OyYVWsCek^dMF4>3E2}X@Z_i3G3gd#+;*Ht&~%0P{Pl) zdGq?(rX|irx-As(J#(n)2-^BH7QWOca1v{40Xk!&!xAi4@^}9t_d%y0GF%<#D`==9 zGa^{jK28Ga1XZ5-g~#bm%~_E_>bF2v<`uC=d8!ifl`cpe5*~?m*%S_?pY8Vc=G? z?PHeFp}J=hOVAF+Dx%`See#22K*1aZ!1(`S(F|PGkt|76^frZKD5@XTaE|)uIS}>)O+j_BdhLe`dbxnj(L;|ctfVLY;D+{E?*xK6KQHM&2_|>+LZ-BG4!rnG__wPiJC()RQEteE9Eyy zRyPQ!+2Qga)9?*V}MXr{(|I>zl#sUV!QwIjd;3~-EJ}OEP_m_{W3;? zcB+*k+f~xih|LvVXDHt2gvY@0UI+0~J;e=uya!bd(*wNGxv%nbWbJ_r)mB@u@;@=W zWkxQtl5}DhYT7L5FF~T96c9nL{cYCbDG$06wnRvv5k=_|d;Ihhq}plZORmIPZ*q}x z!jeHZ*Rm@VG1dklJIfdiLuul46izFzD270EjU&{|*~HIz0{yb2oi6mh&_@}@v0%V+ z7u%^Px!Ex*zmGuheq%shglU()Kp9h;0OAFiwohRmc<1K0x|4bC1RXj*!;276Wx)YT zH7h2uV-m0*eggzP1m84N1Z_Mnc$1L*Lv{nfUWNwmO}O(-A7n3CE~v$sHZ{WNJg5J2 zpZk08`S9zgSwf-09RpZtYMh1O-h*RiEd&Ixd{$ZEf}=uZ5bA{y{A#N5i7T#JBYR;2 zS(WAJX>MVpkAbB;keoU&0KkNrP$yIZOV}z3Bi!t9?b0R8_q0O-9K9K=_zE1*fkj+U zx2|eBl=QT;0+ zLs@=HsCXr=F9y$#<-pw8xTk&t7+XHt^_)DT;$pdhlZ*BPSqNf|nMs~6>{vQ4eG`;U z^h{Iq$JrqJ2bN6Epk^>75w@ZmP{LHTJ*_@J!ARX36-B<`g(MFkB4;5_2Ob7#gWhT~ ztCxPWxg}u9TrV=@C;|1pFr_h*^5s`OG7u?h%jpzUWgqA5idwpm4^xVW>2syT zItTg@wQHsK{HEPsUe?O5MkRE*w0U-04+Q1dH(7qUSN~(LbRIm7P`RSS4T4{7;z< z{E#b7%gxG~RVlI2|I3t=ug@!aYZ}SV68=*;B51m3^(|2?=FuhpGpniGVh&oO^f&B@ zI!a=M4`&CA_P9L5&NekcKa@4H`F2f9fYy*t*4p@Lm>n=?a#U}(hcn|6$DPAG_QvoB z#v9!IAqn&v$?5vk$!3!)$iB|dz`O2NH{niBejB+Mn_09t8@@j!*g;C4IQ)kL= zswt~9T=f>8m74nrAZ?XnBkl1zDmk zZ=?w#m>cod?+fIq&MsSwSlfZOuIa)Yukj|q`!ge4ecO3h=4aN);|<`ToO!#oJ}AKMW0QFZ%Y_%OYvyaxknSSS&no*t zQP{8^ysH-;Jvv(krNf`5^E>um;ipPJ3zp|xE&%`g3iOU%0a;{9DjgrNC7H4>-c?IR zrcugLFW%-*HTD>~+oWzN)vdhWT=1B+FqDu7&3&S)7-e`bd$;dr@yhj0gZ?-tHjj%p zK1SRJ?fqatiTptSia8q%(HT*@sjgRCLv6-8Vg@>5+!lVv47HpEeSk)r5HLUTr{2^* zXQ;~`lOEp=$IuDG$}#N7z+mZsHQWI{DLzY1q?SM}!^+ECi29>*XD>d8zpN=P>m#Pe8>V zLh#}O0y9I?EWDy0npa>yxJQU+=hf#a*ai#LSLsK2*&9KcG`JZ?T+arIJr3jwe)GWj zcc$Fi^j4jAXg;?2U|~ZwU$)B16Ou-P{co`U8({m)Sbx~HUFkhpkBc|h z9Mfr(;{n+YOflN#@+Sc0-z+hSn4prpx7VrX-VM%L()w55l^?*wr(-h*II*qmsa7*@ z)>l@Km7NYMhYoBDNYE>`Txwl8KKZvJH{ijL%&)))SB!`W&vR6-hyW}8k7y`qonrC< zx}Y)Jqn^Xf<+Z~c0LU9@UmWCXnIZ{lkYZp@$5x+lF||gek}MF%d_Cqf0*QF|`<{(; zAm}&4;0EXin`%H86c~3Uvsb-O*=xCZ)3EW(UXJ*J;@(OJ)|9r!1%^JbFUXJ{7yO1A$?Kt zRvj!u?XK>9DZCVUzBu6EC`c?_eEr0mtlxl^o&ei?sB8 z_KWFsSCgU1_jL9B8dbAtE$MVh6`-Q$IV~AFDfrEJGfUs8@Qr|Lbo<`tP<;C0dT(O- z?ae~hDpp6{tHOJ@X4tH9TYk#Nbdpy*dhrD1cR#wts2IVBn3SuRE|osdD73d4A&qBp zT9D^_GE<};ZE|WvK&QjPdu3Mmw;bfe$VBcT>Q+d@;=G-(Wub;h9D+gQ29?+Van{&i zn7FPjwr%AA7&opz)<~xvd8!-caLnD2c-heIT$^fZP(_9cZD3lI!Z3|+R6Ry7n<(0m z6?+Mz<@)v;LNZCe) z1$|gBc`bT0);hLRIA^#x9yMvss(FYGuX3N0h^Ozs+85Il` zp5Q7nLFvk$Rp%7@&N_7UuOAw+a3a{jNohgj2yxe(Rb3UVJ%N*o_htRG__fO+HQ+n8 z9YN?xWt}S7P<-YV;IrJU`_@bUtToSgaG5VZX%0A*eqi>Pr{Rqt!aRDSoa~nN!PZ?|`1+B2}tECI0HI>;E{ zWxDcZnbp@eFx)uQ8Pyg`P=$_0PdHAryanw^tiV63o0AHbJ1}}r<5nxBq))v?J^}Zn zS*E;|s_!NAJ>au-8SF)ND9$+l%3u}2|juMkun&D-K{0wEx7Hie~?g~}AwEm;` z#)uT^8I6TG92hWIgbO44?!G5`Ftk#J90VcTh7)zUh!@kJ7#=aoMzMF%Oz)&h#l%8 z{N84$Nb>ldPYX zr0{<6&hM~ zI}bxj6YwXGp+%p$++rI2SpzIICJY+ySCrD^*LAZpBNGY)PO`s(>nL zA$r~cyjHs63V4v|#tWzr%ql=E>gf`I)L6`_28b=gajYN37QV3F?F`<)VP8Egl%Yd1 zKZ|%ymmgX|ZDmBVfj9O{8n(QD%<38K_c%5c$6DB3?21YF`*L0CM_pu!$dFCC1!4P4 zYKYs|9`%$z_vJFmuGO2aH0SC;U0+V@%@KPoOZVmqo3*mF0~4=ng=;7w1b@>Zajh@l zm0N7G=(J4L#;jP(7_b@Ehi$HFSNoYa6YgSuJLg33s=5nWjsXFhQx3E`J8($z0%xa@ z80z!T=di6`44|$No{*lGdQe(Wo~hI%O!LA&?VYg_269bZO;(V1=Wp zh3e?AR8`ZNXvnzo#osjy97oMdP~d2ji%;Y3QDEb&xae95)@)=ib#J_7bINof_T51( zvWycTzGMGw2LN1Taa$xsu73X%C!pdtay$y)m_k-oqwv|3XL8L6j{hIYnRZrZwg_%@ zo?)$yHz5}4hLl|_^)m;vXR@T%L$gD0Jz{>Cekp@J zo4%k~a=}|R>tRI+?N#5=i!qevc=ZD@Q0!U^z{clA64Nhs%E#rdlZ|t*c3R9BFS1Wl zW!g;n1G1RPC?8izo$loV7Zr<|W~w%FI#i!RaVrML7Qxz7eR`nUdGK-r;Ah4|$ye<) zB3PzFp*92FVwZP69BzP~vEsN=APq-UhKmTOykV?*wOoe;9K@q1t>Md9kX{Zi2~BB+ zh{f7q@2CG~@}`PCh#i{8=xi3|j;#rhEFP(3v1yMyxhTjg91cDL9AvNZTv^__=Jbke0; z5O}(ZLBO(R5&K9v9`s`f54F1$4Nz$Q7l&6Ut$p6tnz;1_0RG@iJv2{n_3mZ#ta%l; zor?OIuHicdpqtVs#xiBz8s9$TLmR7bCyzf=bI5fu!N%fq0K$`vbH4a%TXkT%q*?E- zmPDTKZHCU`HEU0gFE&JJM&PsUZi+3~aVrHGOJ`6D9f*cA$6`~M{a=j~5pJxF%$D{A zrw76+*0#yFh-M%Ly?_7v2vDH2G1{`Z5N@Myo*PjK0<;Hpod<1Z)iVP!ZO$H>a$J5) zo0KcH({4M5zo|oe9hNfv80dHjvUdly1aIfM8yXBOpLRj~5{%}h+ zX6O%sV@;e*jcBS~T9E%5M^=DA%O}=nc;gjos|kC<5y=BIv$MbN?lU;3@LK*UPf8pt z`aG6IkW`UMQUvQAx^nYvkRQ(cZvg*q0C~ekR7fG|LCw0_< zWxKT;RY%`Z9*D(Y3?f?Zf5VmOoh6K-u?(|PoVJsVqY+t?X|e^_Pm2T zb0cXyhMivm6Qv2#1Tj$3se>YLNa)i-)BblUtk7@Uh*6=?u&0#8<3-1he>a?Tfg$f_ z|9*#lNU`pCw26h_5o_K_+|v(~f0cffI+48I?T7-@96#-;7jls%I6n0wtLZq&TKVfb zYUZh>S9SI^mCjhy|AZ>oo`%I_dG6UWueQ75aKa<34#;ZICCS*nrJe&c@-!^L+%AJ*=H%wu0`z`MQnq z<$P#Ywri~*ac$)$_2Z=vHlF%ds{rxJAQQ}(c&mJOC{eFBcv3KKG>%yM?p?7{t|Ba; zC!mfjeKzbpv;33#U9Q~K<^0wJW1W?yA}HN(5&k0tfP7Q1Ao<19$C{TabeK4C*ac@s zzTMTojyad`R&&i2CUd!v z7W9aik}!mPz!aDuH}*~0oxY%LQg=NL$~wfxq*OFEhS zh6)=-Z&OsxQl>gzMV;5^5Y1>XJx%W9ZBfLpj9$uB)!`37+PdS6d{|iciNF8mZFs5N zNZPktWlnX^LM>t|51vKdSLgju7jZtAgaXYf?*boy70PJPb3I4elbg?Yx{LML;Xb<0 zW+LXZU`Ej!n@DY2we7B|28wBiN4-!U2E?xCx^CVpd3Ft^hooDf=}zsH=e6YuAr-hy z$5&e~yv*Dvk8xq_%*x`8H_N{N|Pet7jOA>v$pJkryW`CJfoCpV4jW)o3S=(O_l$cZg4 zkL@e=Div7idoX_E(1}q*#a{NLVHV#!@s+lb`Vsu9?STL0 z2F>)ey*>MqH7n%X7vP7@lP7-je26M&G>zzP;Aj)hUDL}>`){m8&}tsmtE5p!H8+3x zm+WKo)1zDWP6-RMYjPhzUDZe}%KR4=jEBn)MBNvk7)% zPc!B2Gs^uQ@bW|bdt^Fgwo)W`C76Jh3bFE3Zo|J})cD%axb_^$I!~%P(i}hU@SjO6 z(8W=8`X@~1A7hEY5i>mUiLpErWl*02JqNqADg{hargcMDiT}hPmo*hLVEdQEClrx& zLxZW2e2TTtihM*u{>!~BH4mcGV9}7^QlG^Rn&updw|Y*DYdL3w#8Z(i)uOQC3oMx4 z9#fnanL8c%JG5St z5Lma?@jMnFy!+neW`D=T6_E=ReuaOqAQH4teEk>FCu5XVpJ2KtNQJ|qD1d!#)4!Vv ze53t2lvDl%w%TX9E7RscGUwu9+ik(;tir>SP1!WTOJ-&X7jD73MYk6P7(7h_`U=)+ z-Q(8&*FhoevX$&4%lVBA1cB8ewmDU6;t%!w67l|t{bKB9hI!G;4kO%eYoEsWo$z^@ znijA$4~7<1GtZmA9PK?K=m3Y=H{iRs^Lgt^Cr_7Jo;Hek;1QjoYTl0}nSBs$ zm1G*_#<_K-a^TUX_65Go<#R?CIt6Qne^1Uf&QFjpI26s+A^M@Jz&xHzmL!a;Zxm+;m2?w5d z+p(p&FrN2^zV%loU@qGTEQVH+ zdXiZu;^?91&Xb76$NozH-#`($vNl`r{ft2Vk?o!$2@CuoyA zblXg{o&1N{JmhbC@`_knSB5UGsbKwi$VM?(P3JMfED{vl6_oeDE<%$`T4`}euSl+mG<}=Fl1NZElKBn+I^5ki z0w&N4xtlZHt9ZmRpm2=!hvKi0_bs&BL`*!f5o!cpt=~c_9I%j&vF{-hzOXZXjHObV zcR7wPs~0_J9dnq{UpxDzXI!FLcH)Q=R+bnSMi>Hzik^DvJzRI5PDO)uOy3(+u+}}W z|Jb@-&Oo+*RYm<5JNCwOmu^8YSed4Ccso|Q8C7r@Uo)Q(zxd?AMCZ(W3=W+u=A{ud zyF*klenmD$@^q1&(NdlbODECVQ}3D9l^NzcBq&q4reTYH%qp?Z*MTrU{8^r*{Ytsu zpyxecCQ^9!#i_UPlt(9{$oxtJ)4mH}s|(q?O~7J2L!w4&2~k`^AtXWd8Lp;R?Hp%X zJ+1r;B9Q-9``9hVJo1M!xNHc^%tFjTW}f5eLw%O95$A90Im>e{b7%p<;HZC~6Td?A z0x>@a7=5$Y@YFj03s1d}O2WG-6q8zN#bGRzb?aH1xtVdTiPebS8nJ;!4mE!pf3iBm0C90`$E&0`&;~Py1PF8M?htnrQHUv_#;9 z?;-vnm>f`CWGvPl+Q7dEbEt0I@ZVO;73Zgmo)nzNLjH5TmUO1_o%OsUF!$>Nh3Tl^ zdq+s)ylqcoK=@c(7c?Qe8OOSHB*$ZBs9hRu5~EE*zof@qK_+(a7zaR0yp7;b(wpsK z)IflxQ{h{*f1aJSgSPNNeyaqkWeQaXYEky7?|R z=diAF49;k*@-ZaEx>Svhac9I7b0;OQnVm^t%V_i*4S(l@sp_szGN%ey zik(68szZs$d*x5}KqAhd1)okMriK8?Nx9`?J97|XTY55M<*jtu)sM-B{lQaqE*YA3 zAmV9{w4{aZ;ILc5D&=+CfdIfAT~Zq6B%C!_6K)4Q9$fJjyPKcb45(XA-Yb`6T)=vs zzd_(X;9ZDAeV2P}HLtq|9Y?`paSw6?)_t((!?fL|`dCxGouav*hQUu5yM)KoTQk&j`TwlCr00}i)W4QWeYmSZTeZSc4XbqL zddD$Xp?6?n~%6@`FdPFtho}7GCRy3Y)X?IESCbv`}YY zyV`00OU@4cp(50G`%EdUvqT4rTW=M9j<=I2uaO%LHh?9E23`gze_O|-KsGC$Y=r0` zv(fBc?<$Re94P(5@YrQnN&}A?K!K`9OyXDg)LrQ9Ztwhikm7u6EuD!hqFXl{g5Nl0 z+j>fdpg#ULB+_H|wvTNkk&8|uoc{rEQ(KTy7hS;fU|pzMY56ZfP9qSmel}QsiN|}N zgwOSQ+h=>#6q{8~tIb_Z##N~ttr~d%HRxY@oMgP<1#76w8du!7)#jW}@}hA@;eUz9 zV*V!?i#YvHC;Ado=?vdY1(X7d&6lvwxhr#e|A2ZOi}X)mnsbXS7S%gj+NBbQf5Jiu z6pO)KGiaRAzZuZf@E-;gO6ytw28YFe4aYydQS8MzXnFT9wT5dHuq^9C;D`|u#Mik> zGC%QlT?qXNiS7i#&Yx$rP2n^zs40XlCr9?Nh6XBn`AtCq9_^>k*#;?>NoM0va)X9I z;$@zpEE~DTFAc1+E$Dy;!s6~3RcSOS^;{isG9ncB+ei;07DJ{&s72I?0`>CYKM|qy zL$}sjgXJBrnWEs0^khW+rWqGk_0u$?&qR#*wzoVQ{EVOTE-O$3uVInuJbXrV& zW8&uKE_+40F_%6wNBbdyN7YMaUcWeMWtdXzg)yHLf@i95o{i0cGMiu11y8g!kAkTV zMS<@v-z>>l?@!t;&BcpxcC{b()68snKl;1ZlJ~>;*F8sSo+Cf2UL4BE@wH|xqMri= zr#t~mL)3$QP-~UZpB>UuzjX{t7pGQ!Cmthq#q6v2qm74E6gwOH{E^0eo)xjq%3=hX zW+Q!HBJ^%|7{`3w+38Mv1CIf>rz78$=qcwoFOQJkU^e$oq2B#@Q;1T8V-I>6v8J0} zT=|6?K}GlPO|g9c717>h|1cvhl=L+dHP|0%c_U|@GWk=W1*@~h2{75=(9^Gjk%gU2 zXLV9G%!Y$5_I`*YqwT3L4?TlNKz}=wvCsemhis)83{KijP8&OSeywHQa0A^AX)^fW z9t{g$UzG-*_RiH?yqOcskNbC1HRK++b*%|X$%cJ<)mCFq`g3RJ@+c5slNg|TJKQ)t zB4zLNjS={VLet|le!AKeD6rw-&{vxXONNf(gZnY5GeMozJ7rTva&GkXcv)TU2ZYgq zQ)juu*tHB5Y5uFp>Q{WLe3+3=bdhrVW! zsmx<&+-4Uuhgf_4h!$tPnZ$G;FFm{<)o*pJ{$J;lgg@4<Zzu1%+JUm^ zX^glTv}qSOulBKR>9wk(uWuXg;+C!f)r2Keb2QRHVVxH(whkT^{Uv*Oq8vb@*s9^# zcGX25yl?v|L)3Y@z>(3LLRd0TWOMW13`l#na?j|^Ez|_PMY{36U2T4M=uC>~?zJka z?DLZ=BIVVF8#h}L5mx9E_~`~+JU$-)0h+4$Z!56_NtH*>^apK+p2I+WYbcHT0|F-V zSR&W{SoQ^B!#6qmBmjPsuvR%_-^9z}>i1C$nxIjao5NHNQ#P6On*%l@;Wv_n6rk;Z zeG?4lh9Or$gU7n!wXILLPfIT(Cv6kPn&qn5h%wfEU%#ZC15$uJrIGk*+D2L`sC);H zme*|kHao{E^;7ZT%!_`D+pO|FU|@oDFR5y?n8GwM0k+}D!lkP#c-t0QQ7vjzrl)Gf z2eG%WqD~4>M-)A?Rv{g zNW4C_e!RlEk(G&84vmpzGqE59At#_M&y-WTGl~1qbp)`w2fUw7l-b+Tv4;6Hi%o=!{uiC(OOK+ zRkYHZ9o%mTxk-Dj)QLx4R&c8ZY((^-M?`rh#L7&pDT?rpb^DPH`ITxOovtJgsh4zRkB5eO$)EVmu5*oAE1D#jqW31 z`eHUVdJgJWbUF!^Eas5^I(^xDYGyZ^q;BfHDcB9BQm$<4D|CAz4|8l*#gOM`>BAnt z3yeb0(`E>$3N`jeUAQ-6Zs1DXwPJ94kurF`l2{^Yg;4HX?IcG+SBg;_yAZ~23-KGx z{ZFzQMFKy+Vv&3cV*oy0>S)-SGfJ(fO|$`46muMxl(YQO+z!4H#s0j{qwTTKWAuF( zCo6Z~12ImnVKo}`@{L4wQa7G?k*WrmZLlx=83J+*t2e^)soocT_eK2*w{0edhF6+@|i}t7f7tA zDS@zjaIP7~v=ji8Q^m$%H4vL=g>2 zYOWK3Y7tr9chbW#1~aFb^^C8L<%SwP@kC-rx~HV!M<6orr1gSoN(hit@I7Mtyto!Hkj)mbtln;Fb1bboZuM_isWF6) z2|)V~F9->vKD#3*;pn*nmW==oevZYYoA zce9R&Z)>CLOz4Q6{+eR9(1qyN#I}}4;9xZP@xxC9kf@XAIpSiwhHsD%>g+;1@bZF8 zywH~$Wk23A#+qD?lclIRs}kj01)O?Rq+-tTQKlD#lHx(Qn9GIZ?x@YW)IFQL;j2=z zT^;6~1zO#XY?5FP6~04W`7}IwQiw+ z>hP9=)e$?|u$AhVg_hPLnkK;*5QgP;Hnw#E>ljyarq=3+E)u3D&9wv3fiaW;oQA}u z!8yCbMhf=zVFSriIS9s-SDUU-WiRTFqNNyW>_nlo-PwJN4)0=ct>7^e-DaF<9Rccz zrnE;gB&^S&10S#CZcr6~)qgP&7#Eoaxd>GI;=AUsZ;@>333IX-&}^VGKjLGx*$jeu zi<(q!@&#;eM=_1q1czL~-!m8~yarQh;D(wvL%;)o5$Q=dQEzL|v{SGX?8b=v(4waD zRnaGGi3j8a&4E@z8|qeKpIo(v}>#n3D z_=w}x6qx^Dr^wKor`A2ztI~XeS3)K}?CjgRm~U9>N@RSL_S`QIsu)+7a2xnhBD1De z*E)dlm%pt(LU1SM%%h&^RZ~mt=kMP_i0l!xm?v)yMNE zx=7afzIXPEMY;J@t;tvsDfqWr2Ht!%n%Z`qI6%o+Y8>oV&SjYR2)KS<9nVecVUiV5~j1 z4k<$jUvkuxsrS?!QbZ_d9|gO-1+h|$?XkKSo&AAx2Qf~m2;)~$cTwEXf8aMFmR|N$ z7KQ(9QS(3zm#KjD6hFTK!|(x{rs)b<{d~R9ba=ETzQ!#+~ zbQYxb2TdT&TOxkEyowMw>Qd(N>!Vf{XVoA+n<+FY`r;aE62&d$Sy$e z!0K*?8Dd7{NTZtAH6mqCJSX4@p#a)tSa9SfBLj;|tmPMPzBH1Ox>24C0IMpwLq5tnwERB4y5Ct7(%$xay?W}66(F_cH zZ4w%A27_+T*;kv_8e5fOp%5!k4TB&)2qE|agp8V|^TA~3(&zw#^AaJoc4UU6uJu-_ ze>m35THr%hxO?Pf;?}qMW$+8E%pF1Q026L)vCI~ID%&AKu6)C;uWU3OfM>8svV7Jf zw&TxjG^%lvLs_)%i5{#E2~%n?Nr$+9OM~qQKTLt28<0wIt5DYSu0N_?mF2Et$=bz4B4TNGN?= z$JiQ9_eivxa$J9@dla+kdWBTQkLgp@A3~$JI;oLu0PvZ4(@>g^uvQ%u*rU*bUg@DZ_Wl1`A9)iEYzPxV_Z5 z-F;Chx*kK2Bcl=b&YKJ=e<)5&MX;|swl>x7zAC(VV(ucjC>sU}Q&x%R%w@@CDV&4u zrjTN_#`*{t+s~H9_Wl;2bB}7VaiECGS3;}rU^V+&)+dN}h3#oNjj>!BUYXn0)Z&ap zhi6-bUOIo9W35@)t}{nHr`AAfj!HLS=Gyr+Ol)XQWPL7ao0Ox!Kg?5o?V1`iUU3;G zy`iU2{9Yd9v8v)R;J;{(NugY)`&aE$q>CM5>UU+xkBXkKPeHdg{@lOZ6_(yoL~OLY z(=huw`VV?~KuaA5z`=Y3M_>k|+h93+B6v^}@kry8CnyBzBx|~gRt_LFIdy8dF@j~t zedkye6mK5u%&4#?gO8&XOOW4 z-ZBpa#N(9L7}N{fC0GM_XY*h0G)%p&pQ5X{i)nx-9#~m=k1}k%C7o^Pq=6CL@>CQ*Jn!zijR3trT#y_iC*#|nkAzmAQDW8Ah-CAtf7 zGTgj3PFloW;+U9vjmCJr!Uc7b=Q5UsI!6*mptr{KWE-Ve)EJdszev!4p~`OY1hG_O z8AX5A!D;ZjH#e`T=l858ra45WMBseJNPJXSAH65&oypLbAdJ1JUQ9>frjkv2yh8a4`ptvaH{2nHT4IEJGG@r{pkh4#f;g{KY5J^G>GIYl5(VgRLjJ@FHh^|pN0^q*k7;>=%kEB>2a(4rqz#jq0`HJ-A`;-;*Z+tk z$hlvBE?j~E>Q=_zM$2F6wE?{3NeA`48EeR7TuB{TgH9w8&BhqejypMm7ZA2#k+1qh za~*2S5uf3mYvZ>(W3i+bOwM_xbvcW%2aAa6)Z|m%?KTArBBIsJ*uutmCsM+k1BFP# z4qCuvWi{F=@YNLo3QD4_+`6UiJmNc#_U$FQQp^F;>J6+?DrMV;Q0f3e6~6j8#u>es z*)#!Sfp!J0gkN{6eyeaS*B6z2~!F3L$C2_^P|de>tNEkr@J!pUNJ|O(Thei;uO`8J(&qh8&Lj||;Cf;YK*+Je?pXR<^6+Om|R3WE5K6+JL7m1}b0Jk`LkoK?Nb zbShyB?zei-ny@{MqA-onvtqflbwOArLUmzL^r60U{R~)5Bw$(N&mOfSqXJXZF#?5x zowVm&0GGckR3GB5)kf3@NyMkC<+8=xLjVzWb%60{>>e#n8k;FvC?Z@l^x0IB`|L_< zCXu*pjIlvIR5sTYqgfa9oIFDiiFwgj*GroZuE=YmLW1v!Ne{~TEN$; zU=;;J%{-FD8PKAMVo|M6yo{^JS{wq@yO|20XP@3;+Rc{ZTj*#Oa><7q8s=?+Yp#-x z;k{!gt_`%_2|LLtC(XOj`lH$$9~9L z;svLr;w3#A2?*ORRyI}n7nMf)g?)El&}eaqIHGb>>pwI!aSP5AJa`;^Uywyv3m-G1X*YCe&8$ zkhJ*vF#1Ss1v~Lk2vapn^_;8bx-2Y5fXGq96~l6Fg)`L5c2t+r>?9P2`Tb2>|Pyi z$Db!TI~>D!sa9y|V*NZ;EriE7X~MlW?K$q0Vs!kk?zd9_Z>i{0txUH!!+&?SjHa)AjITrLdcLwRW+f-jjTV_#*}u(wUe# zMwaB&aS=MPGEsnk!n3jozK_r91pncyiZJY~ZsD~rwaLVq|AW0Z4Qndv_I<0g1gj9y zLP2_)S1CnEQ5b2HsFYGwicwMNiGqR<5hEZF(uf@(O|)!KgakxEAS43PLn6`yLoM%7hd{`gXY{r;tuC?YEq>}U7`%ZAe*NGNDKZ@`sX*dZRp2l;_t_&rGvEUf7I)O>DSHwTuV`{0pqCICt4-` z#oYWFf5iFi&cUx4P-1kn7?(T1)Gc=M#WwQ2#*B)K^W4pcdQfjJU*N^H-Lzo63o1(c#%|9Ws$C?6$>92 z(C-*Q#e*0P$g`fI4#y6Bk;j=`Xh`=Fvf@7lQ#1WDLZUb;V<%`5lZ&kvs)#dFf3MDH zVy$6F0EkR6%pu1ZR00HV7qn?JDsro+W0;UT9~`S>*`Tui5fC~95j?Q5Rb`7J|D?qKRk&q{{bfYIDZ)`f=gVyWu)0l2i# zkPyMYn5c69jis2p+r7!#KkMhRX8x}&6nDV<*9aeQ>74??C z0u~%lVZ*pSla$<4RWyIqHbUIG!zs#3DZT%cru%4uOv2IT675pdWF*T8dDT!$Qo}62;V!X%{Bt!QM%vcpERHiR0uL2`o> z3$3>baf z%M3#t#MlIO*+a>YW5vShD%1gzS@rIV=LPeV$ZS7oX%jWp9d)}I$DKqMv^HYn&W@II zD)erhh(^wlQeT7PZ_X=gxm*A^^6Xmh4SvD8!U;vU@>PSBg;;WiY-O(r9L37Bqd>W0 zD|oHD%&qmJq%?72k1y8SAQ3$=xB7KS{m3KuRLVWDTq!@89@XD(FV&KeSviM4&K<~S zOPMvLG0>yvM#_%<{%@EeF0D>H`x3imRPYt~^7C5`o+rR9e}qI?)C3fe%_qYoPJ0LM zF`Ibnscn_?y=jVXofYl+L|`4P&1Rt67){btG;+XgJ^%X~ig9P{qEz;Edr@zB`yD1P z>&_%4n3)8LeZq)j>d>3$67mV!X|(&9w!ZoJK)t;#t;l6bT{Ca<5Xi@oL$y(a*l8&tR*H%hh2#sU6X(~E0^KiW#{RZ=NE_y)23qn zFYvG|EJuZy}$eW44Yqr43CD z)qKnnSbZXeBy(v8T>Mp$uqf^iMZCh_(~n7a<-XGZ0SU9JeeVxFtsJSrJOn_{?A3xX ztqUv`9qvXe^ZJ52QjuF3EZDzX@r`U7AMAzAe{s_E?*TZDXNb!O5!$h`upwE3LARar!CmD9}YE|8T? zlGNAiGPf*Hjb-A*r4Xv1is`tlfKBlSqpMcGKC|ZLy5S$yRFqvH!>8V?w)6pLgA2El zJ6J#O4c7HDVM3NqN$qF5;+j;#x*_dmX>q(_Wz>>8TJVvoD!m%jQY7vej`#6l2eF~8 zLB!|$kRs+i@!3uWUu1{Wy-228WdHmQgT81F>H=LE8H`l+R$uCRxac?casCNnF;^2I zDTZ_N<5Kd19#cYVaxsF4Qi|$C%1rxgF6Cmo<)jCZX*3c)h9-wL2B`VXX8Z<8e-8~z zixIfR>diIe-~Lu|WbymH6D`luGq{xsUv&Kg&sjZ3CCgwh>CZc$&VS3a-aR+y|&AfGa%fd6dQ$x~%V+w`ZNnX#)X zi4Jj*HTN#Umf63~+SMM?e-sY@m#5@g3TjpxEve>v)DutyvjUQeReg>VvXmzn$U`%A zk$B|6MFHgC2`@ z`bS&WErK*$3x7h@&e62=E(HxZ3V(!*%B4se%6a>H{RtmWT-lvsc z=v;~d<4L$GafArOTX`&(twQoT#>E2aLeYHLyA~TN536PTnt;Wp<|gR$cnCT7 zX#Mw+J#RaZoK+;A$^ddPoDT6|;yoxrp8Lf8l${uuRK73K`vYV`^H{mmrhVqOg5#ll+?f?*%?n@gPA9rY9E9KZ3lz;<%`+f2bwgH;8*|!%yalL|-)U z8WIg`ih9(imv%icvygl=3+VXuuJU^+59wo9ZZNosO@J@S;x^c7DR$WtJnbBJ!|3iu z(aZyEejGrO(kk-P?hVSLBLqC)p(Oi8%>5{Ds40QqslgfD0!b#uJ+d&@uIOt>U%DJ( z`(=Z9Xf=e{m-(vVQ}C+F?;f3Qm1H}pS0k&>Y~MN`F=yV#@k~6G)D8foM6lP+k6v_x z>4*zsTGRIg_FGwT^PPPmXC-sR`rJr6TFc;7dMnIN&WjZ^SOv|eJGW8=Ds`)<>L=CQ zvM*N*d8J=4RU=dZeH>#)F z<%Yx1?Ajm{QaVwJxhihqT9KQ3CxSQvsnPbQ7Y{y)j1b6@_XIbp?kjxbWo!_(ZXR5L zG1yn)?E}$?97Zb750>ND9@y0R(E_KSPf0zt@jh0J0l`2u{{@8hBxB5kjk)Z)$qZuC zmGn+nIAYj5O4@~(`|8gD6jAFyV?$fX^}QnfKQN#HtjDVIPAxTTRN=KoE6=tK99iI$ zE1*deaE2$(+oBlu=p|yjOQ^Cn;XE8!OmQWnTrgFbU)QE4oS7EUA|EG6Wms4?cT9O8 zDVLAI8`vaasiJlV^~65E6O>&J~M{S8jroQLv^zhb!bp2I{9g z9A+m(adT-ug?^(cD8tK8`n4}Z3F7U|kgv>up&O!KZBXbhdUh>{@W}wS>Q}#W=oWC` zYcoE(bZ^>24pOkA91*=Hyn*h0$Y(;*ha;rb*Vs>bDy|$w38f{3m3bdo>{k*Cx+0f- z^6vZ696dyrFG_6!a!4S-?9m9yyM zMN$!+Ej{K^kNB-Vnz2~IwjIPA4)9*Rj+&o{jtEfR$lx2B7+xJG(MX|6cu( zppsYKI@i;fYh6yfS}StO0J&0S<;e>&Y^jQH*m>IJ%JuAxUxGG*MZ^gwhB*@p7~TRR zJYmIEjd641N-PeSgsMF^q|MaZtN51CDC~*qU>2Rj6!`$|4}SQCL|x?!E~P&WVi#Q` zgKT0CD%P|?>LVXk^ZN0~N>q?Uj zQ#BQpBvJ#nBqTkBfLZu6w#=UlALAl~E!fni(~!fhRpK$8t&b-6W6fQ=l|b>F(wu3R z;2uc3;OKi{O@CHPB|Oe^2{!tx(l_4A@Ff0*l6fcn=t!$C8x_0a+pur-=vcyY?ASwA zL%f8&9MjM%B7X}fuF9}2WUJS)WV+Xga@GqATbrTbr1I2idcQ|K!xP>p{*~z(au82_ zb0K2eajoEbj7HDO1}>AQU>guCca^!3_4vmNHR}iu&ounmrFg#b2tKaO{6V5)?n&YF zuRCPyq=(Rz`JF^_NQUNyD?xgLcQK#Q*S_^N)}Y`fku&XECx4)4Sm?$=5?bNE+=u9W z7H1~sh2-NoGaD4Hyjak#k;n~T-CX3}Y^l}kcIKyl9eGRPhHHnS%sIx(H814N{s0%7 z8JhWr4a)n9?sb)iG(5O=are_bZQJnxh_QxYlg7NV5o>;*57c*~p8~b?=tvT~a`6~j z*@pNV+x<@(HWy&+0HkZ!)SsPTX!^d7Zu0f8G&oUI#$)* z@I67R6(i^jE_eK_Z|kQyou&@9t<{apH`KFw>D&-{QpDnLJoPhq`=m1Oi5|rDdV^w7 zT)w5lpf!YqI*4i1aAe;4Tcj9jXjDnQ8Du#6RB@iw$}BBCEnB#<&Y$kd=^ZGEpd?{Z z@M(H$oOHPfk*0Yapc@QNGCzV(zpHhj-$g&RS_<8mUGNrO;>-=Ha@j&tMxCx#l{s@W z_*F?5f0Lla&m@Q7;-dr6Fe3tiY7;onyZZUhiUDg=V>j>c38qJEgm@fzc%f7g*GmiF z0a9S+u~djiR>b?X3o+i0m-o&XQ7#`Bw?t2w_=3o_>G}_=z(PVriOf6qLkt-+A;!9}(7wRaU04ZY#lv%Tp=+M}l< z#tkv1hiYL&BqCHQ=+xJ?sD@`%b&Pw7zj_E&d_uBsow!6b%&w2awfM{5Um1AqB6;tC zY*ckS_QO%?k*n9|opY>CxZ{7c@5K0{qK>I&>|@WPu1N4gL6COKr#X0`iABF#J+m2y zhnW;B^wO0v5euPRt!%8U;xM;Jiz+c`FKZn#I-C8=UYTa-M*I17rLHh z2e$y-+#gwM%Ge^zOZ`m;1yj}YFXFk8&`ON<6*uwEB%I3jh7}8<)iU$#RzSpzjQO!f z^OVjT29&EM@$EVQB6(pXV2;Q>x#DTp-}JnWEUZj@(j3<#R00);14`o*Sx` zEoe8xP7_(>+UcoOBo8cX|EyZ3+(-FAdWKJGV6IY*)d0bFePwEP5waq}OT8li1eNP; z{c9_$h@KL?*3M$5z}1-^ zM3EdMJ-^lh5D?Ye`z*EM0+uzaqy`ONENyyW!WC{v;gtR%9dzvo3J_x&xNjMd^l_dL z9i$^udD3BZ=9N$Rxt4B^tz2N3L*tswliWUdOl|p7x^=La>X`mI`lcyr@av%BnH9I& zLItl6zXiQ~^ekY$O)}i#0KE24g9e#%0X3J zfev@IA%xK&!HyLoxVafE_NT9-KlYKI!}LplIM9@@ump|SMq8)}F@0mV;AnSR9mkhW zwUn?^`&h~t#8q+5Q*ELc7LHX^DQGLo;!#&=N`q>8Xmt=$pQpNZGrG*-w&cs|^zRBL zvrgq1H}WA72~EUr=Y>ZivcP$@TG|$-*wR~Uhy4o`Er*4bIKo9X;Z-duLhg;mA~_8N z-JWtfORu2KSZSz}eRcS&L?qRuT+h>~O!Uag*0)DpGAyCOzbI3 zbt9y?LSbq`Ht8)78R&|indLRaf9$8*h9O6R>r6_X@_|nxdtNLLX+KVZmFp#FF4VP` zAU!XAtEnGk{_Fd#TfRH&v}F2Ii%_cM{@Qii_e+Sy5gSY=_&d$DlzUm?a>4f>r>*xA<-S6Ca?Z6 z8+c^w+^I`>>*)#SObG%z0RWENq0c*Iv9-z5I!yp7-S=?8p;FZlq&)}oL4|p{_ zF8Zm9Bg!}L*g6tZl9GtOhP`-I-Zn^Lx5fq+s-7fXTp(=#(C(5{w&DEW#e!4ASEXld zE9AQ)8h=o3evM~UR2t7iG?~G)x_zlBeKFUSI&Ys=vTf2yl*g$+I2RXQ(l=1?lX(&4 zvC(1VsjS1qVof;t)G4#oFqg_RSjBt-_!D>;^D7y>*}|kQbtdTnpkYwnPWZy^u|2E` zY<>IETjuQaa6s)ea|V63_LT54VtM62L2tCKi5a%0se6Zft~S;O((=pYsH~rlQhBjQ zOznbr4#EA!1BMEEt3MrL2zxDxMX4%j9G!u+mJsoAbjX@eQou=EARHE=ZK#10Zs8*X%5%26Kq%X&> zmxz-bFn{o+uiRfB2C_gD>_Pv2`FqAa0QH>u2A@6$Z`Az%*~yt<%!~B00WES(A!}W@ zo<4VvUF$_=;hVW=$wm2mM2Jg?&MycQIb?OP$Cp80>J%PR)^9cgI-Mqyn9Z|!bp%fV zH+~89g*=q_iChC8d^uQ%v_9xXd8>GJylFn}Q|1oweg33?F<*<$>I3td7b*6nZ_CIGc-;Qfc^f0890&wE8?XgBW?$?=Ww6wdYG$(zmXGj3{N%`^$*d z!>)5o(b`;e+)BVm%Y1SP);%i2|3vfVfd!bPOts!kApOS}H}qaDM|ix1t)uNz4(qan zv7B$0gj2yG^M`9NX#C;Oo10S7O6T8A37a5QEQn8#x3bo6^($9ck@&(>VDC#y{T9xR z(W~DQshwI#$E+}1^Z4!WY$N=eH|yUnQUh7*L()?BoAJ4gG*1TTf#3;9^F$3{LFV3D zaVB~niapyv$SYV`OFtHN4*Ii>pyS}%UAN_{jkY(rwXsV*w?DiI z>K$a(tGkL>@q!yv0+UX_I1!N$3s&hagW0EZvqROVsPqrY>wag&?TR1>1xAzlJN4<( zsir6Eir^QOMnv33Y~}DtqR)2fHEf^%Pjp3%^|H@Bx#NjW{A#6;Vy2}D>&GzBLzjyg z@pTOh%W$ge{JAj_2?$`4#mY(xrd&xJP~@=G1(e!+P1xmTxRkBGvXD_2e_jwXz@L<5 z_)wX@2;3&oa`U18cuV`WN|WsFpBmebrwX@_F2e$mv#yMg1=?&XcJV zzPe;A)VY?Kd3&3OO!oOWTa{ugBHayq`y}cF1Zy)Uzfc-`+%t8D z{cbI9!m83TaE>}}Y`->*w#CR&O3Tzqa&A#Hah;iRg?!z*kaa{m&D5ev`y>23(YMq_ zE4};mnh4SJI{i_ihPMqCrN|e_+1{(H<1q_|$5hc)wIW$|)LmsP7~WG7A9vwkT#cR9 zdF%w&gC^f!_q9nsDG#MlKh&O z*DghdZKRJqGZ=+pNcW(tKGml$rDQ$jUnw)cMd3}G(#62*r*Ayf(u{YVG1>ZG{K7b> zvXtTX+|q^RC3F_YIC@^g8n%PA!P{8n;s`VVNc5-*xOgKHRRo+OgJ>(`#&jvWm>G8!$-Ms$rH2;rM? z;&19Y;F9>#QzN&^&bc5p$_^os>}WsoMF%rc@o zSq5d9hp1}uC}aXF?zc_sH($`==dtrbOO7&T&dpi#9!Xp@wipdQGZTUEH(|77X`3fQ z!M#QW=8kq<_-@tgy|nBx47)ssDPUK^q^kRiN2Qwhw4LJpE8!C%e}s93R((ZMja2uN zd}@E9tc(=!3E%Vp2Gs?7s#4ZJ{HUmu-dfB9sjnqUYcyqRNLjRQ^7o8uKGNV0iRc3w zrC!hv3fo)4^(QwsMG{iW7yZvdnmp&LE~M_NigfoA@)GAls^QBL#02qs+we=pwB83I zE)nukC0zd`UeREH9NVH<`DqcPWIfVSejnj^>K_dr##V5Uf=U&Y)cF~ z(lg7h9(g*(XmpJ1q0Z?{6CqW$cYk0%?FLOAve-1Wfqt_wmA@MwcS_keO+JRJkXBZDznG5kLdFzP6H zCDpW{5_8yQVW8YCFaG;wg(yj@LDe#?QQ~W;Qeaq%lhff!x$a0FGQ5)F?J4!DD^pZp zmM82uS(@NIut+*OvWTr#D6x#xF|OSOyvk)OlB(iFi}+N_q~3tz#rDiX-l@g^c>|kS zk(NgDeF!@iF1Tr+JKeBNp5y>C-|MA0s@8!$76d~z>PpGN2||z9VndWh%b{A{12*2@ zg3%^`gH;7Y2~_-g1!w7633hN|||t-A~u#Y}7+;!+2Y- zJvda>^FqQtkJAtzdwJC`4ZZT6@*8xcbOKZ%;ag^MCPkf2hvs8E#5)OzwL5*)Pb3;* zGl|+QLe{)!6TSesY|iS1yZ~41Hn*PFbnpW7vt;DPZ{mTOY`KC1&>c0Q4s)YN)oD;-2Rh@W9pEh&Fs zYhxHx&{e^ra-(d`#C?>V1-Jr-$W#)NJyGG^P0NZOQ){@>OFd?`(%I(?l*U7$pWhFb zz(Phpj86rK>+M%n+aYUZ&PXv}fn0}eP&Xply6y!jQ*`NLGfy<6LtSAVj~PW^DoP>h zeaYh{RV<6TSr?BgbN!K)+GH<`8Vs zbt+<^N5PA@r6bWHHv}y3$PF<#QRfEva_0uNb{tWunk#s+dAJn0P~v4=WwT&LmmRBw zv6=nFi(|IF;YRQxWL1Uw@({{=?oqFOZ9QK4&{Qx$-#*3D8xbTpaF(6x6grE9YuO>!$jpKxR&Os0cEhNYxz2E29Eh1g zsTo0oG{Il{e{3GaqtoYJa~GSqx=pon(rp}>YKqUizrrNcLdh76 zapiOB z8M~aI9uo0D6u}4XBfO7f%6FoJzevjI0>Z$(jT^p#ra`3#1 z$0LvRho1{#VY^0{=~78_{xcjjR&S>Gh6mYCf2pq^w99y>R`V!9^hfEB@4$=t?$IX? z&6csl1yzNy`P&M#t{-3vDaR_wW`YI&sr?p&CG&32vHXCVed7htzAWI8O-VHn-t)k{ zf1pP#Gv{7h>%B@HVMTZdPwhXgJ9wVLML)O>b7qY&U!4PkCqOymTK9%q?w_E9d`I}5 z9azgf4`Gw_=ZL>9Hreyj)l&^Uq15t{^Hsk-wNZ?9#cz4H`U&IPJfQh=3DZY>-Y#va z)df)a`6645TphzBbjYxTUAqmX%87pk0>kPZ#&+klD$DcH^D_qpFp4@wfZdy<;3pVo zUG~tFaBMF_FLXPT?Hpn84b%M$=sq3U>j1lVn#s>-IB`_uwA5L{yUK{}iupJ5X z;WxNr0-)~EIsLFJ)RA|f$!Z8Jhi9es-j#{WxYjENFXQhtOhvQce>>t#kt(BD5b~?z4dza7R1Sh1+dX`oRYyTC&k~!r`BwOKspH_a#_-O` zjJfKrqdMrJFYlnF&YN!|OK8HpM$095@J7_0OO;DJg%kV{&*9J^KnYT{%sW*Zyy9DngwsN82~><$sM0=@VjY+g4HfdWB*c zXlJ=ea238-Oy-+@?9M1bcPBbgaOcAR12ZmSxQXK4jV)1|nL0y5+N+W3AK%r^C!kP6 z1m-YAGv%;SgXW#g*2R{rB&z5n2y(S0lqcH%TpTHC=eyV3%=vbQ+mN`nMUgf z-ScGa@rncg&Ogs-pl4|UHAi7_*r&VpBMjd}6dScAP_9q)S~7zjdTS0tOqNBd9Q|ee zkd5Ri+vV>NyRfryQuM~$__L+PWy#w>%!{nu7iktEfxZ zIc<#7=+tBaCp$0`U|7nc_!FKT^a5D+0A)P*^>bwR>{ry&0)Pt>jsz84$&maRz0S;* zxux&x7E*h3PkSP(9XV5+-knMhPp~k#;*qgK{2fO6Jy|0_Vji*(eF)x`q5O=d7*H;z z)=XwVo1(`ZXYRu@m;9LV|Mi>mlk{iu1(tzT^Kk_ahDc`fbmlkgeYa(Dx6$Yq*kq#O*7v`H*M)IGVdAQZK}N>@(h6Y{ai+vzGeaR z-o!=v``h_j$hw`q^@gAjRHn$>i%ZiQ>ivuO+K|Zd7%b*SC)KoaiL-nEUJA#+i?3+M zXVEtBr4G$_mrSER1Kndu3=DaL-Lv`LfU?s$d!~&8GmSn2YiykUZnpxvFkIn}dUz3n zsS57QT%?;morHtSN46Ob4(TngcVehsv94?0&_75l%QlZFWiBhO%oU^1mS17w`!vzP zTaY!1LD>eUn+;2vN_TaySQucgEue+e3!m_wtr#78r##1|zmPKjt+`R$pVsmst3Q~A zAI1oDS4fmhl@R!bjQq@vGpMn^z;uSznNP<3Spj`L2EXEI43?^ z^v|x_rsKK||FCP-O|y$(JKZ({P68|LON32{hRyydo=n9O^0Q*fI~F2U__P_!d=l@5 zVC9`V$*&KUsRDyFwBr_j-Yb5b26Pzcy0WsJB~YjE=u*D;f-fv-*7Bz2gTQ=Jv3J_q zS6?ljc{A><*`N|x>;AH3WrZHTJ-f=-kEj@2&fs#i2`TXbs2V0X=OYZ~s;wf(xGmO;=C%isqDubTnQoA`>q4*c(Iv?(-k8AQ%_vgYke#Wn{onJ&mz) zDwlY!tLC|H4M$xY464Bth!8uW1i%1n0wtM4PE1{alIDr94vf~>VNbB0vRetoLng#) zaXs;RPE3fLQzVb;5xvKib7RsTTeoR5HJIE!@qQ3i13d;v1hG`LC7rM*jf7LncGpwF z_@H;QbVEp;V7;^ADCP*Q78}(tP1nJy-nI*>(qYujp}#v3i`S-jCu23x_vQa+9Y4}D zIZRXtg5K1{sI>QOdH%!qRpt9=zrrvH*4o5C5D-6)G4V6bUTqO=zhu)4sedeND z?klph^kyE=PCBi9X71*#Y}X$$aMZ{p-f3{GXzRf2wDAL!k;ulAHx3lM9q?J1G8|l| zK|4KC9CWc%2*1Zkx9cy)+ydtqYT{Z;IBO&YAt51#TDu>OYXcUqn8ogyh)$jg*y~LDhT0bQsxvL(hbifWlcmJ{ z1N-c0^}+k6qjxF(FfJhDk0Fp#-Z>FP_rPQ`@+)qC_;Sb};^U-+|0=i7LUNYVKIVhR zHE8rk@{oE@NzRR~Cc^#!!!8Q9L{`fS)aa?weRiz*;|kaim97ME-im2W1H0H+K1zX6y6=?P3ubDc+fY-%)7it z*PS&0N#JYtHSnqz#6Z5?r_aD6 zkdw*NRhSfc18OH8?%}wF?ZPR1ole&)6TZY9T<#Co?^v;pHeuQ^@Ihy}vD!CK{ zbHz+Vq9G$rxpESnY3LORy29N9YZC2ZJ~@4D8j~Y@h0GN8!5+JTN=_<4r-`8kz47TI z0kB94JDsy>y#90ic;7+DVO~q3MLo4m(JsHPa|@ksDEdU+jxJqC^wsp8E;0?HOb$-&8I>UWg|^g{Xks z+DD<&NV_CE`!PL@2;0iBNCreoixiHwXIhkx5owvQH zSR=JC3ABD! zYh_BR!#L4FF;hDBU@l8S+{J*1Q2f{N+oN?u#*=n{-%g3Lx}Kk$!_jW@ojqIs+-sFr z?(?Q^DIlOuLWW)75#!(S8n^T^M6Ke|bHW2BvXK7%{G!1>y(%aL+K8hN<=b(Nr2!N8 z9pdI|0Eu)7#@~H)L(rY8J=I5(RV(jf9PfJn^rDfc5vIx0Sd`R49}ZeQiCF&NU3ak>W`_y>+hpH? zXZ>D>&Q1LvXR5{^K4we`GlCrhQ->6 zh`?b4Aqjw5sdiX)x1{Z|)38BL;!`aFugvW9z&5ABH`IfQ$Moj3;&_Rx^}GfX@E00$ zFmie;V%Zm$+8}k@ML{aQII(&Vk!zj(Tu!ke#wp!tzRiJDRKxsg#|?opCo-Q`VS(vv zG}%D|C`-5Ra`~xi4FLXTWR8iZWIjg-u=pRz&MG^E(vA;@LWvIq*0g%_$fpm1S3pkl z=Qe3hdB?4e>S}$EI2}`I(hGJ3xaC-~KIT_4x0|nLe66v(%}Dkm4A)%jI!-elrS5;* z;WNcEUOn_{S0n2@XnLP6ybT#O_-;o|WWy)VyT+R?Ekxg6d#75qtxrD!tq*k%CtJB_ z5nn|@=ZX3?;EKqStdw+MHP+*|jEXOG;8JK(*1d*8iJK&B_ z!~Bi1lgg=}ShECtY+vSZfM@I`FFPK7(A)ABI*jMzXlMq%sm_0F1Ak6{kN0hH)Q>zyR4}(LXUIEfOHS)R!hB#w18Hf;hv18-o-yhp6JCWX z+ILwaA208h`0VDr3DR9;Z|l8UvK*<4GTzO*B=wKDye7Ax7+}3v3>S6r>KZd5HDfrl zD_*q+EPh%u2Kv>CEUoxt`Nw}h@T4xMp{>rVqE8a;GFtIY3CS3XsaHIbC%es6A^dE&v(jCsm2Km5YQA z@w+iqYvG6if@&MKmP;2#B(hD^OHFmYr9jVCHbGeaQq?)~H(<|qk-CpnwcL6jPa6{9 z$sBZ$z^j_GA}mbpv8&?_lVr>msSRIts_c-l>eZDebU`KmLS6;Wp#OYU#V3R1Qb<^= zY1{T|Jvz*Ci0qcx(0oP$A$pOnT9WzLDc{pRY4^Ty+cOe!)Grp@t-2q0SM&{H>7}%X zc$5;j5|p;t7tR@1bpGa+Wh!yoEWQGt6#cYVy?`88LZ9_OFxL6D(Nymz5Ia3{jsyJY zs>zP%E9EdP45J33XyU;;SMtpNwr$#V!Un{I_^3kv(f3{Jn;U~zZsl6CM?E;8)Af?% zdjk7CW{6vZ7LNT-OP{(2KM2Qn@~Hgk%!9A2F(wc+6&O1_BrTn(Zk^E`UiJ^^P8}+x z)7d*h*u6!C$bQ2?jkt8dF6zG-;rU-iknISZi0DeMQY+A6Cn=o?kiH`@`~N?<^TT)@ zt#xt%Y;Io}?&j3xx>@t7`nOr2VCu-2JWa$|vnQBmRH|)3NB`9WeUI7PBcvlK0o8bA zJ9C-6gLmC|KWmjxBHh_VJJR7K4Z*IWN?u|5gT~i~0u9#WLE>`KOO4Z&_x}^0T=XL| zhuD;=bgF!wN<)mer$^p+-x+WQXM9)LZaHJ=yN6&&V23ly-E#6d#0`}i-R`qZ|7{GO z3V|~u7`vR=O}JDx1Xyp)A0;R!L>0mEv$zDkx5sfO{_@O{JV*I`%XhqQIpem1Jnws` zmKmDU;jd{C_+?4;3h5+w#hzdxI=rl^`q?I)w;$11&r)=1G~(|npSVJXjAbs5oNv@o z;_2b<3mxDI)*8+1{w0UUR^4w5Ng>$f0c!c?(s8@WWkt>o_zG(JwlG2sKJBoyx{5*l zgH$t7<{(Y;rRDt56mla$-v88}nJH&DgchVTLLSGk?Ip9u`Vna9W!oYW#3tDE=ff|E z{fU?3C9So`L)Ikr%$CLoh~o*O-;V&wYT&_FKkrF5R`IHNMmAr%gz0?}lBRmNDdww5 zda|bq72)FP&5w|~uSxERID&Me3!eO$9Y%@h8D*(Q!;OUtcDzRW*e@pBlgv>gPilb` zC30>Tf5_zKH{@aZC`WS3MU$RvNlt+6yNnB|)W8U+cgr8geka2AdDZkbmk43HX6@Pp<3K8J=Zs`OIm#%{!Pe9$PW`92g zXXDyrpG6LO;ANoJ8iHMI)0DF;6jRRl-DXk< zX(#C~O{n$o@Nj|h)k$sxRCQp{*Rr$CVc~O1ASVKArZXZ&L3%xW`^7~s+YmCN-HKg* zPf9LU1fjxuClD&GwZ=LBVmx_RS}VB#w-2N#QvH9iT{9!Z-$I7~f}~#?`D>n(*N}>6 zQx!l|ho-R4DNQxgU68Re%^)tTItV$#nxLhu4p@C#P`QM3JZ+8BktX};O$z3m4t8O0 zU-nZpCRgAbWC3n`6jq7s_Jkj5POfQX&NM*42_;A$*F}PqCf-A%>zRib_~aGjkF5M7 zze3=)GP0P52#-bs9BO$7HLk>~Si;f)ZSriF<)Xrx0YwaDjv35M^$5|vhJQK@K`@X;D`Lg-I1$$p>t-Y?j{%h^^KZBxv_9%eA zwJrKuMEClEq(;VIlA)_TefHjk4pA$nQMlxHnSG&qmMbdpd9HzFju5`VjNjz_!a>i> zWv;!=6>!J*#Oj|5Vjp9rF{`!_I`G$jWnC*z$RJSvQs8(S@U z;r5i(I* zSU&qY_hR~;{kcD;tvRi{+AfL;E-L}su6@bw*s%*<(11n1k9W~r@|iHB;R#239lrMb zI?JK)dv$xxrhu3Tq;qRFw4<@or#J2CMri!{$4r~#cZZ(Z&;!98@0X+Qo*#{SpZ>~^ z6DvSH{W&D$g?t|RhnO1gTVK8qSbO60klt1%IAiz*BUmh{^cr^Iqq~{bolaV>)nKm({;Ti zndf6TlkZx7p#;5_WZ5_@XI?4CjcwA-cg9Zo)3!O2+<(o_P?b8=;1&a0fZ6AXb-jXV zf={jXr)mui)nMHt`8dpGk9e7}R2VyQzk&F9fmt27(KFo_n)Owa)rgQ&ZRuxSqiD~s zsw8IOn^53O)pYk*JSVykJ5;_u=FWB$TEoI@TXW(QLH|xNtjI3xC7e^#>*;%KF!Tl7 zP|LTfh&}8)D7fodmOHieI4h_je;TOv_rMTxIA)nP=2 zUce$k40fBl)F>LSG1M!K7GuNHt?^k+$RD7d#dG{qvCT3>yP{%>9$Cs?D%=bu9^d{_5)G*wWm#WmGM!? zJ`ptc!c1f3kL|=IEaBWj zk|E9U`YX&FQqkC+${JVnpHF}AW3}|Yxd?W+WP_R5j7E5i>aqVo6%cmF)|@GN`1;0A zq3wKKARNU%f1)J{XzdI49?zy}*B-D8F>nv)TX*bn=(CBxOfiqU&&9kp-0YO0-p@k~ z4ne=cohUf*ceSkJW^vIq`0c1oe}DGUz;o6{=tzg}y+b$dWp&ottd28~sWOeW#GKuJ zYr9g>zk`d|ac`?8LS{FX2DiN&6`ZKfUh*h8^2@UfU^}z#2i@WM!;hbAmuZZ{oJq~! z&$@EV87mB8S5WuN=|*?)Y

    fy{ARq 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:f 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 literal 0 HcmV?d00001 diff --git a/docs/_static/imgs/example-appworld/before-2.png b/docs/_static/imgs/example-appworld/before-2.png new file mode 100644 index 0000000000000000000000000000000000000000..17ea33371a4027c230ea879a59ed8b30c2d4e282 GIT binary patch literal 785950 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

    Dh327AuEpF8R|j9N5Hzw% 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 z z=xQSZ&9~J>RrX+Y3aX7_Bc?YY>yjJ@_2!GrA9+aD$*_{3*U;U);{{ zQWpGR4k=R1^UPuJ`d10s@5>R10}VxyZC_PEWbU@Yw3K~Frz*sro~Eb1FXCnPQkk(W zNjG!Sx5jOoUOoF&o-)kkXRu+phlP#O$K3U0fn;T_EfaOYaY^?etDQ_PP;RlzEoHrD z_8emHNGc>$ zG$7=E8?ZH~6|2_0Kx@O2-FR)i>aQ|3kL4iLtZHJr(sq1P2@!&&KyZJ?eRsvvUY)t8 zaiIk2vN>aLGmOw6w_OthINAAKPmcH9*cyu%nrv=dSwZ77RwmafijmROox} zH=Wu?zo-1>%-*Vu{PN=VpX3hL+hDuNJju{m836E!-4!#2TaCO)V#$YWm2cug3<(3@ zpvvyYvCEiQ*PH1ApjQ7-t`^dRYKP=hMLwIfdh7kwbDfJ2cYxz2skaWfAFPDGHy`Ci z6BM5yWg%IIsnzvtg8eQ_BB*hFuwa=uzpFQ#M3&`6ldboe?^dOhnJ#Z|?@>{_9N9S9 zG5?+1X8$*a%J^WaHpT?Wz1$mdeICU-c`TXAq8V_V8C2Ywsv(}hEn>9bSgPT1=uYtu z#MXx>Mucy-jDq~~R|gu)O5f(McQOGwVMP8DF@Lce6xGP@8DyZQ!8?zVYcffu|89*3 zdHO-Ak89)~UcylYzZbS3))ZLYu%+71KR++5`<9=Y9O+ZHNZX+-owQnrS=g17*EbyY z2uV=}51`5B0lZJ^l&0W`<~zWjlO}{*9FytxhqFX*ZK=oZ_d{AC1!HlE48h(Z=H7C5$BvK48 z0}L=ya&fL<9kw|x)>^6LGBx3gE_bP~`dt3cfgJN6Z|RsZUuoVrYOv4#*($nAfX#wc zQl1R5NhnOZs&li>(g0fK;_*G_6Ez2EY@%E8A-TYoX%*MB6a!vB)kSnN@BiuTq94uy z2yS59dlFCBR{?J7Ki0=8P68YC)*I$I{PvZ+w&e$kdcs$m+=p4-pP!0N&9$ z7&suFp%tesjqP*X*0#~O!zfVd=vrEfr@h@|_9OK7%%7Kjq)NAk-&$O^7+^5@5`BEQ zZ04?HUrblS%jZ3gZ|LmE^O{+xSKVe9^{{xhz|}n50Z@Jnp;rstHrJa4Cj%JR4m&Gg zrgu$mfC>(GeK)mrveK~QnD}v3K;If(&}26Hn0r3*0)qPajbez9b8{aNnm91ziFW9U zT->{{5sqYI_Qu%Otp|6vJ`D31ShI4x*9y>+&tCP>z9Yi;VdlUuS1Jol8MPgD;y;sI zx$hXzf{SyN8i$F%6}(}2C0P`i{dqEAcUd+Pk6DgQojkcibeZZiBKHV81ZcTY?n!NJr$V=E1bJ=wVydzYQ? zll>u#p{i_E%$IM?_k=Hp&f%jTg$?X7M$>K+2p%mtPgz0#(l~wxnazyoH3y&iuXDP# zx#l}CZ4UsVPO`8Ew!Qxy(8S;7JxBe@K1Hc4i2lzBsiTGtP=pL$q4^*;LfL^{?ArAo ztK>5d^mm_+RES5IRz>&B9R8^YKTL5JR~gbZftL^+SnAPvZk~8D#S)Pf%C3*{&96ot zcI=rz^4%g#268GvXTuH+Jh^(r&asWL8I%|UwQx&WmH(~Ds197AS%u-3^_e%#BOeiV zhzXnP5hz-wRUAI#0Yu2~LJ!bZbDWdu_hosI^T;0Tsq|F=K_zS209~%YgmoWPHy5@W z#^%UCUx}>%nZW%@Z{$J){ixzznKEFK*j?|PF(^goJ}a#0 z_thY3e&j4b?Q$v|wVdP39!jkKR%XQ6@~|4NVXxJQ^uD|CKL6JqCig5dj@lT3snICfOdEPW{Lm4tDZwW*V zBwk(DF?_~rcVXdqVV_`qe{3A3a<=W}R$3U)f{=Vr?rWoA| zZ^$Bop68i(5;0M?|E=kNo1;+fOrAvYT+31nREbE9m!F@8IixjiPc{=-%Rb3Ov5H`J~cPy8J~ zs)%J$ga3#iVE}x*MRgkWSf)KMFdEm0g*-ZyMAVig%L<<8U*3|i%wf;`XFtk(NP-I^ zHP_KAy$$=M`5M1=Tkf?oQa-(N;ju1y@UD( z_a{B@NUJ8#CdPxoMa--8Z0;_Q)S@jS&s+QB*q)}0CAT2QuWh`I=7FUglH|@z#m(VfUht}^*l{LqVP=6FG$ReuN-#hG zhV7EO8-rx{<|f3rVyTeNA|D4xjh*trgSN^iH;tvm)8Iw5|9VmtmL{r}aBsEK{p;~s zZyL%F;E<55Jgiw-5mXnkF6tgj=is*yM6jXKtZa-q>Dhfcqk(>c3`UNTnn9TLD#k+| z^Q_U*SB<;EbZJt|(foo4lIwb7i2zpw2+ovWMxZQVMs{SIo9ja#aqr|I=rOOv!e)16 zwjTad-l}Qpzb+opN?qT}*UCAt*b;w(ShdD**I?B#s(2`(j`#={qB*Wjk`4cbe$9Qp z-iwltUxa_q6gy5enFQ}Se{ft#+{wy7zWz&nSL|jRWBZUj`+&@?WZ%^8R5mF7QX31a z_lVEX-7Rz64yq=b?s7+Z5(5qf95(8k%WdIjMKyWMY>MQ7kD;o$D zChZ&f0{N_cFtekXMtDVR!OVSZ=og<#wq|=nF}4!~KmdB&h_ont8eEmes%CLM<1Fz|$oLAm)Iw~7Vx<_}?qa*?}2 ze3>!*x1G72nR_MzdA5>$qyN8aE5KhbMypS5U-=Byp2ja`Qqur=SL7To;l=*)BxnIE zFsVeCUbXq-F?QhBWGMG9B@u!2gVhI{%@+lFpci+AD1Ik<01wZyQ?_m9U#_crgM{;?8GcBIBQ7wXHKK$`?O7Yc@_Q1K z<>zelR5Op8Q;&Fn3aO)B-OB0AiXAeAn3o?m?{RP5i2S2;hz{c}ghlnb3h%}cA$PKe zBxcA{84bO&T+eZ31T1EHQ=5CN@dRC8qf&F3aJ{kzte1jok;@fMk@=`2E=u!P7!T#d_8SYcf zD`)OK&Fd$p^YOqd@#lii<}WAQ`cG6ORpn^aC}WtyupH&RTgbIad8#E=7)}+h?Isc? z2_%J8GQ2|b#?P{RAQI>(<>!8Bhvv2Sy1=zO@Pa#4{1L~bJEE8yg$*}hoZm_^ZD-!v zU>yPz9rBW~zYIL|t3;4!6Rh!P=$0sIJOlUGaF1TGRqROmlL}-~|CCHlhj_CV;lCGrF9-B_y##?LN z(bSU-yXV@Vt)~`!X;%=7`Axx@;=soJ$RE(VF+Z&ZXv{LvURe5NF#EIEL6u_hzvt(N zGDvx=EpyZ+B|_Lg=RNitvY(@45CfNBpR34;whl8Po@q}8BPJ>iNgj)qe~MTH-J#@} zy)v)3xv$rNvA=EJ=52&;z8lEJq<(+gQG>`_2g)bLPC)QfVd|xEUOtjJj&6;-PuL7v zyX5^k!z9{TvSYdvbGl^1TJHCdui`Va#GOF4u~YC!_D~$^?{KT;n4o@k&;MrzAjt={ zy`6wAH`i4%G1)M<$@tmzFA4iK4@R>bhkP971Yg&BVYwR$b}0f9_Vylp74rGJVe53^TY3i}AXEE$A9OvV_hr1LU0^8n z9_#yN-x7g)UMKEHYz+MI)z%NyhfJ0mHa1c_C|>Brgh{vmT?TlvV0rxU2adzQ=8kac za_kLs<-UC$wKKRV4|f@o2)g$CTo9AbWX?ffk8=rM9;U?72|B4`w_PsVtsPnVKOb{t3dRauTyH~>AQO{x^!-D#N z%0ZRg&VYt<4>Ec{phS%$=5ztCy56W48CMR7?YIN_UcmO0p)ktZkqgj zT~R?p47`Zy1|%sVc#oDmNQ_UB`PYfSw#j=MOi%M$%3%{gRp=)8IgqhouVG*5sW5a^ zXNO3ZU2zHP=DCwc(}~<~phNVbYS3C`>{EABYtrVX3=bYscSzP|8 zzPc>K@osEFeZ;4zX~usYjhtFYLRc_bBf=U_J2no4O;9pKA2IpFMIgDUSlDWeQglG_ zuii>VZpt*97rH1vVhtgHkkJRiUD0F;#Kx`2g=IcHT`DY^f3PR&{N^B|r3`vyGV4%T zV5XU)IwTkOU2`}WyLYtjbchSR&xf)lrV9ilM0-Hhini+&7v04W*=5JvRlu;vMPdK% z7eq=ev~quqQ$mG_whUme{a-P8qltY9JrK>msCdb-+BK0ajrsjNS*&KP2H6R4d|bJuytgR`t=Db@L~>h-qm&+nFIM zvB$@o_`tCvF;rnXE&a7Sn0(Wg}TG>|dqi zEwFOOg;-LkanJu?@6Dr{I@|u=wy4x1qGCl*5-pFSMWqx|#tbxXt$fv5q;G#Z4Nm{ zvlV$y|HHgx5AR%dJ!k@6dTAwojaf7vKY`~k18e};f3on~J|1v*6no4Iem@Vk!3QA6 zXIERzau_vnsIO=UB5RmS+c~AhUz{;1w5_wYQQQ28r@sgzs2pGp%KfZeMgW8;k5P6w z2HH$J+rKFN`Y>OkY1UH7HNmX!5JqgP7Yu8~dT!QdW=pwCu;vZxUBC7Y#GZ(h%&kGw zK@~N0jKfE@_G6Fr$*@R7usq}s4gLgO-W~BFnGkbz`C2TSz8MnFN{C`jl?k)2E%|(M z`Si1mdVN=|c1qkjqfVugkh@Hfr?Y-}}x2`U?>uGH$Z2A}9OfTAgA=AaNW+ zZm)hA!6^NnUBkW;H8~wK3FX3lgbhaUEveQ3`slh;M<5Z(bdnsuC3fsa$(~Ty@iuYR z^1L@pV3`HB4$Xg}U4y2cv}Ie2dO!?e#3OFqOyKob`&)$`T#`l7enxAe$&0u$4}Fbe(V{3k#PVFG=7d1dNIJ zBW^Fd*Og*Cqz6RKSZvUpD&+!aJH6k9I{;LT!vTQkiX3}31W$i})*_IC^1 zh=3-y0~jiDrx|l7`P#)zIbjNAALi~MZCL~UIzz~@%OvK`v zvc}PC<24W}9pDhJr-MI*FB;F^X9|&*mXy>Yd$JJ}P$3s!m+QbXuQ+;=yu~dNFPCO7 zHY`e0vG@t~BMlV{Bp)BDj=6ZV#;2+emz!4_Ey`AQ4@(lKTuC%uR%M}OhC?f}&xf=~QO=!)AiO~O33j#r7f3lq%wmkn~EkmQz zDHW}DT#!#UwKDhLRswllysOuLjG5YMNqJi=P=1SmxfGFP-fk*jsS%@Pbhv(NigexG z>Uu>S;!^iLhMtZ}1P)M_hsNZQB!1GQ!1u>8Lm=z=3RcqIWBvE1Kr>Ar7iB zMu*GHjfPO-m~l$=#;rbjVo6h9&TgXqYCO22_v^u>FM^lh?0HW3NrxUlYJR3ewE=~m zX))-jw*)kao=o%@)SKX-T*Z*R#CT*YF3cIVFy6{0mOh!mbzKfsNYbXLM@t@5d%|aJh`g=nma-h zk}i8zte;yRzyS>q&(Y;OuZc?PYB*+A?1~8XWnw~h+gn*#h)lHvTj4QxsMb_}Zu;G` zoO}4y%Xhx7z%A-qly3|EAygGj(}O}G@!9$*ef3+0YOpM%>m8%8oqd*KER#5Hl7R-L z*9S{cRX9P9`fn<`IZ$OP%N#UXhTmDnen>bPo)We;VDhm-?pK3%yTDV=N&BY^e30>8OUb(!WRiu0N9hZ@#4|E*e#I^om`)bXI1mnkBR*o}-2?@5lO);Z!=)cTA%sGP{A zO`xj66;)L$#_Tq9Qx#T{P`A?R&^uQ9Lxw%pYq@DIr%vPm>r~arr0&PWX~&{kBM#l= za6U*no&~_(Z6A2ED>S0}yA((kdVHAJozfJGbNcB8RjqUxZ_1Xs-1twUFpBC@hs^H= z5{LN7#V6X*#K{z2MO$6HI73|VQ1Nf|bBLg=*=-}S9+Q@;WoqNq&o0pS<|g;vLX>UyLM;6)G(zz=5dw9QN)XjOsai>~ z50<1o`BBjlwV-M^D}7h{xOIL#w2FZ0a{n}&-l97bTQ+w=k!i2!A#HC|OwQrw!8Bv$ zUF2mZOIT2h)($A=WDlSKq z`YC0&>ws!cdSZijnul6U^lrNRr#8-I@4`D_Adx*mfl=|)jV_7?K!-kS_rk^EPbsEg zYH6iHK}o&f68neN45pD8i~zX5CU)CwNExzWyrn9f^V~0RteVuso19GGX19zmg=&YU zqDoh5d~=Oxp{MiLU(=stA2;sf$O`9_94E_dy6Md_sd9#nj?5cIHxZ!=nmI|})>L@R zQR-FE!|kyHf=R)Sb$dHw7O|MEr)jpqr%^+z=wkxb}^(=~cw*tt@BVcy4x-pv&PdFxy~ zE=X8kk>&s!W8?;!oJ11w{tR3d%J*noNh?197V7`Ab zw3y2L(CZVrvHmJ;AyECks%nOqbxfyotXky_6(fRb2cVwnZ{{jXbn~JBTTG&B$eaNX7=*44|hGa38snz_nI{ z@TH~Tir=>JAu;Rdhyl~**YIyz;Y@+a$~WB}hlCEW6`7LMDzaSCwnswyko)8l3cbZ` z1GA67@aF@>+QakKZys}Mlp0QFKzPMxCU8!w66=Q_tDMls(?^N-nPvDlH~sIiKbdOq zr^8bEl)YOpP%>iN%HF!ZT%Z{TP7Ygu43om5MfM9N|8p|e=-q`=#lHBsJ7-{=zE|{~ z05p4Aim^uK*960WL-U6waNf5-!C*xj4Lj~aQT2Wk>I%0FTT~y*-F;Hv?lBKY6!&uJ z&R6R%VW_+(1;c`i)@<0~?E+rxRrNw0Z}w4@W@4&p?x_PQ^W=k#x4$#X%^k+ z>4GS>YEUxcW)(6vRXvHIm@bdVX|}xdEc%|S{xzj@h;J`MINDS?ORA$RU~ftn)lUJK zYr*!q^R7YlJQ&VLGjlUDWa-A=y`IkX{>$rlXIfTGPe2tJIJHjp@sj^Brj!~5VoNP` zb=a>e_}BqN&7rGUW>D0y80W;gb})^rwoYz)L?B$$5}pgSp!&m2c&2|;+fyAxG-fB~WbrIy%8l4ofMmDT zh-b@G;5&tuJHd9V@`|dfxgvJyXE|RPb#$s$_S$xi&8R5zWh)QbHCf;n$=#{Xu3!J~ zwv(A&&BA?$mkn4{u)B%O^6SLU_z#x679lfTeg1sdJvIzDmN_^Hrc@UMS9@!?4pAf1 z-~pn*L^KuvBh3ZL!`y4Yly8aUK&P)E&Y8s+q+@=|sh-lTbodgi(6Pe12eVe;J8^>& z8KgY!57eKl9TA4{>EcmkS>5DN|75o+zV`b=7-21;t{s7 z&nxmObeu<3DyHZq!n(6et$B1wz_^2`lU)S#fVdaSdyW*i!AN@!wyxI02Mf&J6=qAS{HFMGB62G4Ow??fo5) z4|(Uo4^T@!U-Qq2=RcA>CPTk1D-+Cotg&O9fMLV1D$9d(G*(v{H;a50B4j!7M#6Ho zbT;8njM^=(pepJQ99o@lnrtbq!KeDZ>Bhz$fG$`?@xMh18PgMCr=?E9L2Z?E~ zSJ}gd@FP8f>fgrJ5R;dyT^5;Dc$_f6mk<^e7|q!u`31N7ZPdgFcN;98eNcvZ(!`3u zO&UbSog2c+#2-!*M$Ju}8w&A(pm$n+$Qvj8o2&tzIUPh;n^w76}~fN1A08QR<8 z)HY$W!g|mZa!G>)3{B&^eZLbk0uo*3NXFq$U4?zxt>OL#|4f!Wb?shEdL!?31mzA9 zt0acJf5&+D9OH_e&#C?3$!$3BSiv>T!Xr^RN+G$0Y z;4`wWC-{qm!8A8s-FmyWF5-q6t2pOd04qL5Ox}golu+4>)(2ZL2eyByxJ4#<}LnB=qG2D#5eK?#qLU zj6G2+us~DatAEO1D`OM}E2cZ8;CPL5t{g8`hUe6<-$A;aY#tw=I*IChhZ`pwxq;t? zX+KzoOngqzmI=BX!oXlVytMB%)hKg(P@uH~6pqd%OA5UQh*_7> z)b7=pD49?rk!!JzS2fE~5{^5})D9jGnbonu6^Qv<+b7Z4oqSZSY9CT`j@Mz&-+xeVV}Vy_Oq!LfiGW?d=s+8^J?s zIP>@*H-l$IWUVGD-0G}>f{Kho+)MV}N5akg-YcC{#i?eKC)>Uqc}_v=0_9JjI4XZ@RsM=Z2Aop6%yNwCV1K>SnQasV za#p(mMTau7!^O2a#$+aa(DoI`mXAx4zOw59UhWv^2&Mi&rQ=ds9P^Ff0_BlFHQ7^} zc89$BGljlQOOLsV{d3}-nmfV)he2`vSX}~3Mp3=5<*{tL?`ATLICPfjUIu^v$YhZ) z;_kT%GVFGf5Se4$LSvL9+csnt+#Nx`+NgjztqP-H>6F#q7VTcXv7{d?rxbq`VJIRX zDd*FlvYGb@s@wLJ#gBG4$ZoCh9Slaa)`1GGs=<5q3T|08TVp%9$ZKo!zG|v@zm?Ps zCQJ|`NNb7ivU9sOqP00QEcfqyM@{Wuw)<70Mq5yyGJ^gBZ={|i1o_c3j_C&Gn$8Jy zjEL1M+9pNDB~(Kb0oq@xD0MoN8bNWfSY=o$z|p$y_|9~hwx8q}GOM(F*dNCf<9ja92vcHZ_P5nV?2_vht3|b|_}Fs?5Kt%iP{>SuqcGxl z4Zw>ImvN`<@T)T_i}R|_-J9w0=L2ofL4U?QfBcqt)cO?&J^f?g4yfo+%t}2xE)5(< zWDoEhErnR1{QX8G&K#`xu4AW_wFeFgeYOxjXHFDX`Pn6+7 zhd{em$D0#^UZVGk-)TBq~mA z7>n3+>1-!0LqI*AL-P+K$30Fhns`3f6F(Sp+oB{_S z<++-mk`=D-|g{q)s=uYP9h9`WU zW4J!Sv&;o4PVY_k;pJiY^~#^hhAA=VHN>npHLFd9k_njjt~a3*-~J~hiq?cOr(jx= zN7(NilIDYGu!l#ISr|>=I7%OkK5Tn(1rHK{E}LFzX!xlWMTgm;!wzI*;&sh+%bZ7g zgWGDj?Y*c``6$v$9Z_c}sRSt+S6^E;q5UFwJYl34%!$7f(+H0XR2w=oG#lmtm!Cg#1~+-`%bbFUP-D1;`@EsRgpll`3S%<|r1iAw(OasvCU=SzxK&mrt(V zcW=9-yNJXp#98O+AyHEok(2Yb8R#L7YT-jQrSUtCq_aOn^l*Pvt62BLd0|K)@;q>w zuKpRZx{f($o{9PHZCM8MCCg|_z6;}>sh=&pdrpN5K_i4XJ@2NZ%QFo;1Z+pdWxD&; z$`Ld!VljuEBIKBWQwkZ&$HmkFo*sEMV05{CoQvznJQ3aIv?RTDJby?`^dEedEJoNa zHWjPgyRLnS886_LcI%GPr`^yRtiynt^$ye-p1j|)^NQnl+Jy+l^Hvrj{O27Ev;ulQ58Cq_k?;y6(i%w(h z_U;N3o75vviosuhjVRF%B!}fcfqqWT`ArT==>9$3q^?{0dgJTZ4z_ynacdB4r#-m6>>i+Zt394*dN1V7#`w!F7<#+5w2=}TjP`(ztAHV-`S&jTHPwo*uWdw9 z-=RcVsCzVzCQh=iaZ{GjZ?NN)R_95d_s`naCy})6uHBeVH+B}F+J!(S&w2V)-1rXe zoyK*mdc*2tzU+rH3-Havic1ye*q@t}%9OFPh+AcWMD-ZxwPf(9IU5U z#)vZEAP9fDg3WtQVOOgvs+Fb=dIhNN_c4Ydo8^Z81Ltfgfz}-mZSOaR)(AfPE#0r4 zY>NmoE4!+>ejq3kol_?mk3Y(B5<|8tjx(Q3Nmlw36`p^NoW&X2UWt}bO_!I4Xlnp% zL-FpS+5x>vX7#C0pm{g18H*ARuCC+BQkGTlU@p7$13`OxWkz^`-kYyxS7TbU2P=q1 zlNT`OxEE0{mEX+8qwtv>Kgf3KvN|VE<91TaWbTww$?cFAGa0vwgSOOGBESl=iR6O? z*F3BIG$HmAfm_R)u0aYl%80-%Cbe(Pqd8j!k~2thAr*D7BA;Ckvc^~Mmg}xz6@=y1 zEY9L;-JHMZN-WM0oi40dVD~m8<-b9%o7gaaVq-LihaQc*`e`V_3mWRn9pBg{X!Fzy zuoO>Ki>+RMi9s7h>1qURCw#5%2uVSkYc=Cml1JVLO9(xaq)Ik*VZte-3q%_<|1&=j zNwksi${4tz;>Ka3H9YQy`YUAjhRPUvc|WgVd?0lstS81hY@c#Y|LYs%J+NcNtPfAaN?taQWRvfFyofJ3{h|gjGHN1wPt?cf`C)F{ z8ns07RCvCXWm%cd6WQo|aw8r0Yt;-!1VEhW)fffHFzhp2* zwk8fABLq*}fOs3OGIs^VQZHTt4tv9s$eFv==3}g$PP0)T$Xxt3B5rEgKDIfF*ZZiJ zF=(Rm%+cL1cwSq|1`X1-`z$=;wp?4`KpQ4!A$q#|KOCtro$-hAH&m#L32$1N<#lkn z{W7@jRF}fys!%`pUD^6UeS&xN7kjj}NoIE;d9$_;#>ulSM%J!l(6yK)(_dKrOr@VO z&l|q)JY7r{u0B0}#OkaRl?1=ERq$S>Cphi-gTYevtVCGcy-BGVn2D`;$CTho1lk0t z9x-e2@A--KvZ%k3Qmh+A(nK;CMqPtaY@P2=`h`ISA)aZl`1~j8!Ltme>p!1iidfOK z4e2^dJ-;OQxGRqb2sCn z{HVMEnPkeKGF+E1gR&!m5maCTjmYzI`Mz=$h%Pb2n+u21W16DTgY-4y}$<`+U6j!ZYFKz zqb|l(OD(Ax0jCw3oagr7##=w*#_^6TfRHXbtnxR*QSWid7QST5fVAP3stz;@0TdYu ziqN21X7vJVWte>d95qpo=Yh#PvM3Xp3n6OxM=`{baVex}3t{oYMVU2vP&@MW9LaW$ zgrwKK!QvT z-W)DUv)`S~e)Xr7;xfkhx^zs&4Z5V%A+S29X#*Me)Z`9{>Y3zwxTIYf#Xmy0;B-VS zvBe_h;tAuLQ!w)Nw=Unf<6F3R=pplz5hfjstzG>+h*rsQ&%#TF?dSNsQYZVA?svR0 zuuB(O@j%Wq@D%97=$blR_)9f(bC46e^`PA$;=xDw5g)7Ju+Qp;nY@asN>q}+0dLTH zY$r_n;T`>C?dq^SVODPe9ORxeXNQLJG2z&!EVy(;EEPTr&OMx%Y02*`v7>Pf{r}i2!M+?wPp)yn^#GyRbNE$ z)pA9Sxn&db_rRFdwUY67^lh~;ku680u5#oxf1z;O#!lpWS5yFIajoU!4et4`ErY{g){Wf%)u#IbO z4`$yZQ%1#T=;dE!J4bq1-(36IhG-{~8|D5I-c3%}3TKCXaZcLM61MdmgDERN7xHze z#y;8LgQ)=$Z~+4iIFA z(&;P6;{^@Dvdejl{@wr-mvRlx%GTl&*wXkP<6+&Yq?*ec-lxHk-FoqW!Y&r3T+a&k z=Ls<1D2}GK0n=rQO^x(*YC&n9x}DMMGli)$HDvm3}m{8OgOb z=f@OQxmh)#bi}v}OZt^Vls*ruFmwBX$IO-lSw-!Yv`M31P5PVZ{r1zU}?7{YUqbh)>gX7;4LNZNqxY8L( zK`k&V)*HL<_6HYqi@9W0V$#;DPAk(*71sN-eYi#QN=dyyc>Uc*M{(Oq_bTDr)Z$NR z_0s9KG}B~;%u;jUkP9$(o{*vWG$px@;qI`#9-%FIFMJHzTAVvN_pPm0()Z?W*0UAgYt+8D#cQE3km9$yqvN%>ZJ|BH-2KE@eeknY z(azWtTD$Zjx>!8fn2f7w@TOI82TDX)aPTl@@KN!Hw97Q^O>HTgJzF(djYzc(JLW7U zg3G0hPLI@5^7eT{fwp_@?Xvx6uzNMU4X*b zRGFoWcbnYftjj@84l7ojy#lVG18eiGR9@PvIK$N9UoRnAPMcVR>%!c~Tr+19e~n=8 zUTb^0pqJ+!vHtS%bG9SSv4s%DSpxxg**3M%1021x@Zyw}xqPV2#Y$03#HVt&I~5#H zpFTfoB1SVu>*RB5W#CO&Novag>1%u4JJQV4AZV-=v!zMCBdVjANU4;)TUjPrXJ~=? zaaskuwpy`}`jj3Yv{T26V02_&SY4?CoHM^)3n4>)O2$7etC^CiNI!Nma zY2rp`zuTyb6ygfyT(zDIMbIwp@4W!6m5)RO;Kn-3;PGPh1#nu+A;cN7E<`sltT#X= z8x=|~L)ChSlzx%3t$Y|spL02o;Zc;kmD(sHIv+k%H*3|au+wiFfR<6f(omN8_XY)3 zd~m3-7T+{)cZH(DQINF&S!hR-xjuH`-gdicG`$=h3RKJD)al$iduSEapU^t;hfB4& zLn?9doF**I(S`$ET!}nR0*?!aEOS7~tK$zhroC

    wTyfJq|ft+6YD~y5s+1j@=+-w<8x_ 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⪙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 z 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

    94+65T}-A{%})z=@(@G7sXA< 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

    @6UxL-~2ua2Veh?MMSM zb=1OYiGb}ZSLJ1V!4NbTR#u#fYxc?1*{i}dRq9X}>AxD!cu|$I58A3XJDWvCYkk+& z7=y=C*JdwF8MR%hGDO49%^u|7Dn#SCpV*}{Y`2C)|{j=iOU;<3oGL`kg?FLo=~)7S*}5t%qdmHr`Lh95{5%zUAnD1?QnW+ zMkPxLIFw{?+dZ!A5Hs@Z+gRS(%l$D%RkKKG8$HiB_#QG3GoMdAX>N(K*YXV-tT&$# zx|wjdPeyZGhBG2JH*6E*E zdZlwuIDh0?PR^|cr|i%v=4_;;WNu7;9GGH~HFd1~S^tj#b%+XI7J=X^>mupkgQpIy+SkCv9)`nJOwwTMqMtnzDO-Z zMU$OX7314hH|ExIvXB(*lcnOG51m0?cwH@#2MfjN7h)Xk z3R;(?s?i7=o>zEG?(?;dhI?y_O+7VcoyT0bKV9HW8r4$ip4te}j?IUbJ1zhEoR!x| z*$#c{%B1nbAk_>0_dHv9|1y$aW$syk`O6*}K1V}QhOKic6mNLZylLQwJ>_INzXndlBymH*J~?v9d6GmLffMO zg&=PsbKiyB6?x&c7U&qx*h&+X>w=9tA-qx|i;DQHfS~F_dLT8wN814uMe#eZOMGv= ze$5kfhr+Vbh>D*Ma8w($ddsWWa@$r;Ix4*EXOCOqc36Ene9e=#_catFl-ov7YeN_b zU=X(+A-3ubWlPE)N{YY*r9L8S;$GJyUAtb0^ z1;P@1oZ}FQKXlBD1j=zzm1D*YK@x|mO*c~@wIQrPopb~{%n96tD02!Xf{hi;$O9nf ze_EzW0G2qqw8$fUi}mJ9WUluc1)E6j&_wd zO2(EkAYSJb!{kJMi4fGIK8s>23^%W*)I=FA{Xj*vK14)v*>UB|_|C>p$m%piB+J$Z zJHIUIL%$2nBJ<2DkNuJTHaLpDEh6$3wOLx=sRM?c%%c}7kSP011^HtBfJrFPIP`5T zil&qo^o2RICgZw$!3A1eh7#sCEA2Z&{$f6D0$B%&Tz@hl-cZ;~W}7WS{yu&`JSCo| zmC%E&S;Oe@wHfu{(eW%o?iX79WtwWzFCEoS6%$b>U7wTw>F+Kri?IL^dIOme=+312 z7>XB)s8G)<^qGVsH~}s&BaUPKyDD}M_%O9lGI9an@z>!x-x(Benvk0?US20B;*V84 zjAPtKH7drza7@yVZbD^qF=XhTQ6ua}>%UUj4tAacBXGd_j)b<;BJZ2+(}_NpQh1Tr z3A#_)^oP_66nZ z@xhb6O1J=E9s{4LJY>wAUs?ckbG^>Oj`kVg4roamLBG!>qGe2%BE*ZnNvaBOd5G#} zS~(&Dm)hwn{dB6d7b%dwVCi+fR5rPE?@`G=&$QGjpYD_Tk-wGBSUCELFwk>?sS-$^ z%Uk_FeH^IlE9em#;^!WbvK9ZRCOyk2zhkcZLSLW)Dk26s0-_Ox`T9=-1yWPU?!d4m z;Dylki7l1@1Y)h0Fg7*qf zk1YU1-@yWoxF^m_-2Uq-bJ_KXIKgup-c`ufzPJ*iXZi591#|4%4a^!(4S;;_r`ovQ zAi<=#tZD#lj&Fw(RSi)9==cLM$-M4a=9`$O0|D}o_Mi`S;cf7kMM&mNq79xv)$w;8 zWo47`g#>h88if#0NFP%jf8M0-PUA(^lwM3#bX+yje6pMb+O}j?t}JWvBg4;zTkx>x zVk%!3w;wQ`1>7CTuSZSqHZmsu@LzqHcJE5k`C2XY>Gl3o-ToedfNhSK^*ge6cSppz zO4xcF&3{3Pf{Zs?pg5?hA*%glv!%v=9`t*qD_A|w6)X>PtcD#Z2)s&WbI{F9MC1yy z9RbW4#0@BlnBg2HzMo8$bnt*a1Pq*}Y2rMODgFZ(OeI4GyrK^kJknF+CPc1KCl#($ za3<-ajKJYVEy96IDgg)v}EZHaSy=suTAGcBeGY=Eq z(~fFkAlg6j_SRL4WHaBrIC#%Cw{DZ`(g$t~Ibm2;bQhruhfN`ZdUZ=xEl{zXn;^c1 zxYvNYvU-=^7C7Fiu`Q>ke}bH%JlX8dGiufvshKYuIN{@+)4xyE7e7e@a-N9J(f>5) z7^t-04Nifn9$EA6Wb?!V_7SJGajktjXXZ%zSa!UY{%<#Flw_j1qyZ*uFvE~i9KxQt z2W16pWT97JvRgVryUwnYzUiV1oYtuoYr%kkL|0i33Ra9+5-nDh2$SynQY!VocI2V)$rtWxEH;4c1eBitmMd}NK_?iFKSOI4WAr|nd{!@F&8g<;|W^!^0FEgS;T zle!VHQfWgs>s9nZC>R&7l2Am8a#&Kzi?B)hIXU}CsU@rsKd}sG#{GuUpy(VDKKwU# z+_nWneJo6D>TZJfvsWKKnVSvvfX{Wo32<`OuwNJMeTNKLB03HRSTlDs`@!@naS#8D z7!#kd?E!bqdB5*#w;dd&jEyU-sKC7J=~Q1yFQ|}I05lKxL0CN>KkaAx z7)M0<6jEx1xJH{{le&*YFAOD&Vh@55Qg7;3_|$1=AwO=^F=vN{Y|MbJXl5L0R!Ip2 zv*^4h;Bj~bPy}Q!{Z)QP08PG#@WXMRG3mq9vv_xL@!2F5~qbsKg{0nQ{qQ@$@IXBhdWb-S|a%8YiOWd# zC#I74LHC*@y=17MSO?S=Q9F7EJCqOXTMtJIPvigz+IUe*-&w5K{mAfH2n4B{y7y(U z)b#>>oi4UFuc(pajmDLGU7G;!rlW5-zTG%xIMT$-gRB98I z!xLW+UkmnSlyTtvC&&dTlGKRk3^-~XiSQ+=``C5=4SHi!*JBKGO*Zup^sR=hyKm8o?po99CB!{S1b}Z1 zXPmEYE=)byRXKQc`t4DyTvX&eQnLh!u%0Ee=w_03Dt~OK$le9pw*$f(E^0bSVg=Su zkSUPyy{nXmheHo7GF>hX`OxApif6}sFTp~Re8Q+3t9sp-S>KeCbM}e z(EJUD`3pyO&?~beQ+fV_pzk@ED0T z3(MQ7NJ6;b ztTwB#_x>|z8~iA<+hZoDeQ5q4?VW#6Q|Fq;YuTFFRfw%!5ma*TFt?1iT52)nXF#i# zT1x_=gdZ9x)J78_VhE9hBv@`mMPwaXX)!+#lq4h}AOu86&?;D~Bxru|Gf~k5a!8_t zlSo36J@(G*-r4_lcIM8#+vflCoO9my&HFy*dA`r*xs){C|syKF5`lb^2z*88z1|fo@wRiDq??Jcl3!fX(y-onwb!Ev0+# z=xpNS^N+^*Hr$6C1YZK3YTg|X0bzDm^HHjt_~LQ+|8X>-0FM8jE|E36@aKP_`iD}N zqUl#Z^+ScEJC5=Fr$)*_g=#XB1#Ejz?jo`LHGdSmMH>#rKU`&h=^1p51iU_ZzZfto zU`{U-pIo!>{uGhrs`@?vW#GQx=P13`i7ct zXk03MG;v=#f_P2-yof2+ti68(y@B1uIjLSRDC73(?$g%b*YV1239Sg3xuylvu{LC{n$tCP$5D76#S)_C4Fl|;pu~vMhm~pe00Q_;Gr$`ca z7|}h@_n;TGD}@1!(H;UpI4%Xoz`Yzn|*IXrMd(L4j^PZ=u=O}bbIei&&q?3JRXU=ran;@;si?h2fSJu3#o zfNG@8*@Hv;A*0}6jXQbYw8Yq4hP*mXn;|zqt=wkSeVum*w{kRbc%Qh}G?8PG@jZ=5 zWL`>ZY#L&ux*>`qGZZj7hNgTvAm9!`EK2jACiH{!t2N9wLm7-@`(%o+%ViAbyIVb+?o-w^;P z@4UQq7awC+z5{*RrUC55PE!MkB-C?ll{!rYQfS)A*cM4pmgs1;;9w}#lOu(%5_PnF z>J4vwsk1-qZ`fOiT8JIqCYxE9oyy9WJ>E>>B=2 znQiY-WKI`B*@k8LNS#)|+KDu{Q4QF1XfY@9Lj-F$iSqb8;x+xdBxIASfvAvQ#nErT zv(p1~R~lA>%jAMsbryiq1rsN&BzfXC@esrceeq`>Ybm-SsNzimpVf?&_)YMItfUXk z8MljZtag|-o2YUL!y`r%34!i9u^niGgJqV^+Fo63DMwkPzw!(E9I=(6bw3}+xBd03dcP|1Wh z23vfJeE%~ci9V#bm#M40)NEklfAN*s=-@l7T99m5cNz*G7w4KYdhEm?i|}RQysq_- z;Q$W|AQwS<1PG(2N@UJ*UK|T^z9D^J2IdXh7OC+v27UL^jm~q7x(+cSI$7>je&=;e zx-5V4g#qUN=vDN`Tc;IDNs&>%UXwn}cqZ9@zrQyTfSD$te<=WWHf9s8i-{B;cRiBN zd9*RI{Ogwm$^( z=jR;J#WFHO2Y=A3J;v4}=C;dp;|_*p2^C8~dz%mo^f%UeT|ow9fpl{yuID;@F4~`}#ts<m89G!Zk^N;v20hN*Ibi4(y3F5{1n#%YDpP7^gW zKNUJ4d+UP62l}cVqPjj>mg?!z0tUKRKKK1=z>s^pOti%?5tcwYC@z$eN0|7}iGWP5 zY%m@N#_S-&CO3^mUuO1B;I|yFGmM#yQwZOD(Lnlb|7yXouZn<(hv^q4e zEB0BB{eNi}Gx5Xrt#=xSGSTFS4P7j1uo)Xc{i{diWL5FpGpYU6B?8E2fkVdL+ z1M&;$oJwdJW#>q(6x|Yf$I92v81>P150zTXq#Vco>Jx}n8{6vT*B~?!Hc3#59HLKD znkCgTD${>70(dAB~x5g)ik0C`iByJ1%2)Zn7_-a)w-U)kS z=d-vskdG#F*lDoIuwsa}V4v#f1ZTpEy26OnQMDzyVEpCKe2Ah{{y9Ys{HsnpAv!uGQp?+3y;r?khsB4Tm-f*Fh zODQ67-iCD4ude7tlmapm+O{WkYml4^G+HId$r_$rzJOXtpp`}Hv^s2m2Ba4JV zbJ&S&q%w;X7#GeD=>@XPExHg$9D5o=lV?YNj7?vtR2CMdsY8VP=uG2}T6WPk;|^7G zJ(PJYWIRtRbY(eGr!QJ=GG&s#=fjv?$elx|-xZKOAvK?>iW@>1a zou<6GfvTfzVV2v4#&AnF(`|6tM_qI0kVd$&qT>eR(xOj6h&k+ZU5rmEczCy=x5LLt zQ@!+zSm4&4Ak85bPtB`xJHh_@C&%4sK%larvcpdN|6y;MwSe#@OO4(>mJ3!MlUF1j zK&Jji-u-_&*8xi`^HLYjsph&R0Z{WBW67hhwoh`)Qnn3Su9EqQV!mcw*kVa-!lRJe z4)?7irPFR1%-QpS?kd-+g+mcndmTDsAcl4JvH@((K;O6)Wm2ALPzTLS3gN&;@Kkc* zRCsO4(2IWNv4*MZOsF%Oq?#hc)4@vX?R%apbx^?@FJC~Fw|-yOHg~R<++^wsh@)C= z(>|9!xqxx~9M0L2AVsjhj&94P=dpnNgO)LzH_vlyK5_Odu-d_2YdI(-JiqdOe1VNE zh_zNIIqr7uUebwYYSjE^_?0RE#viKz^kJjM8=3XAZfw$MqF~X%@~M)%gKDXVGGKF` zmA*O)aglw~JPVXPD8IY$l;Sc@`^#=@>Cj|s8hLyfCm#F~b=C0VXFmPe1?5_<9**u@ zrSlN}R zQ)aMIJvRgr;d79$v5z%Og*U0g*p=@!7S0+UK&529W;t5ksXDFGR&Iqm^g9gE9 z>6#3Z|6SK|PpbC}SP6c#+);}MWtl@652+G!sC_2|(m3r36(*KhfOmk=LdK~qj##CnuB4{rDy?&Ztb<&^vl8Roe& zX0R@u;T;xztDQ(1l;29+$IAES$z$X$;5W&j z`oOe0&~hhEtQ=dd0wVZs_a*EKQ4i}Zy^x^o&?W@9<$?Pk;lx1$j zJN(CE>l=EcXFArpN>8!W_?6!1^Dh=i5Hlt|9N6dd&mF#zjvD9dA*rp~^9>E@gQ^C9H~X6$grrw4U!UF&``mu_`?-I6 SxBd<2w|f_QXWJ)v-~1;^Cf6eX literal 0 HcmV?d00001 diff --git a/docs/_static/imgs/example-appworld/learning-curve.png b/docs/_static/imgs/example-appworld/learning-curve.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e91956c60b97c4931782ea8f9b056fd96dc135 GIT binary patch literal 426899 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

  1. #zM(skCX_DU(}^l$MW=Djt*>;bZ3gsUl;Uj`;6y}w%eUFA*b)v&{~u~+WK z?PxI_jJRoFUDS8iSi`91v9pK6dYW{z==DkKE6tSs&{=VPWD5e*YLCJ1=2u3MzG!&XSFm88+V2k73CH#=X_~Y|${gXV|6} zmk?|npZ(xVsA>bX4&|~hTlIQlrO5hpj!o4~`Gx&b@cmm^$Hx)8E&N=Ma~2U|M1cCf zy6zFCb{{{fc=*=Aux$z71&}i2GqkJ#H0kZP({*cyxA7Au+`+jGKJh!`(#9M}H>BL6 z*jrYQ5|dO0)@&iGuf~RX{{Btr?-%AxWAh{2l}V>@Q{VWC?yfzz6Q}p(RY2g_kJ6tp z!(TtwX>)N?qvnX;?#_y>+CJOOUsy$;o`B~6=dJ4RF9>sDgsu|x(xkw?lg`bhysv#} znoH?;@_*;UIRNtmPpRhGEAgSXB^wLh+I}g>zQ`R9J>Vzbju~_s*anQKQdJQk$#Kug z9q4`M;5c~L^r-hVP~IK(ma2DV)qyK?iCtZ|`KXt_IJi~kyZaP1WoEVd@L#>_Op|IU zYc`NH(iS@f?{TRYTJ2D4Z~7dbM4po4;6Gqzf632!aYvM?9yp=|ADJiJlY(m_Q74LZ z&ehm$_SDq((-mIL@!T%ha2Gsw6z;Kh38bj2SlV^Ezo=1aa&}v*pRhWPya`q1Pu)~| z+vTV)k}%A+SixE{z!|#jv6M@aZEVoz>PVl+S()+V%@EwEG1zUgCqTVJIAA}wRX#TW zX-aoyK)F!|GRE2(<}#ZhzdDGX8?Lc@JHE{cw=-M_|EuLwn%AUyNpq&8we&$lCQBA% z83*@Qk6gVbAM0q@i2~$QaMXP`kX1?!z`@E`2Ic}jvDPZ82}r=7a3W8NiUo98NE3#B zzMOPtYD^EOF-c6ihOfVt+TE0z zynfD35En2X+<(UnTWvgXcKu9`>m$m){5e9I2(ZjdCk-U_&^H*;n!tMqb6a(6hlJU! zYTXySP>|TLFXm0t66fqQT9MSRxGZ4QoAM!w3bW6yaeIV(WufI-NsNF zuEc{XQ{aa&pimCeSxBNw8$a8~=cW^aN&(rCH#UiH zz%FxO+YF<*CRA+va_>~%aW#d$*(`N2tD4bWsP)r!>+a_8b^EyuL6I(}G7tb&%&#Q% z5LbOIEVY{izl@VUsc+AwyU&@biWVm-be}6vZ(Pd7ElpXDBI%;SG0vR>*s-vsC!?0n zX>n&v-%87)?)k7mWG}Y)balyM9%Qq2`P}~@HJyS;hjqT}bpm|x#4zk^1qq#t=|+qXh0X5dMZ^s?9{d0UQ(pd3M3?qh zveF!mwNRB_GS9Ea{fY322S5dGjRF>!G;8A)#D#Q2V;S=a)%q{w?7HdW+dhDt*0aw7 z{ME7RkF{^y6~V`ss%>v!E84(GKa%s*zth+_G@qvyRgPIsSl5bD8jhu2$H@Q@xz9ep z#|XDc`wD`~+Fj$ETqIIy;hy}yAF=C`HoQ=_hE>6Vk!Y4d zdi4W1VizTC6nj{iy%AmDxt_<8)yGpn7ap4-zA7n@W`0;bP)`}F`S9Xy61W9X!bawQ zFGPLxqkG=T5?7p`IPU_1)mFV=h;(;^z zoW>om!LjqVnNobI-JgO3xSGj zKSY;{*Y$@1@>Z2KA6opaZsx{CUU`GdkR?sh`xou6qh|*%8EmQu#fEDiw77U%OiNFz zgI%AtuJxz@C$Yg{7;5@g{LP)wyP?tp)UEL2y(u4Q4*qu15ig~S=;ajvjSQVfD)_Sk z*{{z6!hT?&8>m6Z4~k%2mgVo;n{){k7i9bS5^v#QuUr<~`}4RN0zvzh7LOp`wQ z5$%7(=`XTb$C`cDP2*Wo+_b|7B{Itl?f9m~$i6S;t*7Xu?q<^I>Sp$3NyvwpkC#Om zWFmSHm_W_)oj&6Cm9&7fvtptENPIp>q+6BQ!wSz#Fwqit7%cZskwRFx??x)7vqU0}01s6M=e7 zfkGS^WP32;J!UT-p?#O$dc#Q z*mzTWUZ8L>^%7s{gA56)dsxDZa_M7o>n$V&e%Ub6=JE>i&}Tu6`bhoqDlQ-;fm8l5 zJPL2PxBw(7-7f%;N&vyLL-wu>)0H&VVe`t+n+=tyj@Uv}YP{_O*L-Wd zcHf}@vgS=Ug#c}eSG_HoFk*9MLN z<6ss?>iz{2#Gv%-W#|Vzeu#5~Dy9;13-w2R{K#YpKwPQo*)<)*#e!dqS6iJ z08`9-DjN_j@!X^^6pBGvaq9>9;R!B)=E78bmxqN_FJyvVZ2H3CpkGOBw#T8q>#P7W zpre*H?5Eye(k!8uH6BP94z`8peAOozp#IH(d`gO=KnG>oS&A&nbDAZwfWk$;_$tB1 z^-5sItmh8ISB*Q~Rt_NtL<{v4 zMPD^(KLbkb)LpyTJ3sM59BRxS>{Ks=;FJJB(dc8&X2YgP&I~T1(v49%O^+ih*K|mT z#=-uZC@z}pWhd+;nX+!+0j)3fNxxCMDaMrYLKsq`I0nBX0%-7tu5Kctj#t_iu(c?Awe>Ca)dynz@k=mV&8opK!jx%?zv>?p`u1AtpLW6?5Y`7FQo9SO zn==ISy$5(S_9k8KvTvMC()x%xCv$ivdtA9gm?J+K!GG#i4i0M+JsB=bu-}7zzR6s9 zM+)&@p4p1=IJ@4Z!^zwV)eoQrYCP?>6yG^W@igXxMz)0q8<@ZB@x*&eaK#qK~;vOj_gbTc< z?-Gn&EI1&s>2igPJ78$2ojlQ`2BCdmMO!$36Kk1MYV0)Hk=u;+xVwhvq37;#1Ob_?TePuUD z-7Dp;7O*R9png~CEt}VTuH-M&vgI-0BcSRL<%!wDP}*(C%#95E4{FPbG<`1A)@^OU zcz#BfLxj`xRt-()K4IB%3ZQOTM0AM!itYHlEz}#tL-6{ujLZg~A^$MmuTB=i1J!8y z;tOwS@~CAjCCb93G@1J#Q-Jc2=c1h6JEkg6Rk*_J5=`TjBQ=ZxHgu$iJmF(R_lo& zsXz9WpImQz^U6lzab+h19vi^VKA>2d-12XXhU7_D47CXP$@CKOCZ=y9F;O{)|Ip(;Gq~L-{b-Rr1b+~< z{9qoJS6U)V`ER|ck7#peaPzZUkHQnSzy&?ejxREv1}v9zg8`|T8{rsxEXFgxG{}*B zA5F7=(P*EWQayLT^vs8xL(|T*wO3tmUG`38a+)JCg(-nq-ZCh^&u$G6lkSF7i;o`R zRj|pyV2^$Ad1TD*h_Y$0gp(#&a`zPp)vedvXvq2$L!r8%f~f3rPmaKkt{nbvziGh- zNzISTa~B?-TT|$pUlUI&3HI(-{0Lu_MykYF(9)%cNacX&f@R&cLdo~iZ$ukoNbX z5Z3YN0h01#wO^4+KNUZzvCJFtYSMK zI42C6*Pa4QlBo~yJUCY>jPx){0Ct#1ZbpzyNTxjJ=eH=WAz+U_ChC%%r`@3cYx0P)EwG5mw!eB3^1f zir`AzGkcJj?eHUNFHF{pZvzr`VD2hEhQMuZ;8ZX}_>=GiYXUdF*s}sVF7TxWp>4}S zv3;NHrLkohS%k<9re_-k)r+e8JedEx&~2)lfM^6-V4rYgSLix8>ZNS2>yKxwTw zB7UIePK-jx##4bw#lWF~yajXYPC+sk9Lv%qOa+%lpS^{0f&%JCsz_h#Njn4jf%nW}$Vz>nm65wxItbDP!}l&i!e< z%F{DR7=k8sczXxv4Fj8(Joi5KFj=D1abu$o&9$L4jg~2zpZQ_iMBq4yxB0>@f35X;jkbo!w5)vSg03ivGkcDjX zrN7T_X5M9H-giDT^RIr$^L&@*UatGPue;N#FS)|GBwoO~5Jno5AQP~F4xFRJj7^fP zwW>NY(4Hj!9%7MX3GkN>KS^HVm3&d#%?lI1Tt@EN>HTk?gw%l^IeGCuUCS1d z#W4V>=s&w)Q58_@2~P41_|geh3r9#bZDdEljiydc);F`E=}@3(Kz}*moLLG4=9w3;m=K}446ieBCXi*3YtKEZHzNm*x{)_ve z(X=`r32n{WgJ~fhgPz)8)c?AY>>A0dMeQzys*kx^i}y{RMkS}S+-52{50aWx<&gJPtlz_eFN`OXOpm7SP2Zax=!$DKmwTuaqp=FjZGz7VJp0AdEGAY zav&ddivIFwe!)-MS{Lg~Y#<3`39}DRUNx%cQkpx+f)tHDjuUIqY(Tbi1Xf*;Z$v*K zgWMrcceO@7#3ONucM^kP_jV`}H9@+o36Io^yQI__^ucxFiL$J^WUHO+nOj?Kzg^x( z?FS;^+yMXaD>|#)INkK$o|CWvp4~J9BKNtIC0+vf73U#jyg0|HO(|qrLhTC$SF# zWPYYMsAiPqc*NV&>Ua9hxR&W~6?nje^!B^SZ^mA_4$uC6RW#&hm!j0M{98Qp@xg=n zyV;(%E6O;GW*CD(fx`N?<||Dp;kenwM0$^%5lq)5Y6-v35kHb&R^HSl3AU8zh>rJN zV}xZHgYLE3-3;^IV8&CLq0_baE_}zXu&~(2Qu^4(GP(GF^@<8lOM>NDU!5Vt*jHzy zvipFF_O(r(cvX%0+FKrr18XnO_x~}(0K?}`e^)L*zF7eDy++*^JAy82hfr4gAAMUB zraY+6knbWvgsjqC)bCmwt)`;hJ6u{nQo1G8rPME3F> zgk_Az|9_z&)&^hNM1MS=Vs&cKbjMsiugf|aBi`f_mC%=9UT>Xu3-_azq!err{;PXf z?)JeE8V$7qU2T@iyxpprt(~D2mBc+wU;g=03nKJA+h|0}kb^KMG2P6<6%!rr^jGWP z-}{=M7+ulgY~KllktkKwneW5;P#fNVB;ShLTgC>;+qoV6?1)F8LGY5Jg^5MJdBo73 zhdITd)@047h1$+QyIpdjOJ4oI-1|9~`8kq`%%e?k_i`ws3?|E|LF+ZpvYn#*=C3r)Ug=xAY z>I16^R^o4EJzl8`kk`x`KNFArD*4cxM|X$!K8!F#;YFqV3`ub5XKQ!h6bb2N-p?21 z{<<}#a_{Or#4rt~HoiWfG*%@5CfAf{I%wtD+yN>6@NSKqWa3y&0!}GbF_{CGelO~fv&+yudq;{{hp`#_e z-}VhH1KI&Y!JXmg{PO4j+235sDP-#AJn_Pg{3w6i^^aW%`OPs8l4wDR$Le$e`0>C4 z|95urV#%zgI*bpLjuqLH4&RJBu?H9KKmIe=RNez@*uUOXCY$b_D~AvGWiSi6&V(WM z;|^BsT1%Wf_CxAYceI{rbXXfP$l#2HeowN3vHAO#7U9>}XQ#&0s_Z4I9_1&gd8leN zA-p=nr`wAs+THc)UR-QT)sM-FG)*pssAIkFY(c{Tb+%YGc;wq3$#UY;2B8fz;TkxF5Qb_B_-wh-d8`clsu@3+N?dDA-* zUooSqjS(fBMZJke%h=wG{1xihGi6n8IXPj0r}9j9o#SzV;y0uWNof%Kblr6y@YinbP{!UT+^xLWj|?mucdu5vUe+$9B_A| zEDHTvO1q!-)sr|a<@KeSx7ii*ktYVDsHbhuQDOULPLoWJDwLxOZuyBVbq`Ek8y&j7 zg#C{s6^EREZLhjHWBK~q?6Nf4b++pt>fL+GCHCun84ta&ex&Y~X*2Il9-|(tHqV*X z#9`|?{V!4tS|!cuO`mYoqU{A}CAGny(y*$k{m&Jnu~YwY$=G!xff_*C)t=A}F+8?a za`;tqrE$hwodedZ)qPCIV>&A;xbwcZKFmmI!j~$ooNBZpR=|H zmHK`Zc{AewyJuD#6EEoj>`ItozahO4$@Nto$o^5n5!3E?8&|KpE;C8 z!oY8e9KnHm?!m7}qtV}{ekC^B<-I3FA3PyNv{rhXuDGwMn&&_mMTM=y(dKo!W*!Th zAz4yfsK8}Q_z?zapsT2JhVUu`jzL0rFl2MgJne>7*XUJZ#b z@v&x%uR0%3?|0`87on_0ZAEu}D!)Lq9Duw@?1oLCaZmUZ{kix5`E#L;NuqU+_1i!8Tm!-~;2|e{ z|9r>~Y9{Ll)$lL&>dz&-OWSeO`Q|3&8s1z-?d#!zxf->D8s9bsTq%?-Im|t%5|jChlR-h;933qTX;b= zE8k(g%7}m76b|cpA6s1WFK*#vOI7+dBWY&Tgz=bv=@U9zbXjcoC|gk5k(c`X*teY))*Ld+ctRqOc4F6aH$C|D=Qrd5EM6Nw|q4>Q}U;CHZhvMbd`yoW2 z0CbUuMy`c*o!vWqg=CG*6(#PUx||Qf+=47lZC?sUJZ=77$CYK#MSniOCwKnd>ElH} z+jE)gylW2pKpEtJa3}xmI$@TlImmJG_5?6%#Fw=jgW_d>V**-jqG$JSY6u7K8>b82 zUJC1dE_4^wx*vwI18`vcQjwRqK*?IKkHF?vqD<>X5O~t)^yaz*Uc&L|oj|xljCed~ zHh346e%4z1fC%*ZusuI+#Um=-SZB73y$nd{Wou#De0^JpXdfF7Wc(_SDz=E-{*VqR zdrw_^mZ};^q9sWu!XOK|U-!qH0$-xcptMwTQv7+K{d)ywj}dg$%aNm7gcYFCB9!A8 zD|e6SzhI*MD1&}%Zj)f_kpcgDbJ#@4Il48A&LO{h0key=9Af1|_&DeJRdx=d(~$sl!)OEcN_TO4_xO%$mV{NprVFvS%kQ>{!b zBFp+J7IiSIEja<-Qn`r5A9!Ua8u08|s%k0y$nO_09}Atsp64Y6bbBGaCt=|%rxT@s zMSa^s943DN7tuXdYbyKWhS-!By;4$FWo9{{X?0c-n`$xq5mz^600V@YGg$&nvVfG; zxKufDU48?tJ_z*~J$2>-FkE*krzKvqcAo_KG*+<5m=C&4EL&FMi72KQCO`q>y0|6# zw??g;g1ScNC$#Sn);y4P!sS{2NDCTw&9d^-r)E>49F9L5u|Z1Jf^C`6H1;xasH+pV zW&F(AfQB5$Jfa7_kmG9&`&^RteT#nTtUv!`j0{HyKScdBn8+w}csY{tjm`3@xwSH( zJF(i7)dSMFi6Gr}73UUhY%M0fwefE|Fm+#J))ZxJ|MzYbTAC;cmKS4kIVdd<1ypar zVTvuc!^C^o#K2QPV9`ADTS9p}tZL>VkR!rEcBPT5UadP9X!du4An|s^iHG;$tlgtz z*OwUwbC3AY1vJgA!d?*zT{RP49mx*BAaNf~?9RHhHJ(!Z=vRNSrIWNyx0dxk{QZmg z?G0I9PhD67633MY`b>~S9iGUmXTLMq#+N=Je59^9BPIc zzlzn;6bq#Ka=J^$!Q=}x5#>Fa@iX!(2sgqruzigh9O+MT{0Gty1m?=}d|^hrIICeU zG>Wj8s#ztyag^KDZ_hPZ0Me%JhdVtfvc!<-q!ei#5ppKFYyp?mUz3aO8;&AMwD2DY z`9ow9FSOn=;^cTZ>JzPkOyP-`X@O@v$;XqsN4 z5;tc7GV?^5Z+%g8*|ORDm?D0ibu(e?M>fTFmd)0BhB|wM;-(2+}=Mwu$tK$=FAW)KZ$>?q z<<23!rMfN0$Q?%IGPDc3S3?w~b&N`5oM7rkt*p*4EuV&QmIbCO#8LAM-r(X-#gmqL zA)&tzJPv8hZtZXS>Z$cP@nU(0{Fi`6o^4>};7)#C53E)EfwE_!Rgo>GYE^iN~#@Y+6gBY_rmcFaQa+CU1`VQMHZ^i9w_W zwpX&W#j?Gv9nV4nb!0;a+0)8iY``hXrzm&mx_!h}!lb3r0a_9dU)EMEkZCc**E=(D zq|V|jkdPuX*^^7y6;B%B1G|4$7f2Di(wu;?eRvTgg1*b9?HX@l$EAiCOXrEmw zu-e-1s*89&=+S~5EX+aY!gM}jQH5`Qo|xd;fU#_4X+J>qyiO4%|Il>+3H4F}Lj@Ue zW66~M>Y=2OSu^IF;GLLeG6lWS7EK4Jo1}}ehFS!s-{H2hYx_P^biJgeP9-(h_1}1! z#qy3~%)$ce^Q72^!_JBBdecH{p)aLBTdp(_v)TSm%0g?H`dztOt4E|k`xPX_3np7w ziWp{OMb?d$>IH+V1qbC`sG!wIj<EQ)hT@rT+nyc-S+YKc)!N*a+9@hvd#IuSs43-Mx$#!vl3 z$_vEz6W+)>9|LX0pd_m1SUXW;exq9;d#1P$AAT~M`LqrUdSFI<7eokBQ15~muhjO# zc;|C=K)CSD7VVG5DC`xJJrq zU?%T&mmWih9iiPXkla_Mi9XkscwtL)@NIVB=7oqf;GbAFHpmNDwl}ak`Fg>d8>r!z z4Swx6(cA;kX_du&&X@N?GeoQOAa)tQq?&o6iZ=fm9Dk^U3&{NGgO`Q2&=BA|I2p5! zEm*V&a)%Spn;p{Rhn~5MCjAnU+(~aPq>O6L?||6qaqu)CokTFO;Y^= z<~|8;dVQ*&ENR;~%smLJ4pcK2NN$i%LW8`t)BRrze2-bf%R!lc4KaX`TdCM-1!p$* zI@GzM4BN8%*)LnP^?~wpljA#elwY7tsO^qRVW!n3r$VRm!{@<`L13Jqbl`W&LHF-B zdoSg31oG=!AH?S${TQc3RudN;Ca(I5k%u_ak(;n^Xn|TSC_63+A{((NkqJ$GH+f5v?{gTw~Wx%Aa^!T$4;1H8NR zmVL_f!5q4c9z=SSgju_<RW?Q(%c_+Z1}l%$)8HZTJO9jX5!`QQ`;uvc;b>FkdWJ)xMahY8vy*=X z`FAXn07_p}uAyOpT_2DNY!}o3T_c{biP7$fnJEQcik$RAPx^(Rbd@N_%L119o_>At z!9Rs3jUkFy5V4g<4@c`h<8X&Bscd;Fg(O%9#$u%PdFeXIke=+l2b?S`KdJVnhL14a zk|J^|OJk8^+8v7id69_tf=qD?t>cU(RZeZKBMGtP&V`hoLTb;0X_~i!4qs#tvSNEb zEhpUfQ#tBXS+8BLRlpfsis>7bgt(<1`>4L!U(!7LU8L%+s0nK=NR~z zW|CfFr;=XEX8>$(Y>>(@EN)j-8Fgfuii66;)K>c}kgcb^QU`K^1<(KVz2%PtgIKFkh)^sj zpG(LU==KW_k#h$o&xjX8U}i0WhnXsRmAq*(O$W|O)_}D}vbds%GU6ZzrF$*CXB;9h zpzn>odV1R1Cs8t)M7L;z#wX{9>H5i7y7{_3EFxoF7kyxXC(V?tMOle* z9v296;s@mdy?jT!wMG{6Hr+D=^{8Wa5clg7xC~QZp2KK#N{lCx-`C!hpOfW)aT6|I zW88Q)+c&`vWvO8F(JZ+pf|N%DDMl^vqO_67Hfn#in1EF#%X0#$b~tHlC%YQyxzpkp z&4xPr8at>VZjj^h_kyfH$yim2YvI!oR=%#~!} z+uK?EsjF1oq4H4mCJ}4Z=SB{T&=!?6YT=DfvR9XXUb}yZDi@*r;*-3 zP^qf<-uYbZ%rhL5eEd~a;_NpmS+BZbd<`8GO-=^22!J1oV|{Q3RR zOmMd=Gl6k@SFO4UiKnCpd#Eq`AVSwXHvPRRfYG+<3o5+*|5BSBVr>hN?YnwA+y5W6 z*$dQd9=6B+Q!R)}&gu)6s9b%jDp%GUZ?tWh9Ji;BY=DxGjM1H_;hmYF27u23o#N{1 zZeMr5@3_sc6dVp*E}Q>e)sW5SOW_)4O}V2+&oQ)t8Mf#wU*fB5jtU_FonbwFZVN{h z9Ir6`>0N}!D1EwwT9?S`ajQJFqrfWDX^yoECiO%zS3!1y3C)EgbHb51$%C^bD z1~{SPvOCR6WLtUro{&G{7m*W((Wl6X_bs=i&PR=ozp6&x z34L)uHXv2H2}7UhxKc4%t&F^50>Ay4LzEmh$H5! zkdC*d?%{^2CN&4s44530+lE5gXyGEu)R5km05kvE5*or$XrI6Y)-btu9_$BZv3WL$EOV(22vDt;_t zFvOSTud3U>lL{7VwLGj(^h|qd`%tkBrA53v+vNv^Lg!&`>v`)5*@uxe9X?sY>3zZ~ zM+=CG_3Mw|g1p2eeR86MthU#%@)3= z0HE{o(rLF->Y+IP9!N3Yg(ADtu%U_ctE+E3-K)52&V(k2}55ArA*_6h~Arp~{YFDH^sCUdROL6%GXv?bV5 zVPml1fTLwCorREfjixNTn6}>uXPe;OTK7Y_D@XTYHuUX5^)*xLF_}}Bx)NRQ66LN@ zw!5bx!y-%7UUbYyH&R^hvyZ+jW{dZ!W_HQ#!+xUiJ+s2j`rg~g|6E5%)E|#S?lzTj z*clRkYovSc6=BfO&I@PJVv&8AHU$!XLM{7bUW@b#t6$jH)s(~ra zxzar5q?c?w#KfhitH=OAd+uW5g>I0cT-Iy<)LP73(^g?JwWxzZ?ypV}^M>LlqB22i zlVzgZ+-lmg%|Hira}E@dio{vLdvWvjCDXDrc4m7 zK~t+`l3qtcomjYgi-tqfWoLpA zy+=;eRP~tH9;Y5&D8GuF4EM|izVcqQ1?wwk<=EklOKjWZPFBty20Mk8A4P-sDkt;7 z&gXc{nYr|tQu;Ifrw9hBbg&7l$Fof1diV|55O}A=6!gwK@nIveh3nq%KlAMz=|Zhv z$(2)Hu0za~8(2kfNd3y-L#&mO=2HJV{#Xl`)E8wkAE4*1(3W8K|K?9XizuZTvm z8uU$$R4yvAx)BLl9@KQlzbHF*Q`v%*6K`8r9mf(G7PSVQFm>C$)5rb0YIeOtd` z>1^?pzaNoS+h@q+$oU=U@t=L=`GuDku}>X)OCrZe9sWbi$V9lP6tIE3{V#-g#^>8= z=D8`ajX!D5Iw}~{al=-@(AMgZQ=YH#(3dG7M|(p zN@L=WD#wpR#zZM&QX$N64ag4Ib?-LLJWcFXLp|s8zg?A|FJCbr*n-SZ#K8+0G&3v( zR`&QjKxguS0n>fgev*tQr(b>1v?{u)-{sStgJ0JQ7Y@3EfU*|;1Q7b34-c$S`c|Cd z)68y4^`f;HKkZQGf*C?(EEpzmtJK?p{R(cRjD1{JZ~D1)I(MUljD~<#*$wQBdcIXV z87*}cdDqnk9STa{-|qVcx_!p0Vpg^5U;j3kC%#d0Y>-JIZG__f_itzyQ9#S_ujOBD z!Fx#`Ige>)-E*oGir~z&{J<(C&S_-}roLcDo+d69FHPf*zQFH?KpDe;_6493ja-d} zy#hAbV=QK&^_tb65PqEj6fcgPJ>PW1hharnIza?Z#^FXL;+vLoUo1FO_7lW>$2-OI z-fZr*QVx5)jNu=JO6XSFC0V^x6Zm7xk;P(hMF*ktjQXy`)L5+KAJqg+h$3;8J`l|+ z%dp+y(z=m}VV`yY_0;NVBRMoe%nlZGPqr4W{Aysk8QhZ5T7b)^%V8DvSWG;p15fcz zIv$g$d_G~Bs{R#>9$M;Uv8AXiPvi?omRH3AhFkKv80EQNSp#UHoOCG4Mo6}Z&g6erKZ#3z;S&>`q zP2nEfMY(IWaB6j?M=$LAne2BqGP!-?TR$?l^>Aoy-RSf!;5~E5{RmdnBvc+|3VHJ) zA_&Kvcn~VX#%EWcWFODs%awh;00#38dOWSF_Jy3(+kwdPq1qkqcTGEqU(G7pR7aB0 z09G{iM~^)4wq9DDg8L)Qsfg`fDsFJ~17WBp0~uf?)rnV5q6c)oZ!mO{78shS(lq(R zWonraVF6i0gS?pRh9gJjvT)ck@zPz+H|Ha-@jNHDH3YY@7&&uc{}(+57gS5 zbpvUjFn_pqrN%uR_sc|)NV=LH?U|)0$zj5U{XXH4#we}x#c8#Mk_K%~M1Yl}*=}xQs{pQW(M)H2Yy6nJ&b$Me)Q}c(7hx z;FzNwaD$vQQ&`W4u&J`?o2g`;T7c1$RM_EFcw99ZPjk(rT~9OwX`MQ1C*8-Z);BY zB1nv}y3g>q$yMz50GDafL|Ty|e%D~~HA2}y1k`$_STVFxj{j79+A%*`0)u`x(*bpL z=yfNH3bgPG+PSHC$rChV{D!<(o>R{6r@e}kQ9!lM-r%jYV3{$Ryz`FZgg+;UbNv2_SOjq_NH)sEk#jR-cL zoW>qt=TGsau&;LOfK4uw!$PBy5OMuYJdIl-T?}oVviz#0S?+jKTP)qLrC*@YlnuW) z0&syQ<}YP9FpwRUF+WXap)55`N&|-YP{ys|@OkDv-mPT%TP?zhg_z&RUr9S4s9W5c zePPbe<4pd_Z}J0>=*Rh^w_2(efBBio3;uC$SE5l@i@`Tl?u?v%wI*;Ef0ykova$yn$PH(pmI3dWu}!K-8&s$} z>E~HI6xC6~q8Vb-k%P8}ZE!G6Ox^Bg310@@)_F}LAk>niprRz?q|$gCtBi3+u)YS4Vo=LboOamkrXWOzbYo8kfRk>)b?Av@K7p}_kP9IG@??IGFKJXi_f|$}e4-IV z?1f05C=@9_8}qir`S+n_3|^xjg?DaE43v?X_^Fp?g!cy8VjnPJ%J0K5dG49Ck{1!n zao37s>7bNDA@95%`2i7|i}^4;C`9#p-HU;$55)CL=LUJP*QxUkj5S0sy(*ZM5Np9w zMgN5y@|`qR&r(@xd>n8u-!3Kh3&aqvPoI};6$Sbgc_MHw0e=Pac(5sCgn+-G*5)0M zz-4(aP0W+Qr?QvE(@h`Xd@a#^MlO^Os>#Z-`NYP;D)VnzRNK;13KgO8nqz6gx>r@p zWXlbDG4X}Bur&?EEuX<}RUp9Gu~{M-w~wH{nRxr;4x*Zo%mvBWCV4T3e@h(kb+URm z5ESgEs}nQ7o;UdC{Ef)lzpHOUCbYc{FtO^TMYI%HjGZmgRWdDqksW|t)0xGlhd(4>0ahdC!+4oT#)pC+0i& zJslyTo;B-eyra6nfD(~hwcrsc>r*a`5kSO zgiv^r!o!#LxABswtkR23OBA-Yd9*ZU3?=zX8#`bYI&t@n}Po_F(+m zQ^lX7>|?UJz-deV#_h=~Ohb?T)W~_$!I)Pa*UFmrih3T*F!v?<=D&NwU+b%Rw<*7L z??&vJp@7!xx{7x}=}bs2K2)@MJ7@l2K{>7O(GNIdz}x4$)=K@|`@G}dn(j4wX`8(# zc1l-a4$1)bTJ3EH(7G$+C=b#qi^y>c79hCDucYZi5gM25)=C2^n(@fMB?daO+lQdflqoh`Onoy zAD<7(CO(a@TRw zt=v8h=X61W9_=F@hO|D)3BpvJ743Z$R^&~_K7tQLAp^AWxtDLJ`n?QEbk)S&RVu@N zKlbDhiFHcnPs|sGm>gMbyM1CPIOdR`%o#(Rl#j8ZSSSD z{yY<{g9s+v$dxB+x|?>WBu{8B5ZE9FY}@pGtaxvqi{z|vUvN21-SRp*=j#rJo^0z zUMb5<3sf3YlTDAs87pM)q>_v&=u)6a1sE>PzU$4!#d`KfpzC0S_k`be%ZogaM_8xO zJS@#xn5*ZhJOHB|$uD2T1te`jEvW3`9rsqVQB@b{N5sWkg+BmqS3@BjNdB3yJp60v z8k}TmrKUNOp{#aMOd?<0cWDsbE{#sKyD;&Z*_QG*3qOJ2O@= z&hUSr%W7%O1{qCXAunc+=iJohVvcFCE6Oi%850Bv%*8F=gDrU;r+Jr!SSDWjySsIh z?9dvt%=u&gELi<#Z;yWcbeeXS51~)q6eR^S#Tr~CvbfpW9fY6C?=o089)(`F(EjBb zV!bLN?+m$LTkNPLPV>u#rXz(52d8(-R?gse5T9hsjC$<&1)2tyIMrPd>}hwz017rI zvK^T~o8KT?J*g>^z3&WiP562kYoxjtQfI3)n&SM(8d{bdbCG!s^J%{#G6{ zFXG9K)`H3%xz>QU;MHTd)~rlkl2l1^myWIqO|mm zcmDDNKGc~Erpq%^j{ez^j}(xLG&TTjX*rS1&2%!t>?MAv=6IYMrtyUOMIL6|#MvB- zm%3z{;`>>0r>!^dgtO=S^7C}jX>>Me@^a#-lMd&AY~)?MwX)yj6{1<95>5 zlBk)-5jO*}7Vb$79Voo3np&fJMveO!oj9?-!MUXx*3Ogk7gG2eGB^k0 z*Pp1*Bk4;_MPh_zg8xh)n@34RvG+F8|G>P`qCRHDVFX0-n@vwlsC;vCpz`~-A<4*j z(qM;mcho%8_LwJPW}4<>(X1u&Q18TX*~7&>K5ic4Tu@a!d+Omg?rXV`%*4rG=)I_cSF+ zG!imXwt;QM&;_nNlS${qcV{U-wZfT4NhcB?)ra)h$L6584aL;5meL>Wv}DxiXkt9! zE5i!1b(=aYN4C@XMOz&g8b}_YipV4vy8*V-pO2|YSJK8xX~!LsKBFx^=LGw-Hh!XR5f$;MV8pE9O<(UKRUgJm>#)lMM4WFu+$*84K&uoS%Pcf0;Kji%w{tA&_>c zurev&YCrxdTo2RzJQXe?)s>DHo2Aj88{EfA!a?zAGd5yfD;#aOt+w;@pFcHqj{^Xgv3^t?N&cb|_ z7Egg)g;{Q!KhlkMhNlTB=RaWI)_ikWwc*hUUkVRR|KfGXXSO!S{m|)V`P{4QkGf>? z?92c7TC(7<@XcxCr|L&Y+Y>aKb+FY+NV|G*UN44Za7WDx6b=lN%c2&AJ_jsM&jH8v zDAneH|1IZ-{+M{6vaN+uY=ff<}1E+7Wkrw3y;r1THmeS zKl+P2WInh4<<3Ns;Sn>=kfn(88=Gzcd#B%`W7;3%LuVc}^O5$I$S-xXFTW%%b~$Wh z%JLm1uqcZ~HOPAr?Dh;E#H?@)Y}Bbo;Z(+cwC=vFa#!1P;p3cUX@G8;^$hn0tvk(i zlx9dMU2uQbyF*GAr2ukmdh`}omHX)KRsT~&L1)1{O-T~lQN3Oo@}EB6gNS?+f3sT3 zxA!h%hX8>t+g85>#Sh}FtEk~sbbgcV_6kAr4f>Cb#SOeN^1ybe%!?ICRA+0yQl9Jg zS-?s@=4=iV-Z_MTldZKb@cl&Agi?H`- z5I>|g7ipU3&yLdg57(p8G5k5rJaxe-itu--5CUXS`5QHf!FzNSW*Xl`sr>A1`u@h^ zFz>5+#WS%0eF)4dbyAbo&DbWI)QiFP8 zrNFhMeBI{bTUM+6=MpgOfT3{$7tN=nz$1mYQ1+CCQrDD2e%8h z-jZJ`-~OsD+Cq7w7B5{7qubFbiB+Pk>r>Pcg@;gi+jkRTXYexai(gAW$E8j_bbyq7D6wrLWC52>+N*6% z+OHJa+CT6dxa!GjsG)41V?AHMCVAR-`G!CXLNi{cY4<`R!(4F8I@HE-SAj+vWBq|H z>A&N=cZB5Ej#4TVs`78mq0XY#IJ&*r<@XGQ z^pj?Z-gUh4;w)u%X(C{%zE&6=`R!8G9Lm({MTwQJvuDM=w0wfIAJvff(FFdwxSLbx zcxts=W7VP&N2v&8sj)(rRA(l2{c+1u2&5mEVC$4SE!$_3fGjf#^iWY{WH}qF&Bq5fBM1mdQ|~)> z$`(=kT8a7?(mZoC{&JV@SD6@IBPm^Jnm>7t;z;r#S(8Ie{q}3jTHl{pVws~Ajy>u6 zc7M5+S%G&g18osa1dC=GKdwkCTdpZTdA@&gSjDTv;~x@-;N8= zUy5uwU-4I2!8F8LIht@sg7CjT%eJfrgLJ7p7DjOM%;nwg@usSy@vSG*{)i-zp2jAz zF3+RMUu|CEk9fJ3{SoFBhu(E3OUPgK`f@<%KiKwGq4HqA-3}BD?&=j&z8`R}41RGD zJ!g=>?Vsap$1iIO2~1}*@$P~5U?>~rcf-4B-kp}qG~I-sD>x=L#5T!5*~azhok!;ZJpeSff#}9`20}I%e_v*^4pim z2_H^u!Lb!@Ptv&MQy1X=KlIN8L9ySn38hY87D2KZ1;i{0b^{e_{1^*A%yjbwW$5!+FW=ju)R84DJqD4r=b`-X)|Yy$I~aA zld?$Xtx$Z~V$dEy@0&WVw?7ZaqrYf`rOx%8*bde3@}COGb8z%BY!s+gy~2ORJ~8Ao z-+ih$GK-*oZuFgxvrI80Za|#SpQM&qZIXY|ew7vzLxkbhp)5@L!gyoFO~=ozaB~2u zj%pRQf?NIqf?z0Q{0DbfVb(Q)ValjM==Y1YK0yZTOoy#9MR|P~`p>lB7sY!vLJs%roMTH%^1NsOAndppC|NGd0^T_g6M zUs1BBMg=`7L(Db0wWe zpKAG=Ax4SrDArQ&l8d#Au4vmLP@CI`>b#Rv&J%-8QYh|ug$jjYY=>#>MQZ7zD^m8S z6yAOU0;m_TYU?shJB71Ug)9nV4fM)D^%45fp73b}BLFYx_W$0)*Oq`*SwX!k=7IeN zg%Wkn5vfWEMfgwHUM^*joL?#T#`Q z(Z)N%k^XpQ#j%NKyUFe=FXmoxmp!@pV5NyrxnB5uu(RIYuw<$$CTpRMn~1;VE%h(g z5+NEGl>pHcMi{)hy*cpmrFQt>m;Nc1@ye5z^%m!?jLhyK2&k9G|-`5i=%O*8OJ zLzL`lYqnS&|9HP%b@R}|HEIN_%gf#vuK8lHJ8GUKtWbNs{z2oARtdNZh*Im0l_wFaVe|&v?N5!o)KhDLp#$Bub z3w!S#)#R1-4UeTtTdis9R6LS#oR;Z$NF9vGA&J$oOzQ|(tehlK8I2MpLX072kx^=q z#tt1(2#M!_5F#Q(AO|S|QcQx91IGjiB#;mSggfWMd(&^8_099F^?mO=&%56BtarWh zPhhRA?0fHPU;Ey_{oB{|yWYOPo zx&OxTltlH_)R({9_;LQHwQt<6TQqqtV)95Qt)nM0DmIXlu4w)%%23fHF^l9jl3(tT zXed&WSkbJ-f~o4>LdX_z`R#a{!TE*(;|%d%>VW=$1QG-Oj-^uCY->n1&G8AwNgDxA z-+IWB9}B%LlsN<6fe1feX z*ede9Y3%~60Z*Vs4^fG7&p@J?!_IoCU4vv~_+$OwW9FU9w@P;DZI^KRFt}~+m$kxh z*RczZc6TYLywd^Qk?gho3cbp>_ptxM;*)zJCuSOdB8-!JT5ZEGQ9S@bl_LL8{vH%Z zTXjLHhGDv75TOAo^7iNbUD~Gy!&J$HE2RcmUn19@b>>x1=o6Dn)w)i~3|z#_*r3vq znfz22eP*p>1cGG5yY4dQSrVGoNcZal8t=Z13@MoV;WB^%U$ofu%ndJ={!$e78%)GZ zXu#LHQR_tp(wJsE)w?(xmOKkA3LLx{GMZbqhygRSeaWc!gh_T;z0m=lP_o<=f{_4e zI-gT)D3iL%bZ)U8tZa-hGCeF|!}CLUM99`tIY2Q-HUe&7m9jLHExkOo**~WZ*_bQ}MCdx@ z7%j82#M|Bxv1`T!1{u1`LN(QKS6zi~`R6W#IC5*ttbZPB`?%(c6>W%~cTui6ircIU zSq7mf+Fx-am-bp0WjQt|)1OhbbJ+L%S6ehMMDHmAcXLsR=w81X@4Mb1o-6s7RmqO(fIcqD!p~gg>S& z!a8HzjD$E#&U;h!ie%9)dHt+kP2-7mV~fzxD&vp!PFx#qWbsj^*p1uk{CG7(vMiwE z72t+pi*h$`60xae2LBsRKhFS2;x}a!;dCTq0U`~msFh6vJt?@OH!{*@JA=jmo7Dv zP=0AE=C^ZX58huEPk7cwj{u9MD*%NdP+rh9juC~sTEXx# zY$1VB48@FQs`Y^mZy+Co@<)vlgP7~Dghz$g4_A;aJoHI9^`I2od+v#+iuMt|D*Css zpR%e$RNGi_ZS3M}y8tz}M6pN=pW+|E-Cc{uJSAem&`x@h?7ir=j`fz6`Uf zo~3)_+7ldjQeb_@uy;Uewz|1eFGpt+#P~ny5Yh)gH{S9wUAVfP^2RpUu{pnhwxPAK z+53lajB8V1QYg9LmdA3KZ`@f4k$3=%FNtZ@FAbLTj>|?D)=$8z4v}Jf&Q{2LlyfZs zU2Wj5o-OFW_^MEjS>d-{gQD;uO-Qi*O@h{=NjMoCW}j=DV9s&99V{u`*oLdQ2^%G6 zm%@gnBWwLb9U&tZAUc&Byrub??B+uVJ=y@t9z=YqC*J4}6cB zgCe!NgP6!2-d}_=5`B%R5~yT`ggmDm(DuBYnP!B15>TRmeW7Ikvj>8iwX+L>eUhK! zee{LV+MIlt-$fgNctw9S$Cm?Zc0ovziQ&Q zEENtj%^dqJe&88&lq~%t13wbICr=kkmL5RQxEJ_eq5ql-g7nW^b>IUQsc$woPLLN8 zC7IvH)OUg40gLc=ccF?61s~3~Dszv13;p3a=GQ?E!`$F{+LF!aM>GCh=vUJ$T?ZJ( z@1N}`+&IX!ZldnyuAoJ1huvX-`L3OM?!2vJl7^UF%V@>tnjJ$ZU+$uOT_Lj*=K2T} zy30KwU4Tr&XnnO zD)V)B$)Tb%i!dv^qZls>fu3mfMED-S=!Zk17+jnH?Hp1h3cq?I%*VWit}* zTBpaQqQ^$te$N?M$S*|6en|vP0Wa#nUzm~w(R^UWMignB>HDIG0|-yRL&N*%C&d-uxw61QPeos~zDhv4Ca;?Aok(Qs)*j zbb8GS=FJvC*erv7IsF;R=VvQiQyqfi{;3&KV2G*EFHZ4SM!38RJ!#kp245N z2H!5gZ1hJN-7ey^F--b7`1;hWP+WN5d$nj``SU`ds2Y}|Z=CQA{__#c?CkCU7+`Gg z(AYh@E4m1zBbPNl26WUd-qaDzCg~yC37TZq7{sX9V14%`%j?^e(s z7~|{4kZd2v>hcTySl}-6*)IaiZZUW1T9m#r!3xoP%A|Q9zhmz@Z=CHGKwC&sFK+x~wcUHWs_vO<6r~s~-0t6T6ZXut_9*%+;C~ow#cpGk zV&zDMlFabRVgi4;b^|u(Tzg!Y8Slq8 z)woGoy9zHx1j9|F!p1=<_P)TnObF#hygHnjkD|kkIinza+iHKMJ8H~>|{%UuGrrGEr(I*X^0TP>wAZKG{26Cty%00NtSv@0Zzx#5YeM{%vTpQV;%cY$d$QbBEVv; z#u#VvujP6^WlXGqjX8lh(0FtSjh_#V<~Ha4KAs{y=_IxgjG@Wq4!}1Muxn8M*B4kT zU{_}&32xvI3au{uhUYf7WVWH>v?S<>&D=t?iC$4LFNvY^ee)Cw$~@`QPx>@?6zU%6 z=Qpt(z}&2jGMh2GZL}@PFo%9*|H^EHYFgoQxIb~h%e;U>AKmDR@yevG2n2d;<@`&d zW|hq{tNF&!fgrs5(j34=+J>4$39_Y=n3=_xnK@7(?zS-K8Ob`^XZy$~b_do?Yfzg^ zNf>asFk+4vXP3*Nw8kT)~8uSTE<^bOyFthhAb%xCuw@IX)43fGOMWrJr)wI68ef zhQRC~Ov%!P+XGMlaDVx;8wb#WDIdUiA)fSq>jrFxAquo~Cq!9=a7ibdOggfN_zv1T z-hKDm+xxa-t$QikR5=F>Z8ysOK-D4TIqln&W;SHHjjVoHAV!&f>}#@JjgOuJJf9Ix z)IT>>MlZCWxr$?St;U&aO8 zUvJ8^`&a&BtK5*Y4bw6Dp5;`Z^8jg~S=YNI();81S64pUBBsnU=HCQcACB0H?rtj! zvFzMK+$?tP4&K7FSvNnDI6Bg{&ZIB#wzr@>BXly;1q&QU9rguuMyRcEx!)CU{oW7U z{qDPZ=0u-o1^R3o*SK4%d8G(*T!cp9RIOUBV(HE_QmCd2es+rp{|J;%?hx3nP+|Vt z-!$2(7RxEaR^wY;A$h9D&AU(tk<^r2-gjfMAKwxEfpOYdn7r-~V#?9UZ#7D;&lOR*Lz z*ZD00nI5xa&edW3&eqq6IdOYD1t{C~%%dk<_t*pV$T0L-1EP?;;X7u^3&_d&{%^y5 zxw<2v(nB{|>u0cSXzOcMNUr!bd8|>$K)TsPK` zItN3UmwG;Af)|W^R-pKLx|mu1Bjo#_?d}ge+2giRdw_J71IUBrBIr(h^GrCSJ)TL^ zJRz6trF?k3gconKU(2@ zvd8xelu2HFJsCkX3a;0MilM|?*M}CnCr5l=J9hZ%E*}X^9f&C$d>4MFAu^dI-=KBN zlGIS8GM;M*naeypQ;j{4XNDn{hch)ljT7F(@^!pK8oVlLK9Wm z!Zim5)>X$E-^2S1o6L|*6Hj4ZN``OERo7KiG3ZO{f$6?b!Zff=-Szc+_JIg=Y5`@n zEh1g?bt{;M7XW4%hmY{x^6s9x8wKheiieInpDT9+n_opfPm{WSa_5)2C+mE>(M3x+ zz-H4!jBfWCF}0zCO{HH2az3OVRu+}0Z==_0T2tX^)|8ifaAjB(^}xo=vV34--6&s2 zJMQ~zzi+;eu|d$jSV37yR0;668?=al47nKDPHFrWxz*IZ&zvAAG9Tra@*SHEx9eqf zCUM34^|BVqx#hEJyyUU})&qw7wDek%{vsAp*ksZO6Vj|4%Qhn#njt>C7aBs;-zQdR z+JQ%hWNPY4TX(-91wbpm={FofL>1(kBQPnX z!q?8Nn?}k$kc@zAB?!h$1gzS$;ph3$B*g)H|5@V}l?Pz6yEo%u zt)pjF9fJLAW_I@OqKY%i)prTs2pP7&0l{#f2kW^cS`!juPEmd>m0aqlI8L)79qv`; z@!z>))C<{N(i1)4-3lEBYR5n+_)Ub1R~q3z@Ch}bHb{Y`%AgJ^Ulfu4$~rcXdH^e- zs~R-Ulp6T(X7#@MN4}i7M%f~qshUfPKbXh@E~+kKKMf0GjrT1(N%tM~JZuDZVV~_! znvZrh98%uIW9lt%#&z7gI}3rYww#u-X<3A4rBP;{c7;lrAwE(+y!vHlX9jskP%4Jm zE6L14bg#bf9VkH?yk(~NhxqPR4`DXA7$B-ULtY96{q{AeuKFeHHcI8n2231M77?0aq?y`T4vy$i<5<(I*1#Z&*N(;-m z+P2J<_XqE%JGD@a@bWMsV{y817j_ZRABoqkxd^>BV120Ki6byXb-Xz2VPyxUC9@^` zMsacM2sg`Shlm6p={9s0c344OC=94o1yU6CtGGhU+(#I%^RpD-cVdoeka9#|d{FGC zj3T04xqzm)uD8*?khqmALR=;cmbWhbQUuwoYkS+id)U z`Pn<`q@TN5{_0)aiV7$KHkj0%#FXo!lR(b$YW(S;zSnMdtNm+&IZu9}tY(5VcZOdP zu9IXA;Ama5xI8Gj9YPqhY^+||1g6LHVi?Igbl>A@l+D!&Q)=-4g5Nzfr|pT+ZoDD= z+vvb0@&+d;j)M1oZUS*3DF83g+OW1 zViYQkBAm+AnN|W?ML3ge_i7*%#IP;jw9oiThy^9ocRIj~94^*qwn{XcWjI7YOc@8?qgw%BUMrl zT9EthzjL3XK04z+I(9%eDt=6cP)2(W`-z`eEi%Y&?@f2y?Jt(bQ2pj$lgj12<$g_` zx2%2vUn2K8bG61km%G^td>dZd-HsohVhkuW%Y9`7Mxg|(y0>+Z6+ zqz*A^CU=MEqfUMFMQESUskQnFS=P7IW9N@5E?=xST~#f-({>^Ea3i0O~)m56ir)xqJxJCc1kF=8BG-H?9 zPlv|Ak1>-EW8SKuKax?wr~wdmvPe3%k__kFX`key+?q>XyI6B3;ZzMJD zC)sf^CF5Vs{L41~GrwuOn}2f$HSPg9ph*?_FUkJ^RlF{B-{UodS6AY(VVGg_ERm_A}HN@NnA4@e13nhg3q zIEk7h)N)3CSdk-7QMgmhef6icefE{-4CbMy`>x`fbEi*_7W)mi88-au?DJXmhQSu? zTAttVjgVT@lw;AU9w7des-|$d6-YO z$7j&p(@za%${O><5ph1*`}lx-63qg>R}Wg!hbYv`iE%F?u?RDckJUUTV+Yc@Zwg5I zt=lA)(Z;$f@$Rw$w@ms)M_;3=ln_kCv)yGIwf^!Raj1DCzj2_s39v8Yv9A&26tyN* zQFGiTZxG%J$5`9bkI@F&2-p?e`3MM5#w`A>j!*?RF1KrU0uiwyUo?-3P{*bcgd`$J z_QyqTFtUMaK|LqE%TRs>|Ia%_4Eikt;x~V}BioUxNl+e0+SER*STZ*QA0z7%uYqC%(UH9h28%O4)) zoiEkfe&H)bQY^mI9$gdVfYJBpc`o$@mCm2M51qIzrJTogixNn$F#AI$VEo2C@LO_E zEgEH~RKmoV>)4sou_$gjaz}o-pArR8eg>aX#t~?tx0tVD1!4@&ot6YMiJ;e4 z;UQ#!04|;nLd+*AvfeEXF@b^nlW+L$!$}oOlw_3J+<}Gx_Z?kx%Q%)x?YFq$4#rAz z?xP+|yfH7T;&OTasqYj)^Dy^By#u$OX*TUGceH+>w`{Ni^$$uIw+j5GKK^I6-9un* zMfxr26T@=Vg(zzW#n)@TFPUega9Zlb-K*va2Cd@QddPXVc`_y;SoJ6|S~g3*;NJ@s z+Zp^xe7d;8#z;OULX3$e>iO4@`ECrN8GaI7(L5n|uynpeJ$QRfg3*^OfKtWE5-qGN zJhvfaO+G_D=t-&8x5P0K<-w*~YtCo#B9V}8>BL=)Rsi?$t3rrc$iAz>0+B{jigxFP zg84PVC9v{ZUYWIDbGTD`_My7>Fo7xcE%NQ@JJQmv-I!EDLFTS< zM~0X&1$>2}NH;5n`_Lzsxg!ZyZ0&c!(LUf@XhnWzZ)Lf`8M7;JhlQp})$_s{G&mib zw`oJ?&=?$LGMF+U;0&$V4pXMjC-p3L@54Q}1@qpSrVfo`ic5Zg z7Csn{D2Q7OAeF0%IF!aMt8w31sXbUyzNkD1h*HHxRoMT}{bix`eJ@y+!M8{E{<05` zCah54{v5X@Tfvh67gX%z_>5jHzg4D-N!4d|>N0amu`J&)+S~?>NNg!c#Mj13izOU& z6^@=EMl=^!t$d*hQEu1WpwMHuv=@~hO}muB&_|^!%%_$OG!vh?%3^Vcx46>w$JwT8 zF<0Y}W2Hi&@2qKyeS-8_(?cQh@zp{sDM$52qx)j1VQr#-Wh{n7);~vZ-Rhu2gky-J zqg3H?P;BaCQPoGxs?Jj!guQUKv*57J-T;jgw}txR+>}&74NwHwr{Zc-f0cwu=%Hnp zfLXB5yz5Vmi8{)&%(!aaw$oPi2&nnY&#oWC!y{#N9gJ;A*EO70Yj3R-_TJTffr$sh zkR-KQ&QRyqOUF!0GfVM*5+gZapOqgtXr?qsvg``5{jy~!YS1gY3$MBE<$ug0+k0W{ zVbC1ezyM<>u#!3-J!w8AZc<062kN35GxHA9Kih9Bs?>DYIt$pTqnvoUc~MnlEvNmF zIIW;eN`BI=`m0nmwp|hGX>*S4sUcGbAUy3c79)&~;3sL^?G)5s$dnTB-;RY zF4*V9eS@}2JmLsEOx?4pfn+{wi(sjrrp^gV*@nIh=_+s{;CQ@eM42}A%6d=015By9 zWV~W}?BU`ZU@=@4@c<1~fPK!qLPY}n;A+Ej%9>Vt*7_{J;nkX?ef~qmJu%d&5PdPE z(O@})Vp9qc?(%uy2|C@p)@X8y;hhNiaNI|j!D?fXI#`7F0iX|r~kBJ8sN7_xzL5%s8(iQ zXt(t;R0o2N%o@3M^U5h;a*I6QkSFqGDyduNJ+r?&hmQALb+~CrQyk;5&ys;3ieXG# zVEYY!N%g%cl`V=)njO5kd(fO#M4S_^%&=<%j}fB;TrQ8 zbxZq{IB=Z0OS+ap1Mx;>W0bTm`H_Yv+zBZSp0igSur_vEI}*Fe2urxuY;#payE^Sc zmY8UB-VVxfm#xSIR(N*=j~xcl`a9VIJY3!BNWI!e4RqNrFe1E85XU7FhzxA)5kWjY zJ9Il_%mONT5N_*OyjwO(KUSnM+76KBiY<63)ohsE6FfE_5vDYSInOMA(fF-V{>xFc zF0;DWTED8!;V-c)@?|+^&%m}nFqpjZV=ZW|b~NT>=!*ft=VI_K92)=kNm3Z^PLG8R z=#X}`Okc44#UwtiLKQzVu0XR#2jF`pcnjWNH zjO4PKin*tmp5C+w7BuQtJZa?ZL#P%!VVC^t7}A6H9PUFI-InAiFs6>Wd#8Z`HiDV~OIJ zzr8aNt*ioCEyLWPasOjEjrx4Nd6j=L>2> z*XCnWq~l|s2xe3FlMRdILoOLHnD|;$d$74_I>ID$tA`Ip1S{NM0>H_@Ct{%AjbBFaoTHW%8xpwO@5f3?pOkNuEuSp??~x!0I$ zx8+_3(&9LCYXqtvu;}5za@}E4LYQprzWORN<1V8L|85+SFjFl!h+)~eIXOSI*e{f- zv*<-Y@2Z$C_m;4Da*-zUr*PQWX*s?ox}w-nbiZFklpc_(giCl$k-6%mhk{s7d}QSK z5$dk}IH9DSa(Wr(xbJ!~Pt=ZskKYX0Nis%g)+@iTwSQ$XHR&pJrnLOTp>;9lO-edz zm?W{Shq{ku?*J8xb&lK($%KlLNEv?B}PfXWAcg_Hwb& z+r!k)Q*8sJhvmJIh5{mq)}vTR$H;tSkz_JMwCS#34; zm9cNR>bx-q}SQj`3ZVXjR-4o6{mu4egW_$OsGry{aT_ zNHpjkc`#&tDtk&68t=h_<-fIvWy$Kg3ESxc!}HQ)9K#b=zapB4eS{}Q#MzG8*j%#C zG=3-oCS*K4<%r4(&(c~VPs#Gazog>BuLGOiF$1?FYd=<(>LiJl=km$bQ)xp*J+$5! zBUUSd}vm`_`89tWh81`Dq;BQYwf_*MQjIq4i*NErGJcbBLth z4&9+}-E{ELAoZMME+{)M(C^S2hB(FQbvy4qaqP%Q`NtvFwJ&XX4%SfX@V$T(2L0vR zfj?&uGWmJgglCPB^l#S?r{#Sqz)3v3eJI8Jk@~j3t1_utRkagb|HD&ad1hHKwOVzz zHx?bp?B^vZy4O`?d~be(lt36&-i2-Fsn@KE2xgb{@G1@%r`hFSv+Rd52FvTw$JU#q zY)V_I_}jWF^K!Y?T-`u^)RBt#mOcgu9?&VkGFe{K%Eql{gW+Lu2>0%Pb?N^mD>3a5 z>3h|S%=@jcMyOx?0(;9KvF5#6H6Nk4nM<6RqFl9vPXl?@?-wZnoSg1?1+MMcG$!s6 zo6-JAlcrqL3|7rp*kN00dxX4LYvzYYGJ4HhGK+==@SzKU8x6MyC=pS zQ)$+)J@&icJ4`S1gAp6Pt49UG3ix@vl>93YP+uMrX+~|I>WuZh8Ox|X&+Hue$pWrC zBNf|8oKWRprOvR+8X}UYTI$T(8Wg$QSZ)~6S4z+^wu5_*SFKCkz~gS40#??yPg^1& z3;6F*nIn}JYVe3wQo)BYQD`LVXPj;kYW(t^{L*M(VBLi8qDB~%dmhma0&3fY?OqLr zFg?IB9ExD++-aM}=EEB6?c)hneD=RtyZ(-M~mA$X#~u;hU(`VXQu{cpwWz9LY`wMznMBp@rpPbLfqu7~>`LjJ&+{M$+?e@(Ejdj2FvG{SL z`!s_(vfZ&m-*Fd?E`xGrRqc6BLHNcEH^{5q7E=$ zm-lKpZC?N!C5FR^^CQb@EZ?5c0!y>5`%vHuAYQC@+X zj60229Ao&jV_OC`l~pMW!jL!uKAZuvT&gdK_v_U0rhz6G)|1(`<}}?ia*+C#BP%^@N?HKfBWAz8NHs+7U=By7Tm846}bMVO8r>5;C=J>nuVMJy_4WjaNBLBsr(vtQs<;?E^$8nT1PA`Y;gceykvq%p zZ&S7+;nToZf*NR&{;>v;R`= zzEDcptxz|Y>DIC3uUDClf&t}}%A_QEKa##VJVr+{|*R|gd4HMi?^~L$hjaOBT zx+nZXz%+I*g!&GazH2|?Hr6~O!!M7+o>~SxiZ24MC90|Kfx#RH7Ifm$kZ?8LC#zbVA?_=>P4(TvW&n>G)!zW;tQXslFbO%Yi9E(nC8|d+ zZd#XpN_q&#zs%fEIRsI?SA`p@Ys^eVea2VbZJs!_S-uSkLPB^scO}YCM%%Rp_Vaw9#O<>5_jzf?#Tv2koW9!Lf_K2{sbdrfjOL@1D?UMh30H(9HSO49f zO=?70)dOIK@=HWhA*X$Goj#Fi`tR{Q%R4LrZ1@b23<9mg(h6ywf_L0EM0b=v)1DfhiPolLIgE z8Urro?A+HFfCyU)_$~CT70?S`k@7H`|-91DL0Nz5^Mp@a{&_LhT^} zt_b0#X0dEp=&^o$Txu}(Lamm^m@q=>8KM@n=RDez*R-ud6FYy8+q+lZ)~M-O)5T`b zy%apqK$Pq*3DJ|@<%S&&sHxm?EMo%<3Goza;C?0(!K- zw`*vX(!7!KI)3Wc#?e9ZsiNa?ab!bMk2yF~eq7h&t2yoqsbQMM3VFEnS_rqm*JcjG zv;3R^y{Igt(Oy=pZdrY#+EEF0yY}#*_(vK^xrT8oYncgnA2Atr{(D09H1MST_hGyk zTh$~G1UEj$4>2^4{Yy1cK#Mir#Jm78kbe}^UyWrdEZJIF;bD*L3-j=@Pt_hJ#OJ-O zW<~VkbaEUjAz}&O{)RKZqWMMRP6s75<7ROp$EBKg=amxrgjrHtO5l=NN3qt~Uc$ye z=*ygScMjZ@8tpr+hP^dD!#(2JC9BMIQvt)DVD4BuRgX8;Lo3$iQ|Nz)cV9^#JItmc z__Z%PKT&uyDZX8@#;G)+uD&|(BY+n>`pAZmxl!9AX|8X~@=8abvPrgIYZ!#rQ9FaK z0!UyFidg~Z-?jG(ZT%1>m0Y6Mi zbMpd^OThB4R;J4*4e02ukECNEQtuSk7p`lPSg9_zAmBhVCSkrOCEVF?{{z<3<-Ota zl;`HJq@`sFQ&JKXyQ-@*cB;{mdENaa7`&~66YfX=(+(b5*`hvTMszJOOlwZ!`v&bV zDnlN^1gbk#j?64%6(*g|KDs#!T5D{mN-_0>_JVlz=ulyewyM!p%^(8VmuuOy=bV9>6P5AQBOsOw4>P3+vIwTV>rcPipsib= znX2;a*JWo|Y|3r-T0EIi^ddef5&qnJ<2Rvg|hs>YGx_89Y@KJ7Y5Gmt~N94x4%Dvah)I zXCMqc5vLTQhYZTXsNOZF#n?uWFiHxtY$+QEjRbZBX%T$P{(DgX3( zF{_s_pxO+af}957y5SFWv+7KoxFVn5qNZM7V2$A2+Q*HS?-OAMG3ctjNmkV$?U1y| zy|Xnr4tY#*CaF%zLp%b{6*pG^{3Kx{aA$eL5-SKlEz4BIb0innXriO#gdS5!PLrKD&8G$Ai+4V!b>l8%Col8Vc zj)(c~N&Vwe7ha-ot;;$+ggdr{U)#U$WfV}ExKWj*t28id6JGhl(C&kqRF=(vYWsCl znl6Q1wx>C=J61r+Vo*QZFScwWnd=XUo5{Ga?s8g}eSl!X6{*mIaV0OV=wLIQSL%`7 zwMAD^b|vx;3hR_fJ;@L8bZmCka*JUXRBUQ=Sr)^AhK@nLCKbei{PJC-xh(^DMWq0K zh$_CG$c=)3WdSMA=?IqGT5Vdizy7Ns`B#|z8I=;Cysa_vNm&qm{-F^(iYS!>p#&is zr)n+}o_}MgQ+Qg6;7QcU79cf_Zc_fS9%Nh_bur+z&BNgBsxOJr`{?kZ`))O9rP0ux zwS4|n6{k#xPDsR4Uk*|DUt6=Z{coQO(>?at+3wVgdJQh}UxxY58HVL}D@$MZvD}c_ zb9zIpCB%1!IXn&)yGs($raBl?kR;@DuwoL1?ivPDcjmxSN4|n^7%Pc4sTW@)Z*yj# zrZb?h4}x4QU$1m}+-D6u>k2qgjFS%tWxZ%2L#DN?D7W5I^#3~EKKX~URFv&xix47;j1F-gC<#0VS_FR8ch zA;|V&%O6Q+-O4>%BI~PAN+r*R0U+&2u0+Fsfm%KMLvzqc&qZ@vi z!tPz&KCM*k>>4K{k_Dgfecgv`uT#RN@FFCTurJPHiVwB-L+qtOo|so^Oy9k}G|1MS zoKBBp9Fc@K6s)NV-Ce@~&!A!FFV{vB;qn|Z8luJ};85E&qI2rEJ!=K=2<2ZBo883) zVtc;WU^!*2G>}UY3JlL;wjWC37DI1XuUc-mKPdH54q;96zTZ^)D z#Wb)=u)XVNX^XU7wDBZ=UPl^g;dLAiO_ikI9E5p}bM12$ou7x%+Bo2G5v*)_wS)9Q zE7ac_c-6I#C?y5ujA(BC;$!%49q$^VujV;k%(yGF{Vh=M?EN4RfBirP#E%yG6&<9Mp~hx_#BMu zTJ9Q;V;Ro_GYg?C`x&O~NTAH%noWa!s%hFrE~Yo|fXwi!|FKg%MaUzmqe@#R zv7lU)Hp)Gs?>vlWG;Z#tS%WFQLN{N-v|=ZHm9@lDzmPg#8r9o2YGJi{akJ(VsU>Y8*#F5RK?w17-m4{StL2HhXJ?$ zt!qme3pJ!|xwyA7|E=L@P#4ehtP3pd9gEVg**%XU=QXOMd5W^b#!gc_7j}ecO%h}2 z15$=}9c21%f*##0SeoS#YNx^+X}Rx6EI%!A1d087eQLALj2Hp({^$0z8oTN|Ut3dj zcCJ@RM!arfG?(<)2rK{JmZXlldB3t(irqQHOp*F>pWr=Z!5-aq1xrT(yI0ib5p@zd z)&6CG8@5^+ZvHd~R%aqPaUU;0OdjSi&w~(r?)ISC|_qEeAA6t)$ zNod3ZlUn9VwOA-hE$yZ5TshGe?fN72h#~_0JgfE|H0n7hc$U``@VHDm3C^OPFhhEXs4$$t5YkoAjJS7URv4KDZ!#dZizxQ z5`+jb#3UrtT1Bf!J84BB7x5M#gorVOkegNoEhIt71;|YW5=lrRgg24I;Cb75&faJ5 z^X#+c+Gm};*LqH$hd;@iU&cFRkf-EenZdR5kzl^Ci!f9Z|C10pBh&J>6mMr?{n*U%KC)c!Z+{ zphY%!K{1)^u##rJ_ughTqbux_XY1o`{ZjqY`%Sn)9$5Rgic+KxsX1;Yst#;k8xP2{ zsgf9BQY`2l$C_Scq&^-Wc%H0!xcSs(C{!^20 zZS?bb%&W-iXLl`22g1*c@jj5-xpLQp`(?^}SA)Xlo?BQaM*tl8*hHRu&H(16{#9Fp zd*0=y&)uzli6GBG71nBC25kI6Qqhz1qx>KVJ#SUaaTHZ{&U{>~<>Di;y5oEITI-3u z^6g(@-dsfWrQN2kU*v9`^S0I7Md2B9S>T%_4pfb-%d2<7$uMwgwU$3kwnD(;0h8+t zdJ6axEH5e4e$D?lW+#Emi?k_4DCRB&?eNd+XN7WVF{pwVX*}e9*bnQyfhE_1_P`M- zwiQVlk?Ra021^etGfvy!J=K_3D%*gU%j{SE&f{70??!q|+d<(-zwS#a60M3q3GXkd zV$D6Y!nf0U`n^JP49FA&<<710Tj?4j&T*gYaqfm_@v)21LD!!R)R~HN z@l!eIG0y<<6EGWw3cC0J_=8PU7N*&Pd9y5LbTzIF>WO`MJ3I}v5jY1L@k=-tab5q_ z3m=}#Q!$6_)aDbipIG3nm>D^j+SLSC^v8NmZH88cD^1#1S~SJEfKumxA>0q zf0f?uci!DoqT!kRBbcb`lXr@nP}B5%>f%#pTCSi&`3BBLefnS}}lo zy^Zi~lI<~4ZGXti&P6*5kzMRZ6_wK0S3KI zE{>kUH0CLJw(+;eMT>Nf8Wn-C*)@)}SkKS^=mGo^;GZE>9XJROp`D20jA?7WA8fUY zwWoW$LU{|np`Q`;1jK51w>fGETjF?fkba^Q2+fj(Zt66-oxzLToFmEbTCMnp;LK@Yc&(L*RK?w>4H!N z__b`2fuP1!x^%?{>q(Lk=fy1H{d2u0=qeNzSZ|wS}LenJd^A-#~NKCtbgDbm;j*E?GC!7 z!KShYuS}CK=E-8i-{+f+X1?ElINLJsZ!L{IDq9C!?t<^<<9~ULvU%4}uUHLe4AFlS zv3V*-hV_~iEk*9&9VeZ7UA^i;%3RLztmvr|6tb(`jQH)KzeV)#IjRN=iNAVzAH>`j zRrEd~dp;WjHaJhjW^7_bo`@_v>pKt_t_xo13t#bQi!Sg3_|N||tzJmpe)=Z*#Xxwj zB|0Pd;1X`V7VkWg2J9*+urE;GIy{pAapdSc<5`M&A8r}$Mhr)GtMal?t0h21`JG`p zv&P_e9e%v2Xb-cUUc<a&jGCgde>Qt`ULdsBf|$Y(GisN|9gQY|u zU->br{kSj*=#r-}jtnl(hHx#TlU4RsU5_S&Rs3`uo1qi5+a7Z05Vv-%W-mO0TI~F^ zgv;g3Azs@oo|n09O&?mfSf_qDt9wVnt;sU~*Vkw>`QAMF>%l9UF#jG7Zo`#{3!~d* zts=nm^y=~68_79AU4|_SDb!tydGXi95Cq{SYd;*B2BeVr2bvc-%15`CKyvd6;3z`> zdyc)%9WtIf3=*AqQv1*@s!V26+Jx(>YWqsKb)u6kFLu;k>K&$0Q{#Zd12%}he3PMX zBvv&YAM1&)%ZF>+VfPLyON}y`!xHs8D;(+?&&Ce8{${`31FLMHfr8b~iJ5h-z3ta? z3oFO&H*#UKz#%zIeeXx#%Fdbgvq7En7txw4Da*O7=P#I!c3N>^G>G&w!~LjV$|E=wM_;&#l2*>G3A{r zrI<076U0qyWK&wo!9u5~vSC-KPT47$@~m~B+Ky9>gcd=ye-x~Y)8#9h`B;yV{AaXg zxddNlyTw?K>r3v|Pk5fw*z(W3G$3o~SX^AxkgLSws2J4nLDyk%s|) zOy^iWqY;a#p5~8!9za8Q~ zXe54!1vbBU_F|p6=xY;p}5MBUEzE!r^ci6T;FrL?gW3mLeZKVE{OUp`PY# zD+=5(4@p6+o1Z12B5+k`ZiH3aPakpYMz*VRo=9=vC#Mye`@YVxyBOO%^D-`=z#cCj1@BD89`m$;--Z_u#mDyWlOE9{_5Ecsy``W# zP3?Wl2GU~tWuAK;|IL8ZaOIrIhVQ@zMz!R3t`!{6ZCdNzAMsNwsHt-v9yfbt4%T5852q&prHl?Em zO(z_lL+ryYz}I6;L8kKKBx(uVK1`dpQo8uEd%CNg!M*Nc^auQ{G_^?<3r*u|-}2b^ zE2e-pNVaY5VKh{m8|i_3{Eh?o^Qik7WrXMROBU;GBWX{K4mVLuVjV?eD%m8erZezL z`7b5t#H+499ICuD{VW_8q4M7t8Vlp;QE%gedt=(SRj)VtcR}oqw^*$y$0vZ!(IJoS zwrA3Bn!K{ke}j+M-rhMSa*d!#Eoko?)6Rrg2UAvN5B-8$R+a|GCI0(?rTkdwBGN&b z9M_HT?A^ggFQc_Z0Ko6n8s?oD{~qTgx#Y>*k)Uf97~_Qp{DON?{d5P*NvyH&XIom$ z}qQqM%2NI;5P7k;YE@@01*_(K)y$0}0`}d*pE)CwV6Z`Qopp6>Ir*S{6&R z2y7p?GcXAAZ-@Nj+99^WOHq zSuQJso1R)B5X5??r9I|xuJNkhb8I&4e#1ReE5yD&H4O1B&mDu;luEOdcy8CwfbuKHFBZa z+JkbSa|v(B23K{mQW^*i(873-2nDKSS1}GS5^s>zdHSK$0Io|PvnTe04n2>PVth3Y z&bS|n+kWhIC|HkEJFx^4mk3f*zCj;6w@1zF7xzbXE*J5GO~VPhNU*1qnJg5 z8cM?3>)z2jbVJc)^op4f&v?G}^DzK}EM^T0#4c@5gD!t_Tw;2=O*LWMU%Th5K|im& z^HC^g1?25RW{(a?RLdKk!cblMDF@Lp8J2_qr{v^{4&1eAKcDljPLsNZZ}n$|*!8wB z?KVJZ*)aDz*?8qK$viHptS(bjmkZBV`zLH!I+^OD<>L;$V}>G zdeX-*55=I5DJrQQ;VvZH7xcJvb^+kcOHg1BD!|oGN!8%sWA<-`g)TqW)D7QkO2Yw% z;f{tZblm!mGHNoPfYi9Je~3ln1EWQUc=1%>-j1W$dQ&c~%SV8zdlg}vHRq>bo0?Kj;TA8?dnsAqZ51N>zJ@2TxQd0e&5 zfLFd^H3z?7?y|h9t&bbrUKZKy;8%`$-y{ZFw0D7aOa@tYySv9ZDOJIDDw@tS$TDY1 zU8k^jO8d3=Sxy0|1Q?+Nco!`Rw=m%3p-E9bvyk%8`8!fjTV{-DE{hdXx>-Q~NBqd; zC=r~g7enl%p}!^YMKou8m+pcrcRebV>nP);<>3`j5A~!M+;l_pBxT4q#)%7_bSOq^ z4XZWIE7{?C0Ub60{BF$N#qlKjJ`I-TR#<^9KD<{KB|t5T?x7+8CG#uwP&iyLxzSj zj*-Wmra2xpZQpAZh*b>kL5CjI9gmhpm9QSoQrf?-(VcE;2)+bqh`}`EWU6g3*^QFM z5>hO5pE*{;9;O%CmWnLh`tq?vwJ_L(wJ_9N*pnp#tMP6X-sE{JKvL0D9ep#&w*@g% z&$W9zXRqsvYEy4z7^PEv)qK>HkNmj}hIv3$JPTeh%y}ig`AhTnyb&pN-N9bjxs@Dp zhtrZ8uvVd!3$S}*$W#(o&>)8u1n*c5;=FzV3)q{^?`^~;%3?~!n~Be?`w{b0S)oFm zm8_oIY!1BV?lY=H7O=AnK)Tq&~X z-D@;|*zNg2MUa2zqu&q2i#$$}JGd!$+6k$QDG$_Aqd~`OzCl6uD(9q)A*$P{GhWv# z9h`lm+BVfEps(eJq&n`LL)Svp2PtsfgDsAG%6|GQ5UfgPbN?B`5*87FY2kK*Gz*qBq4IsO=KF0n1rZO0r=jLTA z?4UNZZ_fHwUVT=ET@2_xCm0N@Ce^B2;a%w z8*jt`To4OMVBlFdpsoN?@zr(<6)rE8h5Hr%zJ1wCT_K3?4aClPi2I&eQT zSXJx0B46E2ZQ64}+7Gsa zO1@g;F54eV9K@ePY~Gay-`dL18C|}$AuG%d;V||T@gX){#!=bLWSsw#GFNXaJw>8t z?|vXj1slP~>PmKt>O-B*@k6M}nbhUZnF<@{i3j31t2D?ASZ6O9sp2tTQ1%lw zv!zC3ZC0?dl8@kiMDu)fKA+sqQYUK%AXuRYIhEa$_YssfMG;7-@e&AA#TiznKd1yjv8KmN?h03 zh32FlE>m>U)P4vaE)r0KIse*3n0Xrc z^_q9_m!}_oI=D-}c&P{YXYZ>ea3qzc@9&`;JcJ|^nhSOmO@h-6q6+s(WfJ(_bM8Vk zpZ}~{PkA1W`?QpBBj(Zpq2nzyYE1iXqSj>PH+0&t&&i_>30kM!QbcWx@VIbM+trlw zJVLghQ!=glyoBR_OSslA(QT>D{B>8r8&GZm@;kU&*4MJG7K6g1YFYDL+(DOzO9{zn#JjQ{wr8xTTUa-5W}_1dG*g*%9%ImiB~ zxfK+a*Wb}V1O|s$)_YP(WA9@DYrlh`Jv3D&6+RwqrEmWD%zOth82k5C0UMP#eT1~5 zm;2GdHi;4wSEN=CdT!}SvUYAwuQw55HGu+ca1BD9t^Gg|X^i)yE(3_b<;;?JHS?E# z-I}lfmn~sEAwtnRHf5Pg=P4_w^ph-(OzzlU08i}Vz~bE<*E?t1u_MV?=t{{-JnvRz z8#}ZAvZ4e&8~W=mi119oDDZnecN+JHMthk@-#_e0m`!y81#u30b0=JRnoI&E)mV7H z4#piBHXSXwCd>+cle;Wf;AlqteQCm1joJ>#(Sll3*5EEulLFn#VmI50`EE)MD!kTN zoG~Eb7O#ana=KJG%3fD*-Wnd$4$<6v?#>MlZu)f}K!~Qj5`M>llQw>Ry~ptCA594W z+-%`)ZJvC~E)PA?qs>Ch9reQF86UA83A5qC0vd8jq6+MYx%GkzTsF26?j-p9KdWrU zdCK#+6#l$dr|{iPX5N>39oRBkWQC^o4s4@}Y&9OE$h5xv;AYbtr1}zlW_k*MWu;yz z;ZblBY0Sp4su2f3ho2FHRCEwzL*nzNs#H#X&HPP|9gh!E5$!`cQzZ(zwUYipx@kEh zWSoIjMYrhlXliYohFLumYKO$C(d>l#2|cEt>zm+`K}rN?-53*x!8r z<_eJ{&)T?(jqE! zv-60|SqyICnF4MXpPwbO_rwA$k$P@n?HRxKaPM|Ra334;{C)+i(cbFz7#&+eyhlMJ z?#XV+yqEhU6EoPw_NcC?Mi?oXKKj5FU+%_gyJ|0gYYVeO1m`*W{w9mrp!{2!JHm0r z?D4`Bm&$iqVpK;bIfyCG?`3;bSy^y^#-h>=-i~pD_TG0$dJA26)3bQgOE8l)uqHyN z-CReWMK6AiG_9D@z9}36x;Vt(o}2m*PR?T+t&pann$v8NiR?vo$o{vfQy{+1T(TetHiBhQ&6Pc7@2!s5 z?Ow{0#O;15vb~O?HrQT$-TN7hx?$`Zd;W$xVzv;5+yQ8OWEar9fGSn^QCo}!)dB6# z;9W4N$+n%gL*T~-6=8iu{rD1sh`oVYt;x_ESURBSAv&CKU>nm`4UUTbS@W%<+8vb4m#bw1Q<+$o6zugD#lTUZ)^xl`>7r8tD>?n|Zc7tV5A zOT4&mMkgtTp&t6$5y!EiwUeH-&NML7*q+5vk%05**#^4*ZW{9cNHU8}tgl%#H9c>~ zyj@NTI#Fv<6qia7HfB0g03%&;1uvw#g<(WT35 zP6BqiZYIUlG>J#nzmS9n+`1A2auXorO7|q6Sz>MUFOM0{h_&^^sy6_3dlP z-lj4*S6~gJp6s3Y!6H|!4`oOmU0@?Ya@1nxEC@iI&!kJ$7R*`N9)q3;Kg{l zvjND@K##XMp+DG%@jXDhsxf71MN~r;J&=5N)nV74@VqDzJU3;ssf4v~Jc@nL@_0qB zy{8EiN7@tH>ANbM6Jm4(82Ni{mp-$tNHM7sB$v2uU=QYJ%sCxPK(^2ssSsxb4mz*m zJIKqvE2+9n+m2lh_G;)d<38FwbG_H9r{}0A#y{&AMQ`~n5dUL=D6E#g^Vh+v!#&digcryPN(LGkR~ z(@;>G(;1^It(w_e8u!~Jev3um=m*`WT~RYJ5##ytnv+CJNC?O=dCz)+V2QXQub`-x zv~_nQf?smX@TJ zv9$pCVv5sCt?r<)7_}n~JbD8)n27-m)~EtnKst~T+k>wr-X_~Z$kcmAGv4-SG z7td}W+qU?e{ICt~s`v4A7YqUCsuzAy>{QY^M+ks&_l0H<)n9x(JNGwmU>lq1n=_{R z=-GPPe%CF7J1F*&D?T~ESCF4h0b6L-h=?WI84K8RLU{(fX2z?q-)jI_w#W7^`7Cz_! z=XS_xXe%?^BvK?lk$R3v;e};x5#hGOLcd|@ZV%UBWU;XuwD9f1LEH9Uv%`x#Jp8@s+z$1q7 z`MOX$-&_~Yu(Ph^KKFe1%jEl#%OfVcg6$pZeq*u75+FD|xcW$_A#?B{YBnP8V5bX~tZe&Zr>t0D5&|R#3@Gvwx)W4$Nn(WCg zk&ByL_jHEEtZVbv{D2`wt^L@JlF)#H{|FDIj3L0?^FQ^2Fd4*TI&d_bv^j`7jd*b^ zwn_>y{L*1e`-#;0+7Io>X#0qXip!MD*OD;y>3JV$rj@yAmi`pW+_^s4w^6XU+xFWd zy*FX1+I=O;B+?Lbm_ofH&?t5(=!P+I&u2lLh%fKo#=(r)uQom=1HThGEJuCUVv=~j zK6WFbXe1wN#{GMLs88+-jfwk{Vk{b8O>Ww@aB%sC{$Bg+zNGWD1>k0~jNuRyu)gvw za>JbV6ztZ-)dFQg^2$%VRgd@hVi<;kTAK?H@8r=()%4O0s%y%UrVM9 z*X}RU+czpAycl~%Tkiy=LgrfIa@ z+>z*0T$?e!Xc*m^5nEX_GAv9UbbkXMEC?@Z_>OcDQ+r`cUdE_4^@?C$ks4Azo4jcLy(mAtUolzrhx^mm6p951kG#@t$vEdM}@&VgFO`tOH`LMfK(6 zx>x8>*_P-oHqBu@yIsxc7W>V17WX|II$hl>;n!fj+Qra@cJHo`!jgONEkz&bch9b0 zMx097V#nqq;_=dC)nkhKhWw`Abt5>HmxRryq}^9)ec8TzUZy9R@`;%SPZjXdE#fbQ zoTzv5R=ZY2Ef#lNuIX$kvaI+5G3Gx_9@Cbe*HKRbKWa%ePAupF8++{es0^$odTh88 zjrvD|X_w>aMH;YK`5_ms{c1R>Ts^qw0r5Tf+0UW_s_*QXkdX60c2V@YK=yEjs<=cg{!Byk+^j^&elcubf>@{Mw>gh&-bmh50g%6)ZO$# z^HCz>8o=5|+Ygxb1wdSls(ZHT+a|92*Qi>FvxlSs%FzQDStj8j4hem~YpXFKaal#d zXW>OV`{W5%>AgUNr1g&VA~BYwQ`B7-q|T_9tasNvKWrxabRim^lI!_N z?0(ppGDY3{lC^R?9}tEyx!II13=>qjo%R=Y_!g_CjSen8un()*!nm6ZjMjIM_qtc6ugmO|3I~m>F0r-UomJ8uAt4kHW$!J4EQB!u^X`_mcdM~Sa<0F z(-D7w6!XhreUcP#xp)W+MdNL;wf)F)qCnjs?XvuWBltA|{H1O;(1%w5@7Qi+1a+WU z+&FIr3zuqAbBA2$Oj^Va2R*9lQal0{nJG{K%LOUnJn~axz!c30wI5?}<+^5q_H(tD z3kn?5c47tq`W+b9v;j&HQ)els2zxl-K=|pAvT8S2swyOzD9fmK<#BcBV2;SvC1Nuc zx8&F;XGfSdI_Y6o&=sZ%0YGFp#xW?yUBd>npc0ea5@!W5o2%3^xxXv6ax45EtUU`H zv>#3uDSTiZXensn;!6XycWfcg+YR7!6RBFLX(zyYr&L=?&>MVoQmE}1<$YTlpZGjq z_*f9MgOX9CCXyh-96o15V`zr(lq)gMR_R(TJ=hIQgCzhKS?+Zjt*9&5`^2;0h|Vc? zIw7{-;dJ7dqDoscG>$=4NRE3p!oMSE^~py%awkXVL{Qrbv7Zr}<2LjW_On1naVjhU? zCDF+!-s~YoGN^Hk0Pg3zBN=02J<8&}t7@s)P(!qfTq`ncpw0XtFeh0|1bC&2_?K00 zFp1PMYT%*xt43l+-vtx-pmMRz>~=j#%?$rX)70}{SWCY$72a*O9!?Q#DY@TcOl8ka ztv$#V=DDbHTfj`&SnZtPy!t`$bUFr~`SHn9Dll)Ml)-| z4SCKwt$PQW4`Wl#5XIy)&q&T-T8St>a5eWu{wNAD+`X&BsR`9W!wqY!4f>b2&%O);QnufX>)l3_A(9>&*@n0n~bZ zi3;2>Qc%WHS5+>%r5^oQpVqo8wZW?m|74vuHwD;4RNnP|J2wGMej&1L zq52vPI9|J5sLP;b7I<#R3hCrpq{HF4P9HYos@p*(Cq+4@$!qUddM>I}Uwd;T6QdCA z*S5!U|DE1zxh0&mmJaeTI$j~|7Iw#IgeMq{}kAQeqW1C}`|JXKbK;1W$&CiZR< zJ`vyI|KDzHr;7S}LG?@c*QoKF#uV*-qU+_&tI60XZk7PtCeH&AO5sucelfpN?QFL8 z?0h}6gm4qY{TnNVh3NM0@kmnZ_3yx88n3Qp#LT)T&ME-$nLU4Ys1ma|2Z%a&UW2kU zHt{?_z&KfkElT2*dCm&!mn9u45VUn)x@Wb8<@#dB2YMJcFLtLu2H#HL^ne7%uE~&gaIM28ABBr*8Xa4M$b^B1x_l-Gj{26|xm6A~U2ELjLC6-RT|Pji zp0{QYbC`k2#`ctTSe{J z4n2`?YcHdHssur?N~Zm0vTq2QL%QCX4CM-3BRz-80+%}5*#R7gI>U9W1Q5#gkURoW zRf<|;y&pB_J<@>tgIJYg@}Fu10kwaRBB$i0>#s#bTsGDuAcD}aO+`5fpVlRYYx0xq z)s6cyx~z7Fp(A_X40Oghxla3T1yj%iEQNw#+(c4azukz`e`&hdYuB`^daw=*ABJkwz||Op+TPr+XmcNOomCAgb)TbPdR!eQa!9 z$0Z;N>WTkoB2+gm;O^L~>RFCANyQP`O0(*uf3j62iz=!t8m^MrIUU4L;t+?&EBA5?WymR(3Xshc{{d%3a%V&btG#CUK;2m#XOlrrB2hO(GcXzx_- zjX8=IS>PCyQb7k#qyraO((7->Q1gajr%2hJK}I>Sc0GOxZ)9=pXHH#4PaXp1D3lUC z){I>Sa>`0Ohm-8XogJy&=K9p%~XMr4rx9d7$*xhbzhK<>C_L`UH z3L>Mer8&yY)aW#YI7cHVYBQ;ZafGERqDBP zdv1-@lt+Ln_Mjwt5_H($sG)IwuR_pRV?E2o9wQeWRH6^A#fd5(oBR)RBFA`5NuxPOjk3W# znlk5A2~aOs*PEAwcYP{kiUiGcN*jUSd%?8)6Aa(qS`ytz!Yj3}3JaWt$~|nL1YhDm z9#r9C8WTEL3$3-yP-=5$i)nNl$pOI@oE4Rsji+%bc@FL+HeM2cNR9@w^vQ{C zb0c@|e$VLr#?CZ{-mIGq4KTH-iP(Jj;(?W0N{etCu#10EaA}&-&MsV*3oicA%@Vo}n^%43 z2!7Q`WjA0y_$|Eui^Ch^qf+bk?ijrRQ{~z6O}N`VjMTHuHr|ig-4-9XSk&D1k#Z!j z&9Y)8d&3-CWzT@EkFz!a-|PK{qB8`HqO}l2g-C2=lXnYl7th`9g=EZg1U*?{183&;)5e8qc{M|8Z6G|e&RE(phec}-F$qNO0!PKn`jaeC zb~b59)RhK4YgyWj>C^SEC)-^=gm?<+Ik9A(TK6;&B&k%)tR^*;%wI%7|C>XbW_dg$ z!F#?b{7}`i@#E8>!^ux5hV-b+oLpi38Lap~--AtSLGusDB=|Il~Jzzk% zrep3*BswZfxilw`>S;URU~u!^-qTQD6F(~z-t1|T3xQ&lxx#a-7Rh*p#1c8HE<}3z z{SQiLU16LYRs8w-Sg|4Bqn5UfB-`xSA-ak2eM{hYUc2i$zLeG|5E-lf+XLjXd3TG? z6F`(^y6Y4Ds{}r-OC|2neno_lmv2$$t>H>0^YYl%sgILlhhN@%`1(jT>E~nQctv}i zREKpOZk$+E1e^O_qJ+L4;5PCI9c9qH1sO5DgC5<__A?|v=WXhP8M6Lu0zc(gqxCC7Nw2Qw zQp}XLvU*VzQAH@Ny%2pCetgt>dQ>UmMEUFwHxbm}HnKDh%n4VP)Q#FtH4Qm_sAoN5 zP#WqF0Ko5{$^|yvSsrl{e3M7i2VQ^@}x$p^UtQF5N<4FTX30FxWz1 zm6Y6@+B>yE(}mQO$>G{=6f&%ldXkcd{zX-n1XPL13dPG~7*x0tG^ZRLE{szl$CVA*p*;}Gb~^tSNMb;D#C zu*nt5RuZf@8xxl~wCZq~ayU0qb6hs+Qg6JXB6skX3XXSTGYx4wC3D_gV`w<+plgNS zG-yi%VTfes&b;Vy0)<)eIH57iUGW$kq+YrXdtz+t6s~Itr3y{#V_TV?{Jhl%LW|Uw zx@eaxJ#J?_4M5**W#<1dnucNwA z7z(UR!Nj&d2N!v#-PVXs-7q@Z?d@-?tXTY1me(qKh)aB@e zt8tgph4;X%(@Jd#u#Vcksi-A9GYM;4mDneb-_E4Dv<)o%6>z7jb-!{RCrZ}{P=@99 zoR<0$6W!B$vooQGTaKx7lCvY=Z6AIT4wQ7DxulVzx1+Yuz5?5P)=MyNZH|44z?aWT zV`{I_lj2IeC<**BOE%j3;&qV|Q`Cj=2vVn5q|yTd-C1~7U(s?-nBi*iv3E9~`R+e0 z{mahZU;8{O>%9frMo%Sw{@F@l>}WU-{QC>A{mSRx{L>#c?fUSKAML*Kr@!p_Z1uk9RO{!cfj2cpzV(30sVJ0=<(UshaK&HZL7gFj{RF`0y&jW^*|oha)~-j(vfbrj)Gc={`1jr-^Rivg|cTni-Iu*#luVaQ>m1*|v4q{O!Pjy{*M>2!?tZ-yGbu#bGX zTWMtsxut{8W9+6-`;hy_JO1a$gu}5J_!hp{M?OEVS~6>P%iSX1ixeo!x+<{QMZ1LN zXU%#x$}W`qV={~Q?ixSQ(rAqGdR~$j$mo(#nO^FSzlrULg{G_hO@u0>kYd_GLxe+p zdhVdxC+rUABx&@)VF5M&(=Qk8+2)l{p0CtqBg#5tmpb~ zzz(98{zjK$IN{}qwV!XNJ4OWEb&Her-D({2A}H= zNvRnsK&5bZi{ujO1OOt%MH?E{r~#OAnbn?M-MDl+)pg$P2x(#uM`udXxW~2M1}Da| zoDch=hhYp?&u9*>2QZn|@IjiNhtBR9C5U!mVuxSdbA2@mS6YQD@3SE5kUFj>>Fq8I9!o*#WZr%F5TFSPnwtL-qVrL+m{DodGRxK5_MV z?*q%xv8LD{2q%}P-IzOVS|D@?lK1e2F&SyvQMdced6s)_Y65<^r=L2oUuf5nNPH;> z^K&k^AQ%ouM@5^KSZny^b)ksV{$^z>& z<1*mQU8vd=E`}i)W1%m1uZTZ_RTc= zJy<6he!q&i+4a|+Az4=bl%x5zc?)mR1yFMXFe4m1uq}b3YP$vg`{ESWfAZ%39YEn!0!F8Qz3Gl@PIr7;4TvLBkMFt0X!z)Ic7HtohMB;F`xv+pO$a|!h^-KIpk zn>i$#jDM?ARgOZmbeZoLToES_u#7dDpNstU95G2h#5g+o5%-uMh?xwV9$(;}>YxNn zLjA!oS)^`@#Z>Q2!P6<>a2ZH!z9uA`llV6YfpxAZCG%p+SblSM%n&5mTR#D>G zYvdA$lVpB18$+Rx%z@8KY^zAXah#*T2yIMBAoYqj^HQ%P$cZ$`CX+~2$2 zLB?ECyV^vS0&1;wkh%{(Yl0UmJXVfxa7f}YqjFPh-Q3t+dG2Q&kBk?^399#S6Y;@^ zLq>_CI3v~hgLY$(Qg@{0=*%0mN|Y?<8ZAkzF)wyByItD?%p`=Y<{wR&zNx2(WqQj8 zAAGwP8;pK;(6VnQBAhts9(ZH*FvP#eEkMrRo($rYDHh*x`4g&>XZCGJVBCrP*ePG< zOY$J$0o6}CWqx8Tcs2X=klcJw8r$*+C2_kupqcePcxK#;8G_q~^>0(~{ba9fio5Wa z>z<@zRPe(TMXpEX3tozQiKcRW!N+QSiqa7ppsl6H%&wYY(PJ+sZ6HM=WKVAKlcLg%1qQwPpci!}#mN#1(2;mGfUnlj@5YHFO^=3Ow zG3x;`JpMcM*fZ=%XR5#y|H>7(+NdF4SFR3HN{P7K$jAxL}oRND9gf`<~f0sXuT}`aYl> zCy=Ix7H0$~SElKgwql%eg+#Y;huODL_JGQ6Il-KS1m$+yi0>x2s%tO%`AR405yzqnX`|T*j{3G|9i)s@OcLK5%hdy>Zdegay&=S^DZKuuk^HY`ha7EHN z%XGG#dO5A4r-(X{Q^`*}+(!B{ce0EM?$QIxw#R5$TV9l0n85x(W=v5^v8iyjRXF~NXpHgt*!s%I!AilZ_vLpT)d%|=%jCnLjOG4qjA z%k2RUqN6n-3=H{pk+3~|^{r54bMo`~-D>7%!S^^pZp!Ey^-b!vV_C912q`C;}2Dt_vd&i|dgcaLl8T-QZwX-zw=q)umL6(zLOUnlKyDt00jh)KLN zTU&y~8s(CBX^n=~paCKYBau>zcj{tV6cfTl8ZbaW!~h|Q)(c)B;gSRdlA(emBqT#g zMuucC!X9?5x#n7Dt+UTwd!Mt{Z|&3n$;kIT-9KUzE2v`{f$z_}|N&L68n z6T_OGd>GC@S~_2&oN~vcbW5@~38m+iD%dYsePbNEOu;S{jQKz2$L*H4;b`s+<~aK? zxH`dJ^B#17SW@g>m(}@WNAB>uf&{O2Og-}T8s6YiSJob_)$HWGJXem~_jwhh5@&>E z{G`-z&k_pD@7w>hu_r+fV zUmLYPqWG@icU49${0|O?DsDSe#6`Sq6@2(8l9Qc~0JclK_w`1hjPgLlEBw0t>Hyz7 z01N6(je{<;J+Iyywr)Z5c2kAYHYQQykQ2<&nc zJ|mBQ6&zlCL9x^)jm{3wmgNA)#@waZ7yYMJyTh!zi6MKE9fF{+Ot_ zj5V&&Bcf;6W5b+Z7y2ur|1w5*1dgdd5xNiCxmz5+yrp)d{|C+l*MLd6%N$QeUxg1# zgEY$ACki_4DT!sI%&JYJ$-5@S-bN;#=L-G=UpE zn_7mZM|n>+e*^4rKBhR;B97xhDM|)YjrZ@)am*qYa2&ho*;i9t%HmL7tg9x!=qfp5 zFeut^`Gv>x@qSN{;cR>}oL6@OsfGMCHEf|9%H?g2jEJlzOf0%oQ%HI6;9#?k$?1G@ zMIM|m=)Sg(Xk2xliThknsJrM?2FYY5TwR6_Y;wwfDs{E$JY5?!l6IV7O7IyeV&c!F zOfj;9J*R0UIDM-?ES`Y6(joyo$!EI$@laTdE3bt8AYErH!ZWCY>D*i|`CH2oAr*fA z|K_O;yy~B*zAxGLO#wm8{~1u0Vhk4GdPF=z^M_qe`$2KSoEy29IB_foxTfJa-|bX! zm2vh(*;@Yg`IHTx0nP`a9_Pg)7R8Ttt>@=<=0mN(IbZQ$vGl@xis`7|XUrIOrb>>L zz`b}H;n%19ip#$jFPzdJCLX_)9?Z<(&UlYt#k{of?5_r;kTvhIs&^22c~?^pi$0*VzaoAbJA}a zVkBLvE1=55suxJ9r!4O==4{;T#2exX>-blV>2xUHXFN=)!AE1Qjuf~v`$dJ=EmEV$ z)lax%8emigNT$Do)hgvrTT+NX0y%MM91yDBRKMV4g_+{)@FhcE*YuZK39g!1!q2;o z`42O_!{hZB2|YpCWgAiwe^4|kH)51aA3FG4)@L@!K5JH#gh5(ERDUjFAb&mLWDQ*5D6sPe^Ef@@eFJF+n|J)K*}a{1wO_#Ar15#Fd+BoriZ}^Ig15q!z;_`7 ztciJet3BXw>M0=F0c}3DStmp}pESeWwktuViavRxdX#hheU7C`^tBS!|0r;c1Kp*e z4G|_uHPODoAaxHyjk^<%aonK)`7r}aU(sbC{Zb%6KR#yn~@S6fD#&w8=Y*j(&a~u+yKS4M$y zJycXVwj$EMhDIz4@r!hir$=kJ>@n@#RCD2-%}_h}D{(2x)ZB!2W5f7;gpfeC_G?To zG&x@&XfJHja2}{|wd=K#>hDLifroEgYVJP|CE1X>n|UQ6SecB_JqOUS4u~d=swf`# zIE2@hm8EhF+7x{Ze5x1PMd z(?}LK3)Py-N=Z=Ver2++4&F{{_`{_~ElOHUKF5_ch8m}UgGR~N2AbVA%exkY7!uhk z*ws0_^89`OyjX{nFP|{*Kt=I$0N0Lhd6h8jpZbGD#E>5{&7I{{mDm}y6`{wd$ox2D%Vb7fHD$7 zRq`mX=J5)MMqIC{-7sU_;6{x;jsLYQh{u%52uA~+vY%#hGkoX=ZlghRzBRF*^;wn> z6fB2q*OgGr_=YraE9U+Lwdw}7ED2g!bF5>Gfm|jw$q3lzk$Hk$sQ+Qo#)Tb$-+!q zRJd2$BO*=vPZu$b@HZx?{tARCTnhyT6C&@>7@VneKpE488iF=QruXRhXHaT0pro#~ zpc017HmhQ0RrNS6T!M*?{|e}TDxhi9>5aNqAE#A+kotD(9Mca&-1f;2Ows1~6A$=X z!&)2F7ZgFxB5iWCq7wS_n=JkDxI}fR19p*G`p8E~2b7fUkY+dE*&{rSMN^z#Z`^9D ztqy8dlruqh9$AxbpN9+G1Z>dMm3vampE3tIMw|s;ll*z9l=eF?@JAG+ENz}y;}hfqzt#pn{+L| zLi7J3G|+C{;=eoj)&=e>UP|XG!P_Ay$GHR%;8{Z=rD6*~ulPn8icF{omNR{)Q@bYS zk7vc(V+oT*Or@`@&h$I1OgNNc%#3&Jdj(ZDl_dT8lwWcA@5IY0yySA>A=LlUdJOw5 z(w&I82Rz8`!{mm-pFScu6(I5FHGPO8ZwZap(^1;o8nA3OJoA*B!sEE%_WL55Tvp)M z!|j*ytp1+#SNL_;hmq#3MEKn}P+i^qk2lkepGH4ntBT@wKUq$>tVQXjN4>|7;_0-BJki7_A>uK(?|U} zvLjYRz2aYIa|HnpAe+~d2)33oqPtUQf>RIcqtD@V(@{=cZzFA1VSP5&^l`v|BZxf= zKBpK`ZHExW_xXEt+}6pc5MW~a1t%B=FQSDfW91%So^}G^`E#nFRD&YaUKg&}n9(2F zi8D<&F}#9TSUnUN_hgH1Y1#aVDNzQY)8rbeMbIy9tZ4#OsZ-}qP<^#sFmzgQT1Ko3 zbmyR}Sw1utmr?TTZC}jwnhTkWThix_X_d`_YGO}oyz!eEZw^_v3v43$a%n9=V-DXp zW)!>hsO$lhQa|0fAzX;3i}~@C4nx6KvArEAi$pPrh~yymdoIluIOCP`hMQ;e!2V>4 zvA{mO*l|_tZoVQ*vW94YRj(XCCQeg8qWf@b8*l*@={PZa zedv$>BjG1J%GJQ;c;%rdXO$MMw<_Gf_qEXE;=)h0RcHF#W3clL370joi9%L@4DF;z z&iWZuMT(vgs6KLZg4LO{Ro5cES8jzbZB1yqOg6iZmGp&mYx)+MlN@uATtVS*-}xI& z{_Fer9)H$sy(-dIRVpM%* zy{fqI4lF4cc3VvMK4xTh3{p1p+Jf3_({Ml7f){ERs*0KZP8UxmoFcEPvNlkwkUJD< z>?%dLBzvWj#eSHJ?qWF}Y{z!kGA60xU&1F)`65S}lJn%^67_CZX?3h+mWAB4lTu~P zFv$Ole0DpgP-=Zo3HKv))4d(y_>7(VLW-r$z7KsTeK1SfO>@13=T;gpw!5zEBS)k~FFe2UTS0U;rCGWTntzZEy$?Ixz1uYcHtKWdEZ`rb!22!s#;rmk&M33Z zgXqNDXfUxh1nUd#h8l@Okp5#v*T%6^Wz4ym^lxn4=y$_?>#3^?_C+EWMSs zi>^soDX2ABZ%Bo0_*SUG+u9pJ&J8nHg1o|s8$LC!_lu@8Ig6_qL6)SUSTFTm#C!U4 zoqL(oq~KrWLZ$2j#REx@`4lO=8OgAf?q}C&45f|G(`$mBU*Y(lfg_4Kz2@mh+n;9c z5mgjRcBn!r5V(P{682?Qe5#ix?(Ylmflbw zT#_F;J}jb4Y*#_!ozvej84W3?rmTy7Z9$0j;mHBZMq)MCDp_??5H0u(jEgj6r^xdi zjs%{aa=FHUZEbyv1cj14qfYi*vuO=4aj|qrSwM06DAMz? zZs%{Z6(54an@s*g>q5yq^^koQOvbH!+msvWJ(b~?&p ztIz0N{WnUp&{BOT-JbQT+H?-0>{605pt<^^mT$a={nGn)*VQsA<%wJ+6MoPVRbKDL zm4A!nZ%_HR=VxVgFEakw=5y{ev;lPXScJFjTMMTXAvN}gwIH+EH{BlzR%7}nqwks( zJxSFnhSLA_@cBdrAJ;>k={uQ=)n0Fl!&N93c_`e#wrJ&1p80~b>-(d}goOjn;9+5Y z)Gq!)N}0%ZaPm#3$^L}yvJ6k;T`uae9$F7F|(fe8J?bOAX+!;{Gl+krXOgS%|E7hO_4P1;YUqL zl@XWtV-E}riCSKmspJ13yt>sn-j1&Skek_I=$J**Js0u6q~P{tX^~6|!FI`Z+#2LW z<~U5xvEwoW*?~_or|Af3$o0_S_u^DGp?6aB&Q`hwN+R;~BJJa03UCqC0mHvV0YQy7Buz4944)o8E`r`czOFO(%E0`3bjMuxZ>2*X ziXeyfrb6yUY6@c6G}ZxkDYX}~u5mv|u9JJ*^KZ5HgwetY)6CtutW=LZ+2?(@}#0j-C2{H*|9!L-(7fM(?V`DeH^VHwF`D)8X|(EkFG0 zu7pB#^pv(dU|logpu&giWd(PJ)3#AM7PYY^(g5lKkbE8v9Bh*dG)kY8_mV|xNR~;9 z1+#L*O!Tx~YSQ`L!UE{s!OD+T{sz{dJJPcS{+v)?9j3_-m;lGDG#c?ttGYpOIyO@` zp!VlJ*7E=4#GYi*VFAlUw!PE_$eO9-NciQ+K)WwYN>+$r3la>jyAuD+{@*!-$aV9C z*Xvo~|K2YoU<%Y2)FvYRp2yz_FXGunjeL0OCIEeDM(>Z8I$-S}Uq34orKSVfOvkIE zSdNPv$KN{RP(xwbg1v=Iv-p-8##Qa{Q8V+q|Zv=)AlQxoz7Vrz!% z!#KNwwEX9!3JQl;nFy+hSNF)}GI`HRBS^NhEOJse?0NINdXB<&ZXI$$qcB9cg%M3w zRsym`iI}v!;IbiPyR*sjdE`5gAsy^#ZSpff0D4OKm&Z(}(JQ&tI)1mVjZP_Z+TQ&W zKV+-n!vc4RkRhWFBMEynI*Gf62`K>EqSY#>$;`G@F;`n<{n|<%8&+yj>m%V&Uv<~1 zwE#pND3O+mN;iUuVyH}~^8y{xu$cd#YWS5K9-K+;ZuIM$M+u`*D7?BV?& zyUw8Bq&eJ9Qv&fey@LfHnj6TQuFV$~9`Rd&hG;ScTlGI4h^0?y$Hz2Zo~mZZe~Nmi zo-XXR;Khp7NZH_J{$Jc>+Y5c(yM2Y&sg#~_pO`T^7l{%`zp^oID4B(87K2p62U{g zChY)oZfs)z9Ld||O{MNo(_2oxW!6DPT zm%w}Jg&X%ULWS@}sMB)Lkw-?dZ{o=!0x`)Hw;m?Nu!5zb6{R+_k2LRnJpq18Nd$mFLhs(lKpGS7zPeZFna9zjeVG{T9 z2*CtdVJ5|lv=Ds9)uig5NMp_e#4Aol0`D|`EiZPwj0rgJLMwta&iA~=eo(6^Vk4nd z%(7y&Zxh9lQdkuiW7(PD9pG=Rqh#DZK%97sPf7fY(%C;k+S{*`j4gt`8#~y$M&maZ zf%|3)`Zw8YlsZ5dVQ@!(qFEiucNGhaD$=H`jJ6vRdm~hvEPQx!gfy_kEhsAyoKtpC zy6ai7U9r~JyPjOk7r=E9y1qBO^~K#uEHUa!D7B>jMUcmI4@Sb(T*{A*hnWSjJ-fl} z&Aw}IcTgG_!|>{8csZ+3SeB+cSi)M9(+N@C zYUWxxfVqaqIoZn1j#mY(xL~MK3vauW-xoHvz7S9L4+gOpA=j7(`h!fy8@UvBUN&}b zpZ;0G-enPCMg^BLCEZiT*L+v%_YbM~lM~EJ;~ek7eo;+4;B4GNkdr%)kx>1mW`aJ( zou_$RPql} zch>|b@XyVs;Ps1iqU6AEknmO-aZ3`>1Gf+c;U)6e4sv;`Br{Q|g-7`%c~)=f8MsnS5HHar31Gc>W!$#LFF z_kNpKs^IUbrx^*|&qdwwl6 zc6})xV>PA2CGU5wncHEI$J2;7OR-g&l%%P2e;KWsWYYF@uDm=hzSQv5mBaH=fWuLFxW zH)C5i8B!@dyYb;8WC)+^ z+RPo+24L~i?s!G%`*>FZobP)*hjFIs9Tw>#D{%(U5sOXV!~`ub$m2OiQXGNPyngzw z3HI>(q8JUB29F&Mx7(2Sq<#E)>-p9|V)*J2bWQkyV0Uj6gYF$bw$S%~_Ls4;??-HX zl`;a(b}MW?6nOhcJB_9vw?(-7Z@eIo*V{{aV-pqcJ*L;!%Vd2B?iz4kT1l8*P18k= zOSC*#-wER_2tsjJ(otSUacQdn|GCNq2h%I?JJ=$cjD)Rvh+5`RR3LQ!{ZVY{Kmv_+ zKu7xJ{xgR6-_A>3I!}Bs3!9ewH5?xj{8PZk|7p=k#9oLtEBiH*_xks<{Jlir%KK@_ zMP^16)~QRGo7x5KJ2F+Qo4(fjd(&X}&< zg+`l8eRx7|aEbF>^+-E>7oRYESuHf|`$;y%SL7+CD0P|a%8ApG748!yf*Zb-#ikqX zJDi83{K;gxuz?rjIt%|`IbijV;!}kmSTwd3eTHeZ>6&S}bZcAF=Ir={P-Mernw{u{ z`;MLbFQYRi$vJg$3U2cD-4on#$8dqkq9WOZ+sZ2$X9p~tha3@oiRHoj>ctVK(2Ad| z4OrJ#a0B^rXv~zf-P}i-Sd<|Ait;62qN3u{gX!6PD7MQRHM2iDBU;xRm@tT@eEGEJ z7%_|g(Qn{mruJvISB3|$XHSZ0o;tTG8vfq(&s#6_%%?poQt2icqQ^d`7!yD8T@ZV? z)4}vfL1q9?oDMSq7?#UCRYNb*r}5Zj(q*P5D2{w!vdCf)Cj1TUD)Pdw_@fsOu#Coq zS9Ptmr0n>uK@qy5e!*bA^u|7AZNbE8k2!)CJ9XFXrpV8W#=yGS^<&7DUg@dJeB(!Nh=9%yS2!y`-{*Kd3f z7Q1gaOZrl{WG?c)0J-0;o6sv*rtx!U?_a0&B`~w;ZC}ujyY|rxVzotl%ycT*U{Zx`jpq z??@B=a(Wi^cmFk(kYvsETu{wCrA>>iflk>JPbEWJmAMM^8NM}={{B8|viECz@Tmo< zmf3#8#$Q<@?B#IQDVIsb}a1w37;j= zE*Y!aVDKHstU#eZr#|Cq^6#ml*_FKN*(W2+>*_?eZ-uqUpZ(EVRanAV8IKG|T`P5y zrlNJA@W&)2H(3n-r!QfqU}l?SQ`cMjQ|+>or}T<_;NYUpm2JA^EFv_ZwP%%F-_0A( zB1)41?MAjXI1FH_CgZHagwxSe{k1*$2BIK5qG+^XOV`wA>5X7 z<1X?FkR1n|_HYJO9}zsK+>xFAH^^5b1=2lF2U6p}R3f-@ndzEd;I(gNdtc)5_A<8; zd~xdD1D&VF?C=Nv7%((J8)0wi%i&8HecI;ObKFcZPX4ToK#y}pe#cnv)R^FTFt28I zwz)FCFs_nt?!r3H<+z6a2WL<3-oGMVN$=^HGG|Ou*2tuK`~_U%tLwU+TZzu`z)w%R zPB7(fullH1zq0=Z|J1l8Wny^B}@4oInl0^3;9zUk&rRxqp+b6 zO+wV6ua`-=^##!KV$KdWMc}QD5*%)gT@k4W5=zs?W5zb}y#C(-67JjxaK87!csu!j z^O2uuD-^{qf3;PYe}h>LRXiszYvV5K%4;QAni<~yO6Dj^Ug0ONiE(e@*@Z&fiMeKJ zPY!>m4_rK^Wzm=S4jGcF&kJRKyqcP&7wN()pjWXv_}TBG69MEpdTAC1cD?1d9Kki3 ze|@SCRfNRiGy}a(_G4>*ed>P~0fFePn-Hd%frn_mLTpf8LbP!%v2|b}YOT~YQ%fsm zUxKKISkbHNw3@Yemvb7@RTaCuzf$cx9uOE$49jHdVWPDM3Mp9!4xwEPBIlT1JyaSX zeTZO!Z_ijorE9x}QKQNVDS18=dlQJXbL$G_)p-sz(aM;csNgEQ@s{KUfVVHW6SmiD zE`u!1o%8ws2Rt>W8Wcl5D;Zj4{5MEQ#a_j`i>Syjk2r5)O?a2OUV?4GJp|UIG}73XI{#A=a=fc$YMrl< z@%({-{>ng^HSl;p|5_WR!JG~f{0DrtrUsqI>a^|Nc+>FqA>FF2GA*q~6(|#-cyhf0 zYF^;6_Q#Ut6xb(Vf$Nmf14-cE08(nlBz;JSmIM=EUkG0vWOn5>Gf`@HVG~Vu1d}36 zT6om&Mfz*#lSaQ6JEq0|ZU~_W<^js)bBI>|0Cy#+`cXegPhd-sC(8=OY)HWyWw$kKHwxeRFKg7dp|S%LkN&I@dlH)N(82Olk+KX-6;S%W;MhD z;tA(waUxfIKte)U3=0LFL!^MwnZ?v;W3OXpWr-&1E09YB)gCw8G zft(U)U#UQ-Q9|YYp%XRSZzhCvuSh?R?q(JG^98s((lX2GyOyj3!tHz^;u>;ce41n7 zKd+Qpi0{4i6788eg$tCuK4be*H(e}#wzzK>^tAXViszVD5`cY$wqpsfi74$&rONbM8QwG8wFe%sYDkmka@`_mj?_)?)_Z{s{ zCG|x{C_7el=7kRCE7D?MwRkWuiCd#;6BKLM{6X^g#2RD=|4SkK5`x!hGf(v ztb4Hd}xd-b!=*T*D0}kI)u$=x8E0FH&q& zSNzLGxUo7No*@!XMb5}o_{dc8lN;hc21{nmP^W!Ec+LkvECp>Os2$V0LO=oPdwe2t zn0e^YRAE=i4ef}Rln!zK?N@*Ad&mh%z}&LzhyQi4Muc3g|H`vb->{q&I4!(0wa!AE z!JJ15r)ujdW#605&zWhA34H&QP4$d(XVxrl|La|yGP-H5;DbY(!yAgBMYXrIlCcPI z7dMMFb&nwv*@>h;aZo^EP;Z)RX^wyu^%P#ik8luBq9m?T^uOh=pBY00r^*rrR~B;^ zDr$s--=^Z%L;HfwyI2XHB5tFq?J_U1@4-G|99SB=?Y=*c+SN}eH93C+^ou=0&BnwC z*M&{ZiWJ#=m~0s$_aiF^>5Y-{sk^Fyl(Yx2)#DRa2vV+LQSDdQYT1}G$l%C2qIK$~ zG|a`-MZT`8K~tUKm|yC4Nu9!y{N{n;zUk4FiMslUMaInR!F;`n9c;cVDx-VgJT~06 z7KFiRrgEO~V|46um&0sZk0l^JJxuAko;-1XpJ;NaPc+6BxgX8Qb(+i6vY(pzNa8m; zb!8sHb$H;#BFd0+FSgE@!msA?@W4CI`=?7-S?FiF@s+s+w3$sW5hfN+5%rpY|H2FT zlDA;y#M(X9y22~mWv2T5K!Op<SJ%MTe8g`xN5z}HA4caD#p-w!;*lRQ z%y~zjz`StduC7)VJ%COYvvQv2KMa4KX8@VG&u$f1U!TU>pJaAu&;%X_JA!NXsNv5& zZ$dx#mElw@XDy9udu%YQoS-fr;#c=G5&~xD>l!Z9xF0kOVI6^-Ji&^BBJp-w`hazu zQbj8~*f!FLW+&9?x`(DrwtQ?Vr@$!2o{k&l`*X-4x=64Az4kR&&Sb?-r6?o3T1`hA zK;t4xt)ZxYEMqbfSC0&lHFB?Qa{_-=HmI+GLj+`m{6tK`4{0~zlC;g_zNC@P%s6Gb|HvL>(O*N} z(q377tmWANK$e?XcGtASb3HKKzRsZ&J@?vP$J(VQz+&zIu;VI}s8mX(>-y&lKeJ&(TO(0ChknQ<|4G<0gHD1*}o#Efwzi}g9x!Tcg>E!_G;nk}|)}{bPm8gmCaoa3(eW7S{wX0Ke z8HyAfMkckK2mIO6JlG0`mAes>J*665R(%`$Tqy#Lr0o8XVb?J8z?gyV{RlxXXIlY# z!uA<#Dz-m`25p}ah3hQ@1kaWO74fu#W!YoQ2S^CznlOjeJVDOaUlTyk=|lwOc$XT1 zkS!yk8itO`A*!8o+}Zn;F&seA+=&1(dNz<;)MiiPi1&) zBAKV0Ku?e!YT9wPoOBI)hX&!tSEE3*e}O|g=h6Y4Q30-OF0jC_^2sWOWXdyN(}ihk zrTp-=B(qp7(!*wh(5wRsc*u3UfQ`4}>M2}QEp27^unokgOe=1e)0agxSW)$2Bc=@n z=464dnp#*66LewlhTH$GS~|2uKRtEKIwoS7^=hK!1E-Egvk9CwiW7uxw4x77MWhD0 z*B&2i)DJH~0~Lfrkr3{e`|EKzM66TVBW=*PoZ(2=fqdrL$p@}m^scwqf$8;Jo-Q)o zW+`z01qNj@o(A@m!VvOk7|5X0hyxJ7BBTUSv z_|F72MhE0wtI z_1Ka)KC83G{;?rUSS6CO#>ep%I<_#pRY#8P^G*6H|kQ=?;qkZ)fP4nt- z&4T)a86EF;ozF>#aRzTwv%eNY?Y&zfI*pqs53fYX$!+N~$Mu#F-U>l4uY*~`vM~gH zif^?h`fF`yMGp9~NoIZ7y=4v~wq^HU#yVF;NU{jEmZ+;bK6Brt`Fk8yq>RC$zA#I( zc!SM-A~uvV-nv_9RC<^m-Kh?P+lCG%5nco=4munQt^R9-CnGw4%FCZ=?&{1504%^e1#(2dP^1eHUZh z3Mi$_-W8%9=-1yrr=DDFk>)nDQ_|Dxqki;b2w1wMl4{Xp~t< z6?M#oTLqds@6rMLr(R93ad-1-ZOMGjrEmUXovR;bxq4|+1GKJ-YL2TWok_vJ(o%Pu zYHUg!FGD6s(QGK)0@M`#3dw&El8!V#q!Xhz2@ps<1X<)yR5K}a@c|9)#GroydZ7$= z>;L^j{wEWE>LCdZD2s7z#1Q6qu3RwV1^sH3Z2GRO4L6bu5h?s`kNS_I#}T5*N62)A z3r}~EZ6e-|pAg&{G+P(mT(Jjz;bn=177JAI8Zex)&yBQ(mi5buqc>~7!YxDwFFV#~ z9a{N!<;WVgg+PmJ8KHUscUn%qNUdwT6^3gYqRH#rjZbbg$d8>1`A=D?@+=RWbzYQBkEF@SY_FilSZJfhQ zG1I&r7STSZq;@@ck|^YYJHE3Lq*>w9?GI0*-AF6{$y~oH;8?)Vl?kRhaVN0pPY9ZH z|5FHVWX~1qsviVinBd&DXZs5UI+~z&7~(~*R?;HVD+Idm8dCk(#KCHfio1L*l&^0i zikKN4fE^uHPtL}&#aSoFS~^8ECiqsvIgesBU;PrW-)mULuf-IlLoO|tnR<#nC0qyn zywC8*>$ngwo$xQgp#G8=J2aBS%z2VdoM~*KzS4f}$tiOFSjMGC3Kll#0;gBb+1LjWzxfE+lSxcaM_l@lmUEr6Gd&h|oh_ngNonb#w~h$Lr;jh8 z*}s0ERXf?k_`ryyrSKWf^{Fqyy{-I0iF?R0-*isazN5LJS>pHIyDM+g%c6D1*J?6F zx6X!VUi})hz)|iuN^aEr=>K!`!|6*z|FAkf0dcvHaXRVDhU9_d1VD)Q@JzEAN?04p znQ^+u_lR*RS0T6mZT{@8M_V=l7n3tYCIaBLES96$$olB9h{$bAzg{ZWY7S1;)O*-n z%8JBDDeJ%!f^_K+pO2mV1+gmX=SyRBj(qA(Je{_NPe)pX#K7(Y)68ar$X8Y9#d}Z5 zO6r~%RSdj6d{&@#>I3bw+ZS-yV*)37bIltHg|*!A|H}JD+-Ld#wXh=8QxsCWfI2Cj z(F~DwPfbH=?)1;DR=Q}+H*M3-_(u2D_Qwx4P;vc)_>VJ3Scl;9Kqs3D2zNET?|ZGa zX(KOst-Epmmk>VrJrbnOOhFn7lsGMpe4%bX;mJ7Xj%h`Q17kg~?Dw}rU z^G6DE;Ih-aCto6p4w| z)-U9%u84c>yeB=|8}ZpA9qod|j@HS)hgU}I*LX>*d2toNcxCuCk7mvtX>^HV-oe7G zO7(>soDe^`(zjIah_pC0>Xbp+K5y%!y>_73?A*ez? zCB7=ye~v+P#4wmufw7x)#nzy`3Gv1?Y)0r#Eq~TOpGzj6x6QRy%r3PP4-iSlzX@3DCkG;4)?v7@YM$*JX_`tb1f%GS_#k!>s6)UmbM z<+>;i__#LEtFfxpRantR*^)y2aeO=t6=!U5`m>B0UF-p874lL^-@L5u2WK~)gVI*J zYkN{p{UEGeXt6BXs_q8gZss1?DjsJ-7E5p7<4U~i8~YYMnkL-iSQBQur!az&7PwdV zQrGy=IQzsWi#w5J@9@og>o?w^m`}O)2P@L-(8)nnj6#>GMBIN3izugjX5?Kh;vT|p zRYIgPaAV>Fr>D_UcDir728WmClXZJ4papYGk@A};+bz*PLp7He zHS#e*FNt)mz6EYA^q~{eOM>fopvaP_V?K%ID(c(}$el0v~P6^B3!ToUL=b zK7c5GGqq7Sf8Azr$87c~yz{(Q+B!#p5Hn2EX3&3u3qHS1Yrz_6K4>^FDx2<8>Ab}O zP$l-u0xneuUWf6WQi?}>HFUA#5%KsD-RCc+H}M{w3w zGajG_#L&-%=}hIka|#H9XS02^*CDyKY!3?88a}3Lp`i5BAm~2!fP*|F0c9m_uo6L*O?T3f(7aZ^mBr22V+frVIp%P# zvJ8HScNC>Ij6KI(rO#iGT^Hi|b)o_3?+baFbwAJY!MGN_0rrFY(2K{_&Eg z0#&k^*Jo~272GZ&&iq5eT8@oVo2R=gTpL#Xo*S}Z_ZZAp&9mDJRdm2{tAI9&jjhy8 zJw+`8z(^O~oW1?&^bIIzPl1O5dL9hn{_sGiXC0(K%aIm*{MLlfzh`kwgg{2>#%?jA z83GPSP~Ui_VNkV(^VL1N=&vnkZBL@&RWDG0t~FHF`}IdP;nh+_<7`lc_w8A)qdmho z#R5qt16cJQ2Uhdo!gqps>$e9IzkF?#MYK1mx7d}1$2kJVq)UkSL4@A$^4OWpNEGDd5 zI1Jg|^-+v|goHOZ?+a?v4JgJwp}Wu>{1`2AuLFslAMICtUni7BhjN+^YoQF5J;(S3 z_;w=_)Xa-EKSUQ~mHlW(BD5^m=Y>UXhsaKGBc3-=5(g6&@+y$=Sr*pB7rZLD4`?7S z0)UKJ<>{H(-FD-+}!yy7v zmWjV{0$c4$Jr(_2y8(|6KXwdasEs2R)otN|LKItdQ(KTcV;zy$0l{h{L}*GKuK~g* zf;$lA)N?AkV&jatAq#5SxUOzNHxlNaLn&-?kQe(zW!d$&LvumA-_vigz)eJv<~Y!s zW+7@iFcE1NxUNnN9Z2v}DP`yh4X55~)Dp7`Muf`TTv^oSN^$x?8?wE!eCr%L8jKt% zjZcH6^MtfSGGq5#Eq614b4(r9@a=pLc&}>Wnr>}T^^To)o?w!}fe{>g!pBGc!;E4W2p{$K_);B-9fVa3E3dbsE ze6E$)Phz~@gq3z_cz))z zPN98b4qkH|9W0BHh5a-Qq0(+@D{GC^P|{;C4XBzvwTrp-Ec=K@*sioXcn=3!g#@sc z)))q)eWOKM%GMn~X~GGLbSR}nG3o=ZZNyBO1ob2XhJ<3eIlZR|`! z1E*-|RB=&2Nx-##k{BWa_Mt z0k#ZS@hyavkc5<{+gN0?oM#^@wC94HA3sIsI$9hx&T(z1<0-h+4$LeW<&Gl_3kiIO zNGscCZ(13DSNQi4CJLkl{7LmF;xg52pK--)tl{(LbuRX-jGN)B*3_7#I-RzSrVa z!%VG%pIURH^}Y*T{T498rq=Zq8l~eD3SkO`_Z>}ZfS+hOjGpmvc;u1E(7t`dP`6Mk zZK0ILwm%1voV${Lrey}I-B*HTeDG_Xds&;ais1~nV7gN;zCdf^pH7nqzbL<|n;_4!oB4Ev z^M!6uM$osX*(Q{{41(^C-d;i?M*c)})dDWa(f)({;moCElA#^=;=%^kPp7!l`tkTgVG&$4bw3 zpzX?D2($ntJ8N3xbCD#2Hrc5KAaZfQGk|M9kC-PU^InE7KE{ouebxC(BhU-bg#~*j zKZA_$O;#!EKio5}YzlFubY7)dI`+yT84|uWltsgglc+i$wy*GIREPuuAUF|C3vBXt zbvE;porqI4A?dVsxt9?>TgzcPEQ{7m`@#;juH`2>a*-0!*TGIt;+5Hh)>;f_al^zL zE0hgw{3k@Tnl6yrk9;j{LAqP_CNwqJChYJVmPdA*1`p+ z++|Hzn@FP^zE7)U_vqZ3wik=if&siRG|{1>{aM2$ruHKv=vSp)ddr&}WP5_X)(PX0 zP-J+2o2^E)Q+Z|*XUYu5&eQ^MBXI~pmpw=tosO=0)XJ#ErphH&l>z7c(@~4ID4R48 zQKNxp@{m)+m(kKmNiK0V7cq0N^A~a>MAD|!}9nL`#uoY}sHcmfA^0#Gf z($SAi~5>KR2iU9PmP#RF2_Xazew$4~2jz3{}Vk3T{U#=fv ztH}Z;O+o`T>PQJ`{g9}IXd-oRU3-GkOdl4oQV>X7v2h}l@5Taxr#n?sAU*UB?(m5yrpT)l57kC@{>do`5gm@YOtI-RNg(bGUu zj}a`)CE$e#MBIm>bAI;P?U`3ioF8#g!yy-u-Xj#&T8Wqj@TpsI%&BK@#5040$?m53 zKgFK{iX%e2LS_H*-vn-D1AVAF8_Zs)&UWm8m|& zG)YUpbm1G>FDJedTmB$V6YN>`B@g#6`c2`W->!IBcgra^71(tmxV6C88|`FeRtbMG4;8*2sH^h5IaSDsnVJTJ36n!C)(uXfHj#_@L|u$Z;#uZ-ME?1x^)b51IcXo4Cbqv&)egj&DY>zU>(VrxXV~u54ypMn(H~GRs+DwjpwBU5ET>Q}>M( zY4Mau==f$Q z?kxKQi}~CFNybI?hqHY-V6y>V$k9PrEs!ZtzCu>%c@N0a6Ng6EaZu7*%69vs=pCUP zPoc`{$#(>e)rWxi+j}+d+Koz>n4Xrz!y2sTX@v{c^Lp(PgT0+dyUt2S;}IIA$&(<( z#U*3=!E5?BNZ6MW;*71X1%l_a?Ga=Gy(H&q@vth9307gxydPWRS&>pQywN%>ATUDJ zVmd@$8ME?5K@oUR3$=R z|EsnZvw9_ap%62MEoj6H2NnaA5$l(q73=otbL{Q1Sf-7yNp!dFy44Dxl&OI72e5hD z9%iUz3Ig;Jt?d7b>DtuB&0!%xIEEc`qi&y}&Bkiqae{TZ4JUrk@Cs)wE#poGaMCx{p9gVE-|gyibG zLd#YbZlDIECUEP1C9?2tXc=CYr7xnh&F+@zn&P(j>z-^EFX<&ybg;~82q8VeWSOtU ze?dh05xk`MX0Fl=S_%K`ARDeNN2lDWR`MO3`=$FN~uty9kNja&CY%0Z{i7h z05gS}rSfZ83Afo>kU`ELyMux)xO9{Il=KmLSqJ&;`4WyXGzfwQTmD zuc@YxbNE10|GL_4_JuJ5lZ4`a!*7xEISMg}EED}_xKckE6>!{+d(d+~QK)?ti zF*JFrYuZCueG@_IbrWK$HEXp|Bg|s|O2)qsD~b(NG1Dn^YRmzSd}oK2Y1ccTE#w)A z<45gU!~&R{VARr<-;XS`no)#1W$`y4QPU6bwgH0r#jFRPNQbNvg=fR2+!;y4b7OdA zzT$ep5VSd+Y5R0*rA)--Q1;nO4T>K`KZxk-QKmawQ+?>Y>J??3SKS#czMK|MPx*_n zma^~&eAe^)23VE5RD z2|nHL-bW&Db08DMk>0B9iV}tbxv+5kAft@3T#MMK^D&DfHQFRgx`f&kam;d??M76x zZ>`+U^b8I>2@;C-Jf?(VzC3a-T$6?Za?}6gr%UK3Vvw%@agUU(VG$UJt zbc>xFP!ew@z%ig@I-eo3Y}HOXxQ%0NaTHZ9MJCA&3C^AtUx!(4skvFs}r_NE>4Ncu>I z&*ez9GTjI(WS@q57I#CRg#*TziaPhYYR|V>-)J?c^5Vbn&*kvdyOJ$c^ern*A|O#I zwr!=yDL=KzJ8VcoBjUMVP%H6et1=l$1?s$H&}1q6xy2PEW66#&_2*xi2ESAPM)RAF z;J3n#>{Rc!$4dmRLiB;1$|dBSZz60Ibl*kAO)AT8%Jzl+Od*w5Wq_6)Y zO;6G%G~!K1d`COXqOI547#&n>RUwCqNqfi zZ+gb$6aW!xAG=ZFGt|)a;mflC&GakBWVlm2`xzSEZ8x{zfkC! zfoT0z^jz8vU~~Yd6NaCE6PO`p7hT9C=tg7Z7T_jU9t0DJ0@XzV?U3^XuaGmSKO$yg zZ^{ePuv0`1{VWpDW??H(k9>je(k_p#lP`$!PWq@I&}=T#=x&*M;bk25QZZNbj$-AW zHm+ce29jePQWHY zX56RPLxSPeM&cdZ{XHPW4FUWRxhY0QwV8*2S-UX;h_D+aX9d2LVT9yieXQPS`@y8H zn6ku5*WuCnzewL>{(MW*Vp#3+TE*M_>AJZtgggjsQpv5vn zj6hgkR(g_9!YO#|hBVKLoep z?+w^7cpcoT6sWGfzW7bYPmRC!0;+Gpjs<;RD0FAtvPi;BrQI1^^u(aNa=> zY)@&aAM3PqFW?I~Ge(S6@g_&-}n zd$OE00m-!IplbN+OysAC-KH~h-}ARUttLOcG#RhFom|7!oW|{xcc)%&c1rn3R#)o4 z55P?w3EDnM&jF^~{>DD0Pv5GrR#t@7rUzSdtmY1_mOS%ROObF>2(tw8%nLv!P$toC z)(sjK_tDre=bQz$xao!To5ASHb)Gs~2wAyU5aWoM2R^y+?Qi-g%|N6;RYD(r!waTC zrR_G{Arf_`2!#tbbJo~ZHU?^LC@MKk=xIl`M$~<)ICDqpq1=5ET!!x8i>Sn#jNk({ z;60euD?0skk!LzH@Yccr7j9|fbZ0%=l}|DeLwqw&*R}-47dk4VHihlN-XG8vU^g^^ z`j|1wc;K*yRNl3#I!Xf-@!Njf3u1>-o@Jdv(+DH7Snkw~-8?ItUL3Sd66w*j$9bf7 z1q1LYPvN>--xG*A$H0a()CHCcv3*WRH)%q1|QJIMh1ALjEACKE=alC{5`5_Fkt}e&1f{?2%(_ zY-goYt6j;nT9RmsV-`8rC|I;4@m`Q;$*p#!W7zqk6a4#JlvTCoH0qzk^qIQ_t!4RV z20C?LVYZ@2BuZ+trNkFs^$h6WR((*|XA0S)edhdu{(8bm_s|h(O48Tn8w>AhqO`+a zPgTN3G;I5k?x?=q+oz9ON?x^+0j{TQUj9YUv;S@lW=&*2D)QP2Ul;TZ@Y(`9NHhG= zmP#i`e<A8Pd!QxkmOfl~|JL0IrB@9E0KwWw5L}XlGDdm$LST?$r6E<2Y^hav zk>fFyP+*eMDa{i5wm?_BwtN@%dU{JrT7PTz8lvE4mxsS75OL}i>RI$KA=t=0CUuAi zy_cpSlwtyjjq^t=9Dzcm_4q1eENH6b8Kgf!zOKxriJcE50b$}P!U}&~Rke6wZ^A3g zv!^nk!0KJKnJJ46{!}pCK4uu@&=;Q2Muw*gfN@D{2s?QB{PQTAqJLeLG%?EKtge2y zoK=+qAoTH(5w8%>Lhnxkk1UN=zgX?;(;{qWI}2#}umDXW(pRrq;JiwNaceU)BE4x9rVLvxVxnc-`dL?n3_=tedIJIn1yYvdI(sXMC`7k}B6l_aPlZ zelU*VsTv$|u_m5%H;w?fXFIe><3QH3(BDe^EFT(wFO4)%20*p7HCTYsuSacmx~1I- zmDZ7leSWThm!eGM6dROD<)VisrWcR-FBhoG)5AB&?gypWm z3BOb?-u8cmt#(2W)TVv+i%@MY#T+U^$C4VELn+6vDh~*)oofkuTcF26KyJ-f1*1 zcdEf0`(mLJoebdK^o>?>o%>qA3(uTSv=Y0(A!q?FCh{!iOG@;-SnMq1AV4i?2h?-@ z$$hPDQlZa1-+O<^r5-$B{4;)U?;*%vukU?t$&sylX5Twm;B{!{AE$2?_r00_;n%Bf z?f%o=-@h@`()}0w(Fb~E-*e56P>cx-15N8Ej zCDjiuQk9v!u6jOpp>_=}~k zFMDHKcoF^l5>r<@f^S&tij%l?%>~uO>N9obWUIrpUodEYU(lnopW>8NNI35+O$+C; zfO6L?tnSUgm1jr^9T|$2R1M3p#J?t|u|u*EQ?)+M^P(Tn?-Rch8Y^CFaBLSC)|N;6 zuIe!~7I2iUqr7RG#1DqF6b1RREtRJDRFvgPg+%Ex2NYEr`dZN!z)_E2BZZ1Z@dd2Z zU=8esL%|0J@t?2F;-r4N=9uFAUkr~&5w=s9UVN+!tjr|Eved7~W>UrVmLQxhfat{E zRZf$xC{I`%ji>{BHR_7Nnze&#yMg0EEU!`Aw)2`|f((M5np{_Ug2)I6#B$-^az3I) zTw5-Cr?>Mt(f*_ni+4*C*C-f!~h1GsXm!ntH7@sAKuP zS(~qAVt05qsZs-6wO-Jzj!AkTBo>ff4Jt5TV%=^{%JseR`E_{SwUn1Ek|2SQa*%J z)bpLz9p1#v+Xk~|kBj}(E%;0R9~(Nt6n#tTh4*@->l$fc8{&^{bmy09FK-Kz2Tnx| zrX*+$b@l=MSgJECQ-P5;v>Rwy<8u>*PQ4oZIgWfTYvNsSYx`UPSvJ>zwpS-SdvXV# zaT)Y*z%|wnwhDRJU_dzC#{Dj^Nc7_EN8%iQf*{;{-t*qkwfJjoV|_bqm;7(8Xny&; zV%Ysuwn+v2S0xo6m#L}W1ES@euAR;hoLSk#YOARjs{99C#Mwi9>vzY&SM{_*-n$l& z)>@uzUY_vjrqho)AS{o8rRqpmNMon~{JM;R5k%N_bz@9^ae?W!KajfLQ}-ocXtMPN z$S4dujazqdHS%J3c|@IT1Td)g#|IY1MBy!u7&-m1>F$rQ=K{svmiL6mVFd9AI1o;! zZ5gZ|4V{554NpcvZASM}!LY7$A8&j|Z^kFRBf<+NakG1%*Xm-vvXLRRN_*<1BuyDw7&PvMN2NRnnkc<6u*APzEYXQzu-zfM@tejmT zN1#2O7Xy62_60Pj{Y4KqEpwQ;kVv0-xxOv~^=kif?IW7-1oG58gVeRZI|<#PUv-?5 zsnrZZkHax+jE}v*Wy|=RTM~}Ai6ch?rz(y|1=84o>gE#D+xTAol1%r5|8mMWuW)b( zJy#8^$;GTnaD7!1;%pRo8=`c2NV{>~Bb&i{EJyQoK`n&e-7hq`L%jZ9Y!l>Kd4Cfnx)rPB zx9P9w@e)FDC=ZyX5GUP{x6A#)x}~KOU0IjsvHWelTl;+N18m9s$Fg^_+MH4Dk3Cr= zR_0}VDdm#Z40c{izd zI|2<<@PWMb^WEeVzOmluMKA4B(8`bd6(w5IF4&jdqd#l*IyRFbu{6MDfA zQD_oSBZKx+WyWEtBI}i)1-@P`jY;{exW{WzY+_kz`mz-$+2O4qTT4U`j zlVs`0>Qi=)s{~jA!4L#_j%zjXuRr)g4=8IgusL<6|~WB|r0PR-B;K zmfmoLIW?`1I)$r|!m~aJPntmCqv?{UWBGFHBU(goQV?)2KkF&p=vA3h7Hz#5+8|>7 zO>tM!EL0*MGLBi%K69rhwar%Y*M!58v$EA)__)FUl>S!p+X;ue#zeDyBWuSp&OXFo zN?zm%6TBYMvgWF13!Zm_$)_y^G2dvmr9OY*_x`rBh0=E~$VZHkwC#vu+W8lmRY-9D zwh7F!9p+Dp?O{Y&5G^ykzIY1LD_iXnYmOBdUJ7bKd61qA{q;m%?DoPnm<#D#hc|If z`~m-n{))zHBwoABk8^!m-I<(d?bhWOuv-vCM66a z(h(K3+=Wa}eKCAZ;!OJ$PX7r+2rWQ>p+;*yu&!p|x*n9+hYaoWEVWB4|6>{S2+g>b2^$H9bJma&I*~+V$Z+vX^ z*7i)eL37OanV^K@x3o*sO;tXkMT1viug%JKj*`01c>42S(`MPjtrIo-Dk^0k3?m!6 zxsD}94#Fq^uJ!;PAyXZYH9I$fv_DU6a~w5JI?WhwrgM(R&FWoA>bsNkfJmGlUOND6 zs^9dKxpIayee2n`S+Mnl8$BcjJeev8Vh`;z`o-z<&Tp~RD>G*?64$PZ6YaSEX8D$i zJ^6k+p*&RBZ`K!$tc}C(9F*h$YAuw4l*(fyYPao9;qJ9T%;UaihYLl@K0_&HCGgJc z(onW+jzgG(d>tC=gA!Jr#eKvK{nk*G^5IFPS}@?19Q`uLw;G2mckT7MsbZt)061|A7j!R+3jdAK$8{$)Odmm=0b$XZl)` zQ_ybujV!jQbU|!_*VJdz7jM0?9-Qz1V3Vfy|4=3WnMfGZCiQc^6~tXJk9Rojda|3o z77T0U_82k(W>WEK5Hihk9Zj2P#f$6LHG)`W;Wev@!t=Q4evr7=xEk5e%^=Ywodc%5e06wtYCpU;KCbClRGfbd z1@eRoD)L+E2R@vzKQLhMSU_ZJfx45S+yV>p8^i=X@niumKWLxC3&O;B^z5{4rk9Go zODPqdOH;gWgYW0B>dpGRX3O;0{#@zl$-r6=i`s3B>Dy16eV@>)YWbPnc50fptG1I7 z7qYSIM2L&Hv`Ayy42j)rSl`t3HR3GkIS>e%q{tT#z5l@r_hSeP()8(qPx8(0=Ft2qoK2(|*v5=GC zIDb~e79ZA{I)25>LQ4CF5?tV%~~_-ximgO}hIisX5g{k`pe7#n;8%6=Zx;0d7yXxUezgcIe_$Yg0_p z&o)4%V<<3-ah|AhTrEnuTcj>rmwE;R^VJ_yNPo-SaRWb=C*;yD%4eqnl7jO`P}MGP4jjMpsk0uV)D33b}RH7})p zY1b3^WegYl7z-3u`QejR{uAlCDI5Z~+4s~g^Zre2h#{IzGachJv+ZHkdlMBy;eO4k z<>QwjFNb+*=s$;>PuayVs-@3$-Evz8*CyB{77zw_!Dm)sd!4DUa99YUC!5QB@Iuu0r)6GM`$O zLfSm4qrAx4q>gDkWeN(*0L?JiIbg9{UGsKda&YLhWVYYza7!$0~EI*Y+U?j`M1R|bz|RoQuqHVGU;bX$(a(%V*VtWC@R0! zLhcUrZIRiqJ^3p+sS7i5$DJPLVk{Yx`N)f?OFiKn#sl8<^Rd-1cGD@k)}v9xs@ycf zf3ogv0ryITd6P$pKxPeBAI6~8_Ob=n+E$n1`br)VmR9v}tFcQ6{QWgm-wWF?lxESfktD+w0_J98G@@JXN7H<|KHqN*l+jF{xl`a-QN?l%>4;=2{-f=Mu zMUU&g{QFJ1@XADYBh)8+@b-#d1-{Gsju*Ge{Zq_+uYWK$P0x#6rz3c^-q*)5O9%2lV;i6 zw1pSWIYb0WkxY`N+U&f#v8?HYVvv);43o{Hfm1Z;uadsSRdL5~Y;3`-#=pnE&aW3?&p>)n`^ z%98}om4-;=Se};x8#-!#eHmT9C;mNy>Vu}C342}(t0`4rc|vkibn2v8JDNk!1S0b6cB_aP^hU#y+j2-shBA;l=~5qy*NBh9 z!n}CKeR>pHXqYX!ZScDwYO?p-P*c87*Y(%)Uj?5V?)dxgQ;LV*ddwB?ReF9K4jxt& zJH+0$wA%4V_}kFC-AM<;*=c*@8$gZ!f?tiRkaJjzKO$_jVjNj7kI=#Gj#+qiH)`Qf z&qmUqJ_mX2DPV_LjDvza!5a$0I5p$t>^@>m5g+yz3*I2|wbz83)luCoS?{IqFO-%sT-8^E z$H6CU#k(ZX4cf6Av6NQ<`Q!T%qAJFHSgSApmtWm(Y{%g;%@jnvx0hE>elZsh;mj_| zmCcV)&+{6wIR$C27&{Nu+rF8Uv5-E6?Q`>0yp#8*Aj8x{#M7Wdu$)ksZwZ(LP^t+;b4lhhn! z*@s|_q4fa{Q!xYG832a18&VT=AwLU5yPgm73*xjn7Su0~-h`C&ozo;x&gzbq{M)5| zF}=JYD`A)dS{#_)kAizyN8HfO6%4dn&La0$OWJ0mRLWW^U?zu2J@;%53X8h2`C#%naYW#gB79ej2O(~Q+D*h6KTiU_+Bx}_&9YTJYm{{jwQ4_CO3R)L9}>LG>N0T)ZB|_O$2kW7 zR3vD4UxUy1WiIwTllOS5;8^v$P0}Oik(|6V`CZKYgh*Q81O2L1$$2O8v0>p7Q)xDT zbi>Xf&T<=&rX3YzB!s=08KP{g$ zgYfg=04y9+1olFkrwylH|%~( zrr~^bf)41L!xocncyP6JBj)(u1yBvRn51REL*R|m-Zlk1_fVy8yy30d+r-DKVDoDx zJ8tX4g7M$7o0VU@(n4N9S3?(s!C-&MlSvlGPTcef|<0FJgRnzRQHTmT(1l2y<k>4jKOQM4!EzN@4>fY}gEon_%i# zb^JhAL*=YyiPlTe;I%Qq*!RIh)*f-VA6>K!KKMqfW@9`Ck`SoOt0*GIZDSJ$g4+r> z2_GxmCu(wpiYvkkkaR3()CHkthk)~TijR8})(AX-#GwzNp<%Z?>XRVCamv3CV~zq_ z4+TgKE^6d9za9`-gz?cYRyqe$^+0|y7Cf8$Q&NlF?%3yeI(L(72+;lD@3lUOoOY~_ z5i&Zzf5Survx+jwn6B_k4K|k!Ys`D0(}CvNCneC!EuM$V_Z@aq4E33kK#L501ab4y z@S=LnsUX4*+oe{`lc#Hl*f(c2-=~Rt zeNX@#BjMhp`F)*XejJz(*EG_FS+l;Fcw$N~jjXNEC}}ClIhj?{ftZPPiH&~cQurya z=x&*R?QGvU6TD~se55UB`0_~9OYbe+Nwqk_a|}_^U^w(Hj)s?KV9r?1=bb=~n}0Ab z#|{@=^|vbi_;Pq$BR-;*%+`oxu#@t8qHSCeICb|gW?XlT(5vQQ#ZEoXy$X6#{A#&) zpp4^ZIUSuE${~I%tCr!PM~{aFi{FLync#Sxq3il9>#i#VN;i+qhP?1T=Y0^B?oLv4@g_AG7Ix*9`e5h$wK1GQiAN zAMj`{%M+l${;JnUZ5#f#Q8L5=bj`tw54B$x8Jd)Hkx6i4@dG|=!J#Gly^5Q}} zk({0>1<&X9xWOHg=s>i&fd*NxujLQjS+D_`F}>3rT08`02BZzee+(xOg;gt08^e=j zQd0ayOkum{d&TyTX$E$oKhYtq2NFCD0TY=}S8b05FC6I3630S24W$-G+r>&MY2-3w zg-P*sJ3BBIBL9grjufkJmkE#3pUi7ahi;+jIEZ8abCgL!hLhdmu>F3weVFr(z%vuJ zS#=Ywz>+NWcLlUS^RQ{Bc_{*1vI;c%@y|Q>xbxKx5NPrYumcv5B)gWg=@u;|2I=vC z--nwWuf?b(Kcd*Sr5(XVCYEGRKI|WjOz*C5=8(A+GqY~J=-Ak=zzNpH>R2EzlqV}9 zJq&cUW))q?DS8!A(@kse?jucw3z{75TLO&Crv5V(Z#}h35hg4zdX|tcC&a-FT4k60 z{iS~s=J@J4{E?iR566ME`-UmG;B~FL#q*Es?=-fKBA2CLFH2nbS9+HV94m?UuSp@c zMOAPuq9KaVk$cT%0}pwd1+vRZ?Yc%^^IH8I!SjoLYt!5V(^FF$T72YxA`Bt>ms?^K zjL#4oOsAAt{d$LvpVONry9#-%u15|?pe!tg>IgvyzK0*D6)Z`QAGzD57Ogxj)|l!* z#>@d%%w9pyx`Vu{*#*y#4PBn*qAX%ZMH5T?jj)np*vYf8q2P}tnW2jJnBDNbXnilA zl4*^!2ko(5CI&7Ysyk3uj3>;r+_J;EE4mzStf15cj~{h$m|R_U25lW5xX1 zm4|8Rd{?_pugiKIrHn4kZuhjkPvrPPaf<0=lVRQTF7x!Nn993}@$D#LM_eBYWZOaW zBA&TsZ0}uSiiAw9vcI38If{59S=k#7WurbPjzGXhHjiyskEP&FxX*f9gn8sxT&(ZzJRX%6$iFD)uvER8g8n4~y$}2*|`+(=V z72{fMl5^^N5(04 zDFXFR*G-s)yr$KZ;Z{E+nNCxF4sJkp{|@S(cx2q9a@&?*#t*q#gQl}tx0NT{tK?62 zc29YQ$AWBox!f53$gt@X)gXW2y4)_MfJ)Wv8v%=mrQK%Y;*|U#dku-Yf%q8i;i3^X z9>|x_eTNvs0M^));WmhWg<1@`PTJ_|af^1mZ%A_D-xZGc&CqL7mp`2Lj3_Poo6PyQ zc%s7lYXHJZTsqk8Jkc5C8JBZ6(VBrU{vs_R)p&jg0y<>TS7|ec-F{*_i?jZf4pQK5 zz2SuWve|P}F9T1ig%7B&Y{?yK$ski+?eW@L{ZcND02zAVncXpA7wTAGk!V1{evLD=yS#p1E&;7oRcKB3eQP`+| zjL#_qA$}AomsMXC@8mbF7%S2Za~e<=o7|ffRr>ktvx)4=O;c^)-o}w?FR_Ugv9(&; zR=Q#=|3pOztXG}Q^}o~q%Zjao{?DUXS$gbvs=Rk~6AO_(|+p}<;z_*~LV z7`aeu>)21H;EzQk=${ph)Rv#>kcM?#8t(k3F_TMl>L`=ZPMaJ}(x`bcuX5ne=8VWi zvKX-g6^UBhNbZ?y^L5;vj3rqlKECr81J)UT%sYgDZ0K!#p5#6LP;(RoHrDKAXxD5m zZlnP*r^;l#@C)^O$_O{zUW*15?)xypH4-btE$(bYb!gT3= zH(l4q!M&ae(@uHW!;#u0*uA#lBcmj%Ik=|LJ+-#!IrXeSch&R>BdyMV53w73J7E-- zxKm<}xho2W)z{KQH}@t=`hH<%%bc2&Zfkv!y(Zz038MFZqm{iLpo1}aL!;tP1mEha zX*Nx7O?C}L1+CRXFLY-&`Nst%q@rGFsPh*M9kb;e3YvETv>iyujyMx=E#;VbGZSPL zzb}qk27bNXVYs}O+iLguJF^vT;tPah%XqT;lFGuMK+oGXmtGWU+lKcKmEGcwg9cy% z84c5P4LB4tGYN0?ry;KU;QE7!{3}06B052`t5D#N>I&GZ%g4FiI)vfChA^=F0CD=V zl6@lr>Ig#qm?HZ^YZrk+Pv*5HKsSIiVt0>B zhlHZHeUe7`L-HoAP_VVI&}n`x-_+cM1! zAKNZV`g9BTPy)AUc%#Mj)PREGt6!{54kt~~<&BHIxGdA05h@EL&CTQ@UbOfyot^Ub ztO>ofsOJ{bF||t&wC{@F2g=Ks6ViXR-M>EWanh2s4En@zET7o;sKh?_t3tHFEeiYo zKL5TwE@9*F!-o>ys*7IcKfEj2oTJkYB*SJ}@33)ox&$#WB=u*pG#{gOhgr>08)A95 zV%|M2YyCe8xifp~;&ReS(bb|yf&%_(DZ+NY@_;N%5(nRMt(9>AhHyRFZk8nJ1RQaN z9v-j;N~l|lbHyF(97rbK5@#iJcPDDVbu>9X9x_V4nH!3po?j$2|<5&Fd5b85x zi2QEvw-LM+auxpB#wPPt@o{pgsCQ1|WB-&a)B)~dz;17@Iz2k*q5yKtTX~_r_e7$q z9@y9|S0^eAt?#(kA_x?bA&J&jYEiKI zR_34th!QaZLddMrif%zvwhRJ^Gg5{CVGuHjU;qONDkMxvR3HHo5+EcY34!y~c6WC_ z&-vk;^Ld{4dH4AT)_1Mzx>mB*y6^kCX-z%9iH7_P_069Jk#j4pqb1I|0cW`OS$_Qp z>f~xH`DRL~mq1<9z*KxWp*srh8=JJ2OW2N{q2Ngc?yis?w1KZ3km2qHGPQc`K#v^P zHO@q>uQJcySx%xx)#NEWvV*QIYwfkNly^n4;LfMmyS6I^od8eV%f9fArk-^uZ2zD{ z`>D=U3OcRH&c_c!m~s}O?;}>raR2y$Q=kE zoe1W=c6Bg#maz*vy-@W)H&9-Lp_O+jH>>BjD34%@B(WH*aC?uk#PQd2yz++}T{oF( zYnnIpRQu5_#ZD8oz8Ee`m)kj^RWc}G-)kgs-^~yy=TqQkbxs~G6~T58pqkT^aLz>Wj1GxIn0ff4(IT-k3pu;Lgo-NnJ{k(1AEU;H}aI-sUui2g-oJ)vDx!F)yRjsjpKtnfxvVWkU9G~qIx+vh<}nmd>U z-L*u8#1-1L7(8H^)y$`4$1UbTS8sj6di_ptKP{Hc@m3y@h0sQvyRrKzm;9rm6by=~ z^u(z_@F4jP@RQ_i4yCPTK@FRSps=~xV zj42!FsmiXF^cjJWN+PG)_F;C($SW-6lPqZGK0PXwju8MqMIt9}>)GN9Qba!_&Zwf1 z<3k4YE%lJcL7A}vvdF1bm9e8V7N$Q&Lb%TA27{S8`P;oX1#mHiGp$u#g&6KnWKpWr zQNGE{C>ML7A}7`EImaIAsz@uXzYLryiUBlM1D<*fe2!cIPFarS7-t9nSiWe*8B zNaz``O>ywk2X<(y8z!{)yL1_6pu!6be&Guz=#Bl6$GQDP^VV5Lz4kwoxExQ2rR0zP zzaY_7K!Hguo(oN;+rh|RN9HeF`2+Oy5(Lr=@wWkgU2Rxz zX-Y#h7+Xctt#DHy1L6y^*+0_6)^qbenwr_Z!<#(&?(3k25UG(j^_z6a2w~buc9Zyw zUkzUAS-v=;Y=#}r&Wxo9_x(Xg+4Kv&98>!+|1X;52s4$=UGA?#AmOMV3W5LXERQ~@ zYbrH}6s@{G+`I+N&MC>}o@`8-G$kzxDn=dQZ?2_vVz=$K&d)A(+muUpdVq<14`-hN zm#35X@;h{e!_A}WWFR>~;i;Hc^(!Dyy>-zaBy)j0yl$`AjJrjbZFkztF}LUQQ*hKv z`QpuhB>Q^@x0_qqlWkrp;q3sC3{b!zxeo`^U8(Nu7vk+BQOj0*d&n!M&c!UhIV+iT zl6WW%h?&oN~U#^r!aLVg8Jrp8n-0|pxW#a|B`h-X5^P}dwR2z`J%4Y-n#?i$q4tJtjB z%$V(Yq=)DekN8xNIMU_D$H@QvlUUj1z%+N7^Jr!eg$(Q>-0KMcm{tEe{BCzm70$UM(iO z^5@!|9w3QWxZcwQXw3 z{mHyvC!rV@2!Y3A7-Cc21I-!uIMq9-MkLufIXH}~W0ieQ$jWw*o@#WelYniYfAY^F zyPCHa1kF}-a1`c@$zTX6y2O{8X8X%Is9kd2ufwl5X&?(!2^-oQE3_vq-zdL#t+z>4 z81M?)0MQ)TUbhxUqIYxx>AD^qtbyt{I;k24cfjwjxuwK)*X?{AD-0+%XjP)u%2X6o znc?i@1=&|i2%cKlyZx$Qk#@H*)(HpTras_V*?wQ|_&n21^5GaE*xGOZTMLG>o}s{Rb3 z3p(VcXC@%j~rnSZ8pR2_fqd7LN0cJa&zjD}!V1LYpDXg?w?5-D@4 z0-x^cP8GsD9yk6kCS^%`RIo7PX17I`OgrW7V%pGPQ`_%hGnWzOc)Q{hEcyZ{{?Bdx zAE|2c+F?|FY*6m(&=x>Ti$wDR5QkHPo)-^=EJl2j$;AuB(?I(6NK8pXkcj_JY=++! zzjb1vXJZT-(=1J+;yyNtx}I>;L)FmhJG~Oe@e9_EEtphTu}4?2HU`wewUqHN~-@*uQg> zvv_1ZxJ2A8KosaYngke$b@WJ_INuFDnfweDIQHkBI2tK#nRhUGKkx!~ykR+S%{040 zZl@30q3d@=;Sipoc|LpTbdJ{Bl~C1*d5c>Tsq9+ES8f#<%FMWHt#&v?X|q?`8A>iL z0X@{L-OFP_>Y2O7m@~vuw_LHcJc8Obz(J&QO`<}tTya3TCfJ}|f5mM^a5NorO|mfG_HNR!@N6bWwoo^` z;VJOy&xI|lUU()3Xhu?G6edf3m79ngcOrh;#-#`^S$P`2Y7vU7>>>|4*&S zSvw$llCDV4#KKQw6S}dZ#v@2)x@~8pUv{0|x3R|j-FZn=HFr#6(C+Pn*Y%*_$*SLo z00Pw4urG^?oSppUeI=F$B-rM!6tUo3G4op~{9J`l`}MDUYv!*(tedT#T6|SNBw__l z@z&};QE%KnUd9NYui6o9zNO$d0-QD%@wFj?V*Z&`vzDQs8qv4a!IhO!*0XltJ}d*s zO$2yL+CT9zn`06vSgPhf3ESwIAdXV38lQ_>La|V>Zc)JVHhb>T5++bcZ!HbNuTh#G zI$kDx(DYla%K*@nkH@?)-tHabNP1i2h;P)+n)4XG4f|n=(f5)hyCG+E4GkYexr(Cq z(w4fW*;FkL2sqV*Zfma(JkZ-bQAt5H_TiZ1dVYl zQrOQnx1 z%7Q?(P4Nq+=14VH31Z#7@O4C#DFb}&yHho5mCz8MBo zn&Boo1_OGko;Yfqqf6_!#-4rhW*l`dqzGhxbi3(f4UPQD(i3ha`dYLmc(XUSCnm^t zL~QkdDq-QV<{QCaYEa}&%Mv)c+0J^*>-8wBfa=G8@?b4cm_^0U=s)*#u59zW8WKN= zf$6T}&Qej`AO(;?@Hg0PRSB(oRKx_LyygZ! ziBNfQ-fxPUs)pW&?FMHSPuo92&(F$-hlk$yy1tBoTOOE88-Oft3 z{M|U)*BeEcT{aAAdudP=IJK3y-EUaFf09g9EPEIKKuF(4Xxhkid^*(62+9Ke0>lA0 zz%ikt^w{+H6YlUP0PB8aZkH-_$5 z9hB9F&9x$>-1Kzkuj41{jbX3zg<(&zpK0(!v7L6Zly`TqQ|M*}tJ)7mqkI0(OlS%c9<(?gp4+h4 z3x|R!3P{nFbcY^Tvp)`pq%PwM z#kYAx(MO!CY2xAVLSq3Z;h28y@O5L)dCtHCbHd9yz_5?HuiR5Wwa#QH+#m6v%5MgT z%GX{l*{|~DU*Pz3I24R#je47j6{k8;JKiuaW1*b70^0asTr9@TrXXn5SlOW_+1kjm z)MFa&*05n!r{6n^#VQf@H@h1a4`PF{|on#l#FzB?mBt;N2)2u(gF=y>uE znY8l6OJU%P!Hv`CAXXZ2coax|;u|->-o1Ob&R%`8dBgAMRbRrAvoTfW+)I^{vQ;aG zhlA(h_}=iH>KWf3%|vhHr9X&#!d1GeQ**+cQ9g{0?$u^xj_v68_=n=(#TcF?KkjAj zZYu}+Kccq$&X=TVdiU*+iLJucc_7nu_?bi38g>mfPet zg?rxr4+h(%`NZ@ld-3T^J!bCaXd8FII@hoOku`pJ)*q)E4Y}e)1rRUm(aaC?H$zM} z?gzWzJMlTb_4m6%M5*wZ_)X|XP(0PP`?@%&P6k_~QRc5gL` zB>ddcgH0F!@~^?F@qL5(#EjbBHH={S&uK2Y>-eO$RMZl}f8SsgytJLM^Yem=^m_Eo zObCA2KWE7C`TH>Fr_V+rW6W4_rLFs}6ji8x1;YhQPO|=ZO}B;?Pf< z1yM}MX}@_!Za&-HwKcgkqX)nt+kU8}?k78Nse7KeU6Z^sz6Auxt<>$2WI95AbKm^D zmTq~l6d}0hk$Hw54GdRZNAR9>+J8_d|M4E zp@n);Xz_~QAWLUc(wYd^Id$=aIVbTM=aOvJ@gfUQ?;ozw7JnxEIaO3RR4uW8O0AP* z`&|`om$KK*RmV2skzcB0Kl^YTMT8g7DBF~9%jCm~_dtZ_*db}7Ck)rjy3<5$^dcc2 zKA%)Yzoka1_cES`D0N4LWEiKq-dA|rKJhzJH05{@WS~CV_dx|UpWWAn`Z#?l{QgH2 zQJ-++czDgMyh7(U$9r1rSFiJ^*=F9VZ#Q;}hy4y?CY@dFllRKNis~Z@`y(2^ACxwsn4o3> zKEDh5*_ufhw<(l5bQ*Cld)M?zdqd{H8)Gw3G>cod3a=I69f`;{fsTVF`_LTA=Y$dB zm@?7vaYJfuUS{JRO@=n4RJ*bi2&JWDlsA+dM?pK~%*$6&X;BjAAOQ}ArG`s&Pzu^8 zUeqaEF_x>8v$&ZA_)hZS_5j#4JVZJbOGz=dFAhQ?&u~=1D|d`|xBf?zrvI%_VhykH zc7SP<{fhov0ZoF<>UM*B!hQJxyohc?3l6yre7JjN$_aRKPauc&LbO<#=zp;AKpZnnpKW74Ck-)1LQ@>0Aa_MjTP#02%Bh@KE2-OV+{9 zB`lu(az9jmc09$n@ZvOw?{WTD23-`>=aWXnQQ^ZGc@_Cw{YBes^c&@H5#;<69yB9u zf5O!KaTwafy11N;Lu(|Qlr*oM;F2IZ-HieyPL-fsv3FoFad~tge_1)?;T+nj8=$rDmS+eFSBQeYY{2S+WKiXmx4z*} zzQ-u;jxsd7&+9Hs*~InMs;N$jtH~x-&o2!@G`R3Sk8E%CZrn=e4e5T|g_AeKEGD@z zdwi4DBZ*^~+&sG(MOVudeC1LS0f;R~7*snBqnF`#lnQF1*8NOcGr_1d7kX&axFpW* z5@A3E-aKp6`o*jA+%{5ShiTfSSp!8VN7ZXOhPs&V=nmhk7?i=jh9~JK7DybHWB32y zWPKM*L&-rdfUS<~$$Yz*D4Ox0Xt`l$xPZk%uRk>eF|C9XaF#qu+sqA`Zj`UHWzW1i zXpUWZxde<`tO*2S@_v0KQ8K?pH)srbzo3Cj`iVTE>b01Oq($9ivE?;Zh>xBV923qQ z#5s=PMQink9t)e)7y*l^=rF!3g1OdBOukkKwU4W#c<0khdq@J%SMkYITvZU4gIhr2 z+vhWjFckAAmiGQKv%xrn-y@Uu!%2p6r%RgCI%nbEf#i2o!U@?=rgG(i90(Oti(Ccc z+9PFB7-_*T+u_%__9%#Z?(b3*fXuVXLIwO$MyJzBi}Q<|oH`BLH)BEnndt^2*r3sl z>dtf6K-^9p8q{g_H%)!EHn`GdIOBPwcW59z0)`O}VlRpRewdbmV;>i=eAyx1i}Sm{ zOT~^}5Qs019AY;mo+|wjLxWMM{#gov-RdC7<6v4!ygxZ=U#3v{ybf5E#T1|fv{eMw zH)MBb7qO?n2KDSfQi{cAcVlXnaCM|WM9-$4qI?iruT?dRG7(Ds3*EM9Av5EVLD;5H zna&)y2QLvjDu&+FP%kO-oue&dG6QOrgg;2btw`P_jb)RUX3m*@nUq&9DwH8Ag(@;z@}A~)V|+su#(ko6 zlh-&6cv29)7K7hYQfL5~=I4-JOTKy~y{DbSttKKjUbHr?QO*P;@9lR6-_;H(kBkc<3*BXyp74C3%K?tb^ZH#9y(6>ZsQRaGDD+;$Jy1_ z8YXS*88*y1`2&Iy@)~d^Bk7UJNAn)vLc;0<8HBjY_V5m|0K1?rEG*S(cb{bGg& zRGTJ_faf->8HQ4L<#be)G^A}XH6t@LLlTz!iml5Ymw4pC%+-yh0X;9=Xkm(TnBa>p zbp>9PJUcrS_JUh`QOa>g_cICl)hVT*`D<6Esc@u7>=A+~A5LKIVQ${AhkqMRHTa_Pu!no$G>IAm3?-ZzO!-f&|V4_8(a=b8T_dbqAJ46ed}g zxrQNhg>Ve6C75WQIkEWGc83>iWc0oir@v0!{T!Dn7^)785k0*G#i<%-V*winzjYCEWun`wG7R zO|(hw{jLQ@2BX%drywB9JJt5VBl9ntAHhzs*DI}5yjP%M(?v{FvfgUg zK3#=$@hku=1y#<`8!|EO^BCp?8mtD&@J4aAGXQ zoTMK*I-GHVIOaroJHvBbMDxoQB#Vlq$!Xg|1m8l*veIU?!&*1p0p(~2I(v&H~17=&q$>JV`g9-qdXg zpxiP>+dSE){}EK$|0ncOn&tC(GZ8iwuaVZJB|h3-!o)6}sd}hBSWafXlDx$91x9|e3GM#cIPe34ZRhj+y2kIcDqzoci{BPk!p7> zLqM(=zP}Yp)L-edTkG$!c?;0Wse~@8Mz+Jzl05{oW7K2d}2-Pm|?c36tkx=-OsuYda3k;1#n1W)|uL z3!f|imoOQ7s=^Hv36>`}1Wk0If>P!}Ww^Uh6GT$zSbGU#5GDnas-$Gzw=##iH>`*& z3M;dd{x!8r$ZD+E(2dI4wVP(=twD*NK!-cgnqUU%JDTxkds`B^=b|=g zD;2Dw^#u`j!L{=G)IBuMfj7kH5f&|UI8eG3M+q-E1Xy>vzSJP*MEU8JAZ_EI6W}6J z;sX?IvbtSUI2`A5BS+~85KRUw1StN#hsg>%i>PeXUa+h&pZZsBiwqvx4$0lR<1noG0pMKmzcOgLVq4QgfjIByYs87V$ze-3NI8j$n63E1TEM^6 zjls$#jcvpUF$HqoQj5}hV9ua3{2+-5Q>H67wB)!f^DSMc-_EzgU#5Bec}*&~HlRV@ zk-Ykk++6UZfjh}b+Uk9h{I_;RvFo$zTJvz#8m z=15=bJY{XFJY6@m2n0+c4OT^ohEMhrxtq>D!x_NN#1q`ar}Pf4gOFp zTR*qk8usEmU8bW*U5^`dvEJE{fCtI1qHHzp{zQ6$8<&U9W}h|eOo_UmdNvjc(bN|c zH=O@fsHxGrp zEScsOw9l-qwmW=y{l9LuY5V5Cd}Ohoh>YHWOVIbDj^~5mjEf<{Ud>SFeh=jh%U(#2 z(4;IubP6Y4qB_kd5VU2y=6t+Jgc}UjSa`YRKY&7k3MoF>ROG*|LcBcz!(MRSh{>u} zy?l&4pnn}FyX`8CiiQSrlRegTmHX>6D#Q%J#D@V%&`cb>Q^|O`+wQ1vzz1WVV9WY$ zdQNOqMiwCZgJ{~5_jUM(lNDmxvXKh6T&Tl)Yr_Fmxc0d@pj%wdHZ-`-UPj)tsCp#w8BIvbjor!Ut<;kn@ zzyIC=vXF%4q*1QuB7k)4ZINj$@f;7rx=(nTa9ZqwM^Dn zkQFD|Y;F-L`=Pp{u5y%)oZGH3B?U0ofLEW{b5H}*;%bB5#nlJ;@PkC zBBk)78Ic{|F$-|?fCr&SX&L`jb!^qwXKBiC98ik1hqn{g7p79C&bOG}Hr7~K7L0S!K5sdo$yT`8 z@ch64rymgISGCda{@7y86~?mBS=Sa@I`D_|9sm}lze~`+D@56e_TtgaEt@{&TxwkI z*krmE+x`zlIty(~#fAMRE2s9^i)C$dm#j5$8HwCEh)3}F_`*`RKCCDTC~Ey(R1_aU z`WdKy*SCtmqFdUm2AAJyaB}EhIkeStz}f9gq#|Z5Dk%I=JgVMvZs4ZrQiSMquRL@Q zAy-&@i_PG2w%1)D-Rxnylgn*8ldeyzXk&xcMJptmvB|2|Bk0bw_?(`TjMgV9#W|rx z&;-xY;(pN^bil;Aq)^6>g{Y;Ip)l+*yxamS3qXC*t_6)|LbEp0|g1IIQ0)W zoANxv>u_tksiVoLSdEIV`92|<_6?MhGBZvi@qw6wX)`~YEK#^>EX|afA_TLEHJ3%J zC3aHgb$lgf&eipOG*22F3Daa|5~!jHML`vcot1K}I3zyHJ}BX)Lqe`yLuIo2RYpn0 zwmOeN2V%kj(moe-eZ1EB4wSDDypZ-s$!-m_!VXMC+QUWGao+7|`k>j#WrCm7H<;e3 z(WO9jSlxm6+R*5sCP9a@fLedMM{pWFRku~Qsk8T|92cFbycdu#kSIhgZJQU?m_iQVD8Fyv+hlZ$geU@62_GgG4D028;N3_=* z_653Z9ZyOz% z=%C|~F8Lnb%XbaOWQenFS|ilPJh%IN9c1A3y5VLU$f@JDNqYMx5={kqKa)hIj}v3J zxmjL^5N1xy4%DTSiD$mDh~ehBv%aX&mF?aimbjHls`cLyWrf1>#791k=Sv&z7k-GqVoBfg9ZpyD%qI#8eUdU~Vz71(CIDP>ag7yL27!5Z$a zlfs!sMh#XE(ag#b8f57qRnBf9RrD)w8#xQNId*X#{eL~!-FeQwaKi&_d|w0pVq*nS zf8;)xu@Jhse{-EF6xq2o{>b)F>q#K<{_YOmL(;5wOGLaw3MqHCuAhmKZ<*`~0ri7w z;;g^&h!m!0rXW_Cj|J^)xFtly&z=y$(OU=)j=|BHjo%!K--^C#`6(Y-`}|35HVg$^ zE$&weZ*q1K3|&PJiXD_2&3iVmBS<2nypL>?xD*su(CK{-R-lQ&VSR4bg$Yw|Rh1>;g9(Z102lae=P_vr?{;HlpkIc)Zs6 zwTCErt1!Bclf#Xwhx;LM7RLS>|9BmPmmkpc;8@Mt0iYyeUwCGKc`W%-W6xI;Cg*W9 z11sx1Fi=`;Qv;6aT6;3Ci3+k;vK;gk)Z=Hi)7U*@E#(x^clz%t$RfMsE4O>T7kzDB z;YK)lHSrXLBmnLu`y**vNeOy&q4xn_Ptjieh4TK7y0que*5nX-c3RuSUqb|%i20|x zzw=ep1QFD3{~(7#JT|(}{1gGct#49nq_*?hPv4 zG=(2SUK%L>C*aJvyD3i0jMD8a^h<0nV6_gE?yN=fzR7bV#FcA7T_(Kt`rjb6xe0Av zpNJNx1*y_rzrq!H_(@OG`9nlB=RK?0kT0I7fl``piI+=qvoF0_>ejT)yboBR@bL$| zA&p8j@Mx^12dCyr$+FH9vI z4gDkmK9v_Z?E}kzQ(Im4Mv$`yK88+{`d2i?3s^h^@U_?0nxJuk#Z- zjNJ-*i$LuX#F+%;HIQ2<^(>$gfXxSyRfN3PAHo0>pl0CG`>MAVxN>`*Kf*Y$FS`i9 z4UWI`Z?V2pB=hkEwV(!)??kO9ix`*psX5fI7kdnrFB3E%j+-(x)Kvo7P-VtHZtQD= z=P{=DB=pi`kp^wce}Isy$u?wze1?(MHk$Gw=v4nH7l8`kzn$8uV zWBYv~Kd}h3WeHw<_jao<>5`C1ZzQX|X+kEi=fEFzBeKd&KD*5^u4=v8;?d0P=*x)4*J7;$78c@< zfD2s5m9blvLF?&JOc=^40ZF~@lUI8Gq zA6zHX>l%IeQ=sHbPZdL^Ezn z5omSG^c8?7$rS~^s2*A)7U@3GYKy4Zb^*Tqf4kxxOk;d0~&YP;A@R0N9c^QC*V<^zDdn@#aopGMNC*=C@lxQrdR1~u>mhp}z;QTF zIVtSxKGVd4*Y*DTfhNZjWa?|}XUJ1d;cjmJPw=ZXzTkt;o$80FfXx1MPjjFpm< zy7ph`G~jgOcbC^TAY4;}1wvwukHTpB$SeX3MOwA7frF0yXeIt9BQ8+rpZT!(^z+vB z)ttrBfFf*WD3=ABA+h&FC8?yCJe;9I3|t8AIQC_*ftbQ-c51P3h*i%!rjSZnjN>OZ zyk|lmH#*S{nZEWM%E~ztJOAYrl#P}Df#*I{T>V{8SVQ&4+k-2wWi$uVBO&0yv^Nu>Mf^a@J6_KS zRq?-mSHt>QqQ~*NHbv{BOCXgpHP!Hrk#|?I6&Lu=HJg3a5b!7uyqx)j(nyaChDHhf zSnKWvu+JND0uag4eC%N7XIipGdN**x!f4o8$L>=hFW1!2{Kk~vF=YW;R=JOC@qxZY z?&5hJNp(A%;|o7{6WdRf4U!IiCl8Y;dJPBfNfbh|i*UJIIJeH$ZzK!y1@>+@9ldyC zU6B{09uGI+ftF{#Nh+@rMf7+xlYT~Cl1=rAcAkvczD<5vX9BsOK6D`ha0HBb6x{YAwA8b**n614N-+(T{+!8Jhs~RvTv}m;96K_2 zy6gLT{HYvqTpJ~y^9rx9d!4#GX>yTDhjEVOMauB+dUn~lJw8beN_7xXSdt& zc4kJ1tzr%835r_$gp(S-X;{URd`knJ_d9G)vuc8)-C=@@Ff(?o4~8cyZ;dd#+D7k! z#rez33IlH+6t*sP_6eS(BJL=^s2Io zrn|G1p`-fmYUt3|NAOuho}zp0@PK^oNyhZylt^^%QGkNR33XH>JMVH2@_QD zu#lrw)?IOlhnS3rB6}BI*voBncG)23l0C@clPxCAQ&WN7Hm8fH&l2v1 zPX1A>8$u|QcgmY~TuN~{SMg}=T;`eWwW_Wcq5XqTQstS#8PPa0J1Y2~Kcud-%d~~0 z*sFYM*VMDi8*Qm0ZR%0WTY);f#v1TrFK+ChFJR^W%^({!(O}cWWix}tzr4=Pgnx3b z;vt7%hukY3gFmL3bN7db(E};DYk=S~(nIz3^GTIeD@yxsHpo=qecGZwCDHg2ZfWEP zE$ZNGKeIKw5%7TB%FiHA0Dogs4`uZ%Q^SIEbif)h`;@E>cStzJ_OXNp0%88luBwcH zS_XJEt;*l2JOBNI zoShErejWQZGM;adM4@Dc4j+T+hWE=!!HbM$1r||Ku&Dm*M4x46@l$#QiJB?P&P^4QvBG#l$EAqUmVs775z5Rw0=Ui+vZ;5IV9SZ%i6 zW!$%z6_zsaEdAAV0o|M&=nb_;$;J0*FSpOWkRI>!E=czaSJco5@w~ROJNBAm?EIyr zGUz7=+l7VBe!h2f1=FtZ1lV>ZG^${p{NtU*uPBTCeAF;VKk4{%z`ut9VN60z`?EW* z)HCtq!$Tx#ai?Ylu{hTzP^5IwT#MBFq09jbJJWFytwQFYq^sym*Z5FhA7n7ejeV++)LXbaO4>d#jw49o|9V z#jtu@hj!OkXZWzOycz;4qh}Crk|)M*C~BN=3EiM*s?f2(7QMFu{~cSgSwxzG()mwP zg$5$;RUDRTiQs))f%lwiOvkk^JTsnOp9YOaxaTGJg^F^Lsr5dj)7qPggzka{o;DN- zCmxFe8@E_`UT+r02F(oI0k`_mpzf}si(x?0u+YEU{Dy$YOPr)?jF}I+)PCm1%oSm} z_^D)&_PXU~?NaY4d@C!)MN!2lcT)Hzq?r2TTZMyne8U%);1m*g1It1ubvf_mBmp@NF2(*P)9WBM>I-22V%_Y8d_{x5 z{CU{nGRGqte~Kd6gg&WnSoS0feJ5=j~z|+TN=&b<99BHkmJkGaFm|B^|vI@mI31 z4o8Wf{-z_-N)uAr1aQrgSb5S7@9x`lXAwu{?h?_uiOJ|I78Mw{d3@Lpuf;U-1eVJY zg(}6(QwC@Ux`l1=<7685Ur;dilcIM#{t;YiAhx=z_k9m@8p`;){@W6$T9_8XB17q; z#Qi%jvGJ8!mBM}7$=paBs&2y!zxR%D9AhxfY9(lWe6a2(ObO!deEyN=m%`Fp)iL(6_A!+%DiZ? zb+0npf8o6{JPVgxdLW!6@LFz~ZONs|6j~3j^2XVM4Fq?MP2a?10mq~3gaXLv+@xeV z0_}VGT1O>#WV-(~NY@(T9W;oG-(*gaA__7x_Zrr`E49+{JhCTo7oZvtZf*T-7Ok;< z)>~#b_8J_HC)0#x)FA{nM!KP@chG}`y4@ns?h)@3;h?;7uUrLG1Zf{;lz=C$R3}mE zwLM?!l`OV9*gjqD)Or*o&q6s4YCj@K!86XMJ#p~lgz;pKTXzYhes&&4GYD_9$Q>-- z<7Evfli;h2Vjxp7qg;#648=GL3FYwXZKxnf&l=>YUxK3aXO$R7h;?*dE(y9^V$-=! z=vS{;re{G$Li^%p$nt?#3L^4O5d8GGkp$DwJaLwrIPBA77~yR3DH~s*RV28NmGia{ z%Sthhb4^Zwa}k}an4!M!Ed=b*T>q$rfzcM&Fn9-ju?7pVIO0}c&L{Ew|LRH3tD0L4Rw5X#1EAr zPuJ>S_{FSjqOA_vkncssofcZFaPW3U+Ihw=yv-fc!MA{hJ&PCAif1;5CV~g4@7eeG z1N&1`C?aPYRA0BRi#Zk;#Pj{@3kWqlB5h&f_*wq1wNTdOot2k1 z8ywOe_iJCyejx89rfaWa@)oYWPaRnnp-`_EV_@#7(&v{E#c9&3rmKFbKr$=0gHhEx zV(F|aRop_2bf_a~7u8c%BXj6ECjGjiOQXdthP=^jEx>|K>-6g_0x{h`S_%C&!G=Ty zRU){T_9ZnOYrh-oPcPQ-W>}1cVu&K#FpFIsPR{{}%Wi3F`{~!PgOxDw>@PG$;;uy7 za}k;QsCjeWPBzhZLCUIpGSc+TdKS@{KljOU#8uBTuA+9j^#^egV8izSaW%_GoiFg* zK)Oqb7z<&4q>^%fxG2Qkb4)cFb$BWa0<+HYK266yg0RJl+Qhy2tt>|^j(a&2+-9=E z5%sfsp>D?nEsl^?Z*P9_wfyPsT9-N#ubwzj{1;vhb@=<)ekPss_+@TrcIbxfb?Snk zp6}$S)Hc-)!8m6HE_h<9IiH<$fe=k~2v%k~i9)R>j-aK~0;}Qfrk;s)gEOVrM|MH@ zYujI}gn4UC4}CFX4-k)4d87<;nqMLcZ>T zhc=MR{_VC;oaCj6b%M0$;<`I7b@Isq@0~Uk0TrC;9W*@ZZ_^JHPd+E<)n%^nwXq`P zv9|9k2=biIq88H)<20OhW{qt27SP|TA?gWBld&*92fkY9x;QmjhcVRv&PApjd_F~j ziCP@C$RFZS-k_qKYF={f|K|^{@w{m)khl@9CO2WemfrFq?u?^HyrJfo@Ops`tSO?4 zO+B|8Q2&+8_*kZoE(V)_5*{0UD`?6_?J$EXD^T{J;RC|NttOQuII3r5njPzmQ;B$g z(Q{wbv1T08UX!pC3%R17TPXMslOIN|=&nS) zlhpF@l#C?eqw$}wZPnMK>)itK~R8Ebp8WQC%|NwvZSBMhY-C9j&i+)wx269Nz zioW=wL{+74Tp4X|rTL+Vr9TGo-sOZ%0bVUw>{^TP5vYp+iixwfhNj_&*Kp3JNf zJmo~0iP{0Yu29l&e2RgP2j&=={tMG!%J9q&G=mdRq4ySpKxq zn@?Hcs-r{~ncnRo$clitu=X@T9x|0$x=Cy~f<_R^vey^pFq<+_lvE)98@cCT1*}$M zGt!BoXQq=p>VLl76E^5}mx~UtVlYrUo)o5MdWxE29{rrDAbQ6s3LKIou66Rd22*>r zcVihpO^@=YKhUHe(je&4JR_9;j^@M}aK2l18(op-3Eh zd%yMF%G9dy&KRDxo4S9GEF3K|c?i?{Cew!NuWVB!-gO%per*Vf&pcoX4c?kth`=@s z+s?|@jac;-Z37SZHJjKxi>*v)g$UkHSC8cuVy-mTir#s@oJ;$|`R5RorweWD0$$7V zz>A;lavAF@80yv7%IF^Iro}3kordH$yQ;-gjpYeUHz1gBYWLDTO!a1b*nH)CQqh># zf;&UK;8CVF)(_P&KNd{5+(fW84Rv@mZ^Z`6to{^)(w;l49kFY`hLhK-tJVl^Rja>S z>!!W}_`@S!whf{%&aEw7Bqkz<2CK4JqEuy}sXxtYJk`pnO5bT-%-xK9aUm^(nM6U7 zrsHx*_csc!p%QR<#WW@G%J$G3fS~1dWGs-5b35{%fZo*3fKkO*Zr`&7Xb;Y6N48W01>}U zbx3gKZMLb8gDOjEXMMvUYj1HSLtPh99~b+R)aQKlg?^#u;j`4u@pPwSJfTc8vdvms zY7K1r#DKuI6Ii=EJ~OtZHXPMrzVs5czK#4-Oks6ffM8>s!*vSu{Az-sl0*vvt)TTKWNZy#e;K8VC3L7!)8wV~?QyF|kgX=0~AZU?-Wcs6o5m4pI@$ItA z_y%gGsp|r5d-l>dQunBw$^!e*fC;^4(}sC%gwFhG-G1Q)%6z{K5YYJKnC{9jU_tWU zNjwsFkMqWGuAR`l-Be#g52owqU;&bOxn*QtMw`*?Rgu&>2mkU=G(B;ciAHKsW@q4b z$^?8b+87qRSDosm zr$Ct?>E;TI-H2|99cJ>(AXGqdlTy6}D-B*+pDfeO06=w2@hY@Aj-DCuM4?{q+cKC@ zs17AN{>j;Ik^f=1N*9eFO~Ca%82E&u!>*8-?D9JUb_ofl+*>AZ=RiMaXh`|6e+(YR zh9Uj~)c}F^xl`b$61;Ikin^jj?X;#RJ(+gj8guM717Iet=}y3SR+6xh7O8?6D;90X zV|~O1>f)1IH{~7XaEBd!?Y8p#$?a-~F5Y?Oo*~|__;8r2wQAV)529@z+^>pSsailP z5BX2tRMf)^1bhD+68T3BGKXSik!<~F^&v6Yyj4wXxro*VGCon1=OH|TG7Q@M7~P~| z^1!qGZIIdm8<{S>SAKIhtpB{_^OS!_9jKNc-YGYQPJ2_|_1(y@4NxgK9yLCNZYrS{ z0xCg0L?Zm_#@O`ktXc7vg5GO&Z?PO9?h<>!wJl9V6# zU+T9uVZ6(JRQW-(txCmaK%92P*scuwT$Z=?#AWs|mjNjWSgXw{w%)OWl6qV#>W-ux#9 zl4ZlZF`RBsQyQ{sOuxXxBz5J_CFZ2I$)|n}Oyk;^Af!2kcX_D~ZafW$wWwEnOmi9a z>Nx~z{r}yw!UhOH9|;I;ukhdq1~G?Ji3siW*!mj*S?cWuFF-G8p`O9oFL6?wPAViU ztac+Mnwn=X6N`P z`KKpoaa>yRe%QtHLSMB%jm%z&ZtMaVej*FIi!}ZG07VY?6_C3G{cRfSr~5=jT$Jh2 zc$gvFg~{jYw}8k(FhFw(XSBiCQpURM2JJ8766IgA_t0pMo^()w!$W}bqk&sgeNU)O zld&(UoG|v$QGoi1p9z_bS#xRWDanOH;OTErJZSodEuYAWaC;&o!nE-Q&B1n=E*1Bj zk=3=9Mw1LZkpZ`p?L`#@U^)5cKdAl^79}aXiZ;}41Q|>1CGuhS3<5q1vOWvAhaJA* z{f}2ayPQP025g4C2l}l&C{B)7h#lLJ3M^03TZ9*{aw&V*p2a$mTC;Y_19;!=4$Z3S ztBur51}oMLOjQ#vLfcD{Uty|lH3uEr)}B;fxfk|c0PUMhi9OYgT{RboHfYL^a_SEh zT`s#oFTkB=N1c?;-L~B``Ka`rz@@}b8iemWThqHo9Ug}G8By}Z*P_D%;n1P9sHMyV z?VA(m)RaeI&Uc0S0VdvM3Xo7cj@_*uE!`-KO46qTU(avF7xpHU2U7H+x}@s5vamdm zdTPgXVAt{qOemu;r^Z+d zv}jvI>%H4pDATUCNf|sWOcP8KekwjnAFE<4G2j{Ok5%4M&MT|@-nrWatY5G%H+hIl zkreE(SMcyzW_uDrlc_B|+ZkZN#W1o%}0(i zw=~u0(_!3q)_+Z0_NrS2{Vok(7#nIZ7q@aq7)k%VxoR)dlZ3Q182d*K?cm|`hpEso ze&RBnk^V2JH|mB729Vg{6?<1=NT)es*JJEPgZygLKJW~1lyHnR3RER+I z`T>4DRwozGYa`eD#H5V~69C5s*831jG7=tEojqzNzbFR^gL3X?5C(2U@lt>DveG!5 zr0$+e8c9IsPt`$>Mq32ol& z&qo;_-jNNyoG%8r)Yds$b?|yg$BReS*#4Q&86&dVV^1Gb=V=3I{(WL7&^XA@AYr(W zE?XZck*#(+``#rmrErgeVL9kAu|t30{;T+9)s;gHTXB>18}VD(*wsb(lV0_>eF_k3 z^T~W0;-!il)5dUgNQPPUC#xuGWDr2DB@mhR7+5N z>sdzXlf2%q3dO40%lQ#*Onk-BQ2k6(X!CyN-l<4pXS7|rzQJKt&-g9+5pqdbPshZ- z%;iwkHt8XgSTlC1cT7O|pN9ln{HdT0h(6)`hNphKbkGG%M4@e=Na_vq^ zP=t%Xkxq{fi2J88Ie3Z%6(BKUsKWV;7MZ_;&^VOg_***SjAcd@ESVjXa@pgjxz}p7 zi^<9o_+uJ<*JS^dv|zDEQ7g1>iw~o!d4p^qvugZ78FGuabIEacrZm3$06#8F6`oeN zFnq5*6}Yj`)3NY)*gaR16u73SVD0FP+#hjy;=NYsY}jP zP3z`Ifl==XCVGCgTeg}A!uI^4Ix%z+(ER%;`Wa|i)KCg*KYu97aU!s(X6lHY#S3UE zIIt1`wQ%siG-`a9k<6pl(;yRx;c<&s1CZVG^JrBE)lL|{@pqSd-~x1fuw$@%T9`j1 z<&zifpB~t>;P7!v{*&mVV!HbA1G<5~Nu=SH>hcHJ!hPpS47-1azFkG#*ZV6GDp`HW zw0P<6nfL^`h-iTeed}ue#TiFC^tdaw^@VEKsW3bZn#EzYUT`29`zJyzKTM)rzu?ix{B|^7jQjf#>k}gi)O=E_>`b@5V zDGE7{JO#g0s@XB~=e{z;aImzNy(iJcHy4i9L&uL&r6u@^oZlTn?JFp(qDJXszj8LU zl%1pgQ8Ewk<**xq(Qj%J?%lS-gG z8_HKQaEFG}EO!i2vGC4(WxwhKw-x$8)9*aT-r~>S37?p!V*EDciiHSaRFuSTqOJfm zO+peY^uz&7%-~WW93c#HVW}@7+Vxu^!We(jePzJdt=Ab#1$jbuN+s`6dwo{S%j65d z%{x1i??wvagY$J8>m21?26_gxluOt44<=AWzCza74kbAd%%V2uiZQ=( zTFrr=CIqS^ew=jztz>?so*B(o?g(TcHVX4&aSrph994Mjg_{J^ka|coZn|CGM(E_q zpMpx5&nepKLLpT?33lYo@+kcIai(Fo&5t%ntNktCK1A*+$p#xi+M86^7P0GrW?a{~|P$P3{b%`2g# zTFnY0(yOjS%6GY%rxwgii|}{so6VX3l{eizP_kICHz76tHO*V-v0Q924-b0K#=hrj zJ!_ml8Q$+VAU7TYi-1p4GN{y;S;a;^vqgF^@N1v$;4*~eVMIw$=qYCpw5YLEdUqHF zQyZTobb8EscdRNw8lHY@7b_G_6)cr@LkuOYY_R{L`?2y_>&t`@S7=dK2v&p{8f|+YE(>z;Gx7#Quiwx&ml*_9LZ^x_9<*E^{ReI`G`^Ex-xt-#MYBGo&;#GntNm z+xY9lVFFwVo*?FGoSTTBjhN}2VY-HMC-_*Zp8Oqz--NlW4;QeE=!I_0<8 z5pnCEw=xa=X6Kww5c{N~li41OJZ$=Af|uNsq`Zt)>ucq;Wf~$pz=Vs9$;k>ucA-o7 zmYFi1xC~EP2p`iNGAN@wP>NsV!5&{@qseDAi(C8NF=zHFV>L9Oi;i3M&C2(!eqni*#Q%HXVud{JwOyyK4nRC;0v(WID{6>$*{=csjhN)6hRrdLe+N;KL70XNx zI6qyAa`S)S^s0}5CgOr>?KS%+p>BG>`&SBZ;VW6UM77=jcDIeEVQct7Sg0fNX&qeh3Ufs z5;bx74!(0v&fn&`_`xs7O|)zJ$G$-+aO^5I)mttt2+Ax&Ic=hCqD}gu<1U-0 z2WxU@W})TX{9ft2I7ej^Sa3__Dm^5EBGsAN?prFrB+YyTN?Sda&s$>dwamh(@)suh zSUt~RXtw?!W{;m~dzyiao3!P$6?))Bf%t5Nn7P+AM$+f$n#c|GJ1c)8yw-je%lKyR z1;5<>E!JdzeVP;IXCyv%%+o{Lc!>nTIj3um8J31%j8KwADTpJ=x_q}P04!qKANBP8 z=f1mXY@M1s}JRoXt)-^r(ewGG=#ozIKu ziLEnM=o^B%EKNI}u{07#oE{*KL(=;uD$k>;{z0u;1Mb?`RNB~e4jv-3D=*b8B*{MX zPj>JV7&Tj~qDWzKfO1Tm-+YKuO@dPaZD9SPO-|O_@dde9UG>IwT{-e4)s!BO_AJ^k zJ*0*r05UhANHddTM#*%n>I4&Ycs4V>CL88}rz*DmBoo_$Yx8>)DYaj@00)-+8K|dm zk&@hN`j&{2a9zcEqFg-0!7yx9g7M^ShN^Q&w;rWX%qdlPhSW*a>N#B9Dn1kFa7k=> ziZs{;@Te*&A=-jtn@JHS#7<1RGS!N^$JCsQ=>lvh9=nRLMrYV7#D~Y@!ZI{S zXL7;Erg7w&Iv_0M6Dt-M-DkwDX&R}Gf`?ghzr^9@V!yXu3}l$zK=Wk62iKxZl=+1W z<9*bA=!z`zc%Hl&hJ<~c7^w>LVV=F`2vLa?1^gSmeJ{_;O6;|fqTT<{(g_&#sNgYejn$^`1g$e zU;j?KEYZWDejHPB4#VVO8J>@)S%i+C;?%M{^;nlbZRk_m6jK|PW}sCMz?@(8!<}*{ z8J9_Z(~W(P8O|78*FjQwS;5tQ=N4e2kUCcTYNKW!i-n(m93a?9m!Eph9DW5&^oc@# zCfNy;cXSIDfpy3iSbq;F`9wsEa!~nHi_X%SIHKRem{aX#EZ*Z0m)?NrwyJr`QX9Ii zIR^TQ9U%wS_|t4Z^Qd1Cbuh-z(H3J&vj`TGJZaIEDxOvvq~r7J{|ciS?~mb)>6S}` z?tF97*lFaLrH(z9#teo6JFQ8|LJ0jHPB$|=w>=jm3BitEXrp@}(Yx>w1jp%b5ba83 zq30j7S$E}xo=L20Sx%{RXMC}cz)E~Tm~I{_Rc*BemkCsoEtdONJ#|S5W9P1R3iB?f z07A;aZv8JYnKc>6&290Q?WchEE<-&iEVFc3+T-F(Yx)scB^ii6Ll?Gyr# zG_7VRv1`v!+n31)R9AVrc90nB7Fyn%*ZO=fAn6=6cA+hsR6`G(LFg9Z;$&SK#mL77 z)a=@u28F7!KKZb5d&B2Yf-u+fQaR=-^xxV7$=)}FBn}{T2v^upJ1a}-X}VgC?%rU1 zJi7i{ZKf(PkOweS<*7^u+HdtFz9s@~kz^mHR;xahU_f8fxQ3(6Te;25+Qdbz=QLDS z`&UFZ23GL)&x9E5*@ODJwB+#FM}8N4Xo zEPeg)X0&sD)mcZKSn+Y&U3=HWKU$2un>n}#PUAMQ!amHIoT@k8>We1g=#YQRjG1kp zGbI$_dE<-0%Yj+I`d$lLcT?K)-(>-X|4n=zL?qpKLd?85H{vPDd~^Y&QyTUin2=Zf z+>sPcHmBl$dY%6nt+#aBm(=EOnkz$1;x1#mO@$!H7ziEOc%HgymG(P^=`lshh3=Pa$#8S+t))$w>`n>=W7sJVkjh+`dIqnw5Fg=1K#@y~5t3 zB;G-fv-FIa&J#={C&Jvt0WrrFarE%|^iUf8G%XvXySJr2{kG5^$C;JH4yyz`OP!as(2HrOUsk~CEydQPmn?VwPiUQAs05WQ2G5NC z5}&3Ky>gVVu2%GE{~n(H2e z7zTUbjO$22gi28Pnp@hP!$vzWVMDFH@<;t9U%kfas#vMX{7(>|Af{Qm{n3=Sp7G&n zT)8~?=A1uSleGXy=l!p}w1z>mFPzQG53@X+n>{xq)gaY3{w!R*NT9up5w1M{R2uf% zY#ABk&ERiEK~QsO9aPW!;3OmC?V3nip3i(F;!k3K=h+C*9pcaxW%0CptJ=R3Bfnp2 zO-d&yrfgHFz?lWXl9=P7OVFLNfw+wNl}q{%$Lebg1tZG)?K9{H>J@`Hr5-H*Ih*N2 z1#iZv&7lhjrRVkCHPqqKhsk2BFGKwgdYgv1_4aJR()vFAg|%rku!IL;wuRaJi$62e z>Z&%Src_R~V*b4DrTqa^;`g(G0I&LYsURupM|h#zt^?Fe$<{{hC6@}xR?;%nS!A$` zyrQj0n$+CO^pU83NBVQE$F6Ccgml`2$*M^f)NCH%_b?(&3@|8UZ6Q22F!%x97t6i%Oh9{YaD?WegF_q zm5n%P3zDTlOnAhAvIo!W`RgMt_s4+{0Z7+G82=tjp-A9wTveXa{p%=H{e67omCD{M zJQX`PeP8@^UC&FP@1Ay6|2_Yu|DeOZ1NF$0IXat2^}?|8I>C7%VX;i3-~a4)lP49} zqK+~0HNOIkqoz|VH!c4^YOuxfQYXJz9f=8qyC+D0koy1f;`__re!u$tk=13({~EVY z^vAbWR+pP(4XYx&D;z>^Egpd&ks41$dqT0gjuP?dO1ZhM~R=Q(&qP8*{7h)qIAkIXu*GLD#3BzwTnr9g+j6Y4ExvJXLn`zKr>TtRvG?lGvEY=su#lL zqc$=oE1UjGbG##t7rzV?0F#0mgmC~bfXE}#!pjadp~WI zwG|+<%`b9>zQ~5$O@v(^pM5^kC?5% zOB<3>U~vvS?rsPg$tqBpM>ojoVHCn4N72gWxl+evGt+Rxe52wPf52%Y&q53Nw-BzQ z2=2xmTiQyoBXAFiLYoJsQwmL-x0dWrggEHZH+nNE1&ka$wQ0ts3LwUyX)yEjCtMsN zXNCt|2tqB@WrJWF>dk~<8N#+BgWf6DDG)zsvyxd3l5u3YX)_bIHL?d~JS$7ZrY zfz~YdB0%6h^nb9S_|*U2V_z>b_IS`Z2;+~Il0vSf{JvbwDJQq`tGA)d@ajG2h0l{f z%GRa-_N45gi6bB8VmLiT$LwaWUMG;ZTBxN$m?*ORr?@8In?9q>u3>XH%8Rh~NM&P~ zQyhL+L)VgcI>YoYa8suCbJ*OIT{#GH*5bIUg-S9EN_)+-F!OAJybx}Ob6m&M>{VS# zUI)7ZTe=S$I8ku0mpYk4jq+6M{EYWd1JQMp&An8D#A%5rw&^=q(_R zab~34K@@Ux(YF=3@83Z?^!?PgA_Pt;x* zq%FBbq0#e2Q3%sS;)zl7o|sFdrCzOa`mA!3EJ^9?e}C&2uR;!zo)waeH>>5H_Y)TN zgGZ4#18tx-LU+KCVauMYEkSSdca@7j*<#Ra)XqwV$jXN5=R8-ihSHbC32z#v6J`;+ zkj4TCc+bDslL^e1N!fBugM#ktSl$agPsfqWixE-62Ja}#8Q1be9Q|0@Uxz@s)7WREnJz=~ z(;a>G!k}M*k;h=OwHrdN$tjKMM_yCo1xo8P{(xoM)#qic$^7`gfX zpXb+f3~A)iwgGOVe1z zxl6AEtG5^e{FuZTZGIRMHHevU;N9^`ZM z^qO=Bzt>ab& z@O_J1yE}po)0dRK(b_3hcH7qNn?xI1S5~3huZudYM5BQWjUcn2rzq%g+)bx__K{n^ zsP9`Cah zCr5gaWp;Z);A5wN~QN;C;RHkr4 znUr{%G!q|#g_*iwZVR<7ZSO`h^hIDSoY0zb6n-)poM3*4UP_y5{|FrCXIvJC)xRG3 zvhxe_GP|IV&Es$PU*q!JfgE$_uOSP_xY5qV8y6LdaJ2riSDC^(BK$=A*MCmPw|W_- z@tXD()Il?y-?)bz=Hx|-Hq5tU&~Yq(T8*vtt>~!bt6G{jk5FyL9)I=@)PFs|uV~lz z9``A3ex=8JOf75d(J|X0@=;_Y2H5n=2Jf88pz%)nKmRg-ZXLoJK zv@!zx3IPJwG*VzcX;YlR4vs6-{Z>EV^Q}u;S>>qw`^VDF;~T+M9o_Z=9~3cm7W(H; zB|=4B^30_6yfnh1=N5np_D)eFi*UN_z}y?gi)B%=)`;mh_uDo>5@p`K3GFKME&*}? z4RZWmBioAq3=}!=#Z-s(K~>Wgs*r)un&*zCdAmxGNC!uNU$mJ@gMq>Cj^KG(Be1ya z_#1y`d_P{>Wf**y);;~E*EK`FRrfI{bRGkvT{ABGFmlF(b%J%iX0K;&i-Y~R210x4vYB`eVKjbK3)S?^%=0*r_G&?toK9SESn3M7g{PYR zSE^#@c7h`^>m0OmuZx^|+f&`2GokjmF@8@t+n_552zt zc(SU5r!TQo*4Q(Ul!RE^!Ed$)`LDlJEW^;pPAYa%o;aq^a(^uzDh(!mMOjqR=FY`J z_=UDWzwPZghS-aar{ow1ny3WjLEA~Wv5t(+_!YN1QqF%pb+ZnpU>zjf+8lZgA-str zqhYc-=@4VxFczUIlSJ35e+|3rXd2n@HEzEy>1CWvbm**SFoZDNgFbUMu5@?a3 z5}A@^f4A!kk=izZZ?VXAFxX*r%Qo6ilo6CstzA?ZuV*l#LCo6P;YB|3IcI{!dlqW= zoJJ-$u5s1n{;%y()~@<}>|S8(O?=)(JjrsA@d=r{!J(n8BB0&}n3TgF&21!^KG}8$ z`*lqHwCI#!1f+uD)ks}!O*OVWFyy<#AS7Qs@iZgDrp0yWnkmtt$!toA*$n)WBx-K# z&0KJ%Y!ODB2p}l|8S>-M*?8Cu@MG_8ab65EQM7MsPqXVE5ST*S%C@jgPC$;lwY4T) z=;X%O+}F5V)SHR5L#Z7w0em4hq}Elt>vlZn+v9N|^qeVkh^Sep1AnPX~_;(ndyhdy=&) z0X5|9Zf|tKX<71}+K~9J%jo*fbz!j`iA}3ARtEIea}oh@h(p)=h{BsaD`<~(()W0< zXpRMk3?YK$&7_+tHfe;JcPoDRZ*Rm+PfF zAbhG$r_Oi2F{EsJNKz{XQ}c0Wx1l$l(3+r|S+zGpN%JQDyF`iHU=X`gyEFOKU*;U4 z&F~-Aj*4Y%0p^KcL}-8HicBWU_-6M~|IJeVPdV*7?*d%QSY zWZa9Di>>zb-qR_7XA`L(ivILM^=MAiQN+)YGpBy}YP)JKAb;+LoBZAuF(-T&ypJ(! zyz#3&g9+a*;=i1Tzxk^5^SIU$%rK#uz}5ydj++BkPiZvwPw#!>hny>=2erG>8`L&F z$4^njsWs6@0b0|}z+J2e8T^4%P`jI7`|FvN3hIre+j7tk$R#qxsuG!fgkkgZ@$^jJ zFoZ(jERa?4w;s^(|8kPa%qX~GMV-Hg(e#|>&aI)N4_=8bB)&i_>cv%fvRYncpngPG z$NPD9rVlN$6AaHS9PMA>mJbPo3#{IA?JIrqrg)IJQ3e)T*wqiPE{H=dpwJ8UB| zEmN-+f{V!WfC$ogibDz#axC9=M-H1PD#R44nxD-dY2nVHwveU-;rfo zJbBl8{;e0^k*J9LG_Jqq`;D2;88)0DoME;xBNa>~eY|Hsm;^=+rQ5oB&Mb^IN?zap z(4ObK#{{JHUqnSaI%?+^R{@8dF|@(@fncdVJytw>+RrXVH>`W}I+vvGaD@jB&Kj3# zpCY&aXPDE`;r|WWVEk?hz2Vp4d$PccJO3T<InqaQ`o)t)g)OFAfY1Godr4%K2V_>5 z_%3@V*-x&>Qs&^Cclz$TdpuF$vpELP?_3q-)`T3Y*L_?XyOYb!=?sn4?RA`(+cPuc zAcV~tm&XB&FxA3;jMI^PVjh3&7Lh`kUQ)En|! zH7n4^7|x%B#h$?oU=WL)i?JX+s;VzTm~4-D_Z>k?Gt5u|+txw3j` z9K&JRo~4fEi6OPIyF62!VKwHIn#|e?Q9R%U0M5c`gZw-Gk)t&#|Qdxxh?-rhA-ydiyrPf zDkNSJyVb%-fA%?^Y5YT+;`Kv@^VHC}9BfxL1@w89vT!o;1a~P=<&gXkO&Hf4nOb-p zYRg!~L!f^^czxG#5wWD-8Q+S(c^?K_S2dh(UVKP$3<{Yr3=M=tLNarz%Wqd2&ey^- zku3;Cyw6l;V3@<{jSdGP{P?Rm_wGys_)fPc4S|rj_$s)exQxhO*-MwQC_BE{yMs2G z1F7a5eE8_CZMKX44?;Hgn4Onktn!Eqt z`f4eN)I7|v;nvkAs^YxLEYHCsw+80Pa7A&be3YszE^vytH_F^+zN$Ix?s&JO)??8Q z;t!GP!*W!+mOj}6G|pLB)!yogBEq#gn3KV!<~Ao_X&2w{i=30+4PDxfTj7>d@qGSX zaaymh%v#fot$%&(65_s_Myo`1qEk#!el(_Tv?Vw=_AuyoLN|j#UlQpy^q$j(2W}k7 z+|9(E1bXm&=STx&R1~|15yZIdYR(73K49H-xaUqC{T=(^_?e;FQ#(esG#I_#Z@#dr z@A$rRh^1DRAatEn6N>6dhoL0p9PL1Y#RPtZGGHt}ka|nP+`@*?hAP);hGoh1Rd5XF z;*e7V2xH7csf%+$z6I4!M`+K*9xi+VdYPS>vxKYdDO_^qX4<^;{}es%Q+yj%mV~Ps zs9$$R%Kc{ifz1_%NJ9L*yc6>;!!S1nYVyC(ehK6?6$^)e5OP1yF{jR%)(naB(*AYy z)&MvX(OQD5C_hUQKbacLX$gt*N_*!J0=Ao@(Um& zg0&ML_$$Ig%e3X*y*2RrwWGJTrUXht&Oggymx{MM)=o#>L5%d10}2A3gI=zRgl)1{ zmVE+eey+AN1wl?U)=B;fpwzdgN9J$tJe&l!{g&=N{^F~V=<|--VF=;{zB&{8Us>Lw zcQ5U>4)kqlGuDMn3CPg3*JkEG{C7Vf-zaBsHR(|)9YSwKpCmFMSAV-{W&2gBb?gut%pu=<`%7|$u-GK`%1=~zx|LwFxjfloeY)> zUU`cp?8Vul{nn!eT{S76oJL*k7;;Gtt!JtTPk}H$o13%eD`QHOY?42)l;u}#?H}Sw z-{Jn!H%t(c(?$^(x1iUv7Be}(b$X_l&w7|;ql5{8`nNdpG6_8q2``GD+w+^N-nao0 zM$LD8kQLFMfB5NAlt$K{ICa08A$LaOeIZgakvB-rTb#;$EQWY>(?(fs zse$?W*~V(%zI^y5o27dI>u6M&a#1ZXjI4*f#m~TUi&b2gs?NBsOFI$NtAKv<8%-ka+v zNmJSx>C)ix?Nv+23v6&=Nc()!^r7D47xwOes}*rgZ16!LL>RNsPrfwr#p&rlhf#ZA z$)IvInXhUXjdKM9eoeIu@j}kl`o}fuB^}N#JU!W(wDN6y^?dn@~Ddy49$LTwIeny%K1sSP+=;{H^=e0R8E1!XfCfb=d<~)8*DhjFUcPM7F4>#u443 zP7FBA(`Mpnfv0^DkAKw9SBegeuf#!2t*tA2Ac5VtMwbzw8JeEPXW7PYpzyZMn+I*) zgQnbAP`^94uPYXwKU3fE%(Qi=>bDhwPNJTq2Wb+^ieo~#z*H-4130S8FP~)-53SXV zMU>rax0y0F=77Jb)$z?oNb(wTG-(1tD+=v9*j=9Z!KWHR`+&m2X&PO6%9|;h>!QnF z0aF*92ImLOZzQlCBEql2kHL!M?L^NnL|t#*Gad=7=MTkI^hCyc!VZ~kyI<**RXqcw zR}a(qjT`h;$!tU0qo64(m!6!As#W{pMfDSYCmbJhTOMut5(G@W^f~lE)u{c{+*OaB?j}-P3Wz@u;p~>r@*od)p)+Y5KGsZY4cJ(~kef&xQlf2WM0t)@j4g zg{q4PO@((vZQ}97+g{6&CmT0!79+;EBCcfxu_+`#MFBi3kkDl7f?vzw2)uq_CYN>l zch)>Yf+lfAm3`6!Fl-smYDsvo z2Kj#ZNqiS?YPw)<^Xi0pTPF7!Ouy6Z5S|XcJ^6}zF$rv6vV!Rmm>K`SE>t~>hRPx9&;fcCF?(fgEs-A#V$!qYgPh(sA;c!L6ER1w)taUTNk^pve_vPOO#V|4kF=#I%@ zzUeUZtlf53T&Y<0E$6l~Mty?{%@6_ES`3tKnor9ES|1{nS1t1^=SuM(K7IO3hYW9M z`e)j5G1-fx6w|H`nXbP}3F{AATq*4d)4Q6Z>h)tV-ePiu4+YVA?&7-F$p!qEQWp~!2)NE5ZkasqCBC(ppdt+}aXFMS; z+5F@T9IAEYe3^|QaP;0C&rFYO- z*?bISRtSK%!$UM0?3QQURK>W+!zPg5ATxvmJ7dU3^Qkre!kI0shUBaGFuJW*~j*G@le1k4CRgq^Rw_9Im%Bz;aKc=iN9VMvjw zrT!XK{!V*_vf9wQ9YC_@4#1X~xkdS9skxAswqq4d+VHOMZE(J9bJlYeweTKplZf!< zx5*2`7_oEFOBkx9q0n%gyBQ*Li}8Ga3wHIovIx%wLhy>oq`y-YTD4c(kIRARr|})> zOnXSRB~MKbY*T~o4sWwn%(NXz8=LzO0hG4bKoX@|mc& zO9pxTB2NuuPSv%-(FbV%jVyw;559nLAKf1lqfH8oc?;D<8hc*R*`@yIsEEC_qs!xp zZALF3DO1G}p4~g_At+fOx_8+_XYbw~P*shn!JVSMrpfZ9h8}Mp?~mYhGA1+I*qnZF zBxg0LCx7mAHxUREC{<}yqYrFaesRpqT3RT6o<8?oazThO6+<~={exi5nbWWyNf1b} z(9ziI=eUG(amvSJm=4pPc{{4Lk-*mJE9I$}X20VKVAHSZJs^7E3uGhe4xJe9eol99 zcD9R)n{%dX&a6G@=KRBPO2yQ)w5YJwGCWO(nd`IyF*%krnuc;Re@@o4p`LI?nVe^w z1z%oSsOCND<%r|Cn3)~AkLlPf?LF<22^$R)hix9;YZe-)`#R-z|_*IO=1 zBuWrVavL$#u~>W=K?r1W2bzQ8T33#K4{2#7>w8Y~6Q6mXaHKY~xG${!jQR0JG5AUh z5OC?oKTO%@80#M8cCh%=Cum$tya_)#85lNOVhXQLzKxg-`Qje~ju^)y2i+-bxuXLE zLYNFwklpf_tlvjQrg)UU{-cwK{_coX<*dO~27(BOIIn9H1^BqgYpV`WPLi;8rM=1B z5K;#^Ym*?@Q~Juj`AAt|ZpSu6DDY_1Ah@<)dB!sTwnIY6G3)Vfp{f_Qknlg8ePkyn zWgXE3#+3n)S$u0+ysIN}?{>_o;1Ju}iaUP-I8$J-9v@xDx%NJbwFzchcXXAQB#9VNh1U@fYhR8mLrIS#2JtwATop@0S5vCiAoY? zq9zawgdrgbAtd=d*q-yA_cyHdt?yg!x8C3XS@*r~YhU}x^W6K|djsx4lIK0hlFQci ztc6v$=L!q+1Z}y=)aN0@^jiQ&cK1{y-XB&&AU+?hjDdzw8|K+S=%6O3!s?lT*X$JK z^Jhr3(Kw=2c_GvkWI^GdaDVb2$#v_k#4WtfS@PPz!zO(;@UWDmOWGR z8e6;7BeNDZe}#wfMUlL945Nyj?gcl5Q{>7)i;5a6Oqywf+Q^wHbyV4B2 z!C2eWz-kc+g)%LsT3-mH<`%b;`p*xtFWcUr6HclQs?Qxy$H$))ZpB2kO<-gnZK0EG zUscDCxp$`y2vZ6K8a!)DRoZnRJcJXDTo6UqnUKJ^{Ehnd#nB_WQ<8Xmwzm2WVH~pAA z;G6yb$^hH>6cICQIx5q+kXd^=R=+Us;6d9HJ9mhI=_Pj+)!naS|C+Ml2vkDtPb;&1 zVjGSr>seQAeKNs5#P_rpQXA@+aZ6wi!i4Z?PtVp_XQ^&?_91qQJC2?!gia|B=q3K3 zl5A4rH(HIzc%t#+Be~Q+05Es5v#GrSaM6c9Ixo+KUfnz~_oB>$Ka$of;P-eT`qHf7bWKJy@4m`n6Isq*aUQrYIPq<=wsi(Ma6TS%H? zWdp(&fxN}radQ0V4*uGkIiF5axm9E|xF~0u#al#o3uwK#LD5_%l1->6lvB{BT(C-I z9^{=}VRIzc`I94_OMx3*3ffxRGXMI?0mtF0Y@8kOJ2V#AXtbH-QDUkj|a~O7SS$Qcv)IZryl6FtGM_xH)GSWE?K^*1MEqP z)Q3)*Gt3TQXb(GA*qlh(&|J0 zD}8gp=9;L9x$CvFlIP-N5;z3c^DbG^i@@2CPUyaSf}oWy&V>Pzn@&!(55X&79j1>{ zeUDcq(x(h0g+~RD=HHij^zGQYM7iE$fed5U%H`5}>{BcepH zg=UYD)fZWpE|D5&jh_4_EA^T@tTq);SH*}(f65f{e~M;#KZ z>(6m;I5oZ4pCjJXN-Rglc~eA+{nn11<0M0Ir^9(55cd8-Usfou(c?apOrd`1 zMNzu{089HPMf&Bc$B5l%O2B(<*QWK2s==^b8pj^uBYhQg!Ule)t%Fg`FXa@`eaggU z6L-|&gvI=0<^2;ip5Vz^dRi&M#<2h$ftF$}}}iolOA2kdcS{V}{CugcXGTtxI3 z`ZDoZmM6rLUVmA42vQ0>Dj1HH<`^W4Luc}DH-}8jwM6PV>Sd-_K&R<_+F&mi>961y z?qG`6SBp#g%0<@UOm_a5y*yLz2kJ0!@FW*L9GO(%Xg-tbc+>yIB&!${(WbKsrO%X? z)Un8m2U5Up%*g|Y+F=C;QEJsJKd{nK>U(?uMfFu``X{C=A(F1JViix@X0?!??*>vdz8e(MMf}_Gzr-mW2CKTb1^!US5yr2*N zGM+I%OhfAD<}1rRH&Zm0_3GRj23-j}1$!<0Ks8X2*pYLn$3EzLHy{L=qbr(OeT)Gy z@oB33lCg2!6rg~KNceDI>hd7a-gfT8;^toGSbSh+{Y&s#i7%gAR>>Kd zB!0`C)3jVQsPL0@l;CnmKYAKT?o0xwiBqs39ht;VM(Yfn%@Wu0M7BzDK>PuLtbBI` zQ{F4C&Om0c2knVYVHDJisw?%$lEL`+&|yPs#{8mi-X;7#yEcWIyJi*#||xA3eJJq+tw6f(C3IQu$TGH$Sb$b2w{^zfZ6BuMNqtu zBw`S(8Thvvq@|~)(@IJSO}&2E-?Lj{P1`$&vL zn^-@sV?nKS>KFQA2Yt7vJGVl&oO>vb z{SWO}qRVxh*TwyU4j_*bIr=adkPt2cdc$GMzH(UhBEQ|>@7aaDqh1F05A4ljZ5Dvq z?#aBnzJFQ$<}vj}WIziOPab=_oUlc?u!VUu@3Pe?hN61q1w1aaj&)FRdaDi%-_w~i zU@AEm5sX^E{0!Zg`q+0*&)2-erP#HN7fqx>ZT>Mc$#o!qDDepyz#nOT#oK&K(492A zu(rc1eUd)qeVj z&7}tfow&-ex~zjWHpr#-UY_%jjjqnp{zmxA1zC-i%so>-Hr2;GLaWovB0g=I_4$-^wtW{YNb<+GQlhfNgYz;;?;DJ?Ye?m<#fO~bOs?WF z;ZQm%N4i|lZ)=EBrLqLDP03n@eRnQwE{p>gO+(9ed)La{xVh2CQn zLNw3RSJx!Cs|%61$At-#tWn*E+HAh$x z^h`DzWFAa9Fd*&ZrI`gSJt$k5A%V}e}MZc_xKti~-u|vMcr~KSBeWr!4+pKsaU#*@r0mfZ^ zVxExm^3_t_Csjxcj)?hckLqb+V+YSI=2B27GFp%x;Z;`xFED*<4v^|G9+2vC3Tsj# z>ucn0zxJD_16b~-naKl-GU}3hM_ldVHIw)H-giAVy%4berfHnrV!hu8I~VKg3>5Uu zQd5VW6EJUjMD{wyB!lz*kQdhdUy&3vL@ATI#KkQR%YsKr@`y|7_5#yJ)%G&nH@61n zqtBXc`?~zfK>nSY-vaJo%ao-_P{lW}U!sWOX*DI3Ze1hN57*75TSWk(u;51E6GI0v zrpkk-<6{|<7pEyklDx_T8U-W1S6&W!2!Y#be0H_aQ=%XVJx;6aUVp$2JyWl<1?$wO++n?-uayv=5O2dsp`(Y@fb_w~P# z#||p|WufU+SNt+=sRqy^+sl$9okuGi?i_#Md8qrVBJ16@y`=U|Vu12W(dS zahkA&baJ9iu$)+vRD%baKQzFY?nvAg?M{4Uo8SJO9$oQr`{}hpcg5(o-p#MSJympX z?AmGYt(*yjWtYW+vW5OC}8E6O^+drHabcYVlCJN_U ztbFps{%WQG>%Q5@;Y}ckthsmz)^qZcFA+M?J6MuSOQjTD#-pK2)nmN?YdiAOf5StHmwV-huGK>b`%;mziz31;c_N>q8;AB_=^SkPzKry zWm)rbb>3@HZE7kb!HM136#j6qe2PL-XbPlgJR6GM*W+vW;)cRkEXO`501S0 zVlJuB&5Uokr_(w#Qli@|#YrFok|ei@v22te&Z|;NZi4WXnvQ+G8PWSrY^_NI=ts&c zxs(l3t9!mTZoWVz{X4(8A4-4r zSQ~EIP7MkNT%PEJlU?)D{=>_Xx6)vXGQtLYNrK)Q$L5c_I9qn#;fzOZi8_DaM)SljIjaIuH4ZD&#+Hk4PtKf>K+>+{3TN85b({sIRe#2)itp6`s&B*(3#awg; zE8QgeyQY51K4C9-h~XfPxBQo#p%NY)%F|mye9f&ciUTj%eGxrdjth1-lQq34E1EJX zZhf+H&KI&%8~wKrua}jMc#~q@Y$F6P@f)hzMjW&cx=zzS5fsFM>7QALzaSnNeCe3|0*Rl0t4$iZA^xd62>tk`*)K`d7cZ-jh-J|_&-3LCHn{nn;djt& z6rP6hcdC(A;2vn69Yx>ha_Tit0D%)`a~F{Gb|9 zhz>{F%zw)7?KUAawdlRA`y!AF>W{t3Y-vtIe14CR>@*=8dsDg~Tr1)Cfbi^9%!PqT zNAL`eax>XsI>Z$^rX+gz-3QAI6BDD__K+-ugRi`<*FY^=>99+M2f_drO}PoWJebKM zEvSeR?SqPtv8OdqZbJiM?lG(8Gq`GQ|8Ud~6|8-_Zqvmf)M#jTBZQZt{mWS6LOcQS z1oFVE+gm5EK}t*ZA3sJK1~_8|{4^bHg;2C!o^+%<9#$Se4NmDbs9w(z<)h2vw+jX% zCQs84$pmop^@{sH?hkw`-;V-DnL!DNlF~eQggm9XBGS6~an!E;o^GTQnu4rS zMmJfx45{&j`zfbhD$gKzzE|BA?o6>+A+*fN6(3LI1mpxckAOMRa|-1MlFTmG_!2_v z^y7m?D4qw+OC~$-8K`?-R$Ab}kOdyg0xp`;T>Ny7B|{|=MqH-Zm-+&4rp>>bP6I0m ztnVh@KT~OYY};OTG^fCzki7{p*)T?)^m$13U;ZJI_;*&?%_-XpJGM5LjanumCP}U# zcU^*N|FQO&mK1E%-N1)^O>N7COO> zdf!(i|0>nxiY7yo?X2eOzm>?st3|FYzELkX*(bOf(stR^-ax-kKy;xgUcaJ$GhGUR zzc^L)>q0_QkPXz!j{S5g5JrAX9++3Qk#9M^HHEMH(-q5x@w$%|(?!3V_36Wnil!$r zt&R1fx!v;nj^vG%5_qg|dQWnIBXTZxLE=jL0^1ejiXzQ!I)7)%aerpO#T1{eum9u} zU;~+R_1!ih$jp>NKX`L_fUCdEgXh*xlPIIqYFrRE6uZgE&o-VRQHdi;K#<(agr1w^F{FLPf)nn@LL z1L5o?S<<9{-v0`;;4NAqk!U~TtEvDI8;9N75!}0V@bDeBuFZmV6$zb4XGEB9Ncm{d?@N9mnM2%E#GUGB~5QZUw7R+coxP)e$vh(;bKdzp95_sxyI zs>*d+7~k%(G3@=fBG-21{ch_p_nq`Zw2cMvHVG_IX2P zOeFCKjhL-JEgzw1G6zA%9>l0^g3g>u zYG6gfY&5)Ao7?ryUe-Hw@^a^SNlRMhaa4t6c>n#(5bSSzHbg4AlUU&@6Y&~aZ9Br8X{?nE!=aTLm$q6p%e_DQ@?oQ8gRpRwUih)w`n@{IdbFG1ng z9~C8NwFO-uURuD8`gHwNqjOj3S1 z@s3xNtZ|v8Uy$X*ekHt=UyAq%A^GCVq*pjN*vTtog@Xos4bH|S?V;aV(3Z!{7TL~E zyR#^MVPk*WIdy5c?m+`Ym1ev%%?5ZvrkqJZPWhz|Tv{2wm1ETvN;q@SdI?U`OwcdY zoQ+>HxM&mrsF?fFQ^Y3Huxc6XQm<27G*z71j7CQ!O?o5$MA+;2LK0~Pb}1qQdNvJ> zj5PO&Swo{e!8TdJK`{dy0bJwW?7Tk7$r6H;lTSKIHlhM8Sf>{mZx znWaIusd1AN)seI%%GvTpT@!CQa(8J*gC=CAXXga6LNTc^G%9R-XZCc;n|1$+85g2m zz515@!P}Pqw*Oy2xtn|Y<-qE${viE9OxM%zZj_FcA*Jy9il-Cx{t#h~?FHf)uPc65 zHntA?+k`#08SveyhZbxcCUfo|-=$UDpx+w(?r|j7!LzW-_tyQ2$c5|tTNk~z`8NAg zxVXck7kgu>?aFMuy5^tJKC5ze_rzRDD=%_D;X*g0&h5wa*?Itqu+iK$N>q_?YJU&tpUu~dD(_Zydh%W^DdC_joUUge_7N1Dvf3_*mE1WgfvU9`7 zWPYVr2B7}xJVrj7TUy)z?{&iOMV-lLX!vM*D(sPWb`Wb795<<#zZcE(%20!eeK znJ@W%A?`v|G435)gn$q5Z@^&MRR)?fZ8ah^Zy!;afKyE##FuOlg{UGzHcZsi1i$6L*oMNYZ zzjOh&@7b{A2C_%RH14Ed(63*W+(c~L+?jeryr~}0ARaGoMcK(Zyt=UK=M;;hNuz}w zHu%$M9xFKl7P|@?JHOXf!mN|o@>iCy&69f|6rtAScgF1F+JlA1BbwMcMb%nG(a@<+ zBwPd(>AnR14~{!pPJ?Rhzpr{a7H-~kHXE_A$sjF2qTKwNAxZmcW`ghk zcpXVURM%#|M60H^{!=kACaO~rgsJj{XD&1X|3&?CKYg$bs5E2@*e+c&`JqC`njQ@g z*RP$zrUw{xXRFvR!KPiEUoBv^Paa(@e`uanU4C6Y&1N-4N4S-1Z<|*8JpiA2zJ&G% z0V*4V6CP|+?8nZGo*(WD!ahNm)*Qq>ks(VdWp+oFm`&yKO-#)T#_d_9y znPu-wOS)IQ1*y@VU2zvnc#7+<&Scxu?Gu^)yOaxMW!KY2lO^vuI~%H)l5?b$nCtu_ zJNSGE_sxIdT9g@o@ei*@1i|Fsn4ouG&G45TmV9?O8@@;U@FAj8V@zv=)Nu=~dG;d- z^M8bV4Cpj7ah0`n$dUvJiyuCOTOE-D!jX9l z2A4F~Iu3X_PN7HPHZ;rD=GO&+g{rXgfUxN4Y(K%37k+je)pKXLdQ_KashL%G|dqE z=+Q=r{G`Y!fm-L88l)~*=MUm8Tfp!Z_OmF(qZ4Z;YZ%;4vU@PJ-Pfb|D3X;*O?A@b zIOGE99(zE8OmXjK_65|5yiclj^ij&CF_FB+KCT;~3@E0Yj+&0^h5+HGb{S-Hro%m= z2qzoG_Uy+?Wmb2F=l4)pa(I2*XTRxJX}qkV#Zgo@W@i3>!Yr9+Jki-}(HD*?%+mv} zds&Q(6FFoe1P+OrvJKyfJDZCpW3k4>+qkNlNOtKxnQx^rfG6%EjO}PQicx@uQt zPL2-5r>2(Ub;0Ys*;n+v@z!XrJ!*eQ9AeU|o}y4M8O#kVI%KEozFuaEUPh`x>up3x z{s!LXQ@7`0-d{2%8Qd--Q;voFW&E`D3w4umRs$8apqvsgL4WH{m>K`@!Rpfv!{D}jN*@(OFgC75hfgiOd5^ZSvNmR)9sL?!tF|f9+=Ng6w zhBhK!S9*}dlbdk4&iNoAAbM!Ahz;J0I+ZJl^?~&2rs7W?jS6c;xjrZ8h>5P;p-k-` zRrKw`W@B4$b8{OV#wMGn(qreMzseO`8V6TtZs^Aj3X|;Jxnc6jX@i0~(=`J;e+)$| z;}*tPgGLlWFL@tI-*ordIg4^roV$7a*lz|%u({P_)VQ1T46VVi0Q0z zP8l!-y*N`4OGu*@vX$)EFf(Y4E%I+6g7$cDvdM z?iE6UtiyM!>gpb9S=dM4W9bJAK{two&U|H_G+bCf9OH|X#DQZ}-O-lW`DOdikLhrI z*Y#InOlV?A8y3sLl8gBS8VFt}Ajj*JY z1z(;>c`BuFdu#KW7ZL{7P$WE{6v-S+=9*%{3puNEiRe?Mx;>Y9ZGH=aQ(I3;lO!cI z=BmX}?QPY!bhv7ssGr=<)o*(jM_g85FW^yuOwDN35ZE0S28W9p;F(?#TJ@NAH%M{^ z?OD7A8zQ@X%nWOtRf?y@D+EVKXI9%z{2x|!rK{IU$!nus5sBUTGPEZWcTeFr1-b)F z%%esPQ#nPo!~`YrmMQkNJ@8HkhvB;)u7HEv1TFe91?%#9pJN1~7>|&+6f*+6) zZ>V>PjEQ+@WK#|_$09RVy(@V6((xZ1Xiql;uLyS?hrGVDlYR-yGcYO?y0-Ud1kn5> zEeL4_{Luz|?dQ7H?@r#H#W(AeMNVRLGe&RDo9>0{~HFa|1^A2ZWFX!evUdQ-H zLq;z=4xiiCD`E%7%t~>8+gVRwU1%mO{z+a(4gSpHvU_aJN_0$_HMC`{>n37xN;#e^ z0Pp`cq0M(ly5sMd>LoKE=-BXS$R;m89h6M%^fWvMJucx34&Yz{zF_2>Czx)hH7qnI^=r z$)A2UcbHJ$3hWKvr43LDFC;ql9Osi0E|C1g&NCA7RUJ87Zv^TtILMvTsr2d_;CI`6 zw=uXk=+wDGis}&bS7`IdZWBEJ$L`yVX5bTXFf1~dQ6mZO4lFPM`VO7c$@5j`({DCU zofq1AWgLl=7YLqCe2*n_e?%na1Z6ilA0uPmLOOWyg@>r{dIu2y+^uR(RgZplz>TTE@<$qaRy4HNBolHES(=T3^3ODd1UdjPE?Z6Y~l8LbueYDOjOd zd+U48+Swhl!Vf9Gm6Qrs!*Ny^wp%HptKR;};Ar8Uib*_7{9!q?y%z_mjTb$6)J+ql zWz4mfJqj*rJ=8|t=aJ!Z1s8dipJ11uvj~$AgFFhiBWsqNy^!H=_2NL(A|U|V9J;yk zk&o!*GrQ@akkQ8SX7>zbmkDknzPv-4vcoMPpyYR zUzHB^RMoSg%{>7belad@HTiAgD?z_tdM`>AsW*wsY?-Dc;fF2o>7--m4zFD#<}HbB zET_!;Lsx4#{0`So-2BR#`E|XrISJU7YaX#^XxM4JkIl-X>f1hrLS0JgM3eMeO0Byb z>Sm|@yp1Y{hSopnZO&q3*?Me?^?(k_rG1ePX(W6i+DOVIw(&e@FZ z=qO*z|Gimln$SI%(_DQ!CiseTyX9{1+q^tyd$&*ons1FM<9{hR1tVo`w&!nJ2#{f^ zqkAhhm!VCW>g2BTA(FC9lU{7ugWrR&*d3HdXBhgH5T*LublHWVygTN5L0!pnqYt@1 zfp76P)ue3R;qVz81KG!`5l<6vjXE9s$*^j`c;8K{iyD6^w4+RQ4$3L&s5+o2Xm8C# zi1wn`qWR$e1!x!wHTCbRE&c;u<0(^{417Q3&P_(Oy$sd-G^ zG2-7HSH|Ma`dwqO^&X6kma;_4ly`;q$M!Fj6tZr`ba%%CPE1BezRivuxH8vT@7L6n zP$6^&uqfAMqmP?Csr`c&r6OTXqNO68dxbvHY-4JWCXacLdwYNP98e3QUyeoO#koFr z-rZ9f%Wq1E>;R+*Zv8H$n|ikwCwG|`i8xN|4XXT=QRUY;m>NbE9jBe{BW8}jXM(wwpL*sv219-m;{1wo1g9hX> zQ0|_QqrC4Yt-^zT4Iz>gJTLXRsB%1dQ7bW?Yj6CFm<12DegK2v+x-2xR?raUZ@`|i z>zl)0uu}4%8$2S15$>M|Yf7#>fRBMFKbZRwc8VWYwW~-sq<+%-$&KTnd_b7)zdqy= z6sNllTnU~?p$@&GU+fD>nj&His7jQ`7E?cF-jQEk@ z9iB^QBypP z+-ot|$Px?W6}{w(E-}3p9OMxgWp>A)6=k+_P-%FZS67NsSIOTwIA%uq4FzHnH%n&+ zO(#`xE2?V#kR{_V@&30ux~_K zRoo7w1E63V0u#>0Rg{^b!;<3rTqzevedQ_+_wPtAEY9zr%^;^6H`)#1C^Js{GH*in-OkvJ*6F)oer4~=P5v$Wi6hoiSxuTva z-!C4^sGGro=U&s9u51ZsqSqmApImE*-Hg%YLauRV&?G&{2S_4i~@ zbJ!#W?mIp`+(?OO(&Mwjy0s2mWzL^WxZM)CxGXU=rt0elG{28`tC}i5UhRJmQ^~sx zL!kECZUomBzw)Zy(G>=oUttt*UYCqIsKp-kJ=kILDk<7dbAYyywqxR1f8SRyO?#m% z6&)SbTZ3)=Fg5TphK6L1*8mXKqyNQ2Wg4o*s+Bs)U*-^E#fI?fZ?|1#PF441233kx ze>-Abtouxs?n)G5)U_LMZ{(#)Plqjf8|ZOc`a1jE}`a`T_KM-t}OAcr#8MtSGlJ-`&F=gyfM{D;085}N@@ z5H#B|T-_UIX>@`%M-hjo?Om2=G;2OQE1HVs%EI5R#nauJZ#(*+JQe%A=zgxRej(~V z;<>yhkpQ#mP{zW5Wi08j_E@sp$Sbeo(wso*OY<8x^rI#l*kezMy z4?!n*i6)Tw)go&dcE2p=Sa5lZm)l+IV}1->EagtXLV1B{NoGi4&R>hSC?i-~q^%wL ze6R5In|_Y4U8Pf^L+s6M3jtVJV60J*xJO7($U)IqWa6zRz3c-}o+;~(0^^xBs*Z;h zKJSWXCo;E}_39guCwA$D-AQ~82Djs;l3(eY0e`36hssvIlNh>+YTAA*E6B_B)=b|+ ztqCLTf~(3KDTJ1d6RujdsS^|G{?iBx`!0drt_`}976JDM63pEVlImIIegqOW&AYAk(u)3bq2IIkVYbdx@HT4L@(5{8 zMh${{tw|WYWlD=uu7`vFeRaIiZb7hH*n8u&s6m$pN~_}LL?IJ%bS5t(a$g92RC|&~ zPAKkNQQ~EXuUU=+qI>5VpyRGS3G=Zo()3-PK`9 z)YgCDiqvGYa#trj+mz`$-bV=~_(n4lOu9*D3yWwv)4%-Zm&j8r7Ngm22iTP7+~Jl> zb1iRnILGce?Z#>yOHOpkm_2ji*ok9q?=PX30}rDq@XyECD(`Zmm8*IPf(H&+)gWS@ zM^WjcjuR!FKL$JeemO<^$)LLCOgAxT?beVHW{~QU^4*i((U-@4XfR+<0}lEzyrU#) zSl?+ej@Sb!pxTPa%WO40sp2g=Vh5bPf{D3O4>w&$)n5?!US6!f7e40%;82#-tmEjC zaE)O`t3QpwFN~Lu{o0OKP0=P-kZmge@h8!~<=Gc>U}Krx@ThUlpM2{Y3wGrlf@21y z-}8JiZx}19kmC)NHTsc<6|5j&;KIhR!aogp-dj$xG>(geCi6Ranel4W|Se~3L1fi5{y^+-W%L&<^rKigG1cO4`(I! zxWuxoiC5xHo2>>D0%dkU_!85hsFa3j@X$f-eMe2*YdQMY{AA!;u$|Bn|0$LY)nHc9 zu%=q{h8D+(n)45i`XzFDO~wKjXXIb~U*qqa@*7&qVACN@qQX&k8Fv|Pg#?W% z5BDESYU=6)Y7OtnlF|zQKG)-uq3?TqXs08=29H@&in<%Q0DlwtmNo8ib zj@jeG{T_(d)(fK)(bR$(7Oq)**IS#TF&OHX5%o}Qk6cUF*T^4b8oO$Zic*f_Azfxj zzj+AG%=n{U_pt}H05X#D?*9)agmV|WWJL%je_2Nl7i)t@CrXzqsu{wXol5tRu~DEf z@ubSVjr;Y&#T^{-CBc^50@p0(n%@PC6LnXp@z=Zh^Qw~w4wYl>Knnr~H2H$+G(8BD zD7lD+XEoTj;AZg)i~T*~g1*UW^Dci!u;hFQc}v1t@2Jo@&5*+48FxI=c;QAWV{u^q z&g4+eo)h4Lf#_?a-+~`_mY-3z)}K~%U61jQjXckj7q6L%a~1zXIl#Q$AA;N0&XiQa zw@%!fvf7EI9;j^Ze0~8O?uxiKo$mqJ_ITgFD8mas2Fdg)#_#HMy)2qvuVF!8TVmV2 z{7R3wWmnl>HPqK5_cfAEdh}(M2Lw4;52X&q24hYa2`d-Y&vjuWeC1c*CKe4 z@a3Z&Cz{T&$YZjR{W5MDS(XV-eLfmFecp~R;2*j8t-l7)=bUdoJCkcx4~8sly0|>m zEG@Nj(nWi{(Cyd^IwD&4N3O*AFRJDJlFm?)c>3@O+USa7@RFR(0kF%lV;O{bxJTA8 zT04~_=>j)LdLiRtT_~~+^?ZRb&}DYSu_o0b73yi`Vj7g9zUD$&Pw%gL+*KNpy$%1+8X=JCbkuY6ZMoc zGM^)tkfzVgo4aKJsE`LI-ej=w4gUm%it$`cT=-SN^^BJu4;QYk;mi zac%kQBp2e<0^&0kU%+_;KGjJrt{Pb7H1^m>&2zG6j|Is}@`>1+wvzKG;SNbrZYR~! zJt!L=N;x$49XgozlSLN8A=FLvZWG!wtKeh5uX2^{lrOXZaby?nUK_^t-L2Aqex$f- z@iwlc=z^ldo0gSF@@Hhx1MG0vWif|@N&5BqK=Kb0`Kh!!jKI9+C{n zOztzRtmH0-M{$O>cU|9HT9_DCfjMtXvsZ?5AJT4j*!mKF2vMJJ{(+2Pc6FG%Snm%~ z`<|=73RPWCO|$`~K<^z|%-CnleA<59n>*^#T= zhj4mK$!Tg*;;dH2Uc^1Je|n`J$gq)Htznm_7hRuSk=~ec`E_osC%C~J;u%j%J$3A# z)Mxxn``D(AHQ(;?UUP%o#lB^ zNb9h-@^J*l4DG#Jg%1`D-(LarPQf7dpQpY7iuhw=2`mpx0&QPSySD4Xh>{#vkQj*W z0bBw%?Q(h!g-qM2VP1pK=)a};%Szx1@kAhUz%US(5`kR?&-#-q71#1z?bn#Maq;6THZM{C*{m_@7C##mWW<6zr$+rzT=DD9ie3RdIq$c(TOy8epg z?Da-U5s?3b{(`oSkK)q z(zOoKA0`&Z4jV@%X_u!;!sIU!D0OazM@Hek4CE`mRa1Wu4lCUMPZ|j|WA@)25sun# zD_hsQAKrq-lpR1+Zz0I$)69~hc8WFz(yyCH&M4d@p-zFu(1D%?#&_t}jU|1pG8@Mq&b zV^tBuE?Kj)Qo6;a6B&+S3&3rjz1z~*1N9aDUami3G1?V1_MNELG%GKv!kV$j|0b8N zFR^vhCF=0NT#ahmlNw(LzDzYl320qR+kvHYoaTtXnr~C2R}mI}u-=ymE^`@4`)Cj9 z>YfA2^Q`*JPIWq=0TtgYF~5|E0=tK>nDI@D(dS>p`2}8oXQg8&H>Jny??EGNyqY z#oR;F?&5g!*i)x0AQgGiPJO53 zj6o+t^E+rLa(iJ`f!p;4c0+Mkxzy0}#nkVnBcuLR&IsYDJTnVfn%IBLgjI!0t5N{s zZ~(yFYLStXLX?m8KF~mi?sD$IR5Q%#n;s@ncGEhu#nGqtR&Q9)vMIL&vG3gInf|CPVKu(-$LK(K zSVD|#v!?@vWv(l9{<)M}8Nbu(@ez0}d2{f!l=G$hrPfFFHIl z@)3H?IsN2)=p`x5bstgT)vR{do`#Sh!ApuU0hfhE29t0u5dP!d*-nT-4-!yC0mm2>}U zj*4n_4VYPU$ZcfqDtxDM?*(`-L1?l_4d<<{IgBdwZFP-eQiF?EYadVU?`(E*bkY`UwqZ62skEQOqe|?M^u#(za9T z%yUkp>y|B zJnf2g9nLnGn*>WzXym@e8l;Uov3qk)gG{(x~GNk5e_2)iAehpc5x{> z2z{aOwv_&ph=fEg?hd`%aRqe-SqWY3mJv&ciCW2nnVn;|lWZZ;v2*<%)8T=()={8} zri$UYqx8WHg!Cm)m~Hr|o^xaO1|U&0f)l7Uv|Wp@CxC*IA)T-lu4|25YN!6R;ZA<_ zHRb$u;K7v5+88^pbg0%$BP)rEX4*)9EVOL8^0qJ8=Hw(C(z60c^-rOj4C6yi92KIAI!S|zq z%JVG*8;7^cfm`vH9GR~l?z}k}a{+;Cn_rKetEu7CZ*frB`|3_La+lRSS}`A84bwmE z2kx0y@{g{82Vid&W#X?(OeV%E?Q}p%II!-6!vS}I(${%E{TJaCU9Dc-U1;t`_754X zTJ=WX2am{O7!(HRJS%*<3>v9^NZ+S>Oco|Omwe-KtU@tYWtR<%N3|55r&krnUkASR zkC@GkZi7HeQD?eu!sko!ffgWQ*yPn&;tTOK`E;YP$Z)(-3NoGqhS`wMEzTKUK}bLA zvS15im!)|m-^Q^6Mn9u(>j&r@=I7#7wW>N?O=e%vFyy~CE>n*glmn#qLm!x_uE?06 zUxG2`Q3BrP6Q@JCuRpmj{O9;cVzsNERnUo1-~7ge_lxQkYNj`SJ9Cp5?^){vsse()A#eI8ruVx=_i!8ak-w*BGhJ@eG~i!xnyb z3O7$mcllhiYlKk)tC?8ca&_t}6|(5(YAC=9?==x>`Ri$I*{+c~2nSsH;9;b!z&8q* zRL|ZZ-s@NNFjBEBW{e*O5ZLaG*v*4Lj2IsK#1_r0L)=U){6JmcpZu${#mC9Hu8XW% z{8*gJA~o-+#nL6~dKgJCAFmsy7^^NXv})3%GQkj|ETnk4{dO>N@@hb8jA( zbl(2|R#r}9>6CZb;?`8-ce0>z%3KhuX{_5RTc+F)Dl^J8B^PANtenOLtvksL+ATM7 z7dJFhG!-frR8&+D5<~(71O(2fnft!a?|aU9JkB}a$N4_a_g^3SUasqUe|#_3^?YqU z<@MD|Kwdj$ga+(FQ=$^#4H_aou0hoX4e7VlR2zrLSTPvD|6)Z;r(D|}I+d6x>~Wdy znVUy!NGUsh+d46^^Zw&29=JVyC+8w>)^1_fTkG?4a08?;=&{nD<>_}|G1c(cpH&mW zzensZ-I4Ynsw`&U*pSz_i#@H{0vhI&w}?z0pB_n05bxZ=Ne>Ikz%zTA zMcvhQ&(D9a={O9c1yEhT$9zG(sL35%*U{zdOAFmTyG?4HIXaR;sm?iJs5~U`IT+;} z5lSoM_f$P-*fJsMs0MjKkyjAP=@E-Fj#=2?tt42fFCbXAKsyt7B5V~8*dD{a*0;u+ z11TbHtdX7{jKdea2+}dE$PY8mHk@tHH2~Uf>Ud*;s*_-p#Toi}lJ{=V=BCf7bXpVt zPikF-Z@R4~w_ZQ@0seH3VDn$>_OZ$#zc%kc_2}7{DXRnnXrid0-4brL$ymPUHp5{pjK( z;m@s1XoxQD{>T-m78U`WlpA=*<%QEgGM3`MXTU8^2F+b>%TblF1e~x$nsAVxb z^;^VFUe1eyurK2)m@6A3CjkG!lvz;vL9a%EAMn86zs}l{2u|z$~I{w=E zgRD(7t8xxrY`c`8x~Gyr>yDKqRUT6DDi=zZNz0bYQCB3E3tz2PozC21oPIGjxFM!1 zhkb_A&^Q5UE?bWi{wo^kiL)J@lK$6vl?!TZuud00s&|D#V)ADV&`GC}j~r=up~sgD6`w~BPhUC4g{$cpjuEkA~A}&p%fM37iD^WDSy=6!%#h$Vuuh3-zT>5dpbFl}xXzEgUIFXtGrOK~dH)On>jgk%g|~ z8(FF|z?$fk)O`n=`~q_iUKR!c*aqkMR^RBB%NFkSuTz;sFfBXIS-IiA=R~MF+kkg$ z08&S4S{VFU3*>De73=uZoveeUjBO0XIrJ^`>k#@Y-9sXn<==wtI$jog5#O<5ArxX+ z!EMKv52B3MR_L5+e7+MJP>7LyhqPkQprQaGe*^5<{-?Cs+v4-dr%_re!5Ix=j++tC zmas7J>EVUY1y$Ua_hQa&$|6m2)X1PmfHlS3(K4*ev7uw!M(5)=M2Rjqp08u!t^oxD zNkyqjERyJ6BILpVpeML_e^#@;Wqi1CIod_;bW$wqlwr@2FTg{G!6N)LuN$@DIy~ln zSkNO%^wQ=4*6rE&a>QR(3x+g_W&ex;a z9r^WGKIT7qv7rvN-)f_71{7cXR{d0zX7;5({c9)QO4lC1(u0}3@}XgrDJ^=JjcVy) zyVH4{#*f_hpXND>28~1`cQoReSV(>lM&<>jO}9tPy|e^^FTN+W-X83Q@3=NBo=A{g zL6`0HSx8(0xTcoX*Y;f7sVZBdHA4E{vS&-cymH}fdvoD5d)X3nUx9IBIo_-b^m(W6arDy|v&jF2+rW0)dOVcJGGE= zj=JzJPV__#z*_Xb7yiC?$r9uI@t+U<#^^wwqrCVffasMWESBGvI(YWtPpcgXO7rUB zB<*_TCQD7)x4R$#naci$4_NP(4Bl3Bo-5$5(!5@k_S!9Z+Tb_*Ai8uZZ`e>hujw&= zY+fU(yuE*LHpi|7zWZ47D`C`m7W%C<7Mc9MOX0sit#?5CYponOT}&F1FduG}6qZ?M zu-xDLkndF{+V0cobK=6UW1DuV8SlwyVQYXd8TADi5f%I99A!sI`D|@uICaBzM8Cqh zSm=Jyyt(qwG+$G)xkC_&dl{%%Z%e#xY=K-oGj_Q?ZNFDnViCXJARK!|0=%)&FuJJXy4;E?i22kWZrrhDjF>>trHNmKAay|Bv zberDpd=#M<5h2yq7@L60PKt!PoD$|spAF`uHh-a1`(mewRU9LmJ`AGkU;G4Ws8L&t zCU3Y5QEyEFh)pH;5)C&O|1y{YTMmeEVfK~nzu?ZHXE$S;23pVKvfp%6aO=yP0y43u zS=33bKj4c@J5F@J2L`i!Ky4tpM~w~rSA4*IGE7GYVUNM6RKadR9rV2FGAyhm zp@y&{HfI|66)Oq!~GO6gOlX({s4ZR+d4W* zWw%lDev=kboe+MA?FYYL8and8<1wNK$P4}Itv2bFNstrh;BcO@UxG|tlcsJ5$0ExK0nIo!SeX-MBDTpsMvn80^I`|V$@ z8q2r#@XJDe0O3t8EDd{$<`*#+cHfG$if@f#nZ&#+Dr6V5#t=$oyZk6#qFpN^DJF2r zY#-xOEl;Uhwhy7u8qZL6eC3bVM>E%U(L1+!XpJ3CYz;T2BSU{9VUcOcb5|Op;}gcW zlC8D>jIMDfNl%-)1}KD!Oo>8AyCt;8LMkVM)RUA?Ai`vd@@)06Esp0?;{I0rMj^?!d=-ZTJW4})5mzk z_zW)B-yH2!vm;@vkH!OvCcp}F$D=Mc+AhYo`nvry7NNp_m`!>`CgR;<^rbv0!2oi* z(R)Jj(r2**&-5rOz^b=!%JFbCxk7PA;n$2PiK5dtIEiP6b!G>H&pXiBN#>t!&7K_oQo2Kj*Phn&vY*>SKJ!ME`d+?{kcacsg#Q$_lyo|$c+`{r69hpV6S=8uL zz{x`(Kn7!n&+{L=?OvHyUC1_(`@hcHXblQj1En9DQ;@5x@!(;Mm2D^mO0&Zp0=7=7p#6P+=zcH#9yo@aZ zyj!1+fikRmuG}m7aUU@%93&x6m$avh1Qk7mkv5LNJm+3x!3V!~3kq8}35B)AxqcqED~ps(qjD;j`THtwL+;o69EvtJ7Jem{SPx8L3sRf96qg9K!saJrKK7D2!kAY8g z8(|GUh|&(n8Cke^H&q8ve{1+;QDd>V5HeT3j0k)8X{!#TKbjs`rtK<*xPXPs%tUb=zo$3?q52%?ZI=hT0J^vfTw2}# z8pv9^(%fOMJ1YNK?nF0t3i1Tg>TjOM(FRzyhsHcYUr&ydB6{SZOZEH#ay|)#Jk}Ho zixCXefHCu>FNh~Vdq{h-NrM5R=hH_LPC~B78&eHiz8(({*DUmJ)z!V0#Hwe`^jBlD zO~%JfQ{BcO43n}r758OCSW;jzkBa)s5=j`U+0_A3pni63zvNl==CUzu`!4E+4?b{7 z7uqHMZhs(S2NE8ktMK9mXovXAP^*H`*GgZUEJf1yEB3D(2Hyv0;+oh;Gs_aY23Ayw zx=Zn@Z$zro-fP&A`b*iqW}h9XDt=?W+YwPI@4geY1~>dHYBw%CCW&^tys>KVOyOW9 zH&?ScdDiOxY^-$aK$I>|yP(_5QSXZXOP|x14_pbP2LWyji$N zdSh{!_}GK<3_VzHINdhcn5|z{eG{*ePP_CqqI7I7bECEJ8vCzEMZm7kYP;1475~>v zkL>D&-mI*R-SwU0p=ZN_3fi}&GOaNLjw|XZ06X3hVVq{qes+oJHskEKQyrH~3^?!h zI5^kbF!GG9c>o}ijiRAGl!wxcGtDx7_-K-F0@xffne_4k9Dh7+$`D@zRQ_a)xb_3} zucz5{31&}>XjvMc+*gZqNE}62qUUVHBTa-Pe=<<;wP6Yn#Qw4-9#9J79%zPx49(Jd z9&3Rdr!27JL@o^ZL;*ru%@Bhdw9jMVnXz%qc$OMLGyrgShjF6`UXn9Kt?%jA2cV$JYd#5X2 zaEH~iWPVWpEl`i`6hl_5Kof!es6d3(Rim-?N|}TaZ;Mxng&ui zO8@81?*HB&VB*e=EYtByDj^6ux`Fr~vrg~DWvq342z*lZs8}Ik3uH+T@lwVXtLVhY z(XRUZ+JwKESbd-H%a`GEK6Ak~R}`>nx}e-G23NoZ>MZN}qmWc5wcz(N6lkv8m#}@0t zM!Ikmj$O;jd~heG@lr88=^|_b6d#@wMXw=C`x&)%T=YUmp!>F5^0W)?hkkT%Lk!8v zu+GKwLRf}=z}kK#*$#s??gsr7HxKplH;pCSN-Z+$Wv03)mA^u=bxS&S;TB>_HYpqz zdHR<2_a1Nm9D~dW`hmtv`8I!>!3(BxoK<80$QNP{;dKc*k9#D&YQeB{nA)p=fM9*z zKGKw6dM=qd%Z?XB`W1lZ;By!i^PJL>xtF+~UEHP}dc;p!f!s@MY(h8Mi#w*iBD{%r z4ql&De$^nT#+h0m_6bLb+Ov|+D5*67qL*6WPUu>E7R7O@dnqI7gjv+cIk4{0$8B2k zk>)lp&U)b6QWlSMlg)9j6=pOMs(nk$_5i}Jy&8XpoyL%up4!UGpKIbP2_0$#!u{KO z)Y?W57nbH$qtNF&q)!3MR2uCtpOuFIB)d_H3W7_j*B)8Y9UC^GpAznj?V*I3meF3= zG)*6s}wEJmx*Fh4m{}_^E(LxE8!;Z+$27{N;#2Xr3XtUKv^eib;oNaMM=s=z9mfBwkL}e*dh1^a1ADYc zg-FaZYzWYAIX?G!hTEffbw{tykGlJs z*l>olF%kC7c>H4$3n9NYHD5%ej4aF*{?oE%bGf#ZFXK4rqrZvX0Lm3XJ+K>xf;GKg zG7=FjK&sQ+iO+xs!3Ya>k(CYj+g)KT_=#Of-MS}8hQ;cN17a3>1glR140&_<@VkX2 zo`(2|iO`q%n~P2Nn3{tO=`qphln5sE&ye{pubXG$mQjdODeB{Fpzf(2fR86Q^r;UV zg|PO3mFq`}Jra@x2g;9!=uH=7jiZq|OqM#b6w@g9uqgmz6(6AR=xm?>5rrVm0@U4P zcY1$`Nwc{OztOI0W7CB}1dzhhrjP`+&VkXP7Zun`%ISW;rj8Zj48Tq*<6OVxSL66< z<{oUZ%dP`*5&rUrN3-h%Q;K^r1+h^TLbzp}N(U!I?s885z;Md?G!VT&J$qZOhS&tfWoWATJ=sg?wwtfDYY(+5skJ| z02`MhU-vb&52P5BoBFdU1GBm1;*Kj+yH~mu{0&weZdBu@$-V259t#<9MglGZVkYtw8PY&Vdg z?qZwZ^i6sxTev8rfAUxi!gbmeTscIm#8%zF1zwc2V2Odn+{8g#KVv{!!fpiU{_^s<-92Vnxo zD=wLdm$EGf-@HDaU%hFR`pP|2^pZl0eKf#sAL&Q#=xj)PPzkc=FU12jmGj7BWN*LX zfJ%3JCLX7YQ&it<+)vW{;cxz&{Al|2{_xOs$cU9{$DPF7`Wa-T%@t*A`2nT>DmjS9 zFX=XkEkeaokLnF+24MHE9j>@sT$7jk&OfhJ|Hu1h zFC(=%#S^}_C|Dh}Cca4(RUJ=Yld3JH`hpsy(GaIGgH|+6DCkdsuLjNwc%Ah?%TA~( z5P8~?+lmSY7qQ%POvEP7o*>-i({5K6?e8|3nq}8UIU~$E15r8DM?hJ?J^zz_Z7+X_ z9=vj${uCh3<>3W`7tbTC!p>42+W)s0Fzhj*FEPn2lo7l&V;86{Evg5@x>f$n>R{mK zV5IK&Ut>eK@(xFV=cDe`>RP6risX?Wr=4ZrBY*STf@99uGe=g>#czRl5H89}731yg z+hY3wrJOZ4;KrAEW{_2wb>d4AqRMsrpbl7LAkL|Y&!PB9YLio!^G<%4!))y(147x` zzk1=kel#a8T2`<4l{LHK-7uB-LO?$!LS1YP{e>|xRQYFoc(SHG+K)-8k~e#wz1@8N z1mWO^hZ|(M__0Q767Hg{mz;V`Bq;+d*Uj>RVs^2H~(?vT7bwRO0MiuZDF#u}Nhw$EhncPBdn0jxL&odz*IB0ML z#@r^tVO-I`OYXZ}KR^w5onrvxg{yh-#z@_Sj{!(GC8+4>7K8YOHO4ZCc8d}1j!>6! zzgTgCxUvvQmTi=KZ1_N-BEwAySN1 zY0=8ev$S)Tb<}xBhouf^vA}mXjyLvL(DO2KpaNv~JjzFK8(j)uCptoZ2rckCsjSvk zXLpX2cqGF%=xIfFwVoN7d9+d|2Tm}M`4p#)UzEhL)VQN=%A{H);cu|PGW{3mIDByj z^;*0koxmw;R`9ZCz4s^S{!Wiscm2Mwd7a>_H#fogl}qL8!0M82(;3bKmy2*m0Pj$q zdoREt`z)>$U%I2>Krzdnbd*q5^u!}`8~=*=Z)@xeV~T&cj+pU1x$LBTu$LO3?PxgE zn{#5UC?v?^7?<3$N)g~PlbSa0YrkuGz9>u?wmYlZAGeYQ6p5W%qfD~i>Wq3Ey2RyS z;J-&x8;KwI86+HY%C9{mz1EN?Q+m|v}Fw}A_5YryA6p26QXo?e!z1n-AR85BETCEF^h4H(G3v4l73v_g1A+Ev-6GG=@cH{mFq_!gYVT z0xuIQn>^|`x%bivbrUgGi8%VUIqbip(qY_KqiSK{d>V|%W)$|j`2?e6wBzQ;F0CdY zp6f%vV5Uw$*(X&}tGcAiiUrG5uT8r!OJD#~<$=oukFBQNM?a-IWGK~QavUHUw%H18 zIp=NcAnMJ&?!Dh8fWCypkGjZL9ekETb<{(m+fxz4=0WioH@rHkx{^2!J^1-`9;Ped zZhE0z7||f`sRD|#rB(4b4ynpw@m*L)yDFVWBzo-`{Q^+EzNQ7bH5ZOFNIl)6)lsz; zi^8aDQMwL#|F{NBe-8Nqlm-;qVx^)mJ87Q`KPCOcTv%EA?Vn);D4V&>2|Tbo1?Ndv zRM7l9l*N;+9rJk(xZr*L`!&rwHVycR)1AGIB|9hqL7HDz zA7om^(ru~bdq{~Le)}bT_4J<$eDd|LpESQxoZ*i5vv?PKFI_~aijieZpUh`v7WpQf zF0A|wrvMPqCI|YhdIeH@Q~N7pNbhoXV_SEC{Ph4pda@R#)+2~)zenDX;F4U`wK2p~ zrUTOeC^Pq?Uq?lW08Q#EDRU`5A9>R3RbkCy8i3au(>UQgaW8{s z4f#K&O@{2&^osz>Q-#$TE^b5X{?uVCM5z1@wdf2L)6L5s&UA>2Orf(F4YOO$zmjGFQf z*XbRhy_t&Xa~{f^jB;UH&fAUf!TUa?AhpTFK}5e^Ab#*KV+q8LBJ9+x&l=^?0+Lqs z5^rk}w!utSfq!4)l(F~|Bpwwl=3@fIf9 z6g*JnBQ~sy^@vs#-qk(@B%U#6p~RH^sdsS0R5HyKdMKmba=v38|h&<}ZFL zVp3*IL{2urYT>UJSA)a43eS^tORwj%oO2g*rGvvxyd$)PxT%R6Uqw##VLStcc?ZniP+zp!tS3t}p5?mdE$M-!Ij~}ozN-*P7$)dzE(MF6%M-N$X zcn`yDf@YVA4UMJQO&BT&47|<=R1AqZvjL_XgulI_Bz6o9U_tZtRry&|>MO;)-Zklf z_>h%L)VsjEwhRkx06@>BQmQwjWKnO>(B1#Zz#n6L(3n)5g?UnH#T$IELn^_tf6GymINoQIZYNZi&3+3!8%Xs5?tAkt+op%I))C;1j zEc8XjA-Gl~jf%&1kZL)`9#V~!aUkkiJieV+WrdRgXXs$Jgn@L)J5%ns?ZS-os&p}% z6(;>G)1_-ARKAVz2W7C9oxOld7PjZ zOP=Cn0WZFWuP(XS_}4<`sELM;P%UF+;mLw)zHoH={fZNxkkdZI3Q&jBUf03s4r<%& zAM86wc}<|;Q%X$(N*V!VLZ_2w zWefSI)nY>xZC!_0{y6kIHoA-Sj3rOF>5{!C?mV-K+_|}hMJ@>h6bYc$4rw2grSE&) zy_;RcZ#CkB{o-Ahu(VCZ*$k7O z^4sN=F)x)r4=%y0E{|P2EHc8GAV);TV+EvIvB&J$ z5kq$wT)ADOVJ7xg^7AS|?snpX%Ee{>)oybEoq^+KpG=il-$;SKyw~4~iC{bd*j>Et zUN~v*tHj4DYbd@VC~i2*JJHc@$iy9h1nDEg!!v|$Y}^wr3<&?ek=mW?9=Rd9fP{6? z?jo8#3SJeAoc>k3Ds0P^Ej&L9TlYGZUpdVVsA|~o+(M)&8y%Jbaz)n-uI5VD)QyNp zRejo_0h8(!v)#ZeTrEVurMJlo6s5C391vl*VGMvsrn==x4ON%~c}yn$+m=yQEVaHs z#6?G{nu5kvHm>`A@>OV^Ge>)SY%=;2wl8U-S!FXU05i+Nxr3I235{)cDhoT%qXd3M zyKVM<%$qq=*yzYrt6>Em)Cg{7nFIj3ufm2HB*W1`3_CS(WN9F`ZTyIrua)6}iCj4w zB*982Wm^|JGO33|4Sx<9&n(4jE z^GQ6Z4sxG|rt&`SY{~`}OlIOD`ba8uDXM5aLzjixF! zHP6EE)}l&h6w|K-3QyJmk7^efDcMVvG3L@|K!yXy)&SI*+b(LP*S0v=h5?C|%qPO0 zfkyL~VXzlvT6VLykXW5Um`UNRBp&`8k;kwLL(Vl62gPx`M+|uUz{#Ll98_WRXOTnn z6YWuo&bS%++(ie7xL$H5MjX7+yIVhM3sZ(f&6)D?_Z{YGiiLNOs7POT=@HIDFh0cX z`t+2NItma=)C`L?)0c5~4C+;gK9y{j45#Dx&)vr@w#LoZkg5SGGHjP-1^VRtQdO4G z5FAWxq(|xy26bFFW#Mg{vfJZjkZg*$*{V>p=NRp#x;1NybYr|JcVQJ}xJ>`XXS0w9 z0kmgLB=b7%AdpkNr9)VikLD*olLCpQ^B(wMBuR}((NuvvOa(G$J=SeNNhM4dRu{wN zUcaywmL4}Ic0~=QQDvIR#BRGK-OpOdZ*nnUA>U)_fvux#kpOTFIVheIpc6eGeU9#WNTo6#+X;}FN0SW zdqT)7I$uDKsLt_M=;)FE;$TW)9>>)~R6~lY zEJ`Pq=#4T;HA-){*((wYZ_xJ{;TR2cAxU;|32=FZA1+rce6kY6MDg$EVUBILXvpy0 z{{Wy{g|7bO(<842BOjT(qX9Z=8RyeWdKYrK-OVz+33q3UJ2z?NpK_@I0jFYbH#yC@ zHqBa{tGx8`D2PT&`C0x(oN&$wJy`X)!(RVx7eW_v*TpkGwXvFib)a)3jY8|GTtb^i zb~gW!{{##!)fBy0an5VVjaSy!jX%BL@k+q|#b7RvGY(&O7B?qztVZiRTb%nBzfBmY zy-)kosNN^@T;704n)aZ-WACGl9hLJ*<1QdF8adagZ2n`|mj7ZuWwdHyoekOSJvC1U z8(HPsaFANSusPjrv9GvuG*UUbg~k`yuDjl$xlM0;eBelEhEX!Zy|s;{yXfC{Yjg6v zW#uAslpIZRwX#@PFUs;C%*pyXpiVS(I64z{`hwH`R*L-5xctQjWY_`6~CG%sSezOK$SW;IV9O+rO+An$aL>F!DM0 z>Mw9a{933wMAoP(2%>^f(xRcsBk}J595xm&!Q38C>U+3 z|BAp^1jxw!?;+dyGW9B}R84PMF?{~C{eaB1;+$l}WG3h0w7Q@~YDIPgzdSmS17s;hjl8hTW%QA6(o5ez9x zw(&AXt~LZV2xAdr<0>C$v5hX>E==fL!$QrS7Q@9JtvP_a_ZA<>C!(4L2o*RJM_&=C z*{NoY2EiJ1b^k}o6Q)nvrqe!6Rf6K|IPl3Il$Be3ZGMKK4zJ0Au`7>G7iJG)-!|&~ zYr&W>`kQR)lBRq8Fw@wH*A8iwKM+7duEdsGn5H$`T zTs?R{x!O4^SA27MykpyD7JE%N%dcm$Y&1VGO9wc}Au7nOq>q1+Z^mCk{sPLY!$EEgP3RH>PRGnSGf5)RfNSWl<|3Tavu4n`nekC1R;wY=|kr^ zcknip89w-glg3nX)hJX~+i_>C7dV8e4S-+)Lu!!3JuwzMp3_5h1wh`wVpsGypl3kc z7+)VF1Y03B?pevcV;^h@3Kr2Vw1D-LyQ5?#`F$T$@d3h{615gbg#uNZc+KYmZ-m(e z<}@~pImZ0RM(LGP=0nABt=GttFiIae5xBBJ5y$9L^@B-_xGzajg;D~tL9oq`K&;S%gIVX8C= zU_oG|JM_1(Ae4yW5*Nk6PPNAI1;TViXtP^4MB0DOl$`kXV3-_veS>mfG=pD!r?mb; z)QPL>`I{{HFpnc`+Ju!IpBMo2p~q|r`@=7yKZc#0JmqKN$DH=?UzX~-Oy0$M*hdlf z_!6CkOVkKml3shS$m9&7nQHN9ApK~}Au=Kc?NMoQO1)UpSHd`p2KZpTC3;&*G1=!5 zE?ksn^={7Yd0D6Hb-4VDGmC^4CRbHM(KqXurhLg-fk-B>o-hE|Mg;V9tf#13tz24J zUw#bKsqhA|kgBC3G9@-wnXnTKa3yl8xjfW>;&=)11Ws{lNT1vfP*0fNaFIZ>Pm0Z~ zQ8`$A$JX3zguI18#`8@^2@+G4*a6V1$7z~9E}VDX(6s`M@0!;1c(kP0HX0oa=NiNa zqf~E4;(la8l*bxoX@H2u!av`4kqvVeMsTSF`cs_?VnV3d=Ul16V9OFc?kUS(N5Q`n ziu3Bf7XuPkn*Lrz$hgKnLgHga|>QaxZvH@oNm4L;DA z<>m2wk1~SrB==8`sTYUEOgCS#VYw!MRnGu#j9htBM}JONN0Y`@kgeQk$+0l(v`NXq zW~Rw&FqduGBkK5`X3qkej*;iWutD4JJ-_m{g%fv*@6To#1gt;0hUM-zxM+d(H?p+Dj z7+gIkLNS}O7N~<2oUN6XIcSY6M52S!u|VAe(-^`k`6BuUjA8b*%yD6h13A1FP{^(( z8OEeQyf|`)$`V?=(u87QT{)jqFk=d#LR^2V%h{cf;g;b)&w{9_Q63HJN#2|2lb+?tt zZm|q0l6vA|f3)dNt7Hn61FltUL3Z%$ZS_*D8K5!~g+U}ufj5YDP(xG7=uHLn!V`e*J%%&bF{NL5#y0`W(9&ECWbQT7GE5|t zKpD&!pKolp0QrB>TntTNn8nz+94WT=nk-ZG6*|aKKo!ND^t00Q8SQon-d*Y`99aiD_ofm%Hx6$(Gcgwav z$$#;YZ|$mX)cF_U2Yje51Ht3caVb@I3^O|CQH77; zOesyFMH`1E!T`Y%O%rqt!Y;fF<3V+>J9GUwn2CG^&q!jg)P|*QwL@us`mjTxZS86i zc+8Lyo%rqhov^s}kE68vtA`al;s5vTYTFE*P0kP93^NwpC!%oC!^($*AJ2NJ9)=Vm zeq%1oKz9k7wAAP`Op+Z{_}yyTH@*MACa^+fr2PR$3L z@}&+&iom1}f&Mj_{aq*L-yV9-F#Aws@rt1Adp((tk67;eIo=+fb?XKTd>MLQyQ#T( z>gxFQ0fg{qjD%>dkv%9ly(-$`qw9}mRnfl*m!0{-u=+`vAx%#lTU|d7}kumP&ov*bJQ~OOq+zdS`;YStgs$JxeTAY$_7&UFLpKC6bAX z@qY%5;`0;p8(l79-=z*8hM#AKaY)Af9`|-o=2|gQdXp0{t{cIQhlL5E@&=0q?amaz zyu-15jfe^SAq;ydzT-t)q9tJTe%|}|h~fJa?KUJFDz)2!O^-CjLd>~~r3r02 z50q)O-4Hun>b}?uUJ+&fjzAnsO>mD}F}yL|+%(i>M#HS@qA!c3xBOWkCqz^-<7a-v?x)Nd1r9VC<1} z7pF+h6J1AHVrNK5!tnbF#TGm81Jk&py9XYZZBuVQhQz55#l0g1A?+)Ceh2?<4wnQ{ zR*x>`Bfw%?&FsXOeiG{FOjn$%t|k7*As0QG`lF-m!lSyvpBUg_Xk%ST{To3*Gw48C ztfMIegf-=xu9Uq+(FRY#)uDzpV!>{IHn$8BwpJT z5c?_LnUH63>Zkq1PhLmuqf%!3V=tg6HwcY)X1&fhB`?gCZgpQO!jC*nVHLmgGBfHpY6qIJ(iv9m6w*2_@2lm!<&YjOfOinKX&xyYbL7i zlsHB4CWISbiPxE6W?9e9fM~hC{yWyTr># zb*Q;l;A!Pi9IW7K?OmY5_O*HXAxQjP)Hce2qt(&QXAz$}Iu0u?4TzV>?y*-U&EdBA zreEuO{Nlj=+ph+??)AoQWh@gO@6ZhWI!~&O?@q~U|1cq zY1W&LjlTPYQE%Mv)0W+%rZsD>KTHOU%3dmOTlHFT9tw#~pGZs-{$o3m|B?69abB!3 zi`jLx+tS6=wbPZ?31O3DM;dtVJ5dO|Z^$r>_#b`2DZ$B2k_~JBkR=BB+gYBwI$oF4 zYw`KG2}ZCaoNs!O&6@B3d04Fn4;sw>5oPlI>jj+k|4VWNJ|FEqT1%3d#o6zNu6>OTY; zjydEXGh)IMde*+#$cc?wu%1GLm*wxeQw|9X=ACKU4WrZM*APF4mzGzu%K2;E4~XF; z8kt&rG)=$_MLa3K#f}6ulxcs4(8teZ#6`AFXqFFmgb~~vrJwb++544y;rO{WUfiZE zx&pN}uc$oBE$`2e>=_9|#@bq(yu*BWr!YUzj#1n_sYN~E2oJj3o$~ljZ93l2lvV;Q zU0v$_IymAnMVRYpJR5n^L+Z@Q+6+wkpRxO0EqdNDe`v$6m!6O)G*l9{f)|`Y4q>*! z_9>FEt21d49*0~#W<0E5rWKm&nI<+Z4|?|B6dqAym$)Sgu9=TYQCo#8a-?TEW%q}P zYsMxO2gV}EwSToWKZ%;(g)$f1&#~YK-|UG{tokH7uBJ`6X7;8eTYp|czFfA{-L76} zGW5~O2Q`7Gn7M#Ev82Npq#k_uXLCyJOr)Z*X|bokjQ`An@(h`S+C%EW+S{32j?DAP z%5O}}hMt(nk#fY`NUkkPp&Y8~uLqxR)EgpF+;oi9V|tTpr+|HD*d zcP}xCHnr$Qaze-jF>{XG^GdG{yA~Jtx;#%vDB7k~7*Wr0j{-wc!eyGzZNks~0_&a~ zPIjG)B{>{{<#XPHIaF(`eV&D>%ZH`zT`-dbj~gu0H_wn{L5tqQDh8gZ0o}0%=jew% z*my+sjS0{gO^%yYr9MkN^Z>=)hH`^qR%SAcJ=mFKK5<;Ixkd2= z<8jjlqWH;lPEE^H-0F${k)O~t%eXuD1)Vo{fK?2>?7BhiS|CQw0bN@G8%{s2=t_lNUDqlIuDkxVI=j{?rXS{<5K0T%*y2Qk|6f zB@bPRGT86lc0Ih%U27s@UZjUn9rloJkdqf}%>XqN_Aj|APwmP)$0o>l*x%K(Jznfz z-u%NnWzyc%^`=8k*b;fW;1X_6JWgyWn}&CbxfjAfO%?g`e9|wH2B`dHCTqMKvfV9> zgNYM@sO+w`2440m?^^e|c?(u^mtZsm3IC0mI2`!iAB;ZhAE#=ME?+qj{n`f~a$S>K zA$sc2L3$z4b}+i%HQTIV$e;8*FwxoKG^3M{kbz_{*rfY>yP}AkoC{u^KOKpE>qAQS z!5sB(l$BIW)9C)^MSq`olEsrRi%1Zeefs5m)K1efV~k4zXTLJO`znLO|J(1RcRzff zY}W$cpIv<^s)u*-nAgfyZUB#eldtou`x_9hbU`%dt~URG(~IKxJk+JGY|{Y>r;v0f z%$cNT<6e)-$p}XdUHe1}=(8ui|-4&G}P_eE2-M*?zK?~p0<*$GFC@mRw zWGrR4AgGgUX`_}h-uNKMcQ+WqyS1+>Jk}*aQTu*U7rClI7;SSZ49f@#i7~1cZqX;t z_5Si^s^Lgps|^SZEX7Rp_5IfWUey)KcCXtz_o(h~pD0MUJJGIy9PtZ}E;s3=IsBga z!V|Kz*?vo#V#=x!1e-ujO)l+if-d1E^%8v_o1>&GMPg%SSc18yO?pkjV$Yo#8bc?0 zFAx)#%iH1+8D3U?c8A;--_75*1#dZ$X+hT>B0VS94J8TijsD;ETTYl&>~#m@Tg7iz zcsSVFei+r6e6bl?Ojse>qc*rx8D_M*!X^D5uck6su&a5PMmuVFv*DOM6sw+2xRIn> z`>xIBSMZFiV()Uzmtwmc$3^#2ZLZES^8VisyMv!)5zq{$k5C3ZTa`0#DC`r3nNzopr4Ig{< zt?bJZ<>(Iykegql0EE&~pSxD62H-kb!vDtHyZ@(~{ZkJ+Lb@UmlV#Ey<^PKj=92E-wwf#9ZkunW z+ZcU>F$;7c@owEYeNnw%c1a0hBt)hjxArhg)Fyt5Ki`pkEBxJ!SA>cQnSSm21@Y3- z^Y41vinCiDLdQfjrrTJ!_=#;U`(cN^gJm%%y;q^t6|wz}#2!+6;Hl>S1>7d6wd=RL zBS4q9I|&yu` zku<{ZHhn-b(=`2zRp_zbt`=i%7ino0R}BCTwr!tiAYRRbWV!?RJ@D;>rigA(GLU-K+hq>!r1NiDs&s25kR%)YI8s7n+;Ffas$Qtx` zhNpew^pre7{=NxSJRG`AVz+qBJCvjLTrK&~-)*a9T8p@?_pzXc$omkHy-N*y+P^MC zJw|}iTmI@N-_r9WQ!NsM2^l1jV?Jq0FK87ie63@&XAZ8OE}PL2v$>`$S(ds;Z3yW( zh=}@rl$G_OGO<_~R`N_UhuBs^G9UAKpoWac#S zo-WZvb!cTMRJg!qUihs~!j(bJrUH*jXTyBJZPfQ}?qQy>esP72Mz$z-FRz0QK|H2n z=!RVQ$^LP!iF*IkzG$?|Z}~E^6AI&=Es*`glP6Cqw+jzh*G^3&=;ZBBS5pSY8p-}yor;7JZT&`w($K{KEx2@eb5uC1ee^GKmscqNO1}^_Q zWWS(bRrr3(NnN1k%(gg8a1%@OIfapAADGS@S_FBsxQz?z_y*Bl4w%S#sf0ktl)I#8 zyHnu^Gc@n&iAWTpkK3)5nLD!H9Lj=jK)tJ}71J6W5()v{wtlZXt2AaEmK*g~_?<|# z=5w`O-!DQvTri7CpkPv+W*Ql`vSrEYFCf%3?*9ojEVbhI(EnASJwWrnb`@6~tLVGG zBpf8qGV>3&gSsPcq`u+z*@clfs-a(4H6vkK7rtiw2 zxe$RO7~H+{qzm{LA(IU2{Jb6%R5oD!4^zXEQKC53YeKB`Qh3_pRhBYS;g?->-i@8p z^$eHX4^`Ba7sgKRYydCA+n4{{ePoKbmX|JwSy*fqQs;LVO09Im>__m~$_wbY)rT(I z!ZFs0|4{g4Qt#EyqwUM5Alg(^ec|1y(-H1|s(>BjL&8-rV!GH_61eWzTEoCne*Bq| zc_<(6vb%8TcbAan^3{0VZ}-&3r(1g7rp+x*Wn9o)x=ngf@E8ARr6Lz&Y?2QFpG%^d zDD^7zMS=w*DCeBsa_PaQ_hJ?id0Rl~Mp{7SJq9(Z*463VpAi8^$kd73-oDbk8PgA_ z->DQqpE>nhRsP-Z@M28ypMZYnD-cexx7YlX@rjdg`T$z>em?C(L#MV`pt=`*NBo)` zD><>}GSLo>BiFp-p9)x)rLS5U;5z3ayDY ztwv`qfb(>0XW8vs?6*5*&!Jn!I zH{Qe?F|X!(PcGo7hlabgJc`Rc*3OA0s}WcjNOC6Vxb#LNo8Vo!OvPU>i;PynYqF7} zWoFPOu$LQ5`2K;an&Z@%Pa4q6Eo~=U2?R7o@&-L8JeT8HK?QLtUcd(S^5bCHyRopl zxR5P)W_l~z%cD(xbmA&ezWlT3)YSd~^cUELFjTOy8Wg#vJrIf?wQLfl=j5^gI>1-z z;21X*e{Jy|kNoVvm5bytB~d93qnb(n9=g0xfQ&9}RkNb7pdig`D?9l@dSp`>f#dXF z&WKU(e@@tgYjtv;KZJrm|4@9xHK2NXt0)~ger)L<8|4N+bj9A9ulViH=~b)yhTDH8 z-g|8Zvf}?Y%unsEM6n>L{o8`mY|B95$Ih(H-sd&2t*QZdW@z{?9NO~>)Q|gy7Hv6V zEm#138Ft;c#f!S@d4TsiBMF2}4?r?!pFT?|uqlt3*O`nW$K0VvfWsG62T|Q2qVz8L zA3o;CSswb$|1!nxIf1AYNPVkW$?i9{D0%IVSxT-7d3Y7RVdf_0_+;gLFAf#h4-d8` zEbqJK*;gJTLNwQGtgL(hj+Dn1YB1uEnkA81t<0>0Kh=K(#(JZyaoxPcDZElV5>9Ud zzh1fwOAi=Pqh6&abd)UPlfD*iQ9$LAG2#AqQUhz=&k37rzeOi_>t>$_xent?97JQp zn&*Qn)RCiARB?{6so6fwJIWx(V68fx-7|yH3@ixpxqS5o{YXM`Zb6*29o)`P!37%h zcsyL_2e|9K*W>g1lwom0C}+j5`G>G$G|J%4?ThvrAH<}MYtj0}Jsjt5= zV`FtZSsMr4y6nmpJZ(vSXw?it~a~* z<9+Bz{;+ePXkg?>(t;4{%6;C#+^vz|aOJLFhg&u1DzEz-SZUJZR+O&|o)NU%{C>k6 zUAjI#7yW_Uu-Rv+<$X#x=WuFjZzT7RzIV+mHUh) z<;JPyfk8x?RNIu}c7;}rnuW3aHurWY3U=sKsE*!3Xpmj1{e`mV6;E2vCKkE|?#97P z{GAl0T6wTCeV)+5t4G$3-hD0J6G*R9GnWTiMutLg;Xsk%`1{Gb^#RjujO|6Qloxca zNPXE#HS-{&`Z)5-bF{QVl{P+_QZ_1T+M+h28Fnsg|A2KiD?uus&7Tz*4HDvjftw&< zOA{CX8?vO_=+rX*rI!%k&Gy+S8x&?6>ItHk^7z?8iTBvER&Qn}!nIADS*w>17qxhg zt#(#MD!djYQgzaWxGoS(|4-%P)r`BpW2MScd7IAFqQ=uW;JaN1me#MgX*aljn~q^sS@i@jdH z7V(S&wKm|-g9a5ULn5Q)d#?RnbDg_FN)g|V5oMsP_ZufQ82mTp2-PWYefa*_Lus)p zP#gOC-XW!*W_ANI*;h|pF5hwcg!o&c#c82cIM^=um)A#EX5Mp!O{IZxZ&H_{M>bAV zCWB%MF&io{y@+)-F)N`QE2y~EXhJ^kT4$XYuIdb3GtiZV4sOFt8q136RP9AiB|dLNqb8oE zzzsS^Mb@fv6mnB>d0|&#i1W>caKdP%c1-rpkj$OAKBeI&Wh{+^zqmhVUp{gvEwJXz zvYKkPG(GfNZrrd_j62JT$kTWe)3H<{fkH2;jzqc(d^R|FjI4k3ResFU&dFg|b)n`^ zh>O1^pkiH*s~EUE#_uTZBpwW}@ewHh6pRQ{jj62RimfPV>ZkxGDk0&^-yVPzG}U|dueo`#Fr=EJbuB4_7=VTV#FbQ zn(Mz%Yn7Yq0cYGFwzN&xCt)*d+roD(KQ0AaOSsj%Vn`*=Q5I^O|CC0@!~^q;zXZKu zf>s60mq+5j54g_t5)@D5ef@iAWCJN?EH==Qea?oCox4Dos=!_F)0+Bbyqje82EQK9 z$aIQXGWG5_=hMjh$$6;4JrtX4MgZvo!^7sBAHW`j1!(;n*BuBg^tx|gDmY40hi%3n zK1gcRJ*_s_1>f~2rZN0rCFa$@;xVSUEc2djz|jUjv&5knEQK1Q?JldcwT=)aen(AK zgXfTL70tIPYd(IU-E=(s0Z*X6sEggAg!YQ;U}q!ydC5R-BU2PNXcIjh3r&wRaeHFNe#0epop zoO&o^;r6)M9ltsn%$it*ccwWbCPbU$L=axsfhJMvror zSd>w|HIN5)dW`PFsrJuqnFbh6U^WD6x$Nv8m77HCiz3GK^Fl)G0{3(qgT2;SRW?9f zhK2Bhs(qgljwCxm%JIujva>n~JU{NFLZ$8rku+aJS6rPG8bbw2?GMz!NwK6jHHfBE zb*}a5F>MmW&};4f%V??x3uq=3zGoo?4x#?NQCcx84s?lZ*tjBn|8u`lcDG>@_WMV_ z^u>)XQ3PjntOOOp^EQ_IErz7VQC?z+CcKbu#@a8I?j09Bb!s`pF9B*zpk;=b_wb7` z43RkqOoE9SUAh`=GM>M81avMmuSOeQm%C=74L{*^)(zjq~n0(Z}62riyRu$gR3y zkm^AL<{CV-#+)FLx(?r1P(xX#F~q;On_?uPwPVDb58;BZb{UXcX$WKXzKPrqP#@Yi z)g*+#r(6Bcu?&AU;%=;pkh^)Px6*(a6_F)x9#f@REz0#qb$=_FdaT#nSYIO*eiwQV z_9OW|&22%L0}%c2j|7c=;ec4W#z^-Q@8?8qJ~wxUi(}Sp`?!-a22AnY#;LCO7x#wv z>iw&k6HldZ{$1PbKC)U~BAAWA>6w}{YUyEwyOO*;lC@<+SLYSPMrNom&99}>-a7xt zv+C6&Ydx?HXNuT!qx4Up^}G0xsBJ^4*JrYn&Zzbz<0pI!z8BvR@O2^n{6U^c2%k`VAl-iUOzG2g{IY#_j!Zwmmr1S}oS9Th!gJ$pQa-ubF^S1mfw zwc@o%;nY29lmDWMOJ;*$_+la>@L|EraI9=-K3m+wZSVRkNHnAhei|gj&m_WGr!;;qhcM|D*PcRc|yac}m`k0_w$;=*493 zxwB7yIP7QOlyIqk$O{waFP zDtvKBZ~Thg#~n4#?G2${L@sZ?`Hid&8UGe-9+dKlrQs2E$5j+-@4Q%Cvibscw1pmx z5(wT}OyDjAy5~VmcW8W$&eQ9gM79I#a4DG2JzX7@S61D@SEJ@8ep?o!Ff8jyPQZx1 zGR(3j#os~)oBcOA!!~+LQs9P1pJ*PItw?*@+^kHvx;w}+e}Jt0-cZoFcrE($S(e-2 z&f&G`I&p+lGE)z&0Zs}Qg+df3DT&RS))?j_nl~TO1ciP&?tU%C!txK*tFg?-az7MR z<%q29#=xT%2+M>>L!vFe#_&{S+J&nnUMp&beY}@Z8>ibcybU#w&ncnDYQ@HMu>eri z0ZdQbk3Uk2y!SB*%-3o(sYcX$avH(`b*x}WEb}LCzbgvUTo2tR2RRiSE zX&J8({=>Dg?i>rRe;+7qr2D~JuTk<}R`T-PtlPW@-_HiXqLsMY7F{@d)`IhtI3T>* zXvH$-Y>(3auv3Se6iZ+poKepe7+zNgtM;{g)AS|b!2oSubZ`Nqj~KQ#^pMBP$*p4bB4t3*oVTayNf$?eT6*Mgtspja zJ=TBQ*dL-iJ+C3=`$cWSm}Dy;0Z8J>K$3W}n%M-k@2jIc&C^pliYy186N{6`B0!QF z@MyBSx#1q`B-**3hGvV1I)k%PDa@i@vs<&)p1aTRf7TlgL%yFTAMj-dE|Vs>`+EB8lZhp_3Rhwn|P2y!P~6`O^yn4ogfOePLX2)#X-eXmw1z9}4gv7ul_Qns}qvd;?xluL50rhrFca zKq-1p-yZfvp4ZS#aL9@f%Towz)A8(hDI4t9bKVOp`0NFaOj^r=<+%^6260PW`$hkgmGlreq4HbtIagpt+*eDVTjpAO zetgf2PNT3pY@RJ>SVmrV=@U(=Nj17x-VGU8sz18fp?Q_I_J=EWL1!HNw72}#pIZIy zX@lX>eaP0BClct|9S}xr%Kb`_?iua}eZ%QNb#=#&RZRLoKBj!Mro8WX&nPf&?Pfe^ zQxoOesbvm~2&%YWlXD5HB^5W*4SOEfCR-w^XMPCJil$cvW+P49ulOP>`_%@QTSHqA z8|Oj6yz=Ykj)!hcil7gzQ zw8}H3)e8r(X$|)NnadHQ--5Dg7?`qcUA$1{PHbh$$1&FP^^Y^GNc4wgzl<6P%_=m= zm4(@{Y*Ns{81Yw7>%tTmqA$Bvi)8tN5#PN7A@(07(*NK`QYYW^`T^2JkN!#3;g!6S zdFd9o3_D)v&2R>iSvA!51)IGd#Z<@&)FaWaw(|3t!hJ#4R%?1^I_O&H(C^PqsCUKi z#F59_vMbJ9Mz6PBc6q@D`EuWuRua?F^LD(04$Qg`m-oP{kB3G?Z|W9M6~dNg%KluH z;cmvbEg(y^JrUqrRUStX>{vC z!@{~*(_#ZN$3dEIi*bVmBUSCEP=I>oREz9u!MLnwU=}rpu~rVw%f`u8@dl@iU;S&^ zC;sy|_v;IguzHFNAXcwJtx7zgU8{!kG1yWhzZPI!-wM*qVMZ$8ax-2n*+mRHFNo(x zo)k*6FRMv&5qdAyL!wp=dGkuKpZzhj4$WV}bFC&Q)6Plze=tgA7?GkqMOO3x1C#zW z*N8OsX*acfy^2!{w(5B0QQ3-kaZy#R%95Can)?6p{kqc+M-MsNB8PEGe??C}bR5}yw{g>4agK5Lgw5cAmqA{EWXfF)<9v0s zCTJl|5bRD{mCKAegZ766CIx!#KzKOE*zxxSn_lx!9xpyu+3Ni*q}uXkLp9{B@@jXf z8QBMvvuNFz8Mw3m$crkI%*Q?Sdv)Gre$w-BAoo2h+Z`c3 z3kqd?_MXX6&yIrfNhSP|5$CtxRB7Fh^T8~}__3x*79743y^-vFb7ZAtdZLv1YSh$W zLS}j5xy$S%AudqaBzpPcN8<3wOS@68suof&=o))w&rKDSP=3RnLJmi?4Q<0Ix<;t3 z)@#(duD~TT#uZ@~TzN(L<}M^Q=u^)Q8qN(lbo%@))q7XTmqFznQF4&#T=i?A$_7!kQbDXFfUIqtWt^2XM~9i`p$* zDA}P{&DUbhT3|LQHkFlh2WQTn6~R)db;kp@6!Ei+FXBQjS(~+0;e7_whh5SJc?~6% zBxXq|e=>pi36Kfco^$CW{NUI`4%|cud%M&Hzr*Ns2 zQdRMR%6Iv4Ow}9-w@6)#rfOEtJ~6 z@St0_#yh8DD#AVJ#O$4^Tk=tt1Rwk?G>NPZ4&OTs=JLW%fB6M&z28uM(V{<8M&PVZ z&{+Qda{XSir&C{t`KKd23r$*#E}l50qypkH?Q@A+Su{NitF3~JV2b|K9CW$@nJz)u z25^tE?nWt&!*D>-=h=~C{E&wQudH&%gF)ZSyi_IfxLiY}^aZ4}AUJ>h8#`u*?V;|X z(DJo>YO+;M3&s;rb@M~8p~Ev~ccdxNm&$EH8S%)I?1O}a zWc^glbtxd>(ln(l*%OWV7`emB;&)*AHmmit-@*BtKI4FFP~SvE3e7w%t%Cpun~~nk+rm*Jc;bNBq&2K@gTs{ve8(z2FoTQ};7h8G`mg z7n;6N4;*tw(}d&k+N4tAe9@^1?XSQf>gCBt^I7M`+maS5NQ3-G=GkHhH``lUrhk-# z?*@S`GjduF-I=}+H-lC^$FK_y4?{XB&qSB~;;oKR`+IJDq`2JW&1ClJg$(pOsce$Y4}Raus*u=O*X9;nX9W&gNf(GFNOa^8 z4Pm9}A2BS8&~53%1q6VGHLLB%4VEI*a?`jfwgaH@G@pIMEUk&p0E%ra!dRB~I;|SYDgn zx6Fixwkip+;AaI?R%p`#JM&a^drt!EOg=!Tf#HCe-3i<1eFCf8bXPkMEr$vHd@jwN z17Et0g34)1Pu-&;Fo6;_bs7RlbJ;R$#G&^-Z*cOZ#mMsW7X zZUJ1iFS^F~zIs2JQ$5|~=_N!zfJKkb0CShlG3r!bJHcXMB(v|_%>)OC%A$R2!iDvj z)#NLS6C-Qowa!>!SvJjC4Sl0%DPA|T)MF)k5}#f3o*GLzA$-WQ6rn6UPGMGCLgcKs zOh2@@Kc6yjyzy z{$OqzMZFJ;?t9A2xFCA%cU|e{d)+$SY=^?UzafXVfU_<3EwP(PPZ=I#>GqN{RMo3M zS*X!72Z0pBTW{Ii9`%v#i;N<2t|4uUhr0FZ`;hL7NK?d~e2cY-PCQnDjw98tT4lp+ zc%$EIpZ5vlVAanlP=Nb1=G|$@>MyG%01EVE0RK)Kw`QQZ-mP}0OFKEbH?w}n%^FKe zV?KntjJqJHfPdmHmyE|rv$pIY$=t}_i0K~oM8+~RAVU+D;5kW!ZG^93$dMDs=JsZl z5QwkNIryoNvwbf&EE$PEnr5925Ci48btCJn(4}4EBeXCzZrd$Xgs zDSNk5VWcOnT9Z5~0V%a-XuBiuyVn$>Lky=hMnn#iZzF16YF3Q-U5Y|4pY0PB!ZO`9 zR?M4C$x)#c2@zYXS;5sP?t49G>39mUJAdbCv(-!3*{C6pSlHUcSoA-gG#Q?+yuZ4t zXUn>KTec$@feS|W7ioKQUxe2v^tq}n-jKEh7}z>6o)ixWx{z~KA#O6W$%c84cHj^+ z$J)mw^P;x=X5kBKZ;?E}CD8@{mw0+{)%3os)MICjb#?tT5f;~!Xgc>xXZL4kKT^rh zevnYrlDDyBKUoQlxj~tVFffD)6MV9BH&$I*qKRmG3TtPK>*19lgc$wjUU)HyH0rPB z$1RZ!>J$BIXht*@6ZMsTR{we5BMT_1Enl1_= zJzeHew5d}=dhz#k?Cn}gyh}&gj#dqKFGU)j+mSSt!**eAo!GP_AEZg3MG?%l7rfB> zk5=d7iNMFN`w)dq^d-$Z*Syf#nx^Y&}ya19; z=RQZz(j}Xzo3LO|QcD^5nNJ{uI#>%d1euOTR74aRBZ%df9??DV z#8ZxmHf?6WpN}FxWQ*l~4y5hazG$`xtUB1>x20DWofW@4h#U1ArDY&1{99f{PE9de zBx3GkC;5Mk%@s{#z6KyI;=`t<|Ls~Nzcv`mzq_QR=WP(6M4Zb~ewT-sQA zXs?GuooajO@2^={1%y15fN$`21GJi$0}%@&xNQ7B4tSX7rD^%v&GyH7p|19KJt^$L z3Nt@C^4~r)EFbIHZUb40Oaa0+f%eLQ1~6ysr`~%kD4z|ova_i^DA?Q+u)o6o1pHhg zZSyKeW6zp z_QrLjeGu32#q-^N?Agu@|4{IKyd}|Y_t!B zJUI>sYwO4ipY|YdJ0@3qY4Z>-^7;=xP4@)y_`?48t)&%m=&`wZ|LF?}fF-6Cu(CMZ zx-4b}*wRa?YFTU^P|#8%xma2Q>nk zsA$0m>S|`qpY-nQQ$PdrI;xpZW=Mi`6(~4BD-kYml*e zpk#erIP_XCC2kFya#|WB)~s*YFJ~WKFVqeC{V!;OX?u5JWwWzO4Li#=b@s(relTCD1bHPJ2rBTl zNdLwtfPI_1+Guvz5K?aWhx|{jERI`YmJ^q!IYAFUnWWQ{tz?t5h&@MF$#30sk~XDz z(-OasecZp4zhdl-XlQtsPwM z$f_cKP%8g@*y$Ukq0sC~^! z?7Sua%oC|O8@u3%9Q8Dv6LuUR?;Ak0jdKZJ#y92I%AcAIx zF^4IupG{Jl;_O1)BW>p4WopQ^)S~Xgr}AdacG#@LiF^9E{KtEH`N9urmv3hrW^~{! z<1tA4d2=&pS1|HSFqsNA$D3*VVoF%|r?-HCO*g;qlvwNpEwJ*od8(7SwI)OBui$?OZ*vDNX{VyJkS!vecwm4w#1)j99qm&_*v z+qdjROzbXKn1L4_)&OhgX~r+V@qz!<Gbtl=G+`yB`#ZP*!Nrt-!# zvbdvW?Nl}mL~`3Qx89TAtP&%7{43&}U$69o$)M^oLBT0^tU# zBi3oAMY+l-6-G{!wMxL>Buw2a=3NVEU#3yoezSd6QjVYBdREq5phehceN~#a3h^GB zZRMJ{>)hN)=UIdTP}*x~Z2P;MWg>5Mme46J&zhC8a`>8oum<)dd0nVHd8(FYIQcQV z`n^B4hy3I-Zk=1QzNDV@HMfmW`iLaV;TlDTA%gnz^vQ`KM{QU&JS3 znMZ8RVb(E66oG-$;f>udXM7w=avNqhKZ`Pu9l&cYb#H`!oi`FUo@0zW*q;WMA+Wlb z&eq`u3tZMXCNh?nY0xJBJq^Lp)C+Uw9Aza1_fpiJf>h zMXT{Z2loZDb6T-t^pCYN{B+j}e)@5MQQD6kU?M{npwpLSs|`!Lha2)Nru-pInWiJt z&Hs5CzYOc8Q!cI{G_ZuG_YVG+N*fhb zt8(^yFVmEZ3_XsS10=T|svHf!hfk;msa6b0NacJT4a(3WUlT$jpE@p5V4(w*iqD2& zriCZbvIZ7AYV~z3Kbw9N3?mlAKSsKsPZ3wju(RamX;M`SM_Mq{!1TD-7R4WVqEC;y z;QH5w1@edi<1leFJeGF0Y;t>3hUb{4;Htkthay>TLUW=uq;7s8qNWho*EEkMvp68E z%FXY(77V1-{WC9_wzT{X<>2}U!T?am`*~2up@Ey4IXWl^SsrXxqMu|#&{PIi(QYCi z7@*wuv$TWKF@XNS zpl>&`Nwc08sWoc!H~^%uBwcrUt#{`-gw?aRf|Ax#)t^4>q-lSCaf5>)Fn*!j**+-g z1$%HJnT%u)cl}{t?(T^OwJ&eg6VZ}D%dVPFji zTxgkZM8OAtp2n~C-jsgXFpU3ubePrgJp6(HorcdHi@r0xwbOlM{V(`uP|2(`Q;ko$ z2Tizo&=L~X$A*R=W}MZ*AT$4PhgkQKwLgT46|tBaZCvP_xL*DIM*B-?i_GC?ZImW& zzhloG(8Fc>>c{TT+C)|*3!h4sKUS({QpIl4GT(f8x?T=jrq5J$DAJuWFCpuBS}i;* zXg3G1`!w5nh&xKSM-5X897R_vw5inJgC}hPh_+P<^qBg3N6Zrw>;jJIAY48ZBET%S zdb7--9?cVfH`S|$LQ}St>xA=py=_)Zr>!mYnopFiW&Mw`K)mLT>>T}= zQBUR_p_Wv>;Jt~=1Gn)9RcFtqF~YlQ2)a1UBYwbj&o@Ebp9^mfxxiPNbtXJapl$lC zKF^q6ph=w_4bT&R(Q}+ymUuwt9_UKsWS7qd+JAu-pnf@pI$g4U^8*y9)7@VEeM<9` z8G6|=_UUTS@?P377u2-#Rp^H|Rt%69{oF1OC}vlyzQ(cgTMJL+f{}>8{7n#hPd_ur z%(>t|H)zSD0ZH#T1rCYk!fBgcoBWEy!N5StpI1KLB4zYlef>?^ccAa!7;{$Q8hsNa z$=`VXF>0ceEgHhez0b{8>{5P@`79kk*Sl>g(lKoEx(t2fUv`eMc~NI&&YoToSszgt zKiY(UK}m@6ZPL|NoO`@%V?FnH+l#`Ois=QqM0sM@w7T0=CzQkFJ)0)Ln%Ix(x%bKY zhmy!j+U2pttCKp}?Ym)tA@2-*4X8-u2A~Dr4zCpGpbTa_)arJX;4pQJ7M@XP?ZYH# z^PKeYqwIUc{h#=1>O&GrOkA~`TZ=&f?6T_kh=curn(!u2w#1TRCN>EGVx)%3R zu}Zcy-T13lErTeUZ8Nu_1AxWN_6GHgooDk8|Nm0<#m*`j7t+_Nfu#9r!`5A0Z6gG7diY)Agf~&+k2q!Fac{_acS#v zvOaGHDC9<72&3yx@S8?ajg0h#28MjPTOI7<(jy1oWZiO$F7=b@BNR#u&fCD(U`V_J zoE=7%ipYKD)*#nhZPuSTACMvM?0?}XsoRwa#DFYIdwI5Jq}1@{2{=cHX&22M1G|=lr(X|ef_B0kYPBJ{|MoxW)mn|>py-3 zNcp=AHPh8)y(^bi-X`AtcwZ4H`4_}bB5WXwK|MV5}a>@HBP}Q}a@dUyw>iy(*TynGPe1sLLe_#dJeA>@2^vQ2W?4uui@DZCD}qFIMZ>1Nf0m=m$baHAp4CmUI4rDfZt!nqr;zu_3W6_UaC_~hFp!gDkQyDyHh?1B=(_xy6FeG$X6BZ+#k@D1Ud(udN9QE#Sg`) zC8IUeeJ-fZzM7}$p$4FU?T{)6HK|zB%rav|f$@XHQA^1sLsrC54yr4rS=d(f&)B5U z&H;}rWfGQBbJtk3_e`RRbTf@{25q>ExR^nC-O?VBxA&b=Hc4d3BU4IC515ikW-C|I zNh8#HYG316M6QhbmXkqlFj)g+90jut3b=_;0xD4{VJ^iu!%yAA}$|T+;SP{%>%XvIhvnACF<2%E$Ybm8!A1z$V?a!0Z>|h@Nu+ z0Y!h#QOkez{G_(N(4-rIydFl~z2Yu7od}Db-8_N(FD#SHj>X=bRL?#IonWY+zU`@F zCNnFNpWvZZIamd<8aX%W&P&be`6%yCq_NSLlhRedfLIEMXLbJ~5yF;t_)}W}Raye7 z-=JsqT2L7sdDSqt=(qY%!eeWnVk;mXtcx*p7RSCpa`n zPJbk}B{g@y{e4|pj#a&_u>Y^aYV)b$<&rInl91}tZdlQxSP+p}>@Ik6C>MBDx)srN z7%3tt6w(G~R3J5X&Z=`fttMw`ul`dH^5TtN%h&+vs5y0h(tD%Th4JR;Q1xv$Se$fV zLQ|A~rDnxSOYxkx9baXd@FD-d(X;y+lNDqgjyJ^ga z9&v;FsJ}kd0wWeQzi_M7vxV=4RAU07hsQuv^0w*7()bD~(<{li?Z}yDciix?oQuY(Yku4>$lbDOY=)c)4D7lRnAf3a_=-H^;eF)K=~qCf+ZHchTo1(P+9CbB zq$4IY1Zc+>ZqkCmR12XYD0Pv9O}bmNi3ca-wyKcn- z2UQ=rA$HJhy%35AN(A@Qq9QXVdoc{6I(obF}WeiPi!053I04lKT7U@gXILI ziS!0Y?X*OOQlA}!rA*3DL#2p+XM*jgD8IwiN6}PQ_mT{U5}q8$)@<^PA&}R-31Dae zqoy=}tof_T_d&tcoBLe*xN;X(2jL#{@UM~Xn7v&s#qLeOm!%!IVp)_oekP|47d%Tp zmX5V6FVFB#m0hBX!mn%unN7Z>snX2LfJ1kqepTqdk5OJ@1olMVP=M>jf zCHv+jCGasw&s_AUdNzgNIi9-hd;N=&nZ4xWCQcdNKGB%NstdPM!z(UmfCp-q<34EV z6&O+uP+yWg9_&1P zBsLpqve<2M-*B~4^d@z*Ex;U{EjXBtBgC;+y=-}#n8($>Z(rV`Ci!tP2;DWJ|5m%a&%;O-Oqu_63AjrEf$on2MS%KSsOOn;LF)Zvt+>AQprHs}-?dOaRq7fCSW z*|ZI1F_=x=${sCB&jC8(H!W!kzDyr4AZGT4eBXklyq6Y9-U^Z}?RP?ntjPy0ivx`6 zMAFHC?@wv@%l-6JK&ehm$hGk>IZB}mWz_(Ck_YD+M25d-%=5348a`S>;|la4<^S>y zNuAyL&GWN!6%Ay*y^>`2GnwD^?XRakQg0#0^`1S0u8MSF@Ecd7i|gISK(S$WrlA3Z zu5&pHm>Y2NzGvlq3QMvq(-q54hn>5!-+G^S@$-=MabSQ!r?L&{POOa_ePZggn}8= z=b7vK{Y-lpqmXm1EiNYVVHiBzY;*j`l1>hg3Cf&L5njts3 zF>IH*yROsf+aHIn6PG`44XP`lV7en&8y%o@9i)5At(#%ooo;^I!hmr~T2svcDgJer zc2zA3Q0g5EiCCt2QW^`Vo9thVcIyr>>FE*UGjgQ*_JjTHh20ZR36gh(SwyP{Ntj@j zR#`I0RUzqLdl$VPW{Q<871=b)@PyBUtE-bwc5A*) z{(8)}_??dDLYcC9^MV5G^I|t81j}Q(%}mvR9j%B(bNy?NSN5=9>Ue^do|aY>9xo3a z@!A}l|6>x=?xyxiW|n$Clj1{s$^4jTqcn3zH4$WBZ~{a#mZ^O*i9NYNnH)*Qz|f|6 zXV|qMiG2{>Ld}@?DxVr~QN5=BQM_SVYnaB2%b9~GK2Br*-WCEzJ68c2{>KC6GneR* zMzAg^v$or}wNY)V#&SJrZsKYXK=Sy95h{p z_{NO=T^;d^L`Y=j2taLQKFlWS^&%C*o5q7pg$0Tow@3)w0+_LRK?sSt>7UK2;mU}f z{l~zWRNB^nHQ<$+Xby{|*Av(>A_WK{n*IlMq}AB)mhuR%HediQMv$j7NJq=7c&Ych zB|iXMOL)Cm(;od*-n##5O8?0t;oOo+MMQnU>X1mYinU`Z6_@G`W4CH#hW0s+ zHd^UP0gwK8KBC2du=?sC%SN_|VBtEmYuw zi(2+qM5TBfRlW26}-VwsWWsb zsRFyJn%zeE1KRu1PBRlgIYbJd0xW-8*!f_i8~0V(Xj^kaAu~^I@*T72#oGofI9Btx ziim~tu`zH=`cD@JmZ79znj66A$!+c(URh_X9dba-i+Zn@&GF^{3fqGI5a{*lYr|cq z>HWLBA9lHXWhUeKZ(;t?f&VP8M&Qbn*M>M%-YFB@@%&OzN&I1>kwv&ennqGx%PrD% z%Qq_F;6aWr`#vM9@EdW2(XrE?PeeUH;0Y#4tIL}Ta92%PrK`9j5=*zvouo%ANj_^L zE8w~~e^lq8W3)*16rDC#+*TQ7kC@Ny{bM#7^{vx)o}CCd>YJjU(4Qd40&y7WWH$KX`Qgb**+k@5cl;LfX31vbtql>R=AXO zvk3YVU^(X_k-zQT~eN+C{3x;jiw)(MOH9f$}68WmDR6L=gLYB zzJ{`5kP6xaPEiH($l7h->j@Z;WN=;A8Glb~h`RJMonB`3CFVcZkDxMSSpmA%ok7Sd zeF!g??=ajTVG9y{>aV87xAtPL##XZD>JDp>WyP7-JSI(5>hht7ed8OkqTIH5K?w0| z0t+@UyR*)v^0o0FUCEiGy)VT>Sb5COaUO7#h{CtgJYVGUE(R}zK_pvacYI-oxOUn{ zr1spt-jG1pH@?cfk{s$)NGC*nYFtBAMKGI1ZwZrFMF*46v;ma z3!J!d*SR+6{@<0`4~%~2k|SGP+M!kQg5K(bCdlpO)o!ysv9>Vhfk^z#<=5^6SBkEJ zWIgU8l>R&X*bf+apsvUjlBq4q3onzYBJ4p zbEc}E20^hGB0t3Q^uzYbvaFrerbd3vH(GhA&u>#i@@A74`3I`@YY5*Txgi4sYrbxt zd2KZkFPmR6gN7)}7 zwK}9sz}6K@X%);H(qQM2$OY?v9r~4=)zhZv0YS57#F{9e(+pQIy8@KfhHrc71As`$ z>7>m6%h$LfP(MoN=7FA|7nW<_g81C>~V41X?t09*%Kw{ApJOw(9i_t z70o+Pptv{}yj#o zPl~TXc%L#8%G-F<=Rnx5kQSz%t;bED_&Kx3s&U2H(u3AbIAqz}^D+pJz45n}dXgo^ z9LmVGDcWsZ6Af=nA&? zz8C93SsO1k?x&BQ`I?U|T=?8&!Oy8`E?f`xfdafA#SwNpZ9AH2?lo^#(5E}iwqCt^ z%Kni+VCOIaV7A{BipA9Dlrm)pxS(VxU3uY(E{F;AZVg&|kqm-|8TxtM2sFAGsB*0a zwN3vMV!XL%1AlSyscXc0@LDz%s9l~E-0uunOZa%~a*Vj;h3}dY5|8@o>zAD_6w~W= z(hImZ_TA3!`RT5uHgkwjonFzR@bKa3`v(bn(I$Lym4oQvuKE`>fV!t=$F`hKwSr8P z*TAoJh|BhpBPPOB(&2EOC$;ukzaHTo!mgVFIygvpC=SSM(Dl~b*<5&tj=Bxr!EsS3 z{yA{n=2{UY(_o#q&{)heTSNQ^9@6xc&m+&DFL-t|p(hM;0r)Ic@}#|Pwt=7~+S?uH zS2qYhcXZ{mZVo0_bgJIr2q7seN@lk|M&W*{ zOfA`K(GR*vj6nl(-1^T=Og>ut*YDljP`ETyYEE%|m;c!*xlqox?6{8<5Agst1qJhP;#rd?x!6?!3u@b&kUFcvAcAtvXfMx^H|l z^_3C$+Th&ZJD&%(mzCKpWzx2js;K=_&TGREZ(|*pj@lsns+q=<6)5%*JWr&!nlR7^ z+H|l2xxe&u0*bhwyR5korWb`?ZW%}fhi(wOvp$(F!zfoukoV^(EN@6pe}V<>eE-c) zn`f(B8-mZitdj5pcq0{M8q1^hGXQX~smuyqlD_g}?r6^HxM$PYwKgR^!##Tz!c?S- z7zVzUljBl@c)dnH<;XcBlf897cUu|10KEm^-u;VIAWdg0%aJBEP7C&GQytWIjUd)L zCXGfiL!mhXn&bDGo55}5B;f12VU8?2Hu`UQ+8EO5q`k!X56b6f_S>E2O{Fo!^XVw4 zLLz*?-JAaa<0ap-w&IQ)OzPy-Jw$3M-3`Ovda*@8gJx#T8pK38I{7TK+a0xTUGi^x z;Wf7Nig$;L4kb!FRH3*F5MGq1iRtbIIrys$J6*Pz<; z!CicH@TBvA+8Skcc}8J?ef_6#yQ5?;{=CAFY0y@B{0Sg{=|_}>W37*V>}I{^LFpBS zo)1eGNXkxp@>;(>ReikEDouZI`$t{vg3z|<#saiU<;6e!@Y;whlh*Xtj9zXx|LXE$ltrSaYAyQUil#e!T)K}GogaMxaU^H z?d7`e$#kRcZ;e;hrY9R7L0;Ow*@c~)v444!sXVTJn?lS(w@+O0WZ7vw+1V7@n3bip z6b1l``-fe@6W}U@d`kW`^YGr+x#TpZ54R}t^N>Z>YNRNSvi!}Gl~}Z=0sscv)1!f^ z-N=p-#zq@mg7sq9>MzX~A>V+%dEA>#SJQ8@*Lw5e1F>he>!6-klVQ1ed>5qH_lxl4 zv4~_3$va%dmZP_CEaB!9C)zXMkMw;4(fQK=9J7rSk#|vZ7}R*m zkI?-ZRA~&9X+kIOACs-zb;T#jgk?kx6!&isj@sbyJ=cq9%Wq5jjLjg(vya5KaiUoRqV>)aQ(6|6K?zT@L1{d0j%N_m7sL(Es8 zaa9Q3TmvU%Gya)tS`v7XParx0I`WpNl?SuFv)w;NR5dgA*Jh#nAS6}`U%JRW)3@~f zgX73_){Cz6XZxyH+aJZ!DwNvdjzmMhs09Q>N%QJU3`ZSl7MaDnYsh2IsPCy4fU9OH z$FWz0-`iMyDWl|tc}(;GV`Fb5s-F=m8_;<6Db-mJ1(iw5Uik_fL>;4dVr3#=CJN^% z!m&}4bT+u5bC-^ZJ!GMD@#eIj-2O;w4W4Sf5VCR-Vh=*t`l)M3sr%We0~68fd&Ipt z3;W^@*r+0k!$20M8nb>3ngUC^(HIHQhy}JwXuq>8>#-Fm1$0D{7%A%)=Yo4{LU2dQ zlMk}BLd~l9p8}X>xKD$k;gO>XKBBvO94p@DRf!)=i0#*c`oy!yW3}v(z_81R02i6I zdoi;h%l`*I`jFLB%iiP@qjP8dS*&dh2h>l1o(w50ZShLt(1K|?=VD_tmBm7a#(v@C zlUSx7k)>_x@RZ@mZD4k|yszDvxIxdq#dZgaH`_e#7>b70c>BqERfE0fA<|@5ogXd* zE7h4%mpUYUoKV?mzb~~>aIL)wMok}>iaul3{)^EL`W`Nw+0e|_%B-=JZ2UhKHV5g-P<#HnM*i?4#5137=4xkgt}m>R&|vBvalrYDPK&7{PCx4HFY1POTluH*t*cwhUA5qSDx`lUWX;$=;Gl364G$^tpXz&?)!dO5K(&?W}fOH9~{-Ep(B+nw}_mp<8(O zHHScB@3^I-%|Qf4`8yCg;`%wzEXbJpTv8Z+4Dd-}ZK(M*J9xTz^cfnfmM< zo&oOD7SiB#T2UG^7y#@ogjRgvr4fF&;!r4Cjym2pf=;lkBUtzESin_g?Cej_tHI!g zm}9l%MZG#+2DT};wd^qeHZvS`Ih=3re(7d}T74kL zWtJ~nQnT%g6zf|JZ{y!T{sKze7@Wk}GkRWDW$fgAhTvmj2L8qdu{XGp4GYAaRsa*S z<*{NA^ATM6Xb308F_PaPd}Ot`W6x=aEqsU`FCYS@#%TVqdJ4d-@1&&ze7kDL?FsVS zakcqPZS|8dQ4AGxzxp1}tU(u`2#v|~-9knJ61dQzSR30ZZB}wuB!0vN=nB*#NmBd* z0&8*4S(sXSJju$Wx*<3;mNd4nivV;FA >#|f|S%3ejohgOG)shzk@{((&Oz@sI|vGZ?@6Q11Mf=7$ZA~^wX~Hf6%hNA zR8H%hHh}?{Y*bv`!=+Y>)5n9fOrcpZ>9$v8U^u-0IMqO4tyhg1$JXh{O>fCM_7DR~ z2_?e`it}#&4EwRWO=i079lcFfG3W)wWm%RpN=s7X0ySiO6KalkDqa}UKTbr?bf%0g zrc9sr-rY*Phl9MZ^=Lki5M*_#0^H91hEw}E!o4L2Ud8**qm8Irs&FVQ}WOrZX^yEF8gem*SrFK`2V*S_GPUpt*6Sktn*7VW z!$&~aTgGP}=_di6ZvZHW0HqPlD2pm?EB32FHY$b=(Bhh2cbH0%w{e}#DZ@oOommhJpjs4bMm%R;j4z!>D{>3_ zCHK2+7a{X7V5p7j4Ri`#dhhnLu~oO)yz6o99?ysjuw?V%ZvznmaVPK0_)p2*Ym@^H zAOL6ttGXDksTUG4MFUR3a3B+TWtc54L+JWh@+6PDsW|Guk)}y^$%SynUE^@J%GqD-82@fvky zOzFWTp!_uLP;nvCrxMM~Yb&ZDuFy6w|D{I)R{0GGcAm03?_@cy)iz?)v-zQ}I8fZ; zv$jz6eBHj)lvPf|$6JqCg$y|?VOa)1{X460l&gOfz-rO*sXr<;V;KCXz=yyqM<0{h zl_NJ6V#S;ANzDO+$FN1@4M-zR62~_$J`9>O(}b=PCG)JbZQFqE7=Lv>z2E6#$D`l! zo8P1q@`1b%Y{9#m1oPfLd^_wj@8M=}8qXH2UWc-+cU&7B{&)a5L?FY_vkS%;lwH7} zC1jGyTHo*!?3vG3cr%w?rUtfMxL+;ck(3~r7)tkVVl9az_jb|9veN)K!kzAJq{r&f zfJ=(G|FJ#(+0`QCnuuO?<*|kpKH;TX^UH^ps0L8BYV2ES2M{Z2IakViU#%P)&RYIsAq@~=1(b&z=>x6(`m|DQ0occt5rkX^<57Q zVwjpdYvp;M^NUvj(2e<);yjrIg=!R0USo!=^`_I{#D6`R#|^cyzy(^E^3tt69Q4nV z=D1TEluh{tC6{9HnePM85gU|o_y1IbsQ787H%x|}s<`100n@#qE$`4HMU`QI?PZkt zgDUOQsk^6JGW1=wPDD=%mmxXY@G|X;(6$5L@>8ab0zVUuS4fls%vbKy>c`eM+M!&P>>R-y9YUd z*<5$0*_46aupXtX%oQn9sH#o|nfG8;=WIJfi@@43Zl#uOKm%lP{G>$@2(Qd|a}ACf z2wa}JbvRa_z+mL;3a;U8px4BCWm?sG7V%jqXF2CDZkm3O4VfrI#$}phLq=xYv$jFu z>7{Kt9yXPhvC1h2tar6G9%{hropaAbZ3?YCs9UtH&;H@VWs_MiJW@(QT9hzA{(v8?3_`cH0S0gXd&-x2sTBQqp?n95Pd z?e-?MJJVIZJfpv7m`27B9g(Nr@<{+G)o+dtxkHNeGltS$m|>hb$76k7Z?|+IR;+df{k9fiwkBK8c3~*^tlsEbeIJoNQFH4JwFDfTKhPDW zS&(X0>J@bB8@B~aZfDMn)rJ8!sc?#yq$RA00Z0j%0AT7Ul$|xfxHNKf9XXk+kGp?q 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 J=*#@m{|i2ZS@8e> literal 0 HcmV?d00001 diff --git a/docs/_static/imgs/example-mathagent/learning-curve.png b/docs/_static/imgs/example-mathagent/learning-curve.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3ac3aef2e78657db45332a8260ce58fd945425 GIT binary patch literal 467529 zcmeFadsI``x;Lz)O5Ijd%WmDE2CWLa+X^D47$k{`l~Tl1X}QTo1&u&8N{E<*6-3%1 ztq4MuTgXzmO8_At21w9q1ter~2|;d&N=V3sq>{^$EP`LU&)MHO<9*-rz2`e)yyxBf zoc_UJBxB6Ap80#8Ir%-$^P7{*FAw^y_=D3Q7A;z|!vFJqhZikca&^(7w_M&?YWv1W zM?bgyT1+|Yw|7yUXsycj;ce2Mz&(o=HDoWJKeoj7dD+>|!zhaut$g&`&*DyURqUcg zZ_54m?fL3L)KC0n1$7}`S6Ejm-aT6IXj9(N<$w9;=D@|bdO!I~p54w%&+c`}Zl6Ye zw2Oc9#jgI#?|d}+Md_zi2WpT0_~-2(r~ly(PdRU;ZA1CLv+1U3*!q3j1<|9?=#uf_ z<}gORi9?!!YrU0X|G)fFj$e3{?Hpkl$d|5LyH@-BaDJtc*4!(?dvY7qXY_N>DB?k|?bl%?esDSwySO&>nM_a{~L3Pve920gWBj4fowVG8J$-XR0bv-6C3ZZ|?Y8E;BF)D_CD&FBQ$s_lndKfb zr_iBFoQH?kXCuQK<2jj5rl9DA_xWbiJJ^I0!d3Hu`j5ThayhOOF*qm>ER*5a8Chb6 z1hRe+Bf#9fLu4F3e&&b9dOvZf14dmbkZhvQXjUakyi?cC6h;M|8Q2s?Z0)4m)`fou z;6074hB+W|{Ygr~(XT=CWNz{l zWGqU|bLplJ;3Nj0Ie*K{;2y}IPqL2J?@%1EtFbh>x+p6CjL`RGVGflt)d_*OhXv>j zq*_B~KU;;FatX{el`%L<+H9V2tTLUQM~5uD=s01^(qK~@@qjS!klA$EDdF~ht9ZC* zUp;`^D+*U;m*NH!o(2|e()h!nkU{RMY9ZR=TuuK@$A%~mzDPa#7y75IyKzk)x|Ecy zOuXlTj8r~hk-8#~OxjtHXFP)v)v(1ENr!xKrLD#zw505_6*thib6O2QVc?+PrVFwO z`K9e{MHnr3a%B1~Q(t&NQm*%O+k0FPh!@hn7dC?h_Hbc<-u%2>?Z4u}hZwQvoq&$( ze(*b_c-4kNNFZ%czi5<#$~E?RYu(f)x7BN6hb+G^`Qca*Y>|-@(j3 zUeKOU&5X287h_^9#e=9W9>jVEVxJ42!Z8O=L(}s+P+c_;LNpqt-o4?BI#eoZbpkWI zvGcXpf@D;TxR$n5nTAO$w1?=UC>DcV#;$^Pgj7u-TmmDE&ba4hIobQn*}3oc2mcPm z-*Z%WrKUb<*n3+(vY(nu@22Nj^H!5^6E+4Df(?zM)CV_KmTEO=oaBS2bwj(6CKtwu zJHF=gQH@@4knwDX`=>U(7Bb5Lz2n@wejof_6tHIt`q}MR$5>xU2z{0(Ort}6h~&Kq zW#oF(VB`a~_~&?(`A?f+afE}U(cWi_Bus%K;tsot#R2pOV%NbdT1>}B8uO2g9rRpo zXGAVDELzpA+-|SN`Rb4OCV|OmVq)@Q#^L2PxMwjxjR#QzLwnG_egk?KaFlZYk}reY zRf~hb1D=h;^FMIL+;#oa{vtHR-*N&dcLjUaR>AM`$t(H+>5{{Qi6vV9tsL{w>_dsf zUd*wrj0arci4YcEccJbL$_U5FVR_S zxz;1UEc$nF{ttk2qQja#iT-)S<*o;$%QKz>u?6%a0VUR-GB}xnErIl=51+N1+#4A0 z`GshyMjpbKyE+?!0vkhWu~Z%rcOP0COO6-%(p|Q!le2V_LN$#hV){G7h3VBT&EgRv zt*dCdZJ^9AAq_}y5tn^hD*xv0LFP~ZbJl|}w23iP6qJvM(-GkwbHx*%GE(Ef9+3(! z;;{3T+Wg;*`7eyjRl#KF>%tFdBJkFWZMS&~j%#nO99V84op~l}eS+3kNhg+Yq`>elE?S%G>J2-`%B8U1 z!9+ds&5E3!?0nK~x-7d49ZaQ%u}X@Qx9t_Bb50Omw;#>6=D=L?)CvnVRpZ2H2kGC4TcT) z9bPU8q4kkuYYP=r{l55dVpL!FH1`0F(k;(x<$zk|2j5ZhOdo6^bcGMn7-P^gOc(9| z$=}(3YiRV;9uT0!77gQR$7#n%!KtEE_=G+WtFE}4q~>i}pnq;YiEa(KTAb`ZKa*D1Blj?s ztu&sI=^|-?(us{YU$ZK4KjJ#G;gqSM{lVxyi8jy$tXAf})@&FlrcFm-&qz1FYO!y1 z%j*>9dH1yeZOKy@T5`7W-I2;3#~H9G{|&AVO+1mlnQph%leF1vf>tF>OL+1 zu?#)kdH@|nRPWZCXQbDMK`c zxp$9z^cb{=J9Kz+!}9asyu9+@w$B?YH|{*Jz5de%H%SPPCjhbsS;DAR>6g140|)51 z^;U0}T8KYdO`sg#Ix<|082y924cmrXB6D%;ZXy3@<7zvMEwt*H_C%LJWq2T!_3lB-ItxWw_%Im~tcNaIfH=0;!7=68(i67$=} z&89|NpY&+`x%sOxuU~f(8g{*zU%s+qQO8T2agaDxVr!NjDRI9#_p+U_qlq2r0PPd} z`ecnZIoRA_Z#cfrND)}q)uz!CL>c0P_{T#&T};(@nLXdkC;w_y<(YJPrv^R9>@!rt zL&}8<6&-@-VfyM%=ahg}ML!kwujnVEwo+X=_)`09G&uw=uOw=ivsC= z2{L4<48(`&7wT3a3o3hDDm@y|Ws@wLJ}*_;$*yyiJofBYEkmYOsBErG# zkKBKDZ|nVNpeETIpfpn4MbBWt212wpt-2#&A1F()?14aO2xzc|*<)V*cZBkP=iQe5 zSL-7o!kd^QZyZUid%vxJZrlLzv>RX5VRF2 zr{q=m>#wiO^33X^Y%&a@2eue81+|_st)V*{alviGL@(0XMH>1 z_uZU}vT68Rs^H?nvrato^=HP9Gomkmf+@=Wf22v3g(w_=BP79yGOyVjNZ%jddLy=% zA6v&S>SkP8h`SNmLo2aEJndDxh6X~sz2b_DQL4V3gYV${wi9MH@VA50W8Q{dJjiJ# z4|pCPY~GZh+f11m3ROD)0Zf+u^5)mq;-LEbz}8|Lyq6q)dM7lc#pBH%z2DsOSUULK z=vR?$z?%3c98$JZL5hXNUcrl4Mp9CHd7>|}`lHrY1Pd{$#UnCK`z_$Hj|W4%iUI9S zkVYY%6)s3bm;=?{9Lmk0DA&U`-SXKhFfkIY---ix;2`vUMBTSsL#rZ!RQ}|Y`+GrK z6h+31T5_4}iWe^3aTwE_DI% zl_X!cke^3rk(4^_;h3h?m#aUZ1k!h#y|$1~IeQR=XzF7rx38#Wc;QNQH$FtN&qf0z z+85*4E?iYlImx%Tz@$B7mq!E#xf}AgywJASVTZ%2Jw}&57XQF=!L3J%uX{CR7r36x z_CBr;JJmaukorU%3vNlc?beM>FrU?}m7~Q|1Ke9Dg>-XOT6ZO+o?H3DmPnOxV#(^1 zlwEesf5YpxC>diYaSXZt^9KiCUqxwbhGrFMM=DExhwg9CsYY^ouAe<0HO$g*#DAJu zay3U<5oh|t7-5^j`6D~NTN8E*(vo_X^WZJnIbrHc(uy71 zE?I;P#M8st{^ZXXYdkBTEU6|{x2%*T>UkT$1@39q`g&LZU`>E>U{I@vW zvGOGeqHEo*lrRmhAN^|FdJ|942904D#>jr@6JhnaJ?b!ZZF=)K<4jj&2a^X`@WDmw z+Dh7S1)Ys>0=?H0j%71K;~o}KVrRP}By?hvpHDKO3R;VZ&-bE%kfs(7N_<2P{RUlg zbSunWGpnkP)^P>d*DFYxICcS#t;8qft?VK`n?whP-&L$FOxd2_EOnS!1x=vTo}KvS zNUopkgPGGpmecAocDd9$w1=zVJa@7dE$n|8Mk_U~J+08nb?`K^9kc0Je z0fi@O;eCw96gd5Vf<@W(=hyb_+FCoMcRS zQNU(@d%3Ij9BRwfP|DQ<_`;rWeWv-cQfF@}i~&dMMoRTRm_I#vFl+f?=rDO5XG%)( z#am51fCO$BFn)vUb?_WEjFV0eES_7&7=QG|atUi=9#PRKVcf>O-=JnYx-BPI4rz)RqjT8`eK+1dfzFR{SY+o+PiXc>_*t1-a^o9lKY?Mh;^P2`@85| zLmEEhI8LAbJq6ymysO!(AV$FWm8q^8%W%^ZMXjVgJy^Z{2#Phdw}YTj#Fo1%1j@{! zulak(EZs)Q(8X3^CS3Ww2zizVxzCg+na)46hoIvB)l;XHm1mq=+X+|=d&yR1yK^kz zZ18gH0;f3dI=cX2yT%8bmh#WFW`~B@skggIK__p03=!Yal*~qecNoD0vdG>Nk!fm2 zIf*7FKUqI4J$iLccMAktf$7-=IfwCK6U)HNu|5dfYDBna4hGYY>lo~+u%R`^Co25$ z$Q4yRtP82})9u-~x%mMpO$Tq#hFROO&eN355(EC!&g5+F#Rx_^R?(KhWU9@#dXPM> zF03z6gzPcfk(>P%Ab}mC4i7ZlC;`+_$C@xlF~}bfdhqR^Kw<&2mEkL&=k6+$EU| zij*!CE38T_g06;f#i$7F47ZWKp3@Hz-n6qw~(1@0h8Q-tI4m zLI85W)X>wVJ16`&HH)c*4tnB>61c$?j2_(uS@GZEYCtcg9Z>g}F125w)SdelT~`j3bIU>J{|KBu+Z zS0v9QL{r9kGSl&fMKuxZVu8GDXyeAJNLrO1R~EAW#V3UsTK{m@Eo9t44bbLNy*R;A zThN|sj(ov4&sC*~;VWMsG^<=Am9yj8;w|*px0|=1One(x{4;B_AqVHLiJhwTqc@X> zH(`zjc6^W*G9cK}K8$z9u(i-4eh#QI6knW6_PSaV4B~ z)93Z(nWD0#997Hl*)K+uzk^4WrArUXJcF?#m0(gy4~0vvo4&S6T<0T(ZQQu@> zc~foP^%k^E(ioX1zKF2~ABgft>VAzvQpCH}j3<9_MT~iM6xtbc?+3W;mqxE=&|y6j zW+V^afAV#7@yZ)`8jMmY9z1eV6c>47J{4)JZvX19`T@Uo@x7; zF=IGnSFLxfVQB}6t)eO3h*yZQ>z()zw3>lZT|e~KcjrpFpB~9J#>?vb;~x|;x46`o z0U;Oa0et*=6E5a@9$@hw=J|LbiXYI9duE>c0(u*n`~#`mCzd$i9Y)h!i<%k3_^${Z zB>y76-lYG7z8UgcQ6?a95*vvGm3O}Kq%5NU-{IwKrg416c^i0sv>Fr%FSx%nm;U8h zSzJ_K`-)G@)vG8YF?FR*)(7uMPRzbN8x}x-X}W@_<2c3|%x%dKRV4Csk-*0$ra330 z1slA2O?X`1vjz6hrXWHrfv25unuZdiV%!))>Q|-Ce|p$@fV~@^pi<(Yb%OyM61jB0 zxV2R@LVNPqg6FI$8PfK6$t!r$O49pdGHy|u`|LCV@X@Z>5(s!b8j$phH(%6 zW4ig%_)^-Xb_+@`$-sNb_Fl4 z4ptRDHp3j3LdyoE`viG-cj^s;(|;gHK8KdQQC?X2jfb515%SDc;_Z%g$EcR^h<)Yv zs226of3JB?o$rIlQl zyrq4rsY{YHYP>mC%IDAAI&-JxUN@eU*(?eW1q9Of>Ku})PnQVjYi=dvkTj~11xYU{ z5;S_YR-UvKuE@19^v!hrU|62N-Lx@rkLH0lhOu35>w0|YHFRVw7UVt-S8i68yWlp! z%UZ?v4o35{`Y>HwlkuBWje=W8v^Y)#aaUS+EfNp@`+Qi%=`LHGMCaY49xW-t6(*C( zjH+UF?de7+?0Bsq*KjzGorAm`8God*Ub=tUNj^fS-|L_n!iHU~S9H~3_SW$unu4fI zDUu|K9a!YekLdHhd$5-+Y-?%3i33fNPe+uWG)QROv}%817jVg~xppvwyfJCT>^C^v zn5=b3YSYTD)P z;xbn`eoy|WL{-zWs&y&t9-BQwo=B0H{0XIuc*!0DEb*=gxeen>FoioV9&}&bw2~9V zbv5W_PNS$n{N_M2Hh@EoN{osha7YAi2AtLyhsNHCO!qlLgv>2x@ES`Q*pI_#Zi0-2 zb%R^_8K9`>fYa{E{N>^HlIoE>8f?Co(ONAXbwOC0|6^fPX@vT|EK4IidgPK?v9u~E zVS5nZu{u{cs~ zdd_jvKT>CB;Mhay|7w_EN9a_w~wNWSKW)4iIH9qm%_b%mf7; zW%1n)i-J(qJO`gU>lE=As-5h1Rt6Qr4oU2pd=|>uF7n8?N^AxiGp^`LD$$4YtujNw#JC}~g&N#6%5h>B5m)AhJcN(c!PBOv_(X}P?Ah|^!}azgD$O}K)kph^gXT0; z6$TgwLFB@jTHCrv2AR(dhscCq1-u6Ufh;BV(e6bj;*AFH&It1n&tXQN^Y+$cHvRKR zbGrUfguY*M9guTKf`-+7O-6$TNSsk^sLN54SB`9p3stSt?~d z2PkO>Q`!#RG-NlS;fAYEZlN{su>06v;E zGzElOU)}BG((gXGebTL;n5vuPHQRQU3BZyD`SGm}5XD=twVg)Tqa0y&&-Fo?wUiNZ zZ-jnNYS*-srrtmuK?zV4zF&Qa`5Ko!_atg}J{`BSrU$uenLL(FG9AtOtT*B|xG>&H zN%(E+`~Mrj>bjwc5K(>_a}ygWt9eenJWBiO4J31XLFB{D;{zsd9Ow z(&w`;$MA*89mmW4p*q+ntXJ)5&P#BoR;L-K(FI8kGh+v&4n`tZcw#FhFh18-BvrUX zG88n>J*mX-$33T!SgG}g>n^x9sUa3qLwZK6HNXCJ!Wvwii%u@dm6c;umsSK8mGb^j^0{9S_2(D9U~ z-|T({p7Wu3xz1mS$+|rFTv!89P~X_vgP6x(M-6xZ!p+tGTjl6r?_bAh-8|KcS+s;- z!`ODm@UCJ#<0f^+PK!&%l`_8c6FLI-+>y*v72|hg5yP7es;R>3O}2KK)62iOtBUc8 zTyfcliKs2>F6i3jYGqc}-C(&Rx$p20Byx;}0+AWn5qBlN^}v0dm>k;ozj z6bVhE#j7a$!I>WBM@1jEsJ(`%-6?e1$<4L?;q~9&e;Qz^$mVUrRDWkHu-LPAxnsR> z5zV;u|rw z85p!_B#Xp*ZDlb#$i`-h(Qf)<6K$>brQXodm5uh{!}teM%CKjvJ@qlGpM*4mmrp*e zwe(UWw}VmaF#m*HNzI13*<67t#?3!4euJ%4lcuzhnLt!Nd{-Aak$$Lzw9S6Rt~SB> zsGg^BoJjXRE}G^7BgB24Q^8h6t6L$_9paQ>{53=Gh0y$EMw`0Pr8$QYs(L`NahZyY z9!4l!r+Zi>@+?T#rb(Jncj0l<72Te79wg(4KvI zox(h^FZ}?{H7KB!P4WO&1xu^bwBH$3e~#b4$P>E;>B}(n0!(CvKS=%D88_Y|-}nzW z*3Q<+uRLGRG}W}6a)0$x(7}<3*&8k6B}|K|*e$_dq;^z1E|Q&Vhlm4@0CQ}Xey2jp z>^#TV11rLWq;GZC#k^-hiuM=T&cxgt!IJJ6rVsXk)z^rLV3gYejfOJJWV?=&s0H!&`) zQ6tM|@(+pMn)@w#b`VVd=`i@L&3Yx~GwklP{0!ivWcFB|x%8l$b!gLc#5U`@SFeae zFt-_pAhna+n#(%oj7_b0C#Mpu>IgpzVv*i{z16nYXmaq1S$yqAvrp+lU`IAvh5Tgh z@$QEwv2czdF*p}c9~oncOWfn%PjY*{V7@fRsgK_W-)0YCx{%G-NBG3o%V?HNOU)9v zkSkkjl|r5c+?BRnKtJex9P(7ljL3AMfEd@oaR3Nx3JU8^+B{MzXrA$#n7i$=NBNeH z>|Ov_?(9!;SBFKWw@2rCYBy$pe=la%12eLjI%+NVd~)kxNiuxD6PFCPEBWV>I}qIY za~TI!r4H&#Nfvy$weg_QdO?Jfx3jLtf)>d=XR7kYqPI(y-|yfb#cOJu`uSBP z>WW#WzvyoETIOCh^Y%jgLqMVR^6P+Yf5$k!mVzFn>FP7X6^oY@Pp{Aijk;_0$+DH> zzM`Hme{(hYG;%0eQ03ppyNHY}S8xS)R!#g!4<25x&zHZ8biHtut6cwq%v=Lum8^-4 z=vQyFg4aKic|f3WxSI(aXrJ2J5ewhV0ETs0@<7TUdx0)rpdk?mP$g%&}}erbq&0eviUb zq(w+qS51x3B)Tj#U*Pi*1S|D3dyG2v^j&X=6T8FD-?dcvN5 zLZw~ebTE6myRg%}+4^dyj)?^gJBS>Oas+)`1o`CjAa6DM?8;`*p+Lxvgi#DB$F<#X z03YmV7%qV0a8C1_6ZMQPylG&RLqaDmJ*!|UF3+XxUODm90f#lbF26@WcTTt~DYm8> z)#@|mE1WB|PozcPyg^c43)1scwC9{B?G{$g!U)8a=z>7Yu!Gc{s(-Y)jK~-rya(K_ zx8a<;KOJn=Qc)w7QQ^fVp|5C>XdGJGuXOnPFuoW!$E=18US=l)zSi%5WvT~=>biA= zcH5PN?hug<&x^X$#RP7f$AnE?iif+`)oqMXnN);Tx2P zl7#M>0@A|SC4L9_$_ix~*U6x!oH5Ihaw#NxmLNo$&?}gd#$jA6NRK-$@kC+mc2WqG z$0_*r8E0naJ5%R7CyJ%UiiwT|4Qb)nHfH>s(_FJ{pVOJ@Q>}+|f1N{Zq58M5oKJ-zrt_Y%_x9_=ldhWMNd-aOPW~uP&sItM(-R zB&qIBQ9ms5R(tVPfhhRRdE&Y0!JQ-JZ<<1uvwvgP=d-CBW6_Bnm)Ku}wA)Pw0~J9iiTF^+ z;3^kfQndPtu2`ty5{oJ0Ui7MdcYr7fxLTvBy~+)E6IcJCkFSmA&!9E?yL{x#CAb>A zVP9NH(SL%AyDdX?=bI-ANo?BvUHvFGv-gSQtb~Y|(5TaOxy=P z0GD(D1FdEDfzQUMP+{~$CvFvPi>4djp*u3=$&K5 z4b&WJKFP>)!kDZ4Yfb(dbRyW~rouX4-CwchhJbO0er_XMYtRV324>_bE*reM4`)hL9p4SZT|6Ld|I1UTo3G3_Z zH?MW0!veEzAb&xaj9o++du`8reyz<9KYI-nu`Xo95o1N&(rR2Q`D<_o46k=lHs{OR1CW}6Ti>&&>mi@NaY7|> zjtzTx;oScfCtRRcz;T3bcVp=>2ky7Gvp%XGv8>&y~ESoF~4LF+}f z#8>w)J4E!QugE)xgg%to{2Wg)7aOcQA*8sNy;?X0g!^e}`>n;yRNNra1j>O-0Vt{I zrp;`|*6ZzU1zWzM*3sc#(uT(>=5C^91N^*m3#n=YXdkj_c2Ec0G{HkI)(MG}H}nMAl*Y06>zI(gkwoWory zFZ2^fZ@mw(tcnzZ$grTOP%fd+K*=fw`_P*TSu|wC&$!Z}Z|f^f@rh9ke~|`RY%=@m zQxcy1t1RSPt8?EVy$kpH)lx=bnJLSW{#{W{Nl zrY%{F1exDw0{cxlu)QXJmh|mz$z>rF_B?Ez9IFW;RGENtC(k(_w_xJ?4>*G?FFql` za*@Z3&a#@9@w$hV=|U0?d4G1$pn5cdwkaycNp4mjCAw7yJgaGds?Zi7JY*92iL(kI zRKMb^oMoA+oy8WxPVRk_ht;Y1R7EyXR4fHCz=Md6`X@}}+i|(Zut&jV1Iy-AbH*3n zWZPsle=`-vYlohZzCu~?wKcDRFC>=*p!hSV~XYMy-u5;#CDSn0pexUF`UiuTF*NfOi(iP8oxQg zwiM!hYSMj3fZD!U;4b<^=X;=I|JEYaWS*e{CIvcg8`jq}$nYDy<}4{Wa~x9iUM3w6 z>>Qi4sfrL`IcQ4+hxsT5#_Txc+d_FduR`vi#Mf*%T|*jTYwN$$wXv8YkF)$#V#^ zb&!j9;3C!~+*y}Vq;)-6ztA^VoqBv=mFWXfNxHU0hX=g(N+|a{5@(zX; zgI}9o=dUQ&I1Y{2WGwIbR4{f+?Zgcgqvxu+na9m)R0(Ktby;^P`Zw(>)7GD>+!%`^ zt>NBKitMn4Wmrbga`V`j_jFNgR4e;X39!Wl^)RN@UXI)S_hQKN7-!^}&bFC6dZBv^ z*%~kiYv#=%%g$MWE>rc{=^_xv0}GP&0pHo=#z<`&5xkmXVx1O-vv;B7LRYyqaO*QN zS#vWXm!_icryCxR8IBzwegK$0pH@QtX#eJDv)L+w`cfM%LgmCcqM4Qy4vx$`>&i+)~F0|trKTI@Ne5h?{q23)@>E3$c zj}I6!ByECPN2xuHQaEI_O6)A}j*KC?IOBUZF=tufsdZ(Yaymyo)o(qv+3hD{Fa(z{Qy9_P{# zhc1g6l}U|(9hv`VLzCMl*R{QQML@SOEQ6rHb~MY7&HTpR)DxlDJ~rG1^B~|n;a59Z zN84O4Szs~>D@gLF-%b(D_RCA^WBdViQ>o057PGx5S}9cd36VrL8zsc{r1+h!m*H7{*`5yp=6o2tdMtk@ksmNX9IqK#^ew*?W!@7rjCUO>y6TJ=3y&};n&P2cTF}e8@&eaE# z3yha4z-)tUrAsF!^vvw7%-KB9=T^SOrs2E~+?uyVeiCduZZ|)89TIr{k1zd@Dc%Hj zdLJ^{QsTi~l%od;$EEoOW6Ducm}1u@hSmJSht682GfYCW2POoMY3j&a=F6yB={D7p zK!USUqM*r;vrIRI5=e<=_useIZ&7{cW(@^o?I88`^k%kaWwPP{i}|?SU8$OTz~Ty% z--azSk7&l74&%yBaH_Bs$TW!CHd!C@!}-SsmKQPcqS{`A0DdtaA%u|E0-w@zC~3&R z@<>aAML;8H_VwFR(Sv$n8rFK57A+byq+v;g`ge4uu?)lXIhXrTHlfFpioCC^PWHEC zGMed+%2w~Nrm&6_D*^qZIbHz>zXE9cC(-ToWvg3_F($yklw{t{zaU~s3+*VDRR#g8 zQfWsKZI`VY*R-IN{gVgIg3hToNNV$DQII~@=m5u?zV~-OWtrRA@+pK!GyW-(k=cJU zk}oSulBK$3#0x*`Y{&3s%@eieBRvuR8;GKC|`$Q>m zmI*i?Wz$wqPcT4)LPio)bH>CEt#Jq%-KCBP@-_`ZQt-@ty+XYcgR{rrYv+!FQb>1hy6_x6Opwg5DEQJPCiVtpK_%gD=&q%{{P+)-Im<9dzd60K+iA|I zUl7%%9JVPUMjl0hk{mK5PGcmPW1TOE3h+n4qD@L~*HX-{<4l`8m6u^Wu(iL)q%*Os z$2%CMOpfiso`ijp$9D)GsIZOT!i0=>ov5~{5E#!igHE$Eh2Ce$y=<)=8 zC}W$Jvd5rzB%9$JcJ=0Pu9VN_Mr)JF;_T~1;*(ijMWH5F#fAj=Un18hDvMddU^F}$V z!W?QA9{a>*rC5?vmBILGn^;48te%+A)k0D~;A0q#C?C=R=exwfTuMn^zte>?1e>sV z+?QT)<5Vvlri+*jGX5b#aQxw7%tr~whrogi&b5x-(`VXtOWEYoaB0?b~Q4w#uQWT(j2z2(IwcLN$dItc4|Poh+5ay_F@IOscn49 zjj?xykA|AQX8dTfRTHg$J6bc~Ir#tj+Syhq*<%#Iz}e&p4cip9VrBPynZGdI+6eh+ z3+Zj-r)eaAu#B369?7@yO!`3^I|o!=9z&j$!{<0Br^|_!I{JE3^^EnLR`;n z^8x&ENIV7vt@H`7Y^qH+b_rMwMZ**u^V9}(WLC4W{Hrk-Uw2?2dC0Dscv_zw6D{k$ z!1&N`v_orH#i)?#iW8rQ4Y@{v3#B zq^?CQ2cL{_3+#~-VD>Xl(|OrXc2F+f-^Ok=9lck4N7QCSz^)1KiUK?hjmdTd;qb6F!ZdA>x3E7Pmrm;h<(`u%~gr z6$ruQSj6Uqon}+Xl@^i*%G`r@ZXl^=1RvY8Hv_qnJ@nXUQE0CQJ3}U$%Vm$hf>=?V z4Mn%|@v1g;nz-^F+}TjCk8Q{ONV^+tp1X_-BEx~$Uq4ahHLV=jh$PxFB*>NyaNVsg z6?BEs`|8lUe51eYYg8G&nNPS10IriWVgIKb8b!5T9pQSOoQjOKIIEVXnnLQI@qhi! zeSAW9KDwc;CsNlqW$Vw>%+#e?HTr|QW?sG_uPD%+T}xZdeBwd4eF;1_p8SPOi+zDK ze*D^VTjSz^cgIV?*?qxp4&=@gKO73R(+p5O^eNU>=PvGgkQlwOC~1*Qhr)Ypa!=9o&y_5TYzoDHzFv)}%<`uILV({p=@Q%E95w zE?{SsSHJQF%Ug52_8k7E@_;yKoZ-CMa6~ySbd`ACIi0%aks7|{)YVG&-^x(Wy&^Zt z==2t6dCFO0?A)sXcV$h(Qc1byxOC1!CFGFy;6cIu9dkbW`I&f>QXIBAAmweJ2lTL8EmtzSEe&Q>d78fRf2-HN9%NF zUw`)N%srdlgfvr^GPOmoyU@8ycgE&SGViwq0h;F0JCi~TBA7XWl85C$mG!Fv@!5yS zx1mQ^s^pjO$&}qtVO8aQ81JTN5%CI%9MV@~3zxnh(r?7%P))hvX0i44-T#a!7foZ(sovgT0;|9sA;T&>5s6q^Ot!E*2|D-x)MJY z-FMdllr3$ni#puHrZeY@wJmJvj6K$Q+#!tFZtR(h=cG|ptp&+~|2PJQNm*=%$#{m) zHTRs|H9J`zEeeTQ!3h}trQKlCFxNwuQt&|5sae_;x&wd~Rdd}WPD(pluS@bl-P!LZ zde5Ba&LkWYxCwsQdPcCzAoOfmOZt!@xN(EkRuqRT4F`ue{}!9$&erspUJEH@=aq0< z*O8F^$SE{q-ti;OeBrtodzJDj?WOI)x3urO+Qn__mGwRbW~MjjCyP+n{u-WCAQx45 z?Gco`6=dCaZQV`S_SRgAZ2zpA;#$v=Fna^7L+pgmmYlZu)0>=?0zz4`G~>Fn%$#nd zO!=J4j#_bzR-L>@6iriD->1$A7=<>1Qdp?Bt3d9OaXA`h;!F1QTebsOas#lYyRE>_ zZFTHAq0)LdL96_rN#&~QXR?rm9H~tK&rBIZ4M5iok8yO&K1I272{v`A5DpMeA-WUz zjiIEI0#t$Sk-)UO4(ZNh++J=wOqBz{r#I=3qj?cI)NLRfP}=~8^i_ame#ki;;!9To zp>wZJ6Fw(|h#cVQq4x^&>8s`Q*GW?ML;3o){JASfOA6=kM_W;d#Ez$Pb=76M^`Wlp z#>-l+wf{(yC+?9vOp&@bKVe4gDQ4!PXF7R$l&S z@sW>UZ3pS+t^~O?-@b>#1%MkUGh@bgOBqOzJ!_Y}Vhv?va&54gnku=ep>H}hu&ckG z5iU~-TfV>kC5hV0x8_9U0)-hqyX+4`+re{B%Y()DDoHBO*gBw?eJqKbs=i23K1i{h z8Du?rD$qerNs-xa2hv?FRH6o9%}MUQujbV8TAT+08r=;!B;{^(n8NcQPyEBE+4u=y z`|ktfLC-6?8R9zI-4F$2+o?fH=*X}&EWJ*1?WVteUxzLZ06k?+!Fx-FFtFK|?r%PU zp4G1X9M_Zb2v-1|Fhszcm) z*?cc5%4U@Gg!k_d{ZA07N~VW#wR(!;|6%V< z0g`BGr51r&k0OIaMU8?GAtGc}Q7Ki3N)?chI3txoW&$>i!=AWKd)dNW4AEE8+&OmyhT`@YJ zH^eL$opx_932o$t0-;&NkNCS0aA8~V*OQ_E=JLd{f^Ts)6SBHNTT{-IR-N`bbHCs7d7X6W zv8%kd-;cHPC(%3OANSCC<~t;2_Q3s;5WniU2@B!cUe-u+uw&c-?V}; z#EzO$_d>1A^S9t9%AbHvZp*)bKlOX(4b7o#yzPc9rev2=?}!5J%Rin%nEQO@!XxwX z4>S=uUo!-cPS4CC-1fs}5xVhpl@4>uB7)ruW7cg^ogf|R@Y+vqXGaIchYUP}m&DBl zCH90E?;d{UdWJM`@_kX=^9Wo$?=J@(>Ur?A>m`Bs-2->_6@~9@Z#;tPSFX-MRYC{5 zBXerbf?q@$Zx>w1AwRua42ooU=PT#7#T};0yx#ntF2jQ9n*o^~I5f;xL@{_+4i!Z>6&-^S}10_TU2rb@3n2`ShS|h=D2w%L_<|3d?U0 z0qIk4L~J)E0tb%y1?qhMY%&(#vv2-;a71D6AXc2CKC^HjN8Iki zYn6J1R=b;W)IaA`x4w^mdi%fdFFlB@i{9n9ngn5rQN6!>pT~eXd&-OJD{TurELLkq z4V&TX34K6YwJueX>84|8yLB_XZ?m*Q8F}{P-E^5Z$fUgGoyYxP>G~ry2IvI^G(qbA zul-A`9BJ&v)=@SRjdKh`F@vU=O#(>E=E{ZMfE+InWfBZRA3VB&;2}D`l2rJ@sL5ri_8_eo||4-?p~v6rJWe z08d8~J|i@MO16+f!*oX6fPYPoUmH_btM#a;BfO665vwnhGtjJqTT9bv@zAw7+H>U#PRXU|{mz;~ zWauCvR<`1(sp&}y1D`yG)I8dkpbLrIe!n9C1`z62^0b?^7r{q@0kt@pMpcp;_cY}e zR=Og#hc3Nq`K~PG<^9KORqGrc)5&@ekIbu<9Skco6~%m8EM@Pr-;2%nD9T9TjSth` z3S`UT_c3~VS!B84&5cdxiTd+FPPSC~ zg%CI)JTMIZJeYC@lPezZi7Tz!#oFmw6fx6CWd=yjehY;i9NB6)_WtR;yUZ50_Uc0Z z{P(%yw^(i)JOw*epm`fTQ0b#tIJyQt_t4Ywkad(EC462Z7*W4Zqn*C10*F{8Mcs|l z`_GoE(}A$yuxPz$#IX|nhvQMYBM;`L>+4Fv3^)S(WIbUg^_0~Eeij`UksrShAJ#@M4!wX24G`ZPJ?JyYiUSehLqoIJ$o1?kM-o?*LMYTf7kwm%=_;}`Mw}df0jj6N6d~T9wPL#8j;uZXxey#2DW~66 zY1#!ugpwOp3Dt-)Jy}_T@L3%Ve@t%r^uNdc?=|_aVJEw-fKQMvvfhm4h1?fkdxG5x ziJ0?ai2EC-s$ag}ax_ePRwM9XC1%$DiDhowg)MICh3NK#yvL2$oRpw!;#>)#TlwA70cn8|;lNcTlnA0=irE^5l zX2R={_x8_5-hPWlCC<2QJt|f;-cO}{d6@YGpuLm|Os7j4tI$37?a-Tt`CiYQtI;R^ zjepbj)1V=sTvVf7sN%tl>sos(#~2sjdrTEnk{MV<-Ow`)y9?)AFCiP*-SLll?`CA(w(v zV|4e`v|0a;U{0ixfu|VHMf0?WZA9koV`v;>*bEGaVIM&hfa|^yQ{Awbg{d_4qe#k& zd#8Z^@-Qsk;}<@892T!mlRZT#A0v&A8@zap?`1e1K~Uu7lda^ILIbEL2m}q zEI;YqJPGDywr9|8AP!4X`;Kt}krFOT16J{%8*xUhkC5cv5S5 zjUAX>91Z4dmSmy{Jx+eLy5HrlbL-mwxX12cZJ+DGo=|QQKce>6tGl+~cFpSmM$|>! zB~ZZmR3MXgOy@&U)kUpI{&%28X9yg z4qj*C*i3w+eqzHH`t_H~{VC#9a%xA@e8l~I=)^zvm=xYKKn-qWEI3AaXN(|F(Mzc{ zcn67Rd)24ZzUm@P-@j=w=>VN5p+RmD1TC;Fe9n|&EXK^d`!7a>Z~k|uxk65{nNk5n zDk_ol%wlq$^^oSPHWRWu=c-)C?3rQzx{c(St*9D{MZ+=Y+A2+AidF2!`M%ULIZRhy z%Lc5dAqc;>@{gzG7ogSIl;f%vA9j+?iL&U_kjhpS#`6A2{H987$E}pz3D}^?(RSkQ zu=eJvBdD@#qaMWxNCnLsAE4`jw&VZj0aw!Aw5<5eNK5KD8558yK%5Wj3^-2@7S&-=yxKRR;T4mn9qu*u%oLr2*!rR=xj zICZ=D*1vvbKVy~r7Fm>>pMgNrzRh>y71n`A9lgLb53qKgzo91s?@2gv$LJm}YoOF% zN={wyHYFdV^7?N*-UW{pErc*gUJF~E@vf%+h{Q5G0~ubS_d9QhxqOf;Gatmw0TDFP zHFJURT=+NpNIBlRG0uq3z|Q*nBxZ4|IIitL0euHn`;5n4r~RxK{l@6SJmmuAv-+-Eu21`mm42*qWva|@L?K&iL?9~(4ue~@FZ8#|uYtw&dY$G9fPO*EF(-`s(=yav zx%L99woYy}QEbCwj&#LVKIK5C@OD$oBLboG?|Ub9xvH9OiurezC~3k znybRJbn|>KE`rKG&KipfD`A@R*J__Z{wiIjmh~?L+WLAJWLSskk9Kz7Dm-t#fv)OF zKSjExTXvzeF42>b3s8!*D%VWdJojMp@cILkdnr2Y+9uN;5ueKHhNoSevHTM2$#5!R zHd0xZ#_tIagyN)GMx?P9ipHV5hjab*$RkLD*cklFl5z#&QkiC;YesbkVCs+sZaad; zaB;p-Zu7iKnZVWUfvpN@sv0{~mfSD(PkCw?Qmyz5HHtEg3<{P`hVa5PcE*xi#w5nP z6e&r=d|q%h$VhU{uogc>T9WVS4&{)F9o6*yRJiylsKfY)+-^1!Q|L^lQp`{(AX!o; zXU{~jPjvu{9;Ezs-eXySH?8zj4LTwfL;cj8w)_8sDWxIXh^7jkdJwOy5f#@tqq^dq ztE;GEJ6%-EWk+E6}ZX@Z!ovIrht zB+CXs?yLUch8Pfw?zwV_5O_JH^u?P+a=MC!#>lTW>VE7zkV;?A9r)E)Rnkz``j^4_ zftrg*9TwR@0EE6+Ca&Df9s8m@?cFvZ8P@!FbKvUS%)!!dw(@QRn4))UfLeN@FuG*~ z6E1VEP=2rrp`6;JE<$mY?6^v3$`wJCu}s{kJ{EzRAboUHQd-a<-U86WER8`Yvg=iS z=WF-&F;0!aQxH5?#U;>!>*B9L3)UHwb!L|Qz@r+)JrAZI1#kp;9pV-7p7K}>658#$ zo5F>O7h*Jjgi8@(Y*}N2rWC{S*Yq8%8@XyVUaq=~|3_bM9lo#nHzqFt?-Y_3vSdwF zOhA-?BVbviw#tV7(!`o2SX|nZ3ZFmE0hll=-ZElmK~Vpf)0GJU|18wda$UcXY;6QT zh-al>4UN-AQVrvOTjdOWgfMA=bNsLI_oKowPuT0o#s;cmfdCf9`+aiJq&Ech|# zNhHquj%s%ZzJ4PTvQhKBWIoGyARH_R12FHeVT2}Udqu$o7^deSIzPAXitcVnZ`e`j zf#ykENmbj^!xTwzMoGG=F&%y0^<-#i+TI*8Jx6;G10J&PGfc85%{erk$cKY7?f3#^ z=|`~|n${$q|DDG+6F-WND}CYf3mW(qf>FQOatW)w0{e2@XD(Urq=>r{TD(HOHKK@7 zAM@z?JJk{N?ch@Dz(H^Xh@3sK#KV8A18_^OC$sOS?TzK=lIhh9JmGar8(A5*S$z4v z`od+^mj8=$84iodnhy9mhwju99z(i~EK6`Aw4X0QvYj8YutZR(kgnhWLr4k8h{_PMZ_%1_Sp! zDY93pmi-b|T?PP6Q#9k2zAbYgT9wnzR$f0#dAGb#8kMVBXa^wvcly3#hqd`x*kR(! z>%Zj17XIK_V~h%epLC&#T>|VDZvqK{OgVjm!z9wEb|<}QPusy(J|uys@{?wuNhYrhxLGc(a^luW#k-B zaR`3?8`YgifMk+lES7AEJ7O@r{YTaXRHeIXD?NLG&&Boht}qxrD)xvB2hhXyctA(~ zvlIY@Ue0IDY{Ljh-A<%#nF=9SW#gA+*(+4EdYaE%aaCt<96%Hqm@6vFeSUn=JPJU7ZZvWL$KzaN*&~=xg3=uDM;8=AYj}6fu$S2C;wR;F@ zGS`>%_4&q}fTETem|Jy=f6~R%qCe3b@CNmrfzvDvPR2riHI0zae>f`IO%fYGC1wxO zZt2nmJK?m3!f6=kFC(i9*PF%R04ABjF}>gzUr5m|EYp}=aCB<@;Ey{Jk>*^HDSKqCa>XAYU0v^lbt zO94@a?lGLWu)%WelCVt~fdJG7Fj&teS{aTmhS(M%b+*3w4)#KA1J7pW39Vi`2~F0b zfSIowoH+U|{M6^sy86MfxBw76m)Uu$R{ob;LIE>4XMr$%a%!sZxwdCy0>x$bAlx6^l+N|V`4{?pngV=T}LJFvW`xp zoK=M>L}?T6&5Vv@-T$d91xQpRQUqSP5cE4n1<+t-rmmctcjG!CEy$eTkqS|IdEpS& z&PjQg8MZm?v<)V1M4N(*Kn!G*%A?GXUOl4Gf4pmO1rgrFgIIvrFt?P8Rn}zsS&1U? zYE?=Tzzbt1?6U3lIZ$viJM~TL^7ofs`jEx)aje1y1r$Sn@*jG>>>8Z4vDy zzivzZ6)k2x*15qmBuIN)~P2Y%Mk-a^z^pGq#N6KV>I#LUktcF2r8;^ z{!qC{ssLqo~i&WE=(C|#Lb32b-qIs@w+;g>1#OXX@}44tI)uhU5zmN%NaT|gjP zZNDSJv(fPax#WWh1~%g-2miv*r73E*K)k9y@OUun>wK|d(4FHBgiBzIyqkmmOC$ne z9{IjQ{0Zl9`=TxIyT)dhL{5XTznndmgC3VzjlIpOZCHJbC8b#`_ZJ$nAM@bqZ-hP! z)k1!UIFs?BbHZYmf=DzAnppabc$EGc>XijQZt-#qBU2_L^fgkfDhWM9Y7+15h(`FN z1rZTgsK~VANd{V}%0aoADev|1Z~gwtLzs>hTt|hOJJwjs?(#eXOkNB_XR{8gm63G~ za@oDQ#+i#$71tj_7!25e600Pa#mK3fTU`*6cMN~xQLfx)RLlaxS*@qJW>P+vwwP$v zl=<-5TGPdWyw)zEj|1bPWTH?kUu9E=*@%F=h7N)Bn46hu5qo>hO~}ufqtBgQG<2L3 zcu>No2YGyfHY^HC;Z4V83Z(#~Tq=Kr|LmcT%+*VNMImhpuuX)2FLhV}n3Rk*``Y=c12BJB*Yjy~Wjk1CiyASp7X!QA2#W0rg( zG-FrI+L0}A(=czC)Z}Dt7#k#w4FbhSq-;XIhZw#Sai)y}Twns(JI>YdsaXcP@AW$3 zO*8yD&%k!{!z%|rrTBG+tV^1ZH1P>m~$3pWn&X%{F3f&1Vjp~1``dvN*be?(w=)8KmJ>hNv09@;i z_N;GX4f)LN1OomUm};M>N&rhK>kJ{x)o;bhwy3sC`(JhL6ET4E;}X62Tal}ImTH}C zV#!kE2^2spNjk0oTT99M6|$x-4EaX-!7zA2R9{4Rea~Gm8EB7WT5iJvj{5jBAJ%Xa zaBg(z&Cnsl)>QqwrrUJk!MtLWQK+KpMvPbKK%kM4fDpA;z$ z2RNa+RV;{AkpTvf=H&tU`{jm_^k(FFY8*#l&v~V>D4{lGQ!aU~G)(awK@XBQr2|RJ z$IjLw2DzoFimq930}nFH?F{E=NhI0@?s0<-+&_2_6yJR#^g|^XNTG?x--laiZm0n# z@`RHMk*5nFb}TM_C#E$+FV#`QOtwy5z-f~uY7AoOh9nq(6eemY`4)l+%zrq&+*EIJ zC33|y+*(>xMLYHZDn#m&Mn>1lMn(T99J%INu&1ZofoKEjLpz{ zyIh81m$Q=h$(pcxbE{V-L$x9GH*?&vI4<#yp(Hi5a4WVqre5}*MraS%Pw@7{-oc$2 z`(q`&h}g>ABiocR&cv?Ul;YVAPvg$s8Q3j*$KIFwzZ;OM<{X(6+y)^GgF5*-7X1x$UJo1+*9hCJd#zj9Rs+Lu8wn zSL^|w3kN4+3;3=?p^hXxEP21n*r&!1O~t900(n3grR%hY%wLTt<>goNUie`bX0}<>j7u3X3kXjdIB{KCeIg<=f?r}s{<^z27*vF4T=M2=;{TUGKwOv z)vQYg6UXg>RJfIFcH>fPdiF5yk}k|T9p*Z!twmi_{OK8L@>Fe$Nt@-Zcc>;iSH){7 z4@Zn3W@)O6EZU}4q;*lsy_NcNtBZd9)F8z&2wo~2g@{dGk!J%Te)=VkSjuV~UjZFb zDsEGW)8jxkwgTkCUJS`59$8W#1#@KV!6v{XD|l?GB5T4KjWg!P$KtK*$%}lk3sztj z`CxcSqWo}}^2A~dfy{1RdL_~UW*PDv%4bnakY~7I5X=K?`yIx%{)cH5m3~$x3($^UKeo$_@K`a!js6o#1Y}hbjxM1+4z{} zC|mpirG6L0@IW(2+9n-Y?p9mRYc{6ZWcJyJdrLIXDyVf2;}W*mrQr6d6Ouj<$?A(m_`qTo#__flttb<+UQ%+lmTZ1!;_4yIaK z|4g+DSy{WxEs%sj?|;-gmR_M*%D#KYdp=Q3|=66KpZRX4Cfg8K`2uV z$~4E5ixXgR#B9=FDrv9@E=%G`bzNYxBAs6zZpPvx`!BFqX~3Frvj=j45@An!a=Y@m?iEM%eN5`Wa%JzOewTJbw4N-5SWzdS$p(Y8KC(_1tWPJAhjF=#s z=r)`gIQ6&+w*410#`eAT3F=W0!0D1@a_uzQ(3EzXJWLX@CbI6&lOPw8P zpm}NG{2iE+8c;>pnj+Yw;X2mrZ6m|Mw!e;8yT-Pn48M)th*66hs<`z7T1>3rQwL)B zY`M*N@Z!=-SSw#mny|NBNCjdhjBZS5VbsdYZp|SsajGs+Bqlec@^J&8{XscrEho4L zS;Iqxd4r2e4((#n#>rl#eE* z{+|p~PE5gz6B6<|tS(g|yC&0cWJSPE1x62&+j&GJBN%jnu!$z|8^FD6{yS z1JCI?40e_UZ-64(V?B0$16#gzC7gDSRC zZHoq=@DCjnvp>V$5|&kvIGcp&RGKiijj#f`DC8z{4rzZH!CfE-_@6S|Ne zzA^!Sic`Qf?PkB|WL}~|gj<>kFmvDuod-qfQ9zYv z(8%C&7@9DEMw%k{srELp%}nBRRyhUe6R$RN9xRaOa$V~z1@dO-nO(wW&XGj)R#f{B+Cgai|1yR8OAP-^LOmR=;ONz23o1UW#+kW5C%k~r0tZ_Xif zAAnLkr_!b0`Ba|Fyj{dQbUa- z*XMPqe*}x7KggSLC4IPzKL4=3^_xtZ&$YwgUZN8$NvI3==`Rie1R>8j%5UN1v#yQE zBRo30{J|c~Sd6@R*m-SnRUPFkLJzdt4d|^xRqbZ64j$bpzCwol$8Gtt@Zb_-Q%08S z$Qa$N3}UMm?L~=E5O#4=ZNOv48;cSe2c+n)1%R){w>smkDh9_?L@^ctm1`h0V)x#Z zPfzn=*)M(tG7o^1#5$gyC2i=pnt8T!CTu>^(ZGExv{{5gYy5_9U#CV}CZULnCNFI_ z6?m%rR~fJ>5AtL;KeYp{DYnI%WQQ49^2lk9mI;uSv3jvU1(qA*`Kc4jc<)q(PIK;0 zKuut(PD}uvvr5vK0;p!AP57%~6T_zRsT11~tbiX7XL9(1VJv2hS{tV&<;@&@BF}im z$vme;dtmi`3jj`GVPbFthuHvJOtltf8+PZ^0jhCA%K3PTH;INzA_`O zh_;4Tb0J8%g4Zt`vEJB-bpJ-aY@vvXqzF_;uTpWHJZJK1X64K+mY5fFH0PWU#cLSbrqg1lSY9?{9bgX(cMT>@-OVHz- zUz9SOjp!=RVNi%9?b7?WONFs%F&6>XWw^nn6|T;rq7yc|@3 z**Ib3w_Yu`V>X8*CQnHnfFdhYaDnTlEW{FhcIXon$OUPVTtTsc{u z6I0Q^BeC&-?4C}Zh(a#Lui=@^ovC+WPKy2JNZgVGs0OO(Vi)2}xFE??^LBFZ8a|0W zn<>l%a0D36y+u5r3ex~M3MQu1|KySzcaGzJ+4jjoW*D(&!i1Mi3^IhTSZ?GHg=Fs0 z4Fr>}QIG0YdPSiUW$QMh4j_IidFibbL;yc5ZE1?pof5QtJ5goZ*P!pxfONYw%HYaQ

    #i)t)kEy~dki}+7K;)zAEYZKe6eUri%`n!Mq1{=ga{wK z!vVoIUYBKdLO>)76xV%55WCDVugg;rNQwk#Y;N%r>pB7019F5swusum2BQ2Cx`kn# zOW?~>8v~Isls9HY zw56ul#=+KcZ7Srn0@b99ZbVtx?<^$O@d$+aAs7SEA%P2T4B@%tIB8RC9Vn}E3~YW4 zKBqDer>#WYF54GDS0Fr@iT6XOo^_1_QO5r+gc#P6JL-rkEf->Flk?df1q>UPks3yt z$0RTch>iO4RUbjgEZYLlx-h|r&lQj_A{cf=>)4cQD$?DUt&FW^ zoH$i&BI6iN6tZPv6$e2Up| z*rdnmmmZc{WQJ|fh9A-D&LM326!j^T_7qO@YY^2gA5JySS`d7W^lsg^aW88?;w)(~E-nzGt{h zbaiIxc8VID?ef-R^~R0jbv-4TTbfmPW0XeoDe|}`&cp-VsH+OA%uoN1xNy`#ulAzuldJfPBDo-R>8HX*PMnMq+LJOQm`b^x|#(qHP$)Ts|-wkKg zjw~rJ>o-`!&e_IQHmlIqK-$zfwy1&;zqITG5g&FS14KcwuK~Oo+wzy?^bFHTtJ7NZ zM2piFAovJRfW34OY7>ODrU8s)K#EM5uzwB&*+B_7>#a#h+MQUzAhC;7i~L=GLOE$$ zzR<(>H#|k*&04PBzPV6N6mR3@+srqh`m{RYfp@Bhz*9lN^(qn#SMuPt;?I$L?I`lS zbhPy@3OA{Jw~R6;x)DH3%lK2=Rcv7i2`$=pmmpx_A$EDdhJF<|-jGp7Y-*ysS#d@m z_DKIo63-UJ*Fsks(h!FBFu@pbkB?eEh>>2C*-K9UMIh2`u7x`5d1arm^#;1!5Y_;M zn420TK(?MQ{+PlX4~ka6(tuvbxCRiyO!H=+`Kx?^WJs3+v6@dU)JRucMG4@ud%%9i zXx5lCv5p1d63di7*yEVJg|Z9!Ya5&Mir%L&&m2j-a5QO0E z<`@?aN=z#y52(6B44tqjqaW4C2@$Zijq{LcsS28?du-}@9>`?JupRV zRfo*-*xI_&W3!}Wwr`O<0*$W@w!=_;nLm&F3{3X-RdLfgn=U%Z3d&n zO@E;Gg~dcR1dRWyr6ygh#ozl6S}Mj0)JJBtPC&bOh^*2A$z9AvTYEKIi`}Qw$t5%sh32Y{kE>G&zkSIFXU`m;U=D!+nZQgse(BfIb z`|)K=(d3J|*ZY76Nr&hFWzt?*rah1_h*KlZ&#Irgm-D`HV8$;k%d+%X%>ji{gHjH! z^E}qMFCdiruuEbEz;oF%SH(b=h+k)frgR6tGu@M*GJR7+DgOZRc=uhvg*x2JGk5Yj zD;>ucZ!a&=qk3vP*o`oeZ?%ocMNd0~{Xm?S%2x{Ir`xD@Cyzk_%r4z*aISBedvK zq1hJwh%pdiyfp`)7$k>0JlU1g6%bfv>v}qX5ZvZr^L046#@W6BV%h$&@AawWn_Jf| zq-HnezX9#^+e7;nsCWUckU8`w|$Lc8*B`dHmWo^+M{b!|uE#JwTFj}h_~yJsi*{v~{ehvx>`WZFBF4JySOX4` z^cfHQd?+!rWDzq20Ee!gVog_#{rT3M^TD0-Q7O&SnCVM)4$)R_w@MzsV9?TLzWk!^ zWx1hlWdR2jdLA!9f(`dZFYJx+=jc`=xc4lkiYK}*TD#sJSz_ba-2oodG$Yz+|Y=+HiFj`x?tafQ<<7&D$xIfN-S{ zY?VG>B5HHRTWkZ$`VOIU{7mD=b_B81mca;g|-g!EGI*HzhtnklCWT%ZRqTlw;04n1r}rarxkzd=DeR`l;K|!DB4o z5>EinRXH?Zv-ZXN3x3BiDx7;U_kC2KVc+cl{m?iB6a64wO1vu{0r{&j3FnOJMAPNX zn99bTIgul05-n=yjf-F(k5jmc4`Dp}N#Nf3^;Bm8tFQ7?$EjOn&4MG5wlID5Z&3Gh zb=JP|2R)JI#&)>kwVlXGRPc?5|23cGjT@65P~LqJ#qoWg8B}&=BIILe5f3CXI&WJDn9TKi4`J z?EJXH9;(Zj{Nq@>P;q?_$~U$JAx^9_r6pJ98jjfU19?VYTvtD2oaVfs+B>r2{O**6 ziq>y<#Xzn?7^Af}PQP+L?_x|VtAzT#?iBw42OVylnA&|cJzD$(%}L%k>FhkJJbg9& zZ)K~0+!j?f?E3@-H@$7_1hq&VEpXefx69&R#-L36+6;9>#u&5ZNsSBUeI4&e_MA^w z0WOnSd3JxPs=9XDCMedcOz2E{z!0o7Zj2qcob)57rg)R+6k>ZKV^(emx_RMfy2dyn ztc3&J#TK~U?xoVSgKSbu@_x=)K_`%s4~dN{EUHOZh08BUvWRBwEb3h!KP^ji3OM7A#5U-s%0*^=RkA4=YNdRK1F z#RX(?W&~6}?4F&V7v&;q?@oPP%K&0i8djG4OJ>3`iYj5FZWH7V_Op$355<2Sye(Nq z_waeuw5HB~URZ*eu)_yB$R|vSVc*OytO6)W9Q7O>fAxFo)faGBe#a`JFjf&gb#-mHLYa4d(avd) zA`ghIU>zfU8r&P}3L^2*im1Z=>C3ST12DSA@Yi4wrc4m4rg;iGWnuop9~1#aykwzECkEefD@f48Rmj1;a9d=mE7LrEiP=F^TT*%LQLRm%M|-F z%bcAxVP3r2##I~#n^qrcT8FQ*0#rnNm918Ri`20ee;8K@IU|^qu1PnAZg#xVc&tz%eEy*dG6lwK4(W z&7Qs!oSS|)X8XI82k-2^ffAknRu$&^eBy`S?S7*<^{qG&fQZ8UGtvk0(O5E~t)VIT z!*^2;sO4*u6z^`7d6)6LXEW4id-cE5($|Mp+F_#ge}F-+*fn=OxPF1Y5Qzro(@=5NGC4h9fK9)-|?3zuS0 z*?Ty#$4km~Xm(SK8&htc3T>%5m_ff@Zn?#--jr}c>xM)`iuMiUf%2>N4xA>>Z+X0U zW?Lahw64QBR=ul@HsDPi{M1?~TBEFDSQchBe_Z})W6Uv|2!kNN&NgMPN$wv1ent3| zq|dIrNML@J`QlTOTk)=1%xBn8L3Q$HE7F?Zx7&yI(Ju6~_X63P9Ffl}pBNF^h30I% z!O`DH@VIuw?%df0Htonq;+G)NWXLv;xU>+oDI2bRl`wKn2z)fEBYquhIBA5rJ{e0ZEnD9>s8h7dn02m9p=V;#;gTJ%7WNf*|2>fg;0$KKM z-=+a0;3CMGA2D|w+m9`1>u+7P+H>tOTarDr_HIk2XKfQ{cGvk+JE`C<7#5Lo%~{;x z{Ym@@e)NWy;In0ynZvo&Ksh~VTl_Id{Yv^)+N+7cWo5}TLtGqgG>x0|P21g!GG5Je zq^7sZ-4){+kHsx~I6;xt0qM=qU)PCo__j?^PT!^N{5&~SqX{&=#4=_xN;%iy_ncj^ z$5&7HIP+DFfa^_38Kwfb=84{fL@a-9NxwLGl1JNGHe~GHR-3i;r@3piXvX=@)H>v%FwECxcCDtpKCvMU+AQ@?Oxaqt9C^XOpWc-`+H!qL_B~15LBH+_+ZB7l z_0`zun+ZiT^@xZ9Bsi+i)kWiG2HMpES>G~oGjRWMuw~oP9Q>$dsVdX)&Kcpu+@1a+ z9>(lQ(8@@1$dSarHx&WCpxDG0uVXu@zo}e*7!9SPNH@Fu^r=f(KSr&|r^t3#ZxY!- z*`-Z~KF~%-jXFiojNKg|=sVoOLD2$cmVX_76Z=&UICO{()cCwR-uaq0q)lyrz%hK% zGbgr!5*E!|Bdd~^rb>igzHW^i9&FT&%dh4!3pTb&yMQ$EWS-8|+J!E}N3@d1F$EaE zQNaBZYUQqQ>N>I&Kq4&4*FZKat-tB^4Kle0dI254)|oGF5o0}402vs()LMu}0BF)1 zFJ9sEb+Nbn9?RQPq8yzB0YW#!g+ zuY2OpDM58?O+u~3^swxVztabm-^~5qKkrA^v*~1Fb!Se=4)9KNR!Nt+FL>`%ccdS< z)9W6rWj0|qS2>@*%sNiE^7+%Jzk*1^pQ$?!ArFKRzNNHem1=gA2hOCcrrcVLT|PYe ztB}!{*?bHl#4DS_GJv* zGC8y!+hnNRQU>k|>+5yxVkE`J!*4OXN5;+iUzy0N7GT(9+eP{=a_eKmXRW30hSpmr z#1KtsdWXF9hmx+CLK^RtQBf$5X3t`OrfKqn9d%A0O!^)gRAsoTT*_}GZ(ULLOA6&l znP&bJ+_$zR`aJvGDtvU!`QcN!o+h5((sVdUF?}fWq*KTes%iTYc7R_76d33Y(sAfu zu5nyD+BEx-NDO9&WWvtSt!- zqnyH`EaBoA_S>ZR9knfMFTmIG zVhTHb==ViCxW;UIe7<-p*o~Sd!rpa4ts(==oyx{tOSp_-tzQ%7YsK-Wm|2*^costE zGxKB}xfoL~kno<7G}3>yQjF#f>A@V_nNdkz zR1|KfomFTtPo4b8<3^gQYjh!8q}Al*tcm_2xC}5eLTJmtnH-7HF}^C?L)^^Uhs0ys zCtm%^$1dqc^Al}MxS73@|IzGBfIr@PwzoH$6Z`U>w|NO?R7*m~cFGT&f43b+eA%>b zb=ilhpY|fnVIfJRalE54E7lQ{b#udG@kvjQW6a-fzcAdq{V#S|`|SXOa*RH0^`=%J z%Dy@YNk*Myv$^uD^TGq{h?ej%9NQg%jJ#2S-7tmuJ@%hHU+tzk?guhUMY%b5M&m9! z>S^bv?LM-W!SXvvrdrYFe{e~Qx*Z`CG65UfdGAb7$hvS&nM#T)qL{2WKZ=t>@# zGHNT95a(xzuYGM?l{`K6v~6!1Ik|sp-M47~R-=oijy3H)cn4;P_>&UTJw@YM+l;fiAes#8@j`de*UF#~tAiamA3 zwc^DhWnE{^2BR}|yU@M3D1_(xu*FyZ=1RFZWwhdU2=_-f%_dY^CuGi_OWc9@!vjf@ zfv2+1K7gq6!=j=v)UH%YY%t(@L|{7BhQM1(f(oMR!bf5V=Civ;*OQ97^DsGmz0Xhu zs8Nm{AJgixVR-uHx4%FJTzLZ*XoeHSf0j=@c7)$ioP{#1$&U`T*|7)S^zVuG z?rh4NCc>W;84i6Td$>7b3eNCVbl}VOj$gX9V|*%Pi{$+NSW|U-3gH^Wdm`?%?9+F( zWpL}a8|m2Z=Dnv?{mzI4(d(Njf%A(g>&kA9zx77#nY5lUw=LKGDEj0t*vlG~HvpyU zxUmHjddc)CNq92RM>!5co;f>2TPr>|9!-e*l?M@DSWV2zF`Z6&@MhH%z(YFJarunk z^c8;UN1$;SvMVKNV;q~B5r3RAU7vQa3tr*-w@Hw58um3ciYSQ^Cqz9qe9Mmef7pBX zu%y#=ZMepnoSw#$nR4Prg zM010Nsc5NaZg2}KCMF6hqA8$)V(-sc?{}Y^$O{~@HjS>oOt7b2(pwYB1$mark@bm<7LLSbeyGhbsNlZh z^>SQwA-{7UKOYNH|4%G1$QyVq;z){1GKU6=7vuG2)TcW@6A#SiMeP8*w&5LQAJdG9K$%EnDaDK|ln-5*e(1qoL zgpc9XM97;8g7_p6RUo9@OZctAcuvI`7<6|#^6yMl?>%kXf2`)wEhtC+XrCHNUvp3> z$V}By?w|%acs21Ht6bE?YWG>D!mtG7>IcZaomX~~;s@L9n0ByZ6w_`d(I#T_{iEA> z)u))G+#`8opxc=rfBUh^G;qN%qU_tVd4l6-^G(1@?fT(bvso7f<(-u zM!SVq`bGv%zvj`OTt|&VuX;9aH^zVeowvHUmIDo?n?GPg1Ly07Imm{fV4q}Ms1v8E z7xmfPJ}KE-34Qf5#*B#kCb}u!J0F3lq6tB)?fAp@li=2LCQ2i&;mS=j3HIGh=4~LV z{KjVoYdh^KlOR-^=F^?^SnzP4_n5v`Mv$F-{Fljuui4F#rC2~9LPD!YPMKXeBrzsX zUk#c1EbFk;m&r9=TR?t-8179omNWZ315(<;*oXS!8*ksVJpc%+!rqLgkQwn~8cT^& zzXgo3BEEW>l|Ku)`H|4uh;Re6TG3f(Zk0P?G-&BMGphP&`W-IK%O2@c00$Y!&~Oz70BIS)RGd#^8yU z$nvf&u%EkyJGdX9Y4km<>;x9vn4xnII8JSECfO(Ye4snV%x4^=@c!+`B41Zw9_vw8 zbQV#mHB7-;+`pcN^{*~{U-3QHU2t3w-2V$BS})^11%|?y#|C=6clR=99LNMCY4p84 z`Yn}3&tqn7t1pE=b9*4KmI6*yXTIyBC{hu$M#xieg_R@G6eF8qjUL2Qg*@Zc6589~ zlxj$pZ3XpWiE$S1`;Khdi1&_Q;>2+OSzB3oSwy;$l#!fBefSC^XF@*hV?Yj1i$`uXuOrjj8`VQMvb_M$?wBM&4c9zt*A6c@&60*{O|xayvN-5c#xpnC`>; zeK^5u7Xz^Ser@NsI--jv97j!z7QRc?I)!>tGezDrzU7X}H+U_&`p&^mDR!$D59O%> zP5=y(@_|YE2h(>F?@Ns0+&9(0tSyY#a>_l&wg35P)8m?3oiS=p^ilxET8FpIz?IEF zLpeR#!#ep)5?vt;3V#3@Io6BzVFpeX!MQn|dc*9a?95K|?Mq#rsM2q$oEGOoigOhN zR2KO~Mqq=n5^z8JAz504pKv$6;x-;lD7!7$Mgqw{AwNJ&jkZ`rCR24`?o&S*xLy8i z;J6-OXS7fL`GL9_2Jb6+qo#79{F4)jbKDmmpFSD*P0f*slOy>=*k#zxA)7PrQjh+A zm!3t`m-ZKlYsJ^Zv*OBIcBP4vM{_NqKuuPZ4KZ?p%~FmuST}rf_ZNjWQ8m5`<#r0)mjJxD5H(v|WDFax z-ajgN#NSp;)Hpvz(neJ`X@nhTnR(}J*~6sQ4-qW<{Fu{=5lN>xjm|$Pr6noykVZ@< z=lsx@n;-{!XSztR-&*b?fP$Kb_x5|GwzrIVKNsw3;B?iYaHr!CRF5sgfo& zmX1lu_}{|qha&aZ$hYazjd}%|fZQ7Pr7Hrjzb}uuxk8ycY^)vHBOohI0(|%S+b@8~ z8sk9$jX!PL_c*+~=HNS0|wRiBErj&)7Amx}hA04qhVp!0d}whL+t?N?b$iL``Hf5S6;B3yz+yIR7?l>sU*?YM83BSJc zRSbb+_?u(KamB!CKW5iczy7Zg$i)G3rdgV_(($YTMlUEGMt+<@e?aTue@)RIdFF>b zjqkqrGe%p2HHNSY(I3;CN3sxl1v>+~v?tS+u&`7AVLMBkj8OU0O|A&fJ#5VG^Ro}Q zVEIpms$14yT0}!A)zkZSZd;WFHJp!GdCNn{M|Rn}H=2Hcjc-+V_wCvAW(ZHn|2oHi zYRiN(9J?gFzOT+-e(VdN-iR#}+6iN;ahG>GHB%00#SB7L{7;YxgeBj$S9 zzNKxqUUgZ&xlyuDFy0?AZ`{7IO#iUDnR+LoKGQ=pywA0o7nzlD9w1N(cGu&ATnO7? z_Bgx5q5E)|Fj*Qss;dCI9-aa&48 z;?+2SLxF}ISOfUsq4AYjB0;orli5<3w9ZWO^tISj4kcjcF%(ayWLA)|koR0yiF-#7||&$@`3%Cvtw7cq4?Z z$eX6pR{-shs2{M!SukbV<*ZMt1`RU-`jBneS>;&F@NQ;FGDosWfg^8lz9{l9@yu5& z@)nUD?We+pjaEei`|WAce!%R7(?#s96l};k)JG!WZm@fTz&)V3$eRa^Q1aK=8DXqM zL1iIN`H|;UeJ$fGVE)7MST+MSkjFp5AjvV6g4kOtt3nmnf6?aH>v)Oz_uRtCR=&De| zBzWS421%&7b}ONN$yURA*ZN6&>3c3d`8opRHh=$1j?gYBK0K29ZFO=+iFduQVJm96 zJPBSx@?>|WUNQNp9R!(+?)SD>F`YWU8%PZ!Nqi5thZx4iu=z`(Ju%YJzu($nvih2m zpaKX|P5n&HkJDST+dJr6Kt>hAj(OxnQ5y3aB6LV`bYfe_q7=}#>>x4I(Z*NEf7`fh zy{oto$@YD3H@kZDF8>OwK(UgPB#WF#&sbVNZU}n$`eT?WYZn#}i*Z{J&QK^9w@H#3 z4xgV=%wAw%>Drp)wOuQURa+tY217z)?5fVtn6D#^*MB>*?$shSPbL! zwa>D$B*ccT-NpEl{VSD{Pz{TD&sDFB#texq+~bP z$HP;JniplZgOKYw1wp<=-bK5qmCsHPfcDWs9G-E*t{*EnMS$Cgn*y zpc;^Ik_Kbx2*bP{@VfG5f3^8VM#50Nrcgsl>z;u`{w?8=FX56JX8V~jrrj5Lk{NVk zk?4mfrwDi0Yqr5YCI1P00{Zqqxk@jSQy=PnB@zl;OPA# z&i*3F>Iwm!@!4h_*Z}I1gi1em-xPpuqK5}8q^y*SpfBx9Hk}Mmj>Wjsu$=p8;db5% zy`<(#eRKnjHf8y^pF1S;FetuHCsaC8Tszyn+dZcvuEW*->a4vGNUWsC(=%T!URV3^ znKjkE<(6*I{(8#stc-fBRFMlRIj8=wQP)Xp*^KfR1I&%hm}?tE+RKlfTb}JVh1g56 zHVmdeYPtKlz9y4W%`YkXlro32`$pNhpgb}%uimOCDY{f&wKM+s0{^1h@@%gt7XR7} zI@i0dWmU~qk$YtD2Z|P$wg=^^5a|NcfYexBF7)qcg3pS~MAiRo!vzOrQ*5Mq6(C`+0l z;p4}~icSNvx%}!7TYK&*AeD@O4E-hiKSTk2`t9RQt%D~I+S>o| z3%~Jm5I`aqs_=QkF^?R+K%ek2kIJkgJ~xlf5dp5u7n+#<8-W|F=L$VKuT9enf~wgE zF7SVx4#F?^^~NL}Wd}ixMbD$#RIp#5M~xC>(=uCo_agn};EgmLFVVI2lJY`z z%ITLww;?NIO=OMM8&&_>XEKZY(a2uz+<_d?3Q7!tZ2iEH0Ao~lFMY|UJ+SKWmbd66 zxCMMh?RNWWQPIe`uvx*&bmi^jBoY09Zj;W@a6QyP(|VH-qFtH@|TMbwGPAPWpF<1Wnysr zyX`#2$K{AWDQhYNv31MqwiCDC3sLcc3LL=tS~cW?=SSDfwP3gO)8q|vP3u1HLuch5J7oKqcO=`?3H($Ou995D`r56& zpLFes26|@?iTK8lIH+9saa11>9#^etvvq;s$Dba#oB^N_iepaTRrx zL$BaT*Dc1PpSX^KC-HS+6uPG5ntCoaSu9hxI-L3<;fe!K7Mqh)|VGmE}z zl`I6W2{xISb=_pt+ua#J1S^A_b8ISpWtI75aw&1W9F)*mtjp(4nwWye0#~u zI#YP!Ccx}sW~v8S(}BOV4~NW8LN|%E!l_9ZQRPcv#OP`0XY_S$SE}uX@q}{A1xn0RFeVocELlPR93+lL6#u)LFr z-%ly&D<5MiQ;<2ywn(m?kf(lB)!w|@^Ud$Aw9n|Bpq;BV0cxTtr=Haa8@Fv3?%!+D z8DayXT|m74l_Li>^aP87h2$NwC2|jc?c>H$-l%z&?5a`8c#d}6b z&S5|%2r?JJBIyd*<|$D9)_?nwd|STIuMhFsGJ#W|zYI(*X=>rF(0t#i#RXfU5@1)O zjrZ9sDw89(}}$Lq%7qV$hb$}s|dkox1%v$xdG$Zdr@H9osv zv6v!`uKu#ZV!qc+$jb*9kYzt}n*i3_k1V)J&IAxD|4A?LvqOhu95_zrmNX@Jg3ua> z>u53=pmjY6FF0?$3AJ?{GOz3>#-1283^$$BRZK71UWWA)`9w&4zgKtZPCQz@r~Yp_LAlZM>&(Py%dJXOkb3Jy>Uo=;p)`<9W+3#j)zZn(VXGOx zS1z9U{Cm;G-x$2baQEVdT?Ey<2sWY3&e_;(Opx<0v0WNLV&-5{4UfG?yDOw+qkjve=YU`DUDvf< zoIsy0ndf+;4+ZqeC#J zi0YdvXW^QYx>;Py&$^5B4^8Ls&|T&=N&?Nos{NlFn15hwIQN-pLi^~lZTHBoEF<7B zOUT>R&9N!Izj!|vs+mIboUwi}h@WO) z17bVcAEW?+-wvheHT0X$3$W}u!xNk(?O*lFI#wZ$`ze}gj+oz=yVt`&e&v_e1}?8X zk)1_m6ymG7xT0$Ak9B)9-rHE~k0VF)_uZB}7wZmo;-Uu zu>sP&=Tc7Ne>WK{`EgMx-CBCa(jq z<>Az`?@SKM0a;>eUaa(St%%y_G{IE z^oElAXBy(Ga*kkR$e`0-4u|I=#GN;#{h}I@?yIf2stSNEdl^+4=;}g#V+rNw_CD&4 z)yIu=Z)HEW{m|~-O6zL33G?Dyg?^8eUP@0}>dK$;&U)o%i%>X4h;)%bCPxLwZ@^pR z+OD97rwD^ryH#*?;}MT``pG7Kxx&5{zg*Y5pLAr0Bl=y1K6#%eyYrfnpYuec?NbDdK>5MdQuEg=`{KSurX=^a5Rl| zykNtNmxkD?x+CTf8zHnfmPVr2C?A#O<0ZW$u=xioVkYKNDPEj518SjSN^d3bWRhQnCw?3aqFLialR@O*cBu zSa34XS9O@B@1l8u716!bz+UpKr97Ld6##p&bw-u_VPo8EMEXXB2ms%KTg(~g%~ z2nS=t$5}(!zT9uwjjBC!PRmAXTlCx_uiP915ZFcfPlO}VW=LD5nc(X^M4bzL5nlmc zV`RWR-o5dkI_$=_qOiYT0Lk_3D}g86Ht-Fh3bzS!xr%2C>MOpL}A&jlI-~6_V_Mf?`0fO^p5`)nim_Kf$&10N}Dx_#v^uq(2(z7jxfPw z*-XX9h9HNOMQ0-%UM@IDEMK@E%znn=e=sXcGU&c&g6t4(uU&=gV%8Tz9NKGskl&vf zU>B-J%Z7D=j7zwTM;i%;KoyQ@hXlR1*AhFEY`s3GL9MnZ*W!m^REP}nn12@xB zt8uKEHf zEgm)mi0RWhPj9(a6;Ivyc|LcoGYE#E8*3YZ_aoc*p|u+D^|{C;Vn)|HT)5ofVz@>l zrvu_~vH>~Z*x~Eb_Bfau1hbyE3&zpBULm{sGo=gPF4>S2>>j7&(ug_(=o(EIHIpdO zB?bie3X);gYjc&PgyG03o5vlgb%0+0$=E1{?y72(av*v?t$eU0sNYC{(P;$2y)~q@ z#)PFGD!O6de|9`78$J^U!54D+-%!(R1Xp8bw`}yTuZ9(?2z2}^2i^Ya_DT-HR^8K2 z%%1g>R2@>NK0)d(oMPdPoxE&#c1$VHiqWH_tgGI*VZpKsvYEI|)p;a2 zXpr~w%?qy0JAR`4{kA+S-}3tvjn{$a8YJWlT(>Ip%ZQ>mZuYnCe9C&BsjQ3BE!PXe z&Gr-73)pnwhL;!Xa2{4bCM}MFkl3Slj6&}qu#NguC!JA{^K7lJnLWl6T{Y$^r`MOV zV8Z0QBowZ1jSD{BozGYyaSa4W;X0ubCYx~*#n!iCzEG(_Kfs}Y+f3X%5e(IA(EzuY zLH&vBe6@Mv!Dyed#}o+F%5$M`ebko|M3FeKSQp5v7gO(=j41y6JfOm6l@& zYx5fsIkI9nPhda+ea%KHVSqCFCeBAKJ;<3kEpq?p6N zrsW*AQ9Z*)WztTOkVJuy;g3|GcWJes#wCbMig$4Zo#=dB@J)g2dqag8{wK9nyDPF_=4 zRs2-*a{QHS^s7(X;j5sIKixY`1;WvPJ3|W_4+oORc%@q-^_BIEQGGK%^7>{hxkGtQ z`CBME(2B~it;4h?tye6GS0U`t2)O+g@h`Nyl+-7ESX5bwBqd-MEAY>bk z@*j(D#iR;GM5I{RO`vMy&O;pGSDz!Tb40(;vXDTAz( z37nSSWItR3VJN|+C!&)M7K^Yg>zz%Rw7*v6kkML>I(CC5b6!Amwm^vZm85Qx;$Jr9 zSfYvL#82K0yRH^uvemtxcHtW7p;?+Gzz+2zgZ_8Rp`z$E`j^H->U*(PQ^Mt101E$O z;~Qgs;l#&fxf0uMAUg!2@?_d9WleS78DJbtrbq)H{-*;4SmcE@!9L=z4i~ZW5p$`C z9p*a?Y!lk7t@V4cJ)Q<1?+ZM~+BWf~r%G)p&Y9g_SbM+z$9;Xg`o}xOu{ksYc7Uy| zdetp{=gn>_SVd(@S~7nZRh0_v(+eq`N?-T?d94uqL^MJQ%nf^~Gfa*=p!|53-h*d) z*ajF^S4xf}t-HOa6Z!x4M=uK^qTlE1%ciF`67#XEfIxY6DgQ`!d0~jRx!;#;$N%TL zLFAuQhsM$L(=PD>bxmr6Mf#F8aSbbG1FXjX59Xp%*igJ)VV4f72ZERQD7w?L=wUAv zsQyK&Wfl8WYymyfYALyVj?BJVilltbrvY9QN%Wk$)16a!t?;;a8krjI>z_^hph8s~ zeYaZ7F((B*_Rz``fvP%4Iql@C9@nUnS+;bS?hmcX!=$<2rRAlqQ$JZ_o=Vb*Vc0Qu z49(2Gv$Y*Vc)RKev5%4g^y;=Lohy0nuAb@xy2JOt?Vi4C@&s(l5#RFl;HN+i169yI zSiXLh1GwwFobrA3q!4Of(j~bKdKaoDbSrV;{vR#-+5!T!HdJ8>q^wp<7`;t<=77o= z^(6JZZ}!|tvY53l^8B~U`tSCVGdtp1*Jg6Z7<4+4I6KfIV9o*da1^h3+m8{yqX+)S z`{ds>_>T*sfJCI#b9}w*v1FP-=FmEE=xnZYo^`c#!ck6nfxXNz?88iab2crWoM#Zt zIpzp4P}3UR-r%}e5Y2gl&p6M@l6M`>%+7z@aK?8{x5(H)+*&(#AUZ=zls<5UK#A^^ zmgs&=!F+b>;h=&8`8G{8Kju}ikg$ln>xuY{fJmw#~SI&+$LxC}?= z&%7Ul@L9fB>#T6Xwio8)IhA;jYYr?R{cJI{0y{yIUXCN_(ZeTa4QD_zhscpw{qoDGu|nagkKpt(-KS1E zMqdYx#*mNT7rcT&%w@dAo#%qXh3JPI7&D~f)Z22Cgi{|6Dh=ub&$+P-*d<+Dsc!Mx zLbDHAA#E?*KBMj!QQvNpk*l!XooL7M0o@j9`qGHd8l@Ft#lECoOfE<&ApPIEQf95d z4E#Knus~J+^jvgSl)!OkjdvRUm|5W0Tfz+#{#`qON}{*YI8lN9cEe=S#y}BARjXfh zwKMuVXtioU>$xM!C*cbAQ6mf$MR|hu>bTZBQn`07-9e#^M45lMDHX0)w0DES&7P*1 zbY$5~TVZ^Km8r5AUZ!qdsQx)iq=^kvZ%!*ZuWorPL(Ft&Un4g z>7-TTt~a2JRUMHm&(~JlW{@Sc_QU)7D3T6CTh74u$ofujX?>vqS$x+Hok#OWf7i!xM`oNcDXQ@kq0d1Bt~_l) zU@1+kAw?k}M?DkR*Xzwr`5~yTj`VvQIewPI^uk;2qD!R_VzA!uG5E6JxxH*g=FlqL z3d87~B#N&+UL5$%{sp-K3}o(*T%&0&JJP>ux#XJ!#Jz@APjVV?H9;6*6&P2wa(0I| ze*|e$5t298<&repFG^0EQArfo+|uW&nDL7r;eWTnAp!OWyBgk8L!D|27JKYiZrzVd zr&(%Eols!#!-2x=e}3b<`f7{rqDQr|oE06MKW;zO$c# za(Zp(E2Lk5-S8hZ?TpMLTD&uPQF$~2 zN9<q6@}brY*J$!OlKx;(Z^~H+VDAEwXF#3s8asB>CKsI;h`#gw z@V0#GqrR0-qXUi6ld6c}jyA@5PD68CMR9mWlJN!ehJ3pjJET*Z^sGzTid~O_;8g^G z%{kWy%@+S3R9lgjRfLki0Dpp(oHIK@(u7+MqL#|0ert_=Xp|cyzJ1^KucU@2FG3X6 zun4>&cIIoQO*F=J-D2OT)!hfBT{1QJ;_0)tdlOi@ZqU5jR|!i6k`g_$K9|kR({Yh) zc<$yS<3F*ypsDy*f5Ynn)8;uG(_&VT>l~8&_pDcHtxdkX5zRg~wK?6pc(Wqzx9bKz zvRW%YRDzsG_raKG4!S`@&M}S z&SeF=^gT)6c)mKFGv4ji zW};t`xc>Mxjex2GWW`=v?h6=`J(64*!z=P8}Etu@udNWtAE;ZnZOKjf1^8ya?$L8{sMRb5{FAFMU4Kz;gy ze}k}3jQH!$$*AcE!~>1p<baZL3Y9DzzxMM>CI<~v)vQmUM2CkV8AmYS*wI3(hf zE%-I&XGKd+xWQ*))SzfgS0bi0<#azv)2MWl)~E?;><>7))EXkoE7NB&VN_@^xu)<@ z#L;kA0rcgb$da2?P1ZvqFP)PkKo$+rYbuD+xt3J$%6CQZ7+t0&h$;=tc^v(WfjY`i zZa4Gn1AE-fMg2iRAjJ;cIxsaYIYM$ke1>`tVO;P(w}o67Vtr=*v&#V4^pM#5cefm< zJHnSBUgSzId3$y0OeMz%n@*`a!k$>_NWE7%vn_SIe7M={Xmvrswirb_%M+K1N40q( z+OyphZCZndfc=1^5S1oK{Fn?DObzKXT>V;UEp=yL!Lj;jQvXSn&`Jl^%_ORCr%o@8 z8sf9!?-uG`L|HExBu#T}m4Gu#W(tToXHb0+OelJ!HMpDeUmf~iV1_nOMg-ffpJh;p z4J#q6fM=JzGPGq$k*AflgFF8;V$eEasl{`tpBD`T4~Jw=9Yo?8GaR>@BI}cQAiINc z9_j{ATqg(lp}|>MqOx8}VVm(igzf`YM*QVw^1!_kcvrKmkY}eIalmvXHngwt4Sx>v zkuBJ`QQ9GY!Yox+^F+gmGu)Vs5>g(^6XPiAz-rFSAR2tnExXPJ>5a!Ks|Z>w8|JeH zh*pi!Si!A8T&Q8Gl@dtR00wT1a~a!O^@1p(YReU)C?6nP9D@t)!6sl&^Qt95_0mLk zwuPr3`~4|6NFvLwK%cc2ZDELtqC4Z*kiD|5_BYT)L-0Y-Ig5z;87rcrcUy-tH~ZMp zdFwUr8XDdHsVEXQT`oGA%;xqZ6xF%*qUXX&c22LNLf;XqcwEMLh|5rTsIL0hQxUC| z-Q_RPZmr@}tKtJ5lEwxLz-G?M`Ao_r`tH$#5`)kDO z9;Q$VO_0VW$&U8*GZX6z=g0#ro5lr2h@M4WG~rhq#ylKe=d9Ka@Xo!_imv=!`<5b; ziVW4#Y`b9`6lxwmT?<6{<`g|oWXsaW4JaWCJ0mXv2URtcq}LMl93Ak(i_toTNWSb6G)*cs^DFyt%}`dk^YdH0Co?T57jcG{lg8CRpFLRt18Z=|cu8>c z&AL%uv9k)FP|1q+BCl!Gnh2Bi-@=Xs*F&L&Xs*1{7YjpnX;Do@7YmAra;)pHRWT*{ zDo@sLbJ(Wdv)+tJ$xa3)lT#aRuG*ThIk-~p$S9@fpV^WwAE!uu z4a%Q_y6q%6Gq(+PdWAhWd`kMG-5nR^6Fw41(yBpk(X@MOoZ%x2?q`h>W@^)d)S_^$ zvTO1sUMh9Q#P^Gn;?m99yq)zlTb?6&7HNsX-dpdRQR%^Ya=tu^6$sQ6GKaQ+SJu>r_hLYKJijOzorkE)_S+z;`c`GvEpjuA7OQHjR9 z_^PMO*XIosmNU+4dM>kpraq*_l53@`H?X6A8@Axk7y zO`DYr-UfcY56^sHGwi~-WQTkrvM5#WBzQ?^7)sU|!07oH(Bgn@9*oqH}a&ja_!v^c7QjwGY%LebDD0Dli=@uHvDi2{eK`49GIM?TqhmucS!IvG~hzPD=%{XGOPN?>v2XYqf6KC*9o2;#-fApurOg?=m?M(j^2M z<3^kX&H_z9QZT~_a-9uCF}1hq!*YQ|Lh~?P#Oy2 z`yOHwbWY8T1ABQ>O81o{*uB$j_f%A6bY^s#UDm+#m9er1+D8cBP|uU4a>ZE#Nrmbh zAsN=l11}#FK4aOm*+_nQEBsB98(DV?6V+X)9Z-t_C(r^@rFr(l zy5%A`m5oeVxq1tN#036~)QNTkOed=B$#`dOoFIMH9IlhrUo_v=U0c;;M$dOwl%oi? zmI0GRCP-RSB2LT2PjLxV`oFa@J`(a@t^C)#{JZ^;JR3R0KI4muqfh6fN0cd<}OiGN}U zr6P_=J?$ltNxh@^*G49K$dZ~uNhGYP8a1-vUBo}53wR_>lC3_#p#UDs&-@FIg)6A= z$1F{Eeq0p{@c<#|FSR%Sx z=n*IUDdPsbx-D(q3d-41)EJntQGz1pg*w*?~ z*5k>cb!l-{HQ#m3ezWMPCo_1Oh8Ik2Jfkc9;odfEceJZ;D)BmsTcxDCG4rj5j8@yM z&<`nC0Esyn|AoXpO1&sYDQ2%*7lU!F2bqE*cvqDkdgM#iW|2u7$CG6;3)7W-U1HUQ ziN5kyEYikQs1e336tkjj{#p{JhWPyTflVA13K$GR3l|D`iW~B@YhZ$t$ifg}X^#sn z6vy>%ur>>Rvdy%yR0;sGg8}WQ28jS>d-cadDE?eaR8ndG;^Cdk+hI#xI#WgZz{B8- z%U=%zD<#{gGw8dL2s=-TS$nyB=9~p!yt$kt01A^<5qf)&%FYhuub8!_yf;xLQ2^!)2t@OGvKb`gf~Pv`e4(wqrha7uQF?O4?p zi_OBJ(P_7QMM1vvrrBKe<>u#zbQwF!x7%o_+LcQYMcLg+#$6{SN*w>wThJK6iv{e1 zP~`htwr{ecV^*xU?Qp{N$wSDtFX5D^(_Yd;TBHF~*Yf+rmLHNk^<-HYme8nDO;Slp zsm@f*eD~xjWUL#Ld_P7&(=X{#DdznDUWRmbtg~Hj(_#qJ-XK8A96G!^ zI;@#SPCFS&%hd)nto;Apm$PrpoH|`WRgT@s9~Z$sA-JPPvVj?F6PloAIe1KP2`@5i z_OxXJQdqbiiWZh?V>vP6+IoOC;--ek>R$vRq;2kNA;ljb8wd*3Jq?6S^Q+mVRj|hy z*x9K1aVzFFa;Ub%oDr=NK+Q!UrNc#pYR~Fl^mHP`hWvY;sG?itoilNSU+n`+lvM-a zox3pos?_@u|JX#=3!b1(XJ~Y-?`JY1*%h1~pT(=)Ue4|=2LsmYPF}`d&j{&nVlpC5 zQLE3rcNaw2F`t3V*?7-TE5U90OftJI{!W3u$jm)4?>4N*$1sc0+o8{g2qHn6vQQ z(tYcKA^&r(2wy=>_=yr4CM+GcHqd*%Bl88qp!8#)?%7x30YKuX$10yrNuyCRN75ky z;fg2VNc}lN+01XEWJqz58)pX|6ZX2e5a1VjSsh@HK&l-nxY^)Wms|$QcX7hacNP!E zglcx=5P-1p$<`6Li@5cl-!6A4M+mM1?R%IhApErXEtB(qB>cj}>}-n@o#b5V_EekH zeVs{qVb#~=9+0O?az zHv)U^u-T`Z4ATlZMiyL6tAR!N2ucQzcW*_;r(z900wmiRR&8fj{=DkNEnB`woquuo z!&B_qkhT?JmKSIeRi75c7HmZbv_OM|ww!@r<7w|J-zfqMdc(3+%*PZx(OH$}RUoP* zQ-@~LqbxEX7uk!9+`Qc2U#^OD=6^~+rMMZ=F^^Fn#`s%?mJe7 z{Nsdtrj_MFfTGW;K49(q&4IPI?DMPjj;Le7ye@=D6$g`p^s}y+fU^WA5#silRXug2T`|0?sV^P8PJ)z z{IeN6iG3-Y9g1GM^quD2#e;N9_DN?fChCL?uI;`c3W* zf&(S(Shg$Xc&itv)&#>2-7maKtNW$?et7F{i8RPZaGAPn_>Yqy$OWA8@8(|6)v;h< z#Z!0qr#~e4A6?ehv79jeYB`?uT_YSrs55e68!19cnOGoCjesU)V5tz#yU19mC9>S1 zel)2EfgB9!1htH$?Bu?(=MPy<%PyW2&IK#y{g65KIt2}uxYjP#Xb#a#(Tr;LQkh#@ zWWq5!`LiCR=_1+2Zf3IuTVhqr$ym}`P|m^GbOm`)zy=&<)|Lf z`&-?^y^4zzJBd5_S6-U zwP9X)9>ckwtxIj8z11hvhMxG&+fSF%W{(Mo0pgQPCdizCO7;a=Ms*X|3mddnd8NZF zvOj2ay|YWMnGYXztOGYTfRfga36GZMMW^CD7fk<0D@7pM2kLUS)x*N3bM&Y@B{E$S zlsv#GWWAARktJr1lsD;d$g4Q}jn$Cui{4PtZe`V&-^Am%R_unM%o9_!motwIV+SN- z>0h2O*)RJa+uxz7>w%KmtgF?qxS<}1ttVrRqb+1@D=u@TL`W>Ggord)gw7&+%Nl-t zu|Mbi8!Y>fBBY+tY_^ytTX&tM34)DFKgxzmTDHj|zc>)7e-@b~{eT47z&7qhgy~2X zub*OKs_-ji;BJcASwAw2F9-_nW@_RlEGMX2mzAshB1lSvti(myk4;KNOlXPZq{LqVra{oiPbiPGTIPiYjwt{ zwN8@vA6&uaXZv%Lsn4sAFN)OIRUk(*lzWGsoD&9|Di@7Q{nD3Rm=~QOwg?xdPJnHO zL92yddI7F@YjJ-yee=w4`Ru|8wVDk{28&b9oYrASI&FZ-uy#-PyP^yE%D#x9Gu_=o zeT%n-x+iZhc3vfp2y9dLL~h9XsOhx_0r0{#&%s`$=7e@QS_c3B_PA zBT6^sVWmZNRNaAU3rK*SWbo7oN&B7+ioAJHlz+{LqQ>OsS-SV*HCw7K8plrhRnBCT z+@!t1gGWsDQuL7&;HDD zQt4p$K>s%6h%DpL99n&jr0K}2nz8|4U#Nzp8+^%jr34z6w8&od;%BVq4hIE=&BUDy3yN%x6TG@# zWeVOOJz{xb^9BU`F+IhOP}J)}<+zha0ORd%#3cVj38NGo|RwrLzQ3tq59Hp zO?V$kZrO7=m zFJdP1tr!w1(q;Br7`ZC%sNrRcJo(6jhR&L;ctn=LkU~dNv5;x)$chVHv7_rFZJb=& z*0=FI!-Ya!D4KH#T3#|}8k#Cs0M|6AUY=Xz=XKWU^KgOehM5@|a1qUvUTRSLtka>} z#O6IF;cA-Au&w9b3fpDw{gBWT0;^Saq^-ShI{vMRDD@H*f5xSgWB*c5KHaroryO}; zbDd>KHA+hz29~C}z*K^|%5xWdTfNa*H~01sq1PgB1PU)@W_O>_FlRK?WOC&YCl)u_ z1O78ocGokYVdIRr%?XVc&TujZb|qSdKrf!|ylf|-9l~XyRn}Y0onFhV1ebWm5ovjg z1M~5bP<9j{`<`5_fi~LBf?&r=JFo#BulxpfOJu+m4Z})o;f(46!g!^#Xgean5?FKN znT|xAajQ(obt=QmbS*p;Ax$faVP%NQ3o!#XI??})y?2jm`cBtHYiXs91=?|@C?ct~ z%5*G7RFD8kYHdNsLTYV`a*GOz5FtXin2?K>)=LGV(h_b-P!vQUh!7w^5~)bQK%xW^ zAV82nLI@#3ZsfjyopsLV?7h!gXV2bio!RSrKIh+jk~iPW`@4Lf_j#Y^b;DdX5wHTu zjuUU-N89ffmo$>T4Ow|vF2h=w+q2%HM?@nwZfM>l#HSucDx`04n+D!LZ!f@(_=GxBleT!&QFg_wksb9(P!7ftj3+f-RTllJ9D=ZjkkV3^I50IX zK&A3_udIV9lLvRs<=fh8oc#!KGJV638o(eFJD`;mXDkv|^#z6(!j? zQsdF7&ZR9LtIGN~!6?p-M}=Iug?J4?psE>7-qJF_NuIe5YdIF8Ie(Wez9FyJocjy6 z`V`Tc^9yejyElpsJ>J>-07e*%lj#!aUJcteHMh0uqNV=%_#cGW=)GA5bED!G8LJ_p zPedP2PTHVh#(OI#MyqTAZaOKqDzsNn&ay0aj|YSqR8N;IG+*oRxh?%AY$jDQUU+JD z17091t3`dvYpu2mQd2*tIff%c%Fi_#W`dNxK68!90C8f=oPYMzz(|sZnBo5r0m_z` zLdR;t)Q5T(8#GHlMm5V;IY0qVg9+S0@cngt7Kz@NNHGR7fLp%hNvJ)ry*c zV}Kn_YJ`<49sluvGF8+US-kW=D4?Godj95kYi?}puVBUd`=eSq*TPLNDupG{3zxkX z$`Jso6x@?KoD>=OHFD2ck5U%}3)*{(3}X%;GIEm(yPE(S$OB~s8(NUQZ@v~0p>)xG zh?&1$phzcOvRn^NF&Mp$$=c1QY0`rmG>mSoWlwc6uJVdSAp+R5>(e&_$c@`DC4cN7 z&?KHlULLMO`00u!;>!{)oCo+E3y>rNtc zlm}=SKx*Z_*LIW+8T*XTUjj{Z2mX8`0%{rF1Mk<|hpgoRB%Mkc#%SEv`?9hI7C`kF z$Q!uh8(7A(uL0DhAB;#*UlHVr8`w0D2wUV!`J@zDcq~+#UXgeza_zXv zMR#8(3f!M1UfBcp_ssqih31msbEx6y`CnX1Lx#@9e1kp~`_1}}G(Y&JxqD$l<5bad zH8Z5fP^lZaG<>8%tg^KXMo^hu1Bij2wmiG9yj0=(4eC#u=ME?e_l*}1OaDX}{(%w0 zM}$FYZ?$AAGrN*Cf@J7CKHx*cH+6u>X)5Mek{?*N0dp!mT?P42d3o6DSs3;vYg<9< zcA!0MJF`+PUMV^nneuVNBxDOZx)T%a5sY*@#2!we3J}tX;S+qmttWQ$Xe`dX5BniA ztm&vv;?kk2)WhtE^uvDh9ZXx|FGXI5{|=vumny`0f+&}7z|82H|7zOTNQOGu=#md_ z)8D7x$9kPkme<8;Quxq9$;yXW(NEKPAO6!u^PhARwgNfR683oF;hTF(0+%a>({HHu zdWP_-I>eU*n_iZUzhG{;8bGkmrX=lhFiY|k&AqsnKC0;>T;>Uns_`B#1Avz&hwAoB zwT=U1v@^S=kHqcvwI^>tY~gL&f>)eYUi?<#^#Zaj`q<`Fy(Kys+%KUQ?sq^E7Ps=#O4CY=>XY^NLx)TZPbHI1*%f{=k z9!))6fCCC3`)Jrr=$KTVadnU9>-)P(iX1K1YYOGJ++mm|Oz1W>1onX=x!V0mhtX4D6%c#|{yHfD$(xICO5 zI@F!CE4wf}t6>dw@7)0A9aM-r%3|ps5yaY1{+kAq3JiClL){c2s@W%uc|BkOC>x0` zD$aDJGPg+O{MaXyj+2oV(GFU0VR-QBz%#+}14ck4Cak48Ff)~RDgp^-jhEga`R%AO z*Ehwt0N(*z%fwF~1U7}Sj}lY7gkAY<4Xp{e_|o;O-*^rjCXM$T<1HU@rL#sMJ|oPv znSyKL;VTSHP`yg+8x?|CZhV%wj~*btVLarDv@{IjHjeBNKLCnt5%N;Xa_dO;c|g8* z4RYZJhze1DaUlpunE$1uVz4J3ejW_*{mOgio}s>y;7YFiqz^lAbiG`EhHdm(Xxnid zUC3E{))YKe_iE!1C3>{=o?ZMVN34mp$JNOE0Y(0S2=0TeiqCnK0WEv?r_Q9b(&Q0d zn~u5abG!$tBx`d|RdDJh@dxeVx734x+D6d#zPSP32QA;Mmln6kqMt}QsC8VmKIF=P zgu+sJ0;GmYz~kCs)i09lS5>$9V5#DWn`ZcMd3%}4l~=xRPqq8JHmD@L(arc<5aC24 z`--Juow&RToSR-BY3$i$7tHY;q^0tB_UdwJ(f>K#;S9mRh%C#p<)A{%pU~g%I=w6N z-ROfM7|{;KSv6$p-Yx&E&q%!PP+aOG&t4TDrwJHFM?9MHCXC%k$a)<0)c+os`6%_U zwc%}igOp|IjN~Tt;R&VX#G?lXekweGI+v6--ZOF@`ac|DO3)Sk{SR9GlDW)Fjaea4 zB#A2L-O@%dMg#^}7%%+KxoHL>fXOx}FBXOM4zICqan;Q;yW=<3fYnUN*W7?^97cZz zTsYDn@5Z~y8UC$xyQb}f*UU8Kf;QM*xK(F3lV%1q7kt1ye(njlA|yWs~nHjE*MO61)%TlVa?X9PHeAA3EK&&w{Gnb} z3pMDDwZkz_dHVro`RUdQxbp6SMnq~l>=1mq4PZKN@g25a`~#NZt8U39EP-@kxFN%d zaC*9Z{+8?Nu*A3L8^j9~Xu5fOAtth0V8|*=x3NA*wM;mwQI~8xxw&&0?-j>h=-)1C z19Q$<1b>b?FKYb&aMt3RF}u9@WlN!gb7#}O0x8~Y?TBQW&7CYjttoVVdR(s1=F@EEEmOVmp35Qx;J?nQb zVxU;3jNLbHsPz-Ls$6Yifch=}5eGtS6&ez$*^NSb!qg!|2TVP`mjQyVyg|2EemuUg z4ySR!xAvq9J{e_k1pb9^$=wLLRF>)XpzR774ZQmHoQIGEU*^Tr$7k^W*Puv@!bmMOYhdcfjHKg^&%Fn+Sjeo3f_Ld0aSOFd>^9U0KFo@CvN z;9&NC50|gw+>>k*C&jV{_^X1?IH-B%>_#be0@mL};|An9Yj)`!0v!ItLF>#3B;CjA zN!rKO-V?_E%7o6>o@$IV2I`uCCXgxO6Q!}P#*b}har>T9^p2YzG#g9BqdTvPl-!Ko zJ=qbnAvp_4q1_ZcuE&yJN5O8AZR*Q$V;6fTgpj4ar4n7+S*>&UrzzP9G8lD^4c|PI zGFn$eSWxA)bYHZtp-UTSt+TkjARv5+40Bn1s2s06TTkrWfIr+AUM~dvq$tbO%XrBP zRKI_#uAOij3nih94n*9%ooZNpd_`<+-paVb4j!wa!GJE2HqdL9eIfY>W54clDE_(` z>e*h{(w~#o`~QhS&eJj7Z8cn?T3w^$sscn3fmM7PEI!g0J}kT_@cr-BmZGDl3&uor zwnJ9!$(8$wSe_MtsmtFtH!>C2+#~Gwdqy5b0T_jkKW_h$RFA@(#X(SuXY+VyO1vkyIh|Ec>|&)-V5kEuOvy?848!fg59V_d&Qg#Sht*k9EllFG8w4dlh{T#KHDJfB=k+RCu{qKh7#M`bR=vBr(*x z!T+vMxvZI=ch>M39Y24Bx<|+dJR3{Z!2?G~M$6mWrZ4!H(mdyjPgHl!vD-r^PMZ5&ZG|8^PLp*<;xC6)W0kndl%+F z2;sJQU)KB<(fR~T;o*&RN1U(6~ zz=`pytML?8B^B0>FALTes(xyM?0LwH+&Mje`KhWF(mUGMd;AHEeuvq{7%L1 zeBS(}@)F0pZ8GbG2y$X)RZyblLE0CJ8buiZNF44hV))bKxBRxT0|JvF-y=eFr)FiP z6Z-9z`zU~Fe(PxAKk`#?i^Kj@OW)O{A5x|9Wan{XxiT1GX=l<`l8)ZXBH@(PAvz@q zI$20MiIdjATW6=#XWL4AaMF;7&iGXIu|_k!S;eM@q~j)e4veK2E305|_`5`GG_g)~ zpp9d1u`;6Q@%CFDUx8qA_f$P6bYWMwz_zq&i6UwtjMyRa=OKjH5qN~GU5-#s@T85^oI)`XHCVHBdqg3^|c*L)~aQr6W z2D9fi=rRsW-9)=Ou$&vur12ZuPvgw4Q&3Ga&qp*!?r`XTYvY{i@9d4wMZhtQRs>I2 zMj{hg z&>ShjvanxBWy%7!K-CkN5{Dl< zqvH^ynN!a^{m3fBq>dwUQ}WjI4F5rOLr6dg>%@aFun>KeGeUE0M3b8L@Q zuU*{Bh$}v((zMKmZNqvL$CCl!*=bGdG!49q*UY%TTaQb02T|2Y*@s@h&G?03Nv78$YNj_eAby+mC^e zg>P$#MH{L+eR4#q{AOWUymQ$j0vT)_P+ifb3p^%g0!2;Xu}R}+V3CTtXUJgXfC{ci zxJ#y6ewtfd2$KY7bT~~iTyPpJKGcjtmQE38d@1rT&%$Od<<%r4Ik%wki~48glBEV+ zY+IMZtp=JcBLJ5iERdS>@=K8ksl6hyD=g|bjN1D%MnIeE#=Xv%vs)B>W-^r=(a7O5 zj<~nwTW2Ye)T!0$9*7#cp+JSZ8jtFjEGVQ3xU)0KT&Sr`lc11KH6RVjg=y!io>yZc zI`;CHmj)Yi?O14AsRT2hIrpoK3iB6Y7V6W7yRQyl=ukEaCQ!7$j^s^bLUut5C}A#e2fd>UTt5-hvK>B zO5FO>*@)bQuwp2%lql>6_O{d?BxxhQrS~Hu|vDAt#s+)Ksw(xfws&xlFs0Cwu|^Q zSfuj%&ED4LRBz>D1Q*)4Z1<(M&-#RNwXZf)D*i&6Zdlq4;(}Pi+*fi?DGbwF%Wtwz zDjH$HkM8q0FOrCeTM&l!YNqp1vE1MIMNK9dv0cAotib*IcPB66W1%)}N{SnB!$c`PkDz8m*^Zaya93_BS#N6}qL2=nW03Y~wiQfe1D_cS490qpR~AzpV$;Jg%8e^uD8*6Z+jw56C~r8*K8W5trWooT%(S zBrIq?^A&*rJqzRA^p6&}0;Gb4u?e5uu8%O2OU?1f(~MTAA7}$`;+@0y8bSmHxzO<0 z`1Hk8JIg+ei@lLp5Pg!9=p7*k)W+$$=e15N_fyyBaD1H<5d|!3qiwnqQ0os0Qao32Ns<^! z-i))tV+R?!@?h@LEtfgdU|Ac@06Ar6VLOGP+8EJ(aL0wrOBKI?&6K+7uM=Vyl&!5u2G6=#7-4e15$XVdSxY+OVu;M zU}XAiQ>Vs_Oyl5|AR-x8*&u>=#_ncodJv!bs?edJ2P+pHyc&4m7AQ9v@Gq*?4hTbt znP=LtsopKW{X~fiw!f-F!qlWhtS*BrM;vGTh<(a~wRBxS;7rj)m*#C4@{G$Kvjq`T zh)*v7t$kNxF&&OOS0hM{Dp^#9YAL<;U)%)JEBN>7yjnjg9=SkvB%CSof#oS z_qtOH%VZZORv&KQFL}NYDANFgBB32PF(d?7w7yQq6K<5`qZ3shlz=z!1npiZL(gDS z4!bZ8{d*3lHvK(^vq?vK&p|){$wVm+=iAZlCzTzONo-C}Y-(;aYzKg$@Xh(^oC-CM zuD;yTy*zFKX!C~l5Bj~BPw@Rg*}Wsj>wMD++3KuCTnHizmv+N1K}pSVvNCNQYs^J!>%Fj*}4L-0U_U zr_tQ!T60Wj8_%pWA1_K!f(Oj>P$2M<2WJQLYxkZIjWA1~dVKv*T^OHsBFepiEF7tU1P6 zX3l-=uLHF@*NAdBAt3o6?-%FlRL<8ylS{q4ySv%)z4Q|DW<)8YNdglUxQCpE5aDOy ztv~{6_=jJYBTZ}hKfU8ioYT)8cfPQ@A1|DP;}$*<#Gv$=aaq@-%26bYd-%b3 z?~e#ie-pSL7HeRrsiin&!V9}`JQwyo3~0ZY3!Igk3$VEkvt1j#E3Lgd)U+HPpA(!Q zHjj4E?8>aE=|@kin*o=hxl!W`A53M0a4GGHu*fqY{M%*4x;I`aFXDCoGbnDOV2gYQiHWG|+~nkim5Q5v6I3XKcoD7Xsbl z{d6UM{;AHmJoW0Di$|G&P6uhtwxnvZ0E2(E8A&HMfJ@03kC?(NLB zwh=T=u)|6rN~G95LztNJn~ouo|KlO>uP3(Bk^z&q909Y>U)OM~Y0?G|lHuBt zgH`OMo6Fr7!JO6Gb3Oj@^EU(UQRlT(#mr^k<#-S@H&zyaOt}_vlr(;cn#Cd}6mFHQ zr&0_HXG86~pCkE$8xvzUvjuB_&XVi?seN9&O5xe~+v$B3N9lfq+u3*FCSN`N1Uc35 z7ooV`93~|b7w)-@o}j4rD>i1ZUtmu(ruB+Ez!%kovJFFb{|Uj0vvgfktwrv213e^7q<$>;sg!ewTf zh&(w*6CDL^f2HMl4~w|Q5!KP04xYXwM3%tvqU=nTsg1`h;Zf!qgz!wRtsG zqO*ZQz>GRvBef-V3C$yr^|SnJcpRGb^Gt$H{`wvWKdrwhol1rzm$f@5KOk;#N{3FPA zC%G-I5eC{vZ>xWQ5`IyS5V%(JK1IzwS*7X{a4+!}@K>wIG47G9(+OHA;2SF}-(_y3 z%BH8SbolC15qXg8iOyKU4@4+jR@gO?LD#8@2Z}-dn9jQ*k(&v7;+O;xCNe>cmJ*XX zNf1P^)R@=_mfGAYbgeS+b*e(?26C^!yfX8$wZ0cC^L3 zAiJ?qbfrH1UCVjJ_Dxp@HW|i-e3N}GIxPstspknufU?d1L%vnnm=pO2dYLcP-n)Uq z<-ZyVX#5va45JG2%K5=EkAn5!u5;tLS~g=Pt-&{IXsud5XDR5;;b5NqQJO%Wq%=7M zd|cLE8nEn*b7$Y(!zhSXUIH4-dP)Kl3ld%=?FIJ-B?=x0i(!XDUec`_ejjEa>6avw z7+<9chXWB8>-mPwn0Hz6^Ii2(`{k;uM;*~=y&uZQ=d;{PfbwI0@Ca+> zXo$dh9I)D*ur9GAnbOT$I=wq-gl;qcx&qXxW-AgHa!SH3o+17U|VPPy_f?FSAotltdlfs0UwS@{)R$F}bU(F-e> z#04MIi9%N_=#g@%)6e$|qKrLQvql>hj>}C!7O5phdJXR9% zz$6eggX#{R%`so2j4k{LOgG2^wQ9D~v>nLp~9Xh+PK?4AemNB!)Oq z4?Rb>w^~g-yit1skXp4{=W8N=zjK?lxBPiG)j$2enxx?Xm=)7z>9UOEOa^iv+;_Xd zc=ieHZUN_m;mB_i?u{fea8;HHAt0_o^xH272-k_ffW;r@kF3FbvmxVrXs%t8_wxAA zmElJMZ|m?L89>kp<5Xv1;(4`2jxbPqmgs*R<*SN1xNN1L9D%m1h8H^q>8tZYZDhr2 zzWEK$Z+2>2Ok+vGiar#&+__fQEs571kZ&P#`dedQu?bps%{KR-bF7uiF(2OKU-pgq zLoCib$N#lo8@haq-@PSDf#bGT)SQZU|N7;dde;5lAW`iL>V#PTfnVQ=g+4h@`}(`bo!&XkspA(`@Sm*~=r{qBDe)e@Hz2im zfmsQ571Uw&2K4nN(rJo)+&Y7iZ4Jf8AKTwAR~#%6WBKfQ3Je9(0`c5C;# zlX~}wT-n^hNh28R{m3zjziGcNLX^g@Fxm!OdB`%K922O*SSEY-fomJ*mA@{b)zI)K z#mtY;sONYr>;ZRmsDVdT1h<29HJr?al`Bf4u6)y0K|;^33VM)z_{{mq)U?cjjL&2J z7-iGy{I0_%HRqrHS*N?SK@gjae|eu0e?K^)t<2*`T_TR*t9&CDf0~0WrRU=#)QYac zW4`tR*vvvT^6vKOl#V@8exq*0nqu#zWQva7xwYDhZcxv0+@z<3EQ=B5` zoXlR6r%Y&4BX!aI@9uWuWh2$l>`n{*t7cioZE~YT{Tz3=qQL2P4Q(yRKOV9~Yp7}V9 z1>l|S?OP>1nva6~2fkB!*XW2}2Bn=P5l~a%T~QZuFA63u5^X_8-}NS8mf!M~k0p6; zYd(8kA&>c4#yYLW9?%rHv&FXf^HvYI>ZMrVQxQ{sTsa0jU1Rf;X!$G8%6@DL26VeV zFDyuE-WbX$=KelOOPW9(lrWHv&XULwomx7x&g;aH5CFKNKps)BN@sfRI!t|k zz-6Ml7s);cF7+|`3daKBrqXR|0Z1kL58ktw=`d>aM8<(W?)2j$l-#Y(XXVHcsH4%5 zh?_th5$qYC(cd-2uZglNt<`jVH+>hX(!RvC z>mKjAzzOjIUiOMmNHlIT9Nsc_|wh(<*pn@pS_?v2=W_ zre8p=Bfl?ve@U{Vhc&Z3AZQepOWd~n3&m!5tQ~c?kcH^tzP2^!){H`pI68mju`g`J zmwNDN4P5yK0g&%tCjTy1;8B{F8sED`&9BHOe^`7k%y_rDHHd6{0JAH8XdTy&-y|#? zC}a*^HJ*7lCc+9Fdydlqy!Z?PKZ^*ydIdoetg(bO=~1FRfD*tzf9nH5;}rk%0h(r@ zPEW8T{z8E+--4^Wy-^?tLyZwGg$Y4R8|35rUbx0Y>(Z5r&sU2{byv{c>6_n7 z^XncB^0lq*@Vc=0eBD=t&DYlOqHSW{hIoCKYFW4Z0>n`uYjQ|N5kGa^9|M?YOmR6e zX~^#W`B+3ewi+4psMHw%vQO)qomL^Bil>IhC`gj)^yosD>zI|*yGOt=tqD%3X{^=eaX*;k{k$ zOZxs+GevGbQiC9>T2wjl2BB2p{FTDKI9B6LfB5v-N3n1Hc0G01=~san73bGxoRgIB ztbh>HX|TG~Dfgd+y_opZ zY-xKGJ_#%P4gI4{$i+HZQ&-E|QtgbNF?U!pS}ww>Wg7-FF6^?##vJ^oT+#o^wi?l$ zGov)b;%!b+cmlqF6TUVGYu=B!{Od;$Y(K{qtJF} zulEh6*nmIb(F2IFWPK5_(3HA*J|6?!RHZ7qMK|yDm3Z`2Pyi`ZKqe7=oW#R~U|@DP zVmj$Ky`5+iKhOrDD$o(@kz#dGejesh>v$EePw7Fw#+|OA@3Y&5_LWwn2Ld;)AM$k! z4efPw`i7o~dDnTwp*%*3*%t&-zg#O(di5~tq0aU)6If;|Q|(mJ_S($}PM-dG4Gd+G zI?YE!lZEh8G47*J`-HaABJ28V5HLHPQLgozE+QTCxmuuf)ZZ?GEv zV3w77i2FddgxtyO$ul_PQ_x9`?`C0=}*wQqIKX*BavKZ>{R z6vjt0@)~>kOJy)LD`^X|Zq^kM^y&z75CS>gE3jvc;irX?$IMC@@FtQk)sFKng5dsdd$q8ilZ z$3E9kdFF*{Wy1;5*JB%%xIJMaU%=2RDUtyKmK{*=Z3}3SJ#rK(vlV#DX4{P85iH%l z+He#wFAS2EeE={;eK)x(-$-SK8*U0gr_C4h{=ozbN;ma|Ok}}6m)HK2C0U$xWT4Ci`F($7Cn zpW+Vku(nF$n%q4Q>}9(xX%IG UE$I);xlp( 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%0DgrW8oAvM8Qjqgyo06!`{G!cVDR2x{q%2 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

    5J8sUTmYe>4hsl~7 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 GfB3Hr12(Pz literal 0 HcmV?d00001 diff --git a/docs/_static/imgs/example-mathagent/log-1.png b/docs/_static/imgs/example-mathagent/log-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8b563d560c04aea36504cd1a16ef76af9ea2a10f GIT binary patch literal 757385 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%0A((y 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 LRO@)(*`lUe;lxe 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

    E7 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

    l~? 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 z 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

    %2>>c)clWvA48FIaciaL)bzmu6NWDjD#FIgpx#X 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 literal 0 HcmV?d00001 diff --git a/docs/_static/imgs/example-mathagent/log-2.png b/docs/_static/imgs/example-mathagent/log-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f6716e8863ef9ca5a56849eab37a80a28bb9344e GIT binary patch literal 361038 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 z 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�ovLpe`w~2#;`eMnb zb;^g$H+35^_B$7V?cO3cuDYsQTAMyur}1hEi+R9pQ~u$9RCn^C+bK;! zU`R#dO`pDXPvP$+ha!>)1DeKX${&tgLdBxj_m*0QXlG_K`3FB<8!k5Yp-KipsM-IB zExUqac2-XkfDP8TseAhi;FT7YYoy0SlOvo|>j%Vsiu<0dpjb&ky-%pgtL6)-a8rC4 zlJCd!&C$}!#};hr(`92I%6#DV`BiOcK&fSg6D1?k6B2%C@h}K(jz{!AisG2zo&Tr^ zx6|&P%7ceMPe4MX&D6M0FpZ9bJh<))hAbpmum?d!)L1xuE-`n*Cw%MUR(Uvw?cq7q zkjX5-irX^L+E~zmjjdD=M(jXD)F>bx>a_E4>?<=*Al>_Q9)H05IwaZ|yV7$y{16o+ zW=RP@ndU;o#C1nH;P=Y>iG$sv2-A&iaAo`PvhO;eXcH5UcV}8 zyVniEM4S9$&J0!WJBQljsj+GwNQ&2Bxoo?%#E-}yl!LgsOD%W&v%K3n>09DSr;{eU zEKXMg#oTQhh{z%@?`RMY>_w+CEq}q)n-MpEJWiwMRAjiQLy*mr?%{U)=8Wz}M>N=3 zaEx-)IS>hh@Z;b;w?SZAU7W{z=qD_+`xtao&O{&0v z`*`5`fU#X4UtX8+`E}`jSMPainr!hF%zjDa@w)#Db<8SPf+7+ZwI^i#uct8U-71k{ zw>I0*pE=(Bn!>JKsTaC0sNgyFuPa>@@BnR*k#@v84!JeJ?&~sR_#|eG8rWsD;^hna zM4>KQk0^+9^800vlVT$1KkQJiBZlX;ne;U|!D!0d>D?wCX#&xJkB9rrSl2N~?0!^p zmwa7&rBR3K1v-)b-a;BbP7{6Y>&Sbvrd`ac9b@&!x(5dIy7!dAi@Bzl_*F3A5SY)Z zw+(kd_v?ZQUzc|>b^9bY%|J1|^-kJ{Ey}fDy2r&P9JDiER@#E`4not= z+Sip$DS136Ro)L~(ETE+IFWNPyKUFhE&|QZe43YwgE$fURuSjyo1MNaH~VVPh_=vl z4OuanM5dP5-VcOYeOUsq9*nC|+V-tRo)`w2< zV17nPcnAh-E|}G4){BWQ-oKu@C?FQ94j8K%5@xCU3t@rB%@aFC4DaG}V*@@tX3s%Z z@cw%O-N@J$|8qvuyx_LuQVVU*?o_KH3^Eoja((lIWsD_@`zSRgqNh0{3oibd9hWg? zar@s>CTspDr&a7!t9@VfrODb`TVkh7JsNA{zYg6Uo06cr7cuxWtU>{AMgMXo2#|TD zNY|lD_eQ7OjB`L2NjMuq0Zcb0+h*xr(cY=;48fNkK4$Wr_IIsJDH8&C$;h6X&C=$K z`MgW{!+KaoF`?C3vc7PlD5Tr^G6QpquebeJ_-HNMQM?|1hrag^2W;xOoBCmm54!O= zx8hs>ohe$mW8#jyGHeUyVg)t&2*C)w@3K|Q+I+d~1QwC%g|1BEenIdFeJET1z-?-r z{h>JiWuLWt&aKLS@NO|%_XX`(*_E+c<>o4+wJ8y{s+L>ZF9_) zpI@7QaQouVkQ>~6nbbE+AGy0fV^LSKm$)?#Gj5ztYA`R{r3;6oY>X|Js&PAglDn*8It_Z!cnbr+F znD-ip{AO`lVKi^4%KHrx`mmtuI~$JG>qoe&0wMZUa!dyaG7)-L@3nvDlT^r(E(UQ{ za87x7O>+^Q;<==I$lW-m@86h!P(bH5jphVNn-EJ%OpG6&@UC>NyXW*HSCK8K-3H%v7 zF+2F{bF%;lW!`d)o^DH6N@{@u7pIBt8E1btk&ZOoY=LTb^^ZZE>j0(UbJR;>;`VTaP3Pw(X13R7;8|oFBAjiKT7SQTgV;6=J?xJr!(!@Cbgh*D!ausAId$} zXWrjyP60=bJJkEw^iRLL$y=)C_Z=w5!603c@@a-@{w+93e6`-eyspM}pbaoeau z+!ueGJrI#N94Rgu^rU2fJl&EMa6yO0mu&Rg?QCCNPU zhMQVFAtFq;lE&QxgZE^GJPjCxx;(}e4Ypy6Y=S!2xfb@GaAf_(}`)#x;dghsQ|K9Ap8ffW#4 zqGTD*@7Z+Qy|}ZfG|_cVpI@mY+^!a%v5)m?u-wPS83B2cLX#zTEhTZ|k#2O%Nm29s z`64i-gEZ$SMO@yb3k!&!U1CO42(O+c=Js=>^GYv{HQ~;lvFb^8#fI{|cx~*_l4+68 z@H~bE4kVtpR$S@C21paZxa3pNLz7Iv0@v4sp?cP3*wL)$r=ah$&D};W*paAR9zM_q zWd&H~jQ0oC4kXR&%G2e)CqcoAWxVAZ2T0A?jWzJ7;QmyBz%@Ewl!s48xgT1g& zrTuk6Ryi_tPY?-yX+45(lCc2dNNRYnsFd?5VkslRY4&uZp}s#Yb`;LPUBFMk)W2NS z>@J}UO^EP?ZmNw}7#F%C1&#qx|Blks)AC-UKc7lo{+-TG3N5;Dxu(Pub!kj_Mf9Wa zm~&uiG2XQltB{-dpl@gSR=6LA52G=;DTSdEx^sx15qgbZYp( z*2y2U7Dpbl0hXfo^o-VA`+hl@T(%$gHOS($rwjcD5E-GvHi%plwd3FLFYbR{vnTQ>*>T0cj0aUapZ z7Jg%PXe;-RWi)*1OuW6M;j74(efpP*3`pn=cETSxQ>3X%5oxM@>6F!7Jj#c-Z2R<} zH`gNk(TTz|k+Hml`n?se!EKU@q-_U>3g+T!UT_yM5|QSGKB+cm-tCSAEhzS&`VyQw zf_BG}=XH~*IYkQU4Ywu;UfKlla5eCf!vy?52*S7~kgL3P;mTK{51J%hg%enOGuN}E z97Nw?BEU%J&Uwsouoe%GCXdUuFCP!n=HV`Ai3zhAdQH5^+wVT*T3H2Cun!xBt>pcA}`Nx zRE?dA-T^owy#Yt3P8uVyM`t6Q6cuff;;FlL-v1Eng@}fzSAT-K)?|`)*8`xuiy66w zluq+QaE;~WiL6_+W5*Fnv)+YID0=utvF@f2f?%#D0$&xr(s!TY>bvhOl)HSTWT$AC zJT4~_s7^h9DcNVmH6Qi${seQ;oirNUZ%Qw5RRkr`CPf2WWs=Sa1)V@|9ON>6Fn>kR z4d06m<3N`=^nlQN4LSz#k%vLVge_N^bTDg+;Uu%5Vyb9e{lM3p4y6%r0{IEz<}HZI zxf}6hFc^P!T(s1rQYMZYUhw^v^4e8yiay)FqG#vL48)Rtq0O%khkThgn&I_N;$87? z3h&LwixN-^Z)!D#3pe}pUm+fe#eCj-aE2)_EpMytqHr@)Bf(&nJUT#I2C)HD zHp+M0&3!(i?V~=IP~bpjuq^SHVvXvckLj2#>>vK|uW5^U%Y!ovMu~mmgb8Z%%6|3L zsD$rWQ`@0n7V>ntrZF`Ow}JO(+&(Abp!xj-!hOvw+EiSu+$eW=0u7#ogC&-)`VtAn z4k_2nDB`DZM}|jIxC15>H!%3a@FWM_-PQoc$^KCvpVSFgNW}S@kZKIaquj6nS*bIF ziHqLh!$EqRE^-fQJ@G}=itDa+pVaaco4%V@sFVyHei!V139Qt2@dS|0$qF;c16H-U z<`J^9m34Bmd2`h&_j#&VD^C@$>H~J2^feVr?)1DAt**EBAv8ustg)vb6Q+K6r)i{h zJsjLujmBz~1&I^*AAcY5 z>;HR1$f8=t~&wr^p5)6(j z0;DZ)uk=*%KJDDx(|rQ=0Q+%uOR16;cXqLU2g75Y%0Ija zLw!tcKiE`apC8~CQktDVe}Qk>TPi4adE&$%i8?&m!MZuOhswMe;|os6c|X|774(mY z$cF_+3Vg_=TIF`s(OtiKN{c~=csQbR9Sz&tcU)>G-3FQ?F0{~R7g!qV2%}vgW&R(q zw58uYgxi@{ZZu8L0@~>IwQj`C&rXVrmDa|TPWrXs_@OB86zMU1El~@VUTO>&kWc zs{YX4Hat9s!K8^kXGJh*F||!+l~YTlw5|N~BWd{MHQp0J5rRpQIGz@CnZdqEn-^^u zxG80#iiG$NGVd_?AyY|th>16mcKxF)59lz7he*1-nge?_j+u%y!P1W;s)?#fLVC@b z3F^(7%p%raf z6|wVGEm~j&9VeDTl(Pq2{bJn;MVQJrI=oBY<1*bhKz^hJ#)&w~DF z##^464pb(W$vl_Vk?kG4D>%9}T8a}};5ZY|o=F;M=oez7~%lk?!KjR$%N3_z+-ml`xfB;tQV!mL->~cEy{L2NV;-o^8m8hlAwi8 zPVwCoX;$;_fed_Haqf18HAmURo7Q_-iO&q`e@*CZ$am^;(ywlc+Y{6?2^Fv7pH$id zK3zKA!9lg%@-0M0ru}J={&PLY0;Sl1aSA(%mZeM``7Igph*X64AgEDZMBHW3o za7*V8>`Z|B!Ano<>ig1XFJE#CNR3O?@LmRv9YdyG$XJks0S`q}_j1d?LG2^FFTslJ zT~Ez;Pehnj9egt0ne{|eKjmWsRvNg*V*a--J({3kO|B#vu(b&x#E)6DY9n*6=(7q; zpN1j&hda#w`YWv9LX;5hyj9?_Wet~1TAt8rncooELz%^p;UU}F>3d?;Hd$sp)d(x> z$b24Ir~+eOJ7gX^8E%L6zP|$Y{ajr}fnPx-Kv^9=s?myb*_#e_jsYb5w- zV0FX5zNh_TIM=B;8z&YRl6gho+?AX5_r?WDK>{Y?1HuIHKu9UXR1>K1V#?h&=WpmPdh#MV=?VOm}|sx&kn6=)?f_JQ*} z&1)0Zr-UEkq|x{KLz&rb4+qn#eK-U&9?{B2K)*h)1u>sjEvgoCz8w3h{82i*;hj|_ z*r&idtbLhjuI9AKLT?sZKTtlD`47t6%2iHORob9v{bvGDC5t~023-Iw{k-PUe#)QVQt`H^~z>jn2B|ETl zt4Q9w`D5JuECCq!yX1{Nj7t%RdxHF3mA&kvta)~k%Yb=GVg=4V6tFSvy3;h%a#=8JNJ7PpV^dyuCtw>Ydbbv@HseIO2 zAGd9y!~B9WtI#*r{gT7O4rp&A&wzC5R@lwJ-bbb>sWhWs+om%#m0ESk3saj{f@j`)kXox-RuQVV*RFvhETxmI%bG z(4jE%3Af+BM2MxlTe>BAd`((IS|I>;PqI%Tgj&6mCBEt}qZeEc7G9}LP1S!xa3%gBdnX&&gD0&j zAMHrY27mn7tzn~>0FC92nzGJit*A*F34HBOKmFrZyc}hli zsK_t>yKq4G<(k;%eMdVqgph9aHMI1lo#C{9_3 zf2a^)AFwz%wpXPL>n=4Vn{m|HeWD)xmcIl!aZ_hO?;unzR38>OB(AmmU>ripkA?{C zYO!^350rxP9er(qe*>W&BRs5Ix(w8r2SE|7XvsSM4c%?JIS4|9tkD)(8pmhJbXU7M z1Li&fXM2Xq!sfP#SV;e(RFH4+6A+AfS}6;+<>UU2fCnt-Yk&=q@2>?c*-A8>a z%3LMr!hCI2^@tY1HVJ>V#uZT7vZ5h#stZ56$i|ce@@*!P6F6zOVSV79i{c1XVRb)y zkB0q2cgE)V;v)g~TDV3051P^rRJ>4j5Zet5621EpAl%~MifmGq#wB;VRr@FxqiQ8S z9Yn8URO7fZy~9VihtGYTN%(4426GFZjoK45Fr`azK!m+WwE<&k@SCA&qAW}D1hLj+ z$U%q%)cX}guhf|0AZ_JL^Y_`oUt$p4eiNWSfVM{bMBrTuq;~73Ox@+s+zsvGkJqL& zr2fmtvJ_iVmT#|uM1WC0ohiYYiVRv#23RhqQxg$me53y-$p3mlYG?K8uH_B)O*WXA z-hSE8Cn+p+K%4c&qQ9WYwA;L2vO4yF5z{is?T&-`LwgJAba-SR7Zzv?sHnO-vuT{> z!2?o@ndbA2&l8#~VU#Slsh(B&a?=S+2&&Yn5$uVZ6usDES9iXGCJuLtLnzj1FBnV5 zsR9fFtR2JSU`L6qiB={+9F%{s921jL=&^s0;*dy}rKwf}mV=4Qwz*}FmL_V8v7b8S zBJTqT*?zmx!34R}6DUj(U|fmJRfJ6l8$`CU9@Y`t|e4Op$OHo`_D6-_j-0*vWtR|@}uotB)?oD*3*=;7hRu?4GC zzJ&ADhY2?l(yo9}%Hx9@(vr1zu6=tEP*RI%*djBz#2c`9XGOu4-{d*<;Oe5IfEedk zm=n4?&uGt>b*qTMK8lP6+Yr0BNmpQDb%BWf-tbwHz(Q4T#(U|_5|O|PGO$}TQ+rF} zVkw^sr6&i7z>*To&t;xIOTm0A$vU}nnP$mjx4-W$OQ{p%-Mukx!VS`J60ETt7)64G zegcZwN!o5}Sp(f^w5@@++9MXe4IB0yX;4dTHmkVmCpxZN zwR}tGDNg0cykK@kxElToVpc#7Jl<*SLMs;oP5M@E7ZHMNOpUBu7b8wQByE4TT&DKM z*#*AO=H$&7Ev*A^edZKCJ{GoL5mcL`+d*+5&Id5+Z+#;8ysGu&F{shz{F4?_eVW_6 zJ6ARSvIIG-=$SLct=D+oLar!+z-pD^*q;Rrp+5j)nuq%dP+DONz{aOPbG># z8KD*AVfD}S5jmc8dN#ecM$shudE{9vXAk5Bva#hRNzCMw46Y*Z3F|*m084J-1}NK? zy?~7%0dVoK`c?wysc%i?_?8Cz^d>4uh~cklxGE{U0{@v7O*Yo|;VHi5Mk>16rZH+j zGGMGI_4NBYb+J#4Y#ji)i3iL+kr%(s7CvQ*=tlpoz4QM{I?wmGUt=9oY-*&uDmLzn z?WRLsV>iD5nwvJ;thm#e8l04tnUU0)S;a3P3VtcS^i?~}I9dWSwnI}UYiL&lK~vMx zz`~>q@w;FokidLIz`5_b=iGDe*|Yo0{dDH zr+_0I%x`n%)k4_)G?lfI>z+o)UB3vYs=R7F{Y|(6s5#M4P!H9_nEdw(+jh$H$}THv zGHK2HDGHO~WqDdHcOO1{GIW;$Oe_!#Pu&;W^y_yN> zj}#9C(!F^^m9I7`?g3?>BW6r#5K4s}>n{?tt_wf(ZT*_^phq1Fy(p)u3YfFnIMv}M z)X}Z-mb>OG(^@yI;E(#%U!T@ zuik$y7Iw{cuAvadm}E}S>f^Wo$SRA)&?{D3Mc>*NIM@_JcN^Lfpktg-)*h=9Cj*bU z4EjL~!%zi6Ns_u;<$JlnJD1}=UXu8M*d4oq)5jcYRsb3(j^iI2Uo@c}VNw-AyJ%@D zB+DlsJGh+m-f$Y2>_5?KAD=quFH#XTA%@=UUp(lp+NW^M!i9W4Rn95oTG{W6QBcu{ zV1hRXke-G`oQQ(>THL0G<6+&LIZFs~p$(83duN!>4e{sI`Y_`b+6?AYMp{CX)&;}e zqBO)2#ENzKn>rza4XfjCBBXG@*aG(-UKi`i*K3qFe`#UXe7qKm4IgYBeRxY^G*6a4 zp=IRb+D(caUp05fK|(L02YO3OiCduT`GxU@77!6O`&$6@W0h;?H-ng-!cta!J`O$X zDV$tBJddO2O2-V0#SPrc;EDU%JY8fpVok#3HGC75S`RVPV|?xM%?kcIz@gh1jbpg6 zz%Xc6@$~X6(+U6yOsUKb>#sqZN}6U_h7kk62jyB%(eWcO%q%qwEk{m*xYp^=pn+6d zi4SwhDAR-*eN9F<6O!19*ug1R9(Oq3u$-XFdd<02b`e^P#~+I3A{Q!%E0!N}QIdV6 z6SN*`DVOe>y=acIH1@+vG>Vkb`vKu2cAOxvhDoW?D&GXgUui}#))jBj998!iEhZ@g zpgNajr1BtdBa)7j=is5wAuZ*7t-0dZo*Qf&#&8m;g|D<7H5j)d$Tv%H)wsO1GKGD| z8DeA0=S9=nPWN`>sHr5i0(iHI%~wNbsx|gAVu&52IjR8Ujv3lL)-vmKQw;4eXr(VU z9AV2P>2>goP9^^?(==DYo3h?_GUwu3zfow%C_X4t5k4VecV0)B(Jm?2zd}JM`48<_+HfU%JItdH7 zo(I!{xY{ZR9*d%MaqYM4X5m$HQT%%ikCVY>oW8T>%0ks{2s#aGKZ4^XaHC3kwa(4| z?_$$&;eEifq-=V$)s$dl4o=yRIO9vN$PjN-UAqJq*qZF8c~9;|v*=qwpRJnHK0E)k z4SfwRD2UE_Tg!iN=XPwcw%NSRp!J`#Ak%5suYkSm^NfGmWiJVR&| zIaI$kd!Xry5e4lcCPNG=cFDx@wbM=9-@u=(mNlJ}AMWC2*Co+8s_g^0WT47+u{8ku`596xnhg75#GUFBO_*i1 z?MyD6El~A?(d6G=RZQjf1S8YUQP9?e_Dcm0)7#0n7q#MHe_U+=XbK% z7cLLmGKGH)M+`^lVk_;Us(sE%RT=_rrB2o1XhT+zJn=xQCTt!|o_N`RcHh%_uJP^c z(L&JWq2E;gacdO*OTXKTu2C>HKL@Y!<;zUn`aki~+y3K`*3boR_}_iWycPjdgECW) z*X=HeV~;%|l^NyI>}~Kx!#lcmxY4#sEX?;2L5*9^EPFw2T;5RZE<&Kc(Q9RS9#q>> z(5#-#yVIG>nO!@#cX<{QTXOWz2NND(KjIIyDu4dApP$=5cSEu+5eR{OzK4$QQlENa zf3|JX-1V@n{0q z9H>4tGZmlkHj`Jvo?C$09#fK&Q}P-<_fmDiav2{a{CuQ;wWs75;x_)e zWEh{<95cfM!)Gbs2ylz!)E+W*Wu`r@#acQaxlJM+Q=}Zv<;}&IfSdgd zXp`%D1@Ups!)(eQDWdcUQ6VTi9?scJz>ozhv^P?}A$pL&JU}bWc(@gA^K#HhGt9@!E&QZ&vK-V-ZwR^O!t86!8qjqLuL+L{ z8ji()lH|n85<0LVfvTHn1PtVh<|i^%>XZu6KtsG1=L2oI67<(CkKZdD)H!UOj*aic zc%klerNe_IL7Sw{Ef19;cS&8fbya|KD3cyPf+1TbiQ~k!qaU;df?}nEj*A7cCO{>D zG%gvsFy#daf776cjf!Ef#V%R3PlLSwFzZ_xIe){E$|`+0#U%oJ4=gm-AnBxnb=~ro zdC+k^*zfej#gX>h@Q+}Czl<=|?sru_po~e4MFnldRsbnY&zPD<#_al0z&!$4-Iu0L zz7~(|*#SoQ;)%`?QbcqqD_kbi85Cg*@=km?$_SSTz}f*z%}b;q$)I@X`70 zJ%xS+_4>CiWy3%{9L_-?N`v~Gjjpjmke3s<&8{Ncu&=wC4SlaFjEX0i3s5DsV{%cj zosE~(Pm}T?iXXPUj@w%cd1{WbaSX=58sOj`<&>5q#*m}e6VIi`oQ)o_p1Id~a>(tx zpQ5@NUkmCN7Y-4E27S)h*27;%JD?JE37NqkqN$rc42hP>cVmA59lEdN?<0nHtaE6r zF gPyXwxn?E7RSJtb3b5{`T0zU5_Nd8^h{^J$@4KC_*;{X5v literal 0 HcmV?d00001 diff --git a/docs/_static/imgs/example-werewolves/banner.jpg b/docs/_static/imgs/example-werewolves/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f5f3e135dd06519280573a94be5024b4bed79650 GIT binary patch literal 2984326 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%0DM3A)A0ktei881q?fYU={gpjtu$6T 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 ydE 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 z

    ~}vChevVPxdy%qdl1!XyuoiE86DXzMq$0FK)_$ z5{tXk90r{Ujk}1+#|2dKl-o5-C2)_@g}EJ!z?&&vZw8lWGvTSq<+{hN3*V99?Rfz- z7irIaGxhJcj;jp{u-7B{2mMyU0v({er?tLJFUca zILEOku=yhS&r&*sQ3Bcu5&Hsh8?U1JHB9}*$`kmbj{>o}h>McuqF1*Jwz2l}qTkjn zzdsLJ6x&K7xVIz>NsY3=d{<|U;>D~wv8Vu%|KS`M+~m}w4NxB<+#>dUb}3HtOWBsI zdsak5W%>j!z!A7~oxNiv0AQ*PLD%F9r8q5-_s`+YCX zdNd%{wN>&+?maUQ(igJ!V+F;AT)atm$cqe8weh???3In|IV7hH+3hJGgjq>9T}p`>{;zEh<$tV2%<=)Y66dOh9MD>fqqnNnH&W|3IVTz~}kp-DOd#=67^@4uH;w`UZJ!3hkbg@S^Kp8-QW28OZ(qaz)R?UluAoDzP z-t`GU;rQA3)fx&yWIzQR+>$YfI2_%l3{-V%2 z6y_~4MO&0SJL{VLs;zGJGk_~GnE&DZAiJ%O&t3-J=<$B|g^DoT&Ws0lFG$YTU;z9} zwNJNQvu&QHvK&2dFIPJWKu0`8gZ2uryVq#$|MH(3b=2x^yUtijM)DvxN)=0%x6Mcq z2M?H8_NvLQsYup%Ta|JSWtb24KuY(2nZ6i^e+B7=KuT~rlN@L_&W0wP(m>?u?q%_% zQm74N#l$R~M(|O%sEh&Sx?P6UZ}U~TF|P`*uFRr&ZRG11 z0+^y3`nTF5SFuZ-IX2Yh)U3{6!h5^84*YfH9Z%_v-;&Q6yfr==GsJ@FLdJA*KVf#YaHe7O4Y%&T1;~bbo8qkRTlKg)h}4&)_6r7Y8DR1o;aV#b)6c<$oRRoWwueFDplc-#9>tL{Yw z6~D<}4f?xMjT%D=PdG}h1m)*_`{!8H;N5QTm9Ic>sT7ha(#Th0PmoXVuO}^d{r#JT zTmufWW%?O;55B<9p@7kBV%4`+nSo9fhhaKad}GePG}OGk?Q;OOm|uhIA(ro%y>FLy z44oa!rj&AzH=f4J&-MA_|J#fd6_$_ST`LQWnkhqAtD^+4V0NVqwkC#5_Q62#lES{z z|8U4K0@mW=WskhNNEewpm%gs8$vRQm-no%NJ(VUu`MLOCC<<#h0sXA%=e1)aoXC8ap$c-(NgLLjpo-V!5@0A2|FZ=^k2Y_Mvj zH~>(+|D~``A0k>{R|R}`8Em$&r4NOlnrB0Vp>_>0+eLk4`S)_YY7GyKpuL)1$koLh z(~6op`t6Vt-nU6l3 zm7Ie^ESJ1C%Jcap8Kc--6Fi4>2&kR!2GreJXZuaw{I2n!glIN_?+xj#Dxg@jIi z45Smzq$GP)Aevd}A|%}{CS<)7N^kyfAh!JDFh4M=a&iYM zB&Cm9S~sx8*8MxsAj5Cgkqcc+3R+l^oN$C9uUmvu9)DO@cGrec`2(>Lb^%#pZ+xxh zAdglEiu+#fw6}0p)5kcBe`@8_ss`IpUgcv9u~Dqn29M4Bg8AdX*83f+&3jI;vG*;2T5riNY^b(| z_nnwZ9b3YhLz(2=cW1`v&0*1Kxm5XD0-5s9JW_Z|4S3P`oFgKkte4!3!%U1Xvxm48 zjzM@~XCc&2- z19qx-uv2CG=hN%yD0!_%G*6)W=jI=r9}lCA5K=9YKp zuIW^^;0Il~nMW<%`=EUb4sNG@iIN$k^2Fo8;-moa*hp25k3lY#s1WQs>@eqL?#>I| zgq{6Uo5pP)=SJ2=Bz%2 zDSX^qoY{~(Me@E-8Y|fYV>oLcnJJy1!Afn(iq$)1zFvndh>xAwzzOQ}#H6_Z6rgRO zDd{C<2W#N zVW^LG;MUfm!uMvz`HHU5n_l_;6L0Dc%OROHp9hkL?rpH62pryhGjZ zJ0&nf#?)!NF{~TGWFQK(*oum1lPp&D)zb7A$fpmqGR&Q)#k<706>NhZnE+u+2}CDY zf;snZ=d@L+_B#7|c>3O>JuHVY#G?QQznkH>_xlNSA*LS$Ke;Y>5bA{x*tb7~13 zMn$7|f1!r@?A+oU)Ar+&-n@;_AlO9^3@Vop=#&R77XNCX!MEIQh#v6$>-#|Sj#qoc zBf=-#m*LHb%PdYkt-vOuo4W`37Nto?@$VRtro?G{g$1R5uGCU$S8N^W{mDt0diZTz zU3|o1cwiSCp~IZGgXTxLtjCSobO|J^Yy;u^_%Y#}nSDK~3lSUN;Xmtx4oLJrYeMbp zcv)aWJyj8qrBapp*}y!@!a!g9CWk;Zs9k7F{pi@>gMxX@{o;u#9b2kQt!7}2>m3_^`Y}1z`SI~=C@sy z0w?lzHJy@pL2)nkL+NJ@dBxenmc!AdT%H7tjJ!kwH=}Rk`5}sK+w#<9d`p{_qm3`Z zy#;+dp&ORIi`uaDLRq8_>}j248dKneEdN>`bh~+W-uLfdnrwt8^hSJB|K{YOQ{DN! zi}9+un_rrmB;rxV`&!lYy1lI|ul)=>Y=lvd!FtDDn)jj^0$q^8BBWM@#WyRFF0=g( zMMM`K*uAv(3xpCN`p5}}AX`Q`HUp<1fH#>2b@T8tmN2~=cP(R&-q;t&xDXPVdW|4R zE5xk(tIjAdNR7IEjHlZYz#`ZeNK;GN!l_Hb^x8kLo4S$M;;B8fo87JQi2^hf;G3>b zaj3|XZJjToxNxwrjH|9{6(?a)BUId8Be#;%nbT*5dUMrhcy?0X(KEWUo+_lHHQ!-i zd%M*4Z}Sbf=RObFfT0Y*K7eu}tq{i*@Ljx&SoMy5%_#%&2uBWzMg|UhC-*7Qh`5Qs3(bv0)PhlWIntI*C&H1Cc3v{NohP zf2rut)Oc50(E0};f?x0Y+f^6SWGIY`y~M@N`!_9rStEYteeLdg!or*E-?oimt?as@ zHL2mi3& z_F{7$I0%YHD&5?lFSS=P#0V)W=!-mFn{PF^a)lj&L}v#Bd-SOLiiOhZZDl8o@fHXWA~{&^ z^MybzlE>kAHKdgnA~vBEZPii|#8cj9GuLjp@FT5Rvj$W2itpL%oP|%r#a*9jcw5*+ zV$d3+&ZfqN^6ws7s-pEdnD@VdC;Cop>aVX*LZFK_tdYwD;v_waBkEg}7{V|K&XK4l z1V;KL$}BRYSoDzfI{OrAqpHFeH_~Ud8Lx9rPk}z+iIXkIX5>!vrmC?TVZ z3G9FoAe=t*s7%*D^`nmrY4~Qc{NRlNdk@cDKO7!|f%{geBa_#=tjXrkDD=<48txj>W zpm>h<-HCbeky0F_c#>~qC)ZA=`ZR3`J3!e;%;#D$M-Wj2H&-W>L-3zvp)u-K6(u2y(3d9FTOIEf2` zn;_X%YNP*edR04hU7>05$DF8C=s9J}Jr;an#{8?`SR96ZwHJqoJh_%a* z^6C>ZdrYnOl~g~w1!-=p$)VZN@p1mY%BItStFAubC&^R$ZD%=-`}G_x}>EWB%~XamhMKnMyGTO zjE144NarL+cc-*;gT!Ef((?J;-`Df}1AA@vz3W`(oOf+Ns=n<|Su2eihD-xOD}(3J z9;BB0TJ;TPcm97MyNjgN+vp}b)dN5`v2*^NC-@_B&9FVbMa{D^fOOEn|3SU$?6qnfXQHRT@Wc2Jd4( zh&9)PwGA)q^Ira1CaQRS+e<8=1fv9}F*PV@dwaW@LkP3qp1)7i3b#w_WPO0>xgvpt zI7^P9fuT8B&TMm!xm)NzC*XPe0zz~9>7g25&FHO$rJkC1)W###gmIf<^Cf~+-zQkw zL%;6*;t{11yyhA}XAkU8g9NiaegG<{yX?~3!5oA(F#xsHZOb)Nc4>M^9EhQ}zl$?=qq zqQ|X^qNIC}?IYM~zB9HJEAI)`J8;Di9P(y|wAzn-j1m9c%4(SMDjUO!b4sO673WFN zbal<*LGpLAx}U^B;k4<;J*q$1gBhK^%{e{mTjp-bXdmj^nv%_@(8fZighrVjZ6^;! zNpRQV`R6(tBA5lZ{9kEKZvPX1Z%ATLJHFCDv&HwzRl@N@6*)S`u%xo@Fw1hcYKgBDihwq9#7rltmX4k|4g z9hQH!rt`M|i>sR~`8Q?isIz6ip5oP2-!dnhg(U;8%gpkQQxw4sh-}zSTRMEh#7F8~O>R7QdGa_c23&)zWv-am_2_H&;1~<~; zcZ6E~oS^Rhc~WEWp_1i*Uk#;AkxE5UP8@XkcZP4A|33JL3#Ssuu2l1Xx!ey6l4OCe zSlYV8k7yEO&*wSyzfe`n@;b>gKWJ#^QRhK~!hUQ1n!iE(D+gRg!-xP5jOLBoVkdn` zK;m#W4bXzVvjl824CaS!l8U-3Usl9}ojxsHt!ujR|G1q;Ehz2{(Xd4-*>U$vn;u{nJF)-^o@UL z`B7m+^irB}P>#xkXi)bq)LfD#CTaMJ{0HhfZw}3dyL2_rs~;a`>1gkltXro$bKRIh z{abQg!)Mpj3CaPv-!LEX6UyCJEp&yHqHA zp5vA6Lbr>NWt(X#b7Yh!=K9>j_e2ZqHZUAp+gz$O>7Ljim<38L?orS5zVO!{GjZM{ z)tH#_lql`(wfG0?ZeT-~=s{$Hbqlru!)WMMDq~XND&nrmIK0c~Tao(u8FwEdkl&>O zOJ|iyL_9uOowE>Oeu5m!Q1;qztJX2;9yXC`8R%#=*F84DLXS&Ejhju#7Hm}CG`iKg+1^3`3kdW{P*%uizN^A~#s z{X0tiJ=ovWg1(S&r+q=Zj}+S`A>p^tF;FmMX1-!qNrUOQJVxvKh6GAK)g`2veyz*X zl+7%CM{ZmqwvL(~bwJN8vesKpP&c^k> zWO2NEy*-4JJp39OHDWxbI+nhS3D6RWrsM%Vq{nj)06FWsSq6SPc*?!?yTMY+X5S0D{ z+4tP>+#>!yQU`M);k||7n;dug-=0K%IxJYeoA*tL`Shy3a?_dmyvRGO(s{M4-1or3 znL1{n20{LBy_Q4nhfqc8H%I4k>{|@lP-_MjEA@rt}%7#U9r{S9G;d&+Cagj zh`nl-N80hCm;;3&c-oUEh(w6dK!ibbBJGf$7RuOWKf`cN^Y+gwegI`C<;3q@12zHh z_4S_&op%4u=HJf->Mk}v3p_u2gt$Jp2Rcj!e#bPz- z0c#z$eKACraK3Skff3(}W0lyr=l}M~%IwoiN^z;wUPy2`1Ai{FphS#f z>P0FO8Tt_<^%LY=Y*>xHD2hwvq{I8?zDFSXD@r1P88Io_NWz~&d0Bbi(zScc=bFzh z>Y&Y8CASM##U*ab-Tw~H*L|JJ5cYNXt1a1E_HQ&7%YO=oU=2Pf{ODNf6a~z(o}utF z+lEJrc(0uNX#ceH6&B(dw^*b1mo%MYH212_kNUDtw1q(3a?YZB2lUbr2EWP3lVpg0 zyCzhn2{H*SH%f9SFGRnd{K7%GpYUYDXl!h*p9*EwP$kkkk_Js{$_dd!*3QVMliUfD^Ejr|F6kMkO%I8{@Sub&}q@w2*MDX;$f8rTa0%J;fu)vZ|r_@(~PR$2&+b5orG4{<%yurj}zvoYG&T0?3 z>MFhcvGEKYnCbD3C4{F7^qQdBu{bnLMQQtQPwdm|Je0G>E9~WHD?TKBqh3(s_F*Ye zF8v~~+TqokF0NDCYZLR^$c=&6B$ZrgeU@1?>wvr7dYmjO%QcT5jq3PxjC><%%+acp zY7RorlvHc`r}=@q>;hIWR_ifz7*O+pPJEiE3=zO#Ed4TDz4{a^>GNoa?!b`L=1Obz znlz~da#uYq2)#wy~ww^8I|HpXT94X8e}>3N>q+4*xZWqd*KdX;f?ezGC?~bhEFO zt^4R-a@cm&7BI<>ZuJ)M-FZKXxc~!=^o~1iz|H({0h1+Z0GiTeXmKEH%?bLzTRSLf zSTkp86cW2gRjb1g&z~;O?`IuK8NbS&YDF~d{UnEK(?|KD<41%%)gCh%1be8&k1??$ zb<#Vjt^`#Ph$1A-8nC^g_fHWT`*B~+;>kHqHt)G8bpE|=er1*OS`r>2BEfGowi8&4 zfmvnxRkW%>o#kQz_WrD(l6CofW=-<>MdhPQSf88}S2Y5W9d=oF3XN2NgC!=7pDS$*Quia2MuuUtC6_%o8d37#D1x4ej?inGi_jE)B5 z_og-}S{J zZvY4}GU(~urNa>YN`^i%G=6uB`p!TT#f73k6qyv4R9p6wZ3!U^jhq|NQ=XeUhWVU2 z$^0s59H4p2Um6oa{HPVy2bh(W(zo#S%>ei_plyHhMgpEZK&Og0e0-&9pWhyWQJzR_+ac+VNrm<nOen z*Eq91{QiQTJ=F-zQlaC8v#Mc~=XS24Vx_XmeQ-(pCZh6lrG@HzCA$cM;=)2SWUjex zvBj`m`b-9FLKGwV0{m70Vw%u?r{}tO;ZxUSu;v$db$rtvllj&+v$^UE^`@@GTH`w^ zRy*ZY{VW{ons?tz9L6TQtp)zIB9ESEfro|RfGmhB3J@Lm4@4SDAYc5OS|jV*@AjZ4 zOk~Kw>hD$Q+Pd5_6ZluR3#PTzl|D*AOzR$2rbjlt9K&Gl<0PTNclXCchN&!-c@;3{amy+POSr3+-|ks zo1b!K8&$>gc4j`QdStd0Q#tQ$w9DiRIhEVj_{mar3qI-oEA18zmit!}DjEtiNY`-IYhfgb47H(XGoT}%3gkfG zVSW^mm;8!9O9^V_*) zlRRO8#R67q>EZ2V9`JV+cKd<}jiiff*^f_r0PsN^)@S_mX6GOCK#pZ{C_xhU+j*Z0 z!ec+UCAyS=bnjeKhl{kt^c(&d3mxcftfA_65ak4CLw*cUa@%2&Z$@VV$@$J(` zAQ~zx9E=hD1G)+sI!2DHz^yI$ekOtv zutw&Z#w8%2I6sKE_bNfq5}t=U;U0;Lp`ae2+qLyE@b|GctQn${$W04CDdGgzS(U9h z6ckI`0HRH?!}p}KKaK9@;9_}Q@xjIDN(o>cFO*;G6KH?Q2BfWoBU`2wx*eY+ zxKZx;9! zvMHBV(ieS_m-mWtl2LE+mJ4IH&tNz*w#5eiw`NOeJXwwn5sB=)$c=Ev#rn7EJ}t~RFkV175agfDLD8kK#ixEW2xkb%CbP9JE>9u zQJMo+I9!DPeHHY%lB_)L`)X3Dm;xu;!l$}yKX?5#@5n_kOxVTc^IuJ-O*-Md`g$lO z_?niZp(ds<80J$ScfW_?p;{l7n)U#Gr2l^)VsThKMXXOs+!nzzQ$Wz}NPo!7m7+Nr z+Tf2rQ<8-W36JBU>Y{RsB)7_!<#9g0tf30cb2Y*@b2YnRf7GxS6wGHj=@L*$N2In1fmjd>4-W+?dxdvYe|X??8%a7VBX?>}1yS65C? zR^gA}%qEhPI2>-L6(}l-S}o@i5cXf|LQXWCdBw`fr(V|D=LW5*RZE-0Kb$_V&Z!m< zWYR9!u-o6Kd%BcvR#%7kZ-neT8iw_mhq)E5Htv{RTCOCL_Gu7eo96>l@mL}t zV^#2KU9kAW2BQ%IjG@d;ZZ%y(p0203+gK?pSXt&G4^(fu=4Q7_v*111XN!eTv?;)8 zbGkl1jM^paD_5cWS|W=Q%uJ=2v}^yR#*@Rm?)!(}aa%4_*Wj$wk2Ce@uP*kVeUSB9P>!1>8JM`39C%MNed8B<53Xj?@=)z6xhQho|;ZcJt^JM*uu3nNu^}br09+Yz+TLx?NodDhWk>DidXLaD4C;A z+KvNmdg#?+`mR506{)yTJU|nqkUcSmS6o2>`ybLvH8!dYvF9p&p*U=`rV~yQi0+^F z(dxU=^;@4-{rdbk#cF%++t8A0Y;w`u)ID07qhE?Wq!XR#nz`;SDQP0QY`*G0cVn=k z6QZQum9QIF_VYZpxN7sHJsP<>gO_3HtRp@BErmtZR#|Fnp9V#aJlcb(RN!IdQ5raM zK4II%mJRU!6qF~>9rGS6rhxX&ZX2J=9JhZ}qZn!0zxwY~KBRKvL^L}GT3=;45mI4k zZoX+IwVE|KtYjcC26yHS)qnq}iyO^itC;wM3R`?UQZKC_nUYg{+CzQo4OcXP(0EAf zghQTsLEDj}_^owW}V|)I!Wr%vzoysSx?-z~HY9WrEF3*nPnI38r!;*8FjSIN^ z8U`pHa1mxb3N14=B&{u7=m*_4y1e(2S|;Y~hw+eYw^7e;MtS-r$2WHsH(qOME@~!h zAuW3DxEzMvW44I8@q*t1%$pt^B;OD{&S?*!lnq8oA3c^6HMD34M&<-AcD^xKEz2(- zkzDBfk1x}-~*M(ob8qsK-`}3O-Vl+Yb4byRB((Bx_wUf12@paV~4(*?2 zlH49OSns+L_B+xb5$V!ifg_T+JQ^}?rszc0uXo>Dsf3KLHH<`LT=StMI;1PVURft( zt42w+x@udfjB$HY`N|aTPnOe_^>;~v+fvEFuEyG%`mWuhTt{e8Y~t%M5Hslq(JP2I z7oFE%T53aVHH;v@mwPv_?q-}G-v@&ho;XW_RqK&QpQU&)wi2HN9Co|d@Ck>QBty(p ziZ^SUWCCL;pQ>AAyp*rh-AaR(ESsMJ0!?2CFz0PGx%Y>CE<~4Mx@+8SDc+`!mmy!2 zqS*Z<6c%OjIx)<9r^|kc+g#cBqy^4qN>#AY?#xk8OodtI_kta5@J@u) zJ=eb1!CRA&izTJ}~i4;?e!)Q#@Maxd6SOPmra=^8Xftu{8yt|1u z!F6+Q1P_I=b5&!N-W@b@#inN8lWz6c%f1R-l*J8YK9Qvivk6h#g~fJr1YixoU$I=; z*CPwYpP#u2U#w2JOaI$S^f9Fg(HPM|Zhbir#-%4VHh20!q#|T(w3s`3&MTDFGY9*d z8=_;5=PZ)A>jHjh8iv?9v+IaG(g|Tb-w)F7G6gcpY$-fc+}wWQgeOkgJVOECOC=>1 z2-3>uyKzRwRs*~Mq&e201#YJ)SZQSQO?OZ8vW)2KZl)MRg}ZXFC$+P|r_!dDhQM}~ zSyLwiMMk!G=bKv`sV(lo)>f-MO$-T(xja2`wqs636^?S}$N%vcTZar|@`^C)pwY+wZDH63ct9>BMr zFvuzr`TbfLUsUmuEw@N|Bu`C+XbxOVs(y%T`}t!4Y{li~$G@(g?V2s5R^iIbcF(YT z;trA@k&~RX2Zu> z75*uv;q_^Y0qkVtrU>{x_+fn#|ACy{Kj&l*{tN4UC3vU3S8H)-t~TgziRGKfhwb!= ztF5a*+^yOC-GJ!B>(cKdHRe2(0St z1(YwId`<40epbE^bE;}gOc7SG5YTDxDi8GLWaSky>`oqQ>=uLY&^o{6k3J}l{z%R$ z+fZ`$efMbTf!oP1G;N?FW`U3I{HcN`=klnjZK%C^z!^?5!7^7aKoQxzi3fsIiwxxoa~HyRhUil3;l-i(AImn!hPDE)Pkam!qnUikIudCu424 z1cY)p&$qJM@GYc)W*mJzU#})@Fz%i2Zf=P8O(zifN@v*jOoVic3C@Ox;dILGCaU;s zDD4tLis8_MCbd&A(}U+Wg3T{ccS*R7$9*TlCkVF#SO`fG;wwTu*s?kCKgIC5pDU+D ze|U*uY9C0aZwDEDpOz(XUu49eRp>wOVfWh1$Ax2TzMQ}!$cb&S7GrV4(xEXVeRtA{ zuVNuD19CDh5)0MVf#f=|Ay~(o{hHG^C*b}YBR~Kza{m%?`A@7$Cq^93%_xd1!m5Kh zI39(O>(vhJ9YDq2PL?C*44FzB6_?p2GNqcKoUtH86Ys@jvsTR?BxB5sRAL~jv!Dtfq$uDn2N}00?>W>St%rHB;a773mN|cE--w zYxTvZo0gDw3X8nL++uFulO2aPzq0sy)($di=2NWlE(hZ?DnZ6*A@3nd2*aoMaX?Sz z4tHc|1dR5$Id;;y1FTx^=yv>*Sru9!Oz}E8@dv%1{gjny_6!87Swp41FdejjEYznJ z6>lc!E}-`*47OJyki2AKZGYlsMMIuJ1ZxJ3%0Td%m)=npB|`<4tU$_6=W81i@>6le zss^t_zjQZFb8ryrcXdmjztSdDdB{Iq5GR0F&t1wpGZfk_%!L1N8rF`Qq$|O%SjJNKq6PZEF%kQou7$w{-bgg4r z*oURjpEuvu&k&}bdb%?U;^?{r&ojr znU`u`WH*7q)15yVv)t?1xIMZSv{xV3#hD}D?7<`jc3)rqa4pAHKvO$!TeZ31i_Ww+h$B$S?CIBZXFgV~2I zDE{Sza&MXrx`wqpDIqT`ehMe{a4H1%OF0mEj*j<=DvO8|qJ9P=3Evka}DPc z@~iKRPFbI#aiC9V=&rAF&ME)w8%E?T!**HLQK4Do@^I6^dstcJLSguRCWNiH%2||T zQ&XxAJzH?YOln>z_k98?m*3S0shEsTx^{%eXM#h9eax}3byGht5W8dwQ6|?2_e8zN z04VZ=f~D@~2o?G^s#xEU25AhE3T&tosZ+C<<2>Wj2DgWHbV&-H9Fcnx!yA&g zRLVK}$JB*sypO9IgR5)X&%6x%uFXtL21tMP{%G=7A-XoUg%Wp+f2I7gN-9`6*zw&@ zklX_j{XFMniS&$nB9D@vZ|cHQx`QDjY4DjgM^qb|;E=H@31O7aY)_$gi>G; z9pTAwOR=H#gNjt~TEA~eV5EGHDvUx2=csReVQXbRF21^QC|Ax^!B60|6R_GBVdb5p zTya5D=2xjf zyp@bEb_6e)C_!SbarDsK*pUIYHi*O)JJGVy4t8-EVoB3;w?Df1ubwdkv@M?>H=JN9fBZNV*j5tcVW zcaM9rG1pJrOP%sN2-87>P~1D0k^ot~#n+vDJ~?&yPM%e!X6EY?POnNay8hfmkVq!x z1~IdwW9Y+X*yD}x$9sIU(5mXSdShQqs)*}C96%&wdn`(HHO{nEgWozNxfrR|MfTgX z?4=iIV;CZS+8lBr4_^et8+s%i2y?p4XYF3N2sN7`CO6@27rIkbinLXE`pQGB?3C9* zm8QP!&2wk-jkDynXRjHX8pfg)cV1h}RWdSMC@YT)7p@!_cY{EN=G3GS>n)HojIfF2s@b@Z#m2Z0y;_hQu@Z*Ckol;7v7J2!E|^2NYb6SLCe@`_Kgz8tgOnAEAW0M}vtfAfP z{HqMxE}|z2rr(=cEg$NpzGQ0#QVB#YNRT10=qL8#J4uB(A<2Ix>N@ur&7k83 zQB&fdeCOoWn)2!U|b&_iY<>v+>w}WAI%S(Q*W02JU6QsEg<{R zan6r<05XCKLSw;T>pbIoanP#zb5KE4Y$Aua{Xl14x$N)UX-Lz;No}Du*L*(5T(o|U zxAv0C)pgLs^cLw>P@+Ty)Q&}vi;@y0{4$zrz0!iRo)VCjAGpx#&7U1MnNp=r*`fss zVyD$vrx|#XIojJhSq~6RG$$T(c1^10dl`wSeL9FgD!h1!UvO_Nh{fW|)-*koDT$vL z1FG95*FYMg`%h~~2yhr4ZXlM+)rhGxPiK=%L$pU<;Z%z4whV9guQ^4zzjCK{yW z>{OiZs=F5R*V+%%JNW#jczN4yvCe=!0|pR}85#ZD_n;33q?F-K|t0d4ZJQ?=Y zcb8bbO9Ef1K2VDk))pdU@p#hQH^4g^mZ~jQ?>ax+oBShf1ALZiWw(oGs0Zl#!&b7~ zSs-%o**n6KI`q#KNeoRgQv4XB8wY6z1)+xOi+8xB5}X z!7pe+B12oBL$_kj_5j&}pec6_g zJfk+I^lqZ*zdnb_#`(0w@*0k*ycqG_mE17c1z}~8eZVbD5DF1_REwY2te@lkmS%CH zmsh&D-_P^CC>=a*lg`RT9>rpWf6zjV*skgSt!S1}L+z!TVP{?B9uQ7#-j zT^n%K+D~?YRFqIzeZ4d*TH0)K-t72@dm{zBpYNf->HZ-aBL&`0St%TpB?uPZxu6Tk zSsvPC2l$B9JI`5rG>^5`OG7@6Q(ezxW8U~p22T534NSw=m~9GpQ;ljj{lMpZ3tbIE zYVn~3DD41v0OxLDT+UYX6XR~c)5oH|9ZS&fXS^|>Y2Qd-GG*vx2A$siEQwJii?IpcI#;_%C^s7?b%DqYQ+R#z@l8_w}8E9H;F zZy-qSqXs&Fyf9V1?%H zmL(w|$=K^8=Vedn48~1T-EWF(qZ2>stgL=Drx1)m!M;EYL}QItpTE11sJ3dARlxJV z(B=OnC`18vL<4s)yYPl3O=A-r!j!P2w<&4y_TU zudpgx;bI=NGT3PtQr;cUObX>WuS8Gf~Ja`FdL8+7HLL#zJzI>2IP1dNQTyrQ{u z8xo=~!WwFFJ5-kp)_j*nF3x*^4p$qv6P235>{>s5cGEmhy&~`Ez)N!xDL}b|)_U3| z2e_E>It;^20+h|}6SAQht8Vg-aSY3Qh6ujLkIzemEw}O8mzoI4%krTu;-tJ<&gj*rp5M#h98FSH( zQfG_LN?tr_=5wT+)~02qAB02x*3i-F#ZIoru+a^+*Z@YqvHgpNYL-)zB}jA9d6SF2 z%W3!2jpI^xP<%B8wa-U+#AN#6qXgShcE_pRk&m4zwyTXh*AV)pGT5rXPld|=HH(Zg zrXb=cSjGtJMPDZM$RdKVy`eqwkd$ftt(vti<+WL7q6ClgnGun;;xbpA@;0VL{0fUs z9gZ%9(|#>{t$&-==5TsAq{x&KwELB%qjyt{OrC%e9K@Db4za7>Mx@;C2H0@;;%<%kJ_(?hM`? zh1{$Z)y`v*_YPtBUzfh`cV7K#YIDpzi*-Cqh1%_L8qEnbiIq8~l`UTZ^Uble9=555 zAB?fyr+FMRR*INj{+wd24iGe*0k_0F#c%Z(E#cv55!bGL+!F-y47L!T+Ilnb@ZrTI z)%vF5jud@I_?G$WtPD3vOV^4cau1{@#6}0dnrr-x$DKinPfPb0qBcjGe(!d;2O`@n zI(+e2wkZsO0b9LG*)1Q!UE_T>*xvoMO#b`vB=nPdY)Z*5$5m+v(W=ub+t<=#kxzC> zSw*;b1{L84w(0Ji`k8V|r>>1)mEa~_L2OTI=K9ogNWa|uFlu#{IEGg~Uc-z4KC=)c zjfdHj@xAjGoIW&1Jc8{v(Cwp~I=qCT)b=-#Uv;X6MRl)^98WtkA~ivf80KI72Y0S? z81D!&nbK!FTK*Vj10Fbye(v^x&6fcXeN89xeisd+imO#_=&XU?th>v_+^t1Oh11Jy zFxbN+NZJ6)nAiPnm24hs(sze8dcl}XQg;>^z1ap##n;~z|GECl4cqRNMe4h+C=K`( z;Le8f11b-yPWoS5*|8=x#fsL3(0V+Y+sks;MZ< z42=RTsG2D$JCm=3tD0#)8g~RKn_KSm2ruTt%9b0JZRYw9|5oVewJ}>je6*^ayv_<) z>JG@u#!u&UZ{GoQY+unQviU)3yN$RwDXd5F09oyPrtnh<%>hly6ZjH>gv&j0W-wHA z;m__EQ(&nZ;x&UINKi1n{1SeX^{?(fkPG3O|6ppszzx9d*h@(;gbGSM@Ws^S3(a5$ zcp4ihP}9dW{jTX0_|Ef<(ym}conrczY3_=gWbn$if=v@Km4O*23#PToIE+1>K(B>g zjWC-siE&lMXj}pg)w3g=7@f!>gcPV{T&0Fu1(F~A+~Ilks>E3%bn*AzWOfIiZ}rK| zC*!VF1H`=4xlV#!h3>%by1h`_tlIH=cLxWDj_#y4Z!{wniOkl2y%Sthl9JHR<0Jpk z#CWUF$xO_MVFqlDz`98_QcaBu!U+1oc8A1H&Z?7clFQ_nilK_*hl8Yz#nR2Ml}_hw zHNJGRdM#;uK96h0vod2+q}A`poXeEnL4WV?l1NmbdC&)Bz|p9%4#cTmlZU=N;)Xl# za_X1x#xjidmGG!F(u$n5?Bd2q>VI(q5v|2?uT^Kw!IVz^7E@{a9cr4E6qCDv!TRuJ zy+9w&EKb9RAyJNnMu>@1t*>XM>1}2~_us$W?ex_JsKA9A)w5k&i06|_PY4^fBn(z) znR|+I@!b0l6xU6DDO1au)vX`8SZ8YNL|r-$nywZ8dv>eqH8(n!zIa7}$O778f`28l z+usY`ARSUOz)z0E@EN9tUHfA7y%aUc&06J{?*-ZZ*U0Oi9}>)e1(~Y4fN-` zX#XT8Nwh*JV&}7pIC1)r9Nr+^*-4FdRy?|0VZ>mbmtZq{X0Avb>JJ^GH&(59p=OZ0 zbA~@>ATgHvFK%SLT6NX4c|{y>$MN+_Non7%HaECIqLRMrZmEe^sgyJZr`O}3BFZrr zno~09YEzTj?XSn>8vvG!goUne{jiJ(Rzt#XoPYqJF7DoL=1ZYxkwpdoWCsvBi|%^q zq_QMmDU;-qn_GdksWKxIr5lX2#Yy`^j;x%wK#SP|P)yKnW`IwN`E7xQ>_G?vE#gB@ z-194!mx~~f8J${-RzT~Q_(#T_2yu%%U$+w2i((efgh23_`4?!f zoByZR6dA2HEVlVmkwy@!=J4&h?N8eoh^T@f4-FKtUXZ7y>bE`H(#bZPOXok$&6=j{ zVE0pSr@nSst{J?e$&xqkJ9OgvrzQlrj%_PVQ64Q>pl@1yjGe)EOw7!NW&R6+*a(O? zVyt&e{HRR2v9Od2L5l>PVeU#3%z1pGwP~Y?A1jN!Z%><+yE%0Q*v=XGT*N?Gd^aQdtb$yI|Y%#5??z2La8prGgW_eFD!&4}ZaJ`mf2D9vsd~84VqV9SzQ>Zkwj8TjtJOmpxs} zS-gG+PW~4M4h#N#>BVBdG&YL-_HDN>rIYjQQPiD6Wlk>#tDIX$y+^ zOaonOL;h@7nuFIYTI8}8tZOIpH`iF|V9TaJT#U~!iHa9C=wl|`NVpy-JQ9ZiRepqu zYTZ-ok4@f{Jo+BxFfff?f-(vY%LM7aCRFkic{lBQ@%J7<#V@XD|43yJGsFxl0iC=b z9U%)^ikS}=7RbZ^+&pit-=ucgzWleIYiY6BcE0)c7TlfitbW_E9*F?F$RushoGZsu z^>%()%aMkw+36RusEoqalYD`+J@hk`uOH0|8*iiZ-&-i#5!T&>D1RYR!EZ~rcTVTv zAtNkw-^m)&X&_Gh;5d>hva_5z^plph0;8p9SWsE`F$*@V3uI-|V7^f5wM3=mY2b2r zCZQ*=*GeuKHICEkExIWV}Tos$Ae1Z|Qs773Q$P z*bgL!B-9-wqw+i6)N@BX0*?U0LYMxm{`(t=B3Y_VK?}6Q;F7zrp-B*=#N|i9OU21A z7{5OMda+;X5HZ4Sx}Kr#JZGRfV|co{S(GPomm8h6-?QejIo74GigUaM)0j}Fzs~lk z!tR5_Ce#0QY1X?}`LgKMD@Y1)dmPMSp#4(3KF6TX3V;3f8#_iS9$s>hXR7>B@*qz+ zUMr<8nW;QOst6Ku7SI=79UY+GYzu=N%vXjF`eS%A+NC(n$5oD)4_5`IG4X>}&1JWr z4UbPkf#o?z_3;#q>=TB$&#^lc&Yzow<#m9H;m-M)UO-lo7RVT4P56NiKV*nU{7_jN zczGXg$xF|~zhbb_$uCCZrFtNv9d47Rtg!AOMw_ldNuTZfa+Qpzx1PbyZ(9WY2Q3C` zLzzxh1p%U$Z~7NTblf5SbyD%s823P8=n|)@R3}{9Q{@z_+X1Mxmu~DADb9V;4GU@! zhn*WuEs3Tb9gPoiKtVU6$hZ-`iz5(yc_})?qdd!9V;dl;w)r-VMl6)L1pxA7MgG2C zdD5GYDsd|?8O0;13$8uD)Ki5{<7(OMAd`;yN@}c*29tpxbnA<5r$*(zXNx435v14N&$8uiKVNQ)(%S4ai2Z5sf@qlQC45ZStlOcI}U~6 zG+nlEj$&kegOfn9sff^s6rFQ>_}Pav>{o-Fr-WocHhm+}S%4!t-<${bsqj-5Q5cRYLf z^-PL_r`Lff3=e7L)88xGHWmA+oRcaRZ_+X4dB?aYnDc!03q(;0R7Tx-vYjQ)Hw-)Q* z)J7L$RPLFyAc_MtlzJ#v-;aT$eG>U;r*{>U%!drb5UZEHAe6LU+fTowILje;SMsuF zM|FUFaW7&y63YY&i*iP$7_BTcD&psJ=8*#pcjaqSp^XfKuIE$X4dY_v=J6cW2ayNv ziojBLZtl~LA0?^SI$E!a^hif(Z~B0%B~;G781KDWI_xL8xV;A1{>zPFGzXM+2yANN z&ULS+{MB=3XaEACb`>?kKq81KMvE4e@*xE#eIm}Z-!!{2W*Szg)QqS->s(t_2e(YG zx3rueo2qfwr8F-XTdQT;yp~rKwFbVh_SbOAbx*h$2vSMK+eeEk zHZ3-GFZTs+uSlHbRrEOngf!hFke$JSHe`;VI9+UnPWkz_ly`bp0O$%df*OLd@898MX?n8pXc=UxU^=#r?SO_yC5m?2ttD^24GMK7?;Eh8 zwK9r~)rO*n?5f-+&#e<+i_rw#-g`I?d}9z*#V=%#jj zp5Wjh4~vgu7XyWRDas(lbq+o`&K-bR$?a>J{SRGCW#B8v*08epvh3GYDl4pq=gT2N zDz#@tIB<|Zx>xyHx1a}TW0`?`+b5NAm_V6j?|VcVq`-TNHkMLSGx)WU!@<3L?|@w! z73FWx5f-37qkV-oHXQU9ODbYS2TMzAJIDc&W0oBxvZXi|+8*fARalvrmzCXdn9<$- z$?@rtv8GjDtPkyieiHA&hSsN-ogv+cjC|O;!@US(`$No?gpegg1BI4Y$JU|#IBhrp zaU#aNek7{}Eam=Q--Ui*F4tJM)mGgAsJEyae6xS&!A%rR{*BFre7^RzRgIsT=bbEW zC_u3~p%&iBJD;g$%sijiAs(M17vd?T(gpQ6rMys>85=M$LBBzxM^tWJ1h_W8@(QAm z7kwuLK_7J~Sz0teBX0%$E|Wv8-~Jy(XBpSj|F`kcAp#0WjgsMzk`kD-$|xD#T_Ozw zMoJ0@j2hujfgu9Ypmc|HOUH=O5*uBD{O{dQ&eQGe^*uYExUTnw{TqRzc!>)xSrjhv zbGS(UvNATiYRNHC?od!Z2}inB1zW4#%vs<6;_hF=1nA@iQ+O?PX8Z~_AXefP%ytkP zrvPQ7-}bX^rbZ=El5hq5O&i>ik=rSN$cA(OJ9v;ymyLCb!Zi}pksfzFBbxao;=l9G zB4mkau#@5kb_euOA|7T@-9uYS& zIWYrD$&HMnYP1o(L^QNHZCl+#g4_f~%!P**0HmE#L@BI5fV30AM>5!r88z9D8z>@+ zs3>Fx-~(0D#r2#1VYia^Q9*!v#GHD)L-gcIYO;uIk#q(&k@D;l)J9qyf$7N5=yvghf#4(6oZv}XYq|3Ya)WB{4;0B{HJp?a6XEq;>* z-3F791f^9wmst%78t1>~SjoBE{R%O)T>U&+uzWTt<>~sox^8lI=n#sv=LSmop#S5b z^*KB1>VGM~x~VopwPaXe$Y<UTnqUAtywawdV9hg+lD*&A3))x5Rr{qwi;ac zlZGImT&%|KOtI?Til0cey(WfeN?70i@{E>#O09#e4%f^iO}Qm5{ki&W@bQCZgMxj4 z4?mX5ON|AnWByQX62Ag^bnb;dy3!k7*X}+1@IL@e9sB+=`75F|VG z7r4CLell1g%XEf^vEZV@Xa{0g73>t;(BiUEe8+;rS2M%MV`Qw)0wp5FDF!4^8Yy4t z#n2R5{Ha@BG}6S9G3uHLPVhYP^+H6<^+&_&SC1*^2!VHDO==z3SwfyJ_}U2>;`r}} z;THAp!(-|0@Rs(M13kA89d@7ObO-Kk8Ou)nLq+UN)qK+4)BK5cg}d1o&qut6$=wkN(uW#XAjEDxW{B_Px>MwjRx7epM-)*{L+#aSI591Jv0v5zwb1%lTf^n*4)I|MWvAt&d#&`?<&i!t{<65AtqQ z{)Dl6x>cC#B&_B3RFElf1$3B2=;j=pxrfTD8XeW=7r(JniImq3k#>?CDQ@^#lfgAi zC}vupu2&IVjrXjO9ACyf9|wfIBya@6zFuYhLUT`5*5>%D&AKgoLwD;>RjvqjC2N+jwv9AJ(0Y$RY5Zy6$q8e@$BDulT zkO4N6$nedS)yMS|1F%VR1h(8bvx~ZP#p3NNdIJPGHu^1!Y-P~9S)G9hkV1}(;e|^D zl7&G#uxQ02&E&=WJ8JXw_ZoB9q|XIc;5FtCbuyAwTz9_}6q45IDE=6~Nrg$?XA@Lg zx$LzPrpGlWC{K9RAGI>LvZ3Rg{TNUDwgbP@34Sk1DBgJL%2FcY%=hm5oa6T5Wo>&* zz#Bd{*U&Lw?V6)N(ru|`20_kbxj5MN$?3Wm^iZH*sK)s>x3(B>=DQvwQ--O6;h^o0 z6eN9Lkxz-88j3&vt!2X(-@+-x0N!p1m_bZW?cx0SM`=N7FcTAm5tN+r-8B@)8Dy2N*F(z{W!6eD|Js>#4{XgTa#x;|#0pLsoajazd-` z)ZF~D*P85Oca>|vSjMDYq-MsSwsXH>|9nr&-~wlJ;n9(Gc2`pel!_A)`R%_9-T&(C z4FUXbNgrCoV88tEy%~RAQD~B%@mh-?wM}Yxn&A)^K=!)4Wx+V_!H*T|`18Ysw6&zD zGCq(`}eKtmaXvSKJ-M{`?%u*?J4lb{JLW?lr;H6z&91@yL;&h-mMgN(vBZ3 zu-|F>XFLuDjzI}N4J%V-_l+X@0O8Ar`!fqfdsZ39F(L7Y8zj7#*p^5n5M&8Y>D>4bVo~Fy_0&ZrX zQ+SXC1qgYti*--++Tu6#1c%gjg9|Rrigw(EmVZ`gRI-H*6`pITFP{vFj6PppnM;7J zn14P%o=f{}zi&B6t%Uk_gl}wB5 zJYJF)Z&=0ejL}TM|1fglfE5KtqPZ0IZ@C0VIK_eD6{l6J z-z6o1JI97czbtl@-~M+4toRtcwBSnc&ge^*%H7vGWLYe?E!Coqyu z3C~BIw*s8kUDf-0~ppn^(w|RLw|ag?uOAS@C8(LHNzT81ECj}TEFX-U#Zr%Hk&Mb zO(s2+d|g6+P{(okj2aH)}bE=9K$ui$oUU3}GIo z#RT}D(=hvjd^W0WrQ&e0{JWZ-Dq1Q|dEwE*<3PUjeqekYn}b@6xF)0fP-h93V05$y zO%|eGg1P(IfRdtb>M+TeDpyZ|O^QnBDdF%jC}L3^HH1KdmbFV9)katn7yX@hfWH2f z{)RR6mCvi%E8Eg5k16f6H*>YF%SMD##C93$*R=yo4iX!RU*u>1H_WF-?J-?GeD@7fYFly>j%T`qF|CaYs{` z=hgFsJF1<4NsQU8`M-*rYOm6MuQe{wcbQHYf?%%-GU!8dLy>brp3` zfTl$7cSLvdxeSC?{ym4V9}6K?M~LXEKWTd!EjE$+dPm5WM;-MMSzCeFx@pT-3hs`w zyz;dHt2BH3Gx-AEMwef*8h&L>3JW%TZ+mWx`C|II(D`Mv%l@a&mFDfn?x29=)op2zE1dF?Ww^N@7$PDAuckB!s{}9>Nr234em4xA!Cp944kIn6U!u2!eZYu58`}nfglYIEd@|J`-T7Ru#HkL-e zn;@ro?YT26d|n}FBAv{2!GSc=B>E}Kxvk#t=)oKw7nb|&{KkFj-$=I3x$v-T*V5z%WT^y)J*(At$#YNe;@^&Q$5gtX_OF9X%P;yEul^m~A_JKlSI^1C(+n3CVZZi%pt{ zBnS|Ty!jGo6JA;=*O#hbA!^qMLYZGWY#ul4klI2e5+kGGqI6bJ)i>eV9z_ZTC&La4SN>uuvsf>V`zDKXA~ED%lSH6skipQ?2Y?~DUuBmkEL*R59Lp<=mY-8P zO%>U*o<24O#!@|+U~zb~w`KJu|xQpn(Fbr&B5LJyXz2Y4Seoc9r$Pv_Nx zj6m`{vLc-9jfzO2pq2T&#qw?_>7$Fqk1CHOtX2OZWA@0+9>^3*j2{ zuiK9rZkY+FrPQOFE~|T2x<>>9hEeX?A;}d**CItkE7&&wilmc}tm$;+-#weTh)8yO z=6RMC$A@0*WA|-rZaj4wsu`OU6SQUvod~PD#HHO>TkKwP)voq;07D28LeG$Y65W3< zTI1FdpYc3)U6%g!<;@Gv*b4kcqR|82dO@#l_`pH@!`A+F#a|tdZXaEh9BX2elWvFU zJ}Oekg{^xM@6Dcc2Lj=%0mk}`lZTAzpw70Kg4tpJqNR>OZ{QC#>in-Bx~&72q(A-x z`_h5l*ga#vPO5&Qo6C~ws6=JNt{F09h#4O`d4ui{5s}>D)4xnf*s4#GUG|Zxa5_W; z3DYha$uh@ypbWmPS3Kpvxosu{%uG(!%{iO9I>Y;hR#r^do_unwOV4aqJDFFDXi$|* zjXj|*ro?fjOI4RSepYtp^J`}3sYA)P%#GQ0jHa4D_?F+OV;&NW$fO~@w#exgSPapS zc{`8nWzuA}s8qJP2iznB(WHejU%T=A~abw49s z4j5inO$vEt@8nbL+?>(d!{+~?mR+V!XVJmG8DF%0C}Fr*`C?soXz+#g{sT{C|>{OIJ3 zh@PO&b}v!Jus}#@na4bmS()3<&7<4ii>#4J%jQ22T#k-S;^Qoo$Z(Z%^C|T!kx7iD z`h8?tpX*KFaqKNy+YR_#7_D63dYSg3>qXQjgQM{%If6e;y~@{`xDfg21#_&3UoqKo z>x(zc!Zw$WQu(I6EzBcGYuqv+w1QV*6P0+!-)m2F!3!Q$JjUvrj`aPUvsle!zDN-k z4?rf*OWRMM1lNT`2rL$A-)u+NgW~HsX>lzpfr}u%%9h%(awvI#+lwB7(t^MZQf$RB zpHn@442Lmv7fR4%mx4~xQp!UN&&Fi!-%)GY*h6~Bm}wBjb&QYfmMdG=}<`4`#Q z@zoJ#GC553t+rjq>8&9}GV%PF2g@b3V&DJPrXampb2&B|ABpl{g>H5`hV!H( z7XHUiB#|19h@>Jf|B7x6hc|-g;Sg?y87Qr)4(0xcOu=01m#KG)yRZfE+*#9EYA>Dw~k%Ny{Zh^-0@^n8p`V1hT%*%|T4I zdaFO~CK=`bw|K4m@QGWdENMb3v2^uQfvyFAz-xRp1LvXGw@i@b*w;)}%MlK^vK#-{ zD|%y6l%h=sHbLEZ1Ipql-PX2g2Cy`CR_tNghf?SRZ;M&D^HWvx z1xvxQGUt3uWi*rJkeIrR^6221#$dZ;1ES%*C+0*%QxNkyUi0Hi6}fj4kW2u}aE6Wv zgi-^E{{su`DrNp;?O-556gg1-P;K~eYOeHK*ftSpfGn0;t(%N%hT@h9d`D?}!x2iD z75U%%EKz#YMmErvVJ=AH9N87_4 zuW>?S&%w~6Xb}}KpJz2X!RqEx+yCvmBUBy>%<6vt*>t;W_nJgBe($2XxxMXk^Aiir z=64$bGx1Qbaeh7}%FYA2E*_K9@t2}{Ps}6!D!o&qvij5f9@lJfkTQDV z?4VAgV9`rFM5VxUOMA6{dvj5oU+=A9G7* z)fF9sWovQ%zF*p#WldcRQJ7aFy(4c>HT6@B#nG^-^ssb|EW?F_7byl$q*5@kj|<`% zQ!lg1SiYUm95^;3-6@MVO35L#NtA>}#_)q@y`-}?%Hw|R?^6DxnE~fD_dR`EU3N`z zsxP4H1tS9*AhAK%%dn%DVOM;s2ZMwL_`#LujatC?Mf6lCh+yRJ=K6@HI4X*=IpRvB zi>jz7ms8H)GedtDSu@vC1~s2nln-3zJ;104VEXR;cq1V<%WC*SqP&pL$_!q6ND$$J z9h(UlkQR$p`Dd=wlm1A4sBnvAQ31ldvbqM3u5UQKyq~?tV=tWh3GpWrfBE|ZxgO(n z1d(zi%5%vu@h7tYw2*EFhi~*BhRbH zgbB6E4aZ$~yX?RGP?G-RWc4e8>x}bO{wRO(s$>0mN1P-puGO$&!TC#D;WqlOaNVpC zm9(-C)27}lKX#$tt>Q6NTSa=;=PV9%z|>)TTM5{QVIEsH9%o>te`t;2DU?C4ZYkS7__^;QqIuzRew+d7YY)?cOnq_JM5*7j*0=nrb9c$e z`K-%}^&n-K=KPFBa#8|l;Q6HX6*M{IO2Cs~8_uYtFj}AbqL3I~xk#Vvou%6aImCDa zFR%%E;DAL#SofEXWF0oKNef;5ll;#watO2$zbR`ebj2dh6X8{2ZHdy>3duRUH9FpJ z&j3Y$x`cdU?z51v4)FSLwG!6ra5`WK6DxfgDg1`s=kbR>)bD4mwMXCuB&pf_AmoZ6 z>zR(c#1tt(6(q`&#cIR&psV=8^NZME_ftSRmbeJj&2rtzn?g=yB9RGcC^|4yqtH3Yp)y_4Tn=Z?Cai#CAarEqS8-y2lOagRGVvYJ>*wIcK z;t~>Jt@LZ#?CR==^wlU6wKa`0?!*PPm53G|0$}pLB6L9F2Bu4BPWrK+EI%Ude((8k zsrj|~g&pHCo*AZxmIhMOo1^TeA@($AHRnfULge*<-jn#hPXX~mT+qnYldqWkD zs$yEju$hwt-TbmO^yhS)HQmC}-XmjwAM-y`<4@3saxvzqG^dP9UHUsdp^txUo;&|8 z$CMaJS8t=@w~gAX$`Eswe{%xfFdj2H>JCD4Wp&ggHz#36EoSC^g;n{MVaS9Q&6ZcB zFA9+t4C9RA3vs$Sqn? z`#Ob^tES_~RPl-r_L)%X3?4Hd+?3ub9uvX?K)0e-y+v1_-lX+d$xiyVu>Ygzy<={z z&S{nHc=N#Yn%PVw&%M|zjyrx&IzjIvg}FcG3bz&6r37$@h(OZPy}XA_{*RWH_TaSN z!#t_`?YzHL`azlt;aQwARwoF^T!wJMm4`B=62D}ius!GJBAJt;w?;v}EzW)}+hJ+k z?|X=lz>r1{gNIo*rbKa6n}6jIMj`#8&C)M4`oNQY$7vRK#9wO9ScJOcpZ)53{YC#`lPmHu6Zr` zi@Aj@L@^GIpVF$B_N&o;i~drNzm17Ba1to?iArA`)S>MxS7sg1lW4dg)!XqIP5JLVD$5UDL1%;xY(ds}bFw+XV-~SxJ)Ex#(TBHz=BT}Aa8JI4^`bY?q|?nJf70ld6qHtn-_@@JtkToN`R z6;WeL*}!^jngwh&u~hbPbB)VMl#!89Ejq5vuvT61d1!OW_3YfCNBo#zWdeS`D0_*Y zWP3NFZ)1Oqa+9{`yTmyW_55<`$%ad$&(PY>lp+qe(xMUs=*ZMSf)4jPBSovay@%8K zXcHy>;6+Bw2h-d+fzWC)Ox~Ky%?lyttJaDq2XP*kGrL1ot{4+@N5W$D=4`g-KBFfK zU1kVC6f5#OpAtagH87@;v%$N?y;Z_ingYdjgSj6nQNPIkK>{TCH<2(A5pNdfWal3$aB)$9-392 zxXlfj&Mw}>1=3voX&ZZ%{xVbXZg5IYEa^}196BFD1CVEmeIR)!EU9Vfi!rL3uyj7z zwfj05A3uX@JE&lCSJ=0HeK_~#6rgII1xSHXfwLWG^VA5^JxYqBB(*p@OdJTs5-BPc zZn6^@K&CER4GkEzP7N3z9t#{K5ljihL;3;e4@v7~+2mxfB_I$FWSIUJbQgYVvTSuZ zQ)yU=Q4JPmx;Sgzb1U-A$g0+u3u+Tu#w=nmbqj3$oMI?{n;jY5aOQUwTT%2MM0Zhi zfcO+{1Hhwe<$n1Xwa(6c6ikK%j8FTRj#4)4eCu|$JiUVwryQ3LXep2C>;;0XDQynASch%f$@y&ADqqsUXrQu;gnYg%|DNO<0=YUGK1@t`%J<+m{MX(?d zO%1(<7Q{i8=Gb59?*of6E~oKcMlqLgq&^}s&3*s+@co0+pQ(C}G72rIxK9j7pE#ta zru39LZ7vOUw)cV(yIzjTl`sU!ewLflXL$Y9ogGoFQNCN(MEyaqG&gI<=*eBjTAOEA z(00vQ7|XlA9nm4``OCuvt}Bm@nbLOu-bIx5vp6+$OjY(sKk|RdE9uENQP{_n&_|>* zBYpkDeCTx`ee@}>QluViJ2mOxkj4w&$qWI93(n^m#XO0A(daa;wfDUo z{&-DCn+fZeS4bTODpsS^cdNBlSK7|p6@H{ILRd*a$MX-VIyb}Vcqu9=xM!T@=Ii-0 zNt!u21LHB`Js-N1dgoCS=={`ava-aXBu36AdGcA7gL$rQ3^JSZ`b*sDj*)?EK||tz z&ha;TatrsRJW;WXVeHQ_H9okC?BR@LW}@Vo*;##?;nakMhx;IZeZAIR?t+$7UC_dE z+4In-#~Fn&>yD`B=6)->1OnKE zhnTB~I`#^yRkMk@G~WphfysN0Q3nZi-x1ENGpcxaSXY_ik6QXNtB}BdrFhMO?;tIw zwKMTR?RgSx39w-RMok8?4R>TZx~dc|itU-shed{DKsctC(kz-+9(b$cGY)484#P|x zf9oPk?SPJa%tK9{wN{m|S&KQdOGJCsm8W`c5L3LHpg=o40H%X=x-vmgDT-f07F~^I zsqlObNwa?vD_2hjKW!$0PTJp6TEtLrXVYe7QLkdA33FEKTZRku!n%ZwXE>Kd={$=5ode2FznJXE)mbT`My_)2?yLOEJUno+j_s)P#NETT*-4$`rS%3eN4A=O z2aPuAESZ~_1(=HIcheEu&wJBCqR95Lxlfmwv`(`_&VF21+uD znE37F=bpt4Wup+u%{cwgDntK@N`f6EK^<2qw3diJsC0i_UU9$Y+jHb&R0S=I%^Oy( z7~RD146E-vrvRwb&L-*YGBX&6-N=6EJ+QgnVM%Zh=2;)9SYt@;s1Cnch3L%s-Dkgu z{D0vi(N?zeq43=pn@HkQ*TRenMArM@;aZ|$d#@pU=jI0BghF2Q9surx762?m zCkw>$#k%&92YSl9JTcm@#)U5{)aZ!X^$_&(;*7`LAq8lq0l@*8!r_$soZ>w4O}E@8 zB&YvFFY*JQq)?Cd_fA0v6^PZ=nfl9u8GKqp?~G}gdv>7{pKp`imZe!p#h-ICf@dY!0n#)U0S)Tud;(Bxgqa6gI4SQVMvVkN| zwrP~eOg!!liei?X0S_Dc8l_cR`X*1!|Y3QAkI|L-qy)p&_l!(h@eembiw;h~q?^arx#pTU(h9 z{F_XU4>GvmmR*l50?q4-ZF-$2Jh+G0ILfvdSTl@NO%b@v=kuodLcpikO(}fcKSEfr zyCOCvta|5`VH~Ua%abr3shO=f4tj6h8^+wRW*LyIaTT>b%GJYWx0}4StZx#p$tw9j z0Np!(qlQF!!HuBESKG>r;bM1wJgL#W%_HSVA%n-62o_`C#M4f$rbS(2FA@k( z_l{hZWYK?<8D=i(Q0M31V;{E)zkjO={}RPm%+i}Uu1f}`DznY1&D*V-EnDP+>s>uO z68hzi0_0&n50=y)B3dVf=Nj2 zBPp5OB?h}TNUF4b=2FAy-gvJ9ZqAAxH4svaKB)%m@>RCI4|SqRt6zz;x>T2{n=>vd zde17uKJVZV5iQd<*|^`rH`oOxk=p?hR}GRBt&911Mq?pYa$Hk;U~X%Mr6M zq(CVtIFtzTt_av7`9UUc9`Lrik!1ikM?rDu&(vyFPpA=0o&D;E{VH>WF&(nm&yM&T z%LXeLI*jWsVZ*_zlYr>fCGiM$3Z4ZLwR`-(B3US~*-mNEtaOoiI@wf=jL=MzYnq>V zI(H_Nqr5SEFTdT6lmo!Fgc$n^Uk37!*jC;UBT_a~yeje17= zQ1M8i9SDwjlzGa}>06L0A_SY zvN&eEKKc*x1bmFE&wE!OU`}__Sq?K)Ct>ZXI=r{`>6Yz=(2Si;o%O}8Q}oa+x^6tF zq4BPpZ3*7E&#-nE5iI+P{+H6^)Oxut@<@&MW^`bXLbyvv zlmbpy^85n0+lM!5)i*MBZtTM~Y#-o4=d?K8()B|RYEj!k`@xoc&93hmv$0*ArVcL? zG;Js|zd(rYT%p>~qb^l`@42wEW!k!JGFB8opCpM$3j0Cs^RwM<3jGK|k9-2z0MXb0 z*cC03G6bKphw6|2kdd!elUD{j+F7E8sgnRVvT0kLP_!@5qTYjC8ujQCb76!PE{7o3 z%K1D0VZEH-qnXvhV=Sc*M*joISAL~aQXT{(5%tSM_T#vg<$L zt97w!m!`dDbsE%;ah|<&Uz`m(Z?1DM#-x>gqLF?G8TM*{t|+lukx!i9o)i)V@$;BQ zG1;iCh$<;(f7PP`H~}{N0n99j+xcNGw}vYx?xbb;Kh!=1@+CSrIgjHe_)bNpY+2Yi zt7gGGm~YB8q%!Ae%gM^_;^p!)|F>s2PuT@mxZGN`*r|Pr45`g|-z-?({C6c4`#Z2e zu)~Aw6N=&kFNlYC5*7A~!-uHsO^0(%g7-kaW?&Qe*MR-F->U5=I_OgVTH*FY!o&w& z){)cfH)Y;1^|yIa${Ak&>HX@0_Ggi{#W_v4a+y-pZR#m;P=*~fpjFBs`vjvZLjtf7 zd+EOUvx}Q1n~Vs~=pZ6~@4+;1gF{o(-Qq$28{i2{lG4H!HLiB{UHaV;ap)wKF0rjZG5#+jmQ4l;_WA+z1g_B8jpXhJV-HK(CLXN zb^}SwvWa58UrVcSMDoQR8XE(iPE8vN0un>jFyUUzTm3+Jhr`R}zvqxMFa?-J2AES6 zZ-FQLB8jbdJW(HuJ!ukQ;9#qh`O~a6Gxz>tbBn*RYvDnyraMbMOQC;xB_TdjL(s`n zOTn!6^)c{>d>gX$W1gF1X)CMr#0QB*Ip68@aq)Y7Eqkc#fiXyGb@)jEqVaNrhVSrB z$*Xlb_WkxjtL<#>5qU(G2Rhv51}8PzcsH=v^c*L4im~+TrbyHzF8QgON=?r0XYT&N z=Ng==JHOYJTly4FNZB^_cLp;DpMvKy2L-R4-L~RI%j4nYol>r&yT8GrsmLe8%?1vJHedG?fl3Z=)$NnIMGyRlnNL1EvdC!^@pn<{xxYhIjghf-VT){%e&U=FDxroDWQNCJj7zPeiHM<^kJz=T zft!97w1E8yZ4k|lkc(83Vm7^3r~@mj{s~-$5*jdurQ(YWCr}A=x*8s_o7nJok`kpT zSifvZr=ckx7$4OcNF`}XZRD1M4^aZ1Qa~UV17n&F4&7#2eK5UN&wGo*TKW^Nr7dlf z^+*lP&w}zOE!>4wLvu^bLg6=~wgq-5L8tHS23N2kZr=gjezlG9=^6x$jO5YIuevhn zsR5-Z+)l$`M2qAK?mZ}zDl|z6mXnfY(`J*ONEMje&v9>XHC$9liONt>Om|Ej^i$3O zy8-gug`Ie7b-^)e^*Jalc@A6~y2Jy24s>L!U^*3C-mnB-jX zwO`5_hUy{(X^uLAAu>CP!f!s47Ly*Zf{2@v0TLk#_N!p@XZicDDInv(U^=U-ohk@t zl*~Y=l>*6AZW?i^pl?#*iXVwkuz*XTg>MiHw_u9%^xK_10Ufedml!_MmN~@7L!rnx> z$!XqhoA|5Irdv*QDRKOL7EB_Xd@1u+N;fxfk*0WzNRL&WUzU@OvRrkz(IHZqqjSG> zJ3(D)5uZ~&ZDyt@=o-dX*`xq_JFTym5H#4LsRi+$vlPnOwcYCEl5@1AeDy13p9d|9BQ zf-~-i-A^tJ25+(&h)GgWTN>dX!oS+X0ivOyVm*3K45=ts?xB^rndbe8P9J3Z4PqPI zXsHT4{#xHH&)n8}Yr+P&3F*U+Q9&Ym^6rk!D~p)=|MXvCEm#}_+9z0(j9#*4N_1R$ z$Gv(Sl>woo4xe9(&#C%g%@`^ZIbaepDEb_nCVH1N+RZu6ZqYwMt zOBc+_n>||WTT`X7%1vD!p+vSDlT<+ey5R~b zw9LfmF_s8@ebKan^rH9hA`uRlUn-(YEIQcJzlf_Vuk&s(cCFd}*8XX67N7T@Ce2d5 zqi<8%miMP_#B{^0vGBP$SA9DX!Lm5%t5e?C5@K;AvlEOM17 zFxOG{^Eo>034J)_l=(U?YT)ndCofHZXufT!M zmGhUjCJ&*Yi1piy+c5kr)atliw))6*(QSlRslkk6IePI$gr`4abo`x60=uI~l`CnZ zZ{VAh;y6UgD;ejP0+H}6bshHaecU(x5rmjGu0_rDu?+GWg1;VdHFr$+O6WVr@W`oq z{L%gk&|Weypnh8NpVZ#3b^3$OEZ3Of;`^rpCD%f#_Z;R;pW1nQP~A!{Z8?=o&IL<5 zIb75oOzi89l+GFFeJI$$ufW8%65txUpgPae$;J8$1>g4OW3G?qqvpM6k=eRj#;dBH z7wOH(ALUHfIrMfck436VEn4bUio(kG{2BI`r6q=jC591`Zw?rTHXlbc6=76eM2KI- zi4+7nHf7xIIy&(%p`mU#KhpmO6kDkmfDzLHbDavZSElQ6x4g%iomOI3jvFjEY;TSTXsC5NT4O2J9@52|LAv?S z;5dcoI)>=)o9ZOu92q&r^gN1p8iFbw27keGR`rM=7r5QtI{3-Yr+x7FR!@AL!%VHe z(SqRF!qShgH1-Xzc9V)$Wp0B`ymi%42p*)=s%RXCeu(mf$x}yOZ#yNTj#vUIJXS6x zpbrKOB$(ypb|S7w4DcG)-Z4nqqK{h!pS)h+ZFX1|n+AA?uXEItR2!b&l;T{SRy~Z} zF*NR#rmrHz_ItU6J*?asBhBve_>6Te$1rUD?&#Hzg zI1VUz2~avXKS9d?S-De$JH;IhLth&qYi%9Ll8C>x|L!t*%00Jiee_0gfvYpD!4ua( zI2iUhV?#2U+VFK$ipPsDYvaN*v{9Yr~Z{26>8)l)aSAXEa!Y$M_ zlrF%esz1@`o%H$F$%`bJ<@15g-KcSwze3O7%@wiz@YhqX#0x(a_M16#H81o<7i9^+ z3w5V*1v3;8W-=`cVBeL?U3asNx6ThzC`pjSoy7gAonRt!Fh{j`0jG9D!N8@l!{x}!@`{T<_Y?m%Jibj=r%%*CtZ!XOXa}V< z&?!8ii-J=M(7w>8(G6#OKeG`Y$gXx~iy`$+ZbMTtOQk@Wfk*NXx4)NNhf$pc{3bij z91s9@BiZc;Dz+z)Ju4n7zGWsaX*p+YF5AWh8*uS>x@_HkIZ@~ds;y3JogEp=q&HP( z?O%3Z`c4V4oF^?F#73YoO@$@~DJv$ziACFB;EvZIHZ_BF2@W?&?fqSlO_Vm+2iXCg zlc2qGy^%-!VyVNl-bq0=PV&KbPF#t!Sr#R|MeRv*mJDWvoEXJdDv}rV`{vHf)$Pp- zZHBAgH`R(Ewu9V1hdEUV$6Ge6CatqiK&vyiS)CgXuxG)5-PF_ui3U!Vz(c)itU^)*DybYjdmhu!Y&C3Ov&<5HW{%In zl}_d9)nyYII&agP}0BsEeAtoRYK z+xJF!9!O5X!o49BIKJ}sy1{+ZVF%>}C1HEn3pZhMpixx}ph?mOVNuIT+TQA5Fjs_1 z@BT&IR(-|pB5v7rv#*M@;4+~OKlggktj@Kpjp^)^bK>io3H|>7VqF$xo44f)+^OMT zBf4y^VM;-Q^wAj^=^!USq#B?eW>O`ucI`9l_|XLpFN#!K>mQB=36j}0@p|!cgp(eT zYkgqX^$Oqy+It*C_m6ltZgMnrvBrcZ;j>~rP zX6-6+2R;Ht5_QRoQV~8tHi&c6!O4%C62hH&2{mUo{kQ`rMG`AP{sfHkzUz~Q$<1x4 zxA`|$#|K&BTo3S=$Huz4L9PuFHIpLvVMJE_?1Jo{d`u$_%d3V2mhjb_gqyeJ%S!(Qxh|=@ zdKORD{PXf_H8{%ntYa)EjhP@s~boT`zQi(kRq-H#&3+5JZ^yg~>X zOffBX?deKTZ2tFoD~8|dXcCt zmqBT+et+NdJ#w+J{zbssg3hBMx zt*b9(B8sm(;X)}9nR^*gNauxo6OT9r7|U$hJe0MMN-`H{0@#zc&k(-ampg*P@qULr z9Y%2@>|o<4!T1pLpp3i6HNyoSh7tU&4@W}xQl}+IQd3hz%fC92x5?EoX|u-`nmz4%{z+WV z^~=*i(3c6t=&~nM{+1g1?VwOdZ@2 zl9o8X7bs6TC{x4?W>*oE$|%QY=E}d2cP~oSy)@gKsWaYp55`S7{FRy?IU}V>isA-d z^ecS6?7V%7sU}qBT()NeXBYiXzCdvQ1MFSw z1rl{`pnZ@uHx4IWUdo-P05xzs)&B0dd=n7)&qW;TK&$;ffW;je-BAJ8@Xn~5O+2fa z9o7_V4(6XjaUUB|k{`bs+|K2~=ONr^CHa7^4VgaU zj6zqb3jeBwy_s6rtd;Se{&qsE--0Uw_dU66?k#4wew4-r6_i@L1O5rH;Z!Dx^tmEI z4tx|hr)VUI#*q(@C@PB7g)mO`aT&Z~_w6~80Lf~@RB~15KRRI4Zc=(iW}3~g>wXOTaF)3NUVKK)B$|6Nw|7K}eTXoFD59eIhN zX=P8IhC4w9@Y-LyZr{H^4C1~Zh;#KQ``{9D*Fk5y<917SIQ&AzIpSvtoevQff$#=o=|wS5p8D#Q1Fthas;1fhtR%1o=ihPgOj}X ze+NIn6md4~P$sqjLPPE#oCJ)T?w_X^^TofWhs)2eC1jVMyDtXq4!gd)s76c$-x2?~ zKc)~B!`|K`sb zNx**CW)rJ|NKVjSvo|7%b_i2Dw$Cand$Z0~mzKuZipu}v=qlryYXANK>F$(}?(VW^ zY3Y&{MmG{eB%~XZ6e;N%jPA~xhS4p(fx<|i^M79QW*<&nzxdXpp4-STv+o>x1$Iph z&1WkX5_y?%MGG*J_-E1{XdnDYyjG;wb3sz0gh?I3z3AVpAwta0>afFPiM(*lNyD{X zvTgl33@c9S*_9f87KV$do?85Q8iQ4OlsV+E!u@_cN{Jsv*zy^6U>o*{Q4+0}`Jo4c zN*&qZ>u)}3q3A0fS`c&uHf~kd&OAE$SYx(cVpkhf;#e`mpATCUo|>tjdhDU(dCB83 z5DEIS21H{J$;ka;Eu;598Hl zb9B$Mcn@jCcZ@A1G_)7Fj0GbpCrA0;R@%p)fE}ju{I1c+aENL6* z->vdj*^-pHQwqQ3c2S910krZmTe*pb$-*CuoCVe>ZPeCQJ)vbU(O8l={aGozo+YHH>dG-&2;w66lnx#RMw4Sq?+3O)RcHF7meCs>o-;!crS;|3$9MS z#D^ALf-&YH0z{%o^Pba}B}1Z{QWt*?0d_^o6NO#AJTb%_QaHjip8G;iv+{RSo0FvD z*y-XZxJ;#Jb_8wMY8=K|>+T_Z`BO};YN^4aTX{}!|o~ucjf3k~@2Z}6%*Doek zhqDRXAywB_ot{LAc!u0$qq;p^zk9Q{HBF|xUDXinkQ)9KGqbZB6{VU~%dEKxzXSc& z_ttY`cq<>&Kn!6kdfv(2!!#ot-^y&6(n8-SM5KI)ps(xTrhVr4>u6|;p>XE?4}vQ7 z$oqZ|F5}OAKsbS(XEMIPt3feZm2YpZnt=PCiQy!rhs#DdruvMVma$1v{RUQj79<6+Eeef2@pE&1pKHk~3=Q1T>zb}5WF^1Px`K{5< zEpjSsyWa&J!g8~q+N`)l}7KDZ3h*I09glR(hi4*4qA4}gmM%|tsuR97V7 zHaaAvwFJZRKM7pjl)PA;@E>86#AuDk@m$KVF!OJ;(%dqnxYMi=vzCs@W{8$5+$MB>Nshtm~`%c zR>`5PyH2eQD+PIgT(ODPL+gf3;9==Z`+-tRx_dh#SZ=?DRAoq;@ErDG%m$->L#&S? zL84}^?X61s2nIEuTyLT&_%Zr9IGFhTDgb*KJ~kN%N+dnl<+8FZwoE9U)#Rc=lOVFb zb4uM;mCT@U+PW8U?2Yls#a}NybZl{Ou*1s^*ycUYuWaGR5i-H2$6qjaM_-S4VVfuW z-I$ZTon=T#M!zN5#T!AxBhQd_$;Xw$VkQ$^l)5@l-VB7*fZlMt?s(Tvi_PXS=rLet z=V>LB`+P38UCgYFswS5usq zF6b5%js>e{FX8Y&rkQ`B2eR>}cXPuPegjqm-Bk6W#r8V?Kz&T57jI~oAC7fA!`qF+ zi^_I7qd>j`nk0$uMk>mq(9p16vC4fwr_+a~kJ#P5(!VzV-n9n4f_nd?m)UFy9dD44 z2OAWb#t$qd={RpbJe=aPc@;OS$1@FT%6f}UG7K}m;U;{67O=yovs zGGr?cemtTs`M}d1HxVQ3KjNw~z> zl@pOa%`D|18IsQ+B;{4uAW1@NOjMX&s8i&%=g=wF>-AqB2h?b0+$x;ksd~x6|F3j_ z=sPQtjf*D=`yiKUJy+j`*{MY%O@XM=_lORVi1cq_d7R$r(P}x4#xw6$ zMvwC|O{;4zg6@K+J7PNvBrU3ow6iXb$|{$2`hiOJM@n&z#QUL@Le%c_kWv2a@SCOQ zXc%nCGCs6FxY$xfJi|l_#;+bc6AzO2Qo=qVSNC_>!rnMyFiy_f9`LiHtc<|WtnH=K zN-JI0IfI&~ydZ_li*_~)=7M*3o_B{w!&WZ)VMMw4xJ>zKe;6)3f6GgG=z&0CFF{wi zxyc@8xdmF$-6bqrsUVkK54rffR;k~_7#LEtayKG1`*u(>*%HY36Z-LZY@;Rk{Y}EW z3#|Du%ku7PgaoojPlTr2rkFI0`2CtH!`(US=g(ea%iNKQ!faF+xHoE`4C&Dis?&J5 zlae2wkqHI#90HD}7_2SQJ);E5qAk+8wqnT-O?54+$P!2jXqN}FsNvhtXT&WZnk5`XsBZnXynfWXRj*xr>7j%< zV)(uH%uT0dNG`lb_V$kSGN-Bk8jZ&Alzu5f>m_9J6j(YYFK#KGqx1GwbLM*%Dbm#AsDZ_M%hVG(_Gui@0#kxMHeL< z5m0a6=cT2&AN=u*VSpK{Q+2NG=V{tKM^@JO>*sfjEe8c*8k9%5m?I;5yYf%1v^{sp z#UM0zHS9AiT#ZLrIMs~Cc1~*AIumxj8RCA^+1x5`CH`l<^V;-ePy7qbeDeT^>oo{7 zW+e)nt&wb)5QfbpJWA_Lg-7ii{+`3&eH4v;Hw#R{`0)TFB)vMxOlvTuip^6bhY?@M zoGj#-F%{$iq7Z2jepro07a#dhL|RW{)z%LRIVJc&MCjP2b_qSd23MT;UDR&+&L8VJ zjasTBV;3i7TZ+?k=X`45t7e^8DNV73WQBOqwC)|0jbSfUFrG!q)yt|Kq*AyJ+oHF8 zFlN{WR1kzI%y8U(4>jiJ)zL2W;dN3DdSxCT%JyZOlhR#BIQhf+{hgIwwG0^@$YBYD z3BFVVQQoFM6x~l?^ED})w^d%2OO6M%my~ACIX1OzzP!m2Y&)Yh9qpuU?{52JX%y;i zxCmT;m#qVa7nw(>ey*eAtEtnJ)k3jNKGB9~bBtDV*WOhaZmtAvi{48(k?@yz3Ard9 zHM|Mku#L5ZvV^K1XyN{7mwWj{UWi1w9*`{BdK3dX2s6~2U~5mnOPZ6FrNqt6iM?V@ zQ@^3zu)*KrPuKd}=5XC^{@EwT=4{gwFt6Eyxy>);tl)Zk3|9UWC_@@-|1cLlfIe(= zE$lH+n^2A2u9JK0JoNF|bZ(;n8|!V}$8%%c7o^H&D;^*CiX&gY5)* zTpWEKhAofvpYm>ge`z2T22E?TJkN^lE>hcAYM)&M%wLO7YpJT+HBW-T5P8alrj_F} zjCc&F9bsqhRwidR|B#T{ZYdf~xj$6=*S3a~Y)&$@b8f1{=fnbT+i-)ho@#91X<^8! zSSKuxur{myU6TS)QL67ShfWEten+VNZpCSl9ZShY7`$Z0l#*NcRSKP5f~{2t`E>qS z8gGjmWZUcUk{y5#eq0YuN*rO#3u)Ppme$44h@o`Zj^l4bKEgL z?uojNe@WF+T&f(X*Od5?iI{f67-SQD$SD%7)P5270Xa@}xV=RnRp2z;LrIxFUL;imJbt8@*>b$rtKIsq7MJ_qM^l=In@< z#%AZDVf457P`Mzp<3*NWH1mNE;1yW1r%*9Z}$9Os4qTdOD zOaBl=v-~1HRnHhGe8Z|!g*)6;XjZD=T#;)s` z_rujV22Klqzee(Fw-+%`-{NfiZRem&s&tnpRg1sn%n{t#JR>WS^lHcBkG+;S_ta&) zJtw}&5yb^n{+U(CT`{B@b{cbU|1@m{)9#ZMOekpVjwk*KrO(r}K~lx}Q#PmV5=Y2c2#F##cxBc#(JiK;8vFy6Tmv(P@H&+^aBr4r^lH&7aW*^ue zi)YltBxKBQ^vqAX_&c9f&HTO-NWeU({Y37i=2Y^o_C@%w&EwvCxzK4vd_}w3&rHOM z4z&?l=n93&vPtM=B<`X9$#`G=boUBIB9r)nFJ^TWzebCUxJLoS;zJ__w3% zsB$;@(P$>8$MG5(wa3z@O+fwa>%P)|&HDH&R0{R!_+#)Z#QoN0qId!Ex+e8^ft(%i zxU^Wv3*VID_wmb{$5bN2bv5={per<)!TQw&2ZuLJZUHi#jWzdV1~%LmPLK8dIHRa8#nuDAWn)2 z`DF74vkxZK$8@L7R)lh#zl^^KPx?04Vr{F< zma)w$$HC8S#&s?Y^)WkU>r|dzPGnKvZ4~Xa=Tr_YG&QA~xE-WTwGPgHuc@sO7~s00 zhQSJ)TRTD~*jrjMVg|n9xcq2~4Pb9d^lQ)87fxhu_+FIg{d`Q_q+z@TTM4s($v>}b zwXoM0ydOs`^Vd42Qf*$>D>Xu2*O^Ds<9AgqlNqeKzC5vKc0i7^L0>oBnrF1e&2E

    4MW`e|gWLhse!x>3bFrW*z~3;^ zjXB6E1>;wMrL6Rs0Es5W$aUi@w77ArD?l~ z(g+$A5WBT+epzVAW#{$${ZdlK4$oG-ao})jo{RX$nP0mBSHs!D8H=Ox^j)!c@}pkG zC-eR4qUqq*Mh7<;r@2e0|F%=#S7eO&5`|Ip~Ad48bcHBxaA+vY& z&XNKG7r9kVbSiAs^z~db&sfa7nPaSo8h#PPqtYn;#8lDrn|^yOlUSu=ORnTJ<^H#oLv=s?;-&|^x6@V!;A!i>`9An^*- zH3X&6-8gqf-8S9JM7p-xzZ21#%GEU|r$DkuuZ<+DI%kE>)^up|)F&$2KjA%XK8Fvp zSLwuoX9<@FG8ip;v-Dg?W%%I$mBCs(ia_fWZQF%!B-P0d0Vz1>!KKie>4EDflho zpnB_q=7?G~3+~of7*P4HWv+HQlOvV3THsXB0k)CS_2*lI7ZcO|^LyK;aZ8rR1VwOC zqGH2AyZfg~ME|f%ZYcTu#ZS`F+6RdR6W?xhR5)2raf-7gZRcEZ+E~(P;vY-1%&WpQ zrdK_;1?)~+>|A3sU)z=)c~>;FK5kYz8^K&N%Q&2rDL<;i#EOiF+41UNgSg84YV1Wu z%}KT1hbmzzxNWzC9fk)7YD4oY3_)yb#+4jiAp1bH-jQLfZWwT8NLXESxJM{9awaOe zXw&_kg$MitT^BD*ecm#dM`zzCKg^?ah3{uMu`+@;C8KyQEwS<3CXj z<2noMPP#@@O|cy4YA*l+_4{h-{w_2WKjNxi0TZ!Cr9gvnLX`C>P@{sjeka|r=cko^ z94`w1zirGn3b2u+79=3~HWtIE7Ce0A*s2;O=bx=Y8B>;}ThJQuc+R15rlFxfQ#l%} z>GxM{Q9t^wnap5swLCUe=gSO_QyI5Hx!UGv^;A`*nbXavbRg@hpG~4z!b60aQ!JGd z-gYu+J<)#=9CJ(VsE1&0{J{G+p)(D<-{qzgtVo_SG;q7i4z{g^9|(_2(F}8f!rsIe zTvK*{zhKqVw?v&;cZg^qWri<%kfjT0H7kJeX1-Y^V~vRl3K0zE2T)P8`&X>4I0|B@ zzXm@Ianw=$7SDb@Oc{9$4dFwRRkvJ`C_~Kyo{GK3;!S}L_*@gbT}u{RbO892FK-pS zu982I)S5E%Ycgi5f&FQo-h+XzC}`eG$s`JW5iE`oBul0e75rKq z(+SPNj`P4b#zf?K(pb?+ElNfYc(&2@AMv?huLRF<5%V;1brYh%JZvek2INXmK{CQ_ z!^Ue6a&7bbF~dv6Wn9WNGP9m(njGb@m2>#qPnZL*em)0}MxHXBT#ZDBeggbc3D~t0 zejIGD4MEA4Z56{K)AQLMBZ58M-8fTu?;o*u?Z`Jf)MsptUUVRuB8z7u5;UM!@o$6c z#wbQ0uE614P=GLFTDE$^qpd0HFNiX|iS43zu#rgJJYvG`;;RlfM^&wu6{j&_gBK-X zpH#jchSNCaK}XzNo8C8Hxnahq6vr!0c(NT;OV zGn5@#?h!h7ZvTNA9)REkyKYU#1M*DSTKs_3ZCK17L8^~*i{E+R+E}%PoBh9zZt9_S zV-=2{t-n*;>JRcYUsk?W4#~B`wW)j0v-8pB&}^mFiO1_8HCKM|Z-GRNh1qwL=EZEf zH`EbT+sa}U)`#rlSo>7z=c!(1>!$@O^Z!7mfE~>0wLMDr-sNeko21)OFy7Q23WT=S zeD}o4@Uo6@W_*UssA3P6-#H`lQ#0*1oNb~^JYb>hmDH)aHo|AG9zYgcmZDY=@ypdnZ-G zOU}E-P@t=!2D~47v_E$KS>Z2g zRxU@(-D^_OWa>NW|uDsiy za`u8hXQlP(G_6(6lD5sU>i}`BYP@-HfByR{XlbtN zg;HgWeWl?-wG6+6q8?;xwsHqvb~cUmd*2~$n{Uz$8SNE(L06kcLHcyM2hzX>evU=2 z=@IyPd*47@lpeo8?A;lk<_Zus0#7`q0aO-5i&jJ`)evhnnd7_asO;2#Ag9iZOVeR@ zZ;!sW;j;%01n90;_)Ay7kbsrC-h!k)o227!Q1=0XKu>4KNz7Bcci$0~#9er(Zz)%D z-Ou7m7@ZzIFsOKY0rqNY7jQxo*R$_}4;U1g^}`K%8?7|&u#}q(0%Bqo3z0?WWyr+ZoPH#3i zp5gDFVQ)i*1tS@GAG3TfsGVm%!a0-9o9>yYgC&x5=J8CI&A@jNpZsDfJ_=cA@_EwV zLfboK&_~$^2RoEXthS=xMB)B9lQ26{7xQ?@|BQgR_#hjem9+O&u~O$tgYHG)T%1daD+UcBoi1xL_ z0uakOP4)59bYzFxk0VP?gjKAVMm7GRDOCv={Oh9v2jaZeVG*|J3{92&CQv0%ZK`C; zwLCLoDr9_7d-d%9Pt;)<$SLc6z=PvsUWa_ZC<38ri)7tqgOR^G-z1iEB3<}nL8S3L z7e6O~$ku`=#C6{r}#Q7c9R$&z0%z_7t{~BU7a~YcLhD&ctAPL zb7j-0*4LP;DsG&)IF}o>O}*UJo#BU$&+xT6!FMN;xkDjIKoyr^`4d-w;yUbmJ4c2u zZ>{Jch@(>7paBv&LuMtox#BAJUhLlCHw0T6K z$PwBhEa?{!4S`;(qca`r-=2lPVHw-{;5u>}!wNd@PsAL>J9if>B6|-2fXaT`ms{u7 zH;LZum@TX_TN3w>T=XRj*%nKRymk{aw!e62YZ&PL<&TMa9R^(#yLSIT1J$mKlO=OX zAu!aP>pJH+*kZgI+O6Gg=Jx04P8a|}ytPsAn^PG)cWA$DeSP$kl++(eg1` zPa^#b(o)$bvTl+(8qodyS0a&WaC`aPXg`kmbHSg>CGj{W;#FhIV{O4}i=`NTpBTq& zTWFR+JDu;BiA#!D_7LTrMO>5R_;)`@+cA*m?EX{2dIu|dYEJ$i`KwFj+CtVdqvu{h z8UYUt=wt5bociQswa?}3*j;-iE6N@?_lhAl8cC7ej86=q8{NczJek536wOQ?6jA;B z5z?@^C!PR^=0~W7$%o3$%_$o$DXS=wkKi`pqmb3QR9w?beP@l_-b_BH=J57<*S<BdP6RCTpgtL_*;VK|CsVzof$-Q*NKY&nHdu=iOihz^g@Mz0g{ zvEpx5Oh>;P*>3Q?!Su_<)dTooYs{({K)=^KP1zKg?uTfJ=ZhU{Mks%N&!;}3{3c+{ zAp6mlt`6b$zHT~?0y1J`@s+Rgb_F;;Tmcii`!ADgD-09DzhXedZ{ax%Rji0D{gPa}Z){>J?oz0cMP+3+pUDHm1CBNa%p^KXKKh54X zU)ami!!n-!+v2in?L}(g3k_H!phpIgYU;Y?lUy+E9qsjoSs9Z~AH#QucOz;`WCN4coj!2Y9s|zmTyY~YvQ(Eq9_~FzI z9cWfeSR^ZtOwt`5;PffWhI8S0=c2z7x6*A5AiPJX=t(@`&0v9iqI~ySn?LNCU4uv1 zV}CgIHS8X!I2}v~?ScfWhT$IK#0@cI^cnf?bF&=)mA=43UFf&X%Gv)22vXM6Hk;X+ z7bjHInyr4||7G#U);@%xSw~HvD3CAZ^$poOM%T(_?*g5%67}?7V+K6Kd1l+X9TaK% zZBEB`4>7%4C5E|`^W|K9B03F5>3IuPRcDn=i#Icz6;GTWc&3ap^jY6NZ~olMD9(a+ zuH5hII)ILL$VPlL_e5x9pa__IybqgEPVLIYR({EDf=Ulu`%4GuP5}0R>?*&uY2AFVW@+{Qt1_R_~@K=;>mc{NKni*t^MN%;QTe%#kl_USg{&RAKi1t?$1YXTA#!KKRmEpp>g>f zj+fk0o4#WnEPP8vPOjO~*UXcxeteRt+qsaVyK#5i9Neru*Sr0gVE&e|+Ip9_$4G8)5`*4qXRI{ZN_+q?b!UK?L8u5%%?oY-lv;&(G1_M~qJudj;#R2EqH8LZ<`e z>sE&tP9C8{Fg!YjSM(~hYZh?B`*;tZyXCes47|4U`? zE8n1doM60{CHx$Zr9QfB$`%u~#GiwW2j_X{t9Vt%3FcJM%MG%muZT}zr&jj_55$jQ z!SuU=5#6Bb2NU}(CNk92;gFHvhQJcjfKj$zy{ENfk(^<6eDgIm*)kw$NN+Et7S$A` z0#CGmz554ReRGY8A_O`CER@r>dt^5>Dr09|rEh}*sfW7gUwk4!@-IdH#av{at?|h* z;pl*>X$)L{O8-wp?lrZqz%&DLEBMrtq%5u|MmI~QcA9OkplzS(kJggf(N$N;Ts7`e z)gf&Vk;ZF7FK5Geo9uOtzwTg;ImNL#o%{fytCi7aSx+(zhOx>C-8w(x4R`(*o5bIF zq#W1cnY^tbHo)1Is)#V6g=~G>AV-aFY1DomM}|-DV#fsw?@FDo4(XzFoTj%snRMq; z;jcW4EaQgei!!OyrnC5~QtEIfg_ZxhqXYmN3c27luu~298NL_pKAkIm(3x=y+ZLsK;Wj;}x69l6ndNPmT1M7OQD6}5@bC|Fs2 z!ZWIPnni^Er@)L#vuEnvL!coh6p4a0N`9xRb_uj2+34c$8js-uoovWHFCNVJq?*Ln8F%Q?6vs2}8 zwuDiKPggti^iR{wxgtW>3MF_BXz?*|9@8F7?s-?9CbA&-ZgNVyiq8VR225#xUA#Ll z0CR?mxA>A|(Y-;LX@Z;Q$Ezzg*n3I12}V8iSrKINDU+@k>TH=CI4S#AA9*Qc-M;UWj=)d&eC14_-c&ncIqzr+qbD| zKheI$*u>0u&9>T*(uju9{0!3%#OkypF8>_i+>dvx5Lhm)c@%0~X=Su`;cylNt}Vz_ znu_E}FQoIaSu-cgY-n>EJKyBATkUL?bu_$<1C=}-X%?z6r-eTc>tS7UJr!D@LHoQH zF7vtN5PJ>1!*7eI^LoLUGcmyM^@hI4wrw(1nk;FYsFy??@fAZsI@YnKu{nW*5;ns_ z@t$qQGX`X?T|DW31WUi`Gcx9DgM#4=n_W4kXX`b?6N94`5({wfoQmJ<(eLWTS-bd` zY*+E5$?_nYqm*H`lw2&%){42IL|Za!?n8kKzKVh@8nkf+jMQnsZm!6!w=#b5#4Vu} zzBRGEb-7^h!FXYy&*sq6aV=6}4|9amLl+Cs)qH!~LqVI-;8(1QA&Vv4B@rgFx9#Q6 z4BDm3;g)B`SJy7q)A=-7`6onNlRs~vPi;`iTUw%ssX)*Uh_$PUDJWt>sMW4ybc2CD z?&5S5k@*j#83j}}O9tdyCh9KsxQI>ne;^#~{y_49tjwi}#J&CsP5aW{Z%2M|Yn9Wf zdMq;?V|HG+o$tkD_pEQo4}VMgwy*rn>=k88loIIM_e^#SYu!3Q^zLMBlsNgdYd|pn zz4jB_v@0_SvNP$Z{aDaNr|pZwI9 zRz?oXNoL_5)bkhg13K8h6VsGZoQCF4L$MmCb57mzW|_7C7R<=Gc)0Ge^@X@CD3#WW84enGd?v-uH* z?Ci`*7dh=fC=~ACc1=~4)bJIq+1X<%PT^~HYpg3w9dKo;o}bx}jn=8%Z+VLrM=8Hh z!s&c@>tUcqgnf7K1lyoQWo+GRwC;SdL@*5$;PlLO_J|(Qm3?^#DWptYW0fr#?A*xv zHA)8rqcsK(3r^p@dRl;hd=*!Cuj?O+x*g=5dGj{0pSV#uN{HP_()eRbg0>Esf-mA9 z-)vj*zv-vG6MxX6c5u_q+`?AB)509;6F;^toh^$gEyL-QwrjOWb>dx-trh<{lWWpJ z`HrGE=Ne_Y_z8TvZ@2!}uk)|bnd|hkRwXs9S-dC~F9Y@P_u;((GzNP_-}l16@{toY zHt}wLZ&*4N;VPmbTLFORjlSh^i%&L`SSMmrzsn(AGL z($7XOwDi+r;|;Pq|1MseuHUz{uLNg!`@FDbUte#k%?vJ8`<^i+RG2MBDh-OJ|Ng#` ziwxUyGD!Mt(a5Mf_5hbM9;cx^QyTwm`=&^^-$QYsO+_MyRIl#i)Bo0Y2p7Qz^37gG zxyL;8qryF=v zi;IALjG;!gtR*yahCOgH0U5)$kAe*u`x{8A>xTR3H&vB5q-mB5Bs4vj{UdLmHK@d? zSLAk++8C`g?F0AJbSchncd|vvta@F(L8ml}WCXLGUOL1xWthbGh*kY);O-OB4Hvo4 z8}{4%r1f*k(<732;y;Tw%q#>hK(3)?@e5(N_DHcbAEa4u1@=T3`uP1PU~XTT1Roy! z2clZqt!_W@+mK1xPD=ViBS&QJymSqxLpk1S^fhdZJ9(Fy94(28&qN^^12e%v4iI+5 z>6+lNxyfo}e5dnnRJUZqp5hQnLHj_}kk~=>zbo7LBP&7#Mpsh`IU{=eg7V~n) z1uTEP#Kgl8qWvb?Zbu^e9|D70#|wVw`b?Hzfj_<=*SgvmsT(L1 zD#Oeabl5pDbXDs$xfi!DYM3djiK%oxo%$4L$WhFyr>R%`N7qSO^GZn~4eBztapdH1 zqnMl~4ve`8TaV&xWnjv9qZkaw_>3-0hlkcXlN9|`z+Gh9cJb%?4;&- zK$&WNt&3yB+7nz7`toU$3E|>f5E0C|qaCA&(ANIS$d4py-;Seg%G0=ZM-}?pR)A&x z=4HTE1^GL$cj|8Gpe+2r{db?E5N~e!Sv?W|)M!Nps4I|5PrQy=ek@a%nVQ+@mM!7M@74@jg z|7sAcH<%!rzFX@U2Wg`r625n){7E>X<-UUTuf@L3{L;-buV?o=t-G78+vc`o>_Xbnd%5 zAfsW9+)q^%Fi0t}&%{jpFqpVtl$9_N8R*IY&5*X&?^_8bAEqWVC%MnsKk@9s)b*9msL(9a5)jaoE%ASrmkR@QOwKjc zp(uM%S1n3Mu3}kX~pvLenbNlBOMs zvi

    1gx^nJl%%hAl*Mdcvqmh)#hp!B;X3|+uC&NCn?TUYP`yBKN{!7a(X0{+$+qw z7MTW?&dTqJgFih+D1JP1ymmyjf*os5X5fQ6if92#uT?DY0c`UABxZX~&ZroF2>ez1 zT)oHt_qa|s=g$AUxgMeuzdNm5 z+?sKFq;~SG)hyjq{fIwAux1It^lVK7*v`>!uX)3{BLc4aoL?)~(}#(Nh>3Jmdi*Hj zq9LMmcx}8(t9Y{hV{KF*WBVGK35QEP$p6&z2oG2jbAYepbM4~&r%c)LBbBH7+YCjD zrKR>QfJ5~Xc5i)G1Sz_A6Fh_<4~J!^zj`_sU@9;Nkd61Ipajh|*`EvY{gpSpre6(& zj%RdRdzLI$X=9k;d?0H!G-QK7WR&?`#o{!$?PH${YRpv^I<0*d_|TXLr?FI{Q(Z30 zsEdL4G>j1EFdC?#CTUU=3#Q#idFf@}~x3X(KO;EJgSZ?CJ)FMmI znKeHam|0(Ut&Z!MaBtcjv~( z&{-H{U%swxG3wXh<$Kp4XTK}UmS7+MZGBc+;+X*mQpNcRL_^7nrvxc98oEHSU_X$< z08P^{F#|w#EZj~?%#Kcc5)3FZLS}aPXn(!<`J3#-$S+QQuh}rJL@e9>$9GmELTMej zeWJ?f+N&+3VWjOgWSKl{C8mZqmiwpPLp?+HF;OR_Q<_}kf5 z6h|_NNemkoeiC%sWql!1u6yNGg=a@a>HK{s-QVLSCAW^&JUj#IzZG7&=GHjS*>p3{ zSa9WB^w?&wD3xG+wyS*gf7$8)q? z25Wa($~s(TG9eZ7L>1f5`NZ4dIL{o+>&R9!Gr4=~at>l}g`*r?V-G)yaBZ)AAr0#} zV?ls!&&9h*;EKXa^kbS=xD*2co!kdgJ~^hrBTTZ9K*uN2(@6!I_c!mFpxCaTF* zSGy<*_&`4hHv}G!Z>{$*)v)>eYOruVct5g0detB<_W=24>9lZ{7;dGF3NE0uK}1z< zS99F=6W1z6!;gH=v{p5VvcJ`LrLOap**lTR23o#6PL335!#Pvp7FUgKoWk^(AK90fHoK#wj4GM+sT=>Un2dZJYv)*@#44s#?|{ z+?1AuXHqcJ#CGG=>u>B0xEP2v9}DwwQuRq?gT3NicB*EW0o%g@Z0(-Tql^b}sCf@9 za%_xyf8mzx-gL(qWQK%1y|_W*CX0j)$e1LU{P54&$w2x=WRRv?Zxe2`xDJySTg zM6H~khO7`iWv92uxgCWs2-xmnpElXk6ucnLS2l$HE%H7fc6E>uv$1P|mY>fCNiQFj z68O{1d|jJ@3C?TlZI89!w6Q_yP`fSAw}_uWv>4PWL!C7Q-;krV#L8k6>o32Lo8GEs6D+}0jj+Ew3O-mASo3^h>N6Jcw;ncUCcjUf zflLc^K>71lDsNPmFXgh!SG{WU89A;JCD;KiU8(*~ zAG7@wSF8;F=kQ{^ZQ`p9EOs``_8pI0W&azw>PYbFA4r3E+5ZjDjYR|d&gm6zWmJjy832=o&~GvI z2SI3-k1x}Lu&Rk8#s0J>8IccCbh|?xNhT&3^?ez()72%H5Zl0u!KwKZV8me>E_63; zu=s-S6(87ONc@2Yvo`1OVdK^)`k(%?YL8jorRC4cg*sfDUeWyC&NWb{&8Jkca+!DL z+T4h5)z^~r^xHI;U6Ka>SEi5qwekvM3EmeMzbJ4UhsA1eac zH{ZLT?%zv1I6T&ciUsIjd!f((%7^*`q&CpsA0F2*{3Af}ZKL#poaTBCTs7AAL3by@sUmN}j_zg0)4#wc(;Yf$iSwV&eF6N-PV}IAl7ehY>>{DwaL*m= zffu-+nV(vhIU4Jl8=B^WEq=j&u(7WnG?k6|;sq91L!A~W?>m;_gaSi8eG7PHP_Dg} zKIben!-=mXds(?I8#Hly2blDvFMMiZr+WOW3Fh_jN-s{;x|6Ndu-xnqm;bKV)z*Gx zPWkp;shhySz?j84-8;EDWj_2prfGGMtmz=Ge{vssx#7k{Z`6*dfh}EX*j2KL>N+5_ z`W><(h?2yA!Zq8$$C}wiNh0-oy+_?&DAj)4q?P*sqiP@_AndkmUx1dIym@{3o!=n_ zCL%$rT6^gKgx3UI_|=2fW8?!`b?D4yBXxZ68|29~1o0PkT{fVIgUZrsa*x?06jNSd zdt!B%`JpK}Xh~KV=aOAhU1nlz^|5(x!^&yyDA{6T^|r-Qtk6(BL|TMZkGvqBj&3Lw{$zLM|Y zq1-67$@}e}4`nWD79Q&ozX*{HmWk7#oJd&v594R-!AY)U-j z>c0IuX?r>rDo?JI^rjJU6ZJQTx0SDniST5OewU-xgTtW>m%&4s4AV*|-;K92(g!g& zFghiwUhJs-y~czKniJPHW76a}vwS*!G?WXjfUbs@pRP;PvP-R8nPtoHTjUn!%`Mp; zPNR6RAE-isn4^MTMf3-{v@Oc$-V<%~VD&~+g40f57i$4It^mK7rpl`{O*)r+hB-r= zb8UGOJx~IT3blPX#sFJ_|dR z#8bH9R*ND+m3RfX(>VypmeD|W7(mM$e6$*{qIlvwR>1FoqEdG9$c^R-XZ`^6w9)F} zz%r$x0NdAXv5x|&6Y7qc2b{4c`ltUXW-&i_KE^#^Iu$_6&cOF_Pt#rENQKs7fbzdI zkVJ%195Ahou3`CNKIb#udSEtvs{iYI)#COnhnboif6WV%?|Hknq+bzxEBVA2VbxzF zc+}JFC#AV91c2N+@Ig2&+!+$n<`^ZXB>07O@#zK1Qd3kPnbDl)FBnyI z@guEQ;-{v>iE;R>yi!p<(~Hp(zf9IEBFSqGpw!!TJ6_-f5ch8|Kf-*qDT0kr&9iSf zU|WjO8+`K}l8FA7l5FHZnx699%L2Ywb+{Asr2tEJ6Hhb#{{{pH44WCeZs8?^l7tIDr^0X0aek9pq@8 z=$X#1!vCY_yrbEC+c-|`U0O4U+O=x$+14(KqIO%jxT&n?xYsgs-LMGpVe7 zQ5MA9)vfTUFam0OT`?^E|NO#2gw>t0tjE7rRWxkc&|oi8ll9|w zZ8#wPS7!?9lrNNMHfnfH zA-sb0?nY$|)fJuWFL*~*Q0SjUB|hT@cX;?ab6^Nc_(VPHz1!3-OLML;`BD`@mx)TrPnl`|-e!CNP;BQyxEH3G)Kp36Tl0O53H}bVam7hclb{E^}x>agx-J1 z7U#2$Fz63FN_dheg3Q&mn10aTWKg-6rRe9I!J?M&+tzjjOZFjiEY+FUZ;5m9G>sCH&2V~-&yfGhsNj_e(u3Un36&o^|8$z9wVth6CAD&x>oxsYAgp1OJ&&khUQOW_*_DPFdrqO8mI)QWQ#}o64OWnCKw+aknvUl<1!2$tSFb|@yvMl@#cH+Bz!hp z94P(6ALO*roTyurWs*uPLX(-&E-Chk$H?>Iv}$={G5*aW1n$E>U~cXV&pHz{LJOnZexM@BCFJpDS-|MAq~79bCkZxUaT7)UZYeik__N`6TX=%5Oj&oBsqh1|7$ z=<54~mm}K-moh#}zzRG-L>z7$Ez9+x$_}gXx5d}@Lb~C|q??DO8_PRDZDC$y1U*WBVid;^4gn!jHN99ynNGT!T1``y$~eB1^pN<@F19C&CuM9x z26j*yQD$}zvL7~mca0aG-5 zydPItLKyr9PcK4mGg$sn02T#Jfp!-D)9Z#a)rLavaM4B1b$ai-6Vr4TQapCl(lFu5f~mA(KXi?IaF^`36xj(Tl}k)uae%Xcw5dn^~dH4Mo0NThywF%S7MO&^ueZa^9sx;y*ubg%gxwiEnlCD#d6+P*n zpEJ|1C&Wc6WC}fyRZyk$-`t+DI2qLKc#QVGrpyFwWh@?Z@n^}N?i8g~^7FI(`J%ru zU?BsZOS++h-;qMDnL-x2emM3fp(N1KmDo<2Pc{nk?ZMQQ9&2#s-N5(h^rg{?#uZLk z>WJ#ELF;4gq|fDFNmz|fYd>z0C?xHC5x9^~_g4Jaeur6KD)qAi72|@lZr7-FgQFB> z2|~*xr}W@9S6^GbXjQ@)B{Eimuutpk@;e!Jsasjpl|oYF%gq+GBwHd12MG$Bvov~{ z{=*AuN#o*5E~U2#8ug!I8ZRy3`Q@P4Lm@Vfx8mv$f5rap%AdB8(Sw|NjTv5-%Xmi> zisK8q)`eX7fgjunJFnI?Mc+uQJAV-N0Uff~e!3IKZdX0oouW7wBX+ zdyq`D8H+=I*|U)eXz3_<`S3I5d+mw_Y+Gl!{2CHD#Z2R-mo3IyE+TWa~%n9 z)5=fvOmefdHAJ_NsR@f-er|d**3)`Qh&$iRdn*)wOa;F@@xC6ox72+duKVau>`6c| znpf*m*72R4&t|fh!r~Z3aphvWK`r=~gSZw*xJRrlJbp4aF(-FGOQ^W=lH`u!8E}9k z;=F+8$u?X7dg5a~%X_R$pFy0(Q9;pPI9YqJ6f&Q&UCztF(GBiZvD;)3lJ91>kx%|S z&2mw@O0VSaysyk(Y>2JATnEbEx|Mqu_pL0sI~&-ANA60` zTXd|dca5{O%d1Ta8!lEmQ3%SN6m*3?ZNx`sb2-yM1rba2A=8~!D_|7LZ1<`~csv(W zVWpqqu~j!9Dj~F>cB=V^0Kab0ya_*3=oPJYBi~6z?}cEw*;fu{`u9XK41{j}oA3D_ zGR4Y_CF>kcT%KYecT@?tp^6mWpWF!P$)Gid67=3TSa#SAumiNnM;hJcjMwM@kq

    Q}9uJMUbde}2g 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

  2. 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�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%0DHQ*fWmwZkCu0UNS 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%0Adp3ZRa;BFqQ5*0 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

    6OVc9*^9LZ4 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 z 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%0D@EG1Iq$3uJM%vbgmB8b!6NL z19tKGTps5irW1)dn;R3l16I#Uj3c*wwtSKZtuTK=^>B~gFCttj5ZE> z%L=y)J?$s~;azvmq(tVuW>PDgy7UvH*;bH+iZXMUeHw$okw*XU7U zg6(YbanZlvSUJhS>IQl5*8m+nBTQzLc@3Q;GMDJL5RsH znZ^|385@lmJx)Ocu;*(5)bIi4X#|gcFlltv-Mw_t+eWp%y`H~4Qzr6pv{H*xTD>$@ zeQuk2Cu=9Rjp#eE3Ka=CKvhDMh9hgLjFLdfU`X0=)UOX$T!2ms774ox=IuL4K)F1& zaHIpYa&gs)8-4)EXxk$s0L*r=Jw8%N1B{0t1L*f)N`)?dRVU`{xp9)gaKw9?cVrE4p@+?3!R-HtKSkH^;|k~

    ^kn4T;#TN?{f-^d`(Q(&Qy5L-L|NEnK-sdB5F33S7f#w?8U&k>F(GN#A^C#KATnK z3FMyY-;#5?PB{h1^gr9qs|1;fmg#39W4@cD)UbuWMJAb z1crCse_uxJ64}6cHc1@3-BfN7FUmVVuIKH|+-_8Uc6kqN$>KA$y!)^b7=XN8Ue23* z&;3Gq;M)&+KZ#L+#=f!x-(egl0cwKkLQ9`rkNWmUZ82`#RX8;XEz62H9zN z>T=15>GxV<1v#!_Q~yUS|4bqKRUT( zD6Kt4$VKu)!ABJrjKr3NJvnwyCA^(W4fn2hZ>>u&Q*4r^8$l!)f;}S8Ee%iNZGXCn zz9T9<6{lmpC#`- z3w{=*qj^=LodBBP`|jX4mT60CXV>S74}phtVw4JV3Ij&R?T%*N!SnQEE7uFxLOTK~ z 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

    c8wsdn12 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%0D;l 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 V@={ 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

    9QsX7l>t_txc>-tGT~SuH1>g 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ÈG^5 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

  3. W9@nbACj2QFJt>Ip?G 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 s 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�Zse2dW;(`Zz{8jEQzC@ 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%0DgQvtU?$7TptKUG_ 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 z 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 z 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%0D?0Ig`>D&?o5kGHh5>O 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

-## 3. Implementation Details +## 3. Understand ### 3.1 Implement the Frozen Lake Environment @@ -134,8 +134,4 @@ class FrozenLakeWorkflow(Workflow): ### 4.1 Training Curve -*(To be added)* - -### 4.2 Case Study - -*(To be added)* +![](https://img.alicdn.com/imgextra/i3/O1CN01ZfICUr1Rs4zXrPPXQ_!!6000000002166-2-tps-858-614.png) From f29aabbf40057cd3db697e30843710bdfeb4fd46 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Tue, 23 Dec 2025 20:42:12 +0800 Subject: [PATCH 318/462] docs: Update documentation structure and assets - Replace SVG logo with PNG format in config and favicon - Reorganize documentation table of contents: move countdown.md example to examples section and reorder deep dive chapters - Add configuration.md to the beginning of deep dive section - Enhance quickstart.md with minimum example code and improved section navigation - Add reward/task_judger.md placeholder --- docs/_config.yml | 4 +- docs/_toc.yml | 5 +- docs/en/introduction.md | 112 ++++++++++++++++++++++------------------ docs/en/quickstart.md | 37 +++++++++---- docs/en/task_judger.md | 1 + docs/logo.png | Bin 0 -> 210250 bytes 6 files changed, 96 insertions(+), 63 deletions(-) create mode 100644 docs/logo.png diff --git a/docs/_config.yml b/docs/_config.yml index cf830004..ecdccdd9 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -4,7 +4,7 @@ project: "AgentScope Tuner" title: "AgentScope
Tuner" author: Alibaba Tongyi Lab -logo: logo.svg +logo: logo.png copyright: "2025, Tongyi Lab, Alibaba Inc." only_build_toc_files: true @@ -70,7 +70,7 @@ sphinx: # Theme Configuration html_theme: furo pygments_style: "friendly" - html_favicon: logo.svg + html_favicon: logo.png html_show_sphinx: false html_last_updated_fmt: "%Y-%m-%d" html_copy_source: false diff --git a/docs/_toc.yml b/docs/_toc.yml index 3c3fc054..9246f07e 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -16,6 +16,7 @@ parts: - file: en/example_werewolves.md - file: en/example_learning_to_ask.md - file: en/example_frozenlake.md + - file: en/example_countdown.md - caption: Component chapters: @@ -25,10 +26,10 @@ parts: - caption: Deep Dive chapters: + - file: en/configuration.md - file: en/data_generation.md - file: en/example_tracing_feedback_loop.md - - file: en/example_countdown.md - - file: en/configuration.md + # --- 中文部分 --- - caption: 简介 diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 15ce27ff..a3072d0a 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -1,98 +1,110 @@ # Introduction -AgentScope Tuner, or **ASTuner**, is an advanced agent training framework designed to optimize AgentScope workflows and agents. -Simply provide your AgentScope workflow, training data, and reward function to enhance your agents to their optimal performance. +**AgentScope Tuner (ASTuner)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! +--- -## ✨ Features +### ✨ Features -- **Data Augmentation & User Feedback Tracing**: Automatically augment training data and trace user feedback when training data is limited. -- **Auto Rubrics**: Generate LLM-as-judge reward functions by learning from few-shot examples. -- **Multi-Agent Support**: Build advanced cooperative multi-agent systems with ease. -- **Highly Efficient Async Training-Inference Separation**: Powered by Trinity-RFT for optimized performance. -- **Training-Debugging Integration**: Seamlessly toggle between training and debugging modes using a simple `--backbone` switch (`--backbone=trinity` or `--backbone=debug`). -- **Comprehensive Logging**: Integrate message-level logging from AgentScope Studio and token-level logging for detailed insights. +We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: +- **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. +- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) as tutorials. +- **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. +- **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a timeline merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). +For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: + -## 🚀 Quick Start +- **High-Resolution Logging**: ASTuner allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. +- **Fast Debugging**: ASTuner also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. -### Installation +--- -We recommend using `uv` for dependency management, though `conda` is also supported. +### 🚀 Quick Start -1. Clone the repository: +#### Installation +We recommend using `uv` for dependency management. + +1. **Clone the Repository**: ```bash git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner + ``` -3. Create virtual environment and install dependencies: +2. **Set up Environment**: ```bash -uv venv --python=3.10.16 # Create virtual environment -source .venv/bin/activate # Activate virtual environment - +uv venv --python=3.10.16 && source .venv/bin/activate uv pip install -e .[trinity] +# Note: flash-attn must be installed after other dependencies uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir + ``` -### Get Started +#### Run Training -Run and train an agent in one command: +You can start training your first agent with a single command using a pre-configured YAML file: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` +Details in [Math agent](./example_math_agent.md) + +#### Example Library Explore our rich library of examples to kickstart your journey: -- 🚀 [**Quick Start**](./quickstart.md): Learn the framework and train your first agent from scratch. -- 🍳 [**Build a Simple Math Agent**](./example_math_agent.md): Specialized in GSM8K problems and learn how to train it. -- 🍳 [**Build an AppWorld Agent**](./example_app_world.md): Create an AppWorld agent using AgentScope and train it. -- 🍳 [**Build Multi-Agent Werewolf Gameplay**](./example_werewolves.md): Develop multiple Werewolves RPG agents and train them. -- 🫣 [**Build a "Learning to Ask" Agent**](./example_learning_to_ask.md): Train a proactive agent to ask high-value questions using LLM-as-a-judge rewards. -- 📔 [**Tracing-Feedback Training**](./example_tracing_feedback_loop.md): Learn how to train using user feedback tracing. +- 🔢 [**Training a math agent that can write python code**](./example_math_agent.md). +- 📱 [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). +- 🐺 [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). +- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). +- 🎴 [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). +- 🚶 [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). + -To learn the details of each component, please refer to: +--- -- ⚙️ [**Configuration**](./configuration.md): Configure the data, optimization algorithms, rewards, etc. -- 💼 [**Workflow**](./workflow.md): Build your own agent with trainable workflow. -- 📊 [**Data Pipeline & Generation**](./data_pipeline.md): Includes building dataset tasks from document materials and expanding datasets from few samples. +### 🧩 Core Concepts +ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. -## 🏗️ Project Architecture +
+image -AgentScope Tuner makes agent fine-tuning unprecedentedly straightforward. It encapsulates complex fine-tuning training into a simple module driven by three core inputs: +
-- AgentScope workflows (which can directly utilize your pre-written AgentScope workflows) -- Task datasets (providing training data) -- Reward Judge (assessing performance quality). +#### 1. The User-Centric Interface +To optimize an agent, you provide three core inputs: -![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2025/png/144856612/1764207569988-69b6926f-301b-4766-9199-3823974aab99.png) +* **Workflow**: User-defined agent logic (single or multi-agent). +* **Task Dataset**: Training and validation tasks (e.g., GSM8K). +* **Task Judge**: A reward function or rubric used to score agent performance. -Of course, fine-tuning the workflow would not be possible without the silent support of the following core modules: +#### 2. Internal System Architecture -![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2025/png/144856612/1764705947150-753d77f0-a1a7-4491-8b8b-a0f9f998ed0a.png) -- **launcher**: The entry point of the project, helping developers quickly switch between debugging the backbone and training the backbone. It also launches and intelligently monitors the environment service processes related to training in the background. -- **task rollout**: Bridges different LLM engines (such as FSDP, VLLM, etc.), implements a retry mechanism, and passes the tasks read by the task reader. If the gym environment is required, it initializes the gym environment and ensures resource cleanup. -- **task runner**: The front-line worker responsible for actually executing the user-provided AgentScope workflow. It also runs the judge and performs preliminary reward calculations. -- **model tuner**: When the AgentScope workflow sends an LLM inference request, this busy component directly receives and forwards the request to the LLM engine. -- **context tracker**: A loyal recorder that monitors every LLM call and automatically identifies and archives LLM requests belonging to the same Agent and the same timeline. At the end of the task, it marks the loss mask, merges the recorded LLM input-output timelines, and improves training efficiency by 3 to 10 times. +The internal system orchestrates several specialized modules to handle the complexities of RL training and agent interactions. +* **Launcher**: Manages background service processes (Ray, vLLM) and routes the backbone. +* **Task Reader**: Handles data ingestion, augmentation, and filtering. +* **Task Rollout**: Bridges LLM engines and manages the Gym environment lifecycle. +* **Task Runner**: Executes the AgentScope workflow and calculates rewards. +* **Model Tuner**: Forwards inference requests from the workflow to the LLM engine. +* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **3x to 10x**. -## 🗺️ Project Roadmap +--- -Working in progress: +### 🚦 Navigation -- Enhance data generation module functionality -- Provide a training → user feedback → data augmentation → retraining data flywheel example -- Offer refined post-processing options for multi-agent samples -- Support training with multiple models -- Optimize configurations for long-context adaptation on smaller GPUs -- Add LoRA training examples +* 📖 **[Tutorials]**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. +* 🛠️ **[Core Components]**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). +* ⚙️ **[Deep Dive]**: Master advanced [Configuration](./configuration.md). +* 💡 **[Examples]**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index 4461166a..32837633 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -6,19 +6,38 @@ AgentScope Tuner provides a complete feature set for tuning agents. You can try astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -## Start with Tutorials + +### Minimum Example + +Let's begin with the simplest example: a math agent with a tool call. + +- First, please check out the [installation guide](docs/en/installation.md) to set up the training environment. +- Then, tune your first model using the minimum example below (suppose you have written an Agent called `MathToolWorkflow`). + ```python + from astuner import AstunerJob + from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow + model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" + job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) + job.set_workflow(MathToolWorkflow) + job.set_data(type="hf", dataset_path='openai/gsm8k') + # [Optional: Save yaml file for manual adjustment] job.dump_job_as_yaml('saved_experiments/math.yaml') + # [Optional: Load yaml file from manual adjustment] job.load_job_from_yaml('saved_experiments/math.yaml') + tuned_model = job.tune() # Equivalent to `astuner --conf ./saved_experiments/math.yaml` in the terminal + ``` + +### Explore Examples Explore our rich library of examples to kickstart your journey: -- 🚀 [**Training a math agent that can write python code**](./example_math_agent.md). -- 🍳 [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). -- ⚙️ [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). -- 💼 [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). -- 📊 [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). -- 🚀 [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). -- 📔 [**Learn how to train using user feedback tracing**](./example_tracing_feedback_loop.md). +- 🔢 [**Training a math agent that can write python code**](./example_math_agent.md). +- 📱 [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). +- 🐺 [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). +- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). +- 🎴 [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). +- 🚶 [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). + -## Tune Your First Agent From Scratch +### Tune Your First Agent From Scratch Begin to build your own agent and tune it following our document: diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index e69de29b..bf7bcd8c 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -0,0 +1 @@ +# Reward \ No newline at end of file diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..038c78bca0cb8cedbd0b3b05ee8dd103aa75ffeb GIT binary patch literal 210250 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
==z9L*7auc7v_@mvFr(>`s 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 Date: Tue, 23 Dec 2025 20:43:12 +0800 Subject: [PATCH 319/462] docs: home page use the same page as introduction --- docs/en/intro.md | 114 ++++++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 51 deletions(-) diff --git a/docs/en/intro.md b/docs/en/intro.md index 67757041..a3072d0a 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -1,98 +1,110 @@ -# AgentScope Tuner +# Introduction -AgentScope Tuner, or **ASTuner**, is an advanced agent training framework designed to optimize AgentScope workflows and agents. -Simply provide your AgentScope workflow, training data, and reward function to enhance your agents to their optimal performance. +**AgentScope Tuner (ASTuner)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! +--- -## ✨ Features +### ✨ Features -- **Data Augmentation & User Feedback Tracing**: Automatically augment training data and trace user feedback when training data is limited. -- **Auto Rubrics**: Generate LLM-as-judge reward functions by learning from few-shot examples. -- **Multi-Agent Support**: Build advanced cooperative multi-agent systems with ease. -- **Highly Efficient Async Training-Inference Separation**: Powered by Trinity-RFT for optimized performance. -- **Training-Debugging Integration**: Seamlessly toggle between training and debugging modes using a simple `--backbone` switch (`--backbone=trinity` or `--backbone=debug`). -- **Comprehensive Logging**: Integrate message-level logging from AgentScope Studio and token-level logging for detailed insights. +We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: +- **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. +- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) as tutorials. +- **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. +- **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a timeline merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). +For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: + -## 🚀 Quick Start +- **High-Resolution Logging**: ASTuner allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. +- **Fast Debugging**: ASTuner also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. -### Installation +--- -We recommend using `uv` for dependency management, though `conda` is also supported. +### 🚀 Quick Start -1. Clone the repository: +#### Installation +We recommend using `uv` for dependency management. + +1. **Clone the Repository**: ```bash git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner + ``` -3. Create virtual environment and install dependencies: +2. **Set up Environment**: ```bash -uv venv --python=3.10.16 # Create virtual environment -source .venv/bin/activate # Activate virtual environment - +uv venv --python=3.10.16 && source .venv/bin/activate uv pip install -e .[trinity] +# Note: flash-attn must be installed after other dependencies uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir + ``` -### Get Started +#### Run Training -Run and train an agent in one command: +You can start training your first agent with a single command using a pre-configured YAML file: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` +Details in [Math agent](./example_math_agent.md) + +#### Example Library Explore our rich library of examples to kickstart your journey: -- 🚀 [**Quick Start**](./quickstart.md): Learn the framework and train your first agent from scratch. -- 🍳 [**Build a Simple Math Agent**](./example_math_agent.md): Specialized in GSM8K problems and learn how to train it. -- 🍳 [**Build an AppWorld Agent**](./example_app_world.md): Create an AppWorld agent using AgentScope and train it. -- 🍳 [**Build Multi-Agent Werewolf Gameplay**](./example_werewolves.md): Develop multiple Werewolves RPG agents and train them. -- 🫣 [**Build a "Learning to Ask" Agent**](./example_learning_to_ask.md): Train a proactive agent to ask high-value questions using LLM-as-a-judge rewards. -- 📔 [**Tracing-Feedback Training**](./example_tracing_feedback_loop.md): Learn how to train using user feedback tracing. +- 🔢 [**Training a math agent that can write python code**](./example_math_agent.md). +- 📱 [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). +- 🐺 [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). +- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). +- 🎴 [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). +- 🚶 [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). + -To learn the details of each component, please refer to: +--- -- ⚙️ [**Configuration**](./configuration.md): Configure the data, optimization algorithms, rewards, etc. -- 💼 [**Workflow**](./workflow.md): Build your own agent with trainable workflow. -- 📊 [**Data Pipeline & Generation**](./data_pipeline.md): Includes building dataset tasks from document materials and expanding datasets from few samples. +### 🧩 Core Concepts +ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. -## 🏗️ Project Architecture +
+image -AgentScope Tuner makes agent fine-tuning unprecedentedly straightforward. It encapsulates complex fine-tuning training into a simple module driven by three core inputs: +
-- AgentScope workflows (which can directly utilize your pre-written AgentScope workflows) -- Task datasets (providing training data) -- Reward Judge (assessing performance quality). +#### 1. The User-Centric Interface +To optimize an agent, you provide three core inputs: -![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2025/png/144856612/1764207569988-69b6926f-301b-4766-9199-3823974aab99.png) +* **Workflow**: User-defined agent logic (single or multi-agent). +* **Task Dataset**: Training and validation tasks (e.g., GSM8K). +* **Task Judge**: A reward function or rubric used to score agent performance. -Of course, fine-tuning the workflow would not be possible without the silent support of the following core modules: +#### 2. Internal System Architecture -![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2025/png/144856612/1764705947150-753d77f0-a1a7-4491-8b8b-a0f9f998ed0a.png) -- **launcher**: The entry point of the project, helping developers quickly switch between debugging the backbone and training the backbone. It also launches and intelligently monitors the environment service processes related to training in the background. -- **task rollout**: Bridges different LLM engines (such as FSDP, VLLM, etc.), implements a retry mechanism, and passes the tasks read by the task reader. If the gym environment is required, it initializes the gym environment and ensures resource cleanup. -- **task runner**: The front-line worker responsible for actually executing the user-provided AgentScope workflow. It also runs the judge and performs preliminary reward calculations. -- **model tuner**: When the AgentScope workflow sends an LLM inference request, this busy component directly receives and forwards the request to the LLM engine. -- **context tracker**: A loyal recorder that monitors every LLM call and automatically identifies and archives LLM requests belonging to the same Agent and the same timeline. At the end of the task, it marks the loss mask, merges the recorded LLM input-output timelines, and improves training efficiency by 3 to 10 times. +The internal system orchestrates several specialized modules to handle the complexities of RL training and agent interactions. +* **Launcher**: Manages background service processes (Ray, vLLM) and routes the backbone. +* **Task Reader**: Handles data ingestion, augmentation, and filtering. +* **Task Rollout**: Bridges LLM engines and manages the Gym environment lifecycle. +* **Task Runner**: Executes the AgentScope workflow and calculates rewards. +* **Model Tuner**: Forwards inference requests from the workflow to the LLM engine. +* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **3x to 10x**. -## 🗺️ Project Roadmap +--- -Working in progress: +### 🚦 Navigation -- Enhance data generation module functionality -- Provide a training → user feedback → data augmentation → retraining data flywheel example -- Offer refined post-processing options for multi-agent samples -- Support training with multiple models -- Optimize configurations for long-context adaptation on smaller GPUs -- Add LoRA training examples +* 📖 **[Tutorials]**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. +* 🛠️ **[Core Components]**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). +* ⚙️ **[Deep Dive]**: Master advanced [Configuration](./configuration.md). +* 💡 **[Examples]**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). From 51977e74bde0fc01e336ee023c3fa0f47efb66c1 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Tue, 23 Dec 2025 21:32:29 +0800 Subject: [PATCH 320/462] docs: polish task reader doc --- docs/en/data_pipeline.md | 229 ++++++++++++++++++++++++++++----------- 1 file changed, 167 insertions(+), 62 deletions(-) diff --git a/docs/en/data_pipeline.md b/docs/en/data_pipeline.md index 0ad7546c..162fb210 100644 --- a/docs/en/data_pipeline.md +++ b/docs/en/data_pipeline.md @@ -1,9 +1,22 @@ -# Data +# Task Reader -AgentScope Tuner establishes a unified training data structure and complete data loading methods for data from various sources. This page provides a detailed description of the data schema and data loaders in AgentScope Tuner. +AgentScope Tuner loads training tasks from various data sources through Task Reader. This page covers the Task schema definition and different built-in Task Readers for common scenarios. -## Data Schema -Data structures that can be read and used by AgentScope Tuner must be defined according to the following format: +## Overview + +In agent training, all training data must be represented as **tasks** following a unified schema. AgentScope Tuner provides multiple Task Readers to load tasks from different data sources: + +- **Unified Schema**: All tasks conform to the `Task` structure regardless of source +- **Multiple Sources**: Load from local files, HuggingFace datasets, interactive environments, or auto-generate new tasks +- **Automatic Routing**: The framework selects the appropriate reader based on `astuner.task_reader.type` in your configuration + +``` +Data Source → Task Reader → Unified Task Schema → Training Pipeline +``` + +## Task Schema + +All training tasks must be defined according to the following structure: ```python class Task(BaseModel): @@ -14,104 +27,196 @@ class Task(BaseModel): metadata: dict = Field(default_factory=dict) ``` -The meanings of each field are as follows: +### Field Descriptions + +| Field | Type | Description | +|-------|------|-------------| +| `main_query` | `str` | The main instruction or question for the agent to solve | +| `init_messages` | `List[dict]` | Initial conversation messages (e.g., system prompts). Each must have `role` and `content` fields | +| `task_id` | `str` | Unique identifier for the task | +| `env_type` | `str` | Environment type (e.g., "math", "appworld") | +| `metadata` | `dict` | Additional context information (e.g., reference answers for reward calculation) | + +### Example Task + +```json +{ + "main_query": "What is 15 * 23?", + "init_messages": [ + { + "role": "system", + "content": "You are a helpful math assistant." + } + ], + "task_id": "math_001", + "env_type": "math", + "metadata": { + "answer": "345", + "difficulty": "easy" + } +} +``` + +**Best Practices:** +- Use `metadata` to store information needed for reward computation (e.g., reference answers, scoring rubrics) +- Keep `main_query` clear and concise +- Use `init_messages` for system prompts or few-shot examples + +## Built-in Task Readers -+ `main_query`: The main instruction or question of the task. -+ `init_messages`: List of initial conversation messages, typically used to include system messages, etc. Each element must contain `role` and `content` fields. -+ `task_id`: The unique identifier of the task. -+ `env_type`: The environment type corresponding to the task. -+ `metadata`: Metadata dictionary for the task, used to store additional context information. +AgentScope Tuner provides six built-in Task Readers for different scenarios. The framework automatically routes to the correct reader based on `astuner.task_reader.type` in your configuration. -The fields in `metadata` are related to the actual training task currently being processed. For example, we can use `metadata` to save data used for reward calculation, etc. +### Quick Selection Guide -## Data Readers -To facilitate usage, we have prepared various data readers for common scenarios, including reading from files, reading from Huggingface repos, reading from EnvService, reading with custom code. In this section, we will introduce each reader in detail. +| Scenario | Reader Type | When to Use | +|----------|-------------|-------------| +| **Local JSONL file** | `jsonl_dataset_file` | You have prepared task data in JSONL format | +| **HuggingFace dataset** | `huggingface_dat_repo` | Load tasks from HuggingFace Hub (e.g., GSM8K) | +| **Interactive environment** | `env_service` | Tasks come from a running environment service (e.g., AppWorld, FrozenLake) | +| **Auto-generate from documents** | `data_generation` | Generate tasks from knowledge documents or existing tasks | -### File Reader -The File Reader can read a dataset in jsonl format from a local path. Setting `astuner.task_reader.type` to `dataset_file` in the configuration file enables this reader. +--- -After enabling this reader, you also need to set the file paths for the training and validation sets. +### 1. JSONL File Reader + +**When to use:** You have prepared training tasks in JSONL format locally. + +**Configuration:** ```yaml astuner: task_reader: - dataset_file: + type: jsonl_dataset_file + jsonl_dataset_file: training: - # the path of training dataset - file_path: "xxxx.jsonl" + file_path: "data/train.jsonl" validation: - # the path of validation dataset - file_path: "xxxx.jsonl" + file_path: "data/val.jsonl" ``` +**JSONL Format:** - -Each line in the JSONL should be a JSON object with the following structure: +Each line should be a JSON object conforming to the Task schema: ```json -{ - "main_query": "the query", - "init_messages": [ - { - "role": "system", - "content": "openai format message", - } - ], - "task_id": "the task id", - "env_type": "the environment of the task", - "metadata": { - "other": "other metadata", - } -} +{"main_query": "Solve: x + 5 = 12", "task_id": "algebra_01", "env_type": "math", "metadata": {"answer": "7"}} +{"main_query": "What is the capital of France?", "task_id": "geo_01", "env_type": "qa", "metadata": {"answer": "Paris"}} ``` -JSONL files conforming to the above format will be automatically loaded and used as datasets. +**How it works:** +- Reads tasks line-by-line from specified JSONL files +- Automatically validates against Task schema +- Supports separate training and validation splits + +--- -### Huggingface Repo Reader -The Huggingface Repo Reader can read a remote dataset from a Huggingface Repo. Setting `astuner.task_reader.type` to `huggingface_dat_repo` in the configuration file enables this reader. +### 2. HuggingFace Dataset Reader -After enabling this reader, you also need to set the repo name and split names: +**When to use:** Load tasks from HuggingFace Hub datasets (e.g., GSM8K, MATH). + +**Configuration:** ```yaml astuner: task_reader: + type: huggingface_dat_repo huggingface_dat_repo: - # the repo name - dataset_path: "gsm8k" - # the name of training split - training_split: "train" - # the name of validation split - validation_split: "validation" + dataset_path: "gsm8k" # HF dataset repo name + dataset_name: "main" # Optional: dataset subset name + training_split: "train" # Training split name + validation_split: "test" # Validation split name ``` -### EnvService Reader -The EnvService Reader can automatically pull remote datasets from the EnvService. Setting `astuner.task_reader.type` to `env_service` in the configuration file enables this reader. +**How it works:** +- Downloads dataset from HuggingFace Hub using `datasets` library +- Automatically maps dataset fields to Task schema +- Caches downloaded data locally for faster subsequent runs + +**Supported datasets:** Any HuggingFace dataset that can be mapped to the Task schema. + +--- -After enabling this reader, you also need to set the service URL, environment type, and split names: +### 3. EnvService Reader + +**When to use:** Tasks are provided by an interactive environment service (e.g., AppWorld, RL gym environments). + +**Configuration:** ```yaml astuner: task_reader: + type: env_service env_service: - # the type of env, must be init in EnvService first - env_type: "appworld" - # the url of the service - env_url: "http://127.0.0.1:8080" - # code, text, box - env_action_preference: code - # the name of training split in this environment + env_type: "appworld" # Environment type + env_url: "http://127.0.0.1:8080" # Service URL + env_action_preference: code # Action format: code/text/box training_split: train - # the name of validation split in this environment validation_split: dev ``` -### Random Dummy Reader -If you want to customize the data pipeline, simply use this reader. +**How it works:** +- Connects to a running environment service via HTTP +- Pulls task instances from the environment +- Supports dynamic task generation from interactive environments + +**Use cases:** +- Training agents in simulated environments (e.g., FrozenLake, game environments) +- Complex interactive scenarios where tasks are generated dynamically + +--- -The Random Dummy Reader will leave all things to you, passing a random integer as `workflow_task.task_id` in the `Workflow` for you to load the data with your own process. +### 4. Data Generation Reader + +**When to use:** Automatically generate training tasks from knowledge documents or augment existing tasks. + +**Configuration:** ```yaml astuner: task_reader: - type: random_dummy + type: data_generation + data_generation: + augmentor_type: knowledge # 'knowledge' or 'task' + num_workers: 4 # Parallel generation workers + + # For knowledge-based generation: + knowledge: + doc_reader_type: pdf + doc_reader_config: + base_url: "docs/knowledge_base/" + generator_config: + model_name: "gpt-4" + num_tasks_per_doc: 5 + + # For task-based augmentation: + task: + base_tasks_path: "data/seed_tasks.jsonl" + augmentor_config: + model_name: "gpt-4" + augmentation_ratio: 2.0 ``` + +**Two Generation Modes:** + +1. **Knowledge Augmentation** (`augmentor_type: knowledge`) + - Reads knowledge documents (PDF, TXT, Markdown) + - Uses LLM to generate tasks based on document content + - Useful for domain-specific knowledge training + +2. **Task Augmentation** (`augmentor_type: task`) + - Takes existing seed tasks + - Uses LLM to create variations and similar tasks + - Expands training data from a small set of examples + +**How it works:** +- Generates tasks using configured LLM +- Applies deduplication filters to ensure diversity +- Caches generated tasks (keyed by configuration hash) +- Supports parallel generation with multiple workers + +**Use cases:** +- Bootstrap training data from documentation +- Augment limited training examples +- Create diverse task variations + + From bd854ab581e6ac2835acf1cdc3f0f9578357d7d2 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Tue, 23 Dec 2025 21:35:36 +0800 Subject: [PATCH 321/462] docs: add doc for task judger --- docs/en/task_judger.md | 310 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 309 insertions(+), 1 deletion(-) diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index bf7bcd8c..59201a27 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -1 +1,309 @@ -# Reward \ No newline at end of file +# Task Judger + +Task Judger evaluates agent outputs and assigns rewards during training. This page covers built-in judgers for common scenarios and how to create custom judgers for specific evaluation needs. + +--- + +## Overview + +A Task Judger evaluates the agent's execution results and returns two values: + +- **`raw_reward`** (`float`): Numerical score representing output quality (typically 0.0 to 1.0) +- **`is_success`** (`bool`): Whether the task was successfully completed + +These values guide the RL training process, helping agents learn which behaviors produce better outcomes. + +--- + +## Base Interface + +All Task Judgers inherit from `BaseJudge` and implement the `compute_reward` method: + +```python +from astuner.task_judge.base_judge import BaseJudge +from astuner.workflow import WorkflowOutput, WorkflowTask + +class BaseJudge: + def __init__(self, config): + self.config = config + + def compute_reward( + self, + workflow_task: WorkflowTask, + workflow_output: WorkflowOutput + ) -> tuple: + """ + Args: + workflow_task: Contains the task data, including metadata with reference answers + workflow_output: Contains the agent's output, including metadata with generated answers + + Returns: + tuple: (raw_reward: float, is_success: bool) + """ + raise NotImplementedError +``` + +--- + +## Built-in Task Judgers + +AgentScope Tuner provides four built-in judgers for common evaluation scenarios: + +### 1. MathAnswerAsJudge + +Evaluates mathematical answers by exact string matching, designed for tasks where answers are formatted in LaTeX `\boxed{}` notation. + +**When to use:** +- Math problem solving tasks +- Tasks with deterministic, exact answers +- Answers formatted as `\boxed{result}` + +**Configuration:** +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge +``` + +**How it works:** +1. Extracts the answer from `\boxed{...}` in the agent's output +2. Compares with the reference answer from `workflow_task.task.metadata["answer"]` +3. Returns `(1.0, True)` for correct answers, `(0.0, False)` otherwise + +**Required metadata:** +- `workflow_output.metadata["final_answer"]`: Agent's answer with `\boxed{}` format +- `workflow_task.task.metadata["answer"]`: Reference answer + +--- + +### 2. CountdownAnswerAsJudge + +Evaluates mathematical equations with partial credit for proper formatting. + +**When to use:** +- Number puzzle tasks (e.g., Countdown game) +- Tasks where partial credit is appropriate +- Need to reward proper formatting even when answer is wrong + +**Configuration:** +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge +``` + +**Scoring:** +- `0.0`: Invalid or missing answer +- `0.1`: Properly formatted equation but wrong result +- `1.0`: Correct equation and result + +**Required metadata:** +- `workflow_output.metadata["final_answer"]`: Equation string with `\boxed{}` format +- `workflow_output.metadata["target"]`: Target number +- `workflow_output.metadata["nums"]`: Available numbers for the equation + +--- + +### 3. EnvServiceJudge + +Delegates evaluation to an external environment service, useful for complex interactive environments. + +**When to use:** +- Tasks with external simulators (e.g., AppWorld) +- Complex state-based evaluation +- Interactive environments with built-in evaluators + +**Configuration:** +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge +``` + +**How it works:** +1. Calls `workflow_task.gym_env.evaluate()` to get a score from the environment +2. Converts the score to a normalized reward: + - Success (score ≥ 1): `1.0 + score * 0.5` + - Failure (score < 1): `0.0 + score * 0.5` + +--- + +### 4. AutoGraderJudge (Advanced) + +Automatically generates evaluation rubrics from reference samples using LLMs for subjective evaluations. + +**When to use:** +- Subjective evaluation tasks (e.g., writing quality, dialogue coherence) +- Tasks without clear-cut correct answers +- When you have labeled training samples but need flexible evaluation criteria + +**Configuration:** +```yaml +astuner: + task_judge: + judge_type: rubrics_auto_grader + rubrics_auto_grader: + # Model for rubric generation and evaluation + model_name: "qwen-plus" # or "gpt-4", "claude-3-sonnet" + api_key: "your-api-key" # or set DASHSCOPE_API_KEY env var + + # Evaluation mode + grader_mode: "pointwise" # or "listwise" for ranking multiple outputs + language: "en" # or "zh" + + # Pointwise mode settings + min_score: 0 + max_score: 10 + + # Reference data for rubric generation + input_data_type: "dataset_file" + dataset_file: + training: + file_path: "path/to/rubrics_train.jsonl" + + # Field mappings + query_field: "main_query" # field name for the query + answer_field: "final_answer" # field in workflow output + reference_field: "answer" # field in task metadata +``` + +**How it works:** +1. **Training Phase**: Generates rubrics from labeled samples using iterative refinement +2. **Evaluation Phase**: Uses the generated rubrics to score new outputs via LLM calls + +**Required data format:** + +For **pointwise** mode (scoring individual outputs): +```json +{ + "main_query": "Explain quantum entanglement", + "metadata": { + "answer": "Quantum entanglement is...", + "score": 8 + } +} +``` + +For **listwise** mode (ranking multiple outputs): +```json +{ + "main_query": "Write a poem about spring", + "metadata": { + "candidates": [ + {"answer": "Flowers bloom...", "rank": 1}, + {"answer": "Spring is here...", "rank": 2} + ] + } +} +``` + + +--- + +## Creating Custom Task Judgers + +For specialized evaluation needs, create your own judger by inheriting `BaseJudge`: + +### Step 1: Implement Your Judger + +Create a new file (e.g., `tutorial/my_task/my_judge.py`): + +```python +import re +from astuner.task_judge.base_judge import BaseJudge +from astuner.workflow import WorkflowOutput, WorkflowTask + +class MyCustomJudge(BaseJudge): + def __init__(self, config): + super().__init__(config) + # Initialize any resources (e.g., external APIs, models) + self.threshold = 0.8 + + def compute_reward( + self, + workflow_task: WorkflowTask, + workflow_output: WorkflowOutput + ) -> tuple: + # Extract data from workflow_output + agent_answer = workflow_output.metadata.get("final_answer", "") + + # Extract reference from workflow_task + reference_answer = workflow_task.task.metadata.get("answer", "") + + # Your custom evaluation logic + similarity = self._compute_similarity(agent_answer, reference_answer) + + # Determine success based on threshold + is_success = similarity >= self.threshold + + # Return (reward, success) + return similarity, is_success + + def _compute_similarity(self, text1: str, text2: str) -> float: + # Your custom similarity metric + # This is just a simple example + return len(set(text1.split()) & set(text2.split())) / max( + len(text1.split()), len(text2.split()), 1 + ) +``` + +### Step 2: Configure Your Judger + +In your YAML configuration: + +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: tutorial.my_task.my_judge->MyCustomJudge +``` + +### Step 3: Pass Data to the Judger + +In your workflow, populate `workflow_output.metadata` with the data your judger needs: + +```python +class MyWorkflow(Workflow): + async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + # Your agent logic + final_answer = await self.agent.reply(msg) + + # Return output with metadata for the judger + return WorkflowOutput( + reward=None, # Will be filled by the judger + metadata={ + "final_answer": final_answer, + # Add any other fields your judger needs + } + ) +``` + +--- + + +## Configuration Summary + +### Using Built-in Judgers + +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.-> +``` + +### Using Auto Grader + +```yaml +astuner: + task_judge: + judge_type: rubrics_auto_grader + rubrics_auto_grader: + model_name: "qwen-plus" + grader_mode: "pointwise" + # ... other config +``` + From 040fe08213ca0b40f4b4bc63774507b5b33778b3 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Tue, 23 Dec 2025 21:37:10 +0800 Subject: [PATCH 322/462] docs: polish introduction, align with corresponding docs --- docs/en/intro.md | 16 +++++++--------- docs/en/introduction.md | 16 +++++++--------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/docs/en/intro.md b/docs/en/intro.md index a3072d0a..54fcae85 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -34,7 +34,6 @@ We recommend using `uv` for dependency management. ```bash git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner - ``` @@ -44,7 +43,6 @@ uv venv --python=3.10.16 && source .venv/bin/activate uv pip install -e .[trinity] # Note: flash-attn must be installed after other dependencies uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir - ``` @@ -84,9 +82,9 @@ ASTuner makes agent fine-tuning straightforward by separating the developer inte To optimize an agent, you provide three core inputs: -* **Workflow**: User-defined agent logic (single or multi-agent). -* **Task Dataset**: Training and validation tasks (e.g., GSM8K). -* **Task Judge**: A reward function or rubric used to score agent performance. +* [**Trainable Workflow**](./workflow.md): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. +* [**Task Reader**](./data_pipeline.md): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. +* [**Task Judger**](./task_judger.md): Evaluates agent outputs and assigns rewards to guide training. #### 2. Internal System Architecture @@ -104,7 +102,7 @@ The internal system orchestrates several specialized modules to handle the compl ### 🚦 Navigation -* 📖 **[Tutorials]**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. -* 🛠️ **[Core Components]**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). -* ⚙️ **[Deep Dive]**: Master advanced [Configuration](./configuration.md). -* 💡 **[Examples]**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). +* 📖 **Tutorials**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. +* 🛠️ **Core Components**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). +* 💡 **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). +* ⚙️ **Deep Dive**: Master advanced [Configuration](./configuration.md). diff --git a/docs/en/introduction.md b/docs/en/introduction.md index a3072d0a..54fcae85 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -34,7 +34,6 @@ We recommend using `uv` for dependency management. ```bash git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner - ``` @@ -44,7 +43,6 @@ uv venv --python=3.10.16 && source .venv/bin/activate uv pip install -e .[trinity] # Note: flash-attn must be installed after other dependencies uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir - ``` @@ -84,9 +82,9 @@ ASTuner makes agent fine-tuning straightforward by separating the developer inte To optimize an agent, you provide three core inputs: -* **Workflow**: User-defined agent logic (single or multi-agent). -* **Task Dataset**: Training and validation tasks (e.g., GSM8K). -* **Task Judge**: A reward function or rubric used to score agent performance. +* [**Trainable Workflow**](./workflow.md): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. +* [**Task Reader**](./data_pipeline.md): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. +* [**Task Judger**](./task_judger.md): Evaluates agent outputs and assigns rewards to guide training. #### 2. Internal System Architecture @@ -104,7 +102,7 @@ The internal system orchestrates several specialized modules to handle the compl ### 🚦 Navigation -* 📖 **[Tutorials]**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. -* 🛠️ **[Core Components]**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). -* ⚙️ **[Deep Dive]**: Master advanced [Configuration](./configuration.md). -* 💡 **[Examples]**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). +* 📖 **Tutorials**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. +* 🛠️ **Core Components**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). +* 💡 **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). +* ⚙️ **Deep Dive**: Master advanced [Configuration](./configuration.md). From 8160996d636ace4547b54c8972f4d80c9d643180 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 23 Dec 2025 23:17:36 +0800 Subject: [PATCH 323/462] upgrade benchmark --- astuner/backbone/main_trinity.py | 2 + astuner/cli/launcher.py | 16 ++- astuner/main_verl.py | 6 +- astuner/main_vllm.py | 8 +- astuner/utils/config_utils.py | 2 +- astuner/utils/launch_utils.py | 8 ++ astuner/utils/logger.py | 0 pyproject.toml | 2 +- tests/bench/README.md | 5 + .../execute_benchmark_appworld.py | 121 ++++-------------- tests/bench/benchmark_base.py | 105 +++++++++++++++ .../execute_benchmark_countdown.py | 102 ++------------- .../benchmark_frozenlake.py | 29 +++++ .../benchmark_frozenlake.yaml | 96 ++++++++++++++ .../execute_benchmark_frozenlake.py | 33 +++++ .../execute_benchmark_learn2ask.py | 105 ++------------- .../benchmark_math/execute_benchmark_math.py | 93 +------------- 17 files changed, 355 insertions(+), 378 deletions(-) delete mode 100644 astuner/utils/logger.py create mode 100644 tests/bench/README.md create mode 100644 tests/bench/benchmark_base.py create mode 100644 tests/bench/benchmark_frozenlake/benchmark_frozenlake.py create mode 100644 tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml create mode 100644 tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py diff --git a/astuner/backbone/main_trinity.py b/astuner/backbone/main_trinity.py index 001a1490..d6784ef0 100644 --- a/astuner/backbone/main_trinity.py +++ b/astuner/backbone/main_trinity.py @@ -6,6 +6,8 @@ import astuner.backbone.trinity_trainer # noqa: F401 from astuner.utils.core_env_vars import get_runtime_env +from astuner.utils.launch_utils import set_loguru_default_color +set_loguru_default_color() def patch_runtime_env_to_get_actor(): diff --git a/astuner/cli/launcher.py b/astuner/cli/launcher.py index 51eda7ce..5bbfc751 100644 --- a/astuner/cli/launcher.py +++ b/astuner/cli/launcher.py @@ -12,12 +12,11 @@ execute_training_process, launch_logview, start_ray_service, + set_loguru_default_color, ) from astuner.utils.pty import pty_launch -logger.remove() -colorize = os.environ.get("LOGURU_COLORIZE", "YES").upper() not in ["NO", "0", "FALSE"] -logger.add(sys.stderr, colorize=colorize, enqueue=False) +set_loguru_default_color() load_dotenv() def parse_args(): @@ -230,6 +229,15 @@ def setup_environment_vars(args, exp_config, main_yaml_fp): return env +def check_model_file_exists(exp_config): + model_path = exp_config["astuner"]["model"]["path"] + # if model_path has more than 2 '/', we consider it as a dir path + if model_path.count("/") > 2: + assert os.path.exists( + model_path + ), f"Model path {model_path} does not exist. Please check your configuration." + + def main(): args = parse_args() @@ -252,6 +260,7 @@ def main(): logger.warning(f"No processes found matching keyword: {keyword}") if not args.conf: return + # Initialize variables with default values to avoid "possibly unbound" errors main_yaml_fp = None exe_exp_base = None @@ -300,6 +309,7 @@ def main(): start_ray_service(args, env, cluster=True) if args.conf and main_yaml_fp and exe_exp_base and exp_config: + check_model_file_exists(exp_config) execute_training_process( args, backbone_target, diff --git a/astuner/main_verl.py b/astuner/main_verl.py index 32b3f056..0eaf380e 100644 --- a/astuner/main_verl.py +++ b/astuner/main_verl.py @@ -18,16 +18,16 @@ import atexit import os import socket - import hydra import ray + from beast_logger import print_dict from omegaconf import OmegaConf from verl.trainer.ppo.reward import load_reward_manager from verl.utils.device import is_cuda_available - from astuner.utils.core_env_vars import get_runtime_env - +from astuner.utils.launch_utils import set_loguru_default_color +set_loguru_default_color() @hydra.main(config_path="config", config_name="ppo_trainer", version_base=None) def main(config): diff --git a/astuner/main_vllm.py b/astuner/main_vllm.py index 8504aaa5..c296e775 100644 --- a/astuner/main_vllm.py +++ b/astuner/main_vllm.py @@ -1,14 +1,14 @@ import atexit import os import sys -from types import SimpleNamespace - import hydra -from openai import OpenAI +from types import SimpleNamespace +from openai import OpenAI from astuner.backbone.warm_up import warm_up_process from astuner.task_rollout.native_parallel_worker import VerlRolloutManager - +from astuner.utils.launch_utils import set_loguru_default_color +set_loguru_default_color() class TokenAndProb: def __init__(self, t): diff --git a/astuner/utils/config_utils.py b/astuner/utils/config_utils.py index abb6dca8..efe291a8 100644 --- a/astuner/utils/config_utils.py +++ b/astuner/utils/config_utils.py @@ -4,7 +4,7 @@ from functools import cache import yaml -from best_logger import print_dict +from beast_logger import print_dict from hydra import compose, initialize from loguru import logger from omegaconf import DictConfig diff --git a/astuner/utils/launch_utils.py b/astuner/utils/launch_utils.py index 0355324f..ae588923 100644 --- a/astuner/utils/launch_utils.py +++ b/astuner/utils/launch_utils.py @@ -10,6 +10,13 @@ from astuner.utils.config_utils import align_parameters from astuner.utils.smart_daemon import LaunchCommandWhenAbsent +def set_loguru_default_color(): + logger.remove() + colorize = os.environ.get("LOGURU_COLORIZE", "YES").upper() not in ["NO", "0", "FALSE"] + logger.add(sys.stderr, colorize=colorize, enqueue=False) + if not colorize: + os.environ["RAY_COLOR_PREFIX"] = "0" + return def launch_logview(exp_name=None): """ @@ -183,3 +190,4 @@ def execute_training_process( except Exception as e: logger.error(f"Unexpected error: {e}") sys.exit(1) + diff --git a/astuner/utils/logger.py b/astuner/utils/logger.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pyproject.toml b/pyproject.toml index 76d36186..2057fd3b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "swanlab", "modelscope>=1.18.1", "pydantic", - "beast_logger", + "beast-logger>=0.1.3", "pytest>=8.0.0", ] diff --git a/tests/bench/README.md b/tests/bench/README.md new file mode 100644 index 00000000..9c697e95 --- /dev/null +++ b/tests/bench/README.md @@ -0,0 +1,5 @@ +Note: `tests/bench` source code is for test robot only, therefore `yaml` configurations will contain dataset files stored in benchmarking-docker-image. + +To get these dataset files, please refer to `tutorial/*`. + +To get benchmarking-docker-image, benchmarking-docker-image will be released soon. diff --git a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py index 08f6d15d..30404db3 100644 --- a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py @@ -3,15 +3,12 @@ import time import unittest -from beast_logger import print_dict from loguru import logger -from astuner.utils.dynamic_import import dynamic_import -from astuner.utils.smart_daemon import LaunchCommandWhenAbsent -from astuner.utils.testing_utils import populate_test_env_metadata, send_test_result +from tests.bench.benchmark_base import BenchmarkTestCase -class TestBenchmarkAppworld(unittest.TestCase): +class TestBenchmarkAppworld(BenchmarkTestCase): def test_01_begin_verl(self): # get probe target, so as to get timeout settings BACKBONE = "verl" @@ -21,12 +18,18 @@ def test_01_begin_verl(self): # tests/bench/benchmark_appworld/benchmark_appworld.yaml TARGET_NAME = f"benchmark_appworld_{BACKBONE}" PYTHON_EXECUTABLE = ".verl/bin/python" + multi_nodes = True + self.execute_benchmark( - BACKBONE=BACKBONE, - TEST_TARGET=TEST_TARGET, - PROBE_TARGET=PROBE_TARGET, - TARGET_NAME=TARGET_NAME, - PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, + extra_cmd_args=["--with-appworld"], + pre_launch=self.install_appworld, + use_ray_cluster=multi_nodes, + enable_ray_for_trinity=not multi_nodes, ) def test_02_begin_trinity(self): @@ -36,94 +39,18 @@ def test_02_begin_trinity(self): PROBE_TARGET = "tests/bench/benchmark_appworld/benchmark_appworld.py->TestProbe" TARGET_NAME = f"benchmark_appworld_{BACKBONE}" PYTHON_EXECUTABLE = ".venv/bin/python" - self.execute_benchmark( - BACKBONE=BACKBONE, - TEST_TARGET=TEST_TARGET, - PROBE_TARGET=PROBE_TARGET, - TARGET_NAME=TARGET_NAME, - PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, - ) - - def execute_benchmark( - self, BACKBONE, TEST_TARGET, PROBE_TARGET, TARGET_NAME, PYTHON_EXECUTABLE, MULTI_NODES=True - ): - cur_dir = os.path.dirname(__file__) - workspace_dir = os.path.abspath(os.path.join(cur_dir, "../../..")) - - git_hash, req_txt = populate_test_env_metadata(workspace_dir) - os.environ["ASTUNER_GIT_HASH"] = git_hash - os.environ["ASTUNER_REQ_TXT"] = req_txt - os.environ["ASTUNER_BENCHMARK_NAME"] = TARGET_NAME - - self.install_appworld() - - send_test_result( - git_hash=git_hash, - target=TARGET_NAME, - status="running", - status_detail="", # - req_txt=req_txt, # get pip freeze - append_log="", - data_dashboard_url="", - timeout=10.0, - ) - timeout_seconds = ( - dynamic_import(PROBE_TARGET)().expected_train_time + 600 - ) # add buffer time - cmd = [ - PYTHON_EXECUTABLE, - "-m", - "astuner.cli.launcher", - "--conf", - TEST_TARGET, - "--backbone", - BACKBONE, - "--with-appworld", - "--autokill", - ] - - if BACKBONE == "trinity" and (not MULTI_NODES): - cmd += ["--with-ray"] - if MULTI_NODES: - cmd += ["--with-ray-cluster"] - - companion = LaunchCommandWhenAbsent( - full_argument_list=cmd, - dir=workspace_dir, - tag=TARGET_NAME, - ) + multi_nodes = True - test_successful = False - terminate_str = companion.launch( - launch_wait_time=timeout_seconds, - success_std_string=[ - "TestSuccessException", - "TestFailException", - "You can force stop the `Trainer` process by pressing Ctrl+C", - "torch.OutOfMemoryError: CUDA out of memory", - ], - env_dict=os.environ, - force_restart=True, - ) - test_successful = True - companion.kill_self() - if terminate_str == "TestSuccessException": - test_successful = True - elif terminate_str == "TestFailException": - test_successful = False - raise RuntimeError("Benchmark test failed during execution.") - elif terminate_str == "You can force stop the `Trainer` process by pressing Ctrl+C": - test_successful = False - raise RuntimeError("Unknown trinity exception.") - else: - test_successful = False - raise RuntimeError(f"Benchmark test timed out or crashed. {test_successful}") - - print_dict( - { - "TestTarget": TEST_TARGET, - "TestSuccessful": test_successful, - } + self.execute_benchmark( + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, + extra_cmd_args=["--with-appworld"], + pre_launch=self.install_appworld, + use_ray_cluster=multi_nodes, + enable_ray_for_trinity=not multi_nodes, ) def clear_system_processes(self): diff --git a/tests/bench/benchmark_base.py b/tests/bench/benchmark_base.py new file mode 100644 index 00000000..57cb987a --- /dev/null +++ b/tests/bench/benchmark_base.py @@ -0,0 +1,105 @@ +import os +import unittest +from pathlib import Path +from typing import Callable, List, Optional + +from beast_logger import print_dict + +from astuner.utils.dynamic_import import dynamic_import +from astuner.utils.smart_daemon import LaunchCommandWhenAbsent +from astuner.utils.testing_utils import populate_test_env_metadata, send_test_result + + +class BenchmarkTestCase(unittest.TestCase): + def execute_benchmark( + self, + *, + backbone: str, + test_target: str, + probe_target: str, + target_name: str, + python_executable: str, + extra_cmd_args: Optional[List[str]] = None, + pre_launch: Optional[Callable[[], None]] = None, + use_ray_cluster: bool = False, + enable_ray_for_trinity: bool = True, + ) -> None: + """Run a benchmark with shared boilerplate for setup and process management.""" + workspace_dir = Path(__file__).resolve().parents[2] + + git_hash, req_txt = populate_test_env_metadata(str(workspace_dir)) + os.environ["ASTUNER_GIT_HASH"] = git_hash + os.environ["ASTUNER_REQ_TXT"] = req_txt + os.environ["ASTUNER_BENCHMARK_NAME"] = target_name + + if pre_launch: + pre_launch() + + send_test_result( + git_hash=git_hash, + target=target_name, + status="running", + status_detail="", + req_txt=req_txt, + append_log="", + data_dashboard_url="", + timeout=10.0, + ) + + timeout_seconds = dynamic_import(probe_target)().expected_train_time + 600 + + cmd = [ + python_executable, + "-m", + "astuner.cli.launcher", + "--conf", + test_target, + "--backbone", + backbone, + "--autokill", + ] + if extra_cmd_args: + cmd += extra_cmd_args + if use_ray_cluster: + cmd += ["--with-ray-cluster"] + elif enable_ray_for_trinity and backbone == "trinity": + cmd += ["--with-ray"] + + companion = LaunchCommandWhenAbsent( + full_argument_list=cmd, + dir=str(workspace_dir), + tag=target_name, + ) + + test_successful = False + terminate_str = companion.launch( + launch_wait_time=timeout_seconds, + success_std_string=[ + "TestSuccessException", + "TestFailException", + "You can force stop the `Trainer` process by pressing Ctrl+C", + "torch.OutOfMemoryError: CUDA out of memory", + ], + env_dict=os.environ, + force_restart=True, + ) + test_successful = True + companion.kill_self() + if terminate_str == "TestSuccessException": + test_successful = True + elif terminate_str == "TestFailException": + test_successful = False + raise RuntimeError("Benchmark test failed during execution.") + elif terminate_str == "You can force stop the `Trainer` process by pressing Ctrl+C": + test_successful = False + raise RuntimeError("Unknown trinity exception.") + else: + test_successful = False + raise RuntimeError(f"Benchmark test timed out or crashed. {test_successful}") + + print_dict( + { + "TestTarget": test_target, + "TestSuccessful": test_successful, + } + ) diff --git a/tests/bench/benchmark_countdown/execute_benchmark_countdown.py b/tests/bench/benchmark_countdown/execute_benchmark_countdown.py index 707828cd..78adbd4d 100644 --- a/tests/bench/benchmark_countdown/execute_benchmark_countdown.py +++ b/tests/bench/benchmark_countdown/execute_benchmark_countdown.py @@ -1,14 +1,9 @@ -import os import unittest -from beast_logger import print_dict +from tests.bench.benchmark_base import BenchmarkTestCase -from astuner.utils.dynamic_import import dynamic_import -from astuner.utils.smart_daemon import LaunchCommandWhenAbsent -from astuner.utils.testing_utils import populate_test_env_metadata, send_test_result - -class TestBenchmarkCountdown(unittest.TestCase): +class TestBenchmarkCountdown(BenchmarkTestCase, unittest.TestCase): def test_01_begin_verl(self): BACKBONE = "verl" TEST_TARGET = "tests/bench/benchmark_countdown/benchmark_countdown.yaml" @@ -16,11 +11,11 @@ def test_01_begin_verl(self): TARGET_NAME = f"benchmark_countdown_{BACKBONE}" PYTHON_EXECUTABLE = ".verl/bin/python" self.execute_benchmark( - BACKBONE=BACKBONE, - TEST_TARGET=TEST_TARGET, - PROBE_TARGET=PROBE_TARGET, - TARGET_NAME=TARGET_NAME, - PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, ) def test_02_begin_trinity(self): @@ -30,82 +25,9 @@ def test_02_begin_trinity(self): TARGET_NAME = f"benchmark_countdown_{BACKBONE}" PYTHON_EXECUTABLE = ".venv/bin/python" self.execute_benchmark( - BACKBONE=BACKBONE, - TEST_TARGET=TEST_TARGET, - PROBE_TARGET=PROBE_TARGET, - TARGET_NAME=TARGET_NAME, - PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, - ) - - def execute_benchmark( - self, BACKBONE, TEST_TARGET, PROBE_TARGET, TARGET_NAME, PYTHON_EXECUTABLE - ): - cur_dir = os.path.dirname(__file__) - workspace_dir = os.path.abspath(os.path.join(cur_dir, "../../..")) - - git_hash, req_txt = populate_test_env_metadata(workspace_dir) - os.environ["ASTUNER_GIT_HASH"] = git_hash - os.environ["ASTUNER_REQ_TXT"] = req_txt - os.environ["ASTUNER_BENCHMARK_NAME"] = TARGET_NAME - - send_test_result( - git_hash=git_hash, - target=TARGET_NAME, - status="running", - status_detail="", - req_txt=req_txt, - append_log="", - data_dashboard_url="", - timeout=10.0, - ) - timeout_seconds = dynamic_import(PROBE_TARGET)().expected_train_time + 600 - cmd = [ - PYTHON_EXECUTABLE, - "-m", - "astuner.cli.launcher", - "--conf", - TEST_TARGET, - "--backbone", - BACKBONE, - "--autokill", - ] - if BACKBONE == "trinity": - cmd += ["--with-ray"] - companion = LaunchCommandWhenAbsent( - full_argument_list=cmd, - dir=workspace_dir, - tag=TARGET_NAME, - ) - - test_successful = False - terminate_str = companion.launch( - launch_wait_time=timeout_seconds, - success_std_string=[ - "TestSuccessException", - "TestFailException", - "You can force stop the `Trainer` process by pressing Ctrl+C", - "torch.OutOfMemoryError: CUDA out of memory", - ], - env_dict=os.environ, - force_restart=True, - ) - test_successful = True - companion.kill_self() - if terminate_str == "TestSuccessException": - test_successful = True - elif terminate_str == "TestFailException": - test_successful = False - raise RuntimeError("Benchmark test failed during execution.") - elif terminate_str == "You can force stop the `Trainer` process by pressing Ctrl+C": - test_successful = False - raise RuntimeError("Unknown trinity exception.") - else: - test_successful = False - raise RuntimeError(f"Benchmark test timed out or crashed. {test_successful}") - - print_dict( - { - "TestTarget": TEST_TARGET, - "TestSuccessful": test_successful, - } + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, ) diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py new file mode 100644 index 00000000..7ad3dc1e --- /dev/null +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py @@ -0,0 +1,29 @@ +# flake8: noqa +import time + +from astuner.utils.testing_utils import BenchmarkProbe, singleton + + +@singleton +class TestProbe(BenchmarkProbe): + def __init__(self): + # fmt: off + self.expected_train_time = 3600 * 12 # 12 hours budget for frozenlake easy benchmark + self.begin_time = time.time() + self.reward_array = [] + self.reward_expectation_avg_window = 5 + self.reward_expectation = { + # step : expected local average reward range + # step : [low, high ] + 5 : [0.0, 99999.0], + 10 : [0.0, 99999.0], + 15 : [0.0, 99999.0], + 20 : [0.0, 99999.0], + } + # fmt: on + self.probe_list = ["reward_probe"] + self.reward_key = "reward_for_test_robot" + self.probe_key = "reward_probe" + + def __call__(self, key, log_dict): + return super().__call__(key, log_dict) diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml new file mode 100644 index 00000000..e2494b8e --- /dev/null +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml @@ -0,0 +1,96 @@ +# ------------------ main config ------------------ +astuner: + project_name: benchmarking + + task_reader: + type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` + + task_judge: + # ✨✨✨✨ select evaluation function + judge_protocol: null + + model: + # ✨✨✨✨ select model to be trained + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-3B-Instruct + + + rollout: + # the path to the workflow class + agentscope_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow + agentscope_disable_toolcalls: True + + temperature: 0.9 + + max_env_worker: 512 + + num_repeat: 4 + + agent_madness_reward: 0.0 + + tensor_model_parallel_size: 1 + + # the number of vllm engines, number of gpus for infer is `n_vllm_engine*tensor_model_parallel_size`, this argument is NOT effective when NOT using trinity + n_vllm_engine: 4 + + mode: async + + max_num_seqs: 40 + + # monitor LLM's abormal behaviors during rollout + compute_madness_checklist: [] + + max_response_length_in_one_turn: 512 + + max_model_len: 22000 + + multi_turn: + # how many samples should be collected for each task run + max_sample_per_task: 20 + # limit the maximum steps for each task + max_steps: 20 + # the expected steps for each task, used to calculate the training batch size for trinity + expected_steps: 1 + + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + data: + train_batch_size: 128 + max_prompt_length: 4000 + max_response_length: 18000 + + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + total_training_steps: 25 + nnodes: 1 + n_gpus_per_node: 8 + logger: swanlab + + + execute_test: True + execute_testing_lambda: "tests/bench/benchmark_frozenlake/benchmark_frozenlake.py->TestProbe" + + +frozen_lake: + frozen_lake_size: 4 + is_slippery: False + + + +# ------------------ do not edit ------------------ +hydra: + searchpath: + - file://astuner/default_config + - file://astuner/default_config/verl # verl only + - file://astuner/default_config/trinity # trinity only + +# ------------------ do not edit ------------------ +defaults: + - verl_default # verl inherit 1/1 + - trinity_default # trinity inherit 1/1 + - astune_default + - _self_ diff --git a/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py b/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py new file mode 100644 index 00000000..fe78de4a --- /dev/null +++ b/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py @@ -0,0 +1,33 @@ +import unittest + +from tests.bench.benchmark_base import BenchmarkTestCase + + +class TestBenchmarkFrozenLake(BenchmarkTestCase): + def test_01_begin_trinity(self): + BACKBONE = "trinity" + TEST_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml" + PROBE_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.py->TestProbe" + TARGET_NAME = f"benchmark_frozenlake_{BACKBONE}" + PYTHON_EXECUTABLE = ".venv/bin/python" + self.execute_benchmark( + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, + ) + + def test_02_begin_verl(self): + BACKBONE = "verl" + TEST_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml" + PROBE_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.py->TestProbe" + TARGET_NAME = f"benchmark_frozenlake_{BACKBONE}" + PYTHON_EXECUTABLE = ".verl/bin/python" + self.execute_benchmark( + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, + ) diff --git a/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py b/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py index c578d52d..71bc0013 100644 --- a/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py +++ b/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py @@ -1,14 +1,9 @@ -import os import unittest -from beast_logger import print_dict +from tests.bench.benchmark_base import BenchmarkTestCase -from astuner.utils.dynamic_import import dynamic_import -from astuner.utils.smart_daemon import LaunchCommandWhenAbsent -from astuner.utils.testing_utils import populate_test_env_metadata, send_test_result - -class TestBenchmarkLearnToAsk(unittest.TestCase): +class TestBenchmarkLearnToAsk(BenchmarkTestCase): def test_01_begin_trinity(self): # get probe target, so as to get timeout settings BACKBONE = "trinity" @@ -18,11 +13,11 @@ def test_01_begin_trinity(self): # PYTHON_EXECUTABLE = "python" PYTHON_EXECUTABLE = ".venv/bin/python" self.execute_benchmark( - BACKBONE=BACKBONE, - TEST_TARGET=TEST_TARGET, - PROBE_TARGET=PROBE_TARGET, - TARGET_NAME=TARGET_NAME, - PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, ) def test_02_begin_verl(self): @@ -34,85 +29,9 @@ def test_02_begin_verl(self): # PYTHON_EXECUTABLE = "python" PYTHON_EXECUTABLE = ".verl/bin/python" self.execute_benchmark( - BACKBONE=BACKBONE, - TEST_TARGET=TEST_TARGET, - PROBE_TARGET=PROBE_TARGET, - TARGET_NAME=TARGET_NAME, - PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, - ) - - def execute_benchmark( - self, BACKBONE, TEST_TARGET, PROBE_TARGET, TARGET_NAME, PYTHON_EXECUTABLE - ): - cur_dir = os.path.dirname(__file__) - workspace_dir = os.path.abspath(os.path.join(cur_dir, "../../..")) - - - git_hash, req_txt = populate_test_env_metadata(workspace_dir) - os.environ["ASTUNER_GIT_HASH"] = git_hash - os.environ["ASTUNER_REQ_TXT"] = req_txt - os.environ["ASTUNER_BENCHMARK_NAME"] = TARGET_NAME - - send_test_result( - git_hash=git_hash, - target=TARGET_NAME, - status="running", - status_detail="", # - req_txt=req_txt, # get pip freeze - append_log="", - data_dashboard_url="", - timeout=10.0, - ) - timeout_seconds = ( - dynamic_import(PROBE_TARGET)().expected_train_time + 600 - ) # add buffer time - cmd = [ - PYTHON_EXECUTABLE, - "-m", - "astuner.cli.launcher", - "--conf", - TEST_TARGET, - "--backbone", - BACKBONE, - "--autokill", # this breaks remote vscode server - ] - if BACKBONE == "trinity": - cmd += ["--with-ray"] - companion = LaunchCommandWhenAbsent( - full_argument_list=cmd, - dir=workspace_dir, - tag=TARGET_NAME, - ) - - test_successful = False - terminate_str = companion.launch( - launch_wait_time=timeout_seconds, - success_std_string=[ - "TestSuccessException", - "TestFailException", - "You can force stop the `Trainer` process by pressing Ctrl+C", - "torch.OutOfMemoryError: CUDA out of memory", - ], - env_dict=os.environ, - force_restart=True, - ) - test_successful = True - companion.kill_self() - if terminate_str == "TestSuccessException": - test_successful = True - elif terminate_str == "TestFailException": - test_successful = False - raise RuntimeError("Benchmark test failed during execution.") - elif terminate_str == "You can force stop the `Trainer` process by pressing Ctrl+C": - test_successful = False - raise RuntimeError("Unknown trinity exception.") - else: - test_successful = False - raise RuntimeError(f"Benchmark test timed out or crashed. {test_successful}") - - print_dict( - { - "TestTarget": TEST_TARGET, - "TestSuccessful": test_successful, - } + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, ) diff --git a/tests/bench/benchmark_math/execute_benchmark_math.py b/tests/bench/benchmark_math/execute_benchmark_math.py index 9d0d4ccb..2c6c42cd 100644 --- a/tests/bench/benchmark_math/execute_benchmark_math.py +++ b/tests/bench/benchmark_math/execute_benchmark_math.py @@ -1,14 +1,9 @@ -import os import unittest -from beast_logger import print_dict +from tests.bench.benchmark_base import BenchmarkTestCase -from astuner.utils.dynamic_import import dynamic_import -from astuner.utils.smart_daemon import LaunchCommandWhenAbsent -from astuner.utils.testing_utils import populate_test_env_metadata, send_test_result - -class TestBenchmarkMath(unittest.TestCase): +class TestBenchmarkMath(BenchmarkTestCase): def test_begin_trinity(self): # get probe target, so as to get timeout settings BACKBONE = "trinity" @@ -17,11 +12,11 @@ def test_begin_trinity(self): TARGET_NAME = f"benchmark_math_{BACKBONE}" PYTHON_EXECUTABLE = ".venv/bin/python" self.execute_benchmark( - BACKBONE=BACKBONE, - TEST_TARGET=TEST_TARGET, - PROBE_TARGET=PROBE_TARGET, - TARGET_NAME=TARGET_NAME, - PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, ) # def test_begin_verl(self): @@ -39,77 +34,3 @@ def test_begin_trinity(self): # PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, # ) - def execute_benchmark( - self, BACKBONE, TEST_TARGET, PROBE_TARGET, TARGET_NAME, PYTHON_EXECUTABLE - ): - cur_dir = os.path.dirname(__file__) - workspace_dir = os.path.abspath(os.path.join(cur_dir, "../../..")) - - git_hash, req_txt = populate_test_env_metadata(workspace_dir) - os.environ["ASTUNER_GIT_HASH"] = git_hash - os.environ["ASTUNER_REQ_TXT"] = req_txt - os.environ["ASTUNER_BENCHMARK_NAME"] = TARGET_NAME - - send_test_result( - git_hash=git_hash, - target=TARGET_NAME, - status="running", - status_detail="", # - req_txt=req_txt, # get pip freeze - append_log="", - data_dashboard_url="", - timeout=10.0, - ) - timeout_seconds = ( - dynamic_import(PROBE_TARGET)().expected_train_time + 600 - ) # add buffer time - cmd = [ - PYTHON_EXECUTABLE, - "-m", - "astuner.cli.launcher", - "--conf", - TEST_TARGET, - "--backbone", - BACKBONE, - "--autokill", - ] - if BACKBONE == "trinity": - cmd += ["--with-ray"] - companion = LaunchCommandWhenAbsent( - full_argument_list=cmd, - dir=workspace_dir, - tag=TARGET_NAME, - ) - - test_successful = False - terminate_str = companion.launch( - launch_wait_time=timeout_seconds, - success_std_string=[ - "TestSuccessException", - "TestFailException", - "You can force stop the `Trainer` process by pressing Ctrl+C", - "torch.OutOfMemoryError: CUDA out of memory", - ], - env_dict=os.environ, - force_restart=True, - ) - test_successful = True - companion.kill_self() - if terminate_str == "TestSuccessException": - test_successful = True - elif terminate_str == "TestFailException": - test_successful = False - raise RuntimeError("Benchmark test failed during execution.") - elif terminate_str == "You can force stop the `Trainer` process by pressing Ctrl+C": - test_successful = False - raise RuntimeError("Unknown trinity exception.") - else: - test_successful = False - raise RuntimeError(f"Benchmark test timed out or crashed. {test_successful}") - - print_dict( - { - "TestTarget": TEST_TARGET, - "TestSuccessful": test_successful, - } - ) From 569e44ef57023c4602ce0b0430ba064b8fe00ef0 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 01:27:16 +0800 Subject: [PATCH 324/462] feat: add main_verl and main_vllm scripts for PPO training and chat completion scheduling fix: update launcher to reference new backbone modules docs: correct comments to reflect new file paths in async_llm_bridge --- astuner/{ => backbone}/main_verl.py | 0 astuner/{ => backbone}/main_vllm.py | 0 astuner/cli/launcher.py | 4 ++-- astuner/task_rollout/async_llm_bridge.py | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename astuner/{ => backbone}/main_verl.py (100%) rename astuner/{ => backbone}/main_vllm.py (100%) diff --git a/astuner/main_verl.py b/astuner/backbone/main_verl.py similarity index 100% rename from astuner/main_verl.py rename to astuner/backbone/main_verl.py diff --git a/astuner/main_vllm.py b/astuner/backbone/main_vllm.py similarity index 100% rename from astuner/main_vllm.py rename to astuner/backbone/main_vllm.py diff --git a/astuner/cli/launcher.py b/astuner/cli/launcher.py index 5bbfc751..1508785b 100644 --- a/astuner/cli/launcher.py +++ b/astuner/cli/launcher.py @@ -191,9 +191,9 @@ def get_backbone_target(backbone): """ backbone_target = "astuner.backbone.main_trinity" # Default to trinity if backbone == "verl": - backbone_target = "astuner.main_verl" + backbone_target = "astuner.backbone.main_verl" if backbone == "debug": - backbone_target = "astuner.main_vllm" + backbone_target = "astuner.backbone.main_vllm" if backbone == "trinity": backbone_target = "astuner.backbone.main_trinity" return backbone_target diff --git a/astuner/task_rollout/async_llm_bridge.py b/astuner/task_rollout/async_llm_bridge.py index 6b00438a..97372cbb 100644 --- a/astuner/task_rollout/async_llm_bridge.py +++ b/astuner/task_rollout/async_llm_bridge.py @@ -148,7 +148,7 @@ def llm_chat_remote( input_messages = copy.deepcopy(messages) for i in range(self.max_llm_retries): try: - # this function is defined in `astuner/main_vllm.py` + # this function is defined in `astuner/backbone/main_vllm.py` output_message = self.async_rollout_manager.submit_chat_completions( messages=input_messages, sampling_params=updated_sampling_params, From cef0c3e46a24a3bec7df41be845f24cd5f9a91b8 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 10:34:34 +0800 Subject: [PATCH 325/462] remove classic runner --- astuner/task_rollout/single_worker.py | 8 +- astuner/task_runner/classic_runner.py | 129 -------------------------- 2 files changed, 2 insertions(+), 135 deletions(-) delete mode 100644 astuner/task_runner/classic_runner.py diff --git a/astuner/task_rollout/single_worker.py b/astuner/task_rollout/single_worker.py index 451e2d85..ce2e057e 100644 --- a/astuner/task_rollout/single_worker.py +++ b/astuner/task_rollout/single_worker.py @@ -12,7 +12,6 @@ from astuner.task_rollout.async_llm_bridge import AsyncLlmBridge from astuner.task_rollout.resource_keeper import ResourceKeeper from astuner.task_runner.agentscope_runner import AgentScopeRunner -from astuner.task_runner.classic_runner import AgentRunner from astuner.utils.retry import retry_with_backoff from astuner.utils.sample import get_sample_params from astuner.utils.testing_utils import TestFailException, TestSuccessException @@ -102,12 +101,9 @@ def rollout_env_worker( with ResourceKeeper(workflow_task, config=self.config) as resource_keeper: try: workflow_task = resource_keeper.prepare() - Runner = ( - AgentScopeRunner - ) - agent_runner: AgentScopeRunner = Runner( + agent_runner = AgentScopeRunner( llm_inference_fn=llm_inference_fn, tokenizer=self.tokenizer, config=self.config - ) # type:ignore + ) tracker = agent_runner.execute( workflow_task=workflow_task, ) diff --git a/astuner/task_runner/classic_runner.py b/astuner/task_runner/classic_runner.py deleted file mode 100644 index 95292033..00000000 --- a/astuner/task_runner/classic_runner.py +++ /dev/null @@ -1,129 +0,0 @@ -from beast_logger import print_listofdict -from loguru import logger - -from astuner.context_tracker.basic_tracker import BaseContextTracker -from astuner.schema.trajectory import Reward -from astuner.utils.utils import convert_tool_to_user_message -from .base_runner import BaseAgentRunner - - -class AgentRunner(BaseAgentRunner): - def __init__(self, **kwargs): - super().__init__(**kwargs) - - def execute(self, workflow_task) -> BaseContextTracker: - observation_window = workflow_task.observation_window - task_thread_index = workflow_task.task_thread_index - init_messages = workflow_task.init_messages - env = workflow_task.gym_env - - # 1. 🚀 Initialize messages - if self.config.astuner.context_tracker.context_tracker_type == "linear": - self.tracker = BaseContextTracker(self.config, self.tokenizer) - else: - raise ValueError( - f"Unsupported context template: {self.config.astuner.context_tracker.context_tracker_type}" - ) - - add_nothink = False - self.tracker.save_init_input(init_messages, add_nothink) - - request_id: str = "" - for act_step in range(self.max_steps): - # 2. 🔄 Update thread progress - observation_window["step"][task_thread_index] = act_step - if (observation_window["stop"] is not None) and observation_window["stop"][ - task_thread_index - ]: # Check if the thread should observation_window['stop'] (because other threads have completed, making this thread useless) - self.tracker.discarded = True - break - - # 3. ⏮️ get previous steps - try: - step_input_message_arr = self.tracker.prepare_next_llm_context() - except Exception as e: - print_listofdict( - self.tracker.to_role_content(self.tracker.full_context), - mod="exception", - header="Before Crash", - ) - raise e - - # 4. ⚠️ check token overflow - is_safe, token_overflow, info = self.tracker.check_context_token_num_safe( - step_input_message_arr - ) - if not is_safe: - logger.warning( - f"[{info}] detected at step {act_step}. Current token count exceeds the limit." - ) - self.tracker.is_terminated = True - break - - # 5. 🤖 call llm - llm_output = self.llm_inference_fn(step_input_message_arr, request_id=request_id) - if (observation_window["stop"] is not None) and observation_window["stop"][ - task_thread_index - ]: # Check if the thread should observation_window['stop'] (because other threads have completed, making this thread useless) - self.tracker.discarded = True - break - - # 6. 💾 save llm output - self.tracker.save_llm_output(llm_output, input_msg_ref=step_input_message_arr) - observation_window["token"][task_thread_index] += self.tracker.generated_token_cnt - - # 7. 🌍 world interaction - try: - env_output = env.step( - instance_id=workflow_task.task_env_uuid, - action={ - "content": self.tracker.prepare_world_interaction(), - "role": "assistant", - }, - params={"step_skip_action": self.config.astuner.rollout.step_skip_action}, - ) - if env_output["state"]["role"] == "tool": - env_output["state"] = convert_tool_to_user_message( - env_output["state"], self.tokenizer, format="qwen" - ) - except Exception as e: - logger.bind(exception=True).exception(f"call env.step error with {e}") - self.tracker.is_terminated = True - state = {"content": str(e), "role": "user"} - env_output = { - "reward": 0, - "is_terminated": True, - "state": state, - } - - # 8. 📥 save environment output - state = env_output["state"] - state.pop("tool_calls", None) # type: ignore - self.tracker.save_env_output(state, input_msg_ref=step_input_message_arr, add_nothink=add_nothink) # type: ignore - self.tracker.round_cnt += 1 - - # 9. 🔚 determine if the episode is terminated - self.tracker.is_terminated = env_output["is_terminated"] - if self.tracker.is_terminated: - break - - observation_window["step"][task_thread_index] = -1 - raw_reward = 0 - raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) - if raw_reward >= 1: - success_rate = 1.0 - else: - success_rate = 0.0 - - # TODO: support multi-step reward - self.tracker.process_reward( - reward_structure=Reward( - raw_reward=raw_reward, - raw_step_reward=None, # we do not support step reward yet - success_rate=success_rate, - madness=0, - description="Success=1, Failure=0", - ) - ) - self.tracker.remove_last_context() - return self.tracker From 319a52c08bcc1efefee60370fc8e839bfedab52a Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Wed, 24 Dec 2025 10:38:14 +0800 Subject: [PATCH 326/462] docs: update introduction --- docs/en/introduction.md | 5 +- docs/zh/installation.md | 137 +++++++++++++++++++++++----------------- docs/zh/introduction.md | 115 ++++++++++++++++++--------------- 3 files changed, 143 insertions(+), 114 deletions(-) diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 54fcae85..aeccead9 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -13,7 +13,7 @@ We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities - **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. -- **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a timeline merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. ASTuner supports [multi-agent workflows](./workflow.md) and adopts a timeline merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: @@ -48,12 +48,11 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir #### Run Training -You can start training your first agent with a single command using a pre-configured YAML file: +You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](./example_math_agent.md) as an example: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -Details in [Math agent](./example_math_agent.md) #### Example Library diff --git a/docs/zh/installation.md b/docs/zh/installation.md index 556e54de..e3771c79 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -1,94 +1,113 @@ -# 安装指南 +# 项目简介 -```{tip} -AgentScope Tuner 正在积极开发和迭代中。我们建议从源码安装,以获取最新功能和修复。 -``` +**AgentScope Tuner (ASTuner)** 是一款领先且易用的训练框架,专为优化 AgentScope 中的 Agent 和工作流(Workflow)而设计,能够自动微调后台大语言模型的权重。 + +只需提供您的 AgentScope 工作流、训练数据以及奖励函数(Reward Function),ASTuner 即可助力您的 Agent 达到最佳性能状态! + +--- + +### ✨ 特性 + +我们致力于构建一个简单易学的 AgentScope 微调器,为 Agent 开发者开启更多可能性: + +* **简单友好**:ASTuner 帮助您轻松微调 Agent 工作流背后的模型,以极小的开发成本实现 Agent 性能的飞跃。 +* **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 +* **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更偏好 Actor 共位置部署,也可以切换至 [verl](./installation.md) 后端。 +* **灵活且快速**:ASTuner 支持 [多 Agent 工作流](docs/en/workflow.md),并采用了时间线合并技术(Timeline Merging),在涉及多轮或多 Agent 对话的工作流中,可将训练速度提升 1.5 倍至 20 倍。 +* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 + +针对资深研究人员,ASTuner 还提供了高分辨率的日志记录和调试方案: + +* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Loss Mask 甚至 Token Logprobs,以便进行工作流开发和 Agent 诊断。 +* **快速调试**:ASTuner 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 -## 安装前提 +--- -- Python 3.10 至 3.12 -- CUDA 12.8 或更高版本 +### 🚀 快速上手 -## 源码安装 +#### 安装 -### 步骤 1:克隆仓库 +我们推荐使用 `uv` 进行依赖管理。 -首先,从 GitHub 克隆 AgentScope Tuner 仓库并进入项目目录: +1. **克隆仓库**: ```bash git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner -``` - -### 步骤 2:安装依赖 -#### LLM 训练新手用户 +``` -如果你是 LLM 训练和环境配置的新手,建议使用 Docker 简化安装流程。 +2. **配置环境**: -在继续之前,请确保你的系统已安装 Docker,并已经安装了 Nvidia GPU 相关支持。 +```bash +uv venv --python=3.10.16 && source .venv/bin/activate +uv pip install -e .[trinity] +# 注意:flash-attn 必须在其他依赖安装完成后安装 +uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir -你可以直接下载我们的镜像,或在本地构建。 +``` -##### 选项 1:下载预构建的镜像 +#### 运行训练 -可以使用以下命令拉取预构建的镜像: +您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 Agent: ```bash -docker pull ghcr.io/agentscope-ai/agentscope-tuner:latest +astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray + ``` -##### 选项 2:本地构建 Docker 镜像 +详情请参阅 [数学 Agent 示例](./example_math_agent.md) -我们提供了 Dockerfile,用于搭建 AgentScope Tuner 所需环境。 +#### 示例库 -可使用以下命令构建 Docker 镜像: +探索我们丰富的示例库,开启您的开发之旅: -```bash -# 请确保你在 agentscope-tuner 根目录下 -docker build -f scripts/docker/dockerfile -t agentscope-tuner:latest . -``` +* 🔢 **[训练一个能编写 Python 代码的数学 Agent](./example_math_agent.md)**。 +* 📱 **[使用 AgentScope 创建并训练 AppWorld Agent](./example_app_world.md)**。 +* 🐺 **[开发并训练“狼人杀”RPG Agent](./example_werewolves.md)**。 +* 👩🏻‍⚕️ **[学习像医生一样进行问诊](./example_learning_to_ask.md)**。 +* 🎴 **[使用 AgentScope 编写并解决“倒计时”游戏](./example_countdown.md)**. +* 🚶 **[使用 ASTuner 解决“冰湖”行走谜题](./example_frozenlake.md)**。 -##### 运行 Docker 容器 +--- -镜像拉取或构建完成后,可用以下命令运行容器。请将 `/path/to/your/checkpoint/and/data` 替换为你实际存放模型检查点和数据的路径。 -该命令会将你当前工作目录(agentscope-tuner 根目录)挂载到容器内的 `/workspace`,并将数据目录挂载到 `/data`。 +### 🧩 核心概念 -```bash -docker run -it \ - --gpus all \ - --shm-size="64g" \ - --rm \ - -v $PWD:/workspace \ - -v /path/to/your/checkpoint/and/data:/data \ - agentscope-tuner:latest -``` +ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调变得简单直观。 -#### 熟悉 LLM 训练的用户 +
+image -推荐使用 `uv` 管理你的 Python 环境。 +
-如果尚未安装 `uv`,可通过 pip 安装: +#### 1. 以用户为中心的接口 -```bash -pip install uv -uv venv --python=3.10.16 -``` +为了优化 Agent,您需要提供三个核心输入: -然后,激活虚拟环境并安装所需依赖: +* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义 Agent 逻辑,支持简单的单 Agent 设置和复杂的多 Agent 协作。 +* **[任务读取器 (Task Reader)](./data_pipeline.md)**:从 JSONL 文件、HuggingFace 数据集、交互式环境加载训练任务,或从文档自动生成任务。 +* **[任务判别器 (Task Judger)](./task_judger.md)**:评估 Agent 的输出并分配奖励(Reward)以指导训练。 -```bash -source .venv/bin/activate -uv pip install -e .[trinity] -uv pip install flash-attn==2.8.1 --no-build-isolation --no-cache-dir -``` +#### 2. 内部系统架构 -## 从 PyPI 安装(不推荐) +内部系统协调多个专门模块,处理强化学习(RL)训练和 Agent 交互的复杂性。 -你也可以通过 pip 直接从 PyPI 安装 AgentScope Tuner。此方法适合希望快速安装且无需最新开发功能的用户。 +* **启动器 (Launcher)**:管理后台服务进程(Ray, vLLM)并路由后端(Backbone)。 +* **任务读取器 (Task Reader)**:负责数据的摄取、增强和过滤。 +* **任务展开 (Task Rollout)**:连接 LLM 引擎并管理 Gym 环境的生命周期。 +* **任务运行器 (Task Runner)**:执行 AgentScope 工作流并计算奖励。 +* **模型微调器 (Model Tuner)**:将工作流中的推理请求转发至 LLM 引擎。 +* **上下文追踪器 (Context Tracker)**:监控 LLM 调用,并自动合并共享历史的时间线,将训练效率提升 **3 到 10 倍**。 -```bash -pip install agentscope-tuner -# 请在安装 agentscope-tuner 完成后安装 flash-attn,因为 flash-attn 依赖于部分已安装的包 -pip install flash-attn --no-build-isolation --no-cache-dir -``` +--- + +### 🚦 导航 + +* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个 Agent](./tutorial.md) —— 初学者的必经之路。 +* 🛠️ **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 与 [奖励](./tune_your_first_agent.md)。 +* 💡 **示例**:查看上方的 [示例库](%23%E7%A4%BA%E4%BE%8B%E5%BA%93),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问任务](./example_learning_to_ask.md) 等真实案例。 +* ⚙️ **深入了解**:掌握高级 [配置方案](./configuration.md)。 + +--- + +**您想让我为您详细解释其中某个特定的示例(如数学 Agent 训练)的实现代码吗?** \ No newline at end of file diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index 7a197004..e0cde162 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -1,96 +1,107 @@ -# AgentScope Tuner +# 项目简介 -AgentScope Tuner,简称 **ASTuner**,是一个专用于优化 AgentScope 智能体的先进训练框架。 -你只需提供 AgentScope 工作流、训练数据与奖励函数,ASTuner 即可帮助将智能体优化到最佳状态。 +**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的 Agent 和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的 Agent 达到最佳性能! +--- -## ✨ 特性 +### ✨ 特性 -- **数据增强 & 数据回流追踪**:当训练数据有限时,自动进行数据增强,并追踪用户反馈。 -- **自动 Rubrics 构建**:通过少量示例学习,自动构建基于 LLM-as-a-judge 的奖励函数。 -- **多智能体支持**:轻松构建高级协作多智能体系统。 -- **高效的异步训练-推理分离**:基于 Trinity-RFT 实现性能优化。 -- **训练-调试一体化**:通过简单的 `--backbone` 开关即可在训练与调试模式间无缝切换(`--backbone=trinity` 或 `--backbone=debug`)。 -- **完备的日志记录**:集成来自 AgentScope Studio 的消息级日志与 token 级日志,便于深入分析。 +我们致力于构建一个易于上手的 AgentScope 微调工具,为 Agent 开发者解锁更多可能性: +* **简单友好**:ASTuner 帮助您轻松微调 Agent 工作流背后的模型,以极小的开发成本优化 Agent 性能。 +* **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 +* **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 +* **灵活且快速**:ASTuner 支持 [多 Agent 工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging)。当工作流涉及多轮(或多 Agent)对话时,可将训练速度提升 1.5 倍至 20 倍。 +* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 +针对进阶研究者,ASTuner 还提供了高分辨率的日志记录和调试方案: -## 🚀 快速开始 +* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和 Agent 诊断。 +* **快速调试**:ASTuner 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 -### 安装 +--- -优先推荐使用 `uv`,也同样支持 `conda`。 +### 🚀 快速上手 -1. 克隆仓库: +#### 安装 + +我们推荐使用 `uv` 进行依赖管理。 + +1. **克隆仓库**: ```bash git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner + ``` -2. 创建虚拟环境并安装依赖: +2. **设置环境**: ```bash -uv venv --python=3.10.16 # 创建虚拟环境 -source .venv/bin/activate # 激活虚拟环境 - +uv venv --python=3.10.16 && source .venv/bin/activate uv pip install -e .[trinity] +# 注意:flash-attn 必须在其他依赖安装完成后安装 uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir -``` +``` -### 开始使用 +#### 运行训练 -一键启动并训练一个数学智能体: +您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 Agent。以 [数学 Agent](./example_math_agent.md) 为例: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray + ``` -你可以从以下示例入手,快速上手 ASTuner: +#### 示例库 + +探索我们丰富的示例库,开启您的探索之旅: -- 🚀 [**快速开始(Quick Start)**](./quickstart.md):了解整体框架,并从零开始训练你的第一个智能体。 -- 🍳 [**构建一个简单的数学智能体**](./example_math_agent.md):面向 GSM8K 任务,学习如何训练一个数学 Agent。 -- 🍳 [**构建 AppWorld 智能体**](./example_app_world.md):基于 AgentScope 构建 AppWorld 智能体并进行训练。 -- 🍳 [**构建多智能体狼人杀游戏**](./example_werewolves.md):开发参与狼人杀博弈的多智能体并对其进行训练。 -- 📔 [**追踪-反馈训练(Tracing-Feedback Training)**](./example_tracing_feedback_loop.md):学习如何基于用户反馈回流进行训练。 +* 🔢 **[训练一个可以编写 Python 代码的数学 Agent](./example_math_agent.md)**。 +* 📱 **[使用 AgentScope 创建并训练 AppWorld Agent](./example_app_world.md)**。 +* 🐺 **[开发并训练“狼人杀”RPG Agent](./example_werewolves.md)**。 +* 👩🏻‍⚕️ **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 +* 🎴 **[使用 AgentScope 编写并解决“倒计时”游戏](./example_countdown.md)**。 +* 🚶 **[使用 ASTuner 解决“冰湖”行走谜题](./example_frozenlake.md)**。 -如果你希望了解各个组件的细节,可以参考: +--- -- ⚙️ [**配置(Configuration)**](./configuration.md):配置数据、优化算法、奖励函数等。 -- 💼 [**工作流(Workflow)**](./workflow.md):构建你自己的、可训练的智能体工作流。 -- 📊 [**数据流水线与生成(Data Pipeline & Generation)**](./data_pipeline.md):包含从文档构建数据集任务,以及从少量样本扩展数据集。 +### 🧩 核心概念 +ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调变得直观明了。 +
+image -## 🏗️ 项目架构 +
-AgentScope Tuner 简化了智能体微调流程,将复杂的训练封装进三类核心模块: +#### 1. 以用户为中心的接口 -- AgentScope 工作流(可直接复用已有 AgentScope 工作流) -- 任务数据集(提供训练数据) -- 奖励评判器(Reward Judge,用于评估表现质量) +为了优化 Agent,您需要提供三个核心输入: +* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义您的 Agent 逻辑,支持简单的 Agent 设置以及高级的多 Agent 协作。 +* **[任务读取器 (Task Reader)](./data_pipeline.md)**:从 JSONL 文件、HuggingFace 数据集、交互式环境加载训练任务,或从文档自动生成任务。 +* **[任务判别器 (Task Judger)](./task_judger.md)**:评估 Agent 输出并分配奖励(Reward)以指导训练。 -![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2025/png/144856612/1764207569988-69b6926f-301b-4766-9199-3823974aab99.png) +#### 2. 内部系统架构 -为顺利完成工作流微调,我们在三类模块之下实现了以下核心模块 +内部系统协调多个专门模块,以处理强化学习(RL)训练和 Agent 交互的复杂性。 -![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2025/png/144856612/1764705947150-753d77f0-a1a7-4491-8b8b-a0f9f998ed0a.png) -- **launcher**:项目的入口,帮助开发者在调试 backbone 与训练 backbone 之间快速切换,同时负责启动并智能监控与训练相关的环境服务进程。 -- **task rollout**:桥接不同的 LLM 引擎(如 FSDP、VLLM 等),实现重试机制,并传递 task reader 读取的任务。同时负责 gym 环境的初始化与资源清理。 -- **task runner**:任务执行者,负责真正运行用户提供的 AgentScope 工作流,同时运行评判器并完成初步奖励计算。 -- **model tuner**:当前端 AgentScope 工作流发出 LLM 推理请求时,该组件会直接接收并将请求转发给 LLM 引擎。 -- **context tracker**:上下文记录员,监控每一次 LLM 调用,自动识别并归档属于同一 Agent、同一时间线的 LLM 请求。在任务结束时,负责标记 loss 掩膜,合并 LLM 输入输出,从而将训练效率提升约 3~10 倍。 +* **启动器 (Launcher)**:管理后台服务进程(Ray, vLLM)并路由后端。 +* **任务读取器 (Task Reader)**:处理数据摄取、增强和过滤。 +* **任务展开 (Task Rollout)**:连接大语言模型(LLM)引擎并管理 Gym 环境生命周期。 +* **任务运行器 (Task Runner)**:执行 AgentScope 工作流并计算奖励。 +* **模型微调器 (Model Tuner)**:将工作流中的推理请求转发至 LLM 引擎。 +* **上下文追踪器 (Context Tracker)**:监控 LLM 调用,并自动合并共享历史的时间线,将训练效率提升 **3 到 10 倍**。 -## 🗺️ 项目规划 +--- -正在进行中的工作: +### 🚦 导航 -- 增强数据生成模块的功能 -- 提供一个「训练 → 用户反馈 → 数据增强 → 重新训练」的飞轮式示例 -- 为多智能体样本提供更精细的后处理方案 -- 支持多模型联合训练 -- 针对小显存 GPU 优化长上下文适配配置 -- 增加基于 LoRA 的训练示例 +* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个 Agent](./tutorial.md) —— 初学者的必经之路。 +* 🛠️ **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 +* 💡 **示例**:查看上方的 [示例库](#example-librar),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 +* ⚙️ **深入了解**:掌握高级 [配置方案](./configuration.md)。 From 60caf8124cb69fb6d03739e70e265b423b942839 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Wed, 24 Dec 2025 10:39:32 +0800 Subject: [PATCH 327/462] docs: update intro chinese version --- docs/zh/intro.md | 115 ++++++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 52 deletions(-) diff --git a/docs/zh/intro.md b/docs/zh/intro.md index 7a197004..e0cde162 100644 --- a/docs/zh/intro.md +++ b/docs/zh/intro.md @@ -1,96 +1,107 @@ -# AgentScope Tuner +# 项目简介 -AgentScope Tuner,简称 **ASTuner**,是一个专用于优化 AgentScope 智能体的先进训练框架。 -你只需提供 AgentScope 工作流、训练数据与奖励函数,ASTuner 即可帮助将智能体优化到最佳状态。 +**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的 Agent 和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的 Agent 达到最佳性能! +--- -## ✨ 特性 +### ✨ 特性 -- **数据增强 & 数据回流追踪**:当训练数据有限时,自动进行数据增强,并追踪用户反馈。 -- **自动 Rubrics 构建**:通过少量示例学习,自动构建基于 LLM-as-a-judge 的奖励函数。 -- **多智能体支持**:轻松构建高级协作多智能体系统。 -- **高效的异步训练-推理分离**:基于 Trinity-RFT 实现性能优化。 -- **训练-调试一体化**:通过简单的 `--backbone` 开关即可在训练与调试模式间无缝切换(`--backbone=trinity` 或 `--backbone=debug`)。 -- **完备的日志记录**:集成来自 AgentScope Studio 的消息级日志与 token 级日志,便于深入分析。 +我们致力于构建一个易于上手的 AgentScope 微调工具,为 Agent 开发者解锁更多可能性: +* **简单友好**:ASTuner 帮助您轻松微调 Agent 工作流背后的模型,以极小的开发成本优化 Agent 性能。 +* **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 +* **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 +* **灵活且快速**:ASTuner 支持 [多 Agent 工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging)。当工作流涉及多轮(或多 Agent)对话时,可将训练速度提升 1.5 倍至 20 倍。 +* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 +针对进阶研究者,ASTuner 还提供了高分辨率的日志记录和调试方案: -## 🚀 快速开始 +* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和 Agent 诊断。 +* **快速调试**:ASTuner 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 -### 安装 +--- -优先推荐使用 `uv`,也同样支持 `conda`。 +### 🚀 快速上手 -1. 克隆仓库: +#### 安装 + +我们推荐使用 `uv` 进行依赖管理。 + +1. **克隆仓库**: ```bash git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner + ``` -2. 创建虚拟环境并安装依赖: +2. **设置环境**: ```bash -uv venv --python=3.10.16 # 创建虚拟环境 -source .venv/bin/activate # 激活虚拟环境 - +uv venv --python=3.10.16 && source .venv/bin/activate uv pip install -e .[trinity] +# 注意:flash-attn 必须在其他依赖安装完成后安装 uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir -``` +``` -### 开始使用 +#### 运行训练 -一键启动并训练一个数学智能体: +您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 Agent。以 [数学 Agent](./example_math_agent.md) 为例: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray + ``` -你可以从以下示例入手,快速上手 ASTuner: +#### 示例库 + +探索我们丰富的示例库,开启您的探索之旅: -- 🚀 [**快速开始(Quick Start)**](./quickstart.md):了解整体框架,并从零开始训练你的第一个智能体。 -- 🍳 [**构建一个简单的数学智能体**](./example_math_agent.md):面向 GSM8K 任务,学习如何训练一个数学 Agent。 -- 🍳 [**构建 AppWorld 智能体**](./example_app_world.md):基于 AgentScope 构建 AppWorld 智能体并进行训练。 -- 🍳 [**构建多智能体狼人杀游戏**](./example_werewolves.md):开发参与狼人杀博弈的多智能体并对其进行训练。 -- 📔 [**追踪-反馈训练(Tracing-Feedback Training)**](./example_tracing_feedback_loop.md):学习如何基于用户反馈回流进行训练。 +* 🔢 **[训练一个可以编写 Python 代码的数学 Agent](./example_math_agent.md)**。 +* 📱 **[使用 AgentScope 创建并训练 AppWorld Agent](./example_app_world.md)**。 +* 🐺 **[开发并训练“狼人杀”RPG Agent](./example_werewolves.md)**。 +* 👩🏻‍⚕️ **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 +* 🎴 **[使用 AgentScope 编写并解决“倒计时”游戏](./example_countdown.md)**。 +* 🚶 **[使用 ASTuner 解决“冰湖”行走谜题](./example_frozenlake.md)**。 -如果你希望了解各个组件的细节,可以参考: +--- -- ⚙️ [**配置(Configuration)**](./configuration.md):配置数据、优化算法、奖励函数等。 -- 💼 [**工作流(Workflow)**](./workflow.md):构建你自己的、可训练的智能体工作流。 -- 📊 [**数据流水线与生成(Data Pipeline & Generation)**](./data_pipeline.md):包含从文档构建数据集任务,以及从少量样本扩展数据集。 +### 🧩 核心概念 +ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调变得直观明了。 +
+image -## 🏗️ 项目架构 +
-AgentScope Tuner 简化了智能体微调流程,将复杂的训练封装进三类核心模块: +#### 1. 以用户为中心的接口 -- AgentScope 工作流(可直接复用已有 AgentScope 工作流) -- 任务数据集(提供训练数据) -- 奖励评判器(Reward Judge,用于评估表现质量) +为了优化 Agent,您需要提供三个核心输入: +* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义您的 Agent 逻辑,支持简单的 Agent 设置以及高级的多 Agent 协作。 +* **[任务读取器 (Task Reader)](./data_pipeline.md)**:从 JSONL 文件、HuggingFace 数据集、交互式环境加载训练任务,或从文档自动生成任务。 +* **[任务判别器 (Task Judger)](./task_judger.md)**:评估 Agent 输出并分配奖励(Reward)以指导训练。 -![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2025/png/144856612/1764207569988-69b6926f-301b-4766-9199-3823974aab99.png) +#### 2. 内部系统架构 -为顺利完成工作流微调,我们在三类模块之下实现了以下核心模块 +内部系统协调多个专门模块,以处理强化学习(RL)训练和 Agent 交互的复杂性。 -![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2025/png/144856612/1764705947150-753d77f0-a1a7-4491-8b8b-a0f9f998ed0a.png) -- **launcher**:项目的入口,帮助开发者在调试 backbone 与训练 backbone 之间快速切换,同时负责启动并智能监控与训练相关的环境服务进程。 -- **task rollout**:桥接不同的 LLM 引擎(如 FSDP、VLLM 等),实现重试机制,并传递 task reader 读取的任务。同时负责 gym 环境的初始化与资源清理。 -- **task runner**:任务执行者,负责真正运行用户提供的 AgentScope 工作流,同时运行评判器并完成初步奖励计算。 -- **model tuner**:当前端 AgentScope 工作流发出 LLM 推理请求时,该组件会直接接收并将请求转发给 LLM 引擎。 -- **context tracker**:上下文记录员,监控每一次 LLM 调用,自动识别并归档属于同一 Agent、同一时间线的 LLM 请求。在任务结束时,负责标记 loss 掩膜,合并 LLM 输入输出,从而将训练效率提升约 3~10 倍。 +* **启动器 (Launcher)**:管理后台服务进程(Ray, vLLM)并路由后端。 +* **任务读取器 (Task Reader)**:处理数据摄取、增强和过滤。 +* **任务展开 (Task Rollout)**:连接大语言模型(LLM)引擎并管理 Gym 环境生命周期。 +* **任务运行器 (Task Runner)**:执行 AgentScope 工作流并计算奖励。 +* **模型微调器 (Model Tuner)**:将工作流中的推理请求转发至 LLM 引擎。 +* **上下文追踪器 (Context Tracker)**:监控 LLM 调用,并自动合并共享历史的时间线,将训练效率提升 **3 到 10 倍**。 -## 🗺️ 项目规划 +--- -正在进行中的工作: +### 🚦 导航 -- 增强数据生成模块的功能 -- 提供一个「训练 → 用户反馈 → 数据增强 → 重新训练」的飞轮式示例 -- 为多智能体样本提供更精细的后处理方案 -- 支持多模型联合训练 -- 针对小显存 GPU 优化长上下文适配配置 -- 增加基于 LoRA 的训练示例 +* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个 Agent](./tutorial.md) —— 初学者的必经之路。 +* 🛠️ **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 +* 💡 **示例**:查看上方的 [示例库](#example-librar),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 +* ⚙️ **深入了解**:掌握高级 [配置方案](./configuration.md)。 From b3b4eef09e5bdf1e664e22748bd22702b45bcd63 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 24 Dec 2025 11:29:57 +0800 Subject: [PATCH 328/462] docs: minor change in workflow --- docs/en/workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/workflow.md b/docs/en/workflow.md index 2d6c1e35..0a291e11 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -11,7 +11,7 @@ ASTuner provides two convenient and **mutually compatible** ways to wrap an Agen ### 1. Convert Your AgentScope Workflow in ASTuner -**Simply set ReActAgent's `model` argument to `model_tuner` when initializing your agent.** +Simply set ReActAgent's `model` argument to `model_tuner` when initializing your agent. From 24882cd75a2d5e0cf4199f9eae883a4084ca5331 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 24 Dec 2025 11:33:52 +0800 Subject: [PATCH 329/462] docs: fix broken link in Chinese installation documentation --- docs/zh/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/installation.md b/docs/zh/installation.md index e3771c79..3fe7201d 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -13,7 +13,7 @@ * **简单友好**:ASTuner 帮助您轻松微调 Agent 工作流背后的模型,以极小的开发成本实现 Agent 性能的飞跃。 * **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 * **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更偏好 Actor 共位置部署,也可以切换至 [verl](./installation.md) 后端。 -* **灵活且快速**:ASTuner 支持 [多 Agent 工作流](docs/en/workflow.md),并采用了时间线合并技术(Timeline Merging),在涉及多轮或多 Agent 对话的工作流中,可将训练速度提升 1.5 倍至 20 倍。 +* **灵活且快速**:ASTuner 支持 [多 Agent 工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging),在涉及多轮或多 Agent 对话的工作流中,可将训练速度提升 1.5 倍至 20 倍。 * **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 针对资深研究人员,ASTuner 还提供了高分辨率的日志记录和调试方案: From ebc18e4c9063546d4ac61d16186247ef5ada308a Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Wed, 24 Dec 2025 11:34:30 +0800 Subject: [PATCH 330/462] Documents: Improved Task Judger, Data Pipeline, and Quick Start Guide - Added detailed Chinese documentation for the Task Judger (task_judger.md), including: * Basic interfaces and working principles of the judge * Detailed descriptions of the four built-in judges (MathAnswerAsJudge, CountdownAnswerAsJudge, EnvServiceJudge, AutoGraderJudge) * Implementation guidelines and configuration methods for custom judges - Optimized Data Pipeline documentation (data_pipeline.md) * Adjusted chapter structure and content organization * Improved configuration examples and instructions - Updated Quick Start Guide (quickstart.md) * Added new configuration information and usage examples - Improved document structure * Adjusted the directory structure of _toc.yml * Updated the language switching template (language-switch.html) - Optimized the content and structure of the English versions (en/data_pipeline.md, en/task_judger.md) --- docs/_templates/language-switch.html | 2 +- docs/_toc.yml | 25 ++- docs/en/data_pipeline.md | 56 ----- docs/en/task_judger.md | 176 ++++----------- docs/zh/data_pipeline.md | 184 +++++++++------ docs/zh/quickstart.md | 46 ++-- docs/zh/task_judger.md | 323 +++++++++++++++++++++++++++ 7 files changed, 530 insertions(+), 282 deletions(-) create mode 100644 docs/zh/task_judger.md diff --git a/docs/_templates/language-switch.html b/docs/_templates/language-switch.html index 415f3aa8..e2ee1fb8 100644 --- a/docs/_templates/language-switch.html +++ b/docs/_templates/language-switch.html @@ -63,7 +63,7 @@ // Define which captions should be displayed based on the selected language const languageMapping = { 'en': ['Tutorial', 'Example', 'Component', 'Deep Dive'], - 'zh': ['简介', '教程', '组件', '示例'] + 'zh': ['教程', '示例', '组件', '深入探索'] }; const visibleCaptions = languageMapping[lang] || []; diff --git a/docs/_toc.yml b/docs/_toc.yml index 9246f07e..c956e112 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -32,24 +32,13 @@ parts: # --- 中文部分 --- - - caption: 简介 - chapters: - - file: zh/intro.md - title: "介绍" - - caption: 教程 chapters: + - file: zh/intro.md - file: zh/installation.md - file: zh/quickstart.md - file: zh/tune_your_first_agent.md - - - caption: 组件 - chapters: - - file: zh/data_pipeline.md - - file: zh/data_generation.md - - file: zh/workflow.md - - caption: 示例 chapters: - file: zh/example_math_agent.md @@ -58,4 +47,16 @@ parts: - file: zh/example_learning_to_ask.md - file: zh/example_frozenlake.md - file: zh/example_countdown.md + + - caption: 组件 + chapters: + - file: zh/workflow.md + - file: zh/data_pipeline.md + - file: zh/task_judger.md + + - caption: 深入探索 + chapters: + - file: zh/configuration.md + - file: zh/data_generation.md - file: zh/example_tracing_feedback_loop.md + diff --git a/docs/en/data_pipeline.md b/docs/en/data_pipeline.md index 162fb210..71247cf8 100644 --- a/docs/en/data_pipeline.md +++ b/docs/en/data_pipeline.md @@ -163,60 +163,4 @@ astuner: - Training agents in simulated environments (e.g., FrozenLake, game environments) - Complex interactive scenarios where tasks are generated dynamically ---- - -### 4. Data Generation Reader - -**When to use:** Automatically generate training tasks from knowledge documents or augment existing tasks. - -**Configuration:** - -```yaml -astuner: - task_reader: - type: data_generation - data_generation: - augmentor_type: knowledge # 'knowledge' or 'task' - num_workers: 4 # Parallel generation workers - - # For knowledge-based generation: - knowledge: - doc_reader_type: pdf - doc_reader_config: - base_url: "docs/knowledge_base/" - generator_config: - model_name: "gpt-4" - num_tasks_per_doc: 5 - - # For task-based augmentation: - task: - base_tasks_path: "data/seed_tasks.jsonl" - augmentor_config: - model_name: "gpt-4" - augmentation_ratio: 2.0 -``` - -**Two Generation Modes:** - -1. **Knowledge Augmentation** (`augmentor_type: knowledge`) - - Reads knowledge documents (PDF, TXT, Markdown) - - Uses LLM to generate tasks based on document content - - Useful for domain-specific knowledge training - -2. **Task Augmentation** (`augmentor_type: task`) - - Takes existing seed tasks - - Uses LLM to create variations and similar tasks - - Expands training data from a small set of examples - -**How it works:** -- Generates tasks using configured LLM -- Applies deduplication filters to ensure diversity -- Caches generated tasks (keyed by configuration hash) -- Supports parallel generation with multiple workers - -**Use cases:** -- Bootstrap training data from documentation -- Augment limited training examples -- Create diverse task variations - diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index 59201a27..afcc97f6 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -8,7 +8,7 @@ Task Judger evaluates agent outputs and assigns rewards during training. This pa A Task Judger evaluates the agent's execution results and returns two values: -- **`raw_reward`** (`float`): Numerical score representing output quality (typically 0.0 to 1.0) +- **`raw_reward`** (`float`): Numerical score representing output quality (often normalized, e.g. 0.0 to 1.0, but may exceed 1.0 depending on the judger) - **`is_success`** (`bool`): Whether the task was successfully completed These values guide the RL training process, helping agents learn which behaviors produce better outcomes. @@ -28,15 +28,15 @@ class BaseJudge: self.config = config def compute_reward( - self, - workflow_task: WorkflowTask, + self, + workflow_task: WorkflowTask, workflow_output: WorkflowOutput - ) -> tuple: + ) -> tuple[float, bool]: """ Args: workflow_task: Contains the task data, including metadata with reference answers workflow_output: Contains the agent's output, including metadata with generated answers - + Returns: tuple: (raw_reward: float, is_success: bool) """ @@ -47,18 +47,20 @@ class BaseJudge: ## Built-in Task Judgers -AgentScope Tuner provides four built-in judgers for common evaluation scenarios: +AgentScope Tuner provides three built-in judgers for common evaluation scenarios: ### 1. MathAnswerAsJudge Evaluates mathematical answers by exact string matching, designed for tasks where answers are formatted in LaTeX `\boxed{}` notation. **When to use:** -- Math problem solving tasks -- Tasks with deterministic, exact answers -- Answers formatted as `\boxed{result}` + +* Math problem solving tasks +* Tasks with deterministic, exact answers +* Answers formatted as `\boxed{result}` **Configuration:** + ```yaml astuner: task_judge: @@ -67,13 +69,15 @@ astuner: ``` **How it works:** + 1. Extracts the answer from `\boxed{...}` in the agent's output 2. Compares with the reference answer from `workflow_task.task.metadata["answer"]` 3. Returns `(1.0, True)` for correct answers, `(0.0, False)` otherwise **Required metadata:** -- `workflow_output.metadata["final_answer"]`: Agent's answer with `\boxed{}` format -- `workflow_task.task.metadata["answer"]`: Reference answer + +* `workflow_output.metadata["final_answer"]`: Agent's answer with `\boxed{}` format +* `workflow_task.task.metadata["answer"]`: Reference answer --- @@ -82,11 +86,13 @@ astuner: Evaluates mathematical equations with partial credit for proper formatting. **When to use:** -- Number puzzle tasks (e.g., Countdown game) -- Tasks where partial credit is appropriate -- Need to reward proper formatting even when answer is wrong + +* Number puzzle tasks (e.g., Countdown game) +* Tasks where partial credit is appropriate +* Need to reward proper formatting even when answer is wrong **Configuration:** + ```yaml astuner: task_judge: @@ -95,14 +101,16 @@ astuner: ``` **Scoring:** -- `0.0`: Invalid or missing answer -- `0.1`: Properly formatted equation but wrong result -- `1.0`: Correct equation and result + +* `0.0`: Invalid or missing answer +* `0.1`: Properly formatted equation but wrong result +* `1.0`: Correct equation and result **Required metadata:** -- `workflow_output.metadata["final_answer"]`: Equation string with `\boxed{}` format -- `workflow_output.metadata["target"]`: Target number -- `workflow_output.metadata["nums"]`: Available numbers for the equation + +* `workflow_output.metadata["final_answer"]`: Equation string with `\boxed{}` format +* `workflow_output.metadata["target"]`: Target number +* `workflow_output.metadata["nums"]`: Available numbers for the equation --- @@ -111,11 +119,13 @@ astuner: Delegates evaluation to an external environment service, useful for complex interactive environments. **When to use:** -- Tasks with external simulators (e.g., AppWorld) -- Complex state-based evaluation -- Interactive environments with built-in evaluators + +* Tasks with external simulators (e.g., AppWorld) +* Complex state-based evaluation +* Interactive environments with built-in evaluators **Configuration:** + ```yaml astuner: task_judge: @@ -124,82 +134,12 @@ astuner: ``` **How it works:** + 1. Calls `workflow_task.gym_env.evaluate()` to get a score from the environment 2. Converts the score to a normalized reward: - - Success (score ≥ 1): `1.0 + score * 0.5` - - Failure (score < 1): `0.0 + score * 0.5` - ---- - -### 4. AutoGraderJudge (Advanced) - -Automatically generates evaluation rubrics from reference samples using LLMs for subjective evaluations. - -**When to use:** -- Subjective evaluation tasks (e.g., writing quality, dialogue coherence) -- Tasks without clear-cut correct answers -- When you have labeled training samples but need flexible evaluation criteria - -**Configuration:** -```yaml -astuner: - task_judge: - judge_type: rubrics_auto_grader - rubrics_auto_grader: - # Model for rubric generation and evaluation - model_name: "qwen-plus" # or "gpt-4", "claude-3-sonnet" - api_key: "your-api-key" # or set DASHSCOPE_API_KEY env var - - # Evaluation mode - grader_mode: "pointwise" # or "listwise" for ranking multiple outputs - language: "en" # or "zh" - - # Pointwise mode settings - min_score: 0 - max_score: 10 - - # Reference data for rubric generation - input_data_type: "dataset_file" - dataset_file: - training: - file_path: "path/to/rubrics_train.jsonl" - - # Field mappings - query_field: "main_query" # field name for the query - answer_field: "final_answer" # field in workflow output - reference_field: "answer" # field in task metadata -``` - -**How it works:** -1. **Training Phase**: Generates rubrics from labeled samples using iterative refinement -2. **Evaluation Phase**: Uses the generated rubrics to score new outputs via LLM calls - -**Required data format:** - -For **pointwise** mode (scoring individual outputs): -```json -{ - "main_query": "Explain quantum entanglement", - "metadata": { - "answer": "Quantum entanglement is...", - "score": 8 - } -} -``` - -For **listwise** mode (ranking multiple outputs): -```json -{ - "main_query": "Write a poem about spring", - "metadata": { - "candidates": [ - {"answer": "Flowers bloom...", "rank": 1}, - {"answer": "Spring is here...", "rank": 2} - ] - } -} -``` + * Success (score ≥ 1): `1.0 + score * 0.5` + * Failure (score < 1): `0.0 + score * 0.5` --- @@ -212,39 +152,27 @@ For specialized evaluation needs, create your own judger by inheriting `BaseJudg Create a new file (e.g., `tutorial/my_task/my_judge.py`): ```python -import re from astuner.task_judge.base_judge import BaseJudge from astuner.workflow import WorkflowOutput, WorkflowTask class MyCustomJudge(BaseJudge): def __init__(self, config): super().__init__(config) - # Initialize any resources (e.g., external APIs, models) self.threshold = 0.8 - + def compute_reward( - self, - workflow_task: WorkflowTask, + self, + workflow_task: WorkflowTask, workflow_output: WorkflowOutput - ) -> tuple: - # Extract data from workflow_output + ) -> tuple[float, bool]: agent_answer = workflow_output.metadata.get("final_answer", "") - - # Extract reference from workflow_task reference_answer = workflow_task.task.metadata.get("answer", "") - - # Your custom evaluation logic + similarity = self._compute_similarity(agent_answer, reference_answer) - - # Determine success based on threshold is_success = similarity >= self.threshold - - # Return (reward, success) return similarity, is_success - + def _compute_similarity(self, text1: str, text2: str) -> float: - # Your custom similarity metric - # This is just a simple example return len(set(text1.split()) & set(text2.split())) / max( len(text1.split()), len(text2.split()), 1 ) @@ -268,42 +196,22 @@ In your workflow, populate `workflow_output.metadata` with the data your judger ```python class MyWorkflow(Workflow): async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: - # Your agent logic final_answer = await self.agent.reply(msg) - - # Return output with metadata for the judger return WorkflowOutput( reward=None, # Will be filled by the judger metadata={ "final_answer": final_answer, - # Add any other fields your judger needs } ) ``` --- - ## Configuration Summary -### Using Built-in Judgers - ```yaml astuner: task_judge: judge_type: customized_protocol judge_protocol: astuner.task_judge.-> ``` - -### Using Auto Grader - -```yaml -astuner: - task_judge: - judge_type: rubrics_auto_grader - rubrics_auto_grader: - model_name: "qwen-plus" - grader_mode: "pointwise" - # ... other config -``` - diff --git a/docs/zh/data_pipeline.md b/docs/zh/data_pipeline.md index 24603ee6..87b0180b 100644 --- a/docs/zh/data_pipeline.md +++ b/docs/zh/data_pipeline.md @@ -1,9 +1,22 @@ -# 数据管线 +# Task Reader -AgentScope Tuner 为不同数据源提供了统一的数据结构,以及对应的数据加载机制。本文将详细介绍 AgentScope Tuner 中的数据格式与数据读取器。 +AgentScope Tuner 通过 Task Reader 从多种数据源加载训练任务。本页面介绍 Task 的统一 Schema 定义,以及面向常见场景的内置 Task Reader。 -## 数据格式 -AgentScope Tuner 定义了如下的数据结构: +## 概览 + +在智能体训练中,所有训练数据都必须以**任务(task)**的形式表示,并遵循统一的 Schema。AgentScope Tuner 提供了多个 Task Reader,用于从不同数据源加载任务: + +* **统一 Schema**:无论数据源是什么,所有任务都统一映射为 `Task` 结构 +* **多种来源**:支持从本地文件、HuggingFace 数据集、交互式环境加载,或自动生成新任务 +* **自动路由**:框架会根据配置中的 `astuner.task_reader.type` 自动选择合适的 reader + +``` +Data Source → Task Reader → Unified Task Schema → Training Pipeline +``` + +## Task Schema + +所有训练任务都必须按照以下结构定义: ```python class Task(BaseModel): @@ -14,102 +27,143 @@ class Task(BaseModel): metadata: dict = Field(default_factory=dict) ``` -各字段含义如下: +### 字段说明 + +| 字段 | 类型 | 说明 | +| --------------- | ------------ | ------------------------------------------------------- | +| `main_query` | `str` | 智能体需要解决的主要指令或问题 | +| `init_messages` | `List[dict]` | 初始对话消息(例如 system prompt)。每条消息必须包含 `role` 和 `content` 字段 | +| `task_id` | `str` | 任务的唯一标识 | +| `env_type` | `str` | 环境类型(例如 `"math"`、`"appworld"`) | +| `metadata` | `dict` | 额外的上下文信息(例如用于奖励计算的参考答案) | + +### Task 示例 + +```json +{ + "main_query": "What is 15 * 23?", + "init_messages": [ + { + "role": "system", + "content": "You are a helpful math assistant." + } + ], + "task_id": "math_001", + "env_type": "math", + "metadata": { + "answer": "345", + "difficulty": "easy" + } +} +``` + +**最佳实践:** + +* 使用 `metadata` 存储奖励计算所需的信息(例如参考答案、评分规则) +* 保持 `main_query` 清晰且简洁 +* 使用 `init_messages` 提供 system prompt 或 few-shot 示例 + +## 内置 Task Readers + +AgentScope Tuner 提供了 6 个内置 Task Reader,覆盖不同场景。框架会根据配置中的 `astuner.task_reader.type` 自动路由到正确的 reader。 -+ `main_query`:该任务的主查询或问题。 -+ `init_messages`:初始的对话消息列表,通常可用于包含 system 消息等。每个元素必须包含 `role` 和 `content` 字段。 -+ `task_id`:该任务的唯一标识符。 -+ `env_type`:该任务所对应的环境类型。 -+ `metadata`:任务的元数据,用于存储额外的上下文信息。 +### 快速选择指南 -`metadata` 中的字段与当前实际在做的训练任务相关。例如,可以使用 `metadata` 保存用于奖励计算的数据等。 +| 场景 | Reader Type | 适用情况 | +| ------------------- | ---------------------- | ------------------------------------ | +| **本地 JSONL 文件** | `jsonl_dataset_file` | 你已经准备好 JSONL 格式的任务数据 | +| **HuggingFace 数据集** | `huggingface_dat_repo` | 从 HuggingFace Hub 加载任务(例如 GSM8K) | +| **交互式环境** | `env_service` | 任务来自运行中的环境服务(例如 AppWorld、FrozenLake) | +| **从文档自动生成** | `data_generation` | 从知识文档生成任务或基于已有任务进行扩增 | -## 数据读取器 -为方便使用,我们为常见场景准备了多种数据读取器,包括:从文件读取、从 Huggingface 仓库读取、从 EnvService 读取,以及完全自定义代码读取。下面将分别进行介绍。 +--- -### File Reader -File Reader 可以从本地路径读取 jsonl 格式的数据集。在配置文件中将 `astuner.task_reader.type` 设置为 `dataset_file` 即可启用该 reader。 +### 1. JSONL 文件 Reader -启用后,还需要分别配置训练集与验证集的文件路径: +**适用场景:**你在本地以 JSONL 格式准备了训练任务。 + +**配置方式:** ```yaml astuner: task_reader: - dataset_file: + type: jsonl_dataset_file + jsonl_dataset_file: training: - # 训练数据集路径 - file_path: "xxxx.jsonl" + file_path: "data/train.jsonl" validation: - # 验证数据集路径 - file_path: "xxxx.jsonl" + file_path: "data/val.jsonl" ``` -JSONL 文件中的每一行都应为一个 JSON 对象,结构如下: +**JSONL 格式:** + +每一行都应是一个符合 Task Schema 的 JSON 对象: ```json -{ - "main_query": "the query", - "init_messages": [ - { - "role": "system", - "content": "openai format message", - } - ], - "task_id": "the task id", - "env_type": "the environment of the task", - "metadata": { - "other": "other metadata", - } -} +{"main_query": "Solve: x + 5 = 12", "task_id": "algebra_01", "env_type": "math", "metadata": {"answer": "7"}} +{"main_query": "What is the capital of France?", "task_id": "geo_01", "env_type": "qa", "metadata": {"answer": "Paris"}} ``` -符合上述格式的 JSONL 文件会被自动加载并作为数据集使用。 +**工作原理:** + +* 按行读取指定的 JSONL 文件 +* 自动按 Task Schema 校验数据 +* 支持训练集与验证集分离 -### Huggingface Repo Reader -Huggingface Repo Reader 可以从 Huggingface 仓库中读取远程数据集。在配置文件中将 `astuner.task_reader.type` 设置为 `huggingface_dat_repo` 即可启用该 reader。 +--- -启用后,需要指定仓库名称与训练集划分、验证集划分的名称: +### 2. HuggingFace 数据集 Reader + +**适用场景:**从 HuggingFace Hub 的数据集中加载任务(例如 GSM8K、MATH)。 + +**配置方式:** ```yaml astuner: task_reader: + type: huggingface_dat_repo huggingface_dat_repo: - # 数据集所在仓库名称 - dataset_path: "gsm8k" - # 训练集划分的名称 - training_split: "train" - # 验证集划分的名称 - validation_split: "validation" + dataset_path: "gsm8k" # HF dataset repo name + dataset_name: "main" # Optional: dataset subset name + training_split: "train" # Training split name + validation_split: "test" # Validation split name ``` -### EnvService Reader -EnvService Reader 可以自动从 EnvService 中拉取远程数据集。在配置文件中将 `astuner.task_reader.type` 设置为 `env_service` 即可启用该 reader。 +**工作原理:** + +* 使用 `datasets` 库从 HuggingFace Hub 下载数据集 +* 自动将数据集字段映射到 Task Schema +* 将下载的数据缓存在本地,便于后续更快重复运行 + +**支持的数据集:**任意可映射到 Task Schema 的 HuggingFace 数据集。 + +--- + +### 3. EnvService Reader -启用后,需要配置服务 URL、环境类型以及训练集划分、验证集划分的名称: +**适用场景:**任务由交互式环境服务提供(例如 AppWorld、RL gym 环境)。 + +**配置方式:** ```yaml astuner: task_reader: + type: env_service env_service: - # 环境类型,需要事先在 EnvService 中初始化该环境才能使用 - env_type: "appworld" - # EnvService 服务地址 - env_url: "http://127.0.0.1:8080" - # 支持的 action 形式:code, text, box - env_action_preference: code - # 该环境中训练集的划分名称 + env_type: "appworld" # Environment type + env_url: "http://127.0.0.1:8080" # Service URL + env_action_preference: code # Action format: code/text/box training_split: train - # 该环境中验证集的划分名称 validation_split: dev ``` -### Random Dummy Reader -如果你希望完全自定义数据管线,可以使用该 reader。 +**工作原理:** -Random Dummy Reader 会将数据加载过程完全交给用户。在 `Workflow` 的 `workflow_task.task_id` 参数中可以读取到一个传入的随机整数,你可以将其作为任务 ID,自行完成数据加载逻辑。 +* 通过 HTTP 连接到正在运行的环境服务 +* 从环境中拉取任务实例 +* 支持从交互式环境中动态生成任务 -```yaml -astuner: - task_reader: - type: random_dummy -``` +**典型用例:** + +* 在模拟环境中训练智能体(例如 FrozenLake、各类游戏环境) +* 任务需要动态生成、评测依赖环境状态的复杂交互场景 diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md index c40f2e38..baecab14 100644 --- a/docs/zh/quickstart.md +++ b/docs/zh/quickstart.md @@ -1,25 +1,43 @@ -# 快速上手 +# 快速开始 -AgentScope Tuner 为 Agent 调优提供了完整的功能。你可以直接尝试用一条命令启动一个数学智能体的训练: +AgentScope Tuner 提供了一套完整的智能体调优功能。你可以立刻尝试启动一个智能体的训练: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -## 通过案例学习 +### 最小示例 -探索我们丰富的案例库,快速上手框架: +我们从最简单的示例开始:一个带工具调用的数学智能体。 -- 🚀 [**训练能写Python代码的数学智能体**](./example_math_agent.md). -- 🍳 [**开发狼人杀RPG智能体并进行训练**](./example_werewolves.md). -- ⚙️ [**学习像医生一样提问**](./example_learning_to_ask.md). -- 💼 [**使用AgentScope创建AppWorld智能体并训练**](./example_app_world.md). -- 📊 [**使用AgentScope编写并解决倒计时游戏**](./example_countdown.md). -- 🚀 [**使用ASTuner解决 Frozenlake 谜题**](./example_frozenlake.md). -- 📔 [**学习如何使用用户反馈追踪进行训练**](./example_tracing_feedback_loop.md). +* 首先,请查看 [installation guide](docs/en/installation.md) 来搭建训练环境。 +* 然后,使用下面的最小示例来调优你的第一个模型(假设你已经编写了一个名为 `MathToolWorkflow` 的 Agent)。 -## 从零开始训练你的第一个智能体 + ```python + from astuner import AstunerJob + from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow + model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" + job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) + job.set_workflow(MathToolWorkflow) + job.set_data(type="hf", dataset_path='openai/gsm8k') + # [可选:保存 yaml 文件以便手动调整] job.dump_job_as_yaml('saved_experiments/math.yaml') + # [可选:从手动调整后的 yaml 文件加载] job.load_job_from_yaml('saved_experiments/math.yaml') + tuned_model = job.tune() # 等价于在终端执行 `astuner --conf ./saved_experiments/math.yaml` + ``` -从零开始构建你的智能体并进行调优: +### 浏览示例 -- 📚 [**Tune Your First Agent**](./tune_your_first_agent.md). +浏览我们丰富的示例库,为你的旅程快速起步: + +* 🔢 [**训练一个能写 python 代码的数学智能体**](./example_math_agent.md)。 +* 📱 [**使用 AgentScope 创建 AppWorld 智能体并训练它**](./example_app_world.md)。 +* 🐺 [**开发狼人杀 RPG 智能体并训练它们**](./example_werewolves.md)。 +* 👩🏻‍⚕️ [**学习像医生一样提问**](./example_learning_to_ask.md)。 +* 🎴 [**使用 AgentScope 编写倒计时游戏并求解**](./example_countdown.md)。 +* 🚶 [**使用 ASTuner 解决 Frozen Lake 行走谜题**](./example_frozenlake.md)。 + +### 从零开始调优你的第一个智能体 + +开始构建你自己的智能体,并按照我们的文档进行调优: + +* 📚 [**调优你的第一个智能体**](./tune_your_first_agent.md)。 diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md new file mode 100644 index 00000000..22e3c81e --- /dev/null +++ b/docs/zh/task_judger.md @@ -0,0 +1,323 @@ +# 任务评测器(Task Judger) + +Task Judger 用于在训练过程中评估智能体(agent)的输出,并据此分配奖励。本页面介绍了常见场景下的内置评测器,以及如何为特定评测需求实现自定义评测器。 + +--- + +## 概览 + +Task Judger 会评估智能体的执行结果,并返回两个值: + +* **`raw_reward`** (`float`):表示输出质量的数值分数(通常为 0.0 到 1.0) +* **`is_success`** (`bool`):任务是否成功完成 + +这两个值会引导 RL 训练过程,帮助智能体学习哪些行为能带来更好的结果。 + +--- + +## 基础接口 + +所有 Task Judger 都继承自 `BaseJudge`,并实现 `compute_reward` 方法: + +```python +from astuner.task_judge.base_judge import BaseJudge +from astuner.workflow import WorkflowOutput, WorkflowTask + +class BaseJudge: + def __init__(self, config): + self.config = config + + def compute_reward( + self, + workflow_task: WorkflowTask, + workflow_output: WorkflowOutput + ) -> tuple: + """ + Args: + workflow_task: 包含任务数据,包括 metadata 中的参考答案等信息 + workflow_output: 包含智能体输出,包括 metadata 中的生成答案等信息 + + Returns: + tuple: (raw_reward: float, is_success: bool) + """ + raise NotImplementedError +``` + +--- + +## 内置 Task Judger + +AgentScope Tuner 提供了 4 个内置评测器,用于覆盖常见的评测场景: + +### 1. MathAnswerAsJudge + +通过**精确字符串匹配**来评估数学答案,适用于答案以 LaTeX `\boxed{}` 形式输出的任务。 + +**适用场景:** + +* 数学解题类任务 +* 答案确定且唯一的任务 +* 答案格式为 `\boxed{result}` + +**配置方式:** + +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge +``` + +**工作原理:** + +1. 从智能体输出中提取 `\boxed{...}` 内的答案 +2. 与 `workflow_task.task.metadata["answer"]` 中的参考答案进行比对 +3. 正确返回 `(1.0, True)`,否则返回 `(0.0, False)` + +**必需的 metadata:** + +* `workflow_output.metadata["final_answer"]`:智能体答案(包含 `\boxed{}` 格式) +* `workflow_task.task.metadata["answer"]`:参考答案 + +--- + +### 2. CountdownAnswerAsJudge + +评估数学等式,并支持对“格式正确但结果错误”的输出给予**部分奖励**。 + +**适用场景:** + +* 数字谜题类任务(例如 Countdown game) +* 需要部分得分的任务 +* 希望即使答案不对,也能奖励良好格式的场景 + +**配置方式:** + +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge +``` + +**评分规则:** + +* `0.0`:答案无效或缺失 +* `0.1`:等式格式正确,但结果错误 +* `1.0`:等式与结果都正确 + +**必需的 metadata:** + +* `workflow_output.metadata["final_answer"]`:等式字符串(包含 `\boxed{}` 格式) +* `workflow_output.metadata["target"]`:目标数字 +* `workflow_output.metadata["nums"]`:可用数字列表(构造等式所允许使用的数字) + +--- + +### 3. EnvServiceJudge + +将评测委托给外部环境服务,适用于复杂的交互式环境。 + +**适用场景:** + +* 依赖外部模拟器的任务(例如 AppWorld) +* 基于状态的复杂评估 +* 环境自身带有 evaluator 的交互式任务 + +**配置方式:** + +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge +``` + +**工作原理:** + +1. 调用 `workflow_task.gym_env.evaluate()` 从环境获取 score +2. 将 score 转换为归一化 reward: + + * 成功(score ≥ 1):`1.0 + score * 0.5` + * 失败(score < 1):`0.0 + score * 0.5` + +--- + +### 4. AutoGraderJudge(高级) + +通过 LLM 自动从参考样本生成评测 Rubric,用于主观性较强的评测任务。 + +**适用场景:** + +* 主观评测任务(例如写作质量、对话连贯性) +* 没有明确标准答案的任务 +* 有标注训练样本,但需要更灵活的评测标准 + +**配置方式:** + +```yaml +astuner: + task_judge: + judge_type: rubrics_auto_grader + rubrics_auto_grader: + # 用于 rubric 生成与评测的模型 + model_name: "qwen-plus" # or "gpt-4", "claude-3-sonnet" + api_key: "your-api-key" # or set DASHSCOPE_API_KEY env var + + # 评测模式 + grader_mode: "pointwise" # or "listwise" for ranking multiple outputs + language: "en" # or "zh" + + # pointwise 模式配置 + min_score: 0 + max_score: 10 + + # 用于 rubric 生成的参考数据 + input_data_type: "dataset_file" + dataset_file: + training: + file_path: "path/to/rubrics_train.jsonl" + + # 字段映射 + query_field: "main_query" # query 对应字段名 + answer_field: "final_answer" # workflow output 中的字段 + reference_field: "answer" # task metadata 中的字段 +``` + +**工作原理:** + +1. **训练阶段**:基于带标注的样本,通过迭代式优化生成 rubrics +2. **评测阶段**:使用生成的 rubrics,通过 LLM 调用对新输出打分 + +**所需数据格式:** + +**pointwise** 模式(对单个输出打分): + +```json +{ + "main_query": "Explain quantum entanglement", + "metadata": { + "answer": "Quantum entanglement is...", + "score": 8 + } +} +``` + +**listwise** 模式(对多个候选输出排序): + +```json +{ + "main_query": "Write a poem about spring", + "metadata": { + "candidates": [ + {"answer": "Flowers bloom...", "rank": 1}, + {"answer": "Spring is here...", "rank": 2} + ] + } +} +``` + +--- + +## 创建自定义 Task Judger + +当你有更专门的评测需求时,可以通过继承 `BaseJudge` 来实现自己的评测器。 + +### Step 1:实现评测器 + +创建一个新文件(例如 `tutorial/my_task/my_judge.py`): + +```python +import re +from astuner.task_judge.base_judge import BaseJudge +from astuner.workflow import WorkflowOutput, WorkflowTask + +class MyCustomJudge(BaseJudge): + def __init__(self, config): + super().__init__(config) + # 初始化所需资源(例如外部 API、模型等) + self.threshold = 0.8 + + def compute_reward( + self, + workflow_task: WorkflowTask, + workflow_output: WorkflowOutput + ) -> tuple: + # 从 workflow_output 中读取数据 + agent_answer = workflow_output.metadata.get("final_answer", "") + + # 从 workflow_task 中读取参考答案 + reference_answer = workflow_task.task.metadata.get("answer", "") + + # 自定义评测逻辑 + similarity = self._compute_similarity(agent_answer, reference_answer) + + # 基于阈值判断是否成功 + is_success = similarity >= self.threshold + + # 返回 (reward, success) + return similarity, is_success + + def _compute_similarity(self, text1: str, text2: str) -> float: + # 自定义相似度度量 + # 这里只是一个简单示例 + return len(set(text1.split()) & set(text2.split())) / max( + len(text1.split()), len(text2.split()), 1 + ) +``` + +### Step 2:配置评测器 + +在 YAML 配置中: + +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: tutorial.my_task.my_judge->MyCustomJudge +``` + +### Step 3:向评测器传递数据 + +在 workflow 中,将评测器所需字段写入 `workflow_output.metadata`: + +```python +class MyWorkflow(Workflow): + async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + # 智能体逻辑 + final_answer = await self.agent.reply(msg) + + # 返回包含 metadata 的输出,供 judger 使用 + return WorkflowOutput( + reward=None, # 将由 judger 填充 + metadata={ + "final_answer": final_answer, + # 添加其他你的 judger 需要的字段 + } + ) +``` + +--- + +## 配置速查 + +### 使用内置 Judger + +```yaml +astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.-> +``` + +### 使用 Auto Grader + +```yaml +astuner: + task_judge: + judge_type: rubrics_auto_grader + rubrics_auto_grader: + model_name: "qwen-plus" + grader_mode: "pointwise" + # ... 其他配置 +``` From 75d87335e2fc64b6f8683af02c215795384c0846 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Wed, 24 Dec 2025 11:43:14 +0800 Subject: [PATCH 331/462] docs(zh): fix markdown formatting in documentation files --- docs/zh/data_pipeline.md | 4 ++-- docs/zh/example_app_world.md | 2 +- docs/zh/example_countdown.md | 2 +- docs/zh/example_frozenlake.md | 2 +- docs/zh/example_learning_to_ask.md | 2 +- docs/zh/example_math_agent.md | 2 +- docs/zh/task_judger.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/zh/data_pipeline.md b/docs/zh/data_pipeline.md index 87b0180b..7f07435a 100644 --- a/docs/zh/data_pipeline.md +++ b/docs/zh/data_pipeline.md @@ -1,4 +1,4 @@ -# Task Reader +# 任务加载器 AgentScope Tuner 通过 Task Reader 从多种数据源加载训练任务。本页面介绍 Task 的统一 Schema 定义,以及面向常见场景的内置 Task Reader。 @@ -14,7 +14,7 @@ AgentScope Tuner 通过 Task Reader 从多种数据源加载训练任务。本 Data Source → Task Reader → Unified Task Schema → Training Pipeline ``` -## Task Schema +## 任务结构 所有训练任务都必须按照以下结构定义: diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 768b0c61..c8e41d2e 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -1,4 +1,4 @@ -# AppWorld +# App交互模拟 本教程介绍如何训练一个 Agent 与 AppWorld 交互并解决复杂的任务。 diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index 3846e1e4..327fbdb0 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -1,4 +1,4 @@ -# Countdown +# 倒计时数字游戏 ## 1. 介绍 diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md index 4ff82cb8..928c8bf9 100644 --- a/docs/zh/example_frozenlake.md +++ b/docs/zh/example_frozenlake.md @@ -1,4 +1,4 @@ -# Frozen Lake +# 冰冻湖游戏 ## 1. 介绍 diff --git a/docs/zh/example_learning_to_ask.md b/docs/zh/example_learning_to_ask.md index da648acf..f74e450d 100644 --- a/docs/zh/example_learning_to_ask.md +++ b/docs/zh/example_learning_to_ask.md @@ -1,4 +1,4 @@ -# Learning to Ask +# 学习提问 训练一个智能体去**提出下一个最合适的问题**(而不是直接回答)。奖励来自一个 **LLM-as-a-judge**:它会评估“这个问题是否有帮助、是否相关”,并给出打分。 diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index 557a6dc7..6b06f911 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -1,4 +1,4 @@ -# Math Agent +# 数学智能体 训练一个**会用工具的数学智能体**(ReAct + Python 执行器),用于解决 GSM8K 风格的小学应用题。 奖励来自一个**评审器 (judge)**:它检查最终答案是否正确(并且可选地惩罚不良的工具调用行为)。 diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md index 22e3c81e..a45763ca 100644 --- a/docs/zh/task_judger.md +++ b/docs/zh/task_judger.md @@ -1,4 +1,4 @@ -# 任务评测器(Task Judger) +# 任务评测器 Task Judger 用于在训练过程中评估智能体(agent)的输出,并据此分配奖励。本页面介绍了常见场景下的内置评测器,以及如何为特定评测需求实现自定义评测器。 From e5c098453d470b3b3a44311cea78203b253b8ec7 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Wed, 24 Dec 2025 11:48:47 +0800 Subject: [PATCH 332/462] docs: polish installation --- docs/zh/installation.md | 133 +++++++++++++--------------------------- 1 file changed, 44 insertions(+), 89 deletions(-) diff --git a/docs/zh/installation.md b/docs/zh/installation.md index 3fe7201d..06da6aa7 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -1,113 +1,68 @@ -# 项目简介 +# 安装指南 -**AgentScope Tuner (ASTuner)** 是一款领先且易用的训练框架,专为优化 AgentScope 中的 Agent 和工作流(Workflow)而设计,能够自动微调后台大语言模型的权重。 +本文档提供 AgentScope-Tuner 的逐步安装说明。 -只需提供您的 AgentScope 工作流、训练数据以及奖励函数(Reward Function),ASTuner 即可助力您的 Agent 达到最佳性能状态! +AgentScope Tuner 正处于快速开发与迭代阶段。我们建议从源码安装,以获得最新功能与 Bug 修复。 ---- +## 前置条件 -### ✨ 特性 +* Python 3.10 +* CUDA 12.8 或更高版本 -我们致力于构建一个简单易学的 AgentScope 微调器,为 Agent 开发者开启更多可能性: +## 从源码安装 -* **简单友好**:ASTuner 帮助您轻松微调 Agent 工作流背后的模型,以极小的开发成本实现 Agent 性能的飞跃。 -* **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 -* **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更偏好 Actor 共位置部署,也可以切换至 [verl](./installation.md) 后端。 -* **灵活且快速**:ASTuner 支持 [多 Agent 工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging),在涉及多轮或多 Agent 对话的工作流中,可将训练速度提升 1.5 倍至 20 倍。 -* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 +### Step 1:克隆仓库 -针对资深研究人员,ASTuner 还提供了高分辨率的日志记录和调试方案: - -* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Loss Mask 甚至 Token Logprobs,以便进行工作流开发和 Agent 诊断。 -* **快速调试**:ASTuner 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 - ---- - -### 🚀 快速上手 - -#### 安装 - -我们推荐使用 `uv` 进行依赖管理。 - -1. **克隆仓库**: +从 GitHub 克隆 AgentScope Tuner 仓库,并进入项目目录: ```bash git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner - -``` - -2. **配置环境**: - -```bash -uv venv --python=3.10.16 && source .venv/bin/activate -uv pip install -e .[trinity] -# 注意:flash-attn 必须在其他依赖安装完成后安装 -uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir - -``` - -#### 运行训练 - -您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 Agent: - -```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray - ``` -详情请参阅 [数学 Agent 示例](./example_math_agent.md) - -#### 示例库 - -探索我们丰富的示例库,开启您的开发之旅: - -* 🔢 **[训练一个能编写 Python 代码的数学 Agent](./example_math_agent.md)**。 -* 📱 **[使用 AgentScope 创建并训练 AppWorld Agent](./example_app_world.md)**。 -* 🐺 **[开发并训练“狼人杀”RPG Agent](./example_werewolves.md)**。 -* 👩🏻‍⚕️ **[学习像医生一样进行问诊](./example_learning_to_ask.md)**。 -* 🎴 **[使用 AgentScope 编写并解决“倒计时”游戏](./example_countdown.md)**. -* 🚶 **[使用 ASTuner 解决“冰湖”行走谜题](./example_frozenlake.md)**。 +### Step 2:安装依赖 ---- +#### 1)在本机系统中安装 -### 🧩 核心概念 +AgentScope-Tuner 支持多种训练后端(backbone),目前包括 `verl` 和 `trinity`(推荐)。 +你可以按需选择后端,并在训练时自由选择使用其中任意一个。 +我们推荐使用 `uv` 来管理 Python 环境,因为它速度非常快。也可参考 [`uv` 安装文档](https://docs.astral.sh/uv/getting-started/installation/)。 +当然,如果你更希望使用 `conda`,也可以通过 conda + pip 安装(只需将 `uv pip` 替换为 `pip` 即可)。 -ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调变得简单直观。 +* 使用 `trinity` 训练后端安装(推荐) -
-image + ```bash + uv venv --python=3.10 + source .venv/bin/activate + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] + uv pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache # 提示:flash-attn 必须在其他依赖安装完成后再安装 + ``` -
+* 使用 `verl` 训练后端安装 -#### 1. 以用户为中心的接口 + ```bash + source .venv/bin/activate + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + ``` -为了优化 Agent,您需要提供三个核心输入: +#### 2)通过 Docker 一键安装 -* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义 Agent 逻辑,支持简单的单 Agent 设置和复杂的多 Agent 协作。 -* **[任务读取器 (Task Reader)](./data_pipeline.md)**:从 JSONL 文件、HuggingFace 数据集、交互式环境加载训练任务,或从文档自动生成任务。 -* **[任务判别器 (Task Judger)](./task_judger.md)**:评估 Agent 的输出并分配奖励(Reward)以指导训练。 +如果你希望一键完成依赖安装,我们提供了镜像用于快速上手。 -#### 2. 内部系统架构 +在继续之前,请确保你的系统已安装 `nvidia docker`。 +我们的 Docker 容器内部需要使用 CUDA,因此必须依赖 Nvidia 的工具链来提供 GPU 支持。 +请在宿主机的 Ubuntu 系统上安装 nvidia docker runtime。具体步骤可参考 [nvidia official document](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian)。 +基于上述链接,我们也编写了一份在 Ubuntu Linux 环境中安装 nvidia docker runtime 的说明文档,请阅读 [set up nvidia docker environment](./setup_ubuntu.md)。 -内部系统协调多个专门模块,处理强化学习(RL)训练和 Agent 交互的复杂性。 +以下命令会将你当前工作目录(agentscope-tuner 的根目录)挂载到容器内的 `/workspace`,并将你的数据目录挂载到容器内的 `/data`。 -* **启动器 (Launcher)**:管理后台服务进程(Ray, vLLM)并路由后端(Backbone)。 -* **任务读取器 (Task Reader)**:负责数据的摄取、增强和过滤。 -* **任务展开 (Task Rollout)**:连接 LLM 引擎并管理 Gym 环境的生命周期。 -* **任务运行器 (Task Runner)**:执行 AgentScope 工作流并计算奖励。 -* **模型微调器 (Model Tuner)**:将工作流中的推理请求转发至 LLM 引擎。 -* **上下文追踪器 (Context Tracker)**:监控 LLM 调用,并自动合并共享历史的时间线,将训练效率提升 **3 到 10 倍**。 - ---- - -### 🚦 导航 - -* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个 Agent](./tutorial.md) —— 初学者的必经之路。 -* 🛠️ **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 与 [奖励](./tune_your_first_agent.md)。 -* 💡 **示例**:查看上方的 [示例库](%23%E7%A4%BA%E4%BE%8B%E5%BA%93),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问任务](./example_learning_to_ask.md) 等真实案例。 -* ⚙️ **深入了解**:掌握高级 [配置方案](./configuration.md)。 - ---- - -**您想让我为您详细解释其中某个特定的示例(如数学 Agent 训练)的实现代码吗?** \ No newline at end of file +```bash +docker run -it \ + --gpus all \ + --shm-size="64g" \ + --rm \ + -v $PWD:/workspace \ + -v /path/to/your/checkpoint/and/data:/data \ + agentscope-tuner:latest +``` From 02a89828f6dbd337d72759ed048114def8362ac6 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Wed, 24 Dec 2025 11:53:31 +0800 Subject: [PATCH 333/462] fix: countdown --- docs/en/example_countdown.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index 4f78a5fd..74ba8afa 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -1,4 +1,4 @@ -# Countdown Task +# Countdown ## 1. Introduction From d18bf80df5f5ee79a8264c5f91f2d2433bee57c9 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 12:06:34 +0800 Subject: [PATCH 334/462] docs: add beast-logger usage documentation --- docs/en/beast_logger.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/en/beast_logger.md diff --git a/docs/en/beast_logger.md b/docs/en/beast_logger.md new file mode 100644 index 00000000..01ac077f --- /dev/null +++ b/docs/en/beast_logger.md @@ -0,0 +1,39 @@ +# Beast-Logger Usage + +Beast-logger is a logging kit built for LLM systems, +providing reliable high-resolution token-level LLM activity +that is unprecedented in any other projects. + +Here is how to use beast-logger in agentscope-tuner. + +## Usage in agentscope-tuner + +1. Start training or debugging with agentscope-tuner launcher. + +2. Wait until the first batch is completed. + +3. Locate log files. By default, they will be placed at `saved_experiments/${experiment_name}`. For example: +`saved_experiments/benchmark_frozenlake_20251223_2305` + +4. Run `beast_logger_go` command in the VSCode terminal (or any other software with port-forwarding ability) to start the web log-viewer. Click `http://127.0.0.1:8181` to open it (VSCode will automatically forward this port from server -> your local computer) + +
+image +
+ +5. Fill the **ABSOLUTE** path of the log files and click `submit`. (Beast-logger recursively scans this path and, where possible, selects the innermost directory containing the fewest files) + +
+image +
+ + +6. Choose entry to display + +* Yellow tokens: tokens that are excluded from loss computation. +* Blue tokens: tokens that participant loss computation. +* Hovor your mouse on one of the tokens: show the logprob value of that token. + +
+image +
From d24d1073ee8e82f8091dd5b4e9e127239335a39b Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Wed, 24 Dec 2025 12:39:27 +0800 Subject: [PATCH 335/462] docs: Add training visualization documentation with SwanLab, WandB, TensorBoard support - Document supported visualization backends and quick-start guides - Add best practices for monitoring training curves and key metrics - Explain reward curves, success rates, loss, and KL divergence tracking - Include configuration examples for logging and checkpoint saving - Add links to external documentation and related guides --- docs/_toc.yml | 4 + docs/en/example_app_world.md | 4 + docs/en/example_countdown.md | 4 + docs/en/example_frozenlake.md | 2 + docs/en/example_learning_to_ask.md | 2 + docs/en/example_math_agent.md | 4 + docs/en/example_werewolves.md | 4 + docs/en/visualization.md | 117 +++++++++++++++++++++++++++++ docs/zh/beast_logger.md | 36 +++++++++ docs/zh/example_app_world.md | 4 + docs/zh/example_countdown.md | 4 + docs/zh/example_frozenlake.md | 2 + docs/zh/example_learning_to_ask.md | 2 + docs/zh/example_math_agent.md | 4 + docs/zh/example_werewolves.md | 4 + docs/zh/visualization.md | 117 +++++++++++++++++++++++++++++ 16 files changed, 314 insertions(+) create mode 100644 docs/en/visualization.md create mode 100644 docs/zh/beast_logger.md create mode 100644 docs/zh/visualization.md diff --git a/docs/_toc.yml b/docs/_toc.yml index c956e112..ffa745f4 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -27,6 +27,8 @@ parts: - caption: Deep Dive chapters: - file: en/configuration.md + - file: en/visualization.md + - file: en/beast_logger.md - file: en/data_generation.md - file: en/example_tracing_feedback_loop.md @@ -57,6 +59,8 @@ parts: - caption: 深入探索 chapters: - file: zh/configuration.md + - file: zh/visualization.md + - file: zh/beast_logger.md - file: zh/data_generation.md - file: zh/example_tracing_feedback_loop.md diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index f94be843..cc7a7e2d 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -169,6 +169,8 @@ astuner: ![Training curve (small batch)](https://img.alicdn.com/imgextra/i2/O1CN01toRt2c1Nj8nKDqoTd_!!6000000001605-2-tps-1410-506.png) +> **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. + ### 4.2 Case Study #### Before tuning: @@ -190,3 +192,5 @@ astuner: 2. Learn to obtain an access token correctly ![After tuning](https://img.alicdn.com/imgextra/i2/O1CN01xiF9UU20h62dyrZ4x_!!6000000006880-2-tps-1182-793.png) + +> **Token-level Visualization:** These detailed logs are generated by Beast-Logger. See [Beast-Logger Usage](./beast_logger.md) for more details. diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index 74ba8afa..cf2e93b4 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -162,6 +162,8 @@ astuner --conf tutorial/example_countdown/countdown.yaml --backbone='verl' ![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01TtaeD91rnfBF736Zu_!!6000000005676-2-tps-1328-630.png) +> **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. + ### 4.2 Case Study Agents are already able to deal with some simple problems at the beginning of the training process; however, small models inevitably produce many answers that fail to fully meet the requirements. In some problems, the agent does not strictly follow the instructions, such as invalid output format, reusing numbers, or missing expression outputs. @@ -192,3 +194,5 @@ However, tuning resolves these issues, as shown in the example below: ![After tuning](https://img.alicdn.com/imgextra/i1/O1CN011HjAxo20DKIcPAPVr_!!6000000006815-2-tps-1658-506.png) ![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01C3kUnV221zjPi30rd_!!6000000007061-2-tps-1650-730.png) + +> **Token-level Visualization:** These detailed logs are generated by Beast-Logger. See [Beast-Logger Usage](./beast_logger.md) for more details. diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index 7d16a084..77faedf3 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -135,3 +135,5 @@ class FrozenLakeWorkflow(Workflow): ### 4.1 Training Curve ![](https://img.alicdn.com/imgextra/i3/O1CN01ZfICUr1Rs4zXrPPXQ_!!6000000002166-2-tps-858-614.png) + +> **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index bb415646..7e0f871a 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -122,6 +122,8 @@ At the code level, everything is implemented in `tutorial/example_learn2ask/lear ![curve](https://img.alicdn.com/imgextra/i2/O1CN01STeE8G1ricp6jySto_!!6000000005665-2-tps-866-614.png) +> **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. + This training curve reflects the trend of the reward over time. The reward includes: **Format Score** (whether the model asks exactly one question) and **Content Score** (whether it directly asks about the missing key information in `Reference Information`). Therefore, a rising curve indicates the model gradually learns to produce **one clear question** and to hit missing information more often, rather than asking generic questions or producing ambiguous/uninformative questions. diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index 34479d49..8176d83e 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -190,6 +190,8 @@ If you observe the model “almost solved it but messed up tool-call formatting ![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) +> **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. + Interpretation: as training progresses, reward increases. This usually means the agent becomes more stable on **two things**: * **Using tools when it should**: it can correctly emit a `` and call `execute_python_code` for computation. @@ -239,6 +241,8 @@ After tuning, the agent often follows a clean 3-stage pattern (corresponding to ![image](https://img.alicdn.com/imgextra/i4/O1CN01WarPpf1yNk4awZOIO_!!6000000006567-2-tps-1363-422.png) +> **Token-level Visualization:** These detailed logs are generated by Beast-Logger. See [Beast-Logger Usage](./beast_logger.md) for more details. + On the right side of the figure, the colored blocks are a **token-level sequence visualization**: * **each block is one token** (the number inside is the token id), diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index 25a08f75..b9088576 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -129,6 +129,8 @@ If you need a more fine-grained evaluation (e.g., giving partial credit for key ![image](https://img.alicdn.com/imgextra/i3/O1CN01ldZYDT1ZqGLHuwsrS_!!6000000003245-2-tps-2000-839.png) +> **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. + ### 4.2 Case Study #### Behavior Shifts @@ -139,6 +141,8 @@ Significant role-playing improvement is observed during the experiment. ![](https://img.alicdn.com/imgextra/i1/O1CN01v8VqLB1aYEMfzyTHr_!!6000000003341-2-tps-2104-1016.png) +> **Token-level Visualization:** These detailed logs are generated by Beast-Logger. See [Beast-Logger Usage](./beast_logger.md) for more details. + 2. The agent develops multiple strategies for winning. For example: - **Misleading opponents**: "Let's keep an eye on the seer and the witch. They could be werewolves trying to hide". - **Appealing to reason**: "We need to be wary of fake seers and watch for inconsistencies in stories, Player-Y as hunter should act carefully". diff --git a/docs/en/visualization.md b/docs/en/visualization.md new file mode 100644 index 00000000..15e91ed0 --- /dev/null +++ b/docs/en/visualization.md @@ -0,0 +1,117 @@ +# Training Visualization + +Monitoring training progress through visualized metrics is essential for understanding model behavior and tuning hyperparameters effectively. AgentScope Tuner supports multiple visualization backends to track training curves, reward trends, and other key metrics in real-time. + +--- + +### 1. Supported Visualization Tools + +AgentScope Tuner supports the following visualization backends: + +- **SwanLab** (Recommended): A modern experiment tracking platform designed for AI research. [Learn more about SwanLab](https://docs.swanlab.cn/guide_cloud/general/what-is-swanlab.html) +- **WandB**: Weights & Biases experiment tracking platform +- **TensorBoard**: Traditional visualization toolkit from TensorFlow +- **Console**: Simple text-based logging to standard output + +--- + +### 2. Quick Start with SwanLab + +#### 2.1 Configure SwanLab + +Simply set the logger backend to `swanlab` in your YAML configuration: + +```yaml +astuner: + trainer_common: + logger: swanlab +``` + +#### 2.2 Start Training + +Launch your training as usual: + +```bash +astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +``` + +#### 2.3 View Training Curves + +Once training starts, SwanLab will automatically: + +1. Track key metrics (reward, success rate, loss, etc.) +2. Generate real-time training curves +3. Provide a web dashboard for visualization + +You can access the SwanLab dashboard through the URL printed in the training logs, or visit the SwanLab web interface to view your experiments. + +--- + +### 3. Understanding Training Curves + +#### 3.1 Key Metrics to Monitor + +The following metrics are typically tracked during training: + +- **Reward**: The average reward per episode, indicating task performance +- **Success Rate**: Percentage of successfully completed tasks +- **Loss**: Training loss from the policy optimization algorithm +- **Response Length**: Average length of model responses +- **KL Divergence**: Divergence between the current policy and the reference policy + +#### 3.2 Interpreting the Curves + +**Reward Curve:** + +![Example Training Curve](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) + +A typical reward curve shows: + +- **Initial Phase**: Reward may be low or unstable as the model explores +- **Learning Phase**: Reward gradually increases as the model learns better strategies +- **Convergence**: Reward plateaus when the model reaches optimal performance + +**What to look for:** + +- **Rising trend**: Indicates successful learning +- **Plateaus**: May indicate convergence or need for hyperparameter adjustment +- **Sudden drops**: Could signal instability or overfitting + +--- + +### 4. Best Practices + +#### 4.1 Monitor Multiple Runs + +Compare different hyperparameter settings by running multiple experiments and comparing their curves side-by-side in SwanLab or WandB. + +#### 4.2 Set Appropriate Logging Frequency + +Balance between logging detail and training overhead: + +```yaml +astuner: + trainer_common: + # Log every N steps + log_freq: 1 +``` + +#### 4.3 Save Checkpoints at Key Points + +Configure checkpoint saving to preserve models at peak performance: + +```yaml +astuner: + trainer_common: + save_freq: 100 # Save every 100 steps +``` + +--- + +### 5. Learn More + +For more detailed information about visualization and monitoring: + +- [SwanLab Documentation](https://docs.swanlab.cn/guide_cloud/general/what-is-swanlab.html) +- [Configuration Guide](./configuration.md#logging--monitoring) +- [Beast-Logger Usage](./beast_logger.md) - Token-level debugging visualization diff --git a/docs/zh/beast_logger.md b/docs/zh/beast_logger.md new file mode 100644 index 00000000..eb141e39 --- /dev/null +++ b/docs/zh/beast_logger.md @@ -0,0 +1,36 @@ +# Beast-Logger 使用指南 + +Beast-logger 是一个面向 LLM 系统构建的日志工具包,能够提供可靠的、细粒度到 **token-level** 的高分辨率 LLM 活动日志,这种粒度与完整性在其他项目中几乎前所未有。 + +下面介绍如何在 agentscope-tuner 中使用 beast-logger。 + +## 在 agentscope-tuner 中使用 + +1. 使用 agentscope-tuner 的 launcher 启动训练或调试。 + +2. 等待第一个 batch 完成。 + +3. 找到日志文件。默认情况下,它们会放在 `saved_experiments/${experiment_name}` 目录下。例如: + `saved_experiments/benchmark_frozenlake_20251223_2305` + +4. 在 VSCode 终端(或任何支持端口转发的软件)中运行 `beast_logger_go` 命令启动 Web 日志查看器。然后点击 `http://127.0.0.1:8181` 打开页面(VSCode 会自动将该端口从服务器转发到你的本地电脑)。 + +
+image +
+ +5. 填入日志文件所在目录的**绝对路径(ABSOLUTE path)**,然后点击 `submit`。(Beast-logger 会递归扫描该路径,并在可能的情况下自动选择包含文件数量最少的最深层目录。) + +
+image +
+ +6. 选择要展示的条目(entry)。 + +* 黄色 tokens:被排除在 loss 计算之外的 tokens +* 蓝色 tokens:参与 loss 计算的 tokens +* 将鼠标悬停在某个 token 上:会显示该 token 的 logprob 值 + +
+image +
diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index c8e41d2e..277ab03c 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -134,6 +134,8 @@ astuner: ![Training curve (small batch)](https://img.alicdn.com/imgextra/i2/O1CN01toRt2c1Nj8nKDqoTd_!!6000000001605-2-tps-1410-506.png) +> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). + ### 4.2 案例展示 #### 调优前: @@ -155,3 +157,5 @@ astuner: 2. 学会正确获取 access token ![After tuning](https://img.alicdn.com/imgextra/i2/O1CN01xiF9UU20h62dyrZ4x_!!6000000006880-2-tps-1182-793.png) + +> **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index 327fbdb0..254c0a02 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -138,6 +138,8 @@ astuner --conf tutorial/example_countdown/countdown.yaml --backbone='verl' ![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01TtaeD91rnfBF736Zu_!!6000000005676-2-tps-1328-630.png) +> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). + ### 4.2 案例分析 在训练初期,Agent 已经能够处理一些简单问题;但由于小模型的能力限制,仍然会产生许多无法完全满足要求的答案。在一些题目中,Agent 没有严格遵循指令,例如输出格式不正确、重复使用数字、或缺少表达式输出。 @@ -168,3 +170,5 @@ boxing the answer as \boxed{{64}}.<|im_end|> ![After tuning](https://img.alicdn.com/imgextra/i1/O1CN011HjAxo20DKIcPAPVr_!!6000000006815-2-tps-1658-506.png) ![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01C3kUnV221zjPi30rd_!!6000000007061-2-tps-1650-730.png) + +> **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md index 928c8bf9..24e7303b 100644 --- a/docs/zh/example_frozenlake.md +++ b/docs/zh/example_frozenlake.md @@ -111,6 +111,8 @@ class FrozenLakeWorkflow(Workflow): ### 4.1 训练曲线 +> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 + *(留空)* ### 4.2 案例分析 diff --git a/docs/zh/example_learning_to_ask.md b/docs/zh/example_learning_to_ask.md index f74e450d..47279088 100644 --- a/docs/zh/example_learning_to_ask.md +++ b/docs/zh/example_learning_to_ask.md @@ -122,6 +122,8 @@ astune: ![curve](https://img.alicdn.com/imgextra/i2/O1CN01STeE8G1ricp6jySto_!!6000000005665-2-tps-866-614.png) +> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 + 这张训练曲线反映的是reward 变化趋势。reward包括:Format Score(是否只问一个问题)和 Content Score(是否直接追问 Reference Information 中缺失的关键信息)。 因此,曲线升高表示模型逐渐学会:把输出稳定成“一个清晰问题”,并且更频繁地命中缺失信息,而不是泛泛而问或提出含糊、无信息量的问题。 diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index 6b06f911..2a5087ab 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -193,6 +193,8 @@ return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) #### 4.1 训练曲线 +> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 + 解读:随着训练进行,reward 随之上升。这通常意味着智能体在**两件事**上变得更稳定: * **该用工具时会用**:能正确发起 ``,并在需要计算时调用 `execute_python_code`。 @@ -241,6 +243,8 @@ return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) 图中右侧彩色块是 **token 级别的序列可视化**: +> **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md)。 + * **每个小块代表一个 token**(块内数字是 token id)。 * 块的顺序就是模型**消耗/生成** token 的顺序。 * 重点不在于 token id 本身,而在于你能否看到清晰的边界标记,例如: diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index 5b32aec7..cce98733 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -107,6 +107,8 @@ astuner: ![image](https://img.alicdn.com/imgextra/i3/O1CN01ldZYDT1ZqGLHuwsrS_!!6000000003245-2-tps-2000-839.png) +> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). + ### 4.2 案例展示 #### 行为变化 @@ -117,6 +119,8 @@ astuner: ![](https://img.alicdn.com/imgextra/i1/O1CN01v8VqLB1aYEMfzyTHr_!!6000000003341-2-tps-2104-1016.png) +> **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). + 2. Agent 会发展出多种取胜策略。例如: - **误导对手**:"重点关注预言家和女巫。他们可能是试图隐藏身份的狼人。" - **诉诸理性**:"我们要警惕假预言家,注意叙事是否自洽;Player-Y 作为猎人需要谨慎行动。" diff --git a/docs/zh/visualization.md b/docs/zh/visualization.md new file mode 100644 index 00000000..77209597 --- /dev/null +++ b/docs/zh/visualization.md @@ -0,0 +1,117 @@ +# 训练可视化 + +通过可视化指标监控训练进度,对于理解模型行为、以及更高效地调参至关重要。AgentScope Tuner 支持多种可视化后端,可用于实时跟踪训练曲线、奖励趋势以及其他关键指标。 + +--- + +### 1. 支持的可视化工具 + +AgentScope Tuner 支持以下可视化后端: + +* **SwanLab**(推荐):面向 AI 研究的现代化实验跟踪平台。[了解 SwanLab](https://docs.swanlab.cn/guide_cloud/general/what-is-swanlab.html) +* **WandB**:Weights & Biases 实验跟踪平台 +* **TensorBoard**:TensorFlow 提供的传统可视化工具 +* **Console**:将日志以纯文本形式输出到标准输出 + +--- + +### 2. SwanLab 快速开始 + +#### 2.1 配置 SwanLab + +只需在 YAML 配置中将 logger 后端设置为 `swanlab`: + +```yaml +astuner: + trainer_common: + logger: swanlab +``` + +#### 2.2 启动训练 + +像平时一样启动训练: + +```bash +astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +``` + +#### 2.3 查看训练曲线 + +训练启动后,SwanLab 会自动: + +1. 记录关键指标(reward、success rate、loss 等) +2. 生成实时训练曲线 +3. 提供可视化的 Web Dashboard + +你可以通过训练日志中打印的 URL 打开 SwanLab 面板,或直接访问 SwanLab 的 Web 界面查看你的实验记录。 + +--- + +### 3. 理解训练曲线 + +#### 3.1 需要重点关注的指标 + +训练过程中通常会跟踪以下指标: + +* **Reward**:每个 episode 的平均奖励,反映任务表现 +* **Success Rate**:任务成功完成的比例 +* **Loss**:策略优化算法的训练损失 +* **Response Length**:模型回复的平均长度 +* **KL Divergence**:当前策略与参考策略之间的 KL 散度 + +#### 3.2 如何解读曲线 + +**Reward 曲线:** + +![Example Training Curve](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) + +一条典型的 reward 曲线通常包含: + +* **初始阶段**:模型仍在探索,reward 可能较低或波动较大 +* **学习阶段**:随着策略变好,reward 逐步上升 +* **收敛阶段**:当模型接近最优表现时,reward 开始趋于平稳(平台期) + +**建议重点观察:** + +* **持续上升趋势**:通常意味着学习有效 +* **平台期**:可能表示已经收敛,或需要调整超参数以进一步提升 +* **突然下降**:可能是训练不稳定、或出现过拟合等问题信号 + +--- + +### 4. 最佳实践 + +#### 4.1 对比多次实验 + +通过多次实验对比不同超参数设置的效果,并在 SwanLab 或 WandB 中将曲线并排比较,能更高效地定位有效配置。 + +#### 4.2 设置合适的日志频率 + +在日志细节与训练开销之间取得平衡: + +```yaml +astuner: + trainer_common: + # 每 N step 记录一次日志 + log_freq: 1 +``` + +#### 4.3 在关键位置保存 Checkpoint + +配置 checkpoint 保存策略,以保留峰值表现阶段的模型: + +```yaml +astuner: + trainer_common: + save_freq: 100 # 每 100 step 保存一次 +``` + +--- + +### 5. 了解更多 + +关于可视化与监控的更多信息: + +* [SwanLab Documentation](https://docs.swanlab.cn/guide_cloud/general/what-is-swanlab.html) +* [Configuration Guide](./configuration.md#logging--monitoring) +* [Beast-Logger Usage](./beast_logger.md) - token-level 调试可视化 From caeb50566ca2d2f2e16d3dba27e58000f0504d34 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 24 Dec 2025 12:12:54 +0800 Subject: [PATCH 336/462] docs: refactor countdown and frozenlake tutorials --- docs/en/example_countdown.md | 54 ++++++++++++-------------- docs/en/example_frozenlake.md | 50 +++++++++++++++++------- docs/zh/example_countdown.md | 58 +++++++++++++--------------- docs/zh/example_frozenlake.md | 72 ++++++++++++++++++++++------------- 4 files changed, 134 insertions(+), 100 deletions(-) diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index cf2e93b4..7043d4ff 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -1,12 +1,12 @@ # Countdown -## 1. Introduction +## 1. Overview Countdown is a math puzzle game. Given a list of numbers and a target number, the player needs to use the numbers and the four basic arithmetic operations (addition, subtraction, multiplication, and division) to form an expression that evaluates to the target number. Each number can be used only once, but parentheses can be used freely to change the order of operations. ## 2. Quick Start -### 2.1 Prepare Dataset +### 2.1 Preparation Download the `Jiayi-Pan/Countdown-Tasks-3to4` dataset and split it into training and test sets: ```bash @@ -44,7 +44,7 @@ If you want to breakpoint-debug the workflow/judge locally: # astuner --kill="python|ray" clear && \ -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: @@ -70,12 +70,12 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` lik ``` -## 3. Preparation +## 3. Understand In this section, we will cover the details of this tutorial. -### 3.1 Prepare AgentScope Workflow +### 3.1 Core Process See details in `tutorial/example_countdown/countdown.py`. You can create new AgentScope Workflow code anywhere in the project. - **Define the AgentScope workflow** @@ -106,24 +106,7 @@ WorkflowOutput( ) ``` -### 3.2 Prepare Reward -A simple Judge is provided in `astuner/task_judge/countdown_answer_as_judge.py.py`. You can create new Judge code anywhere in the project. - -Judge input parameters include: - -``` -workflow_task: Task information(if reference answer is included, it can be retrieved from here) -workflow_output: Task information output (final_answer needs to be added manually) -``` - -Judge return values: - -- raw_reward -- is_success - -### 3.3 Start Training - -#### 3.1 Configure +### 3.2 Configuration Details Copy and modify key parameters in `tutorial/example_countdown/countdown.yaml`. The most relevant parts in the yaml file are marked with ✨✨✨✨ symbols. 1. Read task (corresponds to configuration field `astuner.task_reader`) @@ -149,16 +132,29 @@ astuner: path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct ``` -#### 3.2 Start Training +### 3.3 Code Map -```bash -# It is recommended to kill all ray, vllm, and env_service processes before starting ( python launcher.py --kill="python|ray|vllm" ) -astuner --conf tutorial/example_countdown/countdown.yaml --backbone='verl' +- `tutorial/example_countdown/countdown.py`: defines the AgentScope workflow (e.g., `ExampleCountdownLearn`). +- `tutorial/example_countdown/countdown.yaml`: wires together task reader, workflow, judge, and model. + +### 3.4 Reward/Evaluation Mechanism +A simple Judge is provided in `astuner/task_judge/countdown_answer_as_judge.py`. You can create new Judge code anywhere in the project. + +Judge input parameters include: + +``` +workflow_task: Task information(if reference answer is included, it can be retrieved from here) +workflow_output: Task information output (final_answer needs to be added manually) ``` -## 4. Reference Result +Judge return values: + +- raw_reward +- is_success + +## 4. Results -### 4.1 Training Curve +### 4.1 Training Curves/Metrics ![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01TtaeD91rnfBF736Zu_!!6000000005676-2-tps-1328-630.png) diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index 77faedf3..6cc0fd8f 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -10,7 +10,7 @@ This example demonstrates how to create a trainable agent workflow to solve this ## 2. Quick Start -### 2.1 Prepare the Environment +### 2.1 Preparation Install the dependencies required for the Frozen Lake: @@ -23,7 +23,13 @@ pip install gymnasium[toy_text] Use the provided configuration file to quickly start training: ```bash -astuner --conf tutorial/example_frozenlake/frozenlake.yaml --backbone=trinity +astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='trinity' --with-ray +``` + +To try a harder setting: + +```bash +astuner --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone=trinity --with-ray ```
@@ -36,7 +42,7 @@ If you want to breakpoint-debug the workflow/judge locally: # astuner --kill="python|ray" clear && \ -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: @@ -64,7 +70,25 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` lik ## 3. Understand -### 3.1 Implement the Frozen Lake Environment +### 3.1 Core Process + +This example packages a multi-step environment interaction loop into a trainable `Workflow`: + +- The workflow resets the environment and renders the current grid as a text observation for the agent. +- The agent reads the observation and outputs one of `Up | Down | Left | Right`. +- The environment executes the action, returns the next observation and reward. +- The loop stops on success or when the max step limit is reached. + +### 3.2 Configuration Details + +The key fields in `tutorial/example_frozenlake/frozenlake_easy.yaml` / `frozenlake_hard.yaml` are: + +- `astuner.rollout.agentscope_workflow`: entry point of the workflow class, set to `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`. +- `astuner.rollout.multi_turn.max_steps`: maximum steps per episode (also used by the agent). +- `frozen_lake.frozen_lake_size`: grid size (e.g. 4 for easy, 6 for hard). +- `frozen_lake.is_slippery`: whether the action may slip to unintended directions. + +### 3.3 Code Map The `FrozenLakeEnv` class in `tutorial/example_frozenlake/frozenlake.py` wraps the Gymnasium Frozen Lake environment, mainly exposing the `step` and `reset` methods. @@ -81,8 +105,6 @@ The `FrozenLakeEnv` class in `tutorial/example_frozenlake/frozenlake.py` wraps t - The `reset` method regenerates the lake environment based on user parameters. -### 3.2 Implement the Agent - The `FrozenLakeAgent` class in `tutorial/example_frozenlake/frozenlake.py` implements the agent's decision logic, mainly through the `step` method, which takes the current environment observation as input and returns the chosen action. The core is a ReActAgent. ```python @@ -104,19 +126,13 @@ class FrozenLakeAgent: # Step 3: Parse response and return action ``` -### 3.3 Integrate Environment and Agent as a Workflow - -The `FrozenLakeWorkflow` class in `tutorial/example_frozenlake/frozenlake.py` integrates the environment and agent, mainly exposing the `step` and `reset` methods for external interaction. - -The core process is as follows: +The `FrozenLakeWorkflow` class in `tutorial/example_frozenlake/frozenlake.py` integrates the environment and agent, mainly exposing the `execute` method. ```python class FrozenLakeWorkflow(Workflow): async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: # init agent and env - # self.agent = FrozenLakeAgent(...) - # self.env = FrozenLakeEnv(...) # reset environment and get initial `observation_str` rewards = [] for _ in range(self.max_steps): @@ -130,7 +146,13 @@ class FrozenLakeWorkflow(Workflow): ) ``` -## 4. Performance +### 3.4 Reward + +- The per-episode reward is the sum of step rewards. +- In this FrozenLake setup, the agent gets `+1` when reaching the goal, otherwise `0`. +- The workflow also returns metadata such as `terminate_reason` (`success`, `agent_error`, `max_steps_reached`) and `step_count`. + +## 4. Results ### 4.1 Training Curve diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index 254c0a02..c9852dc3 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -1,12 +1,12 @@ # 倒计时数字游戏 -## 1. 介绍 +## 1. 概述 Countdown 任务是一个数学益智游戏:给定一组数字和一个目标数字,玩家需要利用这组数字,通过加、减、乘、除四则运算,构造一个算式,使其计算结果等于目标数字。每个数字只能使用一次,但可以自由使用括号改变运算顺序。 ## 2. 快速开始 -### 2.1 准备数据集 +### 2.1 准备工作 下载 `Jiayi-Pan/Countdown-Tasks-3to4` 数据集,并划分训练、测试集: ```bash @@ -25,7 +25,7 @@ task = Task( ) ``` -### 2.2 启动训练 +### 2.2 开始训练 直接运行以下命令: @@ -40,18 +40,18 @@ astuner --conf tutorial/example_countdown/countdown.yaml --backbone='verl' 不启用 Ray 在本地运行,便于更快迭代: ```bash -astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。
-## 3. 准备 +## 3. 理解实现 本节将介绍本教程的实现细节。 -### 3.1 准备 AgentScope Workflow +### 3.1 核心流程 详见 `tutorial/example_countdown/countdown.py`。你可以在项目中的任意位置编写新的 AgentScope Workflow 代码。 - **定义 AgentScope Workflow** @@ -82,24 +82,7 @@ WorkflowOutput( ) ``` -### 3.2 准备 Reward -在 `astuner/task_judge/countdown_answer_as_judge.py.py` 中提供了一个简单的 Judge 示例。你也可以在项目任意位置实现自己的 Judge 逻辑。 - -Judge 的输入参数包括: - -``` -workflow_task: 任务信息(如果包含参考答案,可以从这里获取) -workflow_output: 任务信息输出(final_answer需要手动添加) -``` - -Judge 的返回值包括: - -- raw_reward -- is_success - -### 3.3 启动训练 - -#### 3.1 配置 +### 3.2 配置说明 拷贝并修改 `tutorial/example_countdown/countdown.yaml` 中的关键配置参数。yaml 中与本示例最相关的部分已经用 ✨✨✨✨ 标出。 1. 读取任务(对应配置字段 `astuner.task_reader`) @@ -125,21 +108,34 @@ astuner: path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct ``` -#### 3.2 启动训练 +### 3.3 代码解读 -```bash -# 建议在启动前先杀掉所有 ray、vllm 和 env_service 相关进程( python launcher.py --kill="python|ray|vllm" ) -astuner --conf tutorial/example_countdown/countdown.yaml --backbone='verl' +- `tutorial/example_countdown/countdown.py`:定义 AgentScope workflow(例如 `ExampleCountdownLearn`)。 +- `tutorial/example_countdown/countdown.yaml`:将 task_reader、workflow、judge、model 等模块连接起来。 + +### 3.4 奖励/评估机制 +在 `astuner/task_judge/countdown_answer_as_judge.py` 中提供了一个简单的 Judge 示例。你也可以在项目任意位置实现自己的 Judge 逻辑。 + +Judge 的输入参数包括: + +``` +workflow_task: 任务信息(如果包含参考答案,可以从这里获取) +workflow_output: 任务信息输出(final_answer需要手动添加) ``` -## 4. 参考结果 +Judge 的返回值包括: -### 4.1 训练曲线 +- raw_reward +- is_success -![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01TtaeD91rnfBF736Zu_!!6000000005676-2-tps-1328-630.png) +## 4. 结果 + +### 4.1 训练曲线/指标 > **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). +![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01TtaeD91rnfBF736Zu_!!6000000005676-2-tps-1328-630.png) + ### 4.2 案例分析 在训练初期,Agent 已经能够处理一些简单问题;但由于小模型的能力限制,仍然会产生许多无法完全满足要求的答案。在一些题目中,Agent 没有严格遵循指令,例如输出格式不正确、重复使用数字、或缺少表达式输出。 diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md index 24e7303b..d849ef12 100644 --- a/docs/zh/example_frozenlake.md +++ b/docs/zh/example_frozenlake.md @@ -1,16 +1,16 @@ # 冰冻湖游戏 -## 1. 介绍 +## 1. 概述 **Frozen Lake** 是一个经典的强化学习任务,来自 [Gymnasium](https://gymnasium.farama.org/environments/toy_text/frozen_lake/)。 -在该环境中,智能体会被安排在一个随机生成的冰湖上,冰湖由安全的冰面(_),危险的冰洞(O)以及终点(G)组成,智能体的位置用 P 表示。智能体的目标是从 P 位置出发到达终点 G,并避开途中的冰洞。智能体每次行动可以选择向上、下、左、右四个方向移动,但由于冰面的光滑特性,智能体有一定概率会滑向非预期的方向。 +在该环境中,Agent 会被安排在一个随机生成的冰湖上,冰湖由安全的冰面(_),危险的冰洞(O)以及终点(G)组成,Agent 的位置用 P 表示。Agent 的目标是从 P 位置出发到达终点 G,并避开途中的冰洞。Agent 每次行动可以选择向上、下、左、右四个方向移动,但由于冰面的光滑特性,Agent 有一定概率会滑向非预期的方向。 本实例展示了如何创建一个可训练的 Agent 工作流来解决这一导航挑战。 ## 2. 快速开始 -### 2.1 准备环境 +### 2.1 准备工作 安装 Frozen Lake 任务所需的依赖: @@ -18,12 +18,18 @@ pip install gymnasium[toy_text] ``` -### 2.2 启动训练 +### 2.2 开始训练 使用提供的配置文件快速开始训练: ```bash -astuner --conf tutorial/example_frozenlake/frozenlake.yaml --backbone=trinity +astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='trinity' --with-ray +``` + +尝试更困难的设置: + +```bash +astuner --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone='trinity' --with-ray ```
@@ -32,35 +38,51 @@ astuner --conf tutorial/example_frozenlake/frozenlake.yaml --backbone=trinity 不启用 Ray 在本地运行,便于更快迭代: ```bash -astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。
-## 3. 实现细节介绍 +## 3. 理解实现 + +### 3.1 核心流程/原理 + +本示例将 Frozen Lake 环境封装为可训练的 `Workflow`: + +- Workflow 重置环境并将网格地图渲染为文本 observation,提供给 Agent。 +- Agent 读取 observation 并输出 `Up | Down | Left | Right` 中的一个动作。 +- 环境执行动作,返回新的 observation 与 reward。 +- 成功到达目标或超过最大步数则终止。 + +### 3.2 配置说明 -### 3.1 实现 Frozen Lake 环境 +`tutorial/example_frozenlake/frozenlake_easy.yaml` / `frozenlake_hard.yaml` 中与本任务相关的关键字段包括: + +- `astuner.rollout.agentscope_workflow`: Workflow 入口,示例中为 `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`。 +- `astuner.rollout.multi_turn.max_steps`:单次 episode 的最大步数(Agent 与环境均使用)。 +- `frozen_lake.frozen_lake_size`:地图大小(easy 为 4,hard 为 6)。 +- `frozen_lake.is_slippery`:是否启用打滑。 + +### 3.3 代码解读 在 `tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeEnv` 类实现了对 Gymnasium Frozen Lake 环境的封装,主要对外提供 `step` 和 `reset` 两个方法。 -- `step` 方法会根据智能体的动作(action)返回环境的下一个状态(observation)、奖励(reward)、是否结束(done)以及其他辅助信息。 - - observation: 智能体移动后冰湖的状态信息,使用字符串表示,例如: +- `step` 方法会根据 Agent 的动作(action)返回环境的下一个状态(observation)、奖励(reward)、是否结束(done)以及其他辅助信息。 + - observation: Agent 移动后冰湖的状态信息,使用字符串表示,例如: ``` _ _ G _ _ _ P O O ``` - - reward: 智能体每次移动获得的奖励,达到终点 G 时奖励为 1,否则为 0。 - - done: 布尔值,如果智能体是否到达终点或掉入冰洞则为 True,否则为 False。 + - reward: Agent 每次移动获得的奖励,达到终点 G 时奖励为 1,否则为 0。 + - done: 布尔值,如果 Agent 是否到达终点或掉入冰洞则为 True,否则为 False。 - info: 其他辅助信息。 - `reset` 方法可根据用户传入的参数重新生成冰湖环境。 -### 3.2 实现 Agent - -`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeAgent` 类实现了智能体的决策逻辑,主要通过 `step` 方法接收当前环境状态(observation)作为输入,返回智能体选择的动作(action),其中的核心是一个 ReActAgent。 +`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeAgent` 类实现了 Agent 的决策逻辑,主要通过 `step` 方法接收当前环境状态(observation)作为输入,返回 Agent 选择的动作(action),其中的核心是一个 ReActAgent。 ```python class FrozenLakeAgent: @@ -81,9 +103,7 @@ class FrozenLakeAgent: # Step 3: 解析响应并返回动作 ``` -### 3.3 将环境和智能体集成为 Workflow - -`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeWorkflow` 类实现了环境和智能体的集成,主要通过 `step` 和 `reset` 方法与外部交互。 +`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeWorkflow` 类实现了环境和 Agent 的集成,主要通过 `execute` 方法对外提供训练/评估时的入口。 其中的核心流程如下: @@ -92,8 +112,6 @@ class FrozenLakeWorkflow(Workflow): async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: # init agent and env - # self.agent = FrozenLakeAgent(...) - # self.env = FrozenLakeEnv(...) # reset environment and get initial `observation_str` rewards = [] for _ in range(self.max_steps): @@ -107,14 +125,16 @@ class FrozenLakeWorkflow(Workflow): ) ``` -## 4. 参考效果 +### 3.4 奖励(Reward / Evaluation)机制 -### 4.1 训练曲线 +- 单次 episode 的最终 reward 为各步 reward 的求和。 +- FrozenLake 场景中,达到目标时 reward 为 `1`,其他情况为 `0`。 +- Workflow 还会返回 `terminate_reason`(如 `success` / `agent_error` / `max_steps_reached`)以及 `step_count` 等元信息。 -> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 +## 4. 结果 -*(留空)* +### 4.1 训练曲线 -### 4.2 案例分析 +![](https://img.alicdn.com/imgextra/i3/O1CN01ZfICUr1Rs4zXrPPXQ_!!6000000002166-2-tps-858-614.png) -*(留空)* +> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 From 54f0c43859b64b8e604c99cb169eb07f5e058f93 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 24 Dec 2025 12:13:39 +0800 Subject: [PATCH 337/462] docs: fix debug command in tutorials --- docs/en/example_app_world.md | 2 +- docs/en/example_werewolves.md | 2 +- docs/zh/example_app_world.md | 2 +- docs/zh/example_werewolves.md | 12 ++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index cc7a7e2d..1eb08ed7 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -56,7 +56,7 @@ If you want to breakpoint-debug the workflow/judge locally: # astuner --kill="python|ray" clear && \ -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_appworld/math_agent.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index b9088576..3e4d4db8 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -39,7 +39,7 @@ If you want to breakpoint-debug the workflow/judge locally: # astuner --kill="python|ray" clear && \ -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_werewolves/math_agent.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 277ab03c..6c94136e 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -37,7 +37,7 @@ astuner --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --wi 不启用 Ray 在本地运行,便于更快迭代: ```bash -astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_appworld/learn2ask.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index cce98733..5788647b 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -1,21 +1,21 @@ # 狼人杀 -本教程展示了如何使用 AgentScope Tuner 来处理多智能体训练,令多个 Agent 在狼人杀游戏中决策、对抗和协作。 +本教程展示了如何使用 AgentScope Tuner 来处理多 Agent 训练,令多个 Agent 在狼人杀游戏中决策、对抗和协作。 ## 1. 概述 -狼人杀角色扮演游戏是一个典型的 POMDP(部分可观测马尔可夫决策过程,Partially Observable Markov Decision Process)问题。我们可以在这个协作型多智能体问题中使用「参数共享」的方法来训练 Agent。 +狼人杀角色扮演游戏是一个典型的 POMDP(部分可观测马尔可夫决策过程,Partially Observable Markov Decision Process)问题。我们可以在这个协作型多 Agent 问题中使用「参数共享」的方法来训练 Agent。 术语说明: - **部分可观测(Partially Observable)**:Agent 只能接收**局部信息**。即使属于同一阵营,一个 Agent 也无法获得其他 Agent 的观测信息。 - **马尔可夫决策过程(Markov Decision Process)**:根据当前局面做决策。 - **参数共享(Shared-parameter)**:多个 Agent 使用同一个模型作为策略。但需要注意:Agent **共享**策略(模型参数),但**不共享**感知(模型输入)。 -- **协作型多智能体问题(Cooperative multi-agent problem)**:Agent 之间目标一致(奖励一致)。 +- **协作型多 Agent 问题(Cooperative multi-agent problem)**:Agent 之间目标一致(奖励一致)。 - **环境(Environment)**:使用静态 **`Qwen3-235B-A22B`** 作为对手(不可训练 Agent),使用 **`Qwen2-7B`** 作为可训练 Agent(即 `trainable_targets`)。 ![image](https://img.alicdn.com/imgextra/i2/O1CN012JgVZC2ABczBhAzJs_!!6000000008165-0-tps-2048-2048.jpg) -本页展示如何将狼人杀这种社交推理类游戏作为多智能体环境,完成:准备数据与环境、编写 AgentScope Workflow、配置奖励模块,以及从本地调试到正式训练的完整流程。 +本页展示如何将狼人杀这种社交推理类游戏作为多 Agent 环境,完成:准备数据与环境、编写 AgentScope Workflow、配置奖励模块,以及从本地调试到正式训练的完整流程。 场景概述 - **场景**:经典狼人杀游戏,包括狼人(werewolf)、村民(villager)、预言家(seer)、女巫(witch)、猎人(hunter)等角色。 @@ -24,7 +24,7 @@ ## 2. 快速开始 正式训练(启用 Ray): -``` +```bash # ( astuner --kill="python|ray|vllm" ) astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray ``` @@ -35,7 +35,7 @@ astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' 不启用 Ray 在本地运行,便于更快迭代: ```bash -astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview +astuner --conf tutorial/example_werewolves/learn2ask.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 From 894d452879a563b06a377437266690d099031801 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 24 Dec 2025 12:44:00 +0800 Subject: [PATCH 338/462] docs: replace "Agent" in Chinese documentation --- docs/zh/configuration.md | 10 +++--- docs/zh/example_app_world.md | 8 ++--- docs/zh/example_countdown.md | 4 +-- docs/zh/example_frozenlake.md | 22 ++++++------ docs/zh/example_math_agent.md | 4 +-- docs/zh/example_tracing_feedback_loop.md | 8 ++--- docs/zh/example_werewolves.md | 18 +++++----- docs/zh/intro.md | 32 ++++++++--------- docs/zh/introduction.md | 34 +++++++++--------- docs/zh/quickstart.md | 2 +- docs/zh/tune_your_first_agent.md | 30 ++++++++-------- docs/zh/workflow.md | 46 ++++++++++++------------ 12 files changed, 109 insertions(+), 109 deletions(-) diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md index 003d134c..a06e82c3 100644 --- a/docs/zh/configuration.md +++ b/docs/zh/configuration.md @@ -12,12 +12,12 @@ AgentScope Tuner 使用 YAML 格式的配置文件来设置数据、训练算法 - `backbone`:选择训练后端,例如 `debug`、`trinity` 或 `verl`。 - **数据与奖励** - `task_reader`:如何加载训练 / 验证样本(EnvService、本地文件、HuggingFace 数据集等)。 - - `task_judge`:如何评估 Agent 并计算奖励(自定义评测器或基于 LLM 的自动打分器)。 + - `task_judge`:如何评估智能体并计算奖励(自定义评测器或基于 LLM 的自动打分器)。 - `data`:Prompt / Response 的长度和 batch 大小等。 - **模型** - `model`:要训练的基础模型从哪里加载(本地路径或 HuggingFace 仓库)。 - **Rollout 与交互配置** - - `rollout`:Agent 如何与环境交互(协议、采样参数、最大步数等)。 + - `rollout`:智能体如何与环境交互(协议、采样参数、最大步数等)。 - `context_tracker`:如何管理对话 / 历史信息。 - **训练配置** - `trainer_common`:全局训练超参数(epoch、checkpoint、优化算法参数、损失、FSDP、logger 等)。 @@ -26,7 +26,7 @@ AgentScope Tuner 使用 YAML 格式的配置文件来设置数据、训练算法 你可以从默认 YAML 开始,只修改与你的使用场景相关的部分。文末 *附录* 提供了一个 **完整配置示例** 供参考。 ## 模型 -要训练一个 Agent,首先需要指定待训练的模型,以及训练过程中使用的一些环境变量。 +要训练一个智能体,首先需要指定待训练的模型,以及训练过程中使用的一些环境变量。 在配置文件中,你可以设置从某个位置加载模型参数的路径: @@ -141,7 +141,7 @@ astuner: `data_generation` 和 `random_dummy` 也可用于特殊工作流(完整 schema 可参考 `astune_default.yaml`)。 ### Task Judge -`task_judge` 用于评估 Agent 的表现并计算奖励。 +`task_judge` 用于评估智能体的表现并计算奖励。 ```yaml astuner: @@ -183,7 +183,7 @@ astuner: ``` ### Rollout -`rollout` 配置控制 Agent 在与环境进行交互采样过程中的行为。 +`rollout` 配置控制智能体在与环境进行交互采样过程中的行为。 ```yaml astuner: diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 6c94136e..9fce2531 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -1,10 +1,10 @@ # App交互模拟 -本教程介绍如何训练一个 Agent 与 AppWorld 交互并解决复杂的任务。 +本教程介绍如何训练一个智能体与 AppWorld 交互并解决复杂的任务。 ## 1. 概述 -AppWorld 是一个模拟现实 APP 操作的沙盒环境,包含 9 个日常应用,可通过 457 个 API 操作,并预置了 106 个在模拟世界中生活的数字用户行为数据。我们的目标是调优一个 Agent,使其能够有效地在这些应用中执行并完成复杂任务。 +AppWorld 是一个模拟现实 APP 操作的沙盒环境,包含 9 个日常应用,可通过 457 个 API 操作,并预置了 106 个在模拟世界中生活的数字用户行为数据。我们的目标是调优一个智能体,使其能够有效地在这些应用中执行并完成复杂任务。 本文结构如下: @@ -52,7 +52,7 @@ astuner --conf tutorial/example_appworld/learn2ask.yaml --backbone='debug' --wit AppWorld 示例所使用的 AgentScope Workflow 代码位于:`tutorial/example_appworld/appworld.py`。 -代码首先定义了 AgentScope Workflow(将 Agent 的 `model` 设置为 `model_tuner`): +代码首先定义了 AgentScope Workflow(将智能体的 `model` 设置为 `model_tuner`): ```python agent = ReActAgent( @@ -120,7 +120,7 @@ astuner: # ✨✨✨✨ 设置需要训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - # ✨✨✨✨ 编写并选择 Agent + # ✨✨✨✨ 编写并选择智能体 agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: True debug: diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index c9852dc3..dbfacaa1 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -99,7 +99,7 @@ astuner: task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` 或 `dataset_file` 或 `huggingface_dat_repo` 或 `data_generation` rollout: - agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # ✨✨✨✨ 编写并选择 Agent + agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # ✨✨✨✨ 编写并选择智能体 task_judge: # ✨✨✨✨ 编写并选择评估函数 judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge @@ -138,7 +138,7 @@ Judge 的返回值包括: ### 4.2 案例分析 -在训练初期,Agent 已经能够处理一些简单问题;但由于小模型的能力限制,仍然会产生许多无法完全满足要求的答案。在一些题目中,Agent 没有严格遵循指令,例如输出格式不正确、重复使用数字、或缺少表达式输出。 +在训练初期,智能体已经能够处理一些简单问题;但由于小模型的能力限制,仍然会产生许多无法完全满足要求的答案。在一些题目中,智能体没有严格遵循指令,例如输出格式不正确、重复使用数字、或缺少表达式输出。 ``` bad case 1: 回答格式不符合要求。 diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md index d849ef12..4980316a 100644 --- a/docs/zh/example_frozenlake.md +++ b/docs/zh/example_frozenlake.md @@ -4,9 +4,9 @@ **Frozen Lake** 是一个经典的强化学习任务,来自 [Gymnasium](https://gymnasium.farama.org/environments/toy_text/frozen_lake/)。 -在该环境中,Agent 会被安排在一个随机生成的冰湖上,冰湖由安全的冰面(_),危险的冰洞(O)以及终点(G)组成,Agent 的位置用 P 表示。Agent 的目标是从 P 位置出发到达终点 G,并避开途中的冰洞。Agent 每次行动可以选择向上、下、左、右四个方向移动,但由于冰面的光滑特性,Agent 有一定概率会滑向非预期的方向。 +在该环境中,智能体会被安排在一个随机生成的冰湖上,冰湖由安全的冰面(_),危险的冰洞(O)以及终点(G)组成,智能体的位置用 P 表示。智能体的目标是从 P 位置出发到达终点 G,并避开途中的冰洞。智能体每次行动可以选择向上、下、左、右四个方向移动,但由于冰面的光滑特性,智能体有一定概率会滑向非预期的方向。 -本实例展示了如何创建一个可训练的 Agent 工作流来解决这一导航挑战。 +本实例展示了如何创建一个可训练的智能体工作流来解决这一导航挑战。 ## 2. 快速开始 @@ -51,8 +51,8 @@ astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debu 本示例将 Frozen Lake 环境封装为可训练的 `Workflow`: -- Workflow 重置环境并将网格地图渲染为文本 observation,提供给 Agent。 -- Agent 读取 observation 并输出 `Up | Down | Left | Right` 中的一个动作。 +- Workflow 重置环境并将网格地图渲染为文本 observation,提供给智能体。 +-智能体读取 observation 并输出 `Up | Down | Left | Right` 中的一个动作。 - 环境执行动作,返回新的 observation 与 reward。 - 成功到达目标或超过最大步数则终止。 @@ -61,7 +61,7 @@ astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debu `tutorial/example_frozenlake/frozenlake_easy.yaml` / `frozenlake_hard.yaml` 中与本任务相关的关键字段包括: - `astuner.rollout.agentscope_workflow`: Workflow 入口,示例中为 `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`。 -- `astuner.rollout.multi_turn.max_steps`:单次 episode 的最大步数(Agent 与环境均使用)。 +- `astuner.rollout.multi_turn.max_steps`:单次 episode 的最大步数(智能体与环境均使用)。 - `frozen_lake.frozen_lake_size`:地图大小(easy 为 4,hard 为 6)。 - `frozen_lake.is_slippery`:是否启用打滑。 @@ -69,20 +69,20 @@ astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debu 在 `tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeEnv` 类实现了对 Gymnasium Frozen Lake 环境的封装,主要对外提供 `step` 和 `reset` 两个方法。 -- `step` 方法会根据 Agent 的动作(action)返回环境的下一个状态(observation)、奖励(reward)、是否结束(done)以及其他辅助信息。 - - observation: Agent 移动后冰湖的状态信息,使用字符串表示,例如: +- `step` 方法会根据智能体的动作(action)返回环境的下一个状态(observation)、奖励(reward)、是否结束(done)以及其他辅助信息。 + - observation:智能体移动后冰湖的状态信息,使用字符串表示,例如: ``` _ _ G _ _ _ P O O ``` - - reward: Agent 每次移动获得的奖励,达到终点 G 时奖励为 1,否则为 0。 - - done: 布尔值,如果 Agent 是否到达终点或掉入冰洞则为 True,否则为 False。 + - reward:智能体每次移动获得的奖励,达到终点 G 时奖励为 1,否则为 0。 + - done: 布尔值,如果智能体是否到达终点或掉入冰洞则为 True,否则为 False。 - info: 其他辅助信息。 - `reset` 方法可根据用户传入的参数重新生成冰湖环境。 -`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeAgent` 类实现了 Agent 的决策逻辑,主要通过 `step` 方法接收当前环境状态(observation)作为输入,返回 Agent 选择的动作(action),其中的核心是一个 ReActAgent。 +`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeAgent` 类实现了智能体的决策逻辑,主要通过 `step` 方法接收当前环境状态(observation)作为输入,返回智能体选择的动作(action),其中的核心是一个 ReActAgent。 ```python class FrozenLakeAgent: @@ -103,7 +103,7 @@ class FrozenLakeAgent: # Step 3: 解析响应并返回动作 ``` -`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeWorkflow` 类实现了环境和 Agent 的集成,主要通过 `execute` 方法对外提供训练/评估时的入口。 +`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeWorkflow` 类实现了环境和 智能体 的集成,主要通过 `execute` 方法对外提供训练/评估时的入口。 其中的核心流程如下: diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index 2a5087ab..c805a5b5 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -7,7 +7,7 @@ ### 1. 概览 -在 **Math Agent** 中,每条训练样本是一道数学文字题(如 GSM8K)。智能体将学习: +在 **Math 智能体** 中,每条训练样本是一道数学文字题(如 GSM8K)。智能体将学习: * **分步推理**(ReAct 风格), * 在需要计算时**调用 Python 工具**, @@ -136,7 +136,7 @@ astune: Workflow 通常会做: * 注册工具(例如 `execute_python_code`) -* 构造一个 ReAct agent +* 构造一个 ReAct 智能体 * 从用户题目运行一轮对话 * 解析最终答案 * 通过 `WorkflowOutput(..., metadata={"final_answer": final_answer})` 返回答案,以便评审器评分。 diff --git a/docs/zh/example_tracing_feedback_loop.md b/docs/zh/example_tracing_feedback_loop.md index b71f5ee0..c3aca240 100644 --- a/docs/zh/example_tracing_feedback_loop.md +++ b/docs/zh/example_tracing_feedback_loop.md @@ -1,6 +1,6 @@ # 数据回流训练 -ASTune 允许你回收 Agent 在执行过程中产生的对话日志,并通过迭代训练持续优化该 Agent,我们将这一过程称为 **数据回流训练**。它主要提供以下能力: +ASTune 允许你回收 智能体 在执行过程中产生的对话日志,并通过迭代训练持续优化该 Agent,我们将这一过程称为 **数据回流训练**。它主要提供以下能力: + 从 agentscope studio 数据库中加载追踪日志 + 将日志转换为结构化的训练数据 @@ -24,10 +24,10 @@ ASTune 允许你回收 Agent 在执行过程中产生的对话日志,并通过 1. 使用 [agentscope](https://github.com/agentscope-ai/agentscope) 编写好了你的 Agent; 2. 按照 [文档](https://doc.agentscope.io/tutorial/task_tracing.html) 启用了 tracing 模块; -3. 部署了 Agent 并收集到了数据库文件。 +3. 部署了 智能体 并收集到了数据库文件。 默认情况下,agentscope-studio 会将追踪日志存储在 -`~/AgentScope-Studio/database.sqlite` 中,其中包含了用户与 Agent 之间的全部对话记录。 +`~/AgentScope-Studio/database.sqlite` 中,其中包含了用户与 智能体 之间的全部对话记录。 我们在 `tutorials/example_feedback_tracing/agent_deployed.py` 中准备了一个示例 Agent。你可以通过它模拟生成追踪日志,并得到对应的数据库文件。 @@ -78,7 +78,7 @@ astuner: astuner --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray ``` -训练完成后,你可以将新的 Agent 部署回生产环境,并继续收集新的日志。通过这样的闭环,你可以持续进行迭代的数据回流训练,不断提升 Agent 的效果。 +训练完成后,你可以将新的 智能体 部署回生产环境,并继续收集新的日志。通过这样的闭环,你可以持续进行迭代的数据回流训练,不断提升 智能体 的效果。 ## 自定义 diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index 5788647b..c2e2489a 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -1,16 +1,16 @@ # 狼人杀 -本教程展示了如何使用 AgentScope Tuner 来处理多 Agent 训练,令多个 Agent 在狼人杀游戏中决策、对抗和协作。 +本教程展示了如何使用 AgentScope Tuner 来处理多 智能体 训练,令多个 智能体 在狼人杀游戏中决策、对抗和协作。 ## 1. 概述 -狼人杀角色扮演游戏是一个典型的 POMDP(部分可观测马尔可夫决策过程,Partially Observable Markov Decision Process)问题。我们可以在这个协作型多 Agent 问题中使用「参数共享」的方法来训练 Agent。 +狼人杀角色扮演游戏是一个典型的 POMDP(部分可观测马尔可夫决策过程,Partially Observable Markov Decision Process)问题。我们可以在这个协作型多 智能体 问题中使用「参数共享」的方法来训练 Agent。 术语说明: -- **部分可观测(Partially Observable)**:Agent 只能接收**局部信息**。即使属于同一阵营,一个 Agent 也无法获得其他 Agent 的观测信息。 +- **部分可观测(Partially Observable)**:Agent 只能接收**局部信息**。即使属于同一阵营,一个 智能体 也无法获得其他 智能体 的观测信息。 - **马尔可夫决策过程(Markov Decision Process)**:根据当前局面做决策。 -- **参数共享(Shared-parameter)**:多个 Agent 使用同一个模型作为策略。但需要注意:Agent **共享**策略(模型参数),但**不共享**感知(模型输入)。 -- **协作型多 Agent 问题(Cooperative multi-agent problem)**:Agent 之间目标一致(奖励一致)。 +- **参数共享(Shared-parameter)**:多个 智能体 使用同一个模型作为策略。但需要注意:Agent **共享**策略(模型参数),但**不共享**感知(模型输入)。 +- **协作型多 智能体 问题(Cooperative multi-agent problem)**:Agent 之间目标一致(奖励一致)。 - **环境(Environment)**:使用静态 **`Qwen3-235B-A22B`** 作为对手(不可训练 Agent),使用 **`Qwen2-7B`** 作为可训练 Agent(即 `trainable_targets`)。 ![image](https://img.alicdn.com/imgextra/i2/O1CN012JgVZC2ABczBhAzJs_!!6000000008165-0-tps-2048-2048.jpg) @@ -49,7 +49,7 @@ astuner --conf tutorial/example_werewolves/learn2ask.yaml --backbone='debug' --w 从训练迭代视角来看,整体流程可以概括为: - 生成一局新的游戏设置(玩家、角色分配、初始状态)。 - 调用 AgentScope Workflow 来模拟完整对局。 -- Agent 调用可训练模型(`model_tuner`)做决策,对手使用固定模型。 +- 智能体 调用可训练模型(`model_tuner`)做决策,对手使用固定模型。 - 环境产出本局的 reward / outcome。 - 收集对局轨迹更新可训练模型。 @@ -115,17 +115,17 @@ astuner: 在实验过程中,我们观察到明显的角色扮演能力提升: -1. 例如,在被投票出局时,原始模型往往会直接暴露自己是 `werewolf`;而经过微调后,Agent 会尝试欺骗对手并保护队友。例如: +1. 例如,在被投票出局时,原始模型往往会直接暴露自己是 `werewolf`;而经过微调后,智能体会尝试欺骗对手并保护队友。例如: ![](https://img.alicdn.com/imgextra/i1/O1CN01v8VqLB1aYEMfzyTHr_!!6000000003341-2-tps-2104-1016.png) > **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). -2. Agent 会发展出多种取胜策略。例如: +2. 智能体会发展出多种取胜策略。例如: - **误导对手**:"重点关注预言家和女巫。他们可能是试图隐藏身份的狼人。" - **诉诸理性**:"我们要警惕假预言家,注意叙事是否自洽;Player-Y 作为猎人需要谨慎行动。" -3. 有时 Agent 还能利用非狼人玩家之间的相互怀疑,从而淘汰对手。 +3. 有时智能体还能利用非狼人玩家之间的相互怀疑,从而淘汰对手。 ![](https://img.alicdn.com/imgextra/i2/O1CN01Sx7wkU23pHyPXyqPH_!!6000000007304-2-tps-968-575.png) diff --git a/docs/zh/intro.md b/docs/zh/intro.md index e0cde162..77493e56 100644 --- a/docs/zh/intro.md +++ b/docs/zh/intro.md @@ -1,24 +1,24 @@ # 项目简介 -**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的 Agent 和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的 智能体 和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 -您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的 Agent 达到最佳性能! +您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的 智能体 达到最佳性能! --- ### ✨ 特性 -我们致力于构建一个易于上手的 AgentScope 微调工具,为 Agent 开发者解锁更多可能性: +我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: -* **简单友好**:ASTuner 帮助您轻松微调 Agent 工作流背后的模型,以极小的开发成本优化 Agent 性能。 +* **简单友好**:ASTuner 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 * **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 * **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 -* **灵活且快速**:ASTuner 支持 [多 Agent 工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging)。当工作流涉及多轮(或多 Agent)对话时,可将训练速度提升 1.5 倍至 20 倍。 +* **灵活且快速**:ASTuner 支持 [多智能体工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging)。当工作流涉及多轮(或多智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 * **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 针对进阶研究者,ASTuner 还提供了高分辨率的日志记录和调试方案: -* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和 Agent 诊断。 +* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和智能体诊断。 * **快速调试**:ASTuner 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 --- @@ -49,7 +49,7 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir #### 运行训练 -您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 Agent。以 [数学 Agent](./example_math_agent.md) 为例: +您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个智能体。以 [数学 智能体](./example_math_agent.md) 为例: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray @@ -60,9 +60,9 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 探索我们丰富的示例库,开启您的探索之旅: -* 🔢 **[训练一个可以编写 Python 代码的数学 Agent](./example_math_agent.md)**。 -* 📱 **[使用 AgentScope 创建并训练 AppWorld Agent](./example_app_world.md)**。 -* 🐺 **[开发并训练“狼人杀”RPG Agent](./example_werewolves.md)**。 +* 🔢 **[训练一个可以编写 Python 代码的数学智能体](./example_math_agent.md)**。 +* 📱 **[使用 AgentScope 创建并训练 AppWorld 智能体](./example_app_world.md)**。 +* 🐺 **[开发并训练“狼人杀”RPG 智能体](./example_werewolves.md)**。 * 👩🏻‍⚕️ **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 * 🎴 **[使用 AgentScope 编写并解决“倒计时”游戏](./example_countdown.md)**。 * 🚶 **[使用 ASTuner 解决“冰湖”行走谜题](./example_frozenlake.md)**。 @@ -71,7 +71,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ### 🧩 核心概念 -ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调变得直观明了。 +ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。
image @@ -80,15 +80,15 @@ ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调 #### 1. 以用户为中心的接口 -为了优化 Agent,您需要提供三个核心输入: +为了优化智能体,您需要提供三个核心输入: -* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义您的 Agent 逻辑,支持简单的 Agent 设置以及高级的多 Agent 协作。 +* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义您的智能体逻辑,支持简单的智能体设置以及高级的多智能体协作。 * **[任务读取器 (Task Reader)](./data_pipeline.md)**:从 JSONL 文件、HuggingFace 数据集、交互式环境加载训练任务,或从文档自动生成任务。 -* **[任务判别器 (Task Judger)](./task_judger.md)**:评估 Agent 输出并分配奖励(Reward)以指导训练。 +* **[任务判别器 (Task Judger)](./task_judger.md)**:评估智能体输出并分配奖励(Reward)以指导训练。 #### 2. 内部系统架构 -内部系统协调多个专门模块,以处理强化学习(RL)训练和 Agent 交互的复杂性。 +内部系统协调多个专门模块,以处理强化学习(RL)训练和智能体交互的复杂性。 * **启动器 (Launcher)**:管理后台服务进程(Ray, vLLM)并路由后端。 * **任务读取器 (Task Reader)**:处理数据摄取、增强和过滤。 @@ -101,7 +101,7 @@ ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调 ### 🚦 导航 -* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个 Agent](./tutorial.md) —— 初学者的必经之路。 +* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个智能体](./tutorial.md) —— 初学者的必经之路。 * 🛠️ **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 * 💡 **示例**:查看上方的 [示例库](#example-librar),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 * ⚙️ **深入了解**:掌握高级 [配置方案](./configuration.md)。 diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index e0cde162..7502e95d 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -1,24 +1,24 @@ # 项目简介 -**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的 Agent 和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 -您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的 Agent 达到最佳性能! +您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的智能体达到最佳性能! --- ### ✨ 特性 -我们致力于构建一个易于上手的 AgentScope 微调工具,为 Agent 开发者解锁更多可能性: +我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: -* **简单友好**:ASTuner 帮助您轻松微调 Agent 工作流背后的模型,以极小的开发成本优化 Agent 性能。 +* **简单友好**:ASTuner 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 * **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 * **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 -* **灵活且快速**:ASTuner 支持 [多 Agent 工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging)。当工作流涉及多轮(或多 Agent)对话时,可将训练速度提升 1.5 倍至 20 倍。 -* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 +* **灵活且快速**:ASTuner 支持 [多智能体工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging)。当工作流涉及多轮(或多 智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 +* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.智能体-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 针对进阶研究者,ASTuner 还提供了高分辨率的日志记录和调试方案: -* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和 Agent 诊断。 +* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和 智能体 诊断。 * **快速调试**:ASTuner 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 --- @@ -49,7 +49,7 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir #### 运行训练 -您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 Agent。以 [数学 Agent](./example_math_agent.md) 为例: +您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 智能体。以 [数学 智能体](./example_math_agent.md) 为例: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray @@ -60,9 +60,9 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 探索我们丰富的示例库,开启您的探索之旅: -* 🔢 **[训练一个可以编写 Python 代码的数学 Agent](./example_math_agent.md)**。 -* 📱 **[使用 AgentScope 创建并训练 AppWorld Agent](./example_app_world.md)**。 -* 🐺 **[开发并训练“狼人杀”RPG Agent](./example_werewolves.md)**。 +* 🔢 **[训练一个可以编写 Python 代码的数学智能体](./example_math_agent.md)**。 +* 📱 **[使用 AgentScope 创建并训练 AppWorld 智能体](./example_app_world.md)**。 +* 🐺 **[开发并训练“狼人杀”RPG智能体](./example_werewolves.md)**。 * 👩🏻‍⚕️ **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 * 🎴 **[使用 AgentScope 编写并解决“倒计时”游戏](./example_countdown.md)**。 * 🚶 **[使用 ASTuner 解决“冰湖”行走谜题](./example_frozenlake.md)**。 @@ -71,7 +71,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ### 🧩 核心概念 -ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调变得直观明了。 +ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。
image @@ -80,15 +80,15 @@ ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调 #### 1. 以用户为中心的接口 -为了优化 Agent,您需要提供三个核心输入: +为了优化智能体,您需要提供三个核心输入: -* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义您的 Agent 逻辑,支持简单的 Agent 设置以及高级的多 Agent 协作。 +* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义您的智能体逻辑,支持简单的智能体设置以及高级的多智能体协作。 * **[任务读取器 (Task Reader)](./data_pipeline.md)**:从 JSONL 文件、HuggingFace 数据集、交互式环境加载训练任务,或从文档自动生成任务。 -* **[任务判别器 (Task Judger)](./task_judger.md)**:评估 Agent 输出并分配奖励(Reward)以指导训练。 +* **[任务判别器 (Task Judger)](./task_judger.md)**:评估智能体输出并分配奖励(Reward)以指导训练。 #### 2. 内部系统架构 -内部系统协调多个专门模块,以处理强化学习(RL)训练和 Agent 交互的复杂性。 +内部系统协调多个专门模块,以处理强化学习(RL)训练和智能体交互的复杂性。 * **启动器 (Launcher)**:管理后台服务进程(Ray, vLLM)并路由后端。 * **任务读取器 (Task Reader)**:处理数据摄取、增强和过滤。 @@ -101,7 +101,7 @@ ASTuner 通过将开发者接口与内部执行逻辑分离,使 Agent 微调 ### 🚦 导航 -* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个 Agent](./tutorial.md) —— 初学者的必经之路。 +* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个智能体](./tutorial.md) —— 初学者的必经之路。 * 🛠️ **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 * 💡 **示例**:查看上方的 [示例库](#example-librar),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 * ⚙️ **深入了解**:掌握高级 [配置方案](./configuration.md)。 diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md index baecab14..83ef9ccf 100644 --- a/docs/zh/quickstart.md +++ b/docs/zh/quickstart.md @@ -11,7 +11,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 我们从最简单的示例开始:一个带工具调用的数学智能体。 * 首先,请查看 [installation guide](docs/en/installation.md) 来搭建训练环境。 -* 然后,使用下面的最小示例来调优你的第一个模型(假设你已经编写了一个名为 `MathToolWorkflow` 的 Agent)。 +* 然后,使用下面的最小示例来调优你的第一个模型(假设你已经编写了一个名为 `MathToolWorkflow` 的智能体)。 ```python from astuner import AstunerJob diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index fe9e5c77..bfbed32e 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -1,18 +1,18 @@ -# 训练你的第一个 Agent +# 训练你的第一个智能体 -在本文档中,我们会从零开始,带你实现并训练这样一个能够使用 Python 进行计算、解决复杂数学问题的 Agent。 +在本文档中,我们会从零开始,带你实现并训练这样一个能够使用 Python 进行计算、解决复杂数学问题的智能体。 我们将依次完成以下步骤: 1. 训练数据与环境准备 -2. Agent 与可训练 workflow 的定义 +2.智能体与可训练 workflow 的定义 3. Reward 计算 4. 训练参数设置 5. 调试 6. 开始训练 & 监测指标 -完成整个过程后,你将得到一个可在数学任务环境中使用的 Math Agent,理解 AgentScope Tuner 中的核心概念,并学会如何设计你自己的训练流程。 +完成整个过程后,你将得到一个可在数学任务环境中使用的 Math 智能体,理解 AgentScope Tuner 中的核心概念,并学会如何设计你自己的训练流程。 ## 准备目录 首先,我们为训练准备一个目录: @@ -29,7 +29,7 @@ touch workflow.py ``` /math_agent /math_agent.yaml # 配置文件 - /workflow.py # 训练 workflow,将包含 agent 和环境交互的定义 + /workflow.py # 训练 workflow,将包含智能体和环境交互的定义 ``` ## 配置参数 @@ -56,7 +56,7 @@ defaults: ``` ## 准备训练数据 -Agent 需要在指定的任务环境下,使用训练数据驱动进行训练。本节中我们首先解决数据和环境的问题。 +智能体需要在指定的任务环境下,使用训练数据驱动进行训练。本节中我们首先解决数据和环境的问题。 ASTuner 提供了多种读取数据的方式: @@ -94,7 +94,7 @@ astuner: 至此,我们就完成了数据相关的全部配置,剩余的工作将由 ASTuner 自动完成。 ## 准备 Workflow -在 ASTuner 中,workflow 是进行训练的基本单元。它定义了 Agent 的行为、工具、上下文等,Agent 与环境交互的具体流程,以及 Reward 的计算方法。 +在 ASTuner 中,workflow 是进行训练的基本单元。它定义了智能体的行为、工具、上下文等,智能体与环境交互的具体流程,以及 Reward 的计算方法。 我们将在 `workflow.py` 中实现我们的 workflow。 @@ -127,7 +127,7 @@ ReActAgent( ) ``` -通过这段代码,我们快速地定义了一个完整的 ReAct Agent: +通过这段代码,我们快速地定义了一个完整的 ReAct智能体: - 使用 ReAct 范式与环境/工具交互 - 设置了 system prompt - 注册了一个工具:执行 Python 代码 @@ -135,7 +135,7 @@ ReActAgent( > 更多具体的配置可参考 AgentScope 官方文档。 -接下来,我们实现训练该 Agent 的其余代码: +接下来,我们实现训练该智能体的其余代码: ```python from astuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput @@ -201,11 +201,11 @@ class MathAgentWorkflow(Workflow): return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` -在这段代码中,我们将 Agent 封装进一个 Workflow 中,并实现了其中的 `execute` 函数: +在这段代码中,我们将智能体封装进一个 Workflow 中,并实现了其中的 `execute` 函数: 1. 从 `WorkflowTask` 中取出输入 -2. 用与前面相同的方式构造 Agent,但 **指定 model 为 model_tuner** —— 这是使 Agent 可被训练的关键 -3. 执行 Agent -4. 解析 Agent 输出,并将答案封装为 `WorkflowOutput` 返回 +2. 用与前面相同的方式构造智能体,但 **指定 model 为 model_tuner** —— 这是使智能体可被训练的关键 +3. 执行智能体 +4. 解析智能体输出,并将答案封装为 `WorkflowOutput` 返回 在定义好 workflow 后,我们还需要告诉 ASTuner 使用这个 class 作为训练协议。在 `math_agent.yaml` 中写入: @@ -231,7 +231,7 @@ astuner: 接下来,为了正式开始训练,还需要补充一些必要的参数配置。 ### 预训练模型 -在 `math_agent.yaml` 中指定 Agent 使用的 LLM,也就是我们将要训练的模型: +在 `math_agent.yaml` 中指定 智能体 使用的 LLM,也就是我们将要训练的模型: ```yaml astuner: @@ -287,7 +287,7 @@ trinity: ``` ## 调试 -到目前为止,我们已经完成了训练一个 Agent 所需的全部代码与配置。 +到目前为止,我们已经完成了训练一个智能体所需的全部代码与配置。 接下来,我们将在 debug 模式下启动训练流程,检查代码是否有误。你也可以跳过这一步,直接开始训练。 diff --git a/docs/zh/workflow.md b/docs/zh/workflow.md index 88590d34..98590e6b 100644 --- a/docs/zh/workflow.md +++ b/docs/zh/workflow.md @@ -9,7 +9,7 @@ ASTuner 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封 下面分别说明。 -## 简单 Agent 场景 +## 简单智能体场景 ### 1. 在 ASTuner 中转换你的 AgentScope Workflow @@ -59,13 +59,13 @@ class ExampleMathLearn(Workflow): 这种写法适合大多数用户,如果你满足下面的情况,可以优先采用: -- 🌟 很清楚**哪些 Agent 需要被训练**,或者 Agent 的数量本身就不多; +- 🌟 很清楚**哪些智能体需要被训练**,或者智能体的数量本身就不多; - ✨ 已经完成了 Workflow 的基础调试,确认在使用非微调模型(例如 `qwen-max`)时工作流是正常可用的; -- 🎇 不需要在运行过程中**动态改变**要训练的 Agent 集合。 +- 🎇 不需要在运行过程中**动态改变**要训练的智能体集合。 ### 3. 代码示例 -- 假设你已经实现了一个 ReAct Agent,大致如下: +- 假设你已经实现了一个 ReAct智能体,大致如下: ```python from agentscope.agent import ReActAgent @@ -119,31 +119,31 @@ class ExampleMathLearn(Workflow): ``` -## 进阶 Agent 场景 +## 进阶智能体场景 -当设计的是一个**多 Agent 协作**的复杂 Workflow,并且每个 Agent 扮演不同**角色**时,如果 ASTuner 能够「知道」每个 Agent 的身份,那么在训练和调试时就能提供更好的能力和更高的可控性。 +当设计的是一个**多智能体协作**的复杂 Workflow,并且每个智能体扮演不同**角色**时,如果 ASTuner 能够「知道」每个智能体的身份,那么在训练和调试时就能提供更好的能力和更高的可控性。 -通过多 Agent 协作,你可以 -- 🌟 **精细地控制**哪些 Agent 会被微调; -- ✨ 为「当前未被训练」的 Agent 明确定义其使用的默认模型; +通过多智能体协作,你可以 +- 🌟 **精细地控制**哪些智能体会被微调; +- ✨ 为「当前未被训练」的智能体明确定义其使用的默认模型; - ⚡ 在**不修改 Workflow 源码**的前提下,动态切换不同的可训练目标(trainable agent targets)。 ### 1. 可训练开关与模型生命周期 #### 模型多角色注册与使用 -在多 Agent 协作中,每个 Agent 拥有自己的「角色」。 +在多智能体协作中,每个智能体拥有自己的「角色」。 -在 Workflow 中,我们需要显式的注册待训练的 Agent 角色,并在创建 Agent 的时候显式的指明角色: +在 Workflow 中,我们需要显式的注册待训练的智能体角色,并在创建智能体的时候显式的指明角色: - **注册(register)**:`model_tuner.register_model(agent_role, default_model=...)` - - 定义:向 Tuner 注册一个待训练的 Agent 角色,并指定该角色在未训练/不训练时的默认模型。 + - 定义:向 Tuner 注册一个待训练的智能体角色,并指定该角色在未训练/不训练时的默认模型。 - **使用(get/bind)**:`model_tuner.get_model(agent_role)` - - 定义:在构建 Agent 或执行 Workflow 时,根据 `agent_role` 返回该 Agent 的模型对象。 + - 定义:在构建智能体或执行 Workflow 时,根据 `agent_role` 返回该智能体的模型对象。 #### 可训练模型 vs 不可训练模型 -在 Workflow 中能够自由地控制每个 Agent 的训练状态。一个 Agent 是否参与训练由 Workflow 的 **`trainable_targets`** 声明决定: +在 Workflow 中能够自由地控制每个智能体的训练状态。一个智能体是否参与训练由 Workflow 的 **`trainable_targets`** 声明决定: ```python class ExampleMathLearn(Workflow): @@ -153,14 +153,14 @@ class ExampleMathLearn(Workflow): # ... ``` -- **可训练(trainable)**:如果 Agent(角色)在 `trainable_targets` 列表中,则设置可训练模型。 -- **不可训练(non-trainable)**:Agent(角色)不在 `trainable_targets` 列表中,则 Agent 将使用默认模型。 +- **可训练(trainable)**:如果智能体(角色)在 `trainable_targets` 列表中,则设置可训练模型。 +- **不可训练(non-trainable)**:智能体(角色)不在 `trainable_targets` 列表中,则智能体将使用默认模型。 -无论角色异同,所有 Agent(角色)共享一个模型实例。也就是具有相同参数的模型将分别扮演不同的角色。 +无论角色异同,所有智能体(角色)共享一个模型实例。也就是具有相同参数的模型将分别扮演不同的角色。 ### 2. 升级为进阶 ASTuner Workflow -本节通过一个简单的例子展示使用 `ModelTuner.register_model` 为不同角色注册「可训练模型」,并在构建 Agent 时以角色维度进行模型绑定。 +本节通过一个简单的例子展示使用 `ModelTuner.register_model` 为不同角色注册「可训练模型」,并在构建智能体时以角色维度进行模型绑定。 - 先从一个基础的 AgentScope `ReActAgent` 开始: @@ -173,7 +173,7 @@ agent_instance = ReActAgent( ) ``` -- 为 Agent 声明一个角色标记(tag),并通过 `model_tuner.register_model` 指定该 Agent **在未被训练时**应当使用的默认模型: +- 为智能体声明一个角色标记(tag),并通过 `model_tuner.register_model` 指定该智能体**在未被训练时**应当使用的默认模型: ```python agent_role = "TYPE-ZERO" @@ -203,9 +203,9 @@ class ExampleMathLearn(Workflow): ... your agents and workflow here ... ``` -### 3. 一个多 Agent 示例 +### 3. 一个多智能体示例 -下面是一个多 Agent 场景的示例代码片段: +下面是一个多智能体场景的示例代码片段: ```python roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] @@ -225,7 +225,7 @@ for i, role in enumerate(roles): 在这里: -- `role` 既描述了 Agent 在游戏中的身份(例如狼人、村民等), +- `role` 既描述了智能体在游戏中的身份(例如狼人、村民等), - 又作为 `model_tuner.register_model` 的 key,标识一个**可训练目标**; - `chosen_model` 定义了该角色在「当前未训练」时所使用的默认底座模型; -- 通过这种方式,可以在多 Agent 场景下灵活地指定和切换各角色的训练与推理行为。 \ No newline at end of file +- 通过这种方式,可以在多智能体场景下灵活地指定和切换各角色的训练与推理行为。 \ No newline at end of file From 501b3186d98162f05f81170d0d4ecb24c9f56bd8 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 24 Dec 2025 14:37:05 +0800 Subject: [PATCH 339/462] docs: fix workflow module path in tutorial configuration examples --- docs/en/tune_your_first_agent.md | 4 ++-- docs/zh/tune_your_first_agent.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 1bf611d4..8fc59d8f 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -218,7 +218,7 @@ After defining the workflow, we also need to tell ASTuner to use this class as t astuner: # ... rollout: - agentscope_workflow: math_agent.math_agent->MathAgentWorkflow + agentscope_workflow: workflow.py->MathAgentWorkflow ``` There is one more thing we have not addressed yet: the reward. Fortunately, ASTuner also supports customizing how rewards are calculated through configuration. Continue editing the config: @@ -256,7 +256,7 @@ We also need to configure several important training hyperparameters: astuner: # ... rollout: - agentscope_workflow: math_agent.math_agent->MathAgentWorkflow + agentscope_workflow: workflow.py->MathAgentWorkflow # Model temperature temperature: 0.7 # Maximum number of parallel rollout workers diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index bfbed32e..c6153094 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -213,7 +213,7 @@ class MathAgentWorkflow(Workflow): astuner: # ... rollout: - agentscope_workflow: math_agent.math_agent->MathAgentWorkflow + agentscope_workflow: workflow.py->MathAgentWorkflow ``` 我们还有一件事情尚未解决:Reward。幸运的是,ASTuner 同样支持通过配置自定义 Reward 计算方法。继续在配置中写入: @@ -248,7 +248,7 @@ astuner: astuner: # ... rollout: - agentscope_workflow: math_agent.math_agent->MathAgentWorkflow + agentscope_workflow: workflow.py->MathAgentWorkflow # 模型温度 temperature: 0.7 # 最大的 rollout 多线程数量 From 010483aca143b438f341a3cdfaa1861818da15c0 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 24 Dec 2025 14:48:37 +0800 Subject: [PATCH 340/462] docs: enhance workflow code examples --- docs/en/workflow.md | 7 +++++-- docs/zh/workflow.md | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/en/workflow.md b/docs/en/workflow.md index 0a291e11..6e2c563a 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -13,7 +13,7 @@ ASTuner provides two convenient and **mutually compatible** ways to wrap an Agen Simply set ReActAgent's `model` argument to `model_tuner` when initializing your agent. -
+
@@ -34,7 +34,10 @@ Simply set ReActAgent's `model` argument to `model_tuner` when initializing your
agent_instance = ReActAgent(
    name=f"Friday",
    sys_prompt="You are a helpful assistant",
-   model=model_tuner,  # change here
+   model=model_tuner,  # change here
    formatter=DashScopeChatFormatter(),
 )
diff --git a/docs/zh/workflow.md b/docs/zh/workflow.md index 98590e6b..d5811b23 100644 --- a/docs/zh/workflow.md +++ b/docs/zh/workflow.md @@ -15,7 +15,7 @@ ASTuner 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封 **只需要在初始化 ReActAgent 时,把 `model` 参数替换为 `model_tuner` 即可。** -
Before
+
@@ -36,7 +36,10 @@ ASTuner 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封
agent_instance = ReActAgent(
    name=f"Friday",
    sys_prompt="You are a helpful assistant",
-   model=model_tuner,  # change here
+   model=model_tuner,  # change here
    formatter=DashScopeChatFormatter(),
 )
From 7efa53b4426117e67f8ba430be1a5d08986de257 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 15:34:12 +0800 Subject: [PATCH 341/462] simplify verl backbone --- astuner/backbone/main_trinity.py | 1 - astuner/backbone/verl_trainer.py | 534 +----------------- astuner/backbone/warm_up.py | 2 +- astuner/default_config/astune_default.yaml | 1 - .../verl/config_auto_convertion_verl.jsonc | 1 - astuner/default_config/verl/verl_default.yaml | 1 - docs/en/configuration.md | 1 - docs/zh/configuration.md | 1 - .../benchmark_countdown.yaml | 1 - tutorial/example_countdown/countdown.yaml | 1 - 10 files changed, 14 insertions(+), 530 deletions(-) diff --git a/astuner/backbone/main_trinity.py b/astuner/backbone/main_trinity.py index d6784ef0..0d542308 100644 --- a/astuner/backbone/main_trinity.py +++ b/astuner/backbone/main_trinity.py @@ -4,7 +4,6 @@ from trinity.explorer.explorer import Explorer from trinity.trainer.trainer import Trainer -import astuner.backbone.trinity_trainer # noqa: F401 from astuner.utils.core_env_vars import get_runtime_env from astuner.utils.launch_utils import set_loguru_default_color set_loguru_default_color() diff --git a/astuner/backbone/verl_trainer.py b/astuner/backbone/verl_trainer.py index 8d7b3959..67e4988b 100644 --- a/astuner/backbone/verl_trainer.py +++ b/astuner/backbone/verl_trainer.py @@ -63,12 +63,16 @@ ) from verl.utils.torch_functional import masked_mean from verl.utils.tracking import ValidationGenerationsLogger +from verl.trainer.ppo.ray_trainer import ( + Role, WorkerType, ResourcePoolManager, RayPPOTrainer, + apply_kl_penalty, + compute_response_mask, +) from astuner.context_tracker.basic_tracker import BaseContextTracker from astuner.schema.task import Task from astuner.task_rollout.native_parallel_worker import VerlRolloutManager - -WorkerType = type[Worker] +from astuner.backbone.warm_up import warm_up_process def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | torch.Tensor: @@ -126,268 +130,6 @@ def union_gen_batch_via_task_id(tasks, batch: DataProto, gen_batch_output: DataP return batch_final -class Role(Enum): - """ - To create more roles dynamically, you can subclass Role and add new members - """ - - Actor = 0 - Rollout = 1 - ActorRollout = 2 - Critic = 3 - RefPolicy = 4 - RewardModel = 5 - ActorRolloutRef = 6 - - -@dataclass -class ResourcePoolManager: - """ - Define a resource pool specification. Resource pool will be initialized first. - """ - - resource_pool_spec: dict[str, list[int]] - mapping: dict[Role, str] - resource_pool_dict: dict[str, RayResourcePool] = field(default_factory=dict) - - def create_resource_pool(self): - """Create Ray resource pools for distributed training. - - Initializes resource pools based on the resource pool specification, - with each pool managing GPU resources across multiple nodes. - For FSDP backend, uses max_colocate_count=1 to merge WorkerGroups. - For Megatron backend, uses max_colocate_count>1 for different models. - """ - for ( - resource_pool_name, - process_on_nodes, - ) in self.resource_pool_spec.items(): - # max_colocate_count means the number of WorkerGroups (i.e. processes) in each RayResourcePool - # For FSDP backend, we recommend using max_colocate_count=1 that merge all WorkerGroups into one. - # For Megatron backend, we recommend using max_colocate_count>1 - # that can utilize different WorkerGroup for differnt models - resource_pool = RayResourcePool( - process_on_nodes=process_on_nodes, - use_gpu=True, - max_colocate_count=1, - name_prefix=resource_pool_name, - ) - self.resource_pool_dict[resource_pool_name] = resource_pool - - self._check_resource_available() - - def get_resource_pool(self, role: Role) -> RayResourcePool: - """Get the resource pool of the worker_cls""" - return self.resource_pool_dict[self.mapping[role]] - - def get_n_gpus(self) -> int: - """Get the number of gpus in this cluster.""" - return sum( - [ - n_gpus - for process_on_nodes in self.resource_pool_spec.values() - for n_gpus in process_on_nodes - ] - ) - - def _check_resource_available(self): - """Check if the resource pool can be satisfied in this ray cluster.""" - node_available_resources = ray.state.available_resources_per_node() - node_available_gpus = { - node: (node_info.get("GPU", 0) if "GPU" in node_info else node_info.get("NPU", 0)) - for node, node_info in node_available_resources.items() - } - - # check total required gpus can be satisfied - total_available_gpus = sum(node_available_gpus.values()) - total_required_gpus = sum( - [ - n_gpus - for process_on_nodes in self.resource_pool_spec.values() - for n_gpus in process_on_nodes - ] - ) - if total_available_gpus < total_required_gpus: - raise ValueError( - f"Total available GPUs {total_available_gpus} is less than total desired GPUs {total_required_gpus}" - ) - - # check each resource pool can be satisfied, O(#resource_pools * #nodes) - for ( - resource_pool_name, - process_on_nodes, - ) in self.resource_pool_spec.items(): - num_gpus, num_nodes = process_on_nodes[0], len(process_on_nodes) - for node, available_gpus in node_available_gpus.items(): - if available_gpus >= num_gpus: - node_available_gpus[node] -= num_gpus - num_nodes -= 1 - if num_nodes == 0: - break - if num_nodes > 0: - raise ValueError( - f"Resource pool {resource_pool_name}: {num_gpus}*{num_nodes}" - + "cannot be satisfied in this ray cluster" - ) - - -def apply_kl_penalty(data: DataProto, kl_ctrl: core_algos.AdaptiveKLController, kl_penalty="kl"): - """Apply KL penalty to the token-level rewards. - - This function computes the KL divergence between the reference policy and current policy, - then applies a penalty to the token-level rewards based on this divergence. - - Args: - data (DataProto): The data containing batched model outputs and inputs. - kl_ctrl (core_algos.AdaptiveKLController): Controller for adaptive KL penalty. - kl_penalty (str, optional): Type of KL penalty to apply. Defaults to "kl". - - Returns: - tuple: A tuple containing: - - The updated data with token-level rewards adjusted by KL penalty - - A dictionary of metrics related to the KL penalty - """ - response_mask = data.batch["response_mask"] - token_level_scores = data.batch["token_level_scores"] - batch_size = data.batch.batch_size[0] - - # compute kl between ref_policy and current policy - # When apply_kl_penalty, algorithm.use_kl_in_reward=True, so the reference model has been enabled. - kld = core_algos.kl_penalty( - data.batch["old_log_probs"], - data.batch["ref_log_prob"], - kl_penalty=kl_penalty, - ) # (batch_size, response_length) - kld = kld * response_mask - beta = kl_ctrl.value - - token_level_rewards = token_level_scores - beta * kld - - current_kl = masked_mean(kld, mask=response_mask, axis=-1) # average over sequence - current_kl = torch.mean(current_kl, dim=0).item() - - # according to https://github.com/huggingface/trl/blob/951ca1841f29114b969b57b26c7d3e80a39f75a0/trl/trainer/ppo_trainer.py#L837 - kl_ctrl.update(current_kl=current_kl, n_steps=batch_size) - data.batch["token_level_rewards"] = token_level_rewards - - metrics = { - "actor/reward_kl_penalty": current_kl, - "actor/reward_kl_penalty_coeff": beta, - } - - return data, metrics - - -def compute_response_mask(data: DataProto): - """Compute the attention mask for the response part of the sequence. - - This function extracts the portion of the attention mask that corresponds to the model's response, - which is used for masking computations that should only apply to response tokens. - - Args: - data (DataProto): The data containing batched model outputs and inputs. - - Returns: - torch.Tensor: The attention mask for the response tokens. - """ - responses = data.batch["responses"] - response_length = responses.size(1) - attention_mask = data.batch["attention_mask"] - return attention_mask[:, -response_length:] - - -def compute_grpo_outcome_advantage_new( - token_level_rewards: torch.Tensor, - response_mask: torch.Tensor, - task_index: np.ndarray, - rollout_index: np.ndarray, - epsilon: float = 1e-6, - norm_adv_by_std_in_grpo: bool = True, - config: Optional[AlgoConfig] = None, -) -> tuple[torch.Tensor, torch.Tensor]: - """ - Compute advantage for GRPO, operating only on Outcome reward - (with only one scalar reward for each response). - - Args: - token_level_rewards: `(torch.Tensor)` - shape is (bs, response_length) - response_mask: `(torch.Tensor)` - shape is (bs, response_length) - task_index: `(np.ndarray)` - task_index array for grouping - epsilon: `(float)` - small value to avoid division by zero - norm_adv_by_std_in_grpo: `(bool)` - whether to scale the GRPO advantage - config: `(Optional[AlgoConfig])` - algorithm configuration object - - Note: - If norm_adv_by_std_in_grpo is True, the advantage is scaled by the std, as in the original GRPO. - If False, the advantage is not scaled, as in Dr.GRPO (https://arxiv.org/abs/2503.20783). - - Returns: - advantages: `(torch.Tensor)` - shape is (bs, response_length) - Returns: `(torch.Tensor)` - shape is (bs, response_length) - """ - scores = token_level_rewards.sum(dim=-1) # 1d-list - - id2score = defaultdict(list) - id2pointer = defaultdict(list) - id2mean = {} - id2std = {} - - with torch.no_grad(): - bsz = scores.shape[0] - for i in range(bsz): - id2score[task_index[i]].append(scores[i]) - id2pointer[task_index[i]].append(i) - - # compute mean and std - for idx in id2score: - # the score list - this_task_all_score = id2score[idx] - # get the rollout id list - this_task_all_rolloutid = [rollout_index[idx] for idx in id2pointer[idx]] - # for same rollout id sample, reduce mean - rolloutid2score = defaultdict(list) - rolloutid2meanscore = {} - for rolloutid, score in zip(this_task_all_rolloutid, this_task_all_score): - rolloutid2score[rolloutid].append(score) - for rolloutid in rolloutid2score: - rolloutid2meanscore[rolloutid] = torch.mean( - torch.tensor(rolloutid2score[rolloutid]) - ) - - this_task_all_score = list(rolloutid2meanscore.values()) - - if len(this_task_all_score) == 1: - # single sample for - id2mean[idx] = torch.tensor(0.0) - id2std[idx] = torch.tensor(1.0) - elif len(this_task_all_score) > 1: - scores_tensor = torch.stack(this_task_all_score) - id2mean[idx] = torch.mean(scores_tensor) - id2std[idx] = torch.std(scores_tensor) - # if id2std[idx] < 0.01: - # id2std[idx] = 0.01 - else: - raise ValueError(f"no score in prompt task_index: {idx}") - - for i in range(bsz): - if norm_adv_by_std_in_grpo: - scores[i] = (scores[i] - id2mean[task_index[i]]) / (id2std[task_index[i]] + epsilon) - else: - scores[i] = scores[i] - id2mean[task_index[i]] - - scores = scores.unsqueeze(-1) * response_mask - - return scores, scores - - def compute_advantage( data: DataProto, adv_estimator: AdvantageEstimator, @@ -445,21 +187,12 @@ def compute_advantage( # This mask is the one intended for GRPO grpo_calculation_mask = data.batch["loss_mask"][:, -response_length:] # Call compute_grpo_outcome_advantage with parameters matching its definition - if config.task_norm_patch: - advantages, returns = compute_grpo_outcome_advantage_new( - token_level_rewards=data.batch["token_level_rewards"], - response_mask=grpo_calculation_mask, - task_index=data.non_tensor_batch["uid"], - rollout_index=data.non_tensor_batch["rollout_ids"], - norm_adv_by_std_in_grpo=norm_adv_by_std_in_grpo, - ) - else: - advantages, returns = core_algos.compute_grpo_outcome_advantage( - token_level_rewards=data.batch["token_level_rewards"], - response_mask=grpo_calculation_mask, - index=data.non_tensor_batch["uid"], - norm_adv_by_std_in_grpo=norm_adv_by_std_in_grpo, - ) + advantages, returns = core_algos.compute_grpo_outcome_advantage( + token_level_rewards=data.batch["token_level_rewards"], + response_mask=grpo_calculation_mask, + index=data.non_tensor_batch["uid"], + norm_adv_by_std_in_grpo=norm_adv_by_std_in_grpo, + ) data.batch["advantages"] = advantages data.batch["returns"] = returns else: @@ -482,7 +215,7 @@ def compute_advantage( return data -class ASTunerRayPPOTrainer: +class ASTunerRayPPOTrainer(RayPPOTrainer): """Distributed PPO trainer using Ray for scalable reinforcement learning. This trainer orchestrates distributed PPO training across multiple nodes and GPUs, @@ -777,59 +510,6 @@ def _create_dataloader( f"Warning: Could not set total_training_steps in config. Structure missing? Error: {e}" ) - def _dump_generations(self, inputs, outputs, gts, scores, reward_extra_infos_dict, dump_path): - """Dump rollout/validation samples as JSONL.""" - os.makedirs(dump_path, exist_ok=True) - filename = os.path.join(dump_path, f"{self.global_steps}.jsonl") - - n = len(inputs) - base_data = { - "input": inputs, - "output": outputs, - "gts": gts, - "score": scores, - "step": [self.global_steps] * n, - } - - for k, v in reward_extra_infos_dict.items(): - if len(v) == n: - base_data[k] = v - - lines = [] - for i in range(n): - entry = {k: v[i] for k, v in base_data.items()} - lines.append(json.dumps(entry, ensure_ascii=False)) - - with open(filename, "w") as f: - f.write("\n".join(lines) + "\n") - - print(f"Dumped generations to {filename}") - - def _maybe_log_val_generations(self, inputs, outputs, scores): - """Log a table of validation samples to the configured logger (wandb or swanlab)""" - - generations_to_log = self.config.trainer.log_val_generations - - if generations_to_log == 0: - return - - import numpy as np - - # Create tuples of (input, output, score) and sort by input text - samples = list(zip(inputs, outputs, scores, strict=True)) - samples.sort(key=lambda x: x[0]) # Sort by input text - - # Use fixed random seed for deterministic shuffling - rng = np.random.RandomState(42) - rng.shuffle(samples) - - # Take first N samples after shuffling - samples = samples[:generations_to_log] - - # Log to each configured logger - self.validation_generations_logger.log( - self.config.trainer.logger, samples, self.global_steps - ) def _validate(self): data_source_lst = [] @@ -958,9 +638,6 @@ def _validate(self): sample_inputs = [ m["messages"][0]["content"] for m in test_batch.non_tensor_batch["messages"] ] - self._maybe_log_val_generations( - inputs=sample_inputs, outputs=sample_outputs, scores=sample_scores - ) metric_dict = val_metrics @@ -1094,191 +771,8 @@ def init_workers(self): tokenizer=self.tokenizer, ) - def _save_checkpoint(self): - from verl.utils.fs import local_mkdir_safe - - # path: given_path + `/global_step_{global_steps}` + `/actor` - local_global_step_folder = os.path.join( - self.config.trainer.default_local_dir, - f"global_step_{self.global_steps}", - ) - print(f"local_global_step_folder: {local_global_step_folder}") - actor_local_path = os.path.join(local_global_step_folder, "actor") - actor_remote_path = ( - None - if self.config.trainer.default_hdfs_dir is None - else os.path.join( - self.config.trainer.default_hdfs_dir, - f"global_step_{self.global_steps}", - "actor", - ) - ) - - remove_previous_ckpt_in_save = self.config.trainer.get( - "remove_previous_ckpt_in_save", False - ) - if remove_previous_ckpt_in_save: - print( - "Warning: remove_previous_ckpt_in_save is deprecated," - + " set max_actor_ckpt_to_keep=1 and max_critic_ckpt_to_keep=1 instead" - ) - max_actor_ckpt_to_keep = ( - self.config.trainer.get("max_actor_ckpt_to_keep", None) - if not remove_previous_ckpt_in_save - else 1 - ) - max_critic_ckpt_to_keep = ( - self.config.trainer.get("max_critic_ckpt_to_keep", None) - if not remove_previous_ckpt_in_save - else 1 - ) - - self.actor_rollout_wg.save_checkpoint( - actor_local_path, - actor_remote_path, - self.global_steps, - max_ckpt_to_keep=max_actor_ckpt_to_keep, - ) - - if self.use_critic: - critic_local_path = os.path.join(local_global_step_folder, "critic") - critic_remote_path = ( - None - if self.config.trainer.default_hdfs_dir is None - else os.path.join( - self.config.trainer.default_hdfs_dir, - f"global_step_{self.global_steps}", - "critic", - ) - ) - self.critic_wg.save_checkpoint( - critic_local_path, - critic_remote_path, - self.global_steps, - max_ckpt_to_keep=max_critic_ckpt_to_keep, - ) - - # save dataloader - local_mkdir_safe(local_global_step_folder) - dataloader_local_path = os.path.join(local_global_step_folder, "data.pt") - dataloader_state_dict = self.train_dataloader.state_dict() - torch.save(dataloader_state_dict, dataloader_local_path) - - # latest checkpointed iteration tracker (for atomic usage) - local_latest_checkpointed_iteration = os.path.join( - self.config.trainer.default_local_dir, - "latest_checkpointed_iteration.txt", - ) - with open(local_latest_checkpointed_iteration, "w") as f: - f.write(str(self.global_steps)) - - def _load_checkpoint(self): - if self.config.trainer.resume_mode == "disable": - return 0 - - # load from hdfs - if self.config.trainer.default_hdfs_dir is not None: - raise NotImplementedError("load from hdfs is not implemented yet") - else: - checkpoint_folder = self.config.trainer.default_local_dir # TODO: check path - if not os.path.isabs(checkpoint_folder): - working_dir = os.getcwd() - checkpoint_folder = os.path.join(working_dir, checkpoint_folder) - global_step_folder = find_latest_ckpt_path(checkpoint_folder) # None if no latest - - # find global_step_folder - if self.config.trainer.resume_mode == "auto": - if global_step_folder is None: - print("Training from scratch") - return 0 - else: - if self.config.trainer.resume_mode == "resume_path": - assert isinstance( - self.config.trainer.resume_from_path, str - ), "resume ckpt must be str type" - assert ( - "global_step_" in self.config.trainer.resume_from_path - ), "resume ckpt must specify the global_steps" - global_step_folder = self.config.trainer.resume_from_path - if not os.path.isabs(global_step_folder): - working_dir = os.getcwd() - global_step_folder = os.path.join(working_dir, global_step_folder) - print(f"Load from checkpoint folder: {global_step_folder}") - # set global step - self.global_steps = int(global_step_folder.split("global_step_")[-1]) - - print(f"Setting global step to {self.global_steps}") - print(f"Resuming from {global_step_folder}") - - actor_path = os.path.join(global_step_folder, "actor") - critic_path = os.path.join(global_step_folder, "critic") - # load actor - self.actor_rollout_wg.load_checkpoint( - actor_path, - del_local_after_load=self.config.trainer.del_local_ckpt_after_load, - ) - # load critic - if self.use_critic: - self.critic_wg.load_checkpoint( - critic_path, - del_local_after_load=self.config.trainer.del_local_ckpt_after_load, - ) - - # load dataloader, - # TODO: from remote not implemented yet - dataloader_local_path = os.path.join(global_step_folder, "data.pt") - if os.path.exists(dataloader_local_path): - dataloader_state_dict = torch.load(dataloader_local_path, weights_only=False) - self.train_dataloader.load_state_dict(dataloader_state_dict) - else: - print( - f"Warning: No dataloader state found at {dataloader_local_path}, will start from scratch" - ) - - def _start_profiling(self, do_profile: bool) -> None: - """Start profiling for all worker groups if profiling is enabled.""" - if do_profile: - self.actor_rollout_wg.start_profile(role="e2e", profile_step=self.global_steps) - if self.use_reference_policy: - self.ref_policy_wg.start_profile() - if self.use_critic: - self.critic_wg.start_profile() - if self.use_rm: - self.rm_wg.start_profile() - - def _stop_profiling(self, do_profile: bool) -> None: - """Stop profiling for all worker groups if profiling is enabled.""" - if do_profile: - self.actor_rollout_wg.stop_profile() - if self.use_reference_policy: - self.ref_policy_wg.stop_profile() - if self.use_critic: - self.critic_wg.stop_profile() - if self.use_rm: - self.rm_wg.stop_profile() - - def _balance_batch(self, batch: DataProto, metrics, logging_prefix="global_seqlen"): - """Reorder the data on single controller such that each dp rank gets similar total tokens""" - attention_mask = batch.batch["attention_mask"] - batch_size = attention_mask.shape[0] - global_seqlen_lst = ( - batch.batch["attention_mask"].view(batch_size, -1).sum(-1).tolist() - ) # (train_batch_size,) - world_size = self.actor_rollout_wg.world_size - global_partition_lst = get_seqlen_balanced_partitions( - global_seqlen_lst, k_partitions=world_size, equal_size=True - ) - # reorder based on index. The data will be automatically equally partitioned by dispatch function - global_idx = torch.tensor([j for partition in global_partition_lst for j in partition]) - batch.reorder(global_idx) - global_balance_stats = log_seqlen_unbalance( - seqlen_list=global_seqlen_lst, - partitions=global_partition_lst, - prefix=logging_prefix, - ) - metrics.update(global_balance_stats) def fit(self): # noqa: C901 """ @@ -1290,8 +784,6 @@ def fit(self): # noqa: C901 from omegaconf import OmegaConf from verl.utils.tracking import Tracking - from astuner.backbone.warm_up import warm_up_process - warm_up_process(self.config) logger = Tracking( project_name=self.config.astuner.project_name, diff --git a/astuner/backbone/warm_up.py b/astuner/backbone/warm_up.py index 37ccb66e..c01f698a 100644 --- a/astuner/backbone/warm_up.py +++ b/astuner/backbone/warm_up.py @@ -56,7 +56,7 @@ def warm_up_process(config): def warm_up_task_judge_when_needed(config): if config.astuner.task_judge.judge_type == "rubrics_auto_grader": - from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + from astuner.task_judge.rm_auto_grader_judge import AutoGraderJudge judge = RMAutoGraderJudge(config) asyncio.run(judge.generate_rubrics_from_samples()) diff --git a/astuner/default_config/astune_default.yaml b/astuner/default_config/astune_default.yaml index 89bd0949..c3163163 100644 --- a/astuner/default_config/astune_default.yaml +++ b/astuner/default_config/astune_default.yaml @@ -186,7 +186,6 @@ astuner: n_gpus_per_node: 8 logger: swanlab algorithm: - task_norm_patch: False adv_estimator: grpo use_kl_in_reward: False mini_batch_num: 1 diff --git a/astuner/default_config/verl/config_auto_convertion_verl.jsonc b/astuner/default_config/verl/config_auto_convertion_verl.jsonc index b963f0b8..a1014188 100644 --- a/astuner/default_config/verl/config_auto_convertion_verl.jsonc +++ b/astuner/default_config/verl/config_auto_convertion_verl.jsonc @@ -6,7 +6,6 @@ "astuner.trainer_common.nnodes": "trainer.nnodes", "astuner.trainer_common.logger": "trainer.logger", "astuner.trainer_common.checkpoint_base_dir": "trainer.checkpoint_base_dir", - "astuner.trainer_common.algorithm.task_norm_patch": "algorithm.task_norm_patch", "astuner.trainer_common.algorithm.adv_estimator": "algorithm.adv_estimator", "astuner.trainer_common.algorithm.use_kl_in_reward": "algorithm.use_kl_in_reward", "astuner.trainer_common.mini_batch_num": "actor_rollout_ref.actor.override_ppo_mini_batch_num", diff --git a/astuner/default_config/verl/verl_default.yaml b/astuner/default_config/verl/verl_default.yaml index 0c0d4c0e..4ebda602 100644 --- a/astuner/default_config/verl/verl_default.yaml +++ b/astuner/default_config/verl/verl_default.yaml @@ -213,7 +213,6 @@ algorithm: pf_ppo: reweight_method: pow weight_pow: 2.0 - task_norm_patch: false use_kl_in_reward: false use_pf_ppo: false diff --git a/docs/en/configuration.md b/docs/en/configuration.md index b8dd9fa5..24d77151 100644 --- a/docs/en/configuration.md +++ b/docs/en/configuration.md @@ -517,7 +517,6 @@ astuner: logger: swanlab # optimization algorithms algorithm: - task_norm_patch: False adv_estimator: grpo use_kl_in_reward: False mini_batch_num: 1 diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md index a06e82c3..20cff17b 100644 --- a/docs/zh/configuration.md +++ b/docs/zh/configuration.md @@ -514,7 +514,6 @@ astuner: logger: swanlab # optimization algorithms algorithm: - task_norm_patch: False adv_estimator: grpo use_kl_in_reward: False mini_batch_num: 1 diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.yaml b/tests/bench/benchmark_countdown/benchmark_countdown.yaml index e48250d2..8dd5c5f7 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.yaml +++ b/tests/bench/benchmark_countdown/benchmark_countdown.yaml @@ -105,7 +105,6 @@ astuner: n_gpus_per_node: 8 logger: swanlab algorithm: - task_norm_patch: False adv_estimator: grpo use_kl_in_reward: False mini_batch_num: 1 diff --git a/tutorial/example_countdown/countdown.yaml b/tutorial/example_countdown/countdown.yaml index 25a24330..dac0f633 100644 --- a/tutorial/example_countdown/countdown.yaml +++ b/tutorial/example_countdown/countdown.yaml @@ -115,7 +115,6 @@ astuner: n_gpus_per_node: 8 logger: swanlab algorithm: - task_norm_patch: False adv_estimator: grpo use_kl_in_reward: False mini_batch_num: 1 From ed8c873ee71726e286ea531692b17a248641d9f9 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 16:11:50 +0800 Subject: [PATCH 342/462] remove inherited methods --- astuner/backbone/verl_trainer.py | 594 +++++++---------------- astuner/context_tracker/basic_tracker.py | 6 + astuner/task_rollout/single_worker.py | 9 +- 3 files changed, 186 insertions(+), 423 deletions(-) diff --git a/astuner/backbone/verl_trainer.py b/astuner/backbone/verl_trainer.py index 67e4988b..2e7ff7bc 100644 --- a/astuner/backbone/verl_trainer.py +++ b/astuner/backbone/verl_trainer.py @@ -13,33 +13,21 @@ # limitations under the License. -import json -import os import uuid -import warnings from collections import defaultdict -from dataclasses import dataclass, field -from enum import Enum from pprint import pprint from typing import List, Optional import hydra import numpy as np -import ray import torch from beast_logger import print_dict -from omegaconf import OmegaConf, open_dict -from torch.utils.data import Dataset, Sampler -from torchdata.stateful_dataloader import StatefulDataLoader +from loguru import logger +from omegaconf import OmegaConf from tqdm import tqdm from verl import DataProto from verl.experimental.dataset.sampler import AbstractCurriculumSampler -from verl.single_controller.base import Worker -from verl.single_controller.ray import ( - RayClassWithInitArgs, - RayResourcePool, - RayWorkerGroup, -) +from verl.single_controller.ray import RayClassWithInitArgs from verl.single_controller.ray.base import create_colocated_worker_cls from verl.trainer.config import AlgoConfig from verl.trainer.ppo import core_algos @@ -49,30 +37,22 @@ compute_throughout_metrics, compute_timing_metrics, ) -from verl.trainer.ppo.reward import compute_reward -from verl.utils.checkpoint.checkpoint_manager import ( - find_latest_ckpt_path, - should_save_ckpt_esi, -) -from verl.utils.config import omega_conf_to_dataclass -from verl.utils.debug import marked_timer -from verl.utils.metric import reduce_metrics -from verl.utils.seqlen_balancing import ( - get_seqlen_balanced_partitions, - log_seqlen_unbalance, -) -from verl.utils.torch_functional import masked_mean -from verl.utils.tracking import ValidationGenerationsLogger from verl.trainer.ppo.ray_trainer import ( - Role, WorkerType, ResourcePoolManager, RayPPOTrainer, + RayPPOTrainer, + Role, apply_kl_penalty, compute_response_mask, ) +from verl.trainer.ppo.reward import compute_reward +from verl.utils.checkpoint.checkpoint_manager import should_save_ckpt_esi +from verl.utils.config import omega_conf_to_dataclass +from verl.utils.debug import marked_timer +from verl.utils.metric import reduce_metrics +from astuner.backbone.warm_up import warm_up_process from astuner.context_tracker.basic_tracker import BaseContextTracker from astuner.schema.task import Task from astuner.task_rollout.native_parallel_worker import VerlRolloutManager -from astuner.backbone.warm_up import warm_up_process def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | torch.Tensor: @@ -217,97 +197,12 @@ def compute_advantage( class ASTunerRayPPOTrainer(RayPPOTrainer): """Distributed PPO trainer using Ray for scalable reinforcement learning. - - This trainer orchestrates distributed PPO training across multiple nodes and GPUs, - managing actor rollouts, critic training, and reward computation with Ray backend. - Supports various model architectures including FSDP, Megatron, and vLLM integration. + Slightly modified from RayPPOTrainer in verl. """ - # TODO: support each role have individual ray_worker_group_cls, - # i.e., support different backend of different role - def __init__( - self, - config, - tokenizer, - role_worker_mapping: dict[Role, WorkerType], - resource_pool_manager: ResourcePoolManager, - ray_worker_group_cls: type[RayWorkerGroup] = RayWorkerGroup, - processor=None, - reward_fn=None, - val_reward_fn=None, - train_dataset: Optional[Dataset] = None, - val_dataset: Optional[Dataset] = None, - collate_fn=None, - train_sampler: Optional[Sampler] = None, - device_name=None, - ): - """ - Initialize distributed PPO trainer with Ray backend. - Note that this trainer runs on the driver process on a single CPU/GPU node. - - Args: - config: Configuration object containing training parameters. - tokenizer: Tokenizer used for encoding and decoding text. - role_worker_mapping (dict[Role, WorkerType]): Mapping from roles to worker classes. - resource_pool_manager (ResourcePoolManager): Manager for Ray resource pools. - ray_worker_group_cls (RayWorkerGroup, optional): Class for Ray worker groups. Defaults to RayWorkerGroup. - processor: Optional data processor, used for multimodal data - reward_fn: Function for computing rewards during training. - val_reward_fn: Function for computing rewards during validation. - train_dataset (Optional[Dataset], optional): Training dataset. Defaults to None. - val_dataset (Optional[Dataset], optional): Validation dataset. Defaults to None. - collate_fn: Function to collate data samples into batches. - train_sampler (Optional[Sampler], optional): Sampler for the training dataset. Defaults to None. - device_name (str, optional): Device name for training (e.g., "cuda", "cpu"). Defaults to None. - """ - - # Store the tokenizer for text processing - self.tokenizer = tokenizer - self.processor = processor - self.config = config - self.reward_fn = reward_fn - self.val_reward_fn = val_reward_fn - - self.hybrid_engine = config.actor_rollout_ref.hybrid_engine - assert self.hybrid_engine, "Currently, only support hybrid engine" - - if self.hybrid_engine: - assert Role.ActorRollout in role_worker_mapping, f"{role_worker_mapping.keys()=}" - - self.role_worker_mapping = role_worker_mapping - self.resource_pool_manager = resource_pool_manager - self.use_reference_policy = Role.RefPolicy in role_worker_mapping - self.use_rm = Role.RewardModel in role_worker_mapping - self.ray_worker_group_cls = ray_worker_group_cls - self.device_name = device_name if device_name else self.config.trainer.device - self.validation_generations_logger = ValidationGenerationsLogger( - project_name=self.config.astuner.project_name, - experiment_name=self.config.astuner.experiment_name, - ) - - # if ref_in_actor is True, the reference policy will be actor without lora applied - self.ref_in_actor = config.actor_rollout_ref.model.get("lora_rank", 0) > 0 - - # define in-reward KL control - # kl loss control currently not suppoorted - if self.config.algorithm.use_kl_in_reward: - self.kl_ctrl_in_reward = core_algos.get_kl_controller(self.config.algorithm.kl_ctrl) - - if config.critic.enable is not None: - self.use_critic = bool(config.critic.enable) - elif self.config.algorithm.adv_estimator == AdvantageEstimator.GAE: - self.use_critic = True - else: - warnings.warn( - "Disabled critic as algorithm.adv_estimator != gae. " - "If it is not intended, please set critic.enable=True", - stacklevel=2, - ) - self.use_critic = False - - self._validate_config() - self._create_dataloader(train_dataset, val_dataset, collate_fn, train_sampler) - + # ####################################### + # init + # ####################################### def _validate_config(self): config = self.config # number of GPUs total @@ -419,230 +314,6 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): print("[validate_config] All configuration checks passed successfully!") - def _create_dataloader( - self, - train_dataset, - val_dataset, - collate_fn, - train_sampler: Optional[Sampler], - ): - """ - Creates the train and validation dataloaders. - """ - from verl.trainer.main_ppo import create_rl_dataset, create_rl_sampler - - if train_dataset is None: - train_dataset = create_rl_dataset( - self.config.data.train_files, - self.config.data, - self.tokenizer, - self.processor, - ) - if val_dataset is None: - val_dataset = create_rl_dataset( - self.config.data.val_files, - self.config.data, - self.tokenizer, - self.processor, - ) - self.train_dataset, self.val_dataset = train_dataset, val_dataset - - if train_sampler is None: - train_sampler = create_rl_sampler(self.config.data, self.train_dataset) - if collate_fn is None: - from verl.utils.dataset.rl_dataset import collate_fn as default_collate_fn - - collate_fn = default_collate_fn - - num_workers = self.config.data["dataloader_num_workers"] - - self.train_dataloader = StatefulDataLoader( - dataset=self.train_dataset, - batch_size=self.config.data.get( - "gen_batch_size", self.config.astuner.data.train_batch_size - ), - num_workers=num_workers, - drop_last=True, - collate_fn=collate_fn, - sampler=train_sampler, - ) - - val_batch_size = self.config.data.val_batch_size # Prefer config value if set - if val_batch_size is None: - val_batch_size = len(self.val_dataset) - - self.val_dataloader = StatefulDataLoader( - dataset=self.val_dataset, - batch_size=val_batch_size, - num_workers=num_workers, - shuffle=self.config.data.get("validation_shuffle", True), - drop_last=False, - collate_fn=collate_fn, - ) - - assert len(self.train_dataloader) >= 1, "Train dataloader is empty!" - assert len(self.val_dataloader) >= 1, "Validation dataloader is empty!" - - print( - f"Size of train dataloader: {len(self.train_dataloader)}, Size of val dataloader: " - f"{len(self.val_dataloader)}" - ) - - total_training_steps = len(self.train_dataloader) * self.config.trainer.total_epochs - - if self.config.trainer.total_training_steps is not None: - total_training_steps = self.config.trainer.total_training_steps - - self.total_training_steps = total_training_steps - print(f"Total training steps: {self.total_training_steps}") - - try: - OmegaConf.set_struct(self.config, True) - with open_dict(self.config): - if OmegaConf.select(self.config, "actor_rollout_ref.actor.optim"): - self.config.actor_rollout_ref.actor.optim.total_training_steps = ( - total_training_steps - ) - if OmegaConf.select(self.config, "critic.optim"): - self.config.critic.optim.total_training_steps = total_training_steps - except Exception as e: - print( - f"Warning: Could not set total_training_steps in config. Structure missing? Error: {e}" - ) - - - def _validate(self): - data_source_lst = [] - reward_extra_infos_dict: dict[str, list] = defaultdict(list) - - # Lists to collect samples for the table - sample_inputs = [] - sample_outputs = [] - sample_scores = [] - sample_turns = [] - - for test_data in self.val_dataloader: - test_data["index"] = torch.tensor( - [i for i in range(len(test_data["task_id"]))], dtype=torch.long - ) - test_batch = DataProto.from_single_dict(test_data) - - # repeat test batch - test_batch = test_batch.repeat( - repeat_times=self.config.astuner.rollout.val_kwargs.num_repeat, - interleave=True, - ) - - # we only do validation on rule-based rm - if ( - self.config.reward_model.enable - and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model" - ): - return {} - - batch_keys_to_pop = ["index"] - non_tensor_batch_keys_to_pop = [ - "task_id", - "main_query", - "env_type", - "metadata", - "init_messages", - ] - if "multi_modal_data" in test_batch.non_tensor_batch: - non_tensor_batch_keys_to_pop.append("multi_modal_data") - if "raw_prompt" in test_batch.non_tensor_batch: - non_tensor_batch_keys_to_pop.append("raw_prompt") - if "tools_kwargs" in test_batch.non_tensor_batch: - non_tensor_batch_keys_to_pop.append("tools_kwargs") - if "interaction_kwargs" in test_batch.non_tensor_batch: - non_tensor_batch_keys_to_pop.append("interaction_kwargs") - if "agent_name" in test_batch.non_tensor_batch: - non_tensor_batch_keys_to_pop.append("agent_name") - if "extras" in test_batch.non_tensor_batch: - non_tensor_batch_keys_to_pop.append("extras") - - test_gen_batch = test_batch.pop( - batch_keys=batch_keys_to_pop, - non_tensor_batch_keys=non_tensor_batch_keys_to_pop, - ) - - test_gen_batch.meta_info = { - "eos_token_id": self.tokenizer.eos_token_id, - "pad_token_id": self.tokenizer.pad_token_id, - "recompute_log_prob": False, - "do_sample": self.config.astuner.rollout.val_kwargs.do_sample, - "validate": True, - "global_steps": self.global_steps, - } - print(f"test_gen_batch meta info: {test_gen_batch.meta_info}") - - self.async_rollout_manager.wake_up() - main_val_dataset, test_normal_dataset, test_chanllenge_dataset = self.get_eval_dataset() - - print("=" * 10 + "start validate rollout" + "=" * 10) - context_tracker_arr, tasks, val_metrics = self.eval_dataset( - target_dataset=main_val_dataset, - target_dataset_name="main_val_dataset", - mode="validate", - epoch="test.1", - ) - print("=" * 10 + "end validate rollout" + "=" * 10) - test_output_gen_batch = self.parallel_env.to_dataproto(context_tracker_arr) - self.async_rollout_manager.sleep() - print("validation generation end") - - # Store generated outputs - output_ids = test_output_gen_batch.batch["responses"] - output_texts = [ - self.tokenizer.decode(ids, skip_special_tokens=True) for ids in output_ids - ] - sample_outputs.extend(output_texts) - - test_batch.non_tensor_batch["uid"] = np.array( - [str(uuid.uuid4()) for _ in range(len(test_batch.batch))], - dtype=object, - ) - tasks = tasks[: len(main_val_dataset)] - test_batch = union_gen_batch_via_task_id(tasks, test_batch, test_output_gen_batch) - # test_batch = test_batch.union(test_output_gen_batch) - test_batch.meta_info["validate"] = True - - # evaluate using reward_function - if self.val_reward_fn is None: - raise ValueError("val_reward_fn must be provided for validation.") - result = self.val_reward_fn(test_batch, return_dict=True) - reward_tensor = result["reward_tensor"] - scores = reward_tensor.sum(-1).cpu().tolist() - sample_scores.extend(scores) - - reward_extra_infos_dict["reward"].extend(scores) - print( - f"len reward_extra_infos_dict['reward']: {len(reward_extra_infos_dict['reward'])}" - ) - if "reward_extra_info" in result: - for key, lst in result["reward_extra_info"].items(): - reward_extra_infos_dict[key].extend(lst) - print( - f"len reward_extra_infos_dict['{key}']: {len(reward_extra_infos_dict[key])}" - ) - - # collect num_turns of each prompt - if "__num_turns__" in test_batch.non_tensor_batch: - sample_turns.append(test_batch.non_tensor_batch["__num_turns__"]) - - data_source_lst.append( - test_batch.non_tensor_batch.get("data_source", ["unknown"] * reward_tensor.shape[0]) - ) - break # hack to escape the loop after one batch - - sample_inputs = [ - m["messages"][0]["content"] for m in test_batch.non_tensor_batch["messages"] - ] - - metric_dict = val_metrics - - return metric_dict - def init_workers(self): """Initialize distributed training workers using Ray backend. @@ -771,9 +442,9 @@ def init_workers(self): tokenizer=self.tokenizer, ) - - - + # ####################################### + # training loop + # ####################################### def fit(self): # noqa: C901 """ The training loop of PPO. @@ -785,13 +456,12 @@ def fit(self): # noqa: C901 from verl.utils.tracking import Tracking warm_up_process(self.config) - logger = Tracking( + self.verl_logger = Tracking( project_name=self.config.astuner.project_name, experiment_name=self.config.astuner.experiment_name, default_backend=self.config.trainer.logger, config=OmegaConf.to_container(self.config, resolve=True), ) - self.tracking_logger = logger self.global_steps = 0 # load checkpoint before doing anything @@ -800,13 +470,14 @@ def fit(self): # noqa: C901 # wake and sleep to enforce param sync self.async_rollout_manager.wake_up() self.async_rollout_manager.sleep() + # perform validation before training # currently, we only support validation using the reward_function. if self.val_reward_fn is not None and self.config.trainer.get("val_before_train", True): val_metrics = self._validate() assert val_metrics, f"{val_metrics=}" pprint(f"Initial validation metrics: {val_metrics}") - logger.log(data=val_metrics, step=self.global_steps) + self.verl_logger.log(data=val_metrics, step=self.global_steps) if self.config.trainer.get("val_only", False): return @@ -875,12 +546,12 @@ def fit(self): # noqa: C901 with marked_timer("step", timing_raw): # generate a batch - print("=== + rollout step begin ===") + logger.info("=== + rollout step begin ===") with marked_timer("gen", timing_raw, color="red"): assert self.async_rollout_mode - print("=== wake up begin ===") + logger.info("=== wake up begin ===") self.async_rollout_manager.wake_up() - print("=== wake up end ===") + logger.info("=== wake up end ===") tasks = [ Task( task_id=gen_batch.non_tensor_batch["task_id"][i], @@ -890,21 +561,23 @@ def fit(self): # noqa: C901 ) for i in range(len(gen_batch)) ] - print( - [ - gen_batch.non_tensor_batch["task_id"][i] - for i in range(len(gen_batch)) - ] + logger.info( + str( + [ + gen_batch.non_tensor_batch["task_id"][i] + for i in range(len(gen_batch)) + ] + ) ) - print("=" * 10 + "start fit rollout" + "=" * 10) + logger.info("=" * 10 + "start fit rollout" + "=" * 10) self.parallel_env.current_global_steps = self.global_steps context_tracker_arr: List[BaseContextTracker] = self.parallel_env.rollout( tasks, mode="sample", epoch=f"train.{epoch}" ) - print("=" * 10 + "end fit rollout" + "=" * 10) - print("begin to convert context_tracker_arr to dataproto") + logger.info("=" * 10 + "end fit rollout" + "=" * 10) + logger.info("begin to convert context_tracker_arr to dataproto") gen_batch_output = self.parallel_env.to_dataproto(context_tracker_arr) - print("end convertion") + logger.info("end convertion") success_rate = [ traj.reward_structure.success_rate for traj in context_tracker_arr @@ -932,7 +605,7 @@ def fit(self): # noqa: C901 from astuner.utils.testing_utils import _test_if_test_mode - run_info = get_run().public.json() + run_info = get_run().public.json() # type: ignore data = { "step": self.global_steps, "reward_for_test_robot": metrics["critic/real_reward"], @@ -940,9 +613,11 @@ def fit(self): # noqa: C901 } _test_if_test_mode(key="reward_probe", value=data, config=self.config) - print(f"gen_batch_output.info batch.keys={gen_batch_output.batch.keys()}") + logger.info( + f"gen_batch_output.info batch.keys={gen_batch_output.batch.keys()}" + ) self.async_rollout_manager.sleep() - print("=== - rollout step end ===") + logger.info("=== - rollout step end ===") if self.config.algorithm.adv_estimator == AdvantageEstimator.REMAX: raise NotImplementedError("REMAX is not supported in GRPO yet.") @@ -985,7 +660,7 @@ def fit(self): # noqa: C901 ) # recompute old_log_probs - print("=== + compute log_probs begin ===") + logger.info("=== + compute log_probs begin ===") with marked_timer("old_log_prob", timing_raw, color="blue"): old_log_prob = self.actor_rollout_wg.compute_log_prob(batch) entropys = old_log_prob.batch["entropys"] @@ -1149,9 +824,7 @@ def fit(self): # noqa: C901 if isinstance(self.train_dataloader.sampler, AbstractCurriculumSampler): self.train_dataloader.sampler.update(batch=batch) - # TODO: make a canonical logger that supports various backend - logger.log(data=metrics, step=self.global_steps) - + self.verl_logger.log(data=metrics, step=self.global_steps) progress_bar.update(1) self.global_steps += 1 @@ -1160,11 +833,135 @@ def fit(self): # noqa: C901 progress_bar.close() return - # this is experimental and may be changed/removed in the future - # in favor of a general-purpose data buffer pool - if hasattr(self.train_dataset, "on_batch_end"): - # The dataset may be changed after each training batch - self.train_dataset.on_batch_end(batch=batch) + # ####################################### + # Validate + # ####################################### + def _validate(self): + data_source_lst = [] + reward_extra_infos_dict: dict[str, list] = defaultdict(list) + + # Lists to collect samples for the table + sample_outputs = [] + sample_scores = [] + sample_turns = [] + + for test_data in self.val_dataloader: + test_data["index"] = torch.tensor( + [i for i in range(len(test_data["task_id"]))], dtype=torch.long + ) + test_batch = DataProto.from_single_dict(test_data) + + # repeat test batch + test_batch = test_batch.repeat( + repeat_times=self.config.astuner.rollout.val_kwargs.num_repeat, + interleave=True, + ) + + # we only do validation on rule-based rm + if ( + self.config.reward_model.enable + and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model" + ): + return {} + + batch_keys_to_pop = ["index"] + non_tensor_batch_keys_to_pop = [ + "task_id", + "main_query", + "env_type", + "metadata", + "init_messages", + ] + if "multi_modal_data" in test_batch.non_tensor_batch: + non_tensor_batch_keys_to_pop.append("multi_modal_data") + if "raw_prompt" in test_batch.non_tensor_batch: + non_tensor_batch_keys_to_pop.append("raw_prompt") + if "tools_kwargs" in test_batch.non_tensor_batch: + non_tensor_batch_keys_to_pop.append("tools_kwargs") + if "interaction_kwargs" in test_batch.non_tensor_batch: + non_tensor_batch_keys_to_pop.append("interaction_kwargs") + if "agent_name" in test_batch.non_tensor_batch: + non_tensor_batch_keys_to_pop.append("agent_name") + if "extras" in test_batch.non_tensor_batch: + non_tensor_batch_keys_to_pop.append("extras") + + test_gen_batch = test_batch.pop( + batch_keys=batch_keys_to_pop, + non_tensor_batch_keys=non_tensor_batch_keys_to_pop, + ) + + test_gen_batch.meta_info = { + "eos_token_id": self.tokenizer.eos_token_id, + "pad_token_id": self.tokenizer.pad_token_id, + "recompute_log_prob": False, + "do_sample": self.config.astuner.rollout.val_kwargs.do_sample, + "validate": True, + "global_steps": self.global_steps, + } + logger.info(f"test_gen_batch meta info: {test_gen_batch.meta_info}") + + self.async_rollout_manager.wake_up() + main_val_dataset = self.get_eval_dataset() + + logger.info("=" * 10 + "start validate rollout" + "=" * 10) + context_tracker_arr, tasks, val_metrics = self.eval_dataset( + target_dataset=main_val_dataset, + target_dataset_name="main_val_dataset", + mode="validate", + epoch="test.1", + ) + logger.info("=" * 10 + "end validate rollout" + "=" * 10) + test_output_gen_batch = self.parallel_env.to_dataproto(context_tracker_arr) + self.async_rollout_manager.sleep() + logger.info("validation generation end") + + # Store generated outputs + output_ids = test_output_gen_batch.batch["responses"] + output_texts = [ + self.tokenizer.decode(ids, skip_special_tokens=True) for ids in output_ids + ] + sample_outputs.extend(output_texts) + + test_batch.non_tensor_batch["uid"] = np.array( + [str(uuid.uuid4()) for _ in range(len(test_batch.batch))], + dtype=object, + ) + tasks = tasks[: len(main_val_dataset)] + test_batch = union_gen_batch_via_task_id(tasks, test_batch, test_output_gen_batch) + # test_batch = test_batch.union(test_output_gen_batch) + test_batch.meta_info["validate"] = True + + # evaluate using reward_function + if self.val_reward_fn is None: + raise ValueError("val_reward_fn must be provided for validation.") + result = self.val_reward_fn(test_batch, return_dict=True) + reward_tensor = result["reward_tensor"] + scores = reward_tensor.sum(-1).cpu().tolist() + sample_scores.extend(scores) + + reward_extra_infos_dict["reward"].extend(scores) + logger.info( + f"len reward_extra_infos_dict['reward']: {len(reward_extra_infos_dict['reward'])}" + ) + if "reward_extra_info" in result: + for key, lst in result["reward_extra_info"].items(): + reward_extra_infos_dict[key].extend(lst) + logger.info( + f"len reward_extra_infos_dict['{key}']: {len(reward_extra_infos_dict[key])}" + ) + + # collect num_turns of each prompt + if "__num_turns__" in test_batch.non_tensor_batch: + sample_turns.append(test_batch.non_tensor_batch["__num_turns__"]) + + data_source_lst.append( + test_batch.non_tensor_batch.get("data_source", ["unknown"] * reward_tensor.shape[0]) + ) + break # hack to escape the loop after one batch + + metric_dict = val_metrics + + return metric_dict def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): """ @@ -1180,8 +977,6 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): Tuple of (ctx_trackers, tasks) containing trajectory results and task definitions """ pass_n = self.config.astuner.trainer_common.val_pass_n - # if pass_n == 1: - # return self.eval_dataset_legacy(target_dataset, target_dataset_name, mode, epoch) tasks = [] for _ in range(pass_n): @@ -1208,10 +1003,6 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): task_results[task_id]["reward_arr"] += [ctx_tracker.reward_structure.raw_reward] task_results[task_id]["scenario"] = task_id.split("_")[0] - task_scenario = [task_id.split("_")[0] for task_id in task_results.keys()] - set_scenarios = set(task_scenario) - num_scenarios = len(set_scenarios) - repeated_success_tasks = 0 num_all_success_tasks = 0 # number of tasks that is successful among all n attempts num_pass_n_tasks = 0 # number of tasks that is successful at least once among n attempts @@ -1225,40 +1016,9 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): num_pass_n_tasks += 1 repeated_success_tasks += task_outcomes["tag_arr"].count("success") - num_all_success_scenarios = 0 # If all tasks in a scenario are successful in all n experiments, then num_all_success_scenarios +1 - num_pass_n_scenarios = 0 # If all tasks in a scenario are successful in at least one of the n experiments, then num_pass_n_scenarios +1 - repeated_num_pass_1_scenarios = 0 # In sequential order, if all tasks in a scenario are successful in the x-th experiment, then repeated_num_pass_1_scenarios +1 - for scenario in set_scenarios: - scenario_task_results = { - task_id: task_outcomes - for task_id, task_outcomes in task_results.items() - if task_outcomes["scenario"] == scenario - } - # num_all_success_scenarios - if all( - all(tag == "success" for tag in task_outcomes["tag_arr"]) - for task_outcomes in scenario_task_results.values() - ): - num_all_success_scenarios += 1 - # num_pass_n_scenarios - if all( - any(tag == "success" for tag in task_outcomes["tag_arr"]) - for task_outcomes in scenario_task_results.values() - ): - num_pass_n_scenarios += 1 - # num_pass_1_scenarios - for x in range(pass_n): - if all( - task_outcomes["tag_arr"][x] == "success" - for task_outcomes in scenario_task_results.values() - ): - repeated_num_pass_1_scenarios += 1 - # record logs - task_scenario_for_ctx_trackers = [ctx_tracker.task_id.split("_")[0] for ctx_tracker in ctx_trackers] - for ctx_tracker, scenario in zip(ctx_trackers, task_scenario_for_ctx_trackers): + for ctx_tracker in ctx_trackers: ctx_tracker.generate_log() - reward = ctx_tracker.reward_structure.raw_reward rewards = [ctx_tracker.reward_structure.raw_reward for ctx_tracker in ctx_trackers] num_tasks = len(task_results) @@ -1270,15 +1030,9 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): "total_tasks": len(task_results), "num_all_success_tasks": num_all_success_tasks, f"num_pass_n_tasks(pass@{pass_n})": num_pass_n_tasks, - "num_scenarios": num_scenarios, - "num_all_success_scenarios": num_all_success_scenarios, - f"num_pass_n_scenarios(pass@{pass_n})": num_pass_n_scenarios, "TGC@1": repeated_success_tasks / (num_tasks * pass_n), f"TGC@{pass_n}": num_pass_n_tasks / num_tasks, f"TGC@{pass_n}-all-pass": num_all_success_tasks / num_tasks, - "SGC@1": repeated_num_pass_1_scenarios / (num_scenarios * pass_n), - f"SGC@{pass_n}": num_pass_n_scenarios / num_scenarios, - f"SGC@{pass_n}-all-pass": num_all_success_scenarios / num_scenarios, "mean_reward": sum(rewards) / len(rewards) if rewards else 0, } print_dict( @@ -1288,7 +1042,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): mod="evaluation", ) - self.tracking_logger.log(data=val_metrics, step=self.global_steps) + self.verl_logger.log(data=val_metrics, step=self.global_steps) return ctx_trackers, tasks, val_metrics @@ -1301,4 +1055,4 @@ def get_eval_dataset(self): ) tasks = task_reader.get_validation_tasks() self.main_val_dataset = tasks - return self.main_val_dataset, None, None + return self.main_val_dataset diff --git a/astuner/context_tracker/basic_tracker.py b/astuner/context_tracker/basic_tracker.py index 8397ac92..29d21a44 100644 --- a/astuner/context_tracker/basic_tracker.py +++ b/astuner/context_tracker/basic_tracker.py @@ -658,3 +658,9 @@ def get_generation_prompt_token(self): ) self.generation_prompt = self.tokenizer.decode(self.generation_prompt_token) return self.generation_prompt_token + + def generate_log(self, global_step: str | int = "NA"): + """ + Generate log for the context tracker. + """ + raise NotImplementedError diff --git a/astuner/task_rollout/single_worker.py b/astuner/task_rollout/single_worker.py index ce2e057e..cdb3ef64 100644 --- a/astuner/task_rollout/single_worker.py +++ b/astuner/task_rollout/single_worker.py @@ -55,9 +55,10 @@ def __init__( self.max_llm_retries: int = max_llm_retries self.rollout_n = config.astuner.rollout.num_repeat self.tokenizer = tokenizer - self.pad_token_id: int = self.tokenizer.pad_token_id + self.pad_token_id: int = self.tokenizer.pad_token_id # type: ignore + assert isinstance(self.pad_token_id, int), "pad_token_id must be an integer" self.current_token = 0 - self.current_global_steps = "NA" + self.current_global_steps: int | str = "NA" self.async_llm_bridge = AsyncLlmBridge( config=config, async_rollout_manager=async_rollout_manager, @@ -83,7 +84,9 @@ def rollout_env_worker( (with validation overrides), and robust retry on transient failures. """ sampling_params = get_sample_params(mode, self.config) - llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn(sampling_params=sampling_params) + llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn( + sampling_params=sampling_params + ) workflow_task = WorkflowTask( env_type=task.env_type, From 7af30b48f6d38715c45c5261b5ae6e7cc781fc89 Mon Sep 17 00:00:00 2001 From: Javkonline <95667371+Javkonline@users.noreply.github.com> Date: Wed, 24 Dec 2025 16:30:45 +0800 Subject: [PATCH 343/462] Fix filter datagen (#36) * fix: deduplication_filter * fix: deduplication_filter --- astuner/default_config/astune_default.yaml | 14 +++++---- astuner/task_reader/data_generator_reader.py | 31 ++++++++++++-------- tests/data_gen.yaml | 7 ++--- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/astuner/default_config/astune_default.yaml b/astuner/default_config/astune_default.yaml index c3163163..673ee6ac 100644 --- a/astuner/default_config/astune_default.yaml +++ b/astuner/default_config/astune_default.yaml @@ -112,9 +112,12 @@ astuner: - 'dataset/document/your-document2.pdf' languages: - eng + chunk_size: 5120 + split_by: "sentence" + cache_enabled: true query_reader: - type: dataset_file - dataset_file: + type: jsonl_dataset_file + jsonl_dataset_file: training: file_path: 'dataset/jsonl/your-queries.jsonl' task_num: 10 @@ -123,8 +126,7 @@ astuner: num_workers: 32 sampling_params: temperature: 0 - filter: - type: deduplication + deduplication_filter: enabled: true params: similarity_threshold: 0.8 @@ -157,8 +159,8 @@ astuner: answer_field: final_answer reference_field: answer custom_evaluation_prompt: null # dict or PromptTemplate or None - input_data_type: dataset_file # `env_service` or `dataset_file` or `huggingface_dat_repo` - dataset_file: + input_data_type: jsonl_dataset_file # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` + jsonl_dataset_file: training: file_path: "tutorial/example_rm_auto_grader/rubrics_train.jsonl" # Pointwise mode settings diff --git a/astuner/task_reader/data_generator_reader.py b/astuner/task_reader/data_generator_reader.py index 46d9f186..085db930 100644 --- a/astuner/task_reader/data_generator_reader.py +++ b/astuner/task_reader/data_generator_reader.py @@ -51,12 +51,12 @@ def __init__(self, reader_config): "num_workers": getattr(reader_config.data_generation, "num_workers", 32), "query_reader_type": getattr(reader_config.data_generation.query_reader, "type", None), "document_reader": document_path_str, - "filter": { + "deduplication_filter": { "similarity_threshold": getattr( - reader_config.data_generation.filter.params, "similarity_threshold", None + reader_config.data_generation.deduplication_filter.params, "similarity_threshold", None ), - "db_path": getattr(reader_config.data_generation.filter.params, "db_path", None), - "model": getattr(reader_config.data_generation.filter.params, "model", None), + "db_path": getattr(reader_config.data_generation.deduplication_filter.params, "db_path", None), + "model": getattr(reader_config.data_generation.deduplication_filter.params, "model", None), }, } cache_key_str = json.dumps(cache_config, sort_keys=True, ensure_ascii=False) @@ -76,13 +76,16 @@ def __init__(self, reader_config): self.lock = threading.Lock() # Initialize duplicate filter - self.duplicate_filter = DeduplicationFilter( - similarity_threshold=self.reader_config.data_generation.filter.params.similarity_threshold, - db_path=self.reader_config.data_generation.filter.params.db_path, - model=self.reader_config.data_generation.filter.params.model, - api_key=self.reader_config.data_generation.filter.params.api_key, - base_url=self.reader_config.data_generation.filter.params.base_url, - ) + if self.reader_config.data_generation.deduplication_filter.enabled: + self.duplicate_filter = DeduplicationFilter( + similarity_threshold=self.reader_config.data_generation.deduplication_filter.params.similarity_threshold, + db_path=self.reader_config.data_generation.deduplication_filter.params.db_path, + model=self.reader_config.data_generation.deduplication_filter.params.model, + api_key=self.reader_config.data_generation.deduplication_filter.params.api_key, + base_url=self.reader_config.data_generation.deduplication_filter.params.base_url, + ) + else: + self.duplicate_filter = None # Initialize task reader from astuner.task_reader import RouterTaskReader @@ -211,7 +214,8 @@ def _generate_and_save_tasks(self): self.doc_tasks.extend(tasks) pbar.update(1) - self.doc_tasks = self.duplicate_filter.filter(self.doc_tasks) + if self.duplicate_filter is not None: + self.doc_tasks = self.duplicate_filter.filter(self.doc_tasks) logger.info(f"Generated {len(self.doc_tasks)} document-based tasks") # Save doc_tasks as validation tasks cache @@ -271,7 +275,8 @@ def _generate_and_save_tasks(self): self.new_tasks.append(new_task) pbar.update(1) - self.new_tasks = self.duplicate_filter.filter(self.new_tasks) + if self.duplicate_filter is not None: + self.new_tasks = self.duplicate_filter.filter(self.new_tasks) logger.info(f"Generated {len(self.new_tasks)} augmented tasks") # Save training tasks diff --git a/tests/data_gen.yaml b/tests/data_gen.yaml index 57932f80..b8aad21b 100644 --- a/tests/data_gen.yaml +++ b/tests/data_gen.yaml @@ -10,8 +10,8 @@ astuner: split_by: "sentence" cache_enabled: true query_reader: - type: dataset_file # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` - dataset_file: + type: jsonl_dataset_file # ✨✨✨✨ `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` + jsonl_dataset_file: training: file_path: 'xxxx.jsonl' task_num: 1000 @@ -20,8 +20,7 @@ astuner: num_workers: 32 sampling_params: temperature: 0 - filters: - type: deduplication + deduplication_filter: enabled: true params: similarity_threshold: 0.8 From 66dd619571498cdfa7aeaa389c20056b86da5210 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 16:36:55 +0800 Subject: [PATCH 344/462] fix: update import paths and enhance logging configuration --- astuner/backbone/main_verl.py | 7 +++++-- astuner/utils/launch_utils.py | 8 +++++++- tests/bench/README.md | 10 ++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/astuner/backbone/main_verl.py b/astuner/backbone/main_verl.py index 0eaf380e..decf8843 100644 --- a/astuner/backbone/main_verl.py +++ b/astuner/backbone/main_verl.py @@ -18,17 +18,20 @@ import atexit import os import socket + import hydra import ray - from beast_logger import print_dict from omegaconf import OmegaConf from verl.trainer.ppo.reward import load_reward_manager from verl.utils.device import is_cuda_available + from astuner.utils.core_env_vars import get_runtime_env from astuner.utils.launch_utils import set_loguru_default_color + set_loguru_default_color() + @hydra.main(config_path="config", config_name="ppo_trainer", version_base=None) def main(config): """Main entry point for PPO training with Hydra configuration management. @@ -168,7 +171,7 @@ def run(self, config): else: raise NotImplementedError - from astuner.backbone.verl_trainer import ResourcePoolManager, Role + from verl.trainer.ppo.ray_trainer import ResourcePoolManager, Role # Map roles to their corresponding remote worker classes. role_worker_mapping = { diff --git a/astuner/utils/launch_utils.py b/astuner/utils/launch_utils.py index ae588923..2e5c4f04 100644 --- a/astuner/utils/launch_utils.py +++ b/astuner/utils/launch_utils.py @@ -1,3 +1,4 @@ +import logging import os import shutil import subprocess @@ -10,14 +11,20 @@ from astuner.utils.config_utils import align_parameters from astuner.utils.smart_daemon import LaunchCommandWhenAbsent + def set_loguru_default_color(): logger.remove() colorize = os.environ.get("LOGURU_COLORIZE", "YES").upper() not in ["NO", "0", "FALSE"] logger.add(sys.stderr, colorize=colorize, enqueue=False) if not colorize: os.environ["RAY_COLOR_PREFIX"] = "0" + + logging.getLogger("vllm.entrypoints.openai.tool_parsers.hermes_tool_parser").setLevel( + logging.CRITICAL + ) return + def launch_logview(exp_name=None): """ Launch the log viewer service and open the web browser to view logs. @@ -190,4 +197,3 @@ def execute_training_process( except Exception as e: logger.error(f"Unexpected error: {e}") sys.exit(1) - diff --git a/tests/bench/README.md b/tests/bench/README.md index 9c697e95..44ebe505 100644 --- a/tests/bench/README.md +++ b/tests/bench/README.md @@ -3,3 +3,13 @@ Note: `tests/bench` source code is for test robot only, therefore `yaml` configu To get these dataset files, please refer to `tutorial/*`. To get benchmarking-docker-image, benchmarking-docker-image will be released soon. + +## Running Command + +```python +python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py +python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py +python -m pytest -s tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py +python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py +python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py +``` From 1ce7f9c4d213f3b64312bcf58c2942643fe77079 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 16:47:34 +0800 Subject: [PATCH 345/462] refactor: uncomment and restore test_begin_verl method in execute_benchmark_math.py --- .../benchmark_math/execute_benchmark_math.py | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/tests/bench/benchmark_math/execute_benchmark_math.py b/tests/bench/benchmark_math/execute_benchmark_math.py index 2c6c42cd..1190fecf 100644 --- a/tests/bench/benchmark_math/execute_benchmark_math.py +++ b/tests/bench/benchmark_math/execute_benchmark_math.py @@ -1,5 +1,3 @@ -import unittest - from tests.bench.benchmark_base import BenchmarkTestCase @@ -19,18 +17,17 @@ def test_begin_trinity(self): python_executable=PYTHON_EXECUTABLE, ) - # def test_begin_verl(self): - # # get probe target, so as to get timeout settings - # BACKBONE = "verl" - # TEST_TARGET = "tests/bench/benchmark_math/benchmark_math.yaml" - # PROBE_TARGET = "tests/bench/benchmark_math/benchmark_math.py->TestProbe" - # TARGET_NAME = f"benchmark_math_{BACKBONE}" - # PYTHON_EXECUTABLE = ".verl/bin/python" - # self.execute_benchmark( - # BACKBONE=BACKBONE, - # TEST_TARGET=TEST_TARGET, - # PROBE_TARGET=PROBE_TARGET, - # TARGET_NAME=TARGET_NAME, - # PYTHON_EXECUTABLE=PYTHON_EXECUTABLE, - # ) - + def test_begin_verl(self): + # get probe target, so as to get timeout settings + BACKBONE = "verl" + TEST_TARGET = "tests/bench/benchmark_math/benchmark_math.yaml" + PROBE_TARGET = "tests/bench/benchmark_math/benchmark_math.py->TestProbe" + TARGET_NAME = f"benchmark_math_{BACKBONE}" + PYTHON_EXECUTABLE = ".verl/bin/python" + self.execute_benchmark( + backbone=BACKBONE, + test_target=TEST_TARGET, + probe_target=PROBE_TARGET, + target_name=TARGET_NAME, + python_executable=PYTHON_EXECUTABLE, + ) From b7032d5dc55fbc4ced8b7ded7bc8b69e10a5e464 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 16:51:39 +0800 Subject: [PATCH 346/462] rename *_trainer to trainer_* --- astuner/backbone/__init__.py | 2 +- astuner/backbone/main_verl.py | 2 +- .../{trinity_trainer.py => trainer_trinity.py} | 15 +++++---------- .../backbone/{verl_trainer.py => trainer_verl.py} | 0 4 files changed, 7 insertions(+), 12 deletions(-) rename astuner/backbone/{trinity_trainer.py => trainer_trinity.py} (99%) rename astuner/backbone/{verl_trainer.py => trainer_verl.py} (100%) diff --git a/astuner/backbone/__init__.py b/astuner/backbone/__init__.py index 671ed547..10e6e1de 100644 --- a/astuner/backbone/__init__.py +++ b/astuner/backbone/__init__.py @@ -1,7 +1,7 @@ from loguru import logger try: - from astuner.backbone.trinity_trainer import ( + from astuner.backbone.trainer_trinity import ( ASTunerTaskReader, ASTunerWorkflowWrap, TrinityRolloutManager, diff --git a/astuner/backbone/main_verl.py b/astuner/backbone/main_verl.py index decf8843..a4825853 100644 --- a/astuner/backbone/main_verl.py +++ b/astuner/backbone/main_verl.py @@ -242,7 +242,7 @@ def run(self, config): train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from astuner.backbone.verl_trainer import ASTunerRayPPOTrainer + from astuner.backbone.trainer_verl import ASTunerRayPPOTrainer # Initialize the PPO trainer. trainer = ASTunerRayPPOTrainer( diff --git a/astuner/backbone/trinity_trainer.py b/astuner/backbone/trainer_trinity.py similarity index 99% rename from astuner/backbone/trinity_trainer.py rename to astuner/backbone/trainer_trinity.py index 701f6a04..09650734 100644 --- a/astuner/backbone/trinity_trainer.py +++ b/astuner/backbone/trainer_trinity.py @@ -1,28 +1,23 @@ import asyncio import os -from typing import Dict +from typing import Dict, List, Literal, Optional, cast import datasets import openai import swanlab from loguru import logger +from transformers import AutoTokenizer +from trinity.buffer.reader import READER +from trinity.buffer.reader.file_reader import TaskFileReader, _HFBatchReader +from trinity.buffer.schema import FORMATTER from trinity.common.experience import Experience from trinity.common.models.model import ModelWrapper from trinity.common.workflows import WORKFLOWS from trinity.common.workflows.workflow import Task as TrinityTask from trinity.common.workflows.workflow import Workflow - -from trinity.buffer.reader import READER -from trinity.buffer.reader.file_reader import TaskFileReader, _HFBatchReader -from trinity.buffer.schema import FORMATTER from trinity.utils.log import get_logger from trinity.utils.monitor import MONITOR, Monitor - -from typing import List, Literal, Optional, cast - -from transformers import AutoTokenizer - from astuner.backbone.warm_up import warm_up_process from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, diff --git a/astuner/backbone/verl_trainer.py b/astuner/backbone/trainer_verl.py similarity index 100% rename from astuner/backbone/verl_trainer.py rename to astuner/backbone/trainer_verl.py From aec2ccaf0a0e2f1b80e66625dda8b1000a86ccc3 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 17:22:30 +0800 Subject: [PATCH 347/462] astuner/task_judge/math_answer_as_judge.py move to tutorial --- docs/en/example_math_agent.md | 5 ++- docs/en/task_judger.md | 2 +- docs/en/tune_your_first_agent.md | 4 +-- docs/zh/example_math_agent.md | 6 ++-- docs/zh/task_judger.md | 34 +++++++++---------- docs/zh/tune_your_first_agent.md | 4 +-- .../bench/benchmark_math/benchmark_math.yaml | 2 +- tests/data/config.yaml | 2 +- .../example_feedback_tracing.yaml | 2 +- tutorial/example_math_agent/math_agent.md | 8 ++--- tutorial/example_math_agent/math_agent.yaml | 2 +- .../math_answer_as_judge.py | 0 tutorial/example_rubrics_judge/math_agent.md | 8 ++--- 13 files changed, 39 insertions(+), 40 deletions(-) rename {astuner/task_judge => tutorial/example_math_agent}/math_answer_as_judge.py (100%) diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index 8176d83e..461a81c4 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -118,7 +118,7 @@ astune: agentscope_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn task_judge: - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge model: path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -159,7 +159,7 @@ final_answer = extract_final_answer(result) return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` -**Judge / Reward:** `astune/task_judge/math_answer_as_judge.py` +**Judge / Reward:** `tutorial/example_math_agent/math_answer_as_judge.py` Two simple judges are provided there; you can add your own judge anywhere in the project. @@ -259,4 +259,3 @@ A “good” tool-call behavior typically shows up in logs as: * `` and `` appear in **separate turns** (call → response → answer), * `` contains **non-empty stdout**, * the final answer appears **after** the tool returns, rather than being produced prematurely. - diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index afcc97f6..fe864d82 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -65,7 +65,7 @@ Evaluates mathematical answers by exact string matching, designed for tasks wher astuner: task_judge: judge_type: customized_protocol - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge ``` **How it works:** diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 8fc59d8f..53dc760c 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -227,7 +227,7 @@ There is one more thing we have not addressed yet: the reward. Fortunately, ASTu astuner: #... task_judge: - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge ``` Here we directly use the built-in math judge provided by ASTuner. The judge reads `final_answer` from `metadata` and compares it with the ground-truth answers in the dataset to produce a score. @@ -344,4 +344,4 @@ You can find training logs and checkpoints in the `./launcher_record/{exp_yaml_f ## Read more We provide more detailed explanations for ASTuner's core concepts and many examples. -You can find them in the left sidebar navigation. \ No newline at end of file +You can find them in the left sidebar navigation. diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index c805a5b5..7e401938 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -122,7 +122,7 @@ astune: agentscope_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn task_judge: - judge_protocol: astune.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge model: path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -164,7 +164,7 @@ final_answer = extract_final_answer(result) return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` -**Judge / Reward:** `astune/task_judge/math_answer_as_judge.py` +**Judge / Reward:** `tutorial/example_math_agent/math_answer_as_judge.py` 该文件内提供了两个简单的评审器;你也可以在项目的任何位置添加自己的评审器。 @@ -259,4 +259,4 @@ return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) * `` 和 `` **分轮出现**(发起调用 -> 得到响应 -> 最终回答)。 * `` 包含 **非空的 stdout**。 -* 最终答案出现在工具返回**之后**,而不是提前抢答。 \ No newline at end of file +* 最终答案出现在工具返回**之后**,而不是提前抢答。 diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md index a45763ca..0744aac0 100644 --- a/docs/zh/task_judger.md +++ b/docs/zh/task_judger.md @@ -28,15 +28,15 @@ class BaseJudge: self.config = config def compute_reward( - self, - workflow_task: WorkflowTask, + self, + workflow_task: WorkflowTask, workflow_output: WorkflowOutput ) -> tuple: """ Args: workflow_task: 包含任务数据,包括 metadata 中的参考答案等信息 workflow_output: 包含智能体输出,包括 metadata 中的生成答案等信息 - + Returns: tuple: (raw_reward: float, is_success: bool) """ @@ -65,7 +65,7 @@ AgentScope Tuner 提供了 4 个内置评测器,用于覆盖常见的评测场 astuner: task_judge: judge_type: customized_protocol - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge ``` **工作原理:** @@ -163,21 +163,21 @@ astuner: # 用于 rubric 生成与评测的模型 model_name: "qwen-plus" # or "gpt-4", "claude-3-sonnet" api_key: "your-api-key" # or set DASHSCOPE_API_KEY env var - + # 评测模式 grader_mode: "pointwise" # or "listwise" for ranking multiple outputs language: "en" # or "zh" - + # pointwise 模式配置 min_score: 0 max_score: 10 - + # 用于 rubric 生成的参考数据 input_data_type: "dataset_file" dataset_file: training: file_path: "path/to/rubrics_train.jsonl" - + # 字段映射 query_field: "main_query" # query 对应字段名 answer_field: "final_answer" # workflow output 中的字段 @@ -237,27 +237,27 @@ class MyCustomJudge(BaseJudge): super().__init__(config) # 初始化所需资源(例如外部 API、模型等) self.threshold = 0.8 - + def compute_reward( - self, - workflow_task: WorkflowTask, + self, + workflow_task: WorkflowTask, workflow_output: WorkflowOutput ) -> tuple: # 从 workflow_output 中读取数据 agent_answer = workflow_output.metadata.get("final_answer", "") - + # 从 workflow_task 中读取参考答案 reference_answer = workflow_task.task.metadata.get("answer", "") - + # 自定义评测逻辑 similarity = self._compute_similarity(agent_answer, reference_answer) - + # 基于阈值判断是否成功 is_success = similarity >= self.threshold - + # 返回 (reward, success) return similarity, is_success - + def _compute_similarity(self, text1: str, text2: str) -> float: # 自定义相似度度量 # 这里只是一个简单示例 @@ -286,7 +286,7 @@ class MyWorkflow(Workflow): async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: # 智能体逻辑 final_answer = await self.agent.reply(msg) - + # 返回包含 metadata 的输出,供 judger 使用 return WorkflowOutput( reward=None, # 将由 judger 填充 diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index c6153094..7598a37a 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -222,7 +222,7 @@ astuner: astuner: #... task_judge: - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge ``` 这里我们直接使用 ASTuner 内部提供的 math judge。Judge 会读取 metadata 中的 final_answer,并与数据集中的 ground_truth 对比来得到评分。 @@ -333,4 +333,4 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ## 阅读更多 我们还在左侧边栏提供了更多详细的使用案例和教程,包括数据处理、模型训练、多智能体协作等高级主题。 -你可以阅读并深入了解使用方法。 \ No newline at end of file +你可以阅读并深入了解使用方法。 diff --git a/tests/bench/benchmark_math/benchmark_math.yaml b/tests/bench/benchmark_math/benchmark_math.yaml index 9e45a731..64793313 100644 --- a/tests/bench/benchmark_math/benchmark_math.yaml +++ b/tests/bench/benchmark_math/benchmark_math.yaml @@ -10,7 +10,7 @@ astuner: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge model: # ✨✨✨✨ 设置待训练的模型 diff --git a/tests/data/config.yaml b/tests/data/config.yaml index c1150dcb..24879957 100644 --- a/tests/data/config.yaml +++ b/tests/data/config.yaml @@ -9,7 +9,7 @@ astuner: validation_split: "test" task_judge: - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge model: path: "" diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index 1c767cc8..072d2b63 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -29,7 +29,7 @@ astuner: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge model: # ✨✨✨✨ 设置待训练的模型 diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index c1911c84..08e43df6 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -63,7 +63,7 @@ astune_proxy.update_judge_input_dictionary(final_answer=final_answer) ### 3. 准备Judge (奖励模块) -在 astuner/task_judge/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 +在 tutorial/example_math_agent/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 Judge的输入参数包含: @@ -87,8 +87,8 @@ Judge的返回值: raw_reward, is_success - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - 则填写 astuner.rollout.agentscope_workflow=`tutorial.math_agent->ExampleMathLearn` 3. 定义评分函数(对应配置字段 astuner.task_judge.judge_protocol ) - - 举例如果 agentscope workflow 定义在 `astuner/task_judge/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - - 则填写 astuner.task_judge.judge_protocol=`astuner.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge` + - 举例如果 agentscope workflow 定义在 `tutorial/example_math_agent/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 + - 则填写 astuner.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` 4. 指定模型(对应配置字段 astuner.model.path ) ```yaml @@ -99,7 +99,7 @@ astuner agentscope_workflow: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 619b40e8..4e8713fa 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -11,7 +11,7 @@ astuner: task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge model: # ✨✨✨✨ 设置待训练的模型 diff --git a/astuner/task_judge/math_answer_as_judge.py b/tutorial/example_math_agent/math_answer_as_judge.py similarity index 100% rename from astuner/task_judge/math_answer_as_judge.py rename to tutorial/example_math_agent/math_answer_as_judge.py diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index b6d12980..2232ea3f 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -63,7 +63,7 @@ astune_proxy.update_judge_input_dictionary(final_answer=final_answer) ### 3. 准备Judge (奖励模块) -在 astuner/task_judge/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 +在 tutorial/example_math_agent/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 Judge的输入参数包含: @@ -87,8 +87,8 @@ Judge的返回值: raw_reward, is_success - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - 则填写 astuner.rollout.agentscope_workflow=`tutorial.math_agent->ExampleMathLearn` 3. 定义评分函数(对应配置字段 astuner.task_judge.judge_protocol ) - - 举例如果 agentscope workflow 定义在 `astuner/task_judge/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - - 则填写 astuner.task_judge.judge_protocol=`astuner.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge` + - 举例如果 agentscope workflow 定义在 `tutorial/example_math_agent/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 + - 则填写 astuner.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` 4. 指定模型(对应配置字段 astuner.model.path ) ```yaml @@ -99,7 +99,7 @@ astuner agentscope_workflow: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.math_answer_as_judge->MathAnswerAndLlmAsJudge + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct From 5fb2b4df3de23a6e3ac8c2e81049d6586d690c6b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 24 Dec 2025 17:45:33 +0800 Subject: [PATCH 348/462] refactor: rename RMAutoGraderJudge to AutoGraderJudge and update related imports feat: add CountdownAnswerAsJudge for evaluating countdown tasks chore: move async utility functions to async_utils.py and remove old http_client.py docs: update paths in example_countdown and task_judger documentation --- astuner/backbone/warm_up.py | 2 +- astuner/task_judge/rm_auto_grader_judge.py | 4 +- astuner/task_rollout/async_llm_bridge.py | 6 +- astuner/task_runner/base_runner.py | 6 +- astuner/utils/async_http_client.py | 95 ---------- astuner/utils/async_utils.py | 24 +++ astuner/utils/http_client.py | 177 ------------------ astuner/utils/message_utils.py | 23 +++ astuner/utils/utils.py | 46 ----- docs/en/example_countdown.md | 8 +- docs/en/task_judger.md | 2 +- docs/zh/example_countdown.md | 10 +- docs/zh/task_judger.md | 2 +- .../benchmark_countdown.yaml | 2 +- tutorial/example_countdown/countdown.yaml | 2 +- .../countdown_answer_as_judge.py | 0 .../example_rm_auto_grader/auto_grader.md | 8 +- .../auto_grader_example.py | 4 +- tutorial/example_rm_auto_grader/config.md | 6 +- 19 files changed, 79 insertions(+), 348 deletions(-) delete mode 100644 astuner/utils/async_http_client.py create mode 100644 astuner/utils/async_utils.py delete mode 100644 astuner/utils/http_client.py create mode 100644 astuner/utils/message_utils.py delete mode 100644 astuner/utils/utils.py rename {astuner/task_judge => tutorial/example_countdown}/countdown_answer_as_judge.py (100%) diff --git a/astuner/backbone/warm_up.py b/astuner/backbone/warm_up.py index c01f698a..86a8d297 100644 --- a/astuner/backbone/warm_up.py +++ b/astuner/backbone/warm_up.py @@ -58,6 +58,6 @@ def warm_up_task_judge_when_needed(config): if config.astuner.task_judge.judge_type == "rubrics_auto_grader": from astuner.task_judge.rm_auto_grader_judge import AutoGraderJudge - judge = RMAutoGraderJudge(config) + judge = AutoGraderJudge(config) asyncio.run(judge.generate_rubrics_from_samples()) asyncio.run(judge.load_rubrics_from_cache()) diff --git a/astuner/task_judge/rm_auto_grader_judge.py b/astuner/task_judge/rm_auto_grader_judge.py index 9fe5b0f2..3b0fd6c6 100644 --- a/astuner/task_judge/rm_auto_grader_judge.py +++ b/astuner/task_judge/rm_auto_grader_judge.py @@ -81,7 +81,7 @@ class AutoGraderJudge(BaseJudge): """ def __init__(self, config): - """Initialize the RMAutoGraderJudge. + """Initialize the AutoGraderJudge. Args: config: Configuration object containing model and rubric generation settings @@ -124,7 +124,7 @@ def __init__(self, config): ) logger.info( - f"RMAutoGraderJudge initialized with mode={self.generator_config.grader_mode.value}, " + f"AutoGraderJudge initialized with mode={self.generator_config.grader_mode.value}, " f"language={self.generator_config.language.value}" ) diff --git a/astuner/task_rollout/async_llm_bridge.py b/astuner/task_rollout/async_llm_bridge.py index 97372cbb..745fb36b 100644 --- a/astuner/task_rollout/async_llm_bridge.py +++ b/astuner/task_rollout/async_llm_bridge.py @@ -18,9 +18,9 @@ MultiAgentContextTracker, ) from astuner.schema.logprob import TokenAndProb +from astuner.utils.async_utils import run_async_coroutine_with_timeout from astuner.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode from astuner.utils.tokenizer import astune_apply_chat_template -from astuner.utils.utils import run_async_coroutine_with_timeout class AsyncLlmBridge(object): @@ -286,7 +286,9 @@ async def __call__( # run llm inference ✨ llm_output = await asyncio.wait_for( - asyncio.to_thread(self.llm_inference_fn, converted_message, custom_sampling_params, tools), + asyncio.to_thread( + self.llm_inference_fn, converted_message, custom_sampling_params, tools + ), timeout=1800, ) diff --git a/astuner/task_runner/base_runner.py b/astuner/task_runner/base_runner.py index 623a2c91..d0919364 100644 --- a/astuner/task_runner/base_runner.py +++ b/astuner/task_runner/base_runner.py @@ -2,8 +2,8 @@ from astuner.context_tracker.basic_tracker import BaseContextTracker from astuner.task_judge.base_judge import BaseJudge +from astuner.utils.async_utils import run_async_coroutine_with_timeout from astuner.utils.dynamic_import import dynamic_import -from astuner.utils.utils import run_async_coroutine_with_timeout class BaseAgentRunner(object): @@ -26,9 +26,9 @@ def get_judge(self) -> BaseJudge: # type: ignore elif self.config.astuner.task_judge.judge_type == "rubrics_auto_grader": # astuner/task_judge/rm_auto_grader_judge.py - from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge + from astuner.task_judge.rm_auto_grader_judge import AutoGraderJudge - judge = RMAutoGraderJudge(self.config) + judge = AutoGraderJudge(self.config) run_async_coroutine_with_timeout(judge.load_rubrics_from_cache()) return judge diff --git a/astuner/utils/async_http_client.py b/astuner/utils/async_http_client.py deleted file mode 100644 index e480e844..00000000 --- a/astuner/utils/async_http_client.py +++ /dev/null @@ -1,95 +0,0 @@ -import asyncio -import time -from typing import Any - -import aiohttp -from loguru import logger -from pydantic import BaseModel, Field, PrivateAttr, model_validator - - -class AsyncHttpClient(BaseModel): - url: str = Field(default="") - keep_alive: bool = Field( - default=False, - description="if true, use session to keep long connection", - ) - timeout: int = Field(default=300, description="request timeout, second") - return_default_if_error: bool = Field(default=True) - - request_start_time: float = Field(default_factory=time.time) - request_time_cost: float = Field(default=0.0, description="request time cost") - - retry_sleep_time: float = Field(default=0.5, description="interval time for retry") - retry_time_multiplier: float = Field(default=2.0, description="retry time multiplier") - retry_max_count: int = Field(default=1, description="maximum number of retries") - - _client: Any | aiohttp.ClientSession = PrivateAttr() - - @model_validator(mode="after") - def init_client(self): - self._client = aiohttp.ClientSession(timeout=self.timeout) if self.keep_alive else aiohttp - return self - - async def __aenter__(self): - return self - - async def __aexit__(self, *args): - await self.close() - self.request_time_cost: float = time.time() - self.request_start_time - - async def close(self): - if isinstance(self._client, aiohttp.ClientSession): - await self._client.close() - - def parse_result(self, response: aiohttp.ClientResponse | None = None, **kwargs): - return response.json() - - def return_default(self, **kwargs) -> Any: - return None - - async def request( - self, - data: str | Any = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs, - ) -> Any: - retry_sleep_time = self.retry_sleep_time - method = http_enum - - for i in range(self.retry_max_count): - try: - response = await self._client.request( - method=method, - url=self.url, - data=data, - json=json_data, - headers=headers, - ) - - result = self.parse_result( - response=response, - data=data, - json_data=json_data, - headers=headers, - http_enum=http_enum, - **kwargs, - ) - return result - - except Exception as e: - logger.exception( - f"{self.__class__.__name__} {i}th request failed with args={e.args}" - ) - - if i == self.retry_max_count - 1: - if self.return_default_if_error: - return self.return_default() - else: - raise e - - retry_sleep_time *= self.retry_time_multiplier - await asyncio.sleep(retry_sleep_time) - - return None diff --git a/astuner/utils/async_utils.py b/astuner/utils/async_utils.py new file mode 100644 index 00000000..f17d46c6 --- /dev/null +++ b/astuner/utils/async_utils.py @@ -0,0 +1,24 @@ +import asyncio +import concurrent.futures +from typing import Any + + +def run_async_coroutine_with_timeout(coro, timeout: int = 3600) -> Any: + try: + asyncio.get_running_loop() + in_loop = True + except RuntimeError: + in_loop = False + if not in_loop: + final_res = asyncio.run(coro) + else: + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit(asyncio.run, coro) + try: + final_res = future.result(timeout=timeout) + except concurrent.futures.TimeoutError: + future.cancel() + raise + except Exception: + raise + return final_res diff --git a/astuner/utils/http_client.py b/astuner/utils/http_client.py deleted file mode 100644 index 7e06d059..00000000 --- a/astuner/utils/http_client.py +++ /dev/null @@ -1,177 +0,0 @@ -import http -import time -from typing import Any - -import requests -from loguru import logger -from pydantic import BaseModel, Field, PrivateAttr, model_validator - - -class HttpClient(BaseModel): - url: str = Field(default="") - keep_alive: bool = Field( - default=False, - description="if true, use session to keep long connection", - ) - timeout: int = Field(default=300, description="request timeout, second") - return_default_if_error: bool = Field(default=True) - - request_start_time: float = Field(default_factory=time.time) - request_time_cost: float = Field(default=0.0, description="request time cost") - - retry_sleep_time: float = Field(default=0.5, description="interval time for retry") - retry_time_multiplier: float = Field(default=2.0, description="retry time multiplier") - retry_max_count: int = Field(default=1, description="maximum number of retries") - - _client: Any = PrivateAttr() - - @model_validator(mode="after") - def init_client(self): - self._client = requests.Session() if self.keep_alive else requests - return self - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - self.request_time_cost: float = time.time() - self.request_start_time - - def close(self): - if isinstance(self._client, requests.Session): - self._client.close() - - def _request( - self, - data: str = None, - json_data: dict = None, - headers: dict = None, - stream: bool = False, - http_enum: str = "post", - ): - response: requests.Response - if http_enum == "post": - response = self._client.post( - url=self.url, - data=data, - json=json_data, - headers=headers, - stream=stream, - timeout=self.timeout, - ) - - elif http_enum == "get": - response = self._client.get( - url=self.url, - data=data, - json=json_data, - headers=headers, - stream=stream, - timeout=self.timeout, - ) - - else: - raise NotImplementedError - - if response.status_code != http.HTTPStatus.OK: - raise RuntimeError(f"request failed! content={response.json()}") - - return response - - def parse_result(self, response: requests.Response | Any = None, **kwargs): - return response.json() - - def return_default(self, **kwargs): - return None - - def request( - self, - data: str | Any = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs, - ): - retry_sleep_time = self.retry_sleep_time - for i in range(self.retry_max_count): - try: - response = self._request( - data=data, - json_data=json_data, - headers=headers, - http_enum=http_enum, - ) - result = self.parse_result( - response=response, - data=data, - json_data=json_data, - headers=headers, - http_enum=http_enum, - **kwargs, - ) - return result - - except Exception as e: - logger.exception( - f"{self.__class__.__name__} {i}th request failed with args={e.args}" - ) - - if i == self.retry_max_count - 1: - if self.return_default_if_error: - return self.return_default() - else: - raise e - - retry_sleep_time *= self.retry_time_multiplier - time.sleep(retry_sleep_time) - - return None - - def request_stream( - self, - data: str = None, - json_data: dict = None, - headers: dict = None, - http_enum: str = "post", - **kwargs, - ): - retry_sleep_time = self.retry_sleep_time - for i in range(self.retry_max_count): - try: - response = self._request( - data=data, - json_data=json_data, - headers=headers, - stream=True, - http_enum=http_enum, - ) - request_context = {} - for iter_idx, line in enumerate(response.iter_lines()): - yield self.parse_result( - line=line, - request_context=request_context, - index=iter_idx, - data=data, - json_data=json_data, - headers=headers, - http_enum=http_enum, - **kwargs, - ) - - return None - - except Exception as e: - logger.exception( - f"{self.__class__.__name__} {i}th request failed with args={e.args}" - ) - - if i == self.retry_max_count - 1: - if self.return_default_if_error: - return self.return_default() - else: - raise e - - retry_sleep_time *= self.retry_time_multiplier - time.sleep(retry_sleep_time) - - return None diff --git a/astuner/utils/message_utils.py b/astuner/utils/message_utils.py new file mode 100644 index 00000000..1c6abcad --- /dev/null +++ b/astuner/utils/message_utils.py @@ -0,0 +1,23 @@ +import copy +from typing import Dict, List + + +# apply chat_template to a message, and then convert back to message +def convert_tool_to_user_message(tool_message, tokenizer, format="qwen"): + assert format == "qwen" + + if tool_message["role"] == "user": + return tool_message + elif tool_message["role"] == "tool" and len(tool_message["tool_calls"]) > 0: + assert len(tool_message["tool_calls"]) == 1 + return { + "role": "user", + "content": str(tool_message["tool_calls"][0]["result"]), + } + + +def remove_fields(d: Dict, fields: List[str]) -> Dict: + d = copy.deepcopy(d) + for field in fields: + d.pop(field.strip(), None) + return d diff --git a/astuner/utils/utils.py b/astuner/utils/utils.py deleted file mode 100644 index ef8fe325..00000000 --- a/astuner/utils/utils.py +++ /dev/null @@ -1,46 +0,0 @@ -import asyncio -import concurrent.futures -import copy -from typing import Any, Dict, List - - -# apply chat_template to a message, and then convert back to message -def convert_tool_to_user_message(tool_message, tokenizer, format="qwen"): - assert format == "qwen" - - if tool_message["role"] == "user": - return tool_message - elif tool_message["role"] == "tool" and len(tool_message["tool_calls"]) > 0: - assert len(tool_message["tool_calls"]) == 1 - return { - "role": "user", - "content": str(tool_message["tool_calls"][0]["result"]), - } - - -def run_async_coroutine_with_timeout(coro, timeout: int = 3600) -> Any: - try: - asyncio.get_running_loop() - in_loop = True - except RuntimeError: - in_loop = False - if not in_loop: - final_res = asyncio.run(coro) - else: - with concurrent.futures.ThreadPoolExecutor() as executor: - future = executor.submit(asyncio.run, coro) - try: - final_res = future.result(timeout=timeout) - except concurrent.futures.TimeoutError: - future.cancel() - raise - except Exception: - raise - return final_res - - -def remove_fields(d: Dict, fields: List[str]) -> Dict: - d = copy.deepcopy(d) - for field in fields: - d.pop(field.strip(), None) - return d diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index 7043d4ff..73b31dfd 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -114,8 +114,8 @@ Copy and modify key parameters in `tutorial/example_countdown/countdown.yaml`. T - Example: If agentscope workflow is defined in `ExampleCountdownLearn` class of `tutorial/example_countdown/countdown.py` - Then set `astuner.rollout.agentscope_workflow`=`tutorial.example_countdown.countdown->ExampleCountdownLearn` 3. Define scoring function (corresponds to configuration field `astuner.task_judge.judge_protocol`) - - Example: If agentscope workflow is defined in `CountdownAnswerAsJudge` class of `astuner/task_judge/countdown_answer_as_judge.py` - - Then set `astuner.task_judge.judge_protocol`=`astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge` + - Example: If agentscope workflow is defined in `CountdownAnswerAsJudge` class of `tutorial/example_countdown/countdown_answer_as_judge.py` + - Then set `astuner.task_judge.judge_protocol`=`tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge` 4. Specify model (corresponds to configuration field `astuner.model.path`) ```yaml @@ -126,7 +126,7 @@ astuner: agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # ✨✨✨✨ Write and select Agent task_judge: # ✨✨✨✨ Write and select evaluation function - judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge + judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge model: # ✨✨✨✨ Set the model to be trained path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct @@ -138,7 +138,7 @@ astuner: - `tutorial/example_countdown/countdown.yaml`: wires together task reader, workflow, judge, and model. ### 3.4 Reward/Evaluation Mechanism -A simple Judge is provided in `astuner/task_judge/countdown_answer_as_judge.py`. You can create new Judge code anywhere in the project. +A simple Judge is provided in `tutorial/example_countdown/countdown_answer_as_judge.py`. You can create new Judge code anywhere in the project. Judge input parameters include: diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index fe864d82..141013ce 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -97,7 +97,7 @@ Evaluates mathematical equations with partial credit for proper formatting. astuner: task_judge: judge_type: customized_protocol - judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge + judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge ``` **Scoring:** diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index dbfacaa1..a9464bf7 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -88,10 +88,10 @@ WorkflowOutput( 1. 读取任务(对应配置字段 `astuner.task_reader`) 2. 定义 Workflow(对应配置字段 `astuner.rollout.agentscope_workflow`) - 示例:如果 AgentScope Workflow 定义在 `tutorial/example_countdown/countdown.py` 的 `ExampleCountdownLearn` 类中 - - 则配置 `astuner.rollout.agentscope_workflow`=`tutorial.example_countdown.countdown->ExampleCountdownLearn` + - 则配置 `astuner.rollout.agentscope_workflow` = `tutorial.example_countdown.countdown->ExampleCountdownLearn` 3. 定义评分函数(对应配置字段 `astuner.task_judge.judge_protocol`) - - 示例:如果评分逻辑定义在 `astuner/task_judge/countdown_answer_as_judge.py` 的 `CountdownAnswerAsJudge` 类中 - - 则配置 `astuner.task_judge.judge_protocol`=`astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge` + - 示例:如果评分逻辑定义在 `tutorial/example_countdown/countdown_answer_as_judge.py` 的 `CountdownAnswerAsJudge` 类中 + - 则配置 `tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge` 4. 指定模型(对应配置字段 `astuner.model.path`) ```yaml @@ -102,7 +102,7 @@ astuner: agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # ✨✨✨✨ 编写并选择智能体 task_judge: # ✨✨✨✨ 编写并选择评估函数 - judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge + judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge model: # ✨✨✨✨ 设置需要训练的模型 path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct @@ -114,7 +114,7 @@ astuner: - `tutorial/example_countdown/countdown.yaml`:将 task_reader、workflow、judge、model 等模块连接起来。 ### 3.4 奖励/评估机制 -在 `astuner/task_judge/countdown_answer_as_judge.py` 中提供了一个简单的 Judge 示例。你也可以在项目任意位置实现自己的 Judge 逻辑。 +在 `tutorial/example_countdown/countdown_answer_as_judge.py` 中提供了一个简单的 Judge 示例。你也可以在项目任意位置实现自己的 Judge 逻辑。 Judge 的输入参数包括: diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md index 0744aac0..800c7e6d 100644 --- a/docs/zh/task_judger.md +++ b/docs/zh/task_judger.md @@ -97,7 +97,7 @@ astuner: astuner: task_judge: judge_type: customized_protocol - judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge + judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge ``` **评分规则:** diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.yaml b/tests/bench/benchmark_countdown/benchmark_countdown.yaml index 8dd5c5f7..6eb5f25c 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.yaml +++ b/tests/bench/benchmark_countdown/benchmark_countdown.yaml @@ -91,7 +91,7 @@ astuner: task_judge: judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' # ✨✨✨✨ when `judge_type == customized_protocol` - judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge + judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge # trainer common configurations diff --git a/tutorial/example_countdown/countdown.yaml b/tutorial/example_countdown/countdown.yaml index dac0f633..9702e8fb 100644 --- a/tutorial/example_countdown/countdown.yaml +++ b/tutorial/example_countdown/countdown.yaml @@ -93,7 +93,7 @@ astuner: judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' # ✨✨✨✨ when `judge_type == customized_protocol` - judge_protocol: astuner.task_judge.countdown_answer_as_judge->CountdownAnswerAsJudge + judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge # when backbone is `debug`, debug related configurations debug: diff --git a/astuner/task_judge/countdown_answer_as_judge.py b/tutorial/example_countdown/countdown_answer_as_judge.py similarity index 100% rename from astuner/task_judge/countdown_answer_as_judge.py rename to tutorial/example_countdown/countdown_answer_as_judge.py diff --git a/tutorial/example_rm_auto_grader/auto_grader.md b/tutorial/example_rm_auto_grader/auto_grader.md index 1f450b58..9a67d274 100644 --- a/tutorial/example_rm_auto_grader/auto_grader.md +++ b/tutorial/example_rm_auto_grader/auto_grader.md @@ -102,10 +102,10 @@ Each sample contains a query with multiple ranked candidates: ### 3. Basic Usage ```python -from astuner.task_judge.rm_auto_grader_judge import RMAutoGraderJudge +from astuner.task_judge.rm_auto_grader_judge import AutoGraderJudge # Initialize judge -judge = RMAutoGraderJudge(config) +judge = AutoGraderJudge(config) # Generate rubrics (one-time setup) await judge.generate_rubrics_from_samples() @@ -210,7 +210,7 @@ reference_samples = [ ] # Initialize and generate rubrics -judge = RMAutoGraderJudge(config) +judge = AutoGraderJudge(config) await judge.generate_rubrics_from_samples(reference_samples) # Create test task and output @@ -244,7 +244,7 @@ reference_samples = [ ] # Initialize and generate rubrics -judge = RMAutoGraderJudge(config) +judge = AutoGraderJudge(config) await judge.generate_rubrics_from_samples(reference_samples) # Create test task with multiple candidates diff --git a/tutorial/example_rm_auto_grader/auto_grader_example.py b/tutorial/example_rm_auto_grader/auto_grader_example.py index e227873c..1970ce9d 100644 --- a/tutorial/example_rm_auto_grader/auto_grader_example.py +++ b/tutorial/example_rm_auto_grader/auto_grader_example.py @@ -31,7 +31,7 @@ async def example_pregerated_rubrics(): """ - Example of using RMAutoGraderJudge with iteratively-generated rubrics (Pointwise mode). + Example of using AutoGraderJudge with iteratively-generated rubrics (Pointwise mode). This approach uses the IterativeRubricsGenerator to automatically create evaluation rubrics from reference samples using a Propose-Evaluate-Revise loop. @@ -109,7 +109,7 @@ class RubricsAutoGrader: async def example_listwise_mode(): """ - Example of using RMAutoGraderJudge in Listwise mode with iterative rubrics. + Example of using AutoGraderJudge in Listwise mode with iterative rubrics. Listwise mode ranks multiple candidate answers for the same query. This is useful for: diff --git a/tutorial/example_rm_auto_grader/config.md b/tutorial/example_rm_auto_grader/config.md index f3620b23..fc5f5be9 100644 --- a/tutorial/example_rm_auto_grader/config.md +++ b/tutorial/example_rm_auto_grader/config.md @@ -4,7 +4,7 @@ astuner # Task judge configuration using RM Auto Grader task_judge: - # Use RMAutoGraderJudge for pre-generated rubrics + # Use AutoGraderJudge for pre-generated rubrics # Or use RMAutoGraderBatchJudge for online rubric generation # ======================================== @@ -94,7 +94,7 @@ astuner # ============================================ # astuner # task_judge: -# class_name: RMAutoGraderJudge +# class_name: AutoGraderJudge # model_name: "qwen-plus" # grader_mode: "pointwise" # language: "en" @@ -116,7 +116,7 @@ astuner # ============================================ # astuner # task_judge: -# class_name: RMAutoGraderJudge +# class_name: AutoGraderJudge # model_name: "gpt-4" # grader_mode: "pointwise" # language: "en" From 3605c5d727be82c9302fc3ea68fa51bfacaa6a79 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 24 Dec 2025 17:58:24 +0800 Subject: [PATCH 349/462] refactor: replace Fn with structured ReActAgent output, and convert filters to async --- astuner/data_generator/filters/__init__.py | 0 astuner/data_generator/filters/base.py | 11 - astuner/data_generator/filters/factory.py | 44 ---- .../filters/llm_evaluate_filter.py | 104 --------- astuner/task_reader/data_generator_reader.py | 6 +- .../task_reader/tracing_reader/__init__.py | 6 +- .../tracing_reader/filters/base.py | 31 ++- .../filters/deduplication_filter.py | 2 +- .../tracing_reader/filters/factory.py | 2 + .../filters/llm_evaluate_filter.py | 58 ++--- astuner/utils/fn.py | 199 ------------------ tests/test_tracing_reader.py | 4 +- 12 files changed, 73 insertions(+), 394 deletions(-) delete mode 100644 astuner/data_generator/filters/__init__.py delete mode 100644 astuner/data_generator/filters/base.py delete mode 100644 astuner/data_generator/filters/factory.py delete mode 100644 astuner/data_generator/filters/llm_evaluate_filter.py rename astuner/{data_generator => task_reader/tracing_reader}/filters/deduplication_filter.py (94%) delete mode 100644 astuner/utils/fn.py diff --git a/astuner/data_generator/filters/__init__.py b/astuner/data_generator/filters/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/astuner/data_generator/filters/base.py b/astuner/data_generator/filters/base.py deleted file mode 100644 index f72bae4c..00000000 --- a/astuner/data_generator/filters/base.py +++ /dev/null @@ -1,11 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Iterable, List - -from astuner.schema.task import Task - - -class Filter(ABC): - @abstractmethod - def filter(self, tasks: Iterable[Task]) -> List[Task]: - """Filter a collection of Task objects and return the kept ones.""" - raise NotImplementedError diff --git a/astuner/data_generator/filters/factory.py b/astuner/data_generator/filters/factory.py deleted file mode 100644 index fbfe8edf..00000000 --- a/astuner/data_generator/filters/factory.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from typing import Any, Dict, List, Mapping, MutableMapping, Sequence - -from .base import Filter -from .deduplication_filter import DeduplicationFilter -from .llm_evaluate_filter import LlmEvaluateFilter - -FILTER_REGISTRY: Dict[str, type[Filter]] = { - "llm_evaluate": LlmEvaluateFilter, - "deduplication": DeduplicationFilter, -} - - -def _build_single_filter(spec: Mapping[str, Any]) -> Filter: - type_name = spec.get("type") - if not isinstance(type_name, str): - raise ValueError(f"Filter spec must contain string 'type', got: {type_name!r}") - - params = spec.get("params") or {} - if not isinstance(params, MutableMapping): - raise TypeError("Filter 'params' must be a mapping if present") - - cls = FILTER_REGISTRY.get(type_name) - if cls is None: - raise ValueError(f"Unknown filter type: {type_name!r}") - - return cls(**params) # type: ignore[arg-type] - - -def build_filters(specs: Sequence[Mapping[str, Any]] | None) -> List[Filter]: - """Setup filter chain according to config. - Refer to: astuner.task_reader.feedback_tracing.filters - """ - if not specs: - return [] - - filters: List[Filter] = [] - for spec in specs: - enabled = spec.get("enabled", True) - if not enabled: - continue - filters.append(_build_single_filter(spec)) - return filters diff --git a/astuner/data_generator/filters/llm_evaluate_filter.py b/astuner/data_generator/filters/llm_evaluate_filter.py deleted file mode 100644 index e2b62585..00000000 --- a/astuner/data_generator/filters/llm_evaluate_filter.py +++ /dev/null @@ -1,104 +0,0 @@ -from concurrent.futures import ThreadPoolExecutor, as_completed -from typing import Iterable, List - -from astuner.schema.task import Task -from astuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn -from astuner.utils.fn import Fn - -from .base import Filter - -EVALUATE_PROMPT = """You are now acting as a **strict QA quality reviewer**. You will be given a data sample containing a “query” (user question/task) and an “answer” (assistant reply). Evaluate it **only based on the text itself**, without inventing facts or performing external retrieval. - ---- - -## 1. Evaluation Goal -Determine whether the given “query-answer” pair is **high-quality data (GOOD)** and provide a score and justification. -If it does not meet the criteria, label it as **BAD**. - ---- - -## 2. BAD Criteria (if any are met → BAD) -1. **Missing elements**: The query is empty, the answer is empty, or both are empty. -2. **Non-answer**: The answer contains only acknowledgments such as “Received / OK / Please provide more information,” without substantive content or actionable results. -3. **Irrelevant**: The answer is clearly unrelated to the query. -4. **Process excuses**: The answer mainly describes process issues (“cannot search / rate-limited / captcha / try another device”), **without** providing alternative information, summaries, or next steps. -5. **Self-contradiction or illogical**: The answer contradicts itself or contains major logical inconsistencies. -6. **Safety or compliance violations**: Includes illegal content, hate speech, personal privacy leaks, or other clearly inappropriate material. -7. **Severe language mismatch**: The answer is in a completely different language from the query in a way that breaks comprehension (e.g., Chinese query but irrelevant and incoherent French reply). - ---- - -## 3. Special Cases & Additional Rules -{custom_rubrics} - ---- - -If **any** of the above conditions are triggered, the final result must be **BAD**. Otherwise, it is **GOOD**. -""" - - -class LlmEvaluateFilter(Filter): - def __init__( - self, - *, - custom_rubrics: str = "", - temperature: float = 0.7, - max_tokens: int = 2048, - print_reason: bool = True, - max_thread: int = 1, - ) -> None: - """Filter that evaluates the quality of tasks using LLM.""" - - self._print_reason = print_reason - self._max_thread = max_thread - self.external_llm_fn = create_external_llm_fn( - alien_llm_model="qwen3-235b-a22b-instruct-2507", - alien_llm_response_length=512, - ) - self._fn = Fn( - name="evaluate_quality", - description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), - external_llm_fn=self.external_llm_fn, - input_schema={ - "query": "user query/task", - "answer": "assistant answer", - }, - output_schema={ - "reason": "judgment reason, briefly explain the reason", - "result": "GOOD/BAD", - }, - sampling_params={ - "temperature": temperature, - "max_tokens": max_tokens, - }, - ) - - def filter(self, tasks: Iterable[Task]) -> List[Task]: - tasks_list = list(tasks) - kept: List[Task] = [] - - if not tasks_list: - return kept - - max_workers = max(self._max_thread, 1) - - def _evaluate(task: Task) -> dict: - payload = { - "query": task.main_query, - "answer": task.metadata.get("answer", ""), - } - res = self._fn(payload) - assert isinstance(res, dict) - return res - - with ThreadPoolExecutor(max_workers=max_workers) as executor: - future_to_task = {executor.submit(_evaluate, task): task for task in tasks_list} - for future in as_completed(future_to_task): - task = future_to_task[future] - res = future.result() - if self._print_reason: - print(res["reason"]) - if res.get("result") == "GOOD": - kept.append(task) - - return kept diff --git a/astuner/task_reader/data_generator_reader.py b/astuner/task_reader/data_generator_reader.py index 085db930..2e95bcd1 100644 --- a/astuner/task_reader/data_generator_reader.py +++ b/astuner/task_reader/data_generator_reader.py @@ -11,7 +11,7 @@ from loguru import logger from tqdm import tqdm -from astuner.data_generator.filters.deduplication_filter import DeduplicationFilter +from astuner.task_reader.tracing_reader.filters.deduplication_filter import DeduplicationFilter from astuner.data_generator.knowledge_augmentation import KnowledgeAugmentor from astuner.data_generator.task_augmentation import TaskAugmentor from astuner.schema.task import Task @@ -215,7 +215,7 @@ def _generate_and_save_tasks(self): pbar.update(1) if self.duplicate_filter is not None: - self.doc_tasks = self.duplicate_filter.filter(self.doc_tasks) + self.doc_tasks = self.duplicate_filter.filter_sync(self.doc_tasks) logger.info(f"Generated {len(self.doc_tasks)} document-based tasks") # Save doc_tasks as validation tasks cache @@ -276,7 +276,7 @@ def _generate_and_save_tasks(self): pbar.update(1) if self.duplicate_filter is not None: - self.new_tasks = self.duplicate_filter.filter(self.new_tasks) + self.new_tasks = self.duplicate_filter.filter_sync(self.new_tasks) logger.info(f"Generated {len(self.new_tasks)} augmented tasks") # Save training tasks diff --git a/astuner/task_reader/tracing_reader/__init__.py b/astuner/task_reader/tracing_reader/__init__.py index 075e3eb1..d11667f2 100644 --- a/astuner/task_reader/tracing_reader/__init__.py +++ b/astuner/task_reader/tracing_reader/__init__.py @@ -5,8 +5,8 @@ from loguru import logger -from astuner.data_generator.filters.base import Filter -from astuner.data_generator.filters.factory import build_filters +from astuner.task_reader.tracing_reader.filters.base import Filter +from astuner.task_reader.tracing_reader.filters.factory import build_filters from astuner.schema.task import Task from ..task_reader_base import BaseTaskReader @@ -73,7 +73,7 @@ def _append_tasks(self, path: str, tasks: List[Task]) -> None: def _apply_filters(self, tasks: List[Task]) -> List[Task]: filtered = tasks for flt in self._filters: - filtered = flt.filter(filtered) + filtered = flt.filter_sync(filtered) return filtered def _init_tasks(self) -> None: diff --git a/astuner/task_reader/tracing_reader/filters/base.py b/astuner/task_reader/tracing_reader/filters/base.py index f72bae4c..c0703076 100644 --- a/astuner/task_reader/tracing_reader/filters/base.py +++ b/astuner/task_reader/tracing_reader/filters/base.py @@ -1,4 +1,6 @@ from abc import ABC, abstractmethod +import asyncio +import threading from typing import Iterable, List from astuner.schema.task import Task @@ -6,6 +8,33 @@ class Filter(ABC): @abstractmethod - def filter(self, tasks: Iterable[Task]) -> List[Task]: + async def filter(self, tasks: Iterable[Task]) -> List[Task]: """Filter a collection of Task objects and return the kept ones.""" raise NotImplementedError + + def filter_sync(self, tasks: Iterable[Task]) -> List[Task]: + """This is a temp fix for async filter being called in a sync context.""" + try: + asyncio.get_running_loop() + except RuntimeError: + return asyncio.run(self.filter(tasks)) + + res_holder: dict[str, object] = {} + err_holder: dict[str, BaseException] = {} + + def _runner() -> None: + try: + res_holder["res"] = asyncio.run(self.filter(tasks)) + except BaseException as e: + err_holder["err"] = e + + t = threading.Thread(target=_runner, daemon=True) + t.start() + t.join() + + if "err" in err_holder: + raise err_holder["err"] + + res = res_holder.get("res") + assert isinstance(res, list) + return res diff --git a/astuner/data_generator/filters/deduplication_filter.py b/astuner/task_reader/tracing_reader/filters/deduplication_filter.py similarity index 94% rename from astuner/data_generator/filters/deduplication_filter.py rename to astuner/task_reader/tracing_reader/filters/deduplication_filter.py index 059464a0..c488c891 100644 --- a/astuner/data_generator/filters/deduplication_filter.py +++ b/astuner/task_reader/tracing_reader/filters/deduplication_filter.py @@ -32,7 +32,7 @@ def __init__( self._similarity_threshold = similarity_threshold self._db_path = db_path - def filter(self, tasks: Iterable[Task]) -> List[Task]: + async def filter(self, tasks: Iterable[Task]) -> List[Task]: res = [] for task in tasks: similar = self._client.find_top_k_by_text(task.main_query, k=1) diff --git a/astuner/task_reader/tracing_reader/filters/factory.py b/astuner/task_reader/tracing_reader/filters/factory.py index 61e6b803..1c57c8aa 100644 --- a/astuner/task_reader/tracing_reader/filters/factory.py +++ b/astuner/task_reader/tracing_reader/filters/factory.py @@ -4,9 +4,11 @@ from .base import Filter from .llm_evaluate_filter import LlmEvaluateFilter +from .deduplication_filter import DeduplicationFilter FILTER_REGISTRY: Dict[str, type[Filter]] = { "llm_evaluate": LlmEvaluateFilter, + "deduplication": DeduplicationFilter, } diff --git a/astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 4b26b6bc..5ddb8b7e 100644 --- a/astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -1,10 +1,17 @@ +import os from typing import Iterable, List +from agentscope.agent import ReActAgent +from agentscope.formatter import DashScopeMultiAgentFormatter +from agentscope.message import Msg +from agentscope.model import DashScopeChatModel +from pydantic import BaseModel, Field from astuner.schema.task import Task from astuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn -from astuner.utils.fn import Fn from .base import Filter + + EVALUATE_PROMPT = """You are now acting as a **strict QA quality reviewer**. You will be given a data sample containing a “query” (user question/task) and an “answer” (assistant reply). Evaluate it **only based on the text itself**, without inventing facts or performing external retrieval. --- @@ -34,6 +41,14 @@ If **any** of the above conditions are triggered, the final result must be **BAD**. Otherwise, it is **GOOD**. """ +class EvalResModel(BaseModel): + reason:str=Field( + description="judgment reason, briefly explain the reason", + ) + result:str=Field( + description="GOOD/BAD", + ) + class LlmEvaluateFilter(Filter): def __init__( @@ -51,35 +66,26 @@ def __init__( alien_llm_model="qwen3-235b-a22b-instruct-2507", alien_llm_response_length=512, ) - self._fn = Fn( - name="evaluate_quality", - description=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), - external_llm_fn=self.external_llm_fn, - input_schema={ - "query": "user query/task", - "answer": "assistant answer", - }, - output_schema={ - "reason": "judgment reason, briefly explain the reason", - "result": "GOOD/BAD", - }, - sampling_params={ - "temperature": temperature, - "max_tokens": max_tokens, - }, + self._fn=ReActAgent( + name=f"agent", + sys_prompt=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), + model=DashScopeChatModel("qwen3-235b-a22b-instruct-2507",os.environ['DASHSCOPE_API_KEY']), + formatter=DashScopeMultiAgentFormatter(), + max_iters=1, ) - def filter(self, tasks: Iterable[Task]) -> List[Task]: + async def filter(self, tasks: Iterable[Task]) -> List[Task]: kept: List[Task] = [] for task in tasks: - payload = { - "query": task.main_query, - "answer": task.metadata.get("answer", ""), - } - res = self._fn(payload) - assert isinstance(res, dict) + payload = ( + "query: " + task.main_query + "\n" + "answer: " + task.metadata.get("answer", "") + ) + + res = await self._fn(Msg("user",content=payload,role="user"),structured_model=EvalResModel) + assert isinstance(res, EvalResModel) if self._print_reason: - print(res["reason"]) - if res.get("result") == "GOOD": + print(res.reason) + if res.result == "GOOD": kept.append(task) return kept diff --git a/astuner/utils/fn.py b/astuner/utils/fn.py deleted file mode 100644 index 000c61f3..00000000 --- a/astuner/utils/fn.py +++ /dev/null @@ -1,199 +0,0 @@ -import re -from typing import Any, Dict, List, Union - - -class Fn: - """ - A class that defines a task with specific requirements, input parameters, and output format. - It uses LlmClient to execute the task and parses the result using markdown-kv format. - """ - - def __init__( - self, - name: str, - description: str, - external_llm_fn: Any, - input_schema: Dict[str, str], - output_schema: Dict[str, str], - sampling_params: Dict[str, Any] = {}, - ): - """ - Initialize the Fn class. - - Args: - name: The name of the function/task - description: Description of what the task does - llm_client: The LLM client to use for execution - input_schema: Dictionary defining the input parameters format (name -> description) - output_schema: Dictionary defining the output format (name -> description) - sampling_params: Parameters for LLM sampling - """ - self.name = name - self.description = description - self.external_llm_fn = external_llm_fn - self.input_schema = input_schema - self.output_schema = output_schema - self.sampling_params = sampling_params or {} - - def _build_system_prompt(self) -> str: - """ - Build the system prompt that defines the task requirements, input format, and output format. - - Returns: - str: The system prompt for the LLM - """ - prompt_parts = [] - - # Task description - prompt_parts.append(f"## Task: {self.name}") - prompt_parts.append(f"Description: {self.description}") - prompt_parts.append("") - - # Input format - prompt_parts.append("## Input Parameters") - if self.input_schema: - prompt_parts.append("The input parameters should be provided in the following format:") - for param_name, param_desc in self.input_schema.items(): - prompt_parts.append(f"- {param_name}: {param_desc}") - prompt_parts.append("") - prompt_parts.append("Input can be either:") - prompt_parts.append("1. A single record (dict) with the above parameters") - prompt_parts.append("2. Multiple records (list of dicts) with the same parameters") - else: - prompt_parts.append("This task takes no input parameters.") - prompt_parts.append("") - - # Output format - prompt_parts.append("## Output Format") - prompt_parts.append("You must return the result in markdown-kv format as shown below:") - prompt_parts.append("```markdown") - if self.output_schema: - prompt_parts.append("## record 0") - for field_name, field_desc in self.output_schema.items(): - prompt_parts.append(f"{field_name}=value") - else: - prompt_parts.append("## record 0") - prompt_parts.append("result=success") - prompt_parts.append("```") - prompt_parts.append("") - - # Multiple records instruction - prompt_parts.append( - "If there are multiple results, use separate records with increasing indices:" - ) - prompt_parts.append("```markdown") - prompt_parts.append("## record 0") - prompt_parts.append("name=first_result") - prompt_parts.append("value=some_value") - prompt_parts.append("") - prompt_parts.append("## record 1") - prompt_parts.append("name=second_result") - prompt_parts.append("value=another_value") - prompt_parts.append("```") - prompt_parts.append("") - - # Important instructions - prompt_parts.append("## Important Instructions") - prompt_parts.append("1. Always follow the exact markdown-kv format shown above") - prompt_parts.append("2. Do not include any other text or formatting in your response") - prompt_parts.append("3. Only return the markdown-kv formatted result") - - return "\n".join(prompt_parts) - - def _parse_markdown_kv(self, text: str) -> Union[Dict[str, str], List[Dict[str, str]]]: - """ - Parse markdown-kv formatted text into dictionary or list of dictionaries. - - Args: - text: The markdown-kv formatted text to parse - - Returns: - Union[Dict[str, str], List[Dict[str, str]]]: Parsed result as dict or list of dicts - """ - # Remove code block markers if present - text = re.sub(r"```.*?\n", "", text, flags=re.DOTALL) - text = re.sub(r"```", "", text) - - # Split by record headers - record_pattern = r"## record \d+" - record_sections = re.split(record_pattern, text) - - # Remove empty sections - record_sections = [section.strip() for section in record_sections if section.strip()] - - results = [] - for section in record_sections: - # Parse key-value pairs - kv_dict = {} - lines = section.strip().split("\n") - for line in lines: - if "=" in line: - key, value = line.split("=", 1) - kv_dict[key.strip()] = value.strip() - if kv_dict: # Only add non-empty dictionaries - results.append(kv_dict) - - # Return single dict if only one record, otherwise return list - if len(results) == 1: - return results[0] - return results - - def _format_input_parameters( - self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]] - ) -> str: - """ - Format input parameters for the user prompt. - - Args: - input_data: Input parameters as dict or list of dicts - - Returns: - str: Formatted string representation of input parameters - """ - if isinstance(input_data, list): - if not input_data: - return "No input parameters provided." - - formatted_parts = ["Input parameters (multiple records):"] - for i, record in enumerate(input_data): - formatted_parts.append(f"\nRecord {i}:") - for key, value in record.items(): - formatted_parts.append(f" - {key}: {value}") - return "\n".join(formatted_parts) - elif isinstance(input_data, dict): - if not input_data: - return "No input parameters provided." - - formatted_parts = ["Input parameters:"] - for key, value in input_data.items(): - formatted_parts.append(f" - {key}: {value}") - return "\n".join(formatted_parts) - else: - return f"Input parameters: {input_data}" - - def __call__( - self, input_data: Union[Dict[str, Any], List[Dict[str, Any]]] - ) -> Union[Dict[str, str], List[Dict[str, str]]]: - """ - Execute the task with the given parameters. - - Args: - input_data: Input parameters for the task (dict or list of dicts) - - Returns: - Union[Dict[str, str], List[Dict[str, str]]]: The parsed result from the LLM - """ - # Build the user prompt with input parameters - user_prompt = self._format_input_parameters(input_data) - - # Build messages for LLM - messages = [ - {"role": "system", "content": self._build_system_prompt()}, - {"role": "user", "content": user_prompt}, - ] - - # Call LLM - response = self.external_llm_fn(messages, self.sampling_params) - - # Parse and return result - return self._parse_markdown_kv(response["content"]) diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index 0343dbbe..2f1901d9 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -4,7 +4,7 @@ import pytest -from astuner.data_generator.filters.base import Filter +from astuner.task_reader.tracing_reader.filters.base import Filter from astuner.schema.task import Task from astuner.task_reader.tracing_reader import TracingReader @@ -26,7 +26,7 @@ def __init__(self, kept: List[Task]): self._kept = kept self.last_input: List[Task] | None = None - def filter(self, tasks: Iterable[Task]) -> List[Task]: + async def filter(self, tasks: Iterable[Task]) -> List[Task]: self.last_input = list(tasks) return self._kept From 6d8d09082930389c5270ce8d7fde2d75a970f512 Mon Sep 17 00:00:00 2001 From: Javkonline <95667371+Javkonline@users.noreply.github.com> Date: Wed, 24 Dec 2025 22:05:14 +0800 Subject: [PATCH 350/462] Update example (#37) * update en examples * update zh examples --- docs/en/example_app_world.md | 14 ++++++++++++++ docs/en/example_countdown.md | 10 ++++++++++ docs/en/example_frozenlake.md | 7 +++++++ docs/en/example_werewolves.md | 4 ++++ docs/zh/example_app_world.md | 13 +++++++++++++ docs/zh/example_countdown.md | 9 ++++++++- docs/zh/example_frozenlake.md | 8 ++++++++ docs/zh/example_werewolves.md | 11 ++++++++--- 8 files changed, 72 insertions(+), 4 deletions(-) diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index 1eb08ed7..c8d72bb6 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -171,6 +171,12 @@ astuner: > **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. +As training progresses, reward increases. This usually means the agent becomes more stable on **two things**: + +* **Following correct API protocols**: it learns to look up API documentation before calling, and uses valid API endpoints instead of hallucinating non-existent ones. +* **Completing multi-step workflows**: it can properly obtain access tokens and chain multiple API calls to accomplish complex tasks. + + ### 4.2 Case Study #### Before tuning: @@ -179,18 +185,26 @@ astuner: ![Before tuning](https://img.alicdn.com/imgextra/i1/O1CN015FgjqI20Ip3AJybr0_!!6000000006827-2-tps-1259-683.png) +The agent hallucinates API names without checking whether they exist, leading to repeated failures. + 2. Fail to follow the instructions to obtain an access token ![Before tuning](https://img.alicdn.com/imgextra/i1/O1CN01bGZ1s01VyjCSrTJte_!!6000000002722-2-tps-1181-954.png) +The agent attempts to call protected APIs without first obtaining the required access token, resulting in authentication errors. + #### After tuning: 1. Look up the API documentation first, and learn to use valid APIs ![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01VRIDy922PoKD1bETl_!!6000000007113-2-tps-1180-944.png) +The agent now checks available APIs before making calls, avoiding hallucinated endpoints. + 2. Learn to obtain an access token correctly ![After tuning](https://img.alicdn.com/imgextra/i2/O1CN01xiF9UU20h62dyrZ4x_!!6000000006880-2-tps-1182-793.png) +The agent properly handles the authentication step before accessing protected APIs. + > **Token-level Visualization:** These detailed logs are generated by Beast-Logger. See [Beast-Logger Usage](./beast_logger.md) for more details. diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index 73b31dfd..665661a9 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -160,6 +160,12 @@ Judge return values: > **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. +The upward trend in reward reflects improvement in two key areas: + +* **Format compliance**: the agent learns to emit well-formed `` JSON and wrap answers in `\boxed{...}`. +* **Accuracy improvement**: the agent achieves higher correctness rates in solving problems. + + ### 4.2 Case Study Agents are already able to deal with some simple problems at the beginning of the training process; however, small models inevitably produce many answers that fail to fully meet the requirements. In some problems, the agent does not strictly follow the instructions, such as invalid output format, reusing numbers, or missing expression outputs. @@ -188,7 +194,11 @@ boxing the answer as \boxed{{64}}.<|im_end|> However, tuning resolves these issues, as shown in the example below: +1. **Message 3**: decomposes the problem + emits a ``, and uses `\boxed{}` to output key values +2. **Message 4**: decomposes the problem further, and reuses numbers in expressions. + ![After tuning](https://img.alicdn.com/imgextra/i1/O1CN011HjAxo20DKIcPAPVr_!!6000000006815-2-tps-1658-506.png) ![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01C3kUnV221zjPi30rd_!!6000000007061-2-tps-1650-730.png) > **Token-level Visualization:** These detailed logs are generated by Beast-Logger. See [Beast-Logger Usage](./beast_logger.md) for more details. + diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index 6cc0fd8f..16664802 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -159,3 +159,10 @@ class FrozenLakeWorkflow(Workflow): ![](https://img.alicdn.com/imgextra/i3/O1CN01ZfICUr1Rs4zXrPPXQ_!!6000000002166-2-tps-858-614.png) > **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. + +Since the reward is sparse (only `+1` when reaching the goal, otherwise `0`), the rising reward curve directly reflects an **increasing success rate**—the agent reaches the goal G more often. + +This improvement typically comes from two aspects: + +* **Better spatial reasoning**: the agent learns to parse the grid and identify the relative positions. +* **Safer path planning**: it avoids falling into holes and takes more reliable routes toward the goal. diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index 3e4d4db8..a564d335 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -131,6 +131,10 @@ If you need a more fine-grained evaluation (e.g., giving partial credit for key > **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. +As training progresses, win rate increases. This usually means the agent becomes more stable on **two things**: +- **Role-playing consistency**: the agent learns to maintain its werewolf cover under pressure, avoiding self-exposure even when voted out. +- **Social deception skills**: it develops strategies to mislead opponents, sow suspicion among villagers, and implicitly coordinate with teammates. + ### 4.2 Case Study #### Behavior Shifts diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 9fce2531..0f3bd33b 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -136,6 +136,11 @@ astuner: > **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). +随着训练的进展,奖励也会增加。这通常意味着智能体在**两个方面**变得更加稳定: + +* **遵循正确的 API 协议**:它学会在调用前查阅 API 文档,并使用有效的 API 端点,而不是虚构不存在的 API。 +* **完成多步工作流**:它能够正确获取 access token,并串联多个 API 调用以完成复杂任务。 + ### 4.2 案例展示 #### 调优前: @@ -144,18 +149,26 @@ astuner: ![Before tuning](https://img.alicdn.com/imgextra/i1/O1CN015FgjqI20Ip3AJybr0_!!6000000006827-2-tps-1259-683.png) +智能体在不检查 API 是否存在的情况下产生幻觉,导致重复失败。 + 2. 没有学会按照说明去获取 access token ![Before tuning](https://img.alicdn.com/imgextra/i1/O1CN01bGZ1s01VyjCSrTJte_!!6000000002722-2-tps-1181-954.png) +智能体在未先获取所需的访问令牌(access token)的情况下尝试调用受保护的 API,导致认证错误。 + #### 调优后: 1. 会先查阅 API 文档,并学会使用有效的 API ![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01VRIDy922PoKD1bETl_!!6000000007113-2-tps-1180-944.png) +智能体现在会先检查可用的 API 再发起调用,从而避免臆造不存在的接口端点。 + 2. 学会正确获取 access token ![After tuning](https://img.alicdn.com/imgextra/i2/O1CN01xiF9UU20h62dyrZ4x_!!6000000006880-2-tps-1182-793.png) +智能体在访问受保护的 API 之前,会先正确完成认证步骤。 + > **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index a9464bf7..b685eadb 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -136,9 +136,14 @@ Judge 的返回值包括: ![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01TtaeD91rnfBF736Zu_!!6000000005676-2-tps-1328-630.png) +奖励值的上升趋势反映了两个关键方面的改进: + +* **格式遵循**: 智能体 学会生成格式良好的 `` JSON,并使用 `\boxed{...}` 包裹答案。 +* **准确率提升**: 智能体 在解决问题上的正确率提高。 + ### 4.2 案例分析 -在训练初期,智能体已经能够处理一些简单问题;但由于小模型的能力限制,仍然会产生许多无法完全满足要求的答案。在一些题目中,智能体没有严格遵循指令,例如输出格式不正确、重复使用数字、或缺少表达式输出。 +在训练初期, 智能体 已经能够处理一些简单问题;但由于小模型的能力限制,仍然会产生许多无法完全满足要求的答案。在一些题目中, 智能体 没有严格遵循指令,例如输出格式不正确、重复使用数字、或缺少表达式输出。 ``` bad case 1: 回答格式不符合要求。 @@ -163,6 +168,8 @@ boxing the answer as \boxed{{64}}.<|im_end|> 不过,经过调优后,这些问题会得到明显改善,例如下图所示: +1. **消息 3**:将问题拆解并发出 ``,同时用 `\boxed{}` 输出关键结果。 +2. **消息 4**:对问题进行更细致的拆解,并在表达式中复用数字。 ![After tuning](https://img.alicdn.com/imgextra/i1/O1CN011HjAxo20DKIcPAPVr_!!6000000006815-2-tps-1658-506.png) ![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01C3kUnV221zjPi30rd_!!6000000007061-2-tps-1650-730.png) diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md index 4980316a..050e1549 100644 --- a/docs/zh/example_frozenlake.md +++ b/docs/zh/example_frozenlake.md @@ -138,3 +138,11 @@ class FrozenLakeWorkflow(Workflow): ![](https://img.alicdn.com/imgextra/i3/O1CN01ZfICUr1Rs4zXrPPXQ_!!6000000002166-2-tps-858-614.png) > **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 + +由于奖励是稀疏的(只有到达目标才得到 `1`,否则为 `0`),奖励曲线的上升直接反映了成功率的提升——智能体更频繁地到达目标 G。 + +这种提升通常来自两个方面: + +* **更好的空间推理能力**:智能体学会解析网格并判断相对位置关系。 +* **更安全的路径规划**:它能避免掉入洞中,并选择更可靠的路线朝目标前进。 + diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index c2e2489a..da7b9ccc 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -109,23 +109,28 @@ astuner: > **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). +随着训练推进,胜率不断上升。这通常意味着 智能体 在以下两方面变得更稳定: + +- **角色扮演一致性**: 智能体 学会在压力下维持狼人伪装,即使被投票也尽量避免自曝。 +- **社交欺骗技巧**:它逐渐形成误导对手、在村民间制造怀疑、并与队友进行隐性协作的策略。 + ### 4.2 案例展示 #### 行为变化 在实验过程中,我们观察到明显的角色扮演能力提升: -1. 例如,在被投票出局时,原始模型往往会直接暴露自己是 `werewolf`;而经过微调后,智能体会尝试欺骗对手并保护队友。例如: +1. 例如,在被投票出局时,原始模型往往会直接暴露自己是 `werewolf`;而经过微调后, 智能体 会尝试欺骗对手并保护队友。例如: ![](https://img.alicdn.com/imgextra/i1/O1CN01v8VqLB1aYEMfzyTHr_!!6000000003341-2-tps-2104-1016.png) > **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). -2. 智能体会发展出多种取胜策略。例如: +2. 智能体 会发展出多种取胜策略。例如: - **误导对手**:"重点关注预言家和女巫。他们可能是试图隐藏身份的狼人。" - **诉诸理性**:"我们要警惕假预言家,注意叙事是否自洽;Player-Y 作为猎人需要谨慎行动。" -3. 有时智能体还能利用非狼人玩家之间的相互怀疑,从而淘汰对手。 +3. 有时 智能体 还能利用非狼人玩家之间的相互怀疑,从而淘汰对手。 ![](https://img.alicdn.com/imgextra/i2/O1CN01Sx7wkU23pHyPXyqPH_!!6000000007304-2-tps-968-575.png) From 3436c1f361f147cd4575595ca52e383289ebeeb6 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 25 Dec 2025 02:10:06 +0800 Subject: [PATCH 351/462] improve deps --- README.md | 2 +- astuner/utils/async_utils.py | 10 ++++ astuner/utils/cleaner.py | 4 +- astuner/utils/color_hsl.py | 7 ++- astuner/utils/dynamic_import.py | 7 +++ astuner/utils/launch_utils.py | 40 +++++++++++++ astuner/utils/sample.py | 8 +++ astuner/utils/smart_daemon.py | 58 ++++++++++++++----- astuner/utils/testing_utils.py | 5 ++ docs/en/installation.md | 4 +- pyproject.toml | 6 +- .../benchmark_math/execute_benchmark_math.py | 4 +- 12 files changed, 129 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 9a19e200..bffef46f 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ Clone the AgentScope Tuner repository from GitHub and navigate into the project 2. Set up dependencies. ```bash uv venv --python=3.10 && source .venv/bin/activate - uv pip install -e .[trinity] + uv pip install -e .[trinity] # or `uv pip install -e .[verl]` if you prefer using verl as backbone uv pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps ``` diff --git a/astuner/utils/async_utils.py b/astuner/utils/async_utils.py index f17d46c6..71865b67 100644 --- a/astuner/utils/async_utils.py +++ b/astuner/utils/async_utils.py @@ -4,6 +4,16 @@ def run_async_coroutine_with_timeout(coro, timeout: int = 3600) -> Any: + """ + Run an async coroutine with a timeout, supporting both inside and outside event loops. + Args: + coro: The coroutine to run. + timeout (int): Timeout in seconds. Default is 3600. + Returns: + Any: The result of the coroutine. + Raises: + concurrent.futures.TimeoutError: If the coroutine does not finish in time. + """ try: asyncio.get_running_loop() in_loop = True diff --git a/astuner/utils/cleaner.py b/astuner/utils/cleaner.py index d50006ab..2d04e857 100644 --- a/astuner/utils/cleaner.py +++ b/astuner/utils/cleaner.py @@ -19,7 +19,9 @@ def kill_ray_processes(): def fast_kill_by_keyword_bash( - keyword: str, exclude_substrings=["vscode", "benchmark"], grace_seconds: float = 1.0 + keyword: str, + exclude_substrings=["vscode", "benchmark", "jupyter", "supervisord"], + grace_seconds: float = 1.0, ): """Use bash pipelines to kill processes matching keyword quickly. diff --git a/astuner/utils/color_hsl.py b/astuner/utils/color_hsl.py index cfd7808c..3b423e44 100644 --- a/astuner/utils/color_hsl.py +++ b/astuner/utils/color_hsl.py @@ -3,7 +3,12 @@ def adjust_color_hsl(base_color, logprob): """ - Adjust color saturation using the HSL color space based on logprob + Adjust color saturation using the HSL color space based on log probability. + Args: + base_color (str): Hexadecimal color string (e.g., '#ff0000'). + logprob (float): Log probability value to determine saturation. + Returns: + str: Adjusted hexadecimal color string. """ # Map logprob to a saturation adjustment factor in the range [sat_min, sat_max] sat_min = 0.333 diff --git a/astuner/utils/dynamic_import.py b/astuner/utils/dynamic_import.py index 5660dd9e..708cb11d 100644 --- a/astuner/utils/dynamic_import.py +++ b/astuner/utils/dynamic_import.py @@ -82,5 +82,12 @@ def _dynamic_import(module_class_str: str): def dynamic_import(module_class_str: str): + """ + Thread-safe dynamic import of a class from a module string. + Args: + module_class_str (str): Module and class string, e.g., 'module.path->ClassName' or 'path/to/module.py->ClassName'. + Returns: + type: The imported class type. + """ with _import_lock: return _dynamic_import(module_class_str) diff --git a/astuner/utils/launch_utils.py b/astuner/utils/launch_utils.py index 2e5c4f04..6b33c071 100644 --- a/astuner/utils/launch_utils.py +++ b/astuner/utils/launch_utils.py @@ -108,6 +108,45 @@ def start_ray_service(args, env, cluster=False): ) +def verify_python_env(args): + """ + Verify that the current Python environment matches the expected executable. + + Args: + args: Command line arguments containing the expected python_executable + """ + + # check: when args.backbone == "trinity", import verl, verl.__version__.startswith("0.5.0.post") + import verl + + if args.backbone == "trinity": + if verl.__version__.startswith("0.5.0.post"): + cause = "Python environment does not match current backbone 'trinity'." + solution = "Please `cd /path/to/project/agentscope-tuner` and run `(uv) pip install -e .[trinity]` to install the correct environment." + print_dict( + { + "Python Environment Check": "FAILED", + "Cause": cause, + "Solution": solution, + } + ) + time.sleep(5) + raise ImportError(cause + " " + solution) + elif args.backbone == "verl": + if not verl.__version__.startswith("0.5.0.post"): + cause = "Python environment does not match current backbone 'verl'." + solution = "Please `cd /path/to/project/agentscope-tuner` and run `(uv) pip install -e .[verl]` to install the correct environment." + print_dict( + { + "Python Environment Check": "FAILED", + "Cause": cause, + "Solution": solution, + } + ) + time.sleep(5) + raise ImportError(cause + " " + solution) + + def execute_training_process( args, backbone_target, @@ -190,6 +229,7 @@ def execute_training_process( "YAML Config": exe_yaml_path, } ) + verify_python_env(args) subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) except subprocess.CalledProcessError as e: logger.error(f"Error running subprocess: {e}") diff --git a/astuner/utils/sample.py b/astuner/utils/sample.py index 5319b072..ac6a2311 100644 --- a/astuner/utils/sample.py +++ b/astuner/utils/sample.py @@ -1,4 +1,12 @@ def get_sample_params(mode, config): + """ + Generate sampling parameters for text generation based on mode and config. + Args: + mode (str): The mode of operation, e.g., 'validate'. + config: Configuration object containing rollout parameters. + Returns: + dict: Sampling parameters for the model. + """ response_length_eps = ( 16 # Reserve a few tokens for later handling of special tokens like lm_start. ) diff --git a/astuner/utils/smart_daemon.py b/astuner/utils/smart_daemon.py index db94369e..84dd60e8 100644 --- a/astuner/utils/smart_daemon.py +++ b/astuner/utils/smart_daemon.py @@ -5,7 +5,6 @@ import os import subprocess import sys -import re import time from pathlib import Path from typing import List, Optional, Tuple @@ -16,6 +15,13 @@ def string_to_base64(s): + """ + Convert a string to its base64 encoded representation. + Args: + s (str): Input string. + Returns: + str: Base64 encoded string. + """ # First, encode the string to bytes s_bytes = s.encode("utf-8") # Then convert bytes to base64 @@ -113,6 +119,13 @@ def _is_script_running( return False, None, None def is_pgid_running(self, pgid): + """ + Check if a process group ID is running (ignoring zombies). + Args: + pgid (int): Process group ID. + Returns: + Tuple[bool, Optional[psutil.Process]]: (is_running, process_if_found) + """ # Treat zombie processes as not running to avoid false positives. for proc in psutil.process_iter(["pid", "status"]): try: @@ -163,6 +176,9 @@ def _kill_existing_process_group(self, pgid: int): print(f"Cleaned up PGID file: {self.pgid_file}") def shutdown(self): + """ + Shutdown the process group if running. + """ if self.pgid: self._kill_existing_process_group(self.pgid) @@ -190,6 +206,9 @@ def launch( force_restart (bool): If True, kill existing process and restart launch_wait_time (int): Maximum time to wait for process launch in seconds success_std_string (str, List[str]): String to look for in stdout to confirm successful launch + env_dict (dict): Environment variables for the process + Returns: + str: Content that hit the success string, if any. """ is_running, existing_process, pgid = self._is_script_running() self.pgid = pgid @@ -245,13 +264,15 @@ def launch( # for key in ['COLORTERM', 'LS_COLORS', 'CLICOLOR', 'CLICOLOR_FORCE', 'FORCE_COLOR']: # env_dict.pop(key, None) - env_dict.update({ - 'NO_COLOR': '1', - # 'TERM': 'dumb', - # 'PYTHONUNBUFFERED': '1', - 'LOGURU_COLORIZE': 'NO', - # 'LOGURU_AUTOINIT': '1', - }) + env_dict.update( + { + "NO_COLOR": "1", + # 'TERM': 'dumb', + # 'PYTHONUNBUFFERED': '1', + "LOGURU_COLORIZE": "NO", + # 'LOGURU_AUTOINIT': '1', + } + ) proc = subprocess.Popen( self.cmd, @@ -259,10 +280,7 @@ def launch( stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL, cwd=self.dir, - env={ - "ScriptHash": self.script_hash, - **env_dict - }, + env={"ScriptHash": self.script_hash, **env_dict}, start_new_session=True, # Start new session ) f.close() # Close append handle @@ -328,7 +346,7 @@ def launch( break # if we have reached finish line, then break if hit_success_string: - f_read_trim = inc_read # .replace("\n", " ") + f_read_trim = inc_read # .replace("\n", " ") print( f"Waiting for process launch [PGID {pgid}, PID {proc.pid}] ({f_read_trim})" ) @@ -339,7 +357,7 @@ def launch( remaining = int(launch_wait_time - (time.time() - start_time)) # trim output for printing - f_read_trim = inc_read # .replace("\n", " ") + f_read_trim = inc_read # .replace("\n", " ") if f_read_trim: if previous_r_print: print("") @@ -386,7 +404,19 @@ def launch( class LaunchCommandWhenAbsent(LaunchWhenAbsent): + """ + Launch a command as a detached process if not already running, using a hash of the command for uniqueness. + """ + def __init__(self, full_argument_list: List[str], dir=None, tag="", use_pty=False): + """ + Initialize with the full argument list for the command. + Args: + full_argument_list (List[str]): Command and arguments to launch. + dir (str, optional): Working directory. + tag (str, optional): Tag for log file naming. + use_pty (bool, optional): Whether to use PTY for the process. + """ if not dir: self.dir = os.getcwd() else: diff --git a/astuner/utils/testing_utils.py b/astuner/utils/testing_utils.py index 0927fd2f..6c30155a 100644 --- a/astuner/utils/testing_utils.py +++ b/astuner/utils/testing_utils.py @@ -143,6 +143,11 @@ def populate_test_env_metadata(workspace_dir: str) -> tuple[str, str]: def update_benchmark_status(status, status_detail, append_log="", data_dashboard_url=""): + if "ASTUNER_GIT_HASH" not in os.environ: + raise RuntimeError( + "ASTUNER_GIT_HASH not found in environment variables. Please set `astuner.execute_test=False`." + ) + git_hash = os.environ["ASTUNER_GIT_HASH"] req_txt = os.environ["ASTUNER_REQ_TXT"] target_name = os.environ["ASTUNER_BENCHMARK_NAME"] diff --git a/docs/en/installation.md b/docs/en/installation.md index bf490c91..60bdfcf8 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -40,7 +40,7 @@ We recommend using `uv` to manage your Python environment as it is incredibly fa uv venv --python=3.10 source .venv/bin/activate uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] - uv pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps ``` @@ -48,7 +48,7 @@ We recommend using `uv` to manage your Python environment as it is incredibly fa ```bash source .venv/bin/activate uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps, export MAX_JOBS=${N_CPU} to build faster ``` #### 2. Install one-click via docker diff --git a/pyproject.toml b/pyproject.toml index 2057fd3b..7e7c011a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,14 +37,10 @@ trinity = [ "trinity-rft==0.3.3" ] - verl = [ - "vllm==0.10.0", - "verl @ git+https://github.com/binary-husky/verl.git", + "verl-bundle[vllm]==0.5.0.post2", ] - - dev = [ "pre-commit>=2.17.0", "black>=23.7.0", diff --git a/tests/bench/benchmark_math/execute_benchmark_math.py b/tests/bench/benchmark_math/execute_benchmark_math.py index 1190fecf..1feadd04 100644 --- a/tests/bench/benchmark_math/execute_benchmark_math.py +++ b/tests/bench/benchmark_math/execute_benchmark_math.py @@ -2,7 +2,7 @@ class TestBenchmarkMath(BenchmarkTestCase): - def test_begin_trinity(self): + def test_02_begin_trinity(self): # get probe target, so as to get timeout settings BACKBONE = "trinity" TEST_TARGET = "tests/bench/benchmark_math/benchmark_math.yaml" @@ -17,7 +17,7 @@ def test_begin_trinity(self): python_executable=PYTHON_EXECUTABLE, ) - def test_begin_verl(self): + def test_01_begin_verl(self): # get probe target, so as to get timeout settings BACKBONE = "verl" TEST_TARGET = "tests/bench/benchmark_math/benchmark_math.yaml" From 3c54e8cc15f8e70e5f40cb24abecca89ecde159d Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 25 Dec 2025 03:07:13 +0800 Subject: [PATCH 352/462] feat: add astune config to SwanlabMonitor and update README for benchmarking-docker-image release --- astuner/backbone/trainer_trinity.py | 2 ++ tests/bench/README.md | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/astuner/backbone/trainer_trinity.py b/astuner/backbone/trainer_trinity.py index 09650734..91f6307e 100644 --- a/astuner/backbone/trainer_trinity.py +++ b/astuner/backbone/trainer_trinity.py @@ -305,6 +305,7 @@ def __init__(self, project: str, group: str, name: str, role: str, config) -> No # Determine experiment name exp_name = monitor_args.get("experiment_name") or f"{name}_{role}" self.exp_name = exp_name + astune_config = get_astune_config_from_trinity_side() # Prepare init kwargs, passing only non-None values to respect library defaults init_kwargs = { @@ -317,6 +318,7 @@ def __init__(self, project: str, group: str, name: str, role: str, config) -> No "mode": monitor_args.get("mode") or "cloud", "settings": monitor_args.get("settings"), "id": monitor_args.get("id"), + "config": astune_config, "resume": monitor_args.get("resume"), "reinit": monitor_args.get("reinit"), } diff --git a/tests/bench/README.md b/tests/bench/README.md index 44ebe505..e7ebe1f1 100644 --- a/tests/bench/README.md +++ b/tests/bench/README.md @@ -1,8 +1,8 @@ Note: `tests/bench` source code is for test robot only, therefore `yaml` configurations will contain dataset files stored in benchmarking-docker-image. -To get these dataset files, please refer to `tutorial/*`. +- To get these dataset files, please refer to `tutorial/*`. -To get benchmarking-docker-image, benchmarking-docker-image will be released soon. +- Benchmarking-docker-image for test-robot will be released in 2026 Feb. ## Running Command @@ -12,4 +12,6 @@ python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask. python -m pytest -s tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py + +python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_02_begin_trinity ``` From c2ebb8092bc6c6889bdede5f351814de1d743c23 Mon Sep 17 00:00:00 2001 From: Yorick He Date: Thu, 25 Dec 2025 11:21:45 +0800 Subject: [PATCH 353/462] docs: update data generation documents (#35) * docs: update data generation documents * docs: update data generation documents * refactor: extract data generation config classes to separate module --------- Co-authored-by: yongyi.hyy Co-authored-by: cc --- astuner/data_generator/config.py | 71 ++++++ docs/en/data_generation.md | 366 +++++++++++-------------------- docs/zh/data_generation.md | 362 +++++++++++------------------- 3 files changed, 338 insertions(+), 461 deletions(-) create mode 100644 astuner/data_generator/config.py diff --git a/astuner/data_generator/config.py b/astuner/data_generator/config.py new file mode 100644 index 00000000..45514247 --- /dev/null +++ b/astuner/data_generator/config.py @@ -0,0 +1,71 @@ +from pydantic import BaseModel, Field, field_validator +from typing import List, Optional + +class SamplingParamsConfig(BaseModel): + """Sampling parameters configuration""" + temperature: float = Field(default=0.0, description="Sampling temperature, 0 means greedy decoding") + +class DeduplicationFilterParamsConfig(BaseModel): + """Deduplication filter parameters configuration""" + similarity_threshold: float = Field(default=0.8, description="Similarity threshold. Tasks above this value will be filtered.") + db_path: str = Field(default="./.similarity_db", description="Storage path for the similarity database") + model: str = Field(default="text-embedding-v4", description="Embedding model name") + api_key: Optional[str] = Field(default=None, description="API Key. If None, it is loaded from environment variables.") + base_url: str = Field(default="https://dashscope.aliyuncs.com/compatible-mode/v1", description="Embedding API base URL") + +class TrainingDatasetConfig(BaseModel): + """Training dataset configuration""" + file_path: str = Field(default="", description="Path to the training data file") + +class DeduplicationFilterConfig(BaseModel): + """Deduplication filter configuration""" + enabled: bool = Field(default=True, description="Whether to enable the filter") + params: DeduplicationFilterParamsConfig = Field(default_factory=DeduplicationFilterParamsConfig) + +class DocumentReaderConfig(BaseModel): + """Document reader configuration""" + document_path: List[str] = Field(default=[], description="List of document file paths") + languages: List[str] = Field(default=["eng"], description="List of document languages") + chunk_size: int = Field(default=5120, description="Chunk size") + split_by: str = Field(default="sentence", description="Split method: sentence, paragraph, character") + cache_enabled: bool = Field(default=True, description="Whether to enable caching") + + @field_validator("split_by") + @classmethod + def validate_split_by(cls, v: str) -> str: + allowed = ["sentence", "paragraph", "character"] + if v not in allowed: + raise ValueError(f"split_by must be one of {allowed}, current value: {v}") + return v + +class DatasetFileConfig(BaseModel): + """Dataset file configuration""" + training: TrainingDatasetConfig = Field(default_factory=TrainingDatasetConfig) + +class QueryReaderConfig(BaseModel): + """Query reader configuration""" + type: str = Field(default="jsonl_dataset_file", description="Reader type") + jsonl_dataset_file: DatasetFileConfig = Field(default_factory=DatasetFileConfig) + + @field_validator("type") + @classmethod + def validate_type(cls, v: str) -> str: + allowed = ["jsonl_dataset_file", "env_service", "huggingface_dat_repo"] + if v not in allowed: + raise ValueError(f"type must be one of {allowed}, current value: {v}") + return v + +class DataGenerationConfig(BaseModel): + """Data generation configuration""" + document_reader: DocumentReaderConfig = Field(default_factory=DocumentReaderConfig) + query_reader: QueryReaderConfig = Field(default_factory=QueryReaderConfig) + task_num: int = Field(default=10, description="Number of tasks to generate") + llm_model: str = Field(default="qwen-long", description="LLM model name") + llm_response_length: int = Field(default=8192, description="LLM maximum response length") + num_workers: int = Field(default=32, description="Number of parallel worker threads") + sampling_params: SamplingParamsConfig = Field(default_factory=SamplingParamsConfig) + deduplication_filter: DeduplicationFilterConfig = Field(default_factory=DeduplicationFilterConfig) + +class TaskReaderConfig(BaseModel): + """Task reader configuration""" + data_generation: DataGenerationConfig = Field(default_factory=DataGenerationConfig) \ No newline at end of file diff --git a/docs/en/data_generation.md b/docs/en/data_generation.md index 8ff7eb1b..1103578e 100644 --- a/docs/en/data_generation.md +++ b/docs/en/data_generation.md @@ -1,131 +1,47 @@ # Data Generation ## Introduction -**Data Generation** is a smart data augmentation framework designed to simplify the generation of high-quality training data. Flexible and efficient by design, the framework provides two powerful methods to generate domain-specific queries: +`Data Generation Reader` provides an intelligent data generation method designed to simplify the creation of high-quality training data. The method is flexible and efficient, capable of generating domain-specific tasks based on few-shot examples and optional documents. -+ **Document-based data generation**: Automatically extracts knowledge from documents (PDF, Word, text files) to generate context-relevant queries -+ **Few-shot data generation**: Uses existing queries as references to generate new queries with consistent style and semantic similarity +## Method +`Data Generation Reader` employs a two-stage task generation process: -## Few-shot Data Generation -### Overview -Few-shot Data Generation is a module based on few-shot learning that helps you **automatically generate new queries**: +### Stage 1 (Optional): Document-based Data Generation +This stage is optional. `Document-based Data Generation` generates knowledge-based tasks based on the provided documents. Users can provide one or more documents (supporting formats like PDF, Word, TXT, etc.): -+ Provide some existing queries as reference examples -+ Optionally provide a document as background knowledge -+ The module leverages LLMs to generate new queries with similar style and related semantics - -### Architecture -The module consists of three main components: - -1. **TaskReader**: Parses the user-provided queries -2. **DocReader**: Parses documents (PDF, TXT, Word, etc.) and provides smart caching -3. **TaskAugmentation**: Generates new tasks from the user-provided queries and optional document content - -### Features -**Task augmentation** - -+ ✅ **Smart Imitation**: Generates new queries consistent in style and semantically related to the references. -+ ✅ **Document Knowledge Integration**: Optionally integrates document context to generate high-quality queries that align with the document's theme. -+ ✅ **Traceability**: Automatically records source information for each generated query. - -### 🚀 Quick Start -#### Step 1: Prepare data -**Prepare reference query data:** - -```json -{"main_query": "What is the capital of France?", "answer": "..."} -{"main_query": "How to cook pasta?", "answer": "..."} +```plain +According to the Anti-Money Laundering and Counter-Terrorist Financing Ordinance and related Guideline, banks are required to identify and take reasonable measures to verify the identity of the beneficial owner of corporate customers so that the bank is ... ``` -**Prepare document data** (optional), place your document in the specified directory: +The generator reads the document content and guides the LLM to batch-generate tasks related to the document content: -```bash -mkdir -p dataset/document -cp your-document.pdf dataset/document/ +```json +[ + { + "main_query": "What are the key requirements of Customer Due Diligence in AML procedures?", + "related_doc": "Customer Due Diligence measures should include: (a) identifying the customer and verifying the customer's identity..." + }, + { + "main_query": "How should financial institutions handle Suspicious Transaction Reports?", + "related_doc": "When someone knows or suspects that any property represents the proceeds of an indictable offense..." + } + ... +] ``` -#### Step 2: Create a configuration file -Create a `.yaml` config file. Example (`tests/data_gen.yaml`): - -```yaml -astuner: - data_generation: - # (Optional) Configure how to read the document data - document_reader: - document_path: 'dataset/document/your-document.pdf' - languages: - - eng - # Configure how to read the reference query file - query_reader: - type: dataset_file # read from a local file - dataset_file: - training: - file_path: 'dataset/jsonl/your-queries.jsonl' # path to the reference query data +If documents are provided for data generation, the data generated in this stage will be added to the validation task set for the subsequent training process. - # Configure the LLM for generation - llm_model: qwen-long # Model, e.g., qwen-long - llm_response_length: 8192 - sampling_params: - temperature: 0 -``` +### Stage 2: Few-shot Data Generation +This stage generates the final training tasks. `Few-shot Data Generation` combines a few user-provided tasks with the knowledge-based tasks generated in the first stage, and use the documents as references to generate training tasks. First, the user needs to provide a few task examples: -#### Step 3: Run the generation script -**Option A: Use the test script** - -```bash -cd /path/to/astuner -export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' -export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' -python tests/data_gen.py +```json +{"main_query": "Can banks ask corporate customers to provide information of its ownership?", "answer": "According to the Anti-Money Laundering and ..."} +{"main_query": "Can a bank close my account?", "answer": "Either a customer or a bank may close an account at any time subject to any specific terms and ..."} +... ``` -**Option B: Custom script** - -```python -# generate_tasks.py -import sys -sys.path.insert(0, '/path/to/astuner') -import dotenv -dotenv.load_dotenv() - -from astuner.utils.config_utils import read_astuner_config -from astuner.task_reader import TaskReaderRouterV2 -from astuner.task_reader.document_reader.doc_reader import DocReader -from astuner.data_generator.task_augmentation import TaskAugmentor - -# Load config -config = read_astuner_config('tests/data_gen.yaml') - -# Initialize -task_reader = TaskReaderRouterV2( - reader_type=config.task_reader.data_generation.query_reader.type, - reader_config=config.task_reader.data_generation.query_reader -) -document_reader = DocReader(config) -task_augmentor = TaskAugmentor(config) - -# Load data -original_tasks = task_reader.get_training_tasks() -document = document_reader.get_document() -print(f"Reference query: {len(original_tasks)}.") -print(f"Document loaded: {len(document.content)} characters.\n") - -# Generate new queries -new_tasks = [] -for task in original_tasks[:5]: # Test with 5 queries first, using one query as reference - new_task = task_augmentor.generate_task( - source_task=task, - document=document - ) - new_tasks.append(new_task) +These examples will be merged with the tasks generated in the first stage to form an example task set. The generator will sample from this set to be used as few-shot demonstrations, and combined with relevant documents, guide the LLM to batch-generate training tasks: -print(f"Generated {len(new_tasks)} queries.") -for i, task in enumerate(new_tasks): - print(f"{i+1}. {task.main_query}") - -``` - -### Sample Output ```json [ { @@ -134,154 +50,138 @@ for i, task in enumerate(new_tasks): { "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" } + ... ] ``` +## 🚀 Quick Start +`Data Generation Reader` can load a few user-provided tasks and optional documents (in various formats such as PDF, Word, and TXT) from a local path, then generates tasks and loads them as training tasks. -## Document-based Data Generation -### Overview -**Document-based Data Generation** automatically produces high-quality training tasks based on documents. Leveraging the knowledge augmentation capability of LLMs, this module generates new queries along with their corresponding context. - -### Architecture -The module consists of two main components: - -1. **DocReader**: Parses documents (PDF, TXT, Word, etc.) and provides smart caching. -2. **KnowledgeAugmentor**: Generates new queries from the document content. +### Step 1: Prepare data +Provide a few example tasks: -### Features -**Knowledge augmentation** - -+ ✅ **Comprehensive Coverage**: Extracts factual, conceptual, analytical, and applicational queries from the document. -+ ✅ **Context Alignment**: Each generated query includes a related document context to ensure answer traceability. -+ ✅ **Configurable Output**: You can specify how many queries to generate (currently supports N < 10; if N > 10, please run in batches). +```json +{"main_query": "What is the capital of France?", "answer": "..."} +{"main_query": "How to cook pasta?", "answer": "..."} +``` -### 🚀 Quick Start -#### Step 1: Prepare data -Place your document in the specified directory: +(Optional) Provide documents and place them in the specified directory: ```bash mkdir -p dataset/document cp your-document.pdf dataset/document/ ``` -#### Step 2: Create a configuration file -Create a `.yaml` config file. Example (`tests/data_gen.yaml`): +### Step 2: Generate Training Tasks +#### Method 1: Integrate Data Generation into the Training Pipeline +Copy and modify the key configuration parameters in `astuner/default_config/astune_default.yaml`, and set `astuner.task_reader.type` to `data_generation` to enable this reader. ```yaml -# tests/data_gen.yaml astuner: - data_generation: - document_reader: - document_path: 'dataset/document/your-document.pdf' - languages: ['eng'] - cache_enabled: true - llm_model: qwen-long - knowledge_augmentor: - n: 10 # generate 10 queries + task_reader: + type: data_generation + # when `type == data_generation` + data_generation: + # Document reader configuration + document_reader: + document_path: + - 'dataset/document/your-document1.pdf' + - 'dataset/document/your-document2.pdf' + languages: + - eng + # Task reader (for existing tasks) + query_reader: + type: jsonl_dataset_file + jsonl_dataset_file: + training: + file_path: 'dataset/jsonl/your-queries.jsonl' + # Number of tasks to generate + task_num: 10 + # LLM config + llm_model: qwen-long + llm_response_length: 8192 + num_workers: 32 + sampling_params: + temperature: 0 + # Task filtering config + deduplication_filter: + enabled: true + params: + similarity_threshold: 0.8 + db_path: ./.similarity_db + model: text-embedding-v4 + api_key: null # load from the env + base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 ``` -#### Step 3: Run the Generation Script -**Option A: Use the test script** - -```bash -cd /path/to/astuner -export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' -export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' -python tests/data_gen.py -``` - -**Option B: Custom script** - +#### Method 2: Run the Generation Script ```python -import sys -sys.path.insert(0, '/path/to/astuner') -import dotenv -dotenv.load_dotenv() - -from astuner.utils.config_utils import read_astuner_config -from astuner.task_reader.document_reader.doc_reader import DocReader -from astuner.data_generator.knowledge_augmentation import KnowledgeAugmentor - -# Load config -config = read_astuner_config('tests/data_gen.yaml') - -# Initialize -document_reader = DocReader(config) -knowledge_augmentor = KnowledgeAugmentor(config) - -# Load document (with caching) -document = document_reader.get_document() -print(f"Document loaded: {len(document.content)} characters.") - -# Generate knowledge-based queries -generated_tasks = knowledge_augmentor.generate_task( - document=document -) +from astuner.data_generator.config import * +from astuner.task_reader.data_generator_reader import DataGeneratorTaskReader + +def run(): + config = TaskReaderConfig( + data_generation=DataGenerationConfig( + document_reader=DocumentReaderConfig( + document_path=['dataset/document/your-document1.pdf', 'dataset/document/your-document2.pdf'], + languages=["eng"], + chunk_size=5120, + split_by="sentence", + ), + query_reader=QueryReaderConfig( + type="jsonl_dataset_file", + jsonl_dataset_file=DatasetFileConfig( + training=TrainingDatasetConfig(file_path='dataset/jsonl/your-queries.jsonl') + ), + ), + task_num=50, + llm_model="qwen-long", + num_workers=16, + sampling_params=SamplingParamsConfig(temperature=0.0), + deduplication_filter=DeduplicationFilterConfig( + enabled=True, + params=DeduplicationFilterParamsConfig( + similarity_threshold=0.8, + model="text-embedding-v4", + ), + ), + ) + ) + reader = DataGeneratorTaskReader(reader_config=config) -print(f"Generated {len(generated_tasks)} queries.") -for i, task in enumerate(generated_tasks[:3]): - print(f"{i+1}. {task.main_query}") +run() ``` -### Sample Output +## **Generated Task Examples** +Based on user-provided documents (optional) and a few task examples, the `Data Generation Reader` can batch-generate training tasks: + ```json [ { - "main_query": "What are the key requirements of Customer Due Diligence in AML procedures?", - "related_doc": "Customer Due Diligence measures should include: (a) identifying the customer and verifying the customer's identity..." + "main_query": "Are financial institutions required to verify the source of funds for corporate clients during account opening?" }, { - "main_query": "How should financial institutions handle Suspicious Transaction Reports?", - "related_doc": "When someone knows or suspects that any property represents the proceeds of an indictable offense..." + "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" } + ... ] ``` - -## Detailed Config -### Basic Config (`data_gen.yaml`) -```yaml -astuner: - # Data generator configuration - data_generation: - # Document reader configuration - document_reader: - document_path: 'dataset/document/your-document.pdf' - languages: - - eng - cache_enabled: true - cache_format: json - # Task reader (for existing queries) - query_reader: - type: dataset_file - dataset_file: - training: - file_path: 'dataset/jsonl/your-tasks.jsonl' - - # LLM configuration - llm_model: qwen-long - llm_response_length: 8192 - sampling_params: - temperature: 0 - - # Knowledge augmentation settings - knowledge_augmentor: - n: 10 # number of queries generated from the document -``` - -### Config Options -#### Document Reader Options -| **Option** | **Type** | **Default** | **Description** | -| --- | --- | --- | --- | -| `document_path` | string | Required | Path to the source document | -| `languages` | list | `['eng']` | Languages for document parsing | -| `cache_enabled` | boolean | `true` | Enable/disable caching | - - -#### Knowledge Augmentation Options -| **Option** | **Type** | **Default** | **Description** | -| --- | --- | --- | --- | -| `n` | integer | `10` | Number of queries to generate | -| `llm_model` | string | Required | LLM model for generation | -| `llm_response_length` | integer | `8192` | Maximum response length | -| `sampling_params` | dict | `{}` | LLM sampling parameters | +## Detailed Config Options +| Parameter Path | Type | Default | Required | Description | +| --- | --- | --- | --- | --- | +| `document_reader.document_path` | list[str] | - | ❌ | List of document file paths. Supports PDF, Word, TXT, and more. | +| `document_reader.languages` | list[str] | `['eng']` | ❌ | List of document languages for OCR and text parsing, e.g., `eng` (English), `chs` (Simplified Chinese). | +| `query_reader.type` | str | `jsonl_dataset_file` | ✅ | Reader type. Options: `jsonl_dataset_file`, `env_service`, `huggingface_dat_repo`. | +| `query_reader.jsonl_dataset_file.training.file_path` | str | - | ✅ | Path to the training tasks JSONL file (when `type: jsonl_dataset_file`). | +| `task_num` | int | `10` | ✅ | Number of tasks to generate. The actual number may be reduced by filtering. | +| `llm_model` | str | `qwen-long` | ✅ | LLM model name used for task generation. | +| `llm_response_length` | int | `8192` | ❌ | Maximum number of tokens in the LLM response. | +| `num_workers` | int | `32` | ❌ | Number of parallel worker threads for speeding up task generation. | +| `sampling_params.temperature` | float | `0` | ❌ | Sampling temperature. `0` means greedy decoding (deterministic output); higher values make outputs more random. | +| `deduplication_filter.enabled` | bool | `true` | ❌ | Whether to enable the deduplication filter. | +| `deduplication_filter.params.similarity_threshold` | float | `0.8` | ✅ | Similarity threshold (0–1). Tasks above this threshold will be filtered out. | +| `deduplication_filter.params.db_path` | str | `./.similarity_db` | ❌ | Path to the similarity database used to cache embeddings. | +| `deduplication_filter.params.model` | str | `text-embedding-v4` | ✅ | Embedding model used to compute similarity. | +| `deduplication_filter.params.api_key` | str | `null` | ❌ | API key. If `null`, it will be loaded from the `DASHSCOPE_API_KEY` environment variable. | +| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | ❌ | Base URL for the embedding API. | \ No newline at end of file diff --git a/docs/zh/data_generation.md b/docs/zh/data_generation.md index 4c0dc12a..7b5a0015 100644 --- a/docs/zh/data_generation.md +++ b/docs/zh/data_generation.md @@ -1,132 +1,47 @@ # 数据生成 ## 概述 -`Data Generation`是一个智能化的数据增强框架,旨在简化高质量训练数据的创建过程。框架设计灵活、高效,提供两种强大的方法来生成领域特定的查询(Query): +`Data Generation Reader` 提供了一个智能化的数据生成方法,旨在简化高质量训练数据的创建过程。方法设计灵活、高效,可以基于Few-shot数据与文档(可选)来生成领域特定的任务(Query)。 -+ **基于文档的数据生成**:自动从文档(PDF、Word、文本文件)中提取知识,生成与上下文相关的查询 -+ **Few-shot数据生成**:利用现有查询作为参考,创建风格一致、语义相似的新查询 +## 方法简介 +`Data Generation Reader` 采用两阶段任务生成流程: -## 少样本数据生成 -### 方法简介 -`Few-shot Data Generation`是一个基于 Few-shot Learning 的数据生成模块,它可以帮助你**自动生成新的查询(Query)数据**: +### 第一阶段(可选):基于文档的数据生成 +此阶段为可选步骤。`Document-based Data Generation` 会基于提供的文档内容,生成知识类提问任务。用户可以提供一个或多个文档(支持 PDF、Word、TXT 等格式): -+ 给定一些现有的查询(Query)作为参考示例 -+ 可选地提供一个文档(Document)作为背景知识 -+ 该模块会利用大语言模型(LLM)生成风格相似、语义相关的新查询 - -### 架构 -模块由三个主要组件组成: - -1. **TaskReader**: 解析用户所提供的任务 -2. **DocReader**: 解析文档(PDF、文本、Word等)并提供智能缓存 -3. **TaskAugmentation**: 从用户所给的任务和提供的文档(可选)内容生成新的任务 - -### 核心特性 -**任务增强特性** - -+ ✅ **智能仿写模式**:基于参考查询生成风格一致、语义相关的新查询 -+ ✅ **文档知识融合**:可选地结合文档上下文,生成主题契合的高质量查询 -+ ✅ **可追溯性设计**:每个生成任务自动记录来源信息 - -### 🚀 快速开始 -#### 步骤 1: 准备数据 -准备原始查询数据 - -```json -{"main_query": "What is the capital of France?", "answer": "..."} -{"main_query": "How to cook pasta?", "answer": "..."} +```plain +According to the Anti-Money Laundering and Counter-Terrorist Financing Ordinance and related Guideline, banks are required to identify and take reasonable measures to verify the identity of the beneficial owner of corporate customers so that the bank is ... ``` -准备文档(可选),将文档放置在指定目录: +生成器会读取文档内容,并借助大语言模型批量生成与文档知识相关的提问任务: -```bash -mkdir -p dataset/document -cp your-document.pdf dataset/document/ +```json +[ + { + "main_query": "What are the key requirements of Customer Due Diligence in AML procedures?", + "related_doc": "Customer Due Diligence measures should include: (a) identifying the customer and verifying the customer's identity..." + }, + { + "main_query": "How should financial institutions handle Suspicious Transaction Reports?", + "related_doc": "When someone knows or suspects that any property represents the proceeds of an indictable offense..." + } + ... +] ``` -#### 步骤 2: 编写配置文件 -你需要创建一个 `.yaml` 配置文件,以下是一个配置示例 (`tests/data_gen.yaml`): - -```yaml -astune: - - data_generator: - # (可选) 配置背景知识文档的读取方式 - document_reader: - document_path: 'dataset/document/your-document.pdf' - languages: - - eng - # 配置源任务文件的读取方式 - query_reader: - type: dataset_file # 指定从本地文件读取 - dataset_file: - training: - file_path: 'dataset/jsonl/your-queries.jsonl' # 源任务文件路径 - - # 配置用于生成任务的大语言模型 - llm_model: qwen-long # 使用的模型,例如 qwen-long - llm_response_length: 8192 - sampling_params: - temperature: 0 -``` +若提供文档进行生成数据,该部分生成的数据会补充到后续的训练过程中的验证任务集合。 -#### 步骤 3: 运行生成脚本 -**方式A:使用测试脚本** +### 第二阶段:少样本数据生成 +此阶段会生成最终的训练任务。`Few-shot Data Generation` 将少量用户提供的任务与第一阶段生成的知识类任务的组合,并参考文档内容生成训练任务。首先,用户需要提供少量的任务示例: -```bash -cd /path/to/astune -export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' -export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' -python tests/data_gen.py +```json +{"main_query": "Can banks ask corporate customers to provide information of its ownership?", "answer": "According to the Anti-Money Laundering and ..."} +{"main_query": "Can a bank close my account?", "answer": "Either a customer or a bank may close an account at any time subject to any specific terms and ..."} +... ``` -**方式B:自定义脚本** - -```python -# generate_tasks.py -import sys -sys.path.insert(0, '/path/to/astune') -import dotenv -dotenv.load_dotenv() - -from astune.utils.config_utils import read_astune_config -from astune.task_reader import TaskReaderRouterV2 -from astune.task_reader.document_reader.doc_reader import DocReader -from astune.data_generator.task_augmentation import TaskAugmentor +这些示例将与第一阶段生成的任务合并,构成一个完整的示例任务集合。生成器会从此集合中进行采样,作为少样本(Few-shot)任务演示,并结合相关的文档内容,引导大模型批量生成训练任务: -# 加载配置 -config = read_astune_config('tests/data_gen.yaml') - -# 初始化组件 -task_reader = TaskReaderRouterV2( - reader_type=config.task_reader.data_generation.query_reader.type, - reader_config=config.task_reader.data_generation.query_reader -) -document_reader = DocReader(config) -task_augmentor = TaskAugmentor(config) - -# 加载数据 -original_tasks = task_reader.get_training_tasks() -document = document_reader.get_document() -print(f"原始任务数:{len(original_tasks)}。") -print(f"文档已加载:{len(document.content)} 字符。\n") - -# 生成新任务 -new_tasks = [] -for task in original_tasks[:5]: # 先测试 5 个,每次读取一个query作为参考 - new_task = task_augmentor.generate_task( - source_task=task, - document=document - ) - new_tasks.append(new_task) - -print(f"生成了 {len(new_tasks)} 个新任务:") -for i, task in enumerate(new_tasks): - print(f"{i+1}. {task.main_query}") - -``` - -### 示例输出 ```json [ { @@ -135,147 +50,138 @@ for i, task in enumerate(new_tasks): { "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" } + ... ] ``` -## 基于文档的数据生成 -### 方法简介 -`Document-based Data Generation` 能够基于文档自动生成高质量的训练任务。该模块借助大语言模型(LLM)的知识增强能力,自动生成新的查询(Query)数据及其对应的上下文信息。 - -### 架构 -模块由两个主要组件组成: +## 🚀 快速开始 +`Data Generation Reader` 可以从本地路径读取用户提供的少量任务以及PDF、Word、TXT等多种格式的文档(可选),生成任务并读取为训练任务。 -1. **DocReader**: 解析文档(PDF、TXT、Word等)并提供智能缓存 -2. **KnowledgeAugmentor**: 从文档内容生成新的任务 +### 步骤 1: 准备数据 +提供少量原始任务数据: -### 核心特性 -**知识增强特性** - -+ ✅ **全面覆盖**: 从文档中提取事实性、概念性、分析性和应用性任务 -+ ✅ **上下文关联**: 每个生成任务都包含对应的文档摘录,确保答案可追溯 -+ ✅ **可配置输出**: 可自定义生成任务数量(暂只支持N<10,若N>10,建议分batch跑) +```json +{"main_query": "What is the capital of France?", "answer": "..."} +{"main_query": "How to cook pasta?", "answer": "..."} +``` -### 🚀 快速开始 -#### 步骤 1: 准备数据 -将文档放置在指定目录: +提供文档(可选),将文档放置在指定目录: ```bash mkdir -p dataset/document cp your-document.pdf dataset/document/ ``` -#### 步骤 2: 编写配置文件 -你需要创建一个 `.yaml` 配置文件,以下是一个配置示例 (`tests/data_gen.yaml`): +### 步骤 2: 生成训练任务 +#### 方式1:将生成任务接入训练流程 +拷贝并修改 `astuner/default_config/astune_default.yaml` 中的关键配置参数,将`astuner.task_reader.type` 设置为 `data_generation` 即可启用该 reader。 ```yaml -# tests/data_gen.yaml -astune: - data_generation: - document_reader: - document_path: 'dataset/document/your-document.pdf' - languages: ['eng'] - cache_enabled: true - llm_model: qwen-long - knowledge_augmentor: - n: 10 # 生成10个任务 -``` - -#### 步骤 3: 运行生成脚本 -**方式A:使用测试脚本** - -```bash -cd /path/to/astune -export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' -export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' -python tests/data_gen.py +astuner: + task_reader: + type: data_generation + # when `type == data_generation` + data_generation: + # 文档读取器配置 + document_reader: + document_path: + - 'dataset/document/your-document1.pdf' + - 'dataset/document/your-document2.pdf' + languages: + - eng + # 任务读取器(用于现有任务) + query_reader: + type: jsonl_dataset_file + jsonl_dataset_file: + training: + file_path: 'dataset/jsonl/your-queries.jsonl' + # 生成任务的数量 + task_num: 10 + # LLM配置 + llm_model: qwen-long + llm_response_length: 8192 + num_workers: 32 + sampling_params: + temperature: 0 + # 任务过滤配置 + deduplication_filter: + enabled: true + params: + similarity_threshold: 0.8 + db_path: ./.similarity_db + model: text-embedding-v4 + api_key: null # load from the env + base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 ``` -**方式B:自定义脚本** - +#### 方式2:单独运行生成脚本 ```python -import sys -sys.path.insert(0, '/path/to/astune') -import dotenv -dotenv.load_dotenv() - -from astune.utils.config_utils import read_astune_config -from astune.task_reader.document_reader.doc_reader import DocReader -from astune.data_generator.knowledge_augmentation import KnowledgeAugmentor - -# 加载配置 -config = read_astune_config('tests/data_gen.yaml') - -# 初始化组件 -document_reader = DocReader(config) -knowledge_augmentor = KnowledgeAugmentor(config) - -# 加载文档(带缓存) -document = document_reader.get_document() -print(f"文档已加载:{len(document.content)} 字符") - -# 生成基于知识的任务 -generated_tasks = knowledge_augmentor.generate_task( - document=document -) +from astuner.data_generator.config import * +from astuner.task_reader.data_generator_reader import DataGeneratorTaskReader + +def run(): + config = TaskReaderConfig( + data_generation=DataGenerationConfig( + document_reader=DocumentReaderConfig( + document_path=['dataset/document/your-document1.pdf', 'dataset/document/your-document2.pdf'], + languages=["eng"], + chunk_size=5120, + split_by="sentence", + ), + query_reader=QueryReaderConfig( + type="jsonl_dataset_file", + jsonl_dataset_file=DatasetFileConfig( + training=TrainingDatasetConfig(file_path='dataset/jsonl/your-queries.jsonl') + ), + ), + task_num=50, + llm_model="qwen-long", + num_workers=16, + sampling_params=SamplingParamsConfig(temperature=0.0), + deduplication_filter=DeduplicationFilterConfig( + enabled=True, + params=DeduplicationFilterParamsConfig( + similarity_threshold=0.8, + model="text-embedding-v4", + ), + ), + ) + ) + reader = DataGeneratorTaskReader(reader_config=config) -print(f"生成了 {len(generated_tasks)} 个任务") -for i, task in enumerate(generated_tasks[:3]): - print(f"{i+1}. {task.main_query}") +run() ``` -### 示例输出 +## 生成任务示例 +`Data Generation Reader`基于用户提供的文档(可选)与少量任务示例,即可批量生成训练任务: + ```json [ { - "main_query": "What are the key requirements of Customer Due Diligence in AML procedures?", - "related_doc": "Customer Due Diligence measures should include: (a) identifying the customer and verifying the customer's identity..." + "main_query": "Are financial institutions required to verify the source of funds for corporate clients during account opening?" }, { - "main_query": "How should financial institutions handle Suspicious Transaction Reports?", - "related_doc": "When someone knows or suspects that any property represents the proceeds of an indictable offense..." + "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" } + ... ] ``` - - -## 详细配置 -### 基础配置 (`data_gen.yaml`) -```yaml -astune: - # 数据生成器配置 - data_generation: - # 文档读取器配置 - document_reader: - document_path: 'dataset/document/your-document.pdf' - languages: - - eng - cache_enabled: true - cache_format: json - # 任务读取器(用于现有任务) - query_reader: - type: dataset_file - dataset_file: - training: - file_path: 'dataset/jsonl/your-tasks.jsonl' - - # LLM配置 - llm_model: qwen-long - llm_response_length: 8192 - sampling_params: - temperature: 0 - - # 知识增强设置 - knowledge_augmentor: - n: 10 # 从文档生成的任务数量 -``` - -### 配置选项 -**知识增强器选项** - -| 选项 | 类型 | 默认值 | 描述 | -| --- | --- | --- | --- | -| n | integer | 10 | 生成任务数量 | -| llm_model | string | 必需 | 用于生成的LLM模型 | -| llm_response_length | integer | 8192 | 最大响应长度 | -| sampling_params | dict | {} | LLM采样参数 | +## 详细配置选项 +| 参数路径 | 类型 | 默认值 | 必填 | 说明 | +| --- | --- | --- | --- | --- | +| `document_reader.document_path` | list[str] | - | ❌ | 文档文件路径列表,支持 PDF、Word、TXT 等多种格式 | +| `document_reader.languages` | list[str] | `['eng']` | ❌ | 文档语言列表,用于 OCR 和文本解析,如 `eng`(英语)、`chs`(简体中文) | +| `query_reader.type` | str | `jsonl_dataset_file` | ✅ | 读取器类型,可选:`jsonl_dataset_file`、`env_service`、`huggingface_dat_repo` | +| `query_reader.jsonl_dataset_file.training.file_path` | str | - | ✅ | 训练任务 JSONL 文件路径(当 `type: jsonl_dataset_file` 时) | +| `task_num` | int | `10` | ✅ | 要生成的任务数量,实际数量可能因过滤而减少 | +| `llm_model` | str | `qwen-long` | ✅ | 用于生成任务的 LLM 模型名称 | +| `llm_response_length` | int | `8192` | ❌ | LLM 响应的最大 token 长度 | +| `num_workers` | int | `32` | ❌ | 并行工作线程数,用于多线程加速任务生成 | +| `sampling_params.temperature` | float | `0` | ❌ | 采样温度,0 表示贪婪解码(确定性输出),值越高输出越随机 | +| `deduplication_filter.enabled` | bool | `true` | ❌ | 是否启用去重过滤器 | +| `deduplication_filter.params.similarity_threshold` | float | `0.8` | ✅ | 相似度阈值 (0-1),超过此值的任务会被过滤 | +| `deduplication_filter.params.db_path` | str | `./.similarity_db` | ❌ | 相似度数据库存储路径,用于缓存 embedding | +| `deduplication_filter.params.model` | str | `text-embedding-v4` | ✅ | 用于计算相似度的 embedding 模型 | +| `deduplication_filter.params.api_key` | str | `null` | ❌ | API Key,为 `null` 时从环境变量 `DASHSCOPE_API_KEY` 加载 | +| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | ❌ | Embedding API 的基础 URL | \ No newline at end of file From 1765a3d279ca68dcb98f4ed2c9fa4f5c70a1a93b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 25 Dec 2025 14:48:03 +0800 Subject: [PATCH 354/462] clean and trim code --- .../agentscope_tracker/multiagent_tracking.py | 8 +- .../agentscope_tracker/timeline_merging.py | 19 +- astuner/context_tracker/basic_tracker.py | 297 +++--------------- astuner/task_runner/agentscope_runner.py | 2 +- astuner/tuner.py | 5 +- astuner/utils/launch_utils.py | 4 +- astuner/utils/testing_utils.py | 8 + astuner/workflow.py | 9 +- 8 files changed, 77 insertions(+), 275 deletions(-) diff --git a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py index 4f551f38..9280572d 100644 --- a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -197,7 +197,7 @@ def step_track( token_logprob_arr, loss_mask, lack_normal_eos, - ) = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output, tools=tools) + ) = self.get_token_inc_from_llm_response(input_msg_ref, llm_output, tools=tools) llm_ext_msg.token_arr = precise_manual_token llm_ext_msg.token_logprob_arr = token_logprob_arr llm_ext_msg.lack_normal_eos = lack_normal_eos @@ -348,9 +348,9 @@ def generate_log(self, task_id=None, global_step="NA"): text_arr = [self.tokenizer.decode(t) for t in tracker_tokenized["input_ids"]] input_id_arr = [str(t) for t in tracker_tokenized["input_ids"]] # loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in tracker_tokenized["loss_mask"]] - logprobs = [INVALID_LOG_PROB_VALUE] * len(tracker_tokenized["prompt_ids"]) + tracker_tokenized[ - "response_logprobs" - ] + logprobs = [INVALID_LOG_PROB_VALUE] * len( + tracker_tokenized["prompt_ids"] + ) + tracker_tokenized["response_logprobs"] # Create adjusted color array loss_mask_color_abl_arr = [ ( diff --git a/astuner/context_tracker/agentscope_tracker/timeline_merging.py b/astuner/context_tracker/agentscope_tracker/timeline_merging.py index f4d9ba80..474a5afe 100644 --- a/astuner/context_tracker/agentscope_tracker/timeline_merging.py +++ b/astuner/context_tracker/agentscope_tracker/timeline_merging.py @@ -9,15 +9,19 @@ def is_timeline_mergeable( source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage], debug=False, + compare_level="text", # "text" or "token" ) -> bool: + # compare_level = "text" # relaxed compare with text, more easier to match, at very little cost + # compare_level = "token" # strict compare with token, cause less aggressive merging + can_merge = False - compare_level = "text" # relaxed compare with text, more easier to match, at very little cost if len(source_timeline) >= len(target_timeline): all_msg_match = True for i in range(len(target_timeline)): if compare_level == "text": same = ( - # TODO: does not consider tools, may aggressively merge responses with different tool calls + # TODO: currently does not consider tools, may aggressively merge responses with different tool calls + # TODO: maybe we should give option for user to choose merging behavior source_timeline[i].content_for_future == target_timeline[i].content_for_future ) @@ -31,6 +35,7 @@ def is_timeline_mergeable( if all_msg_match: can_merge = True + # developer only: code below is only for debugging (print a nice comparison table) if debug: debug_listofdict = [] if len(source_timeline) >= len(target_timeline): @@ -62,8 +67,10 @@ def toggle_author_and_mask( source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage], ) -> List[ExtendedMessage]: - # if any message in `target_timeline` is author == 'llm', but same-index message in `source_timeline` is author != 'llm' + # if any message in `target_timeline` is author == 'llm', + # but same-index message in `source_timeline` is author != 'llm' # change source_timeline's message author to 'llm' + # overwrite `token_arr` and `token_logprob_arr` accordingly for i in range(len(target_timeline)): if target_timeline[i].author == "llm" and source_timeline[i].author != "llm": source_timeline[i].author = target_timeline[i].author @@ -76,12 +83,16 @@ def toggle_author_and_mask( def merge_tracker_timelines( timelines: List[List[ExtendedMessage]], ) -> List[List[ExtendedMessage]]: + """Merge multiple timelines by absorbing those that can be merged. + > Input: a list of timelines. (a timeline means: List[ExtendedMessage]) + > Output: a shorter list of timelines after merging + """ absorbed_step_indices = [] reversed_timelines = list(reversed(timelines)) for i in range(len(reversed_timelines)): if i in absorbed_step_indices: continue - # check whether [i, len(reversed_timelines)-1] can be merged + # check whether [i, i+1, ..., ..., len(reversed_timelines)-1] can be merged for j in range(i + 1, len(reversed_timelines)): if j in absorbed_step_indices: continue diff --git a/astuner/context_tracker/basic_tracker.py b/astuner/context_tracker/basic_tracker.py index 29d21a44..e020f5c3 100644 --- a/astuner/context_tracker/basic_tracker.py +++ b/astuner/context_tracker/basic_tracker.py @@ -1,6 +1,6 @@ import copy from collections import defaultdict -from typing import List, Optional, Tuple +from typing import List, Tuple import torch @@ -10,7 +10,6 @@ replace_token_ids, ) from astuner.schema.trajectory import Reward, Sample -from astuner.utils.compute_madness import compute_string_madness from astuner.utils.tokenizer import astune_apply_chat_template @@ -33,175 +32,12 @@ def __init__(self, config, tokenizer, **kwargs): super().__init__(config, tokenizer, **kwargs) self.generation_prompt_token = self.get_generation_prompt_token() - def prepare_previous_context(self, mod="future"): - """ - Prepare the input context for future LLM call. - - Returns: - list: Array of message dictionaries containing role and content_for_future, - formatted for LLM input. - """ - if mod == "future": - message_arr = [ - { - "role": c.role, - "content": c.content_for_future, - "tool_calls": c.tool_calls, - } - for c in self.full_context - ] - elif mod == "raw": - message_arr = [ - { - "role": c.role, - "content": c.content, - "tool_calls": c.tool_calls, - } - for c in self.full_context - ] - else: - raise ValueError( - f"Unknown mod {mod} in prepare_previous_context, only support 'future' and 'raw'" - ) - - # remove tool_calls from messages if empty - for i in range(len(message_arr)): - if not message_arr[i]["tool_calls"]: - message_arr[i].pop("tool_calls") - return message_arr - - def remove_last_context(self): - if len(self.full_context) > 0: - if self.full_context[-1].author != "llm": - self.full_context.pop(-1) - def remove_last_non_llm_msg(self, ext_msg_list: List[ExtendedMessage]): if len(ext_msg_list) > 0: if ext_msg_list[-1].author != "llm": ext_msg_list.pop(-1) return ext_msg_list - @property - def steps(self): - return self.prepare_previous_context(mod="future") - - def prepare_next_llm_context(self): - return self.prepare_previous_context(mod="future") - - def save_init_input( - self, - init_input_arr: list, - add_nothink: bool = False, - tools: List[dict] = [], - ): - """ - Save and process the initial input messages to the context. - - Args: - init_input_arr (list): Array of initial input messages to be processed - Each message should be a dict with 'role' and 'content' - - Note: - - Initializes the context with the provided messages - - Computes token arrays for each message - - Validates that the context is empty before saving - """ - # save basic - assert len(self.full_context) == 0, "full_context should be empty when saving init input" - for index, llm_msg in enumerate(init_input_arr): - if (index == len(init_input_arr) - 1) and add_nothink: - llm_msg["content"] += "\n/no_think" - ext_msg = ExtendedMessage( - author="initialization", - role=llm_msg["role"], - content=llm_msg["content"], - token_generator="manual", - tokenizer=self.tokenizer, - first_message=(index == 0), - ) - self.full_context += [ext_msg] - - # compute token array for each message - token_ids_acc = [] - for llm_msg, ext_msg, index in zip( - init_input_arr, self.full_context, range(len(init_input_arr)) - ): - text_with_chat_template = astune_apply_chat_template( - tokenizer=self.tokenizer, - conversation=init_input_arr[: (index + 1)], - tools=tools, - add_generation_prompt=False, - tokenize=False, - ) - tokenizer_output = self.tokenizer( - text_with_chat_template, return_tensors="pt", padding=False - ) - input_ids = tokenizer_output["input_ids"][0].tolist() - # attention_mask = outputs["attention_mask"][0].tolist() - input_id_increment = input_ids[ - len(token_ids_acc) : - ] # get the new tokens added in this step - overlap_length = 0 - for i in range(len(token_ids_acc)): - if (i < len(token_ids_acc)) and (input_ids[i] == token_ids_acc[i]): - overlap_length += 1 - else: - break - ext_msg._info = f"previous token length: {len(token_ids_acc)}, overlap token length: {(overlap_length)}, increment token length: {len(input_id_increment)}" - ext_msg.token_arr = input_id_increment - token_ids_acc += input_ids - return - - def save_llm_output(self, llm_output, input_msg_ref, auto_register_full_context=True): - """ - Save the output from the LLM to the full context. - - Args: - llm_output (dict): The output from the LLM containing 'role', 'content', and 'tokens' - input_msg_ref: Reference to the input messages for token increment calculation - out_of_full_context: Register in full_context or not - - Note: - - Processes the LLM output and adds it to the conversation history - - Handles token processing and generation prompt management - - Ensures proper tokenization and context maintenance - """ - # save basic - assert isinstance(llm_output, dict) - token_generator = "manual" if "tokens" in llm_output else "auto" - ext_msg = ExtendedMessage( - author="llm", - role=llm_output["role"], - content=llm_output["content"], - token_generator=token_generator, - tokenizer=self.tokenizer, - ) - if auto_register_full_context: - self.full_context += [ext_msg] - if not self.already_mad_flag: - if ( - compute_string_madness( - completion=llm_output["content"], - checklist=self.config.astuner.rollout.compute_madness_checklist, - ) - < 0.0 - ): - self.already_mad_flag = True - - if token_generator == "manual": - ( - precise_manual_token, - token_logprob_arr, - loss_mask, - lack_normal_eos, - ) = self.get_token_inc_from_vllm_response(input_msg_ref, llm_output) - ext_msg.token_arr = precise_manual_token - ext_msg.token_logprob_arr = token_logprob_arr - ext_msg.lack_normal_eos = lack_normal_eos - ext_msg.manual_loss_mask_override = loss_mask - - return ext_msg - def get_inc(self, text_frag_from, text_frag_to): """ Get the incremental token array from text_frag_from to text_frag_to. @@ -225,7 +61,7 @@ def get_inc(self, text_frag_from, text_frag_to): return input_id_increment, msg # generate token - def get_token_inc_from_vllm_response( + def get_token_inc_from_llm_response( self, input_msg_ref, llm_output, tools: List[dict] = [] ) -> Tuple[List[int], List[int], List[int], bool]: llm_output_role_content = { @@ -266,65 +102,6 @@ def get_token_inc_from_vllm_response( ) return final_token_arr, token_logprob_arr, loss_mask, lack_normal_eos - def save_llm_output_do_not_register_full_context(self, llm_output, input_msg_ref): - return BaseContextTracker.save_llm_output( - self, llm_output, input_msg_ref, auto_register_full_context=False - ) - - def save_env_output( - self, - env_output: dict, - input_msg_ref: Optional[List[dict]] = None, - add_nothink=False, - ): - """ - Save and process environment output to the context. - - Args: - env_output (dict): Environment output containing 'content' - input_msg_ref (List[dict], optional): Reference messages for token calculation - - Note: - - Clips environment output if it exceeds max_env_output_length - - Processes the output as a user message in the conversation - - Computes and stores token arrays for the environment response - """ - assert isinstance(env_output, dict) - if ("content" not in env_output) and ("error" in env_output): - env_output["content"] = f"[Error from environment: {env_output['error']}]" - elif ("content" not in env_output) or (not env_output["content"]): - env_output[ - "content" - ] = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." - if add_nothink: - env_output["content"] += " /no_think" - ext_msg = ExtendedMessage( - author="env", - role="user", - content=env_output["content"], - clip=True, - clip_token_limit=self.max_env_output_length, - token_generator="auto", - tokenizer=self.tokenizer, - ) - self.full_context += [ext_msg] - return - - def prepare_world_interaction(self) -> str: - """ - Process the latest model content before environment interaction. - - Returns: - str: Processed content, with code extracted from markdown code blocks if present - or the raw content if no code blocks are found - - Note: - - Extracts Python code from markdown code blocks (```python```) - - Returns the raw content if no valid code blocks are found - """ - latest_content = self.full_context[-1].content - return latest_content - def filter_context_via_author(self, author: str) -> List[ExtendedMessage]: return copy.deepcopy([c for c in self.full_context if c.author == author]) @@ -385,6 +162,40 @@ def filter_context_via_authors_with_limit( ) return filtered_via_authors + def compute_step_level_reward( + self, ext_steps: List[ExtendedMessage], index: int, total_steps: int + ) -> float: + # TODO: support multi-step reward + assert self.reward_structure is not None + + # --------------- global level reward --------------- + global_reward = self.reward_structure.raw_reward + gamma = self.config.astuner.rollout.gamma + step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) + assert ( + gamma == 1.0 + ), "Currently only support gamma == 1.0, we'll support multi-step reward in the future" + + # --------------- compute step level reward --------------- + step_reward = step_reward_base # reward scalar + if self.already_mad_flag: + step_reward = self.config.astuner.rollout.agent_madness_reward + self.reward_structure.madness = -1.0 + + return step_reward + + def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: + result = [] + for ext_msg in ext_msg_array: + d = { + "role": ext_msg.role, + "content": ext_msg.content_for_future, + } + if ext_msg.tool_calls: + d.update({"tool_calls": ext_msg.tool_calls}) + result.append(d) + return result + def group_tokenize(self): sample_arr = [] ext_steps = self.full_context @@ -428,40 +239,6 @@ def group_tokenize_multi_group(self): return sample_arr - def compute_step_level_reward( - self, ext_steps: List[ExtendedMessage], index: int, total_steps: int - ) -> float: - # TODO: support multi-step reward - assert self.reward_structure is not None - - # --------------- global level reward --------------- - global_reward = self.reward_structure.raw_reward - gamma = self.config.astuner.rollout.gamma - step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) - assert ( - gamma == 1.0 - ), "Currently only support gamma == 1.0, we'll support multi-step reward in the future" - - # --------------- compute step level reward --------------- - step_reward = step_reward_base # reward scalar - if self.already_mad_flag: - step_reward = self.config.astuner.rollout.agent_madness_reward - self.reward_structure.madness = -1.0 - - return step_reward - - def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: - result = [] - for ext_msg in ext_msg_array: - d = { - "role": ext_msg.role, - "content": ext_msg.content_for_future, - } - if ext_msg.tool_calls: - d.update({"tool_calls": ext_msg.tool_calls}) - result.append(d) - return result - def tokenize_steps( self, ext_steps: List[ExtendedMessage], index: int, total_steps: int ) -> dict: @@ -659,7 +436,7 @@ def get_generation_prompt_token(self): self.generation_prompt = self.tokenizer.decode(self.generation_prompt_token) return self.generation_prompt_token - def generate_log(self, global_step: str | int = "NA"): + def generate_log(self, task_id=None, global_step: str | int = "NA"): """ Generate log for the context tracker. """ diff --git a/astuner/task_runner/agentscope_runner.py b/astuner/task_runner/agentscope_runner.py index 124ba56f..c411ad52 100644 --- a/astuner/task_runner/agentscope_runner.py +++ b/astuner/task_runner/agentscope_runner.py @@ -8,6 +8,7 @@ from astuner.schema.task import WorkflowTask from astuner.schema.trajectory import Reward from astuner.utils.dynamic_import import dynamic_import + from .base_runner import BaseAgentRunner @@ -72,7 +73,6 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: ) context_tracker.process_reward(reward) # generate token before merging - context_tracker.remove_last_context() context_tracker.task_id = task_id context_tracker.task_tag = task_tag context_tracker.group_merge() diff --git a/astuner/tuner.py b/astuner/tuner.py index db7ac10d..a4e25ea1 100644 --- a/astuner/tuner.py +++ b/astuner/tuner.py @@ -166,9 +166,12 @@ async def __call__( return response_gen def is_trainable(self, target_name) -> bool: - if not self.agentscope_workflow.trainable_targets: + if self.agentscope_workflow.trainable_targets is None: # always assume trainable when user has never changed trainable_targets return True + if not self.agentscope_workflow.trainable_targets: + # always assume trainable when trainable_targets is [] + return True if target_name in self.agentscope_workflow.trainable_targets: return True else: diff --git a/astuner/utils/launch_utils.py b/astuner/utils/launch_utils.py index 6b33c071..c32c98d5 100644 --- a/astuner/utils/launch_utils.py +++ b/astuner/utils/launch_utils.py @@ -133,7 +133,9 @@ def verify_python_env(args): time.sleep(5) raise ImportError(cause + " " + solution) elif args.backbone == "verl": - if not verl.__version__.startswith("0.5.0.post"): + if not verl.__version__.startswith( + "0.5.0.post" + ): # you must install via `pip install -e .[verl]` to get every dependency right cause = "Python environment does not match current backbone 'verl'." solution = "Please `cd /path/to/project/agentscope-tuner` and run `(uv) pip install -e .[verl]` to install the correct environment." print_dict( diff --git a/astuner/utils/testing_utils.py b/astuner/utils/testing_utils.py index 6c30155a..4878d8b5 100644 --- a/astuner/utils/testing_utils.py +++ b/astuner/utils/testing_utils.py @@ -168,6 +168,14 @@ def update_benchmark_status(status, status_detail, append_log="", data_dashboard class BenchmarkProbe(BaseProbe): + """ + A benchmark probe to test reward during training. + Major module input: + - self.reward_expectation: dict, key is step, value is [low, high] expected reward range + - self.reward_expectation_avg_window: int, number of steps to average reward over + - self.expected_train_time: int, expected training time in seconds + """ + def __init__(self): # fmt: off self.expected_train_time = 3600 * 24 # 24 hours diff --git a/astuner/workflow.py b/astuner/workflow.py index 003315ac..70c74d53 100644 --- a/astuner/workflow.py +++ b/astuner/workflow.py @@ -9,11 +9,12 @@ class Workflow(BaseModel): model_config = {"extra": "allow"} name: str = Field(default="default_workflow", description="Name of the workflow.") - trainable_targets: List[str] = Field(default=[], description="List of agents to be fine-tuned.") + trainable_targets: List[str] | None = Field( + default=None, + description="List of agents to be fine-tuned. When None, all agents are trainable.", + ) - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: """Run the workflow on a given task.""" raise NotImplementedError From 4d7bd039338fde54238d9fb17d6a47a12040ef08 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 25 Dec 2025 15:43:00 +0800 Subject: [PATCH 355/462] docs: enhance beast-logger usage instructions --- docs/en/beast_logger.md | 10 +++++++++- tests/bench/README.md | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/en/beast_logger.md b/docs/en/beast_logger.md index 01ac077f..ca6ac5a8 100644 --- a/docs/en/beast_logger.md +++ b/docs/en/beast_logger.md @@ -21,7 +21,15 @@ Here is how to use beast-logger in agentscope-tuner. image -5. Fill the **ABSOLUTE** path of the log files and click `submit`. (Beast-logger recursively scans this path and, where possible, selects the innermost directory containing the fewest files) +5. Fill the **ABSOLUTE** path of the log files and click `submit`. + + > Hint: absolute path is recommended. + > + > However, you can also use relative path, if `beast_logger_go` command is launched at same working dir. + + > Warning: Beast-logger recursively scans this path, + > + > thus, where possible, selects the innermost directory containing the fewest files to read logs faster.
image diff --git a/tests/bench/README.md b/tests/bench/README.md index e7ebe1f1..8f32de51 100644 --- a/tests/bench/README.md +++ b/tests/bench/README.md @@ -14,4 +14,5 @@ python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown. python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_02_begin_trinity +python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_01_begin_verl ``` From e0a3bcfc6ca51647ab2b890751a0111a83c0ede5 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 25 Dec 2025 17:41:56 +0800 Subject: [PATCH 356/462] feat: integrate default configuration for AstunerJob and update mini_test example --- astuner/cli/job.py | 4 +- astuner/default_config/astune_default.py | 84 ++++++++++++++++++++++++ mini_test.py | 4 +- 3 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 astuner/default_config/astune_default.py diff --git a/astuner/cli/job.py b/astuner/cli/job.py index 582fe5b6..e08fc928 100644 --- a/astuner/cli/job.py +++ b/astuner/cli/job.py @@ -22,6 +22,7 @@ get_backbone_target, setup_environment_vars, ) +from astuner.default_config.astune_default import Config from astuner.utils.config_utils import ( expand_astune_hierarchical_config, prepare_experiment_config, @@ -42,7 +43,8 @@ def __init__( algorithm: Optional[str] = None, ) -> None: self.backbone = backbone - self.config = self.build_job_from_yaml(None) + self.config_as_dict: dict = self.build_job_from_yaml(None) + self.config_as_dataclass = Config.update_from_dict_recursive(Config(), self.config_as_dict) self.config["astuner"]["backbone"] = self.backbone self.config["astuner"]["model"]["path"] = model self.config["astuner"]["trainer_common"]["n_gpus_per_node"] = n_gpu diff --git a/astuner/default_config/astune_default.py b/astuner/default_config/astune_default.py new file mode 100644 index 00000000..190c804f --- /dev/null +++ b/astuner/default_config/astune_default.py @@ -0,0 +1,84 @@ +from dataclasses import dataclass, field +from typing import Any, Dict, Optional + + +@dataclass +class AstunerAlgorithm: + adv_estimator: Optional[str] = None + + +@dataclass +class AstunerTrainerCommon: + n_gpus_per_node: Optional[int] = None + algorithm: AstunerAlgorithm = field(default_factory=AstunerAlgorithm) + + +@dataclass +class AstunerModel: + path: Optional[str] = None + + +@dataclass +class AstunerData: + max_prompt_length: Optional[int] = None + max_response_length: Optional[int] = None + train_batch_size: Optional[int] = None + + +@dataclass +class AstunerRollout: + agentscope_workflow: Optional[str] = None + + +@dataclass +class AstunerTaskReader: + type: Optional[str] = None + huggingface_dat_repo: Optional[Dict[str, Any]] = field(default_factory=dict) + + +@dataclass +class AstunerDefaultConfig: + project_name: Optional[str] = None + experiment_name: Optional[str] = None + experiment_dir: Optional[str] = None + backbone: Optional[str] = None + + model: AstunerModel = field(default_factory=AstunerModel) + data: AstunerData = field(default_factory=AstunerData) + rollout: Optional[AstunerRollout] = field(default_factory=AstunerRollout) + trainer_common: AstunerTrainerCommon = field(default_factory=AstunerTrainerCommon) + task_reader: AstunerTaskReader = field(default_factory=AstunerTaskReader) + + +@dataclass +class Config: + astuner: AstunerDefaultConfig = field(default_factory=AstunerDefaultConfig) + + def to_dict(self) -> Dict[str, Any]: + """Convert the dataclass to a dictionary.""" + from dataclasses import asdict + + return asdict(self) + + @staticmethod + def update_from_dict_recursive(config_as_dataclass, config_as_dict: Dict[str, Any]) -> None: + # read and assign + for key in config_as_dict.keys(): + target_value = config_as_dict[key] + if isinstance(target_value, dict): + if hasattr(config_as_dataclass, key): + setattr( + config_as_dataclass, + key, + Config.update_from_dict_recursive( + getattr(config_as_dataclass, key), target_value + ), + ) + else: + setattr(config_as_dataclass, key, target_value) + else: + if hasattr(config_as_dataclass, key): + setattr(config_as_dataclass, key, target_value) + else: + setattr(config_as_dataclass, key, target_value) + return config_as_dataclass diff --git a/mini_test.py b/mini_test.py index 15b9b7a6..0f41301c 100644 --- a/mini_test.py +++ b/mini_test.py @@ -2,11 +2,11 @@ from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" -job = AstunerJob(backbone="trinity", n_gpu=8, algorithm="grpo", model=model_path) +job = AstunerJob(backbone="verl", n_gpu=8, algorithm="grpo", model=model_path) job.set_workflow(MathToolWorkflow, ensure_reward_in_workflow=True) job.set_data(type="hf", dataset_path="openai/gsm8k") # [Optional] job.dump_job_as_yaml('saved_experiments/math.yaml') # Save yaml file for manual adjustment # [Optional] job.load_job_from_yaml('saved_experiments/math.yaml') # Load yaml file from manual adjustment # Equivalent to `astuner --conf ./saved_experiments/math.yaml` in the terminal -tuned_model = job.tune() # +tuned_model = job.tune() From 25de0d2ded061a062df9eac5412a2e44503a90ff Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 26 Dec 2025 01:37:11 +0800 Subject: [PATCH 357/462] feat: update default configurations for AstunerJob and enhance YAML structure --- astuner/cli/job.py | 58 ++- astuner/default_config/astune_default.py | 79 +-- astuner/default_config/astune_default.yaml | 2 +- math1.yaml | 534 +++++++++++++++++++++ 4 files changed, 611 insertions(+), 62 deletions(-) create mode 100644 math1.yaml diff --git a/astuner/cli/job.py b/astuner/cli/job.py index e08fc928..352f976c 100644 --- a/astuner/cli/job.py +++ b/astuner/cli/job.py @@ -11,7 +11,7 @@ import tempfile from datetime import datetime from types import SimpleNamespace -from typing import Any, Callable, Optional, Union +from typing import Any, Callable, Union import ray import yaml @@ -37,46 +37,46 @@ class AstunerJob: def __init__( self, - backbone: Optional[str] = "trinity", - model: Optional[str] = None, - n_gpu: Optional[int] = None, - algorithm: Optional[str] = None, + backbone: str = "trinity", + model: str = "Qwen/Qwen2___5-7B-Instruct", + n_gpu: int = 8, + algorithm: str = "grpo", ) -> None: self.backbone = backbone self.config_as_dict: dict = self.build_job_from_yaml(None) - self.config_as_dataclass = Config.update_from_dict_recursive(Config(), self.config_as_dict) - self.config["astuner"]["backbone"] = self.backbone - self.config["astuner"]["model"]["path"] = model - self.config["astuner"]["trainer_common"]["n_gpus_per_node"] = n_gpu - self.config["astuner"]["trainer_common"]["algorithm"]["adv_estimator"] = algorithm + self.config = Config.update_from_dict_recursive(Config(), self.config_as_dict) + + self.config.astuner.backbone = backbone + self.config.astuner.model.path = model + self.config.astuner.trainer_common.n_gpus_per_node = n_gpu + self.config.astuner.trainer_common.algorithm.adv_estimator = algorithm def build_job_from_yaml(self, yaml_path: str | None) -> dict: self.exp_name = datetime.now().strftime("astuner_job_%Y%m%d_%H%M%S") self.exp_dir_final = "saved_experiments" - self.config = read_astune_hierarchical_config( + self.config_as_dict = read_astune_hierarchical_config( yaml_path, exp_name=self.exp_name, backbone=self.backbone, write_to=None, exp_dir=self.exp_dir_final, ) - self.config = expand_astune_hierarchical_config(self.config, write_to=None) + self.config_as_dict = expand_astune_hierarchical_config(self.config_as_dict, write_to=None) logger.info(f"Built ASTuner job config: {yaml_path}") - return self.config + return self.config_as_dict def dump_job_as_yaml(self, yaml_path: str) -> str: - os.makedirs(os.path.dirname(yaml_path), exist_ok=True) + if os.path.dirname(yaml_path): + os.makedirs(os.path.dirname(yaml_path), exist_ok=True) with open(yaml_path, "w", encoding="utf-8") as f: - yaml.safe_dump(self.config, f, sort_keys=False) + yaml.safe_dump(self.config.to_dict(), f, sort_keys=False) logger.info(f"Saved training config to {yaml_path}") return yaml_path def set_workflow( self, workflow: Union[str, Callable[..., Any]], ensure_reward_in_workflow: bool = False ) -> "AstunerJob": - self.config["astuner"]["rollout"] = { - "agentscope_workflow": cls_to_path(workflow), - } + self.config.astuner.rollout.agentscope_workflow = cls_to_path(workflow) # TODO: validate workflow outputs contain reward # ensure_reward_in_workflow return self @@ -94,14 +94,12 @@ def set_data( # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` if type in {"hf", "huggingface", "huggingface_dat_repo"}: - self.config["astuner"]["task_reader"]["type"] = "huggingface_dat_repo" - self.config["astuner"]["task_reader"]["huggingface_dat_repo"] = { - "dataset_path": dataset_path, - "training_split": training_split, - "validation_split": validation_split, - } + self.config.astuner.task_reader.type = "huggingface_dat_repo" + self.config.astuner.task_reader.huggingface_dat_repo.dataset_path = dataset_path + self.config.astuner.task_reader.huggingface_dat_repo.training_split = training_split + self.config.astuner.task_reader.huggingface_dat_repo.validation_split = validation_split elif type in {"random_dummy", "dummy"}: - self.config["astuner"]["task_reader"]["type"] = "random_dummy" + self.config.astuner.task_reader.type = "random_dummy" else: raise NotImplementedError( f"Please edit yaml to directly set up task reader of type {type}." @@ -110,14 +108,14 @@ def set_data( return self def tune(self, *args, **kwargs) -> "AstunerJob": - ast_cfg = self.config.get("astuner", {}) - if not ast_cfg.get("rollout") or not ast_cfg["rollout"].get("agentscope_workflow"): + ast_cfg = self.config.astuner + if not ast_cfg.rollout or not ast_cfg.rollout.agentscope_workflow: raise ValueError("Workflow must be set via set_workflow before tuning.") - if not ast_cfg.get("task_reader"): + if not ast_cfg.task_reader: raise ValueError("Data source must be set via set_data before tuning.") - backbone = self.config["astuner"]["backbone"] - exp_dir = self.config["astuner"]["experiment_dir"] + backbone = self.config.astuner.backbone + exp_dir = self.config.astuner.experiment_dir with tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".yaml") as temp_yaml: yaml_path = temp_yaml.name diff --git a/astuner/default_config/astune_default.py b/astuner/default_config/astune_default.py index 190c804f..f106481a 100644 --- a/astuner/default_config/astune_default.py +++ b/astuner/default_config/astune_default.py @@ -1,51 +1,58 @@ from dataclasses import dataclass, field -from typing import Any, Dict, Optional +from typing import Any, Dict @dataclass class AstunerAlgorithm: - adv_estimator: Optional[str] = None + adv_estimator: str = "grpo" @dataclass class AstunerTrainerCommon: - n_gpus_per_node: Optional[int] = None + n_gpus_per_node: int = 8 algorithm: AstunerAlgorithm = field(default_factory=AstunerAlgorithm) @dataclass class AstunerModel: - path: Optional[str] = None + path: str = "/path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct" @dataclass class AstunerData: - max_prompt_length: Optional[int] = None - max_response_length: Optional[int] = None - train_batch_size: Optional[int] = None + max_prompt_length: int = 3000 + max_response_length: int = 15000 + train_batch_size: int = 32 @dataclass class AstunerRollout: - agentscope_workflow: Optional[str] = None + agentscope_workflow: str = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow" + + +@dataclass +class HuggingfaceDatRepo: + dataset_path: str = "gsm8k" + training_split: str = "train" + validation_split: str = "validation" @dataclass class AstunerTaskReader: - type: Optional[str] = None - huggingface_dat_repo: Optional[Dict[str, Any]] = field(default_factory=dict) + type: str = "huggingface_dat_repo" + huggingface_dat_repo: HuggingfaceDatRepo = field(default_factory=HuggingfaceDatRepo) @dataclass class AstunerDefaultConfig: - project_name: Optional[str] = None - experiment_name: Optional[str] = None - experiment_dir: Optional[str] = None - backbone: Optional[str] = None + project_name: str = "astune_default_project" + experiment_name: str = "read_yaml_name" + experiment_dir: str = "auto" + backbone: str = "debug" model: AstunerModel = field(default_factory=AstunerModel) data: AstunerData = field(default_factory=AstunerData) - rollout: Optional[AstunerRollout] = field(default_factory=AstunerRollout) + rollout: AstunerRollout = field(default_factory=AstunerRollout) trainer_common: AstunerTrainerCommon = field(default_factory=AstunerTrainerCommon) task_reader: AstunerTaskReader = field(default_factory=AstunerTaskReader) @@ -54,31 +61,41 @@ class AstunerDefaultConfig: class Config: astuner: AstunerDefaultConfig = field(default_factory=AstunerDefaultConfig) - def to_dict(self) -> Dict[str, Any]: - """Convert the dataclass to a dictionary.""" - from dataclasses import asdict + @staticmethod + def _to_dict(obj: Any) -> Any: + """Recursively convert dataclass objects to dictionaries.""" + result = {} + for key, value in obj.__dict__.items(): + if hasattr(value, "__dataclass_fields__"): + result[key] = Config._to_dict(value) + else: + result[key] = value + return result - return asdict(self) + def to_dict(self) -> Dict[str, Any]: + """Convert the dataclass to a dictionary, including extra attributes.""" + return Config._to_dict(self) @staticmethod - def update_from_dict_recursive(config_as_dataclass, config_as_dict: Dict[str, Any]) -> None: + def update_from_dict_recursive(config_as_dataclass, config_as_dict: Dict[str, Any]) -> "Config": # read and assign for key in config_as_dict.keys(): target_value = config_as_dict[key] if isinstance(target_value, dict): if hasattr(config_as_dataclass, key): - setattr( - config_as_dataclass, - key, - Config.update_from_dict_recursive( - getattr(config_as_dataclass, key), target_value - ), - ) + if isinstance(getattr(config_as_dataclass, key), dict): + setattr(config_as_dataclass, key, target_value) + continue + else: + setattr( + config_as_dataclass, + key, + Config.update_from_dict_recursive( + getattr(config_as_dataclass, key), target_value + ), + ) else: setattr(config_as_dataclass, key, target_value) else: - if hasattr(config_as_dataclass, key): - setattr(config_as_dataclass, key, target_value) - else: - setattr(config_as_dataclass, key, target_value) + setattr(config_as_dataclass, key, target_value) return config_as_dataclass diff --git a/astuner/default_config/astune_default.yaml b/astuner/default_config/astune_default.yaml index 673ee6ac..ddaf6391 100644 --- a/astuner/default_config/astune_default.yaml +++ b/astuner/default_config/astune_default.yaml @@ -85,7 +85,7 @@ astuner: task_reader: - type: env_service # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` + type: huggingface_dat_repo # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` # when `type == jsonl_dataset_file` jsonl_dataset_file: training: diff --git a/math1.yaml b/math1.yaml new file mode 100644 index 00000000..d8f6c23c --- /dev/null +++ b/math1.yaml @@ -0,0 +1,534 @@ +astuner: + rollout: + agentscope_workflow: tutorial.example_math_agent.math_agent_simplify->MathToolWorkflow + project_name: astune_default_project + experiment_name: astuner_job_20251226_010400 + experiment_dir: saved_experiments/astuner_job_20251226_010400 + backbone: verl + model: + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + data: + max_prompt_length: 3000 + max_response_length: 15000 + train_batch_size: 32 + task_reader: + type: huggingface_dat_repo + jsonl_dataset_file: + training: + file_path: /path/to/training/data.jsonl + validation: + file_path: /path/to/validation/data.jsonl + env_service: + env_type: appworld + env_url: http://127.0.0.1:8080 + env_action_preference: code + training_split: train + validation_split: dev + huggingface_dat_repo: + dataset_path: openai/gsm8k + training_split: train + validation_split: test + data_generation: + document_reader: + document_path: + - dataset/document/your-document1.pdf + - dataset/document/your-document2.pdf + languages: + - eng + chunk_size: 5120 + split_by: sentence + cache_enabled: true + query_reader: + type: jsonl_dataset_file + jsonl_dataset_file: + training: + file_path: dataset/jsonl/your-queries.jsonl + task_num: 10 + llm_model: qwen-long + llm_response_length: 8192 + num_workers: 32 + sampling_params: + temperature: 0 + deduplication_filter: + enabled: true + params: + similarity_threshold: 0.8 + db_path: ./.similarity_db + model: text-embedding-v4 + api_key: null + base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 + task_judge: + judge_type: customized_protocol + judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + rubrics_auto_grader: + model_name: qwen-max + grader_mode: pointwise + language: en + query_specific_generate_number: 1 + enable_categorization: false + categories_number: 5 + grader_name: auto_grader + query_field: main_query + answer_field: final_answer + reference_field: answer + custom_evaluation_prompt: null + input_data_type: jsonl_dataset_file + jsonl_dataset_file: + training: + file_path: tutorial/example_rm_auto_grader/rubrics_train.jsonl + min_score: 0 + max_score: 1 + debug: + debug_max_parallel: 16 + debug_first_n_tasks: 2 + debug_vllm_port: 18000 + debug_vllm_seed: 12345 + debug_tensor_parallel_size: 4 + trainer_common: + val_before_train: false + val_pass_n: 4 + save_freq: 20 + test_freq: 20 + total_epochs: 50 + nnodes: 1 + n_gpus_per_node: 8 + logger: swanlab + algorithm: + adv_estimator: grpo + use_kl_in_reward: false + mini_batch_num: 1 + fsdp_config: + param_offload: true + optimizer_offload: true + optim: + lr: 1.0e-06 + use_kl_loss: true + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + ulysses_sequence_parallel_size: 1 + checkpoint_base_dir: ./saved_checkpoints + context_tracker: + context_tracker_type: linear + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + max_env_len: 4096 + execute_test: false + execute_testing_lambda: '' +actor_rollout_ref: + actor: + _target_: verl.workers.config.FSDPActorConfig + checkpoint: + _target_: verl.trainer.config.CheckpointConfig + async_save: false + load_contents: + - model + - optimizer + - extra + save_contents: + - model + - optimizer + - extra + clip_ratio: 0.2 + clip_ratio_c: 3.0 + clip_ratio_high: 0.2 + clip_ratio_low: 0.2 + entropy_checkpointing: false + entropy_coeff: 0 + entropy_from_logits_with_chunking: false + fsdp_config: + _target_: verl.workers.config.FSDPEngineConfig + forward_prefetch: false + fsdp_size: -1 + offload_policy: false + optimizer_offload: true + param_offload: true + reshard_after_forward: true + wrap_policy: + min_num_params: 0 + grad_clip: 1.0 + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + loss_agg_mode: seq-mean-token-mean + optim: + _target_: verl.workers.config.FSDPOptimizerConfig + lr: 1.0e-06 + lr_warmup_steps: -1 + lr_warmup_steps_ratio: 0.0 + min_lr_ratio: 0.0 + num_cycles: 0.5 + total_training_steps: -1 + warmup_style: constant + weight_decay: 0.01 + override_ppo_mini_batch_num: 1 + policy_loss: + _target_: verl.workers.config.PolicyLossConfig + clip_cov_lb: 1.0 + clip_cov_ratio: 0.0002 + clip_cov_ub: 5.0 + kl_cov_ratio: 0.0002 + loss_mode: vanilla + ppo_kl_coef: 0.1 + ppo_epochs: 1 + ppo_max_token_len_per_gpu: 13000 + ppo_micro_batch_size: null + ppo_micro_batch_size_per_gpu: 1 + ppo_mini_batch_size: 16 + shuffle: false + strategy: fsdp + ulysses_sequence_parallel_size: 1 + use_dynamic_bsz: true + use_fused_kernels: false + use_kl_loss: true + use_remove_padding: true + use_torch_compile: true + hybrid_engine: true + model: + custom_chat_template: null + enable_activation_offload: false + enable_gradient_checkpointing: true + exclude_modules: null + external_lib: null + fused_kernel_options: + impl_backend: torch + lora_alpha: 16 + lora_rank: 0 + override_config: {} + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + target_modules: all-linear + trust_remote_code: false + use_fused_kernels: false + use_liger: false + use_remove_padding: true + use_shm: false + nccl_timeout: 600 + profiler: + _target_: verl.utils.profiler.ProfilerConfig + all_ranks: false + discrete: false + ranks: [] + ref: + entropy_checkpointing: false + entropy_from_logits_with_chunking: false + fsdp_config: + _target_: verl.workers.config.FSDPEngineConfig + forward_prefetch: false + param_offload: true + reshard_after_forward: true + wrap_policy: + min_num_params: 0 + log_prob_max_token_len_per_gpu: 13000 + log_prob_micro_batch_size: null + log_prob_micro_batch_size_per_gpu: 4 + log_prob_use_dynamic_bsz: true + model: null + strategy: fsdp + ulysses_sequence_parallel_size: 1 + use_dynamic_bsz: true + use_torch_compile: true + rollout: + agent: + agent_loop_config_path: null + custom_async_server: + name: null + path: null + num_workers: 8 + calculate_log_probs: false + cudagraph_capture_sizes: null + custom_dataflow_cls: + name: '' + path: '' + disable_log_stats: true + do_sample: true + dtype: bfloat16 + enable_chunked_prefill: true + enforce_eager: true + engine_kwargs: + sglang: + attention_backend: null + vllm: + disable_mm_preprocessor_cache: false + swap_space: null + free_cache_engine: true + gamma: 1.0 + gpu_memory_utilization: 0.9 + ignore_eos: false + layered_summon: false + load_format: dummy_dtensor + log_prob_max_token_len_per_gpu: 13000 + log_prob_micro_batch_size: null + log_prob_micro_batch_size_per_gpu: 4 + log_prob_use_dynamic_bsz: true + max_env_len: 3000 + max_env_worker: 64 + max_model_len: 13000 + max_num_batched_tokens: 8192 + max_num_seqs: 10 + mode: async + multi_stage_wake_up: false + multi_turn: + enable: true + format: hermes + interaction_config_path: null + max_assistant_turns: null + max_parallel_calls: 1 + max_sample_per_task: 4 + max_steps: 30 + max_tool_response_length: 256 + max_user_turns: null + tokenization_sanity_check_mode: strict + tool_config_path: null + tool_response_truncate_side: middle + use_inference_chat_template: false + n: 1 + name: vllm + ppo_micro_batch_size_per_gpu: 1 + prompt_length: 3000 + response_length: 10000 + skip_dump_dir: /tmp/rollout_dump + skip_rollout: false + temperature: 0.9 + tensor_model_parallel_size: 1 + top_k: -1 + top_p: 1.0 + trace: + backend: null + token2text: false + update_weights_bucket_megabytes: 512 + val_kwargs: + do_sample: false + n: 1 + num_repeat: 1 + temperature: 0.0 + top_k: -1 + top_p: 1.0 +algorithm: + _target_: verl.trainer.config.AlgoConfig + adv_estimator: grpo + gamma: 1.0 + kl_ctrl: + _target_: verl.trainer.config.KLControlConfig + horizon: 10000 + kl_coef: 0.001 + target_kl: 0.1 + type: fixed + kl_penalty: kl + lam: 1.0 + norm_adv_by_std_in_grpo: true + pf_ppo: + reweight_method: pow + weight_pow: 2.0 + use_kl_in_reward: false + use_pf_ppo: false +critic: + _target_: verl.workers.config.FSDPCriticConfig + checkpoint: + _target_: verl.trainer.config.CheckpointConfig + async_save: false + load_contents: + - model + - optimizer + - extra + save_contents: + - model + - optimizer + - extra + cliprange_value: 0.5 + enable: null + forward_max_token_len_per_gpu: 32768 + forward_micro_batch_size: null + forward_micro_batch_size_per_gpu: null + grad_clip: 1.0 + loss_agg_mode: seq-mean-token-mean + model: + _target_: verl.workers.config.FSDPCriticModelCfg + enable_activation_offload: false + enable_gradient_checkpointing: true + external_lib: null + fsdp_config: + _target_: verl.workers.config.FSDPEngineConfig + forward_prefetch: false + fsdp_size: -1 + offload_policy: false + optimizer_offload: false + param_offload: false + reshard_after_forward: true + wrap_policy: + min_num_params: 0 + lora_alpha: 16 + lora_rank: 0 + override_config: {} + path: ~/models/deepseek-llm-7b-chat + target_modules: all-linear + tokenizer_path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + trust_remote_code: false + use_remove_padding: false + use_shm: false + optim: + _target_: verl.workers.config.FSDPOptimizerConfig + lr: 1.0e-05 + lr_warmup_steps: -1 + lr_warmup_steps_ratio: 0.0 + min_lr_ratio: null + total_training_steps: -1 + warmup_style: constant + weight_decay: 0.01 + ppo_epochs: 1 + ppo_max_token_len_per_gpu: 32768 + ppo_micro_batch_size: null + ppo_micro_batch_size_per_gpu: null + ppo_mini_batch_size: 16 + profiler: + _target_: verl.utils.profiler.ProfilerConfig + all_ranks: false + discrete: false + ranks: [] + rollout_n: 1 + shuffle: false + strategy: fsdp + ulysses_sequence_parallel_size: 1 + use_dynamic_bsz: true +custom_reward_function: + name: compute_score + path: null +data: + custom_cls: + name: null + path: null + datagen: + name: null + path: null + dataloader_num_workers: 8 + fast_eval: true + filter_overlong_prompts: true + filter_overlong_prompts_workers: 1 + image_key: images + max_prompt_length: 3000 + max_response_length: 10000 + prompt_key: prompt + return_full_prompt: false + return_multi_modal_inputs: true + return_raw_chat: true + return_raw_input_ids: false + reward_fn_key: data_source + sampler: + class_name: null + class_path: null + shuffle: true + tokenizer: null + train_batch_size: 264 + train_files: ~/data/rlhf/gsm8k/train.parquet + truncation: error + trust_remote_code: false + use_shm: false + val_batch_size: 100000000000 + val_files: ~/data/rlhf/gsm8k/test.parquet + validation_shuffle: false + video_key: videos +ray_init: + num_cpus: null + timeline_json_file: null +reward_model: + enable: false + forward_max_token_len_per_gpu: 32768 + launch_reward_fn_async: false + max_length: null + micro_batch_size: null + micro_batch_size_per_gpu: null + model: + external_lib: null + fsdp_config: + _target_: verl.workers.config.FSDPEngineConfig + forward_prefetch: false + fsdp_size: -1 + param_offload: false + reshard_after_forward: true + wrap_policy: + min_num_params: 0 + input_tokenizer: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: ~/models/FsfairX-LLaMA3-RM-v0.1 + trust_remote_code: false + use_fused_kernels: false + use_remove_padding: false + use_shm: false + profiler: + _target_: verl.utils.profiler.ProfilerConfig + all_ranks: false + discrete: false + ranks: [] + reward_manager: naive + sandbox_fusion: + max_concurrent: 64 + memory_limit_mb: 1024 + url: null + strategy: fsdp + ulysses_sequence_parallel_size: 1 + use_dynamic_bsz: true +trainer: + balance_batch: true + controller_nsight_options: + cuda-graph-trace: graph + cuda-memory-usage: 'true' + trace: cuda,nvtx,cublas,ucx + critic_warmup: 0 + default_hdfs_dir: null + checkpoint_base_dir: ./saved_checkpoints + default_local_dir: ${trainer.checkpoint_base_dir}/${trainer.project_name}/${trainer.experiment_name} + del_local_ckpt_after_load: false + device: cuda + esi_redundant_time: 0 + experiment_name: read_yaml_name + hfmodelpath: '' + log_val_generations: 0 + logger: + - console + - swanlab + max_actor_ckpt_to_keep: null + max_critic_ckpt_to_keep: null + n_gpus_per_node: 8 + nnodes: 1 + npu_profile: + options: + analysis: true + level: level1 + record_shapes: false + roles: + - all + save_path: ./profiler_data + with_cpu: true + with_memory: false + with_module: false + with_npu: true + with_stack: false + profile_continuous_steps: false + profile_steps: null + project_name: project_name_placeholder + ray_wait_register_center_timeout: 300 + resume_from_path: null + resume_mode: auto + rollout_data_dir: null + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + total_training_steps: null + use_legacy_worker_impl: auto + val_before_train: false + val_only: false + val_pass_n: 4 + validation_data_dir: null + worker_nsight_options: + capture-range: cudaProfilerApi + capture-range-end: null + cuda-graph-trace: graph + cuda-memory-usage: 'true' + kill: none + trace: cuda,nvtx,cublas,ucx +defaults: +- verl_default +- astune_default +- _self_ +hydra: + searchpath: + - file://astuner/default_config + - file://astuner/default_config/verl From e6332aff8bbd4d8244f37625c6d1b052068d7c5e Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 26 Dec 2025 02:02:01 +0800 Subject: [PATCH 358/462] rename root --- README.md | 4 +- agentscope_tuner/__init__.py | 14 + .../backbone/__init__.py | 2 +- .../backbone/main_trinity.py | 5 +- .../backbone/main_verl.py | 13 +- .../backbone/main_vllm.py | 20 +- .../backbone/trainer_trinity.py | 19 +- .../backbone/trainer_verl.py | 14 +- .../backbone/warm_up.py | 2 +- {astuner => agentscope_tuner}/cli/__init__.py | 0 {astuner => agentscope_tuner}/cli/job.py | 12 +- .../context_tracker/__init__.py | 0 .../agentscope_tracker/multiagent_tracking.py | 17 +- .../agentscope_tracker/timeline_merging.py | 2 +- .../context_tracker/base_tracker.py | 4 +- .../context_tracker/basic_tracker.py | 6 +- .../data_generator/__init__.py | 0 .../data_generator/base_data_generator.py | 6 +- .../data_generator/config.py | 56 +- .../data_generator/knowledge_augmentation.py | 6 +- .../data_generator/task_augmentation.py | 6 +- .../default_config/README.md | 0 .../default_config/astune_default.py | 0 .../default_config/astune_default.yaml | 2 +- .../default_config/trinity/README.md | 0 .../default_config/trinity/README_ZH.md | 0 .../config_auto_convertion_trinity.jsonc | 0 .../trinity/trinity_default.yaml | 0 .../trinity/trinity_launch.yaml | 0 .../verl/config_auto_convertion_verl.jsonc | 0 .../default_config/verl/verl_default.yaml | 0 .../schema/__init__.py | 0 .../schema/document.py | 0 .../schema/extended_msg.py | 2 +- .../schema/logprob.py | 0 {astuner => agentscope_tuner}/schema/task.py | 0 .../schema/trajectory.py | 0 .../task_judge/base_judge.py | 2 +- .../task_judge/env_service_as_judge.py | 4 +- .../task_judge/rm_auto_grader_judge.py | 6 +- .../task_reader/__init__.py | 14 +- .../task_reader/data_generator_reader.py | 28 +- .../task_reader/document_reader/doc_reader.py | 6 +- .../document_reader/document_reader_base.py | 2 +- .../task_reader/env_service_reader.py | 6 +- .../task_reader/hf_dataset_reader.py | 4 +- .../task_reader/jsonl_reader.py | 4 +- .../task_reader/task_reader_base.py | 2 +- .../task_reader/tracing_reader/__init__.py | 10 +- .../task_reader/tracing_reader/connector.py | 2 +- .../tracing_reader/filters/__init__.py | 0 .../tracing_reader/filters/base.py | 6 +- .../filters/deduplication_filter.py | 5 +- .../tracing_reader/filters/factory.py | 2 +- .../filters/llm_evaluate_filter.py | 30 +- .../task_reader/tracing_reader/llm_client.py | 2 - .../task_rollout/__init__.py | 0 .../task_rollout/async_llm_bridge.py | 10 +- .../task_rollout/dashscope_llm_bridge.py | 0 .../task_rollout/native_parallel_worker.py | 35 +- .../task_rollout/resource_keeper.py | 12 +- .../task_rollout/single_worker.py | 16 +- .../task_runner/__init__.py | 2 +- .../task_runner/agentscope_runner.py | 15 +- .../task_runner/base_runner.py | 10 +- {astuner => agentscope_tuner}/tuner.py | 6 +- .../utils/__init__.py | 0 .../utils/async_utils.py | 0 .../utils/cleaner.py | 0 .../utils/color_hsl.py | 0 .../utils/compute_madness.py | 2 - .../utils/config_computer.py | 0 .../utils/config_utils.py | 14 +- .../utils/core_env_vars.py | 2 +- .../utils/dynamic_import.py | 0 .../utils/embedding_client.py | 0 .../utils/env_service_client/__init__.py | 0 .../utils/env_service_client/env_client_ng.py | 0 .../utils/launch_utils.py | 12 +- .../utils/message_utils.py | 0 .../utils/process_dataset.py | 0 {astuner => agentscope_tuner}/utils/pty.py | 2 +- {astuner => agentscope_tuner}/utils/retry.py | 2 +- .../utils/robust_dashscope.py | 0 {astuner => agentscope_tuner}/utils/sample.py | 0 .../utils/smart_daemon.py | 2 +- .../utils/testing_utils.py | 4 +- .../utils/tokenizer.py | 0 {astuner => agentscope_tuner}/workflow.py | 4 +- astuner/__init__.py | 14 - astuner/cli/launcher.py | 326 ----------- docs/en/configuration.md | 4 +- docs/en/data_generation.md | 12 +- docs/en/example_app_world.md | 2 +- docs/en/quickstart.md | 2 +- docs/en/task_judger.md | 12 +- docs/en/tune_your_first_agent.md | 8 +- docs/zh/configuration.md | 4 +- docs/zh/data_generation.md | 6 +- docs/zh/example_app_world.md | 2 +- docs/zh/quickstart.md | 2 +- docs/zh/task_judger.md | 12 +- docs/zh/tune_your_first_agent.md | 8 +- math1.yaml | 534 ------------------ mini_test.py | 2 +- pyproject.toml | 2 +- pyrightconfig.json | 2 +- .../benchmark_appworld/benchmark_appworld.py | 2 +- .../benchmark_appworld.yaml | 8 +- .../benchmark_appworld_2nodes.yaml | 8 +- .../execute_benchmark_appworld.py | 3 +- tests/bench/benchmark_base.py | 11 +- .../benchmark_countdown.py | 2 +- .../benchmark_countdown.yaml | 6 +- .../benchmark_frozenlake.py | 2 +- .../benchmark_frozenlake.yaml | 6 +- .../benchmark_learn2ask.py | 2 +- .../benchmark_learn2ask.yaml | 6 +- tests/bench/benchmark_math/benchmark_math.py | 2 +- .../bench/benchmark_math/benchmark_math.yaml | 6 +- tests/config_test.py | 6 +- tests/data_gen.py | 10 +- tests/test_benchmark_report.py | 2 +- tests/test_compute_madness.py | 16 +- tests/test_dynamic_import.py | 2 +- tests/test_tracing_reader.py | 6 +- tutorial/example_appworld/appworld.md | 4 +- tutorial/example_appworld/appworld.py | 6 +- tutorial/example_appworld/appworld.yaml | 8 +- tutorial/example_countdown/countdown.py | 10 +- tutorial/example_countdown/countdown.yaml | 6 +- .../countdown_answer_as_judge.py | 4 +- .../example_feedback_tracing.yaml | 6 +- tutorial/example_feedback_tracing/train.py | 6 +- tutorial/example_frozenlake/frozenlake.py | 6 +- .../example_frozenlake/frozenlake_easy.yaml | 6 +- .../example_frozenlake/frozenlake_hard.yaml | 6 +- tutorial/example_learn2ask/learn2ask.py | 39 +- tutorial/example_learn2ask/learn2ask.yaml | 10 +- tutorial/example_math_agent/math_agent.md | 2 +- tutorial/example_math_agent/math_agent.py | 6 +- tutorial/example_math_agent/math_agent.yaml | 6 +- .../example_math_agent/math_agent_simplify.py | 6 +- .../math_answer_as_judge.py | 6 +- .../example_rm_auto_grader/auto_grader.md | 2 +- .../auto_grader_example.py | 6 +- tutorial/example_rubrics_judge/math_agent.md | 2 +- tutorial/example_rubrics_judge/math_agent.py | 6 +- tutorial/example_rubrics_judge/r_judge.yaml | 6 +- tutorial/example_werewolves/start.py | 6 +- tutorial/example_werewolves/werewolves.md | 2 +- tutorial/example_werewolves/werewolves.yaml | 6 +- 152 files changed, 472 insertions(+), 1264 deletions(-) create mode 100644 agentscope_tuner/__init__.py rename {astuner => agentscope_tuner}/backbone/__init__.py (83%) rename {astuner => agentscope_tuner}/backbone/main_trinity.py (89%) rename {astuner => agentscope_tuner}/backbone/main_verl.py (96%) rename {astuner => agentscope_tuner}/backbone/main_vllm.py (93%) rename {astuner => agentscope_tuner}/backbone/trainer_trinity.py (95%) rename {astuner => agentscope_tuner}/backbone/trainer_verl.py (98%) rename {astuner => agentscope_tuner}/backbone/warm_up.py (95%) rename {astuner => agentscope_tuner}/cli/__init__.py (100%) rename {astuner => agentscope_tuner}/cli/job.py (94%) rename {astuner => agentscope_tuner}/context_tracker/__init__.py (100%) rename {astuner => agentscope_tuner}/context_tracker/agentscope_tracker/multiagent_tracking.py (97%) rename {astuner => agentscope_tuner}/context_tracker/agentscope_tracker/timeline_merging.py (98%) rename {astuner => agentscope_tuner}/context_tracker/base_tracker.py (98%) rename {astuner => agentscope_tuner}/context_tracker/basic_tracker.py (98%) rename {astuner => agentscope_tuner}/data_generator/__init__.py (100%) rename {astuner => agentscope_tuner}/data_generator/base_data_generator.py (92%) rename {astuner => agentscope_tuner}/data_generator/config.py (76%) rename {astuner => agentscope_tuner}/data_generator/knowledge_augmentation.py (97%) rename {astuner => agentscope_tuner}/data_generator/task_augmentation.py (97%) rename {astuner => agentscope_tuner}/default_config/README.md (100%) rename {astuner => agentscope_tuner}/default_config/astune_default.py (100%) rename {astuner => agentscope_tuner}/default_config/astune_default.yaml (98%) rename {astuner => agentscope_tuner}/default_config/trinity/README.md (100%) rename {astuner => agentscope_tuner}/default_config/trinity/README_ZH.md (100%) rename {astuner => agentscope_tuner}/default_config/trinity/config_auto_convertion_trinity.jsonc (100%) rename {astuner => agentscope_tuner}/default_config/trinity/trinity_default.yaml (100%) rename {astuner => agentscope_tuner}/default_config/trinity/trinity_launch.yaml (100%) rename {astuner => agentscope_tuner}/default_config/verl/config_auto_convertion_verl.jsonc (100%) rename {astuner => agentscope_tuner}/default_config/verl/verl_default.yaml (100%) rename {astuner => agentscope_tuner}/schema/__init__.py (100%) rename {astuner => agentscope_tuner}/schema/document.py (100%) rename {astuner => agentscope_tuner}/schema/extended_msg.py (99%) rename {astuner => agentscope_tuner}/schema/logprob.py (100%) rename {astuner => agentscope_tuner}/schema/task.py (100%) rename {astuner => agentscope_tuner}/schema/trajectory.py (100%) rename {astuner => agentscope_tuner}/task_judge/base_judge.py (76%) rename {astuner => agentscope_tuner}/task_judge/env_service_as_judge.py (82%) rename {astuner => agentscope_tuner}/task_judge/rm_auto_grader_judge.py (98%) rename {astuner => agentscope_tuner}/task_reader/__init__.py (86%) rename {astuner => agentscope_tuner}/task_reader/data_generator_reader.py (94%) rename {astuner => agentscope_tuner}/task_reader/document_reader/doc_reader.py (98%) rename {astuner => agentscope_tuner}/task_reader/document_reader/document_reader_base.py (79%) rename {astuner => agentscope_tuner}/task_reader/env_service_reader.py (86%) rename {astuner => agentscope_tuner}/task_reader/hf_dataset_reader.py (95%) rename {astuner => agentscope_tuner}/task_reader/jsonl_reader.py (94%) rename {astuner => agentscope_tuner}/task_reader/task_reader_base.py (86%) rename {astuner => agentscope_tuner}/task_reader/tracing_reader/__init__.py (92%) rename {astuner => agentscope_tuner}/task_reader/tracing_reader/connector.py (99%) rename {astuner => agentscope_tuner}/task_reader/tracing_reader/filters/__init__.py (100%) rename {astuner => agentscope_tuner}/task_reader/tracing_reader/filters/base.py (96%) rename {astuner => agentscope_tuner}/task_reader/tracing_reader/filters/deduplication_filter.py (90%) rename {astuner => agentscope_tuner}/task_reader/tracing_reader/filters/factory.py (100%) rename {astuner => agentscope_tuner}/task_reader/tracing_reader/filters/llm_evaluate_filter.py (83%) rename {astuner => agentscope_tuner}/task_reader/tracing_reader/llm_client.py (99%) rename {astuner => agentscope_tuner}/task_rollout/__init__.py (100%) rename {astuner => agentscope_tuner}/task_rollout/async_llm_bridge.py (97%) rename {astuner => agentscope_tuner}/task_rollout/dashscope_llm_bridge.py (100%) rename {astuner => agentscope_tuner}/task_rollout/native_parallel_worker.py (96%) rename {astuner => agentscope_tuner}/task_rollout/resource_keeper.py (95%) rename {astuner => agentscope_tuner}/task_rollout/single_worker.py (88%) rename {astuner => agentscope_tuner}/task_runner/__init__.py (64%) rename {astuner => agentscope_tuner}/task_runner/agentscope_runner.py (85%) rename {astuner => agentscope_tuner}/task_runner/base_runner.py (84%) rename {astuner => agentscope_tuner}/tuner.py (97%) rename {astuner => agentscope_tuner}/utils/__init__.py (100%) rename {astuner => agentscope_tuner}/utils/async_utils.py (100%) rename {astuner => agentscope_tuner}/utils/cleaner.py (100%) rename {astuner => agentscope_tuner}/utils/color_hsl.py (100%) rename {astuner => agentscope_tuner}/utils/compute_madness.py (99%) rename {astuner => agentscope_tuner}/utils/config_computer.py (100%) rename {astuner => agentscope_tuner}/utils/config_utils.py (95%) rename {astuner => agentscope_tuner}/utils/core_env_vars.py (95%) rename {astuner => agentscope_tuner}/utils/dynamic_import.py (100%) rename {astuner => agentscope_tuner}/utils/embedding_client.py (100%) rename {astuner => agentscope_tuner}/utils/env_service_client/__init__.py (100%) rename {astuner => agentscope_tuner}/utils/env_service_client/env_client_ng.py (100%) rename {astuner => agentscope_tuner}/utils/launch_utils.py (93%) rename {astuner => agentscope_tuner}/utils/message_utils.py (100%) rename {astuner => agentscope_tuner}/utils/process_dataset.py (100%) rename {astuner => agentscope_tuner}/utils/pty.py (98%) rename {astuner => agentscope_tuner}/utils/retry.py (95%) rename {astuner => agentscope_tuner}/utils/robust_dashscope.py (100%) rename {astuner => agentscope_tuner}/utils/sample.py (100%) rename {astuner => agentscope_tuner}/utils/smart_daemon.py (99%) rename {astuner => agentscope_tuner}/utils/testing_utils.py (98%) rename {astuner => agentscope_tuner}/utils/tokenizer.py (100%) rename {astuner => agentscope_tuner}/workflow.py (97%) delete mode 100644 astuner/__init__.py delete mode 100644 astuner/cli/launcher.py delete mode 100644 math1.yaml diff --git a/README.md b/README.md index bffef46f..59ace986 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Let's begin with the simplest example: a math agent with a tool call. - First, please check out the [installation guide](docs/en/installation.md) to set up the training environment. - Then, tune your first model using the minimum example below (suppose you have written an Agent called `MathToolWorkflow`). ```python - from astuner import AstunerJob + from agentscope_tuner import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) @@ -51,7 +51,7 @@ For advanced researchers, ASTuner also provides high-resolution logging and debu ### Getting Started: Installation -There are many options to install ASTuner. Please refer to [`installation.md`](docs/en/installation.md) for detailed guidelines. Here we demonstrate how to install ASTuner using uv. +There are many options to install AgentScope-Tuner (ASTuner). Please refer to [`installation.md`](docs/en/installation.md) for detailed guidelines. Here we demonstrate how to install ASTuner using uv. 1. Clone the Repository. Clone the AgentScope Tuner repository from GitHub and navigate into the project directory: diff --git a/agentscope_tuner/__init__.py b/agentscope_tuner/__init__.py new file mode 100644 index 00000000..6541160d --- /dev/null +++ b/agentscope_tuner/__init__.py @@ -0,0 +1,14 @@ +from agentscope_tuner.cli.job import AstunerJob +from agentscope_tuner.schema.task import WorkflowOutput, WorkflowTask +from agentscope_tuner.tuner import ModelTuner +from agentscope_tuner.workflow import Workflow + +__all__ = [ + "Workflow", + "WorkflowTask", + "WorkflowOutput", + "ModelTuner", + "AstunerJob", +] + +__version__ = "0.1.0" diff --git a/astuner/backbone/__init__.py b/agentscope_tuner/backbone/__init__.py similarity index 83% rename from astuner/backbone/__init__.py rename to agentscope_tuner/backbone/__init__.py index 10e6e1de..30ae802c 100644 --- a/astuner/backbone/__init__.py +++ b/agentscope_tuner/backbone/__init__.py @@ -1,7 +1,7 @@ from loguru import logger try: - from astuner.backbone.trainer_trinity import ( + from agentscope_tuner.backbone.trainer_trinity import ( ASTunerTaskReader, ASTunerWorkflowWrap, TrinityRolloutManager, diff --git a/astuner/backbone/main_trinity.py b/agentscope_tuner/backbone/main_trinity.py similarity index 89% rename from astuner/backbone/main_trinity.py rename to agentscope_tuner/backbone/main_trinity.py index 0d542308..08c105ae 100644 --- a/astuner/backbone/main_trinity.py +++ b/agentscope_tuner/backbone/main_trinity.py @@ -4,8 +4,9 @@ from trinity.explorer.explorer import Explorer from trinity.trainer.trainer import Trainer -from astuner.utils.core_env_vars import get_runtime_env -from astuner.utils.launch_utils import set_loguru_default_color +from agentscope_tuner.utils.core_env_vars import get_runtime_env +from agentscope_tuner.utils.launch_utils import set_loguru_default_color + set_loguru_default_color() diff --git a/astuner/backbone/main_verl.py b/agentscope_tuner/backbone/main_verl.py similarity index 96% rename from astuner/backbone/main_verl.py rename to agentscope_tuner/backbone/main_verl.py index a4825853..fb5367cc 100644 --- a/astuner/backbone/main_verl.py +++ b/agentscope_tuner/backbone/main_verl.py @@ -26,8 +26,8 @@ from verl.trainer.ppo.reward import load_reward_manager from verl.utils.device import is_cuda_available -from astuner.utils.core_env_vars import get_runtime_env -from astuner.utils.launch_utils import set_loguru_default_color +from agentscope_tuner.utils.core_env_vars import get_runtime_env +from agentscope_tuner.utils.launch_utils import set_loguru_default_color set_loguru_default_color() @@ -231,8 +231,11 @@ def run(self, config): from verl.utils.dataset.rl_dataset import collate_fn # Create training and validation datasets. - from astuner.task_reader import RouterTaskReader, task_to_standard_dataset - from astuner.utils.process_dataset import create_rl_sampler + from agentscope_tuner.task_reader import ( + RouterTaskReader, + task_to_standard_dataset, + ) + from agentscope_tuner.utils.process_dataset import create_rl_sampler task_reader = RouterTaskReader( config.astuner.task_reader.type, @@ -242,7 +245,7 @@ def run(self, config): train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from astuner.backbone.trainer_verl import ASTunerRayPPOTrainer + from agentscope_tuner.backbone.trainer_verl import ASTunerRayPPOTrainer # Initialize the PPO trainer. trainer = ASTunerRayPPOTrainer( diff --git a/astuner/backbone/main_vllm.py b/agentscope_tuner/backbone/main_vllm.py similarity index 93% rename from astuner/backbone/main_vllm.py rename to agentscope_tuner/backbone/main_vllm.py index c296e775..112c16f8 100644 --- a/astuner/backbone/main_vllm.py +++ b/agentscope_tuner/backbone/main_vllm.py @@ -1,15 +1,17 @@ -import atexit import os import sys -import hydra - from types import SimpleNamespace + +import hydra from openai import OpenAI -from astuner.backbone.warm_up import warm_up_process -from astuner.task_rollout.native_parallel_worker import VerlRolloutManager -from astuner.utils.launch_utils import set_loguru_default_color + +from agentscope_tuner.backbone.warm_up import warm_up_process +from agentscope_tuner.task_rollout.native_parallel_worker import VerlRolloutManager +from agentscope_tuner.utils.launch_utils import set_loguru_default_color + set_loguru_default_color() + class TokenAndProb: def __init__(self, t): # ChatCompletionTokenLogprob(token='token_id:73594', bytes=[96, 96, 96], logprob=-1.9073468138230965e-06, top_logprobs=[]) @@ -100,7 +102,7 @@ def run(config): tokenizer=async_rollout_manager.tokenizer, ) - from astuner.task_reader import RouterTaskReader + from agentscope_tuner.task_reader import RouterTaskReader task_reader = RouterTaskReader( config.astuner.task_reader.type, @@ -116,7 +118,7 @@ def run(config): @hydra.main( - config_path="astuner/default_config", + config_path="agentscope_tuner/default_config", config_name="astune_default", version_base=None, ) @@ -129,7 +131,7 @@ def main(config): def companion_launch(): import torch - from astuner.utils.smart_daemon import LaunchCommandWhenAbsent + from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent print("Launching companion process for async LLM server...") model_path = config.astuner.model.path diff --git a/astuner/backbone/trainer_trinity.py b/agentscope_tuner/backbone/trainer_trinity.py similarity index 95% rename from astuner/backbone/trainer_trinity.py rename to agentscope_tuner/backbone/trainer_trinity.py index 91f6307e..dae35bf3 100644 --- a/astuner/backbone/trainer_trinity.py +++ b/agentscope_tuner/backbone/trainer_trinity.py @@ -18,14 +18,14 @@ from trinity.utils.log import get_logger from trinity.utils.monitor import MONITOR, Monitor -from astuner.backbone.warm_up import warm_up_process -from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from agentscope_tuner.backbone.warm_up import warm_up_process +from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from astuner.schema.trajectory import Sample -from astuner.task_rollout.native_parallel_worker import DynamicRolloutManager -from astuner.utils.config_utils import read_astune_config_with_cache -from astuner.utils.testing_utils import _test_if_test_mode +from agentscope_tuner.schema.trajectory import Sample +from agentscope_tuner.task_rollout.native_parallel_worker import DynamicRolloutManager +from agentscope_tuner.utils.config_utils import read_astune_config_with_cache +from agentscope_tuner.utils.testing_utils import _test_if_test_mode def get_astune_config_from_trinity_side(): @@ -64,7 +64,7 @@ def __init__( ) def convert_task(self, task: TrinityTask): - from astuner.schema.task import Task + from agentscope_tuner.schema.task import Task d = {} for vip_key in ["main_query", "task_id", "env_type", "metadata", "init_messages"]: @@ -201,7 +201,10 @@ def __init__(self, config): astune_config = get_astune_config_from_trinity_side() - from astuner.task_reader import RouterTaskReader, task_to_standard_dataset + from agentscope_tuner.task_reader import ( + RouterTaskReader, + task_to_standard_dataset, + ) task_reader = RouterTaskReader( astune_config.astuner.task_reader.type, diff --git a/astuner/backbone/trainer_verl.py b/agentscope_tuner/backbone/trainer_verl.py similarity index 98% rename from astuner/backbone/trainer_verl.py rename to agentscope_tuner/backbone/trainer_verl.py index 2e7ff7bc..c242cbd4 100644 --- a/astuner/backbone/trainer_verl.py +++ b/agentscope_tuner/backbone/trainer_verl.py @@ -49,10 +49,10 @@ from verl.utils.debug import marked_timer from verl.utils.metric import reduce_metrics -from astuner.backbone.warm_up import warm_up_process -from astuner.context_tracker.basic_tracker import BaseContextTracker -from astuner.schema.task import Task -from astuner.task_rollout.native_parallel_worker import VerlRolloutManager +from agentscope_tuner.backbone.warm_up import warm_up_process +from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_rollout.native_parallel_worker import VerlRolloutManager def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | torch.Tensor: @@ -603,7 +603,9 @@ def fit(self): # noqa: C901 if self.config.astuner.execute_test: # apply a test probe from swanlab.data.run.main import get_run - from astuner.utils.testing_utils import _test_if_test_mode + from agentscope_tuner.utils.testing_utils import ( + _test_if_test_mode, + ) run_info = get_run().public.json() # type: ignore data = { @@ -1047,7 +1049,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): return ctx_trackers, tasks, val_metrics def get_eval_dataset(self): - from astuner.task_reader import RouterTaskReader + from agentscope_tuner.task_reader import RouterTaskReader task_reader = RouterTaskReader( self.config.astuner.task_reader.type, diff --git a/astuner/backbone/warm_up.py b/agentscope_tuner/backbone/warm_up.py similarity index 95% rename from astuner/backbone/warm_up.py rename to agentscope_tuner/backbone/warm_up.py index 86a8d297..034af00d 100644 --- a/astuner/backbone/warm_up.py +++ b/agentscope_tuner/backbone/warm_up.py @@ -56,7 +56,7 @@ def warm_up_process(config): def warm_up_task_judge_when_needed(config): if config.astuner.task_judge.judge_type == "rubrics_auto_grader": - from astuner.task_judge.rm_auto_grader_judge import AutoGraderJudge + from agentscope_tuner.task_judge.rm_auto_grader_judge import AutoGraderJudge judge = AutoGraderJudge(config) asyncio.run(judge.generate_rubrics_from_samples()) diff --git a/astuner/cli/__init__.py b/agentscope_tuner/cli/__init__.py similarity index 100% rename from astuner/cli/__init__.py rename to agentscope_tuner/cli/__init__.py diff --git a/astuner/cli/job.py b/agentscope_tuner/cli/job.py similarity index 94% rename from astuner/cli/job.py rename to agentscope_tuner/cli/job.py index 352f976c..49f3d8b6 100644 --- a/astuner/cli/job.py +++ b/agentscope_tuner/cli/job.py @@ -17,19 +17,19 @@ import yaml from loguru import logger -from astuner.cli.launcher import ( +from agentscope_tuner.cli.launcher import ( check_avail_gpu, get_backbone_target, setup_environment_vars, ) -from astuner.default_config.astune_default import Config -from astuner.utils.config_utils import ( +from agentscope_tuner.default_config.astune_default import Config +from agentscope_tuner.utils.config_utils import ( expand_astune_hierarchical_config, prepare_experiment_config, read_astune_hierarchical_config, ) -from astuner.utils.dynamic_import import cls_to_path -from astuner.utils.launch_utils import execute_training_process +from agentscope_tuner.utils.dynamic_import import cls_to_path +from agentscope_tuner.utils.launch_utils import execute_training_process class AstunerJob: @@ -142,7 +142,7 @@ def tune(self, *args, **kwargs) -> "AstunerJob": # start ray if not already started if not ray.is_initialized(): - from astuner.utils.launch_utils import start_ray_service + from agentscope_tuner.utils.launch_utils import start_ray_service start_ray_service(args, env) else: diff --git a/astuner/context_tracker/__init__.py b/agentscope_tuner/context_tracker/__init__.py similarity index 100% rename from astuner/context_tracker/__init__.py rename to agentscope_tuner/context_tracker/__init__.py diff --git a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py b/agentscope_tuner/context_tracker/agentscope_tracker/multiagent_tracking.py similarity index 97% rename from astuner/context_tracker/agentscope_tracker/multiagent_tracking.py rename to agentscope_tuner/context_tracker/agentscope_tracker/multiagent_tracking.py index 9280572d..08fc460c 100644 --- a/astuner/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/agentscope_tuner/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -7,15 +7,18 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from astuner.context_tracker.agentscope_tracker.timeline_merging import ( +from agentscope_tuner.context_tracker.agentscope_tracker.timeline_merging import ( merge_tracker_timelines, ) -from astuner.context_tracker.basic_tracker import BaseContextTracker, ExtendedMessage -from astuner.schema.extended_msg import INVALID_LOG_PROB_VALUE -from astuner.schema.trajectory import Reward -from astuner.utils.color_hsl import adjust_color_hsl -from astuner.utils.compute_madness import compute_string_madness -from astuner.utils.tokenizer import astune_apply_chat_template +from agentscope_tuner.context_tracker.basic_tracker import ( + BaseContextTracker, + ExtendedMessage, +) +from agentscope_tuner.schema.extended_msg import INVALID_LOG_PROB_VALUE +from agentscope_tuner.schema.trajectory import Reward +from agentscope_tuner.utils.color_hsl import adjust_color_hsl +from agentscope_tuner.utils.compute_madness import compute_string_madness +from agentscope_tuner.utils.tokenizer import astune_apply_chat_template class MultiAgentContextTracker(BaseContextTracker): diff --git a/astuner/context_tracker/agentscope_tracker/timeline_merging.py b/agentscope_tuner/context_tracker/agentscope_tracker/timeline_merging.py similarity index 98% rename from astuner/context_tracker/agentscope_tracker/timeline_merging.py rename to agentscope_tuner/context_tracker/agentscope_tracker/timeline_merging.py index 474a5afe..3dfc4b42 100644 --- a/astuner/context_tracker/agentscope_tracker/timeline_merging.py +++ b/agentscope_tuner/context_tracker/agentscope_tracker/timeline_merging.py @@ -2,7 +2,7 @@ from beast_logger import print_listofdict -from astuner.context_tracker.basic_tracker import ExtendedMessage +from agentscope_tuner.context_tracker.basic_tracker import ExtendedMessage def is_timeline_mergeable( diff --git a/astuner/context_tracker/base_tracker.py b/agentscope_tuner/context_tracker/base_tracker.py similarity index 98% rename from astuner/context_tracker/base_tracker.py rename to agentscope_tuner/context_tracker/base_tracker.py index d3bb4547..98023e3c 100644 --- a/astuner/context_tracker/base_tracker.py +++ b/agentscope_tuner/context_tracker/base_tracker.py @@ -1,11 +1,11 @@ from typing import List, Tuple, Union -from astuner.schema.extended_msg import ( +from agentscope_tuner.schema.extended_msg import ( INVALID_LOG_PROB_VALUE, ExtendedMessage, find_sublist_indices, ) -from astuner.schema.trajectory import Reward +from agentscope_tuner.schema.trajectory import Reward def replace_token_ids( diff --git a/astuner/context_tracker/basic_tracker.py b/agentscope_tuner/context_tracker/basic_tracker.py similarity index 98% rename from astuner/context_tracker/basic_tracker.py rename to agentscope_tuner/context_tracker/basic_tracker.py index e020f5c3..1d470d15 100644 --- a/astuner/context_tracker/basic_tracker.py +++ b/agentscope_tuner/context_tracker/basic_tracker.py @@ -4,13 +4,13 @@ import torch -from astuner.context_tracker.base_tracker import ( +from agentscope_tuner.context_tracker.base_tracker import ( BaseTracker, ExtendedMessage, replace_token_ids, ) -from astuner.schema.trajectory import Reward, Sample -from astuner.utils.tokenizer import astune_apply_chat_template +from agentscope_tuner.schema.trajectory import Reward, Sample +from agentscope_tuner.utils.tokenizer import astune_apply_chat_template class BaseContextTracker(BaseTracker): diff --git a/astuner/data_generator/__init__.py b/agentscope_tuner/data_generator/__init__.py similarity index 100% rename from astuner/data_generator/__init__.py rename to agentscope_tuner/data_generator/__init__.py diff --git a/astuner/data_generator/base_data_generator.py b/agentscope_tuner/data_generator/base_data_generator.py similarity index 92% rename from astuner/data_generator/base_data_generator.py rename to agentscope_tuner/data_generator/base_data_generator.py index f55b6733..540ebaa7 100644 --- a/astuner/data_generator/base_data_generator.py +++ b/agentscope_tuner/data_generator/base_data_generator.py @@ -1,8 +1,8 @@ from typing import Any, Dict, List, Optional, Union -from astuner.schema.document import Document -from astuner.schema.task import Task -from astuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn +from agentscope_tuner.schema.document import Document +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn class BaseDataGenerator: diff --git a/astuner/data_generator/config.py b/agentscope_tuner/data_generator/config.py similarity index 76% rename from astuner/data_generator/config.py rename to agentscope_tuner/data_generator/config.py index 45514247..7df60cb4 100644 --- a/astuner/data_generator/config.py +++ b/agentscope_tuner/data_generator/config.py @@ -1,33 +1,57 @@ -from pydantic import BaseModel, Field, field_validator from typing import List, Optional +from pydantic import BaseModel, Field, field_validator + + class SamplingParamsConfig(BaseModel): """Sampling parameters configuration""" - temperature: float = Field(default=0.0, description="Sampling temperature, 0 means greedy decoding") - + + temperature: float = Field( + default=0.0, description="Sampling temperature, 0 means greedy decoding" + ) + + class DeduplicationFilterParamsConfig(BaseModel): """Deduplication filter parameters configuration""" - similarity_threshold: float = Field(default=0.8, description="Similarity threshold. Tasks above this value will be filtered.") - db_path: str = Field(default="./.similarity_db", description="Storage path for the similarity database") + + similarity_threshold: float = Field( + default=0.8, description="Similarity threshold. Tasks above this value will be filtered." + ) + db_path: str = Field( + default="./.similarity_db", description="Storage path for the similarity database" + ) model: str = Field(default="text-embedding-v4", description="Embedding model name") - api_key: Optional[str] = Field(default=None, description="API Key. If None, it is loaded from environment variables.") - base_url: str = Field(default="https://dashscope.aliyuncs.com/compatible-mode/v1", description="Embedding API base URL") + api_key: Optional[str] = Field( + default=None, description="API Key. If None, it is loaded from environment variables." + ) + base_url: str = Field( + default="https://dashscope.aliyuncs.com/compatible-mode/v1", + description="Embedding API base URL", + ) + class TrainingDatasetConfig(BaseModel): """Training dataset configuration""" + file_path: str = Field(default="", description="Path to the training data file") - + + class DeduplicationFilterConfig(BaseModel): """Deduplication filter configuration""" + enabled: bool = Field(default=True, description="Whether to enable the filter") params: DeduplicationFilterParamsConfig = Field(default_factory=DeduplicationFilterParamsConfig) + class DocumentReaderConfig(BaseModel): """Document reader configuration""" + document_path: List[str] = Field(default=[], description="List of document file paths") languages: List[str] = Field(default=["eng"], description="List of document languages") chunk_size: int = Field(default=5120, description="Chunk size") - split_by: str = Field(default="sentence", description="Split method: sentence, paragraph, character") + split_by: str = Field( + default="sentence", description="Split method: sentence, paragraph, character" + ) cache_enabled: bool = Field(default=True, description="Whether to enable caching") @field_validator("split_by") @@ -38,12 +62,16 @@ def validate_split_by(cls, v: str) -> str: raise ValueError(f"split_by must be one of {allowed}, current value: {v}") return v + class DatasetFileConfig(BaseModel): """Dataset file configuration""" + training: TrainingDatasetConfig = Field(default_factory=TrainingDatasetConfig) + class QueryReaderConfig(BaseModel): """Query reader configuration""" + type: str = Field(default="jsonl_dataset_file", description="Reader type") jsonl_dataset_file: DatasetFileConfig = Field(default_factory=DatasetFileConfig) @@ -55,8 +83,10 @@ def validate_type(cls, v: str) -> str: raise ValueError(f"type must be one of {allowed}, current value: {v}") return v + class DataGenerationConfig(BaseModel): """Data generation configuration""" + document_reader: DocumentReaderConfig = Field(default_factory=DocumentReaderConfig) query_reader: QueryReaderConfig = Field(default_factory=QueryReaderConfig) task_num: int = Field(default=10, description="Number of tasks to generate") @@ -64,8 +94,12 @@ class DataGenerationConfig(BaseModel): llm_response_length: int = Field(default=8192, description="LLM maximum response length") num_workers: int = Field(default=32, description="Number of parallel worker threads") sampling_params: SamplingParamsConfig = Field(default_factory=SamplingParamsConfig) - deduplication_filter: DeduplicationFilterConfig = Field(default_factory=DeduplicationFilterConfig) + deduplication_filter: DeduplicationFilterConfig = Field( + default_factory=DeduplicationFilterConfig + ) + class TaskReaderConfig(BaseModel): """Task reader configuration""" - data_generation: DataGenerationConfig = Field(default_factory=DataGenerationConfig) \ No newline at end of file + + data_generation: DataGenerationConfig = Field(default_factory=DataGenerationConfig) diff --git a/astuner/data_generator/knowledge_augmentation.py b/agentscope_tuner/data_generator/knowledge_augmentation.py similarity index 97% rename from astuner/data_generator/knowledge_augmentation.py rename to agentscope_tuner/data_generator/knowledge_augmentation.py index e41509eb..2d53f8c4 100644 --- a/astuner/data_generator/knowledge_augmentation.py +++ b/agentscope_tuner/data_generator/knowledge_augmentation.py @@ -2,9 +2,9 @@ import re from typing import Any, Dict, List, Optional -from astuner.data_generator.base_data_generator import BaseDataGenerator -from astuner.schema.document import Document -from astuner.schema.task import Task +from agentscope_tuner.data_generator.base_data_generator import BaseDataGenerator +from agentscope_tuner.schema.document import Document +from agentscope_tuner.schema.task import Task class KnowledgeAugmentor(BaseDataGenerator): diff --git a/astuner/data_generator/task_augmentation.py b/agentscope_tuner/data_generator/task_augmentation.py similarity index 97% rename from astuner/data_generator/task_augmentation.py rename to agentscope_tuner/data_generator/task_augmentation.py index b6866860..d1b0e172 100644 --- a/astuner/data_generator/task_augmentation.py +++ b/agentscope_tuner/data_generator/task_augmentation.py @@ -1,9 +1,9 @@ import re from typing import Any, Dict, Optional, Union -from astuner.data_generator.base_data_generator import BaseDataGenerator -from astuner.schema.document import Document -from astuner.schema.task import Task +from agentscope_tuner.data_generator.base_data_generator import BaseDataGenerator +from agentscope_tuner.schema.document import Document +from agentscope_tuner.schema.task import Task class TaskAugmentor(BaseDataGenerator): diff --git a/astuner/default_config/README.md b/agentscope_tuner/default_config/README.md similarity index 100% rename from astuner/default_config/README.md rename to agentscope_tuner/default_config/README.md diff --git a/astuner/default_config/astune_default.py b/agentscope_tuner/default_config/astune_default.py similarity index 100% rename from astuner/default_config/astune_default.py rename to agentscope_tuner/default_config/astune_default.py diff --git a/astuner/default_config/astune_default.yaml b/agentscope_tuner/default_config/astune_default.yaml similarity index 98% rename from astuner/default_config/astune_default.yaml rename to agentscope_tuner/default_config/astune_default.yaml index ddaf6391..17e2c236 100644 --- a/astuner/default_config/astune_default.yaml +++ b/agentscope_tuner/default_config/astune_default.yaml @@ -140,7 +140,7 @@ astuner: judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' # when `judge_type == customized_protocol` - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge # the helper LLM model used for LLM-AS-Judge alien_llm_model: qwen3-235b-a22b-instruct-2507 diff --git a/astuner/default_config/trinity/README.md b/agentscope_tuner/default_config/trinity/README.md similarity index 100% rename from astuner/default_config/trinity/README.md rename to agentscope_tuner/default_config/trinity/README.md diff --git a/astuner/default_config/trinity/README_ZH.md b/agentscope_tuner/default_config/trinity/README_ZH.md similarity index 100% rename from astuner/default_config/trinity/README_ZH.md rename to agentscope_tuner/default_config/trinity/README_ZH.md diff --git a/astuner/default_config/trinity/config_auto_convertion_trinity.jsonc b/agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc similarity index 100% rename from astuner/default_config/trinity/config_auto_convertion_trinity.jsonc rename to agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc diff --git a/astuner/default_config/trinity/trinity_default.yaml b/agentscope_tuner/default_config/trinity/trinity_default.yaml similarity index 100% rename from astuner/default_config/trinity/trinity_default.yaml rename to agentscope_tuner/default_config/trinity/trinity_default.yaml diff --git a/astuner/default_config/trinity/trinity_launch.yaml b/agentscope_tuner/default_config/trinity/trinity_launch.yaml similarity index 100% rename from astuner/default_config/trinity/trinity_launch.yaml rename to agentscope_tuner/default_config/trinity/trinity_launch.yaml diff --git a/astuner/default_config/verl/config_auto_convertion_verl.jsonc b/agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc similarity index 100% rename from astuner/default_config/verl/config_auto_convertion_verl.jsonc rename to agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc diff --git a/astuner/default_config/verl/verl_default.yaml b/agentscope_tuner/default_config/verl/verl_default.yaml similarity index 100% rename from astuner/default_config/verl/verl_default.yaml rename to agentscope_tuner/default_config/verl/verl_default.yaml diff --git a/astuner/schema/__init__.py b/agentscope_tuner/schema/__init__.py similarity index 100% rename from astuner/schema/__init__.py rename to agentscope_tuner/schema/__init__.py diff --git a/astuner/schema/document.py b/agentscope_tuner/schema/document.py similarity index 100% rename from astuner/schema/document.py rename to agentscope_tuner/schema/document.py diff --git a/astuner/schema/extended_msg.py b/agentscope_tuner/schema/extended_msg.py similarity index 99% rename from astuner/schema/extended_msg.py rename to agentscope_tuner/schema/extended_msg.py index 7049932f..d789d743 100644 --- a/astuner/schema/extended_msg.py +++ b/agentscope_tuner/schema/extended_msg.py @@ -4,7 +4,7 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from astuner.utils.tokenizer import astune_apply_chat_template +from agentscope_tuner.utils.tokenizer import astune_apply_chat_template # import numpy as np # INVALID_LOG_PROB_VALUE = np.inf # when debuging, set to np.inf, if anything goes wrong, we can sense that immediately diff --git a/astuner/schema/logprob.py b/agentscope_tuner/schema/logprob.py similarity index 100% rename from astuner/schema/logprob.py rename to agentscope_tuner/schema/logprob.py diff --git a/astuner/schema/task.py b/agentscope_tuner/schema/task.py similarity index 100% rename from astuner/schema/task.py rename to agentscope_tuner/schema/task.py diff --git a/astuner/schema/trajectory.py b/agentscope_tuner/schema/trajectory.py similarity index 100% rename from astuner/schema/trajectory.py rename to agentscope_tuner/schema/trajectory.py diff --git a/astuner/task_judge/base_judge.py b/agentscope_tuner/task_judge/base_judge.py similarity index 76% rename from astuner/task_judge/base_judge.py rename to agentscope_tuner/task_judge/base_judge.py index aa478b78..7ec5b63f 100644 --- a/astuner/task_judge/base_judge.py +++ b/agentscope_tuner/task_judge/base_judge.py @@ -1,4 +1,4 @@ -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class BaseJudge: diff --git a/astuner/task_judge/env_service_as_judge.py b/agentscope_tuner/task_judge/env_service_as_judge.py similarity index 82% rename from astuner/task_judge/env_service_as_judge.py rename to agentscope_tuner/task_judge/env_service_as_judge.py index 979cdc59..ffa145dd 100644 --- a/astuner/task_judge/env_service_as_judge.py +++ b/agentscope_tuner/task_judge/env_service_as_judge.py @@ -1,5 +1,5 @@ -from astuner.task_judge.base_judge import BaseJudge -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class EnvServiceJudge(BaseJudge): diff --git a/astuner/task_judge/rm_auto_grader_judge.py b/agentscope_tuner/task_judge/rm_auto_grader_judge.py similarity index 98% rename from astuner/task_judge/rm_auto_grader_judge.py rename to agentscope_tuner/task_judge/rm_auto_grader_judge.py index 3b0fd6c6..c97fc5be 100644 --- a/astuner/task_judge/rm_auto_grader_judge.py +++ b/agentscope_tuner/task_judge/rm_auto_grader_judge.py @@ -31,8 +31,8 @@ from rm_gallery.core.models.dashscope_chat_model import DashScopeChatModel from rm_gallery.core.models.schema.prompt_template import LanguageEnum -from astuner.schema.task import Task, WorkflowOutput -from astuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.schema.task import Task, WorkflowOutput +from agentscope_tuner.task_judge.base_judge import BaseJudge class AutoGraderJudge(BaseJudge): @@ -177,7 +177,7 @@ def _parse_config( async def read_reference_samples_from_dataset(self) -> List[Task]: # read dataset from config - from astuner.task_reader import RouterTaskReader + from agentscope_tuner.task_reader import RouterTaskReader reader = RouterTaskReader( reader_type=self.config.astuner.task_judge.rubrics_auto_grader.input_data_type, diff --git a/astuner/task_reader/__init__.py b/agentscope_tuner/task_reader/__init__.py similarity index 86% rename from astuner/task_reader/__init__.py rename to agentscope_tuner/task_reader/__init__.py index 245fa492..d22975f5 100644 --- a/astuner/task_reader/__init__.py +++ b/agentscope_tuner/task_reader/__init__.py @@ -3,13 +3,13 @@ import datasets import numpy as np -from astuner.schema.task import Task -from astuner.task_reader.data_generator_reader import DataGeneratorTaskReader -from astuner.task_reader.env_service_reader import EnvServiceTaskReader -from astuner.task_reader.hf_dataset_reader import HuggingFaceTaskReader -from astuner.task_reader.jsonl_reader import JsonlTaskReader -from astuner.task_reader.task_reader_base import BaseTaskReader -from astuner.task_reader.tracing_reader import TracingReader +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_reader.data_generator_reader import DataGeneratorTaskReader +from agentscope_tuner.task_reader.env_service_reader import EnvServiceTaskReader +from agentscope_tuner.task_reader.hf_dataset_reader import HuggingFaceTaskReader +from agentscope_tuner.task_reader.jsonl_reader import JsonlTaskReader +from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader +from agentscope_tuner.task_reader.tracing_reader import TracingReader class RandomDummyTaskReader(BaseTaskReader): diff --git a/astuner/task_reader/data_generator_reader.py b/agentscope_tuner/task_reader/data_generator_reader.py similarity index 94% rename from astuner/task_reader/data_generator_reader.py rename to agentscope_tuner/task_reader/data_generator_reader.py index 2e95bcd1..f925c42b 100644 --- a/astuner/task_reader/data_generator_reader.py +++ b/agentscope_tuner/task_reader/data_generator_reader.py @@ -11,12 +11,14 @@ from loguru import logger from tqdm import tqdm -from astuner.task_reader.tracing_reader.filters.deduplication_filter import DeduplicationFilter -from astuner.data_generator.knowledge_augmentation import KnowledgeAugmentor -from astuner.data_generator.task_augmentation import TaskAugmentor -from astuner.schema.task import Task -from astuner.task_reader.document_reader.doc_reader import DocReader -from astuner.task_reader.task_reader_base import BaseTaskReader +from agentscope_tuner.data_generator.knowledge_augmentation import KnowledgeAugmentor +from agentscope_tuner.data_generator.task_augmentation import TaskAugmentor +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_reader.document_reader.doc_reader import DocReader +from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader +from agentscope_tuner.task_reader.tracing_reader.filters.deduplication_filter import ( + DeduplicationFilter, +) dotenv.load_dotenv() @@ -53,10 +55,16 @@ def __init__(self, reader_config): "document_reader": document_path_str, "deduplication_filter": { "similarity_threshold": getattr( - reader_config.data_generation.deduplication_filter.params, "similarity_threshold", None + reader_config.data_generation.deduplication_filter.params, + "similarity_threshold", + None, + ), + "db_path": getattr( + reader_config.data_generation.deduplication_filter.params, "db_path", None + ), + "model": getattr( + reader_config.data_generation.deduplication_filter.params, "model", None ), - "db_path": getattr(reader_config.data_generation.deduplication_filter.params, "db_path", None), - "model": getattr(reader_config.data_generation.deduplication_filter.params, "model", None), }, } cache_key_str = json.dumps(cache_config, sort_keys=True, ensure_ascii=False) @@ -87,7 +95,7 @@ def __init__(self, reader_config): else: self.duplicate_filter = None # Initialize task reader - from astuner.task_reader import RouterTaskReader + from agentscope_tuner.task_reader import RouterTaskReader task_reader = RouterTaskReader( reader_type=self.reader_config.data_generation.query_reader.type, diff --git a/astuner/task_reader/document_reader/doc_reader.py b/agentscope_tuner/task_reader/document_reader/doc_reader.py similarity index 98% rename from astuner/task_reader/document_reader/doc_reader.py rename to agentscope_tuner/task_reader/document_reader/doc_reader.py index d5fc85fc..7b7b84a8 100644 --- a/astuner/task_reader/document_reader/doc_reader.py +++ b/agentscope_tuner/task_reader/document_reader/doc_reader.py @@ -13,8 +13,10 @@ except Exception: logger.warning("Cannot import dependency `unstructured`") -from astuner.schema.document import Document -from astuner.task_reader.document_reader.document_reader_base import DocReaderBase +from agentscope_tuner.schema.document import Document +from agentscope_tuner.task_reader.document_reader.document_reader_base import ( + DocReaderBase, +) class DocReader(DocReaderBase): diff --git a/astuner/task_reader/document_reader/document_reader_base.py b/agentscope_tuner/task_reader/document_reader/document_reader_base.py similarity index 79% rename from astuner/task_reader/document_reader/document_reader_base.py rename to agentscope_tuner/task_reader/document_reader/document_reader_base.py index 7aa575da..6dae1603 100644 --- a/astuner/task_reader/document_reader/document_reader_base.py +++ b/agentscope_tuner/task_reader/document_reader/document_reader_base.py @@ -1,6 +1,6 @@ from typing import List, Optional -from astuner.schema.document import Document +from agentscope_tuner.schema.document import Document class DocReaderBase: diff --git a/astuner/task_reader/env_service_reader.py b/agentscope_tuner/task_reader/env_service_reader.py similarity index 86% rename from astuner/task_reader/env_service_reader.py rename to agentscope_tuner/task_reader/env_service_reader.py index f7171274..d60f1282 100644 --- a/astuner/task_reader/env_service_reader.py +++ b/agentscope_tuner/task_reader/env_service_reader.py @@ -1,6 +1,6 @@ -from astuner.schema.task import Task -from astuner.task_reader.task_reader_base import BaseTaskReader -from astuner.utils.env_service_client.env_client_ng import EnvClient +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader +from agentscope_tuner.utils.env_service_client.env_client_ng import EnvClient class EnvServiceTaskReader(BaseTaskReader): diff --git a/astuner/task_reader/hf_dataset_reader.py b/agentscope_tuner/task_reader/hf_dataset_reader.py similarity index 95% rename from astuner/task_reader/hf_dataset_reader.py rename to agentscope_tuner/task_reader/hf_dataset_reader.py index 8d310a4c..7b470d43 100644 --- a/astuner/task_reader/hf_dataset_reader.py +++ b/agentscope_tuner/task_reader/hf_dataset_reader.py @@ -2,8 +2,8 @@ import datasets -from astuner.schema.task import Task -from astuner.task_reader.task_reader_base import BaseTaskReader +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader class HuggingFaceTaskReader(BaseTaskReader): diff --git a/astuner/task_reader/jsonl_reader.py b/agentscope_tuner/task_reader/jsonl_reader.py similarity index 94% rename from astuner/task_reader/jsonl_reader.py rename to agentscope_tuner/task_reader/jsonl_reader.py index ef4d7165..33fab1ca 100644 --- a/astuner/task_reader/jsonl_reader.py +++ b/agentscope_tuner/task_reader/jsonl_reader.py @@ -1,8 +1,8 @@ import json from typing import List -from astuner.schema.task import Task -from astuner.task_reader.task_reader_base import BaseTaskReader +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader class JsonlTaskReader(BaseTaskReader): diff --git a/astuner/task_reader/task_reader_base.py b/agentscope_tuner/task_reader/task_reader_base.py similarity index 86% rename from astuner/task_reader/task_reader_base.py rename to agentscope_tuner/task_reader/task_reader_base.py index de0fb023..a5ff20ed 100644 --- a/astuner/task_reader/task_reader_base.py +++ b/agentscope_tuner/task_reader/task_reader_base.py @@ -1,6 +1,6 @@ from typing import List -from astuner.schema.task import Task +from agentscope_tuner.schema.task import Task class BaseTaskReader: diff --git a/astuner/task_reader/tracing_reader/__init__.py b/agentscope_tuner/task_reader/tracing_reader/__init__.py similarity index 92% rename from astuner/task_reader/tracing_reader/__init__.py rename to agentscope_tuner/task_reader/tracing_reader/__init__.py index d11667f2..02325d7d 100644 --- a/astuner/task_reader/tracing_reader/__init__.py +++ b/agentscope_tuner/task_reader/tracing_reader/__init__.py @@ -5,9 +5,9 @@ from loguru import logger -from astuner.task_reader.tracing_reader.filters.base import Filter -from astuner.task_reader.tracing_reader.filters.factory import build_filters -from astuner.schema.task import Task +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_reader.tracing_reader.filters.base import Filter +from agentscope_tuner.task_reader.tracing_reader.filters.factory import build_filters from ..task_reader_base import BaseTaskReader @@ -25,7 +25,9 @@ def __init__( train_ratio: float = 0.7, split_seed: int = 42, ) -> None: - from astuner.task_reader.tracing_reader.connector import LocalSqliteConnectorV1 + from agentscope_tuner.task_reader.tracing_reader.connector import ( + LocalSqliteConnectorV1, + ) super().__init__(reader_config) # config patch diff --git a/astuner/task_reader/tracing_reader/connector.py b/agentscope_tuner/task_reader/tracing_reader/connector.py similarity index 99% rename from astuner/task_reader/tracing_reader/connector.py rename to agentscope_tuner/task_reader/tracing_reader/connector.py index 913099e4..4a4c2358 100644 --- a/astuner/task_reader/tracing_reader/connector.py +++ b/agentscope_tuner/task_reader/tracing_reader/connector.py @@ -10,7 +10,7 @@ import requests from loguru import logger -from astuner.schema.task import Task +from agentscope_tuner.schema.task import Task class TracingConnector(Protocol): diff --git a/astuner/task_reader/tracing_reader/filters/__init__.py b/agentscope_tuner/task_reader/tracing_reader/filters/__init__.py similarity index 100% rename from astuner/task_reader/tracing_reader/filters/__init__.py rename to agentscope_tuner/task_reader/tracing_reader/filters/__init__.py diff --git a/astuner/task_reader/tracing_reader/filters/base.py b/agentscope_tuner/task_reader/tracing_reader/filters/base.py similarity index 96% rename from astuner/task_reader/tracing_reader/filters/base.py rename to agentscope_tuner/task_reader/tracing_reader/filters/base.py index c0703076..65567266 100644 --- a/astuner/task_reader/tracing_reader/filters/base.py +++ b/agentscope_tuner/task_reader/tracing_reader/filters/base.py @@ -1,9 +1,9 @@ -from abc import ABC, abstractmethod import asyncio import threading +from abc import ABC, abstractmethod from typing import Iterable, List -from astuner.schema.task import Task +from agentscope_tuner.schema.task import Task class Filter(ABC): @@ -11,7 +11,7 @@ class Filter(ABC): async def filter(self, tasks: Iterable[Task]) -> List[Task]: """Filter a collection of Task objects and return the kept ones.""" raise NotImplementedError - + def filter_sync(self, tasks: Iterable[Task]) -> List[Task]: """This is a temp fix for async filter being called in a sync context.""" try: diff --git a/astuner/task_reader/tracing_reader/filters/deduplication_filter.py b/agentscope_tuner/task_reader/tracing_reader/filters/deduplication_filter.py similarity index 90% rename from astuner/task_reader/tracing_reader/filters/deduplication_filter.py rename to agentscope_tuner/task_reader/tracing_reader/filters/deduplication_filter.py index c488c891..1430f06a 100644 --- a/astuner/task_reader/tracing_reader/filters/deduplication_filter.py +++ b/agentscope_tuner/task_reader/tracing_reader/filters/deduplication_filter.py @@ -2,8 +2,8 @@ import shutil from typing import Iterable, List -from astuner.schema.task import Task -from astuner.utils.embedding_client import EmbeddingClient +from agentscope_tuner.schema.task import Task +from agentscope_tuner.utils.embedding_client import EmbeddingClient from .base import Filter @@ -40,6 +40,5 @@ async def filter(self, tasks: Iterable[Task]) -> List[Task]: continue res.append(task) self._client.add(task.main_query, hash(task.main_query)) - return res diff --git a/astuner/task_reader/tracing_reader/filters/factory.py b/agentscope_tuner/task_reader/tracing_reader/filters/factory.py similarity index 100% rename from astuner/task_reader/tracing_reader/filters/factory.py rename to agentscope_tuner/task_reader/tracing_reader/filters/factory.py index 1c57c8aa..66251e0d 100644 --- a/astuner/task_reader/tracing_reader/filters/factory.py +++ b/agentscope_tuner/task_reader/tracing_reader/filters/factory.py @@ -3,8 +3,8 @@ from typing import Any, Dict, List, Mapping, MutableMapping, Sequence from .base import Filter -from .llm_evaluate_filter import LlmEvaluateFilter from .deduplication_filter import DeduplicationFilter +from .llm_evaluate_filter import LlmEvaluateFilter FILTER_REGISTRY: Dict[str, type[Filter]] = { "llm_evaluate": LlmEvaluateFilter, diff --git a/astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/agentscope_tuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py similarity index 83% rename from astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py rename to agentscope_tuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 5ddb8b7e..956ebe87 100644 --- a/astuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/agentscope_tuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -6,11 +6,11 @@ from agentscope.message import Msg from agentscope.model import DashScopeChatModel from pydantic import BaseModel, Field -from astuner.schema.task import Task -from astuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn -from .base import Filter +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn +from .base import Filter EVALUATE_PROMPT = """You are now acting as a **strict QA quality reviewer**. You will be given a data sample containing a “query” (user question/task) and an “answer” (assistant reply). Evaluate it **only based on the text itself**, without inventing facts or performing external retrieval. @@ -41,11 +41,12 @@ If **any** of the above conditions are triggered, the final result must be **BAD**. Otherwise, it is **GOOD**. """ + class EvalResModel(BaseModel): - reason:str=Field( + reason: str = Field( description="judgment reason, briefly explain the reason", ) - result:str=Field( + result: str = Field( description="GOOD/BAD", ) @@ -66,10 +67,12 @@ def __init__( alien_llm_model="qwen3-235b-a22b-instruct-2507", alien_llm_response_length=512, ) - self._fn=ReActAgent( - name=f"agent", + self._fn = ReActAgent( + name="agent", sys_prompt=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), - model=DashScopeChatModel("qwen3-235b-a22b-instruct-2507",os.environ['DASHSCOPE_API_KEY']), + model=DashScopeChatModel( + "qwen3-235b-a22b-instruct-2507", os.environ["DASHSCOPE_API_KEY"] + ), formatter=DashScopeMultiAgentFormatter(), max_iters=1, ) @@ -77,12 +80,13 @@ def __init__( async def filter(self, tasks: Iterable[Task]) -> List[Task]: kept: List[Task] = [] for task in tasks: - payload = ( - "query: " + task.main_query + "\n" - "answer: " + task.metadata.get("answer", "") + payload = "query: " + task.main_query + "\n" "answer: " + task.metadata.get( + "answer", "" + ) + + res = await self._fn( + Msg("user", content=payload, role="user"), structured_model=EvalResModel ) - - res = await self._fn(Msg("user",content=payload,role="user"),structured_model=EvalResModel) assert isinstance(res, EvalResModel) if self._print_reason: print(res.reason) diff --git a/astuner/task_reader/tracing_reader/llm_client.py b/agentscope_tuner/task_reader/tracing_reader/llm_client.py similarity index 99% rename from astuner/task_reader/tracing_reader/llm_client.py rename to agentscope_tuner/task_reader/tracing_reader/llm_client.py index 3086d2f6..a17c1b60 100644 --- a/astuner/task_reader/tracing_reader/llm_client.py +++ b/agentscope_tuner/task_reader/tracing_reader/llm_client.py @@ -305,5 +305,3 @@ def chat_stream_with_retry( logger.error(f"All {max_retries} stream attempts failed") return - - diff --git a/astuner/task_rollout/__init__.py b/agentscope_tuner/task_rollout/__init__.py similarity index 100% rename from astuner/task_rollout/__init__.py rename to agentscope_tuner/task_rollout/__init__.py diff --git a/astuner/task_rollout/async_llm_bridge.py b/agentscope_tuner/task_rollout/async_llm_bridge.py similarity index 97% rename from astuner/task_rollout/async_llm_bridge.py rename to agentscope_tuner/task_rollout/async_llm_bridge.py index 745fb36b..3eff07b5 100644 --- a/astuner/task_rollout/async_llm_bridge.py +++ b/agentscope_tuner/task_rollout/async_llm_bridge.py @@ -14,13 +14,13 @@ from transformers.tokenization_utils import PreTrainedTokenizer from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser -from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from astuner.schema.logprob import TokenAndProb -from astuner.utils.async_utils import run_async_coroutine_with_timeout -from astuner.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode -from astuner.utils.tokenizer import astune_apply_chat_template +from agentscope_tuner.schema.logprob import TokenAndProb +from agentscope_tuner.utils.async_utils import run_async_coroutine_with_timeout +from agentscope_tuner.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode +from agentscope_tuner.utils.tokenizer import astune_apply_chat_template class AsyncLlmBridge(object): diff --git a/astuner/task_rollout/dashscope_llm_bridge.py b/agentscope_tuner/task_rollout/dashscope_llm_bridge.py similarity index 100% rename from astuner/task_rollout/dashscope_llm_bridge.py rename to agentscope_tuner/task_rollout/dashscope_llm_bridge.py diff --git a/astuner/task_rollout/native_parallel_worker.py b/agentscope_tuner/task_rollout/native_parallel_worker.py similarity index 96% rename from astuner/task_rollout/native_parallel_worker.py rename to agentscope_tuner/task_rollout/native_parallel_worker.py index 6c414a06..a27de7b9 100644 --- a/astuner/task_rollout/native_parallel_worker.py +++ b/agentscope_tuner/task_rollout/native_parallel_worker.py @@ -15,10 +15,10 @@ from verl import DataProto from verl.utils.torch_functional import pad_sequence_to_length -from astuner.context_tracker.basic_tracker import BaseContextTracker -from astuner.schema.task import Task -from astuner.schema.trajectory import Sample -from astuner.task_rollout.single_worker import BaseRolloutManager +from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker +from agentscope_tuner.schema.task import Task +from agentscope_tuner.schema.trajectory import Sample +from agentscope_tuner.task_rollout.single_worker import BaseRolloutManager class DynamicRolloutManager(BaseRolloutManager): @@ -119,7 +119,9 @@ def rollout_static( tracker_array.append(result) # TODO: support multi-step reward - task_success_rate = np.mean([tracker.reward_structure.success_rate for tracker in tracker_array]) + task_success_rate = np.mean( + [tracker.reward_structure.success_rate for tracker in tracker_array] + ) task_scalar_reward = np.mean( [tracker.reward_structure.final_scalar_reward for tracker in tracker_array] ) @@ -245,8 +247,12 @@ def rollout_dynamic( # noqa: C901 for j, task_future_array in enumerate(futures): completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] - completed_results = [tracker for tracker in completed_results if not tracker.discarded] - reward = [tracker.reward_structure.performance_reward for tracker in completed_results] + completed_results = [ + tracker for tracker in completed_results if not tracker.discarded + ] + reward = [ + tracker.reward_structure.performance_reward for tracker in completed_results + ] reward_std = np.std(reward) if reward else 0.0 all_finished = len(completed_task_futures) == len(task_future_array) if all_finished: @@ -311,7 +317,9 @@ def rollout_dynamic( # noqa: C901 for j, task_future_array in enumerate(futures): completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] - completed_results = [tracker for tracker in completed_results if not tracker.discarded] + completed_results = [ + tracker for tracker in completed_results if not tracker.discarded + ] task_cmd_reward_array = [ tracker.reward_structure.performance_reward for tracker in completed_results ] @@ -393,7 +401,9 @@ def rollout_dynamic( # noqa: C901 ): completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] - completed_results = [tracker for tracker in completed_results if not tracker.discarded] + completed_results = [ + tracker for tracker in completed_results if not tracker.discarded + ] # in-group success rate and reward task_cmd_reward_array = [ tracker.reward_structure.performance_reward for tracker in completed_results @@ -402,7 +412,12 @@ def rollout_dynamic( # noqa: C901 tracker.reward_structure.success_rate for tracker in completed_results ] task_group_reward += [ - np.mean([tracker.reward_structure.final_scalar_reward for tracker in completed_results]) + np.mean( + [ + tracker.reward_structure.final_scalar_reward + for tracker in completed_results + ] + ) ] task_success_rate += [np.mean(success_rate_array)] # whether this group need amendment diff --git a/astuner/task_rollout/resource_keeper.py b/agentscope_tuner/task_rollout/resource_keeper.py similarity index 95% rename from astuner/task_rollout/resource_keeper.py rename to agentscope_tuner/task_rollout/resource_keeper.py index c5f29b0f..b6a99497 100644 --- a/astuner/task_rollout/resource_keeper.py +++ b/agentscope_tuner/task_rollout/resource_keeper.py @@ -3,8 +3,10 @@ from loguru import logger from omegaconf import DictConfig -from astuner.schema.task import WorkflowTask -from astuner.utils.env_service_client.env_client_ng import EnvClient as EnvClientNg +from agentscope_tuner.schema.task import WorkflowTask +from agentscope_tuner.utils.env_service_client.env_client_ng import ( + EnvClient as EnvClientNg, +) class ResourceKeeper(object): @@ -138,7 +140,11 @@ class BaseGymEnv(object): """ def __init__( - self, env_client: EnvClientNg, task_env_uuid: str, task_thread_index: int, observation_window: Dict + self, + env_client: EnvClientNg, + task_env_uuid: str, + task_thread_index: int, + observation_window: Dict, ): self.env_client = env_client self.task_thread_index = task_thread_index diff --git a/astuner/task_rollout/single_worker.py b/agentscope_tuner/task_rollout/single_worker.py similarity index 88% rename from astuner/task_rollout/single_worker.py rename to agentscope_tuner/task_rollout/single_worker.py index cdb3ef64..019d24d3 100644 --- a/astuner/task_rollout/single_worker.py +++ b/agentscope_tuner/task_rollout/single_worker.py @@ -7,14 +7,14 @@ from omegaconf import DictConfig from transformers.tokenization_utils import PreTrainedTokenizer -from astuner.context_tracker.basic_tracker import BaseContextTracker -from astuner.schema.task import Task, WorkflowTask -from astuner.task_rollout.async_llm_bridge import AsyncLlmBridge -from astuner.task_rollout.resource_keeper import ResourceKeeper -from astuner.task_runner.agentscope_runner import AgentScopeRunner -from astuner.utils.retry import retry_with_backoff -from astuner.utils.sample import get_sample_params -from astuner.utils.testing_utils import TestFailException, TestSuccessException +from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker +from agentscope_tuner.schema.task import Task, WorkflowTask +from agentscope_tuner.task_rollout.async_llm_bridge import AsyncLlmBridge +from agentscope_tuner.task_rollout.resource_keeper import ResourceKeeper +from agentscope_tuner.task_runner.agentscope_runner import AgentScopeRunner +from agentscope_tuner.utils.retry import retry_with_backoff +from agentscope_tuner.utils.sample import get_sample_params +from agentscope_tuner.utils.testing_utils import TestFailException, TestSuccessException class BaseRolloutManager: diff --git a/astuner/task_runner/__init__.py b/agentscope_tuner/task_runner/__init__.py similarity index 64% rename from astuner/task_runner/__init__.py rename to agentscope_tuner/task_runner/__init__.py index e0e16a8a..98d73e6c 100644 --- a/astuner/task_runner/__init__.py +++ b/agentscope_tuner/task_runner/__init__.py @@ -1,4 +1,4 @@ from .agentscope_runner import AgentScopeRunner from .base_runner import BaseAgentRunner -__all__ = ["BaseAgentRunner", "AgentScopeRunner"] \ No newline at end of file +__all__ = ["BaseAgentRunner", "AgentScopeRunner"] diff --git a/astuner/task_runner/agentscope_runner.py b/agentscope_tuner/task_runner/agentscope_runner.py similarity index 85% rename from astuner/task_runner/agentscope_runner.py rename to agentscope_tuner/task_runner/agentscope_runner.py index c411ad52..a5951e0a 100644 --- a/astuner/task_runner/agentscope_runner.py +++ b/agentscope_tuner/task_runner/agentscope_runner.py @@ -1,15 +1,14 @@ import asyncio -from astuner import ModelTuner, Workflow, WorkflowOutput -from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput +from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from astuner.context_tracker.basic_tracker import BaseContextTracker -from astuner.schema.task import WorkflowTask -from astuner.schema.trajectory import Reward -from astuner.utils.dynamic_import import dynamic_import - -from .base_runner import BaseAgentRunner +from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker +from agentscope_tuner.schema.task import WorkflowTask +from agentscope_tuner.schema.trajectory import Reward +from agentscope_tuner.task_runner.base_runner import BaseAgentRunner +from agentscope_tuner.utils.dynamic_import import dynamic_import class AgentScopeRunner(BaseAgentRunner): diff --git a/astuner/task_runner/base_runner.py b/agentscope_tuner/task_runner/base_runner.py similarity index 84% rename from astuner/task_runner/base_runner.py rename to agentscope_tuner/task_runner/base_runner.py index d0919364..259bef2a 100644 --- a/astuner/task_runner/base_runner.py +++ b/agentscope_tuner/task_runner/base_runner.py @@ -1,9 +1,9 @@ from typing import Any, Callable, Union -from astuner.context_tracker.basic_tracker import BaseContextTracker -from astuner.task_judge.base_judge import BaseJudge -from astuner.utils.async_utils import run_async_coroutine_with_timeout -from astuner.utils.dynamic_import import dynamic_import +from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker +from agentscope_tuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.utils.async_utils import run_async_coroutine_with_timeout +from agentscope_tuner.utils.dynamic_import import dynamic_import class BaseAgentRunner(object): @@ -26,7 +26,7 @@ def get_judge(self) -> BaseJudge: # type: ignore elif self.config.astuner.task_judge.judge_type == "rubrics_auto_grader": # astuner/task_judge/rm_auto_grader_judge.py - from astuner.task_judge.rm_auto_grader_judge import AutoGraderJudge + from agentscope_tuner.task_judge.rm_auto_grader_judge import AutoGraderJudge judge = AutoGraderJudge(self.config) run_async_coroutine_with_timeout(judge.load_rubrics_from_cache()) diff --git a/astuner/tuner.py b/agentscope_tuner/tuner.py similarity index 97% rename from astuner/tuner.py rename to agentscope_tuner/tuner.py index a4e25ea1..510ee87f 100644 --- a/astuner/tuner.py +++ b/agentscope_tuner/tuner.py @@ -5,13 +5,13 @@ from loguru import logger from pydantic import BaseModel -from astuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from astuner.task_rollout.async_llm_bridge import AgentScopeLlmProxy +from agentscope_tuner.task_rollout.async_llm_bridge import AgentScopeLlmProxy if TYPE_CHECKING: - from astuner import Workflow + from agentscope_tuner import Workflow class Agent2Proxy(DashScopeChatModel): diff --git a/astuner/utils/__init__.py b/agentscope_tuner/utils/__init__.py similarity index 100% rename from astuner/utils/__init__.py rename to agentscope_tuner/utils/__init__.py diff --git a/astuner/utils/async_utils.py b/agentscope_tuner/utils/async_utils.py similarity index 100% rename from astuner/utils/async_utils.py rename to agentscope_tuner/utils/async_utils.py diff --git a/astuner/utils/cleaner.py b/agentscope_tuner/utils/cleaner.py similarity index 100% rename from astuner/utils/cleaner.py rename to agentscope_tuner/utils/cleaner.py diff --git a/astuner/utils/color_hsl.py b/agentscope_tuner/utils/color_hsl.py similarity index 100% rename from astuner/utils/color_hsl.py rename to agentscope_tuner/utils/color_hsl.py diff --git a/astuner/utils/compute_madness.py b/agentscope_tuner/utils/compute_madness.py similarity index 99% rename from astuner/utils/compute_madness.py rename to agentscope_tuner/utils/compute_madness.py index 395c826b..1ed05892 100644 --- a/astuner/utils/compute_madness.py +++ b/agentscope_tuner/utils/compute_madness.py @@ -166,5 +166,3 @@ def repetition_penalty_reward_scalar_debug(completion): if result != 0: return completion return "" - - diff --git a/astuner/utils/config_computer.py b/agentscope_tuner/utils/config_computer.py similarity index 100% rename from astuner/utils/config_computer.py rename to agentscope_tuner/utils/config_computer.py diff --git a/astuner/utils/config_utils.py b/agentscope_tuner/utils/config_utils.py similarity index 95% rename from astuner/utils/config_utils.py rename to agentscope_tuner/utils/config_utils.py index efe291a8..ea5fa118 100644 --- a/astuner/utils/config_utils.py +++ b/agentscope_tuner/utils/config_utils.py @@ -9,7 +9,7 @@ from loguru import logger from omegaconf import DictConfig -from astuner.utils.config_computer import split_keys_and_operators +from agentscope_tuner.utils.config_computer import split_keys_and_operators def read_astune_config(yaml_fp): @@ -175,9 +175,9 @@ def read_astune_hierarchical_config( "astuner": {}, "hydra": { "searchpath": [ - "file://astuner/default_config", - "file://astuner/default_config/verl", - "file://astuner/default_config/trinity", + "file://agentscope_tuner/default_config", + "file://agentscope_tuner/default_config/verl", + "file://agentscope_tuner/default_config/trinity", ] }, "defaults": [ @@ -198,17 +198,17 @@ def read_astune_hierarchical_config( if backbone == "debug": if "trinity_default" in config["defaults"]: config["defaults"].remove("trinity_default") - config["hydra"]["searchpath"].remove("file://astuner/default_config/trinity") + config["hydra"]["searchpath"].remove("file://agentscope_tuner/default_config/trinity") # remove extra config of verl for trinity if backbone == "trinity": if "verl_default" in config["defaults"]: config["defaults"].remove("verl_default") - config["hydra"]["searchpath"].remove("file://astuner/default_config/verl") + config["hydra"]["searchpath"].remove("file://agentscope_tuner/default_config/verl") # remove extra config of trinity for verl if backbone == "verl": # or args.backbone == "debug" if "trinity_default" in config["defaults"]: config["defaults"].remove("trinity_default") - config["hydra"]["searchpath"].remove("file://astuner/default_config/trinity") + config["hydra"]["searchpath"].remove("file://agentscope_tuner/default_config/trinity") if write_to: with open(write_to, "w") as file: diff --git a/astuner/utils/core_env_vars.py b/agentscope_tuner/utils/core_env_vars.py similarity index 95% rename from astuner/utils/core_env_vars.py rename to agentscope_tuner/utils/core_env_vars.py index efb0c9d6..aca4856b 100644 --- a/astuner/utils/core_env_vars.py +++ b/agentscope_tuner/utils/core_env_vars.py @@ -15,7 +15,7 @@ def get_runtime_env(is_trinity: bool = False) -> dict: "NCCL_DEBUG": "WARN", "VLLM_LOGGING_LEVEL": "WARN", "TOKENIZERS_PARALLELISM": "true", - # use astuner.backbone as plugin directory + # use agentscope_tuner.backbone as plugin directory "TRINITY_PLUGIN_DIRS": str((Path(__file__).parent.parent / "backbone").resolve()), # "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), diff --git a/astuner/utils/dynamic_import.py b/agentscope_tuner/utils/dynamic_import.py similarity index 100% rename from astuner/utils/dynamic_import.py rename to agentscope_tuner/utils/dynamic_import.py diff --git a/astuner/utils/embedding_client.py b/agentscope_tuner/utils/embedding_client.py similarity index 100% rename from astuner/utils/embedding_client.py rename to agentscope_tuner/utils/embedding_client.py diff --git a/astuner/utils/env_service_client/__init__.py b/agentscope_tuner/utils/env_service_client/__init__.py similarity index 100% rename from astuner/utils/env_service_client/__init__.py rename to agentscope_tuner/utils/env_service_client/__init__.py diff --git a/astuner/utils/env_service_client/env_client_ng.py b/agentscope_tuner/utils/env_service_client/env_client_ng.py similarity index 100% rename from astuner/utils/env_service_client/env_client_ng.py rename to agentscope_tuner/utils/env_service_client/env_client_ng.py diff --git a/astuner/utils/launch_utils.py b/agentscope_tuner/utils/launch_utils.py similarity index 93% rename from astuner/utils/launch_utils.py rename to agentscope_tuner/utils/launch_utils.py index c32c98d5..37182d8d 100644 --- a/astuner/utils/launch_utils.py +++ b/agentscope_tuner/utils/launch_utils.py @@ -8,8 +8,8 @@ from beast_logger import print_dict from loguru import logger -from astuner.utils.config_utils import align_parameters -from astuner.utils.smart_daemon import LaunchCommandWhenAbsent +from agentscope_tuner.utils.config_utils import align_parameters +from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent def set_loguru_default_color(): @@ -171,11 +171,13 @@ def execute_training_process( """ # Fixed config asset locations - TRINITY_BOOT_YAML = "astuner/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED + TRINITY_BOOT_YAML = "agentscope_tuner/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED TRINITY_CONFIG_AUTO_CONVERSION = ( - "astuner/default_config/trinity/config_auto_convertion_trinity.jsonc" + "agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc" + ) + VERL_CONFIG_AUTO_CONVERSION = ( + "agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc" ) - VERL_CONFIG_AUTO_CONVERSION = "astuner/default_config/verl/config_auto_convertion_verl.jsonc" # let's begin the training process if args.backbone == "trinity": diff --git a/astuner/utils/message_utils.py b/agentscope_tuner/utils/message_utils.py similarity index 100% rename from astuner/utils/message_utils.py rename to agentscope_tuner/utils/message_utils.py diff --git a/astuner/utils/process_dataset.py b/agentscope_tuner/utils/process_dataset.py similarity index 100% rename from astuner/utils/process_dataset.py rename to agentscope_tuner/utils/process_dataset.py diff --git a/astuner/utils/pty.py b/agentscope_tuner/utils/pty.py similarity index 98% rename from astuner/utils/pty.py rename to agentscope_tuner/utils/pty.py index 18ad9c1b..a05c4743 100644 --- a/astuner/utils/pty.py +++ b/agentscope_tuner/utils/pty.py @@ -96,7 +96,7 @@ def pty_wrapper_final(human_cmd, dir, env_dict): def pty_launch(service_name: str, success_std_string="Starting server on"): - from astuner.utils.smart_daemon import LaunchCommandWhenAbsent + from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent service_path = os.environ.get(f"{service_name.upper()}_PATH") service_script = os.environ.get(f"{service_name.upper()}_SCRIPT") diff --git a/astuner/utils/retry.py b/agentscope_tuner/utils/retry.py similarity index 95% rename from astuner/utils/retry.py rename to agentscope_tuner/utils/retry.py index 7d0e4226..e154818f 100644 --- a/astuner/utils/retry.py +++ b/agentscope_tuner/utils/retry.py @@ -4,7 +4,7 @@ from loguru import logger -from astuner.utils.testing_utils import TestFailException, TestSuccessException +from agentscope_tuner.utils.testing_utils import TestFailException, TestSuccessException T = TypeVar("T") diff --git a/astuner/utils/robust_dashscope.py b/agentscope_tuner/utils/robust_dashscope.py similarity index 100% rename from astuner/utils/robust_dashscope.py rename to agentscope_tuner/utils/robust_dashscope.py diff --git a/astuner/utils/sample.py b/agentscope_tuner/utils/sample.py similarity index 100% rename from astuner/utils/sample.py rename to agentscope_tuner/utils/sample.py diff --git a/astuner/utils/smart_daemon.py b/agentscope_tuner/utils/smart_daemon.py similarity index 99% rename from astuner/utils/smart_daemon.py rename to agentscope_tuner/utils/smart_daemon.py index 84dd60e8..7b8205d9 100644 --- a/astuner/utils/smart_daemon.py +++ b/agentscope_tuner/utils/smart_daemon.py @@ -291,7 +291,7 @@ def launch( converted_cmd = [ sys.executable, "-m", - "astuner.utils.pty", + "agentscope_tuner.utils.pty", "--human-cmd", f"'{string_to_base64(self.cmd[0])}'", "--dir", diff --git a/astuner/utils/testing_utils.py b/agentscope_tuner/utils/testing_utils.py similarity index 98% rename from astuner/utils/testing_utils.py rename to agentscope_tuner/utils/testing_utils.py index 4878d8b5..b3147e70 100644 --- a/astuner/utils/testing_utils.py +++ b/agentscope_tuner/utils/testing_utils.py @@ -10,7 +10,7 @@ from beast_logger import print_dict from loguru import logger -from astuner.utils.dynamic_import import dynamic_import +from agentscope_tuner.utils.dynamic_import import dynamic_import class TestSuccessException(Exception): @@ -50,7 +50,7 @@ def get_test_lambda(test_name) -> BaseProbe: def _test_if_test_mode(key, value, config): - from astuner.backbone.warm_up import init_parallel_rollout_logger + from agentscope_tuner.backbone.warm_up import init_parallel_rollout_logger if not config.astuner.execute_test: return diff --git a/astuner/utils/tokenizer.py b/agentscope_tuner/utils/tokenizer.py similarity index 100% rename from astuner/utils/tokenizer.py rename to agentscope_tuner/utils/tokenizer.py diff --git a/astuner/workflow.py b/agentscope_tuner/workflow.py similarity index 97% rename from astuner/workflow.py rename to agentscope_tuner/workflow.py index 70c74d53..2f27da0f 100644 --- a/astuner/workflow.py +++ b/agentscope_tuner/workflow.py @@ -2,8 +2,8 @@ from pydantic import BaseModel, Field -from astuner import ModelTuner -from astuner.schema.task import WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner +from agentscope_tuner.schema.task import WorkflowOutput, WorkflowTask class Workflow(BaseModel): diff --git a/astuner/__init__.py b/astuner/__init__.py deleted file mode 100644 index de7bdcf4..00000000 --- a/astuner/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from astuner.cli.job import AstunerJob -from astuner.schema.task import WorkflowOutput, WorkflowTask -from astuner.tuner import ModelTuner -from astuner.workflow import Workflow - -__all__ = [ - "Workflow", - "WorkflowTask", - "WorkflowOutput", - "ModelTuner", - "AstunerJob", -] - -__version__ = "0.1.0" diff --git a/astuner/cli/launcher.py b/astuner/cli/launcher.py deleted file mode 100644 index 1508785b..00000000 --- a/astuner/cli/launcher.py +++ /dev/null @@ -1,326 +0,0 @@ -import argparse -import os -import subprocess -import sys - -from dotenv import load_dotenv -from loguru import logger - -from astuner.utils.cleaner import fast_kill_by_keyword_bash -from astuner.utils.config_utils import prepare_experiment_config -from astuner.utils.launch_utils import ( - execute_training_process, - launch_logview, - start_ray_service, - set_loguru_default_color, -) -from astuner.utils.pty import pty_launch - -set_loguru_default_color() -load_dotenv() - -def parse_args(): - parser = argparse.ArgumentParser(description="BA Launcher") - parser.add_argument( - "--backbone", - type=str, - default="trinity", - required=False, - help="verl or trinity or debug", - ) - parser.add_argument( - "--conf", - type=str, - default="", - required=False, - help="Path to configuration file", - ) - parser.add_argument( - "--exp-dir", - type=str, - default="saved_experiments", - required=False, - help="Path to experiment directory", - ) - parser.add_argument( - "--debug", - "--db", - type=str, - default="", - required=False, - help="Path to configuration file", - ) - - parser.add_argument("--with-ray", action="store_true", default=False, help="Launch ray") - parser.add_argument("--with-ray-cluster", action="store_true", default=False, help="Launch ray") - parser.add_argument( - "--with-appworld", - action="store_true", - default=False, - help="Launch appworld", - ) - parser.add_argument( - "--with-webshop", - action="store_true", - default=False, - help="Launch webshop", - ) - parser.add_argument("--with-bfcl", action="store_true", default=False, help="Launch bfcl") - parser.add_argument( - "--with-logview", - action="store_true", - default=False, - help="Launch logview", - ) - parser.add_argument( - "--with-crafters", - action="store_true", - default=False, - help="Launch Crafters Env Simulation", - ) - parser.add_argument("--reboot", action="store_true", default=False, help="reboot flag") - parser.add_argument( - "--kill", - type=str, - default="", - required=False, - help="list of keywords for killing processes", - ) - parser.add_argument( - "--autokill", - action="store_true", - default=False, - help="Kill system processes (ray + vllm + python) that may block the current experiment", - ) - return parser.parse_args() - - -def check_debugpy_version(): - try: - import debugpy - except ImportError: - raise RuntimeError( - "Module 'debugpy>=1.8.0' cannot be loaded. " - "Ray Debugpy Debugger will not work without 'debugpy>=1.8.0' installed. " - "Install this module using 'pip install debugpy>=1.8.0'" - ) - version = getattr(debugpy, "__version__", "0.0.0") - from packaging import version as packaging_version - - if packaging_version.parse(version) < packaging_version.parse("1.8.0"): - raise RuntimeError( - f"debugpy version {version} is too old. " - "Ray Debugpy Debugger requires 'debugpy>=1.8.0'. " - "Upgrade using 'pip install debugpy>=1.8.0'" - ) - logger.info(f"✓ debugpy version {version} meets requirement (>=1.8.0)") - - -def check_avail_gpu(min_free_ratio: float = 0.95): - """ - Ensure there is at least one GPU and all GPUs have >= min_free_ratio free memory. - - Uses `nvidia-smi` to query total and used memory for each GPU. - Raises RuntimeError if no GPU is found or any GPU violates the free ratio threshold. - """ - try: - # Query GPU memory via nvidia-smi; output in MiB - result = subprocess.run( - [ - "nvidia-smi", - "--query-gpu=name,memory.total,memory.used", - "--format=csv,noheader,nounits", - ], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - text=True, - check=False, - ) - except FileNotFoundError: - raise RuntimeError("nvidia-smi not found. NVIDIA drivers/GPU may be unavailable.") - - if result.returncode != 0: - raise RuntimeError(f"Failed to query GPUs via nvidia-smi: {result.stderr.strip()}") - - lines = [line.strip() for line in result.stdout.splitlines() if line.strip()] - if not lines: - raise RuntimeError("No GPUs detected by nvidia-smi.") - - violations = [] - for idx, line in enumerate(lines): - # Expected format: ", , " - parts = [p.strip() for p in line.split(",")] - if len(parts) < 3: - violations.append((idx, "parse-error", line)) - continue - name, total_str, used_str = parts[0], parts[1], parts[2] - try: - total = float(total_str) - used = float(used_str) - except ValueError: - violations.append((idx, "parse-error", line)) - continue - free = max(total - used, 0.0) - free_ratio = free / total if total > 0 else 0.0 - logger.info( - f"GPU {idx} ({name}): total={total:.0f} MiB, used={used:.0f} MiB, free_ratio={free_ratio:.3f}" - ) - if free_ratio < min_free_ratio: - violations.append((idx, name, f"free_ratio={free_ratio:.3f} < {min_free_ratio:.3f}")) - - if violations: - details = "; ".join([f"GPU {i} ({n}): {msg}" for i, n, msg in violations]) - raise RuntimeError( - "GPU memory check failed: all GPUs must have >= " - f"{int(min_free_ratio*100)}% free. Violations: {details}" - ) - logger.info( - f"✓ GPU check passed: {len(lines)} GPUs, all >= {int(min_free_ratio*100)}% free memory" - ) - - -def get_backbone_target(backbone): - """ - Determine the appropriate backbone target module based on the backbone name. - - Args: - backbone (str): The backbone name (e.g., "verl", "debug", "trinity") - - Returns: - str: The full module path for the specified backbone - """ - backbone_target = "astuner.backbone.main_trinity" # Default to trinity - if backbone == "verl": - backbone_target = "astuner.backbone.main_verl" - if backbone == "debug": - backbone_target = "astuner.backbone.main_vllm" - if backbone == "trinity": - backbone_target = "astuner.backbone.main_trinity" - return backbone_target - - -def setup_environment_vars(args, exp_config, main_yaml_fp): - """ - Configure environment variables based on command line arguments. - - Args: - args: Command line arguments - exp_config: Experiment configuration dictionary - main_yaml_fp: Path to main YAML configuration file - - Returns: - dict: Configured environment variables dictionary - """ - env = os.environ.copy() - if args.debug: - env["RAY_DEBUG_POST_MORTEM"] = "1" - env["DEBUG_TAGS"] = args.debug - env["RAY_record_task_actor_creation_sites"] = "true" - # assert exp_config["astuner"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore - logger.warning("Debug mode is ON") - else: - logger.warning("Debug mode is OFF") - if args.conf: - assert exp_config["astuner"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore - if args.backbone == "trinity": - env["ASTUNER_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore - if args.backbone == "debug": - env["ASTUNER_DEBUG"] = "1" # type: ignore - return env - - -def check_model_file_exists(exp_config): - model_path = exp_config["astuner"]["model"]["path"] - # if model_path has more than 2 '/', we consider it as a dir path - if model_path.count("/") > 2: - assert os.path.exists( - model_path - ), f"Model path {model_path} does not exist. Please check your configuration." - - -def main(): - args = parse_args() - - # Enforce GPU availability and free memory threshold before proceeding - if (args.backbone != "debug") and (not args.kill) and (not args.autokill): - check_avail_gpu(min_free_ratio=0.95) - - if args.autokill: - args.kill = "ray|vllm|VLLM|python" - - # Handle kill-keywords argument if provided - if args.kill: - logger.info(f"Killing processes matching keywords: {args.kill}") - for keyword in args.kill.split("|"): - logger.info(f"Killing processes matching keyword: {keyword}") - killed_pids = fast_kill_by_keyword_bash(keyword) - if killed_pids: - logger.success(f"Successfully killed processes with PIDs: {killed_pids}") - else: - logger.warning(f"No processes found matching keyword: {keyword}") - if not args.conf: - return - - # Initialize variables with default values to avoid "possibly unbound" errors - main_yaml_fp = None - exe_exp_base = None - exp_name = None - - # switch backbone target - backbone_target = get_backbone_target(args.backbone) - - exp_config = None - exp_dir = args.exp_dir or "saved_experiments" - if args.conf: - yaml_path = args.conf - ( - main_yaml_fp, - exe_exp_base, - exp_name, - exp_config, - ) = prepare_experiment_config(yaml_path, exp_dir, args.backbone) - - env = setup_environment_vars(args, exp_config, main_yaml_fp) - if args.with_ray: - assert ( - not args.with_ray_cluster - ), "Cannot use both --with-ray and --with-ray-cluster simultaneously." - start_ray_service(args, env) - - if args.with_appworld: - pty_launch("appworld") - - if args.with_crafters: - pty_launch("crafters") - - if args.with_webshop: - pty_launch("webshop") - - if args.with_bfcl: - pty_launch("bfcl") - - if args.with_logview: - launch_logview(exp_name) - - if args.with_ray_cluster: - assert ( - not args.with_ray - ), "Cannot use both --with-ray and --with-ray-cluster simultaneously." - start_ray_service(args, env, cluster=True) - - if args.conf and main_yaml_fp and exe_exp_base and exp_config: - check_model_file_exists(exp_config) - execute_training_process( - args, - backbone_target, - main_yaml_fp, - exe_exp_base, - main_yaml_fp, - env, - exp_config, - ) - - -if __name__ == "__main__": - check_debugpy_version() - main() diff --git a/docs/en/configuration.md b/docs/en/configuration.md index 24d77151..8a64bcf6 100644 --- a/docs/en/configuration.md +++ b/docs/en/configuration.md @@ -149,7 +149,7 @@ astuner: # options: 'customized_protocol', 'rubrics_auto_grader' judge_type: customized_protocol # the package path to judge (reward) function - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge # the helper LLM model used for LLM-AS-Judge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 @@ -459,7 +459,7 @@ astuner: judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' # when `judge_type == customized_protocol` - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge # the helper LLM model used for LLM-AS-Judge alien_llm_model: qwen3-235b-a22b-instruct-2507 diff --git a/docs/en/data_generation.md b/docs/en/data_generation.md index 1103578e..65c566a6 100644 --- a/docs/en/data_generation.md +++ b/docs/en/data_generation.md @@ -4,7 +4,7 @@ `Data Generation Reader` provides an intelligent data generation method designed to simplify the creation of high-quality training data. The method is flexible and efficient, capable of generating domain-specific tasks based on few-shot examples and optional documents. ## Method -`Data Generation Reader` employs a two-stage task generation process: +`Data Generation Reader` employs a two-stage task generation process: ### Stage 1 (Optional): Document-based Data Generation This stage is optional. `Document-based Data Generation` generates knowledge-based tasks based on the provided documents. Users can provide one or more documents (supporting formats like PDF, Word, TXT, etc.): @@ -58,14 +58,14 @@ These examples will be merged with the tasks generated in the first stage to for `Data Generation Reader` can load a few user-provided tasks and optional documents (in various formats such as PDF, Word, and TXT) from a local path, then generates tasks and loads them as training tasks. ### Step 1: Prepare data -Provide a few example tasks: +Provide a few example tasks: ```json {"main_query": "What is the capital of France?", "answer": "..."} {"main_query": "How to cook pasta?", "answer": "..."} ``` -(Optional) Provide documents and place them in the specified directory: +(Optional) Provide documents and place them in the specified directory: ```bash mkdir -p dataset/document @@ -116,8 +116,8 @@ astuner: #### Method 2: Run the Generation Script ```python -from astuner.data_generator.config import * -from astuner.task_reader.data_generator_reader import DataGeneratorTaskReader +from agentscope_tuner.data_generator.config import * +from agentscope_tuner.task_reader.data_generator_reader import DataGeneratorTaskReader def run(): config = TaskReaderConfig( @@ -184,4 +184,4 @@ Based on user-provided documents (optional) and a few task examples, the `Data G | `deduplication_filter.params.db_path` | str | `./.similarity_db` | ❌ | Path to the similarity database used to cache embeddings. | | `deduplication_filter.params.model` | str | `text-embedding-v4` | ✅ | Embedding model used to compute similarity. | | `deduplication_filter.params.api_key` | str | `null` | ❌ | API key. If `null`, it will be loaded from the `DASHSCOPE_API_KEY` environment variable. | -| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | ❌ | Base URL for the embedding API. | \ No newline at end of file +| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | ❌ | Base URL for the embedding API. | diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index c8d72bb6..1e98be9d 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -150,7 +150,7 @@ astuner: experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ Implement and select the evaluation function - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ Set the model to be trained path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index 32837633..334f9855 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -14,7 +14,7 @@ Let's begin with the simplest example: a math agent with a tool call. - First, please check out the [installation guide](docs/en/installation.md) to set up the training environment. - Then, tune your first model using the minimum example below (suppose you have written an Agent called `MathToolWorkflow`). ```python - from astuner import AstunerJob + from agentscope_tuner import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index 141013ce..58a60f7e 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -20,8 +20,8 @@ These values guide the RL training process, helping agents learn which behaviors All Task Judgers inherit from `BaseJudge` and implement the `compute_reward` method: ```python -from astuner.task_judge.base_judge import BaseJudge -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class BaseJudge: def __init__(self, config): @@ -130,7 +130,7 @@ Delegates evaluation to an external environment service, useful for complex inte astuner: task_judge: judge_type: customized_protocol - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge ``` **How it works:** @@ -152,8 +152,8 @@ For specialized evaluation needs, create your own judger by inheriting `BaseJudg Create a new file (e.g., `tutorial/my_task/my_judge.py`): ```python -from astuner.task_judge.base_judge import BaseJudge -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class MyCustomJudge(BaseJudge): def __init__(self, config): @@ -213,5 +213,5 @@ class MyWorkflow(Workflow): astuner: task_judge: judge_type: customized_protocol - judge_protocol: astuner.task_judge.-> + judge_protocol: agentscope_tuner.task_judge.-> ``` diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 53dc760c..0b712c48 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -43,9 +43,9 @@ astuner: # ------------------ No need to modify ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ No need to modify ------------------ defaults: @@ -142,7 +142,7 @@ With this code, we quickly define a complete ReAct agent: Next, we implement the remaining code for training this agent: ```python -from astuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from agentscope_tuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from loguru import logger diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md index 20cff17b..c1e09a77 100644 --- a/docs/zh/configuration.md +++ b/docs/zh/configuration.md @@ -149,7 +149,7 @@ astuner: # options: 'customized_protocol', 'rubrics_auto_grader' judge_type: customized_protocol # the package path to judge (reward) function - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge # LLM, which may be used by judge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 @@ -458,7 +458,7 @@ astuner: task_judge: judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' # the package path to judge (reward) function - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge # the helper LLM model used for LLM-AS-Judge alien_llm_model: qwen3-235b-a22b-instruct-2507 diff --git a/docs/zh/data_generation.md b/docs/zh/data_generation.md index 7b5a0015..4cfaebd4 100644 --- a/docs/zh/data_generation.md +++ b/docs/zh/data_generation.md @@ -116,8 +116,8 @@ astuner: #### 方式2:单独运行生成脚本 ```python -from astuner.data_generator.config import * -from astuner.task_reader.data_generator_reader import DataGeneratorTaskReader +from agentscope_tuner.data_generator.config import * +from agentscope_tuner.task_reader.data_generator_reader import DataGeneratorTaskReader def run(): config = TaskReaderConfig( @@ -184,4 +184,4 @@ run() | `deduplication_filter.params.db_path` | str | `./.similarity_db` | ❌ | 相似度数据库存储路径,用于缓存 embedding | | `deduplication_filter.params.model` | str | `text-embedding-v4` | ✅ | 用于计算相似度的 embedding 模型 | | `deduplication_filter.params.api_key` | str | `null` | ❌ | API Key,为 `null` 时从环境变量 `DASHSCOPE_API_KEY` 加载 | -| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | ❌ | Embedding API 的基础 URL | \ No newline at end of file +| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | ❌ | Embedding API 的基础 URL | diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 0f3bd33b..8d78887f 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -115,7 +115,7 @@ astuner: experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评估函数 - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置需要训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md index 83ef9ccf..32955bd3 100644 --- a/docs/zh/quickstart.md +++ b/docs/zh/quickstart.md @@ -14,7 +14,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' * 然后,使用下面的最小示例来调优你的第一个模型(假设你已经编写了一个名为 `MathToolWorkflow` 的智能体)。 ```python - from astuner import AstunerJob + from agentscope_tuner import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md index 800c7e6d..2d01867e 100644 --- a/docs/zh/task_judger.md +++ b/docs/zh/task_judger.md @@ -20,8 +20,8 @@ Task Judger 会评估智能体的执行结果,并返回两个值: 所有 Task Judger 都继承自 `BaseJudge`,并实现 `compute_reward` 方法: ```python -from astuner.task_judge.base_judge import BaseJudge -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class BaseJudge: def __init__(self, config): @@ -130,7 +130,7 @@ astuner: astuner: task_judge: judge_type: customized_protocol - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge ``` **工作原理:** @@ -229,8 +229,8 @@ astuner: ```python import re -from astuner.task_judge.base_judge import BaseJudge -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class MyCustomJudge(BaseJudge): def __init__(self, config): @@ -307,7 +307,7 @@ class MyWorkflow(Workflow): astuner: task_judge: judge_type: customized_protocol - judge_protocol: astuner.task_judge.-> + judge_protocol: agentscope_tuner.task_judge.-> ``` ### 使用 Auto Grader diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index 7598a37a..f80dddc7 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -43,9 +43,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: @@ -138,7 +138,7 @@ ReActAgent( 接下来,我们实现训练该智能体的其余代码: ```python -from astuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from agentscope_tuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from loguru import logger diff --git a/math1.yaml b/math1.yaml deleted file mode 100644 index d8f6c23c..00000000 --- a/math1.yaml +++ /dev/null @@ -1,534 +0,0 @@ -astuner: - rollout: - agentscope_workflow: tutorial.example_math_agent.math_agent_simplify->MathToolWorkflow - project_name: astune_default_project - experiment_name: astuner_job_20251226_010400 - experiment_dir: saved_experiments/astuner_job_20251226_010400 - backbone: verl - model: - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 32 - task_reader: - type: huggingface_dat_repo - jsonl_dataset_file: - training: - file_path: /path/to/training/data.jsonl - validation: - file_path: /path/to/validation/data.jsonl - env_service: - env_type: appworld - env_url: http://127.0.0.1:8080 - env_action_preference: code - training_split: train - validation_split: dev - huggingface_dat_repo: - dataset_path: openai/gsm8k - training_split: train - validation_split: test - data_generation: - document_reader: - document_path: - - dataset/document/your-document1.pdf - - dataset/document/your-document2.pdf - languages: - - eng - chunk_size: 5120 - split_by: sentence - cache_enabled: true - query_reader: - type: jsonl_dataset_file - jsonl_dataset_file: - training: - file_path: dataset/jsonl/your-queries.jsonl - task_num: 10 - llm_model: qwen-long - llm_response_length: 8192 - num_workers: 32 - sampling_params: - temperature: 0 - deduplication_filter: - enabled: true - params: - similarity_threshold: 0.8 - db_path: ./.similarity_db - model: text-embedding-v4 - api_key: null - base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 - task_judge: - judge_type: customized_protocol - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - rubrics_auto_grader: - model_name: qwen-max - grader_mode: pointwise - language: en - query_specific_generate_number: 1 - enable_categorization: false - categories_number: 5 - grader_name: auto_grader - query_field: main_query - answer_field: final_answer - reference_field: answer - custom_evaluation_prompt: null - input_data_type: jsonl_dataset_file - jsonl_dataset_file: - training: - file_path: tutorial/example_rm_auto_grader/rubrics_train.jsonl - min_score: 0 - max_score: 1 - debug: - debug_max_parallel: 16 - debug_first_n_tasks: 2 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - debug_tensor_parallel_size: 4 - trainer_common: - val_before_train: false - val_pass_n: 4 - save_freq: 20 - test_freq: 20 - total_epochs: 50 - nnodes: 1 - n_gpus_per_node: 8 - logger: swanlab - algorithm: - adv_estimator: grpo - use_kl_in_reward: false - mini_batch_num: 1 - fsdp_config: - param_offload: true - optimizer_offload: true - optim: - lr: 1.0e-06 - use_kl_loss: true - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - ulysses_sequence_parallel_size: 1 - checkpoint_base_dir: ./saved_checkpoints - context_tracker: - context_tracker_type: linear - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - max_env_len: 4096 - execute_test: false - execute_testing_lambda: '' -actor_rollout_ref: - actor: - _target_: verl.workers.config.FSDPActorConfig - checkpoint: - _target_: verl.trainer.config.CheckpointConfig - async_save: false - load_contents: - - model - - optimizer - - extra - save_contents: - - model - - optimizer - - extra - clip_ratio: 0.2 - clip_ratio_c: 3.0 - clip_ratio_high: 0.2 - clip_ratio_low: 0.2 - entropy_checkpointing: false - entropy_coeff: 0 - entropy_from_logits_with_chunking: false - fsdp_config: - _target_: verl.workers.config.FSDPEngineConfig - forward_prefetch: false - fsdp_size: -1 - offload_policy: false - optimizer_offload: true - param_offload: true - reshard_after_forward: true - wrap_policy: - min_num_params: 0 - grad_clip: 1.0 - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - loss_agg_mode: seq-mean-token-mean - optim: - _target_: verl.workers.config.FSDPOptimizerConfig - lr: 1.0e-06 - lr_warmup_steps: -1 - lr_warmup_steps_ratio: 0.0 - min_lr_ratio: 0.0 - num_cycles: 0.5 - total_training_steps: -1 - warmup_style: constant - weight_decay: 0.01 - override_ppo_mini_batch_num: 1 - policy_loss: - _target_: verl.workers.config.PolicyLossConfig - clip_cov_lb: 1.0 - clip_cov_ratio: 0.0002 - clip_cov_ub: 5.0 - kl_cov_ratio: 0.0002 - loss_mode: vanilla - ppo_kl_coef: 0.1 - ppo_epochs: 1 - ppo_max_token_len_per_gpu: 13000 - ppo_micro_batch_size: null - ppo_micro_batch_size_per_gpu: 1 - ppo_mini_batch_size: 16 - shuffle: false - strategy: fsdp - ulysses_sequence_parallel_size: 1 - use_dynamic_bsz: true - use_fused_kernels: false - use_kl_loss: true - use_remove_padding: true - use_torch_compile: true - hybrid_engine: true - model: - custom_chat_template: null - enable_activation_offload: false - enable_gradient_checkpointing: true - exclude_modules: null - external_lib: null - fused_kernel_options: - impl_backend: torch - lora_alpha: 16 - lora_rank: 0 - override_config: {} - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - target_modules: all-linear - trust_remote_code: false - use_fused_kernels: false - use_liger: false - use_remove_padding: true - use_shm: false - nccl_timeout: 600 - profiler: - _target_: verl.utils.profiler.ProfilerConfig - all_ranks: false - discrete: false - ranks: [] - ref: - entropy_checkpointing: false - entropy_from_logits_with_chunking: false - fsdp_config: - _target_: verl.workers.config.FSDPEngineConfig - forward_prefetch: false - param_offload: true - reshard_after_forward: true - wrap_policy: - min_num_params: 0 - log_prob_max_token_len_per_gpu: 13000 - log_prob_micro_batch_size: null - log_prob_micro_batch_size_per_gpu: 4 - log_prob_use_dynamic_bsz: true - model: null - strategy: fsdp - ulysses_sequence_parallel_size: 1 - use_dynamic_bsz: true - use_torch_compile: true - rollout: - agent: - agent_loop_config_path: null - custom_async_server: - name: null - path: null - num_workers: 8 - calculate_log_probs: false - cudagraph_capture_sizes: null - custom_dataflow_cls: - name: '' - path: '' - disable_log_stats: true - do_sample: true - dtype: bfloat16 - enable_chunked_prefill: true - enforce_eager: true - engine_kwargs: - sglang: - attention_backend: null - vllm: - disable_mm_preprocessor_cache: false - swap_space: null - free_cache_engine: true - gamma: 1.0 - gpu_memory_utilization: 0.9 - ignore_eos: false - layered_summon: false - load_format: dummy_dtensor - log_prob_max_token_len_per_gpu: 13000 - log_prob_micro_batch_size: null - log_prob_micro_batch_size_per_gpu: 4 - log_prob_use_dynamic_bsz: true - max_env_len: 3000 - max_env_worker: 64 - max_model_len: 13000 - max_num_batched_tokens: 8192 - max_num_seqs: 10 - mode: async - multi_stage_wake_up: false - multi_turn: - enable: true - format: hermes - interaction_config_path: null - max_assistant_turns: null - max_parallel_calls: 1 - max_sample_per_task: 4 - max_steps: 30 - max_tool_response_length: 256 - max_user_turns: null - tokenization_sanity_check_mode: strict - tool_config_path: null - tool_response_truncate_side: middle - use_inference_chat_template: false - n: 1 - name: vllm - ppo_micro_batch_size_per_gpu: 1 - prompt_length: 3000 - response_length: 10000 - skip_dump_dir: /tmp/rollout_dump - skip_rollout: false - temperature: 0.9 - tensor_model_parallel_size: 1 - top_k: -1 - top_p: 1.0 - trace: - backend: null - token2text: false - update_weights_bucket_megabytes: 512 - val_kwargs: - do_sample: false - n: 1 - num_repeat: 1 - temperature: 0.0 - top_k: -1 - top_p: 1.0 -algorithm: - _target_: verl.trainer.config.AlgoConfig - adv_estimator: grpo - gamma: 1.0 - kl_ctrl: - _target_: verl.trainer.config.KLControlConfig - horizon: 10000 - kl_coef: 0.001 - target_kl: 0.1 - type: fixed - kl_penalty: kl - lam: 1.0 - norm_adv_by_std_in_grpo: true - pf_ppo: - reweight_method: pow - weight_pow: 2.0 - use_kl_in_reward: false - use_pf_ppo: false -critic: - _target_: verl.workers.config.FSDPCriticConfig - checkpoint: - _target_: verl.trainer.config.CheckpointConfig - async_save: false - load_contents: - - model - - optimizer - - extra - save_contents: - - model - - optimizer - - extra - cliprange_value: 0.5 - enable: null - forward_max_token_len_per_gpu: 32768 - forward_micro_batch_size: null - forward_micro_batch_size_per_gpu: null - grad_clip: 1.0 - loss_agg_mode: seq-mean-token-mean - model: - _target_: verl.workers.config.FSDPCriticModelCfg - enable_activation_offload: false - enable_gradient_checkpointing: true - external_lib: null - fsdp_config: - _target_: verl.workers.config.FSDPEngineConfig - forward_prefetch: false - fsdp_size: -1 - offload_policy: false - optimizer_offload: false - param_offload: false - reshard_after_forward: true - wrap_policy: - min_num_params: 0 - lora_alpha: 16 - lora_rank: 0 - override_config: {} - path: ~/models/deepseek-llm-7b-chat - target_modules: all-linear - tokenizer_path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - trust_remote_code: false - use_remove_padding: false - use_shm: false - optim: - _target_: verl.workers.config.FSDPOptimizerConfig - lr: 1.0e-05 - lr_warmup_steps: -1 - lr_warmup_steps_ratio: 0.0 - min_lr_ratio: null - total_training_steps: -1 - warmup_style: constant - weight_decay: 0.01 - ppo_epochs: 1 - ppo_max_token_len_per_gpu: 32768 - ppo_micro_batch_size: null - ppo_micro_batch_size_per_gpu: null - ppo_mini_batch_size: 16 - profiler: - _target_: verl.utils.profiler.ProfilerConfig - all_ranks: false - discrete: false - ranks: [] - rollout_n: 1 - shuffle: false - strategy: fsdp - ulysses_sequence_parallel_size: 1 - use_dynamic_bsz: true -custom_reward_function: - name: compute_score - path: null -data: - custom_cls: - name: null - path: null - datagen: - name: null - path: null - dataloader_num_workers: 8 - fast_eval: true - filter_overlong_prompts: true - filter_overlong_prompts_workers: 1 - image_key: images - max_prompt_length: 3000 - max_response_length: 10000 - prompt_key: prompt - return_full_prompt: false - return_multi_modal_inputs: true - return_raw_chat: true - return_raw_input_ids: false - reward_fn_key: data_source - sampler: - class_name: null - class_path: null - shuffle: true - tokenizer: null - train_batch_size: 264 - train_files: ~/data/rlhf/gsm8k/train.parquet - truncation: error - trust_remote_code: false - use_shm: false - val_batch_size: 100000000000 - val_files: ~/data/rlhf/gsm8k/test.parquet - validation_shuffle: false - video_key: videos -ray_init: - num_cpus: null - timeline_json_file: null -reward_model: - enable: false - forward_max_token_len_per_gpu: 32768 - launch_reward_fn_async: false - max_length: null - micro_batch_size: null - micro_batch_size_per_gpu: null - model: - external_lib: null - fsdp_config: - _target_: verl.workers.config.FSDPEngineConfig - forward_prefetch: false - fsdp_size: -1 - param_offload: false - reshard_after_forward: true - wrap_policy: - min_num_params: 0 - input_tokenizer: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct - path: ~/models/FsfairX-LLaMA3-RM-v0.1 - trust_remote_code: false - use_fused_kernels: false - use_remove_padding: false - use_shm: false - profiler: - _target_: verl.utils.profiler.ProfilerConfig - all_ranks: false - discrete: false - ranks: [] - reward_manager: naive - sandbox_fusion: - max_concurrent: 64 - memory_limit_mb: 1024 - url: null - strategy: fsdp - ulysses_sequence_parallel_size: 1 - use_dynamic_bsz: true -trainer: - balance_batch: true - controller_nsight_options: - cuda-graph-trace: graph - cuda-memory-usage: 'true' - trace: cuda,nvtx,cublas,ucx - critic_warmup: 0 - default_hdfs_dir: null - checkpoint_base_dir: ./saved_checkpoints - default_local_dir: ${trainer.checkpoint_base_dir}/${trainer.project_name}/${trainer.experiment_name} - del_local_ckpt_after_load: false - device: cuda - esi_redundant_time: 0 - experiment_name: read_yaml_name - hfmodelpath: '' - log_val_generations: 0 - logger: - - console - - swanlab - max_actor_ckpt_to_keep: null - max_critic_ckpt_to_keep: null - n_gpus_per_node: 8 - nnodes: 1 - npu_profile: - options: - analysis: true - level: level1 - record_shapes: false - roles: - - all - save_path: ./profiler_data - with_cpu: true - with_memory: false - with_module: false - with_npu: true - with_stack: false - profile_continuous_steps: false - profile_steps: null - project_name: project_name_placeholder - ray_wait_register_center_timeout: 300 - resume_from_path: null - resume_mode: auto - rollout_data_dir: null - save_freq: 99999 - test_freq: 99999 - total_epochs: 99999 - total_training_steps: null - use_legacy_worker_impl: auto - val_before_train: false - val_only: false - val_pass_n: 4 - validation_data_dir: null - worker_nsight_options: - capture-range: cudaProfilerApi - capture-range-end: null - cuda-graph-trace: graph - cuda-memory-usage: 'true' - kill: none - trace: cuda,nvtx,cublas,ucx -defaults: -- verl_default -- astune_default -- _self_ -hydra: - searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl diff --git a/mini_test.py b/mini_test.py index 0f41301c..b2fc9a56 100644 --- a/mini_test.py +++ b/mini_test.py @@ -1,4 +1,4 @@ -from astuner import AstunerJob +from agentscope_tuner import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" diff --git a/pyproject.toml b/pyproject.toml index 7e7c011a..c601d3d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ doc = [ ] [project.scripts] -astuner = "astuner.cli.launcher:main" +astuner = "agentscope_tuner.cli.launcher:main" [tool.setuptools.packages.find] diff --git a/pyrightconfig.json b/pyrightconfig.json index 486f9ab2..9e3b24e7 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -1,7 +1,7 @@ { "logLevel": "Debug", "include": [ - "astuner/**/*.py", + "agentscope_tuner/**/*.py", "external/trinity/**/*.py", "external/verl/**/*.py", ".venv/lib/python3.10/site-packages/**/*.py" diff --git a/tests/bench/benchmark_appworld/benchmark_appworld.py b/tests/bench/benchmark_appworld/benchmark_appworld.py index e192786e..1d2eccc0 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/benchmark_appworld.py @@ -1,7 +1,7 @@ # flake8: noqa import time -from astuner.utils.testing_utils import BenchmarkProbe, singleton +from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_appworld/benchmark_appworld.yaml b/tests/bench/benchmark_appworld/benchmark_appworld.yaml index 9b35b6d5..2fb19979 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld.yaml @@ -4,7 +4,7 @@ astuner: experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -56,9 +56,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml index 67732b50..39ffa69b 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml @@ -4,7 +4,7 @@ astuner: experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -57,9 +57,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py index 30404db3..225f38d3 100644 --- a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py @@ -1,7 +1,6 @@ import os import subprocess import time -import unittest from loguru import logger @@ -55,7 +54,7 @@ def test_02_begin_trinity(self): def clear_system_processes(self): # kill all python + ray + vllm processes - from astuner.utils.cleaner import fast_kill_by_keyword_bash + from agentscope_tuner.utils.cleaner import fast_kill_by_keyword_bash total_seconds = 15 for i in range(total_seconds): diff --git a/tests/bench/benchmark_base.py b/tests/bench/benchmark_base.py index 57cb987a..bcde7cf9 100644 --- a/tests/bench/benchmark_base.py +++ b/tests/bench/benchmark_base.py @@ -5,9 +5,12 @@ from beast_logger import print_dict -from astuner.utils.dynamic_import import dynamic_import -from astuner.utils.smart_daemon import LaunchCommandWhenAbsent -from astuner.utils.testing_utils import populate_test_env_metadata, send_test_result +from agentscope_tuner.utils.dynamic_import import dynamic_import +from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent +from agentscope_tuner.utils.testing_utils import ( + populate_test_env_metadata, + send_test_result, +) class BenchmarkTestCase(unittest.TestCase): @@ -51,7 +54,7 @@ def execute_benchmark( cmd = [ python_executable, "-m", - "astuner.cli.launcher", + "agentscope_tuner.cli.launcher", "--conf", test_target, "--backbone", diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.py b/tests/bench/benchmark_countdown/benchmark_countdown.py index 3691e8ea..ffa55091 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.py +++ b/tests/bench/benchmark_countdown/benchmark_countdown.py @@ -1,7 +1,7 @@ # flake8: noqa import time -from astuner.utils.testing_utils import BenchmarkProbe, singleton +from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.yaml b/tests/bench/benchmark_countdown/benchmark_countdown.yaml index 6eb5f25c..6779b0df 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.yaml +++ b/tests/bench/benchmark_countdown/benchmark_countdown.yaml @@ -127,9 +127,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py index 7ad3dc1e..fc9d4d9c 100644 --- a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py @@ -1,7 +1,7 @@ # flake8: noqa import time -from astuner.utils.testing_utils import BenchmarkProbe, singleton +from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml index e2494b8e..73b71bea 100644 --- a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml @@ -84,9 +84,9 @@ frozen_lake: # ------------------ do not edit ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ do not edit ------------------ defaults: diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py index 14b5a6be..825f2e32 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py @@ -1,7 +1,7 @@ # flake8: noqa import time -from astuner.utils.testing_utils import BenchmarkProbe, singleton +from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml index 08bf9777..e50895a8 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml @@ -60,9 +60,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/bench/benchmark_math/benchmark_math.py b/tests/bench/benchmark_math/benchmark_math.py index a36e1624..94d88f00 100644 --- a/tests/bench/benchmark_math/benchmark_math.py +++ b/tests/bench/benchmark_math/benchmark_math.py @@ -2,7 +2,7 @@ import os import time -from astuner.utils.testing_utils import BenchmarkProbe, singleton +from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_math/benchmark_math.yaml b/tests/bench/benchmark_math/benchmark_math.yaml index 64793313..dfb9974a 100644 --- a/tests/bench/benchmark_math/benchmark_math.yaml +++ b/tests/bench/benchmark_math/benchmark_math.yaml @@ -62,9 +62,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/config_test.py b/tests/config_test.py index fb498252..c636e589 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -3,7 +3,7 @@ import yaml -from astuner.utils.config_utils import ( +from agentscope_tuner.utils.config_utils import ( align_parameters, expand_astune_hierarchical_config, prepare_experiment_config, @@ -32,7 +32,7 @@ def test_config_alignment_trinity(self): from_config_fp = "tests/data/config.yaml" # Fixed config asset locations TRINITY_CONFIG_AUTO_CONVERSION = ( - "astuner/default_config/trinity/config_auto_convertion_trinity.jsonc" + "agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc" ) with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: @@ -74,7 +74,7 @@ def test_config_alignment_verl(self): from_config_fp = "tests/data/config.yaml" # Fixed config asset locations TRINITY_CONFIG_AUTO_CONVERSION = ( - "astuner/default_config/verl/config_auto_convertion_verl.jsonc" + "agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc" ) with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: diff --git a/tests/data_gen.py b/tests/data_gen.py index a026d219..5f9f3eb9 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -4,11 +4,11 @@ import dotenv from loguru import logger -from astuner.data_generator.knowledge_augmentation import KnowledgeAugmentor -from astuner.data_generator.task_augmentation import TaskAugmentor -from astuner.task_reader import RouterTaskReader -from astuner.task_reader.document_reader.doc_reader import DocReader -from astuner.utils.config_utils import read_astune_config +from agentscope_tuner.data_generator.knowledge_augmentation import KnowledgeAugmentor +from agentscope_tuner.data_generator.task_augmentation import TaskAugmentor +from agentscope_tuner.task_reader import RouterTaskReader +from agentscope_tuner.task_reader.document_reader.doc_reader import DocReader +from agentscope_tuner.utils.config_utils import read_astune_config dotenv.load_dotenv() diff --git a/tests/test_benchmark_report.py b/tests/test_benchmark_report.py index c8c0d488..6f005af4 100644 --- a/tests/test_benchmark_report.py +++ b/tests/test_benchmark_report.py @@ -1,7 +1,7 @@ import json import unittest -from astuner.utils.dynamic_import import dynamic_import +from agentscope_tuner.utils.dynamic_import import dynamic_import class TestDynamicImport(unittest.TestCase): diff --git a/tests/test_compute_madness.py b/tests/test_compute_madness.py index 6783351e..061e904b 100644 --- a/tests/test_compute_madness.py +++ b/tests/test_compute_madness.py @@ -1,6 +1,9 @@ -import pytest +# flake8: noqa -from astuner.utils.compute_madness import compute_string_madness, compute_string_madness_format +from agentscope_tuner.utils.compute_madness import ( + compute_string_madness, + compute_string_madness_format, +) def test_compute_string_madness_examples(): @@ -37,9 +40,14 @@ def get_song_duration(song_id, access_token): == 0 ) - assert compute_string_madness(""" + assert ( + compute_string_madness( + """ Hello <|im_start|> world! - """) == -1 + """ + ) + == -1 + ) assert ( compute_string_madness( diff --git a/tests/test_dynamic_import.py b/tests/test_dynamic_import.py index 4a9fc719..52b88ff0 100644 --- a/tests/test_dynamic_import.py +++ b/tests/test_dynamic_import.py @@ -1,7 +1,7 @@ import json import unittest -from astuner.utils.dynamic_import import dynamic_import +from agentscope_tuner.utils.dynamic_import import dynamic_import class TestDynamicImport(unittest.TestCase): diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index 2f1901d9..984130f7 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -4,9 +4,9 @@ import pytest -from astuner.task_reader.tracing_reader.filters.base import Filter -from astuner.schema.task import Task -from astuner.task_reader.tracing_reader import TracingReader +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_reader.tracing_reader import TracingReader +from agentscope_tuner.task_reader.tracing_reader.filters.base import Filter class DummyConnector: diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 98c9ba83..7ea7b46c 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -66,7 +66,7 @@ astuner experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -96,7 +96,7 @@ clear && astuner --conf tutorial/example_appworld/appworld.yaml --backbone='debu "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "astuner/cli/launcher.py", + "program": "agentscope_tuner/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py index 169c4a2f..a63f4c34 100644 --- a/tutorial/example_appworld/appworld.py +++ b/tutorial/example_appworld/appworld.py @@ -1,15 +1,13 @@ from agentscope.message import Msg from pydantic import Field -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask class ExampleAgentScopeWorkflow(Workflow): trainer: str = Field(default="astuner-trinity") - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 76bb955e..ee84bbbd 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -4,7 +4,7 @@ astuner: experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: astuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -48,9 +48,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_countdown/countdown.py b/tutorial/example_countdown/countdown.py index 3e2aeca2..e851abbe 100644 --- a/tutorial/example_countdown/countdown.py +++ b/tutorial/example_countdown/countdown.py @@ -1,9 +1,7 @@ -import json - from agentscope.message import Msg from loguru import logger -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -37,9 +35,7 @@ def extract_final_answer(result) -> str: class ExampleCountdownLearn(Workflow): name: str = "countdown_agent_workflow" - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -51,7 +47,7 @@ async def execute( nums = query_data.get("nums") # Format the query - nums_str = ", ".join(map(str, nums)) # type: ignore + nums_str = ", ".join(map(str, nums)) # type: ignore query = f"Target number: {target}\nAvailable numbers: {nums_str}\n\nPlease find a way to reach the target number using the available numbers." self.agent = ReActAgent( diff --git a/tutorial/example_countdown/countdown.yaml b/tutorial/example_countdown/countdown.yaml index 9702e8fb..0f6de6e4 100644 --- a/tutorial/example_countdown/countdown.yaml +++ b/tutorial/example_countdown/countdown.yaml @@ -138,9 +138,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_countdown/countdown_answer_as_judge.py b/tutorial/example_countdown/countdown_answer_as_judge.py index d7d41201..f766a900 100644 --- a/tutorial/example_countdown/countdown_answer_as_judge.py +++ b/tutorial/example_countdown/countdown_answer_as_judge.py @@ -1,7 +1,7 @@ import re -from astuner.task_judge.base_judge import BaseJudge -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class CountdownAnswerAsJudge(BaseJudge): diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index 072d2b63..84ba6173 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -65,9 +65,9 @@ trainer: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_feedback_tracing/train.py b/tutorial/example_feedback_tracing/train.py index 6bcb2d25..6df76a46 100644 --- a/tutorial/example_feedback_tracing/train.py +++ b/tutorial/example_feedback_tracing/train.py @@ -6,7 +6,7 @@ from loguru import logger from pydantic import BaseModel, Field -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask SYSTEM_PROMPT = """ You are an agent specialized in solving math problems with tools. @@ -44,9 +44,7 @@ class FinalResult(BaseModel): class ExampleTracingFeedbackTrain(Workflow): name: str = "tracing_feedback_train" - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: query = workflow_task.task.main_query tool_kit = Toolkit() diff --git a/tutorial/example_frozenlake/frozenlake.py b/tutorial/example_frozenlake/frozenlake.py index ba1a8a86..ca4dfd2f 100644 --- a/tutorial/example_frozenlake/frozenlake.py +++ b/tutorial/example_frozenlake/frozenlake.py @@ -18,7 +18,7 @@ from gymnasium.envs.toy_text.frozen_lake import FrozenLakeEnv as GymFrozenLakeEnv from loguru import logger -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask SYSTEM_PROMPT = """You are a helpful assistant. You are walking on a frozen lake. @@ -50,9 +50,7 @@ class FrozenLakeWorkflow(Workflow): - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: config = model_tuner.config self.env_max_steps = config.astuner.rollout.multi_turn.max_steps diff --git a/tutorial/example_frozenlake/frozenlake_easy.yaml b/tutorial/example_frozenlake/frozenlake_easy.yaml index 1ed30a91..4334f793 100644 --- a/tutorial/example_frozenlake/frozenlake_easy.yaml +++ b/tutorial/example_frozenlake/frozenlake_easy.yaml @@ -79,9 +79,9 @@ frozen_lake: # ------------------ do not edit ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ do not edit ------------------ defaults: diff --git a/tutorial/example_frozenlake/frozenlake_hard.yaml b/tutorial/example_frozenlake/frozenlake_hard.yaml index 042547e8..d051972a 100644 --- a/tutorial/example_frozenlake/frozenlake_hard.yaml +++ b/tutorial/example_frozenlake/frozenlake_hard.yaml @@ -77,9 +77,9 @@ frozen_lake: # ------------------ do not edit ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ do not edit ------------------ defaults: diff --git a/tutorial/example_learn2ask/learn2ask.py b/tutorial/example_learn2ask/learn2ask.py index d4e7dbce..4f2bf336 100644 --- a/tutorial/example_learn2ask/learn2ask.py +++ b/tutorial/example_learn2ask/learn2ask.py @@ -1,11 +1,11 @@ import re import time + from agentscope.message import Msg from loguru import logger -import asyncio -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask -from astuner.utils.robust_dashscope import RobustDashScopeChatModel +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner.utils.robust_dashscope import RobustDashScopeChatModel system_prompt = """# Task You are a medical assistant. Your task is to understand the ongoing conversation and continue the medical inquiry in English. @@ -78,8 +78,7 @@ def parse_tag_string(text: str): result[tag] = value return result - history = format_messages( - []+init_messages+[Msg("assistant", response, role="assistant")]) + history = format_messages([] + init_messages + [Msg("assistant", response, role="assistant")]) messages = [ {"role": "system", "content": reward_prompt.format(truth_info)}, {"role": "user", "content": history}, @@ -88,18 +87,18 @@ def parse_tag_string(text: str): try_count, max_retries = 0, 5 while try_count <= max_retries: try: + async def get_content(): from agentscope.model import ChatResponse + response = await llm(messages) if isinstance(response, ChatResponse): - res = ''.join([x['text'] - for x in response.content if 'text' in x]) + res = "".join([x["text"] for x in response.content if "text" in x]) else: - res = '' + res = "" async for chunk in response: - res += ''.join([x['text'] - for x in chunk.content if 'text' in x]) + res += "".join([x["text"] for x in chunk.content if "text" in x]) return res content = await get_content() @@ -138,9 +137,7 @@ async def reward_fn(init_messages: list[Msg], response: str, truth_action: str, action_score, format_score, content_score = 0.0, 0.0, 0.0 # treat as self.train_mode == "Ra+Rs", the default setting - final_reward = ( - action_score * (1 + 2 * content_score) + format_score - ) + final_reward = action_score * (1 + 2 * content_score) + format_score return final_reward @@ -148,17 +145,15 @@ async def reward_fn(init_messages: list[Msg], response: str, truth_action: str, class ExampleLearn2Ask(Workflow): name: str = "math_agent_workflow" - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory messages = workflow_task.task.init_messages assert isinstance(messages, list) - truth_action = workflow_task.task.metadata['decision_truth'] or 'continue' - truth_info = workflow_task.task.metadata['info_truth'] + truth_action = workflow_task.task.metadata["decision_truth"] or "continue" + truth_info = workflow_task.task.metadata["info_truth"] self.agent = ReActAgent( name="math_react_agent", @@ -172,13 +167,13 @@ async def execute( self.agent.set_console_output_enabled(False) msg = [ # Msg("system", system_prompt, role="system"), - *[Msg(name=x['role'],content=x['content'],role=x['role']) for x in messages] + *[Msg(name=x["role"], content=x["content"], role=x["role"]) for x in messages] ] result = await self.agent.reply(msg) - if isinstance(result.content,str): + if isinstance(result.content, str): response = result.content - elif isinstance(result.content,list): - response = result.content[0]['text'] # type: ignore + elif isinstance(result.content, list): + response = result.content[0]["text"] # type: ignore else: raise NotImplementedError(f"do not know how to handle {type(result.content)}") reward = await reward_fn(msg, response, truth_action, truth_info) diff --git a/tutorial/example_learn2ask/learn2ask.yaml b/tutorial/example_learn2ask/learn2ask.yaml index 3b71f05d..9dfe36e6 100644 --- a/tutorial/example_learn2ask/learn2ask.yaml +++ b/tutorial/example_learn2ask/learn2ask.yaml @@ -22,11 +22,11 @@ astuner: max_num_seqs: 40 multi_turn: max_sample_per_task: 2 - + compute_madness_checklist: - "nonsense" agent_madness_reward: 0.0 - + max_response_length_in_one_turn: 1024 max_model_len: 10000 n_vllm_engine: 2 @@ -56,9 +56,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index 08e43df6..56406303 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -122,7 +122,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' -- "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "astuner/cli/launcher.py", + "program": "agentscope_tuner/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index b6e0d958..2c7df366 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -1,7 +1,7 @@ from agentscope.message import Msg from loguru import logger -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -34,9 +34,7 @@ def extract_final_answer(result) -> str: class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 4e8713fa..738b77be 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -59,9 +59,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_math_agent/math_agent_simplify.py b/tutorial/example_math_agent/math_agent_simplify.py index de0d001b..59933261 100644 --- a/tutorial/example_math_agent/math_agent_simplify.py +++ b/tutorial/example_math_agent/math_agent_simplify.py @@ -3,7 +3,7 @@ from agentscope.message import Msg from loguru import logger -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -36,9 +36,7 @@ def extract_final_answer(result) -> str: class MathToolWorkflow(Workflow): name: str = "math_agent_workflow" - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory diff --git a/tutorial/example_math_agent/math_answer_as_judge.py b/tutorial/example_math_agent/math_answer_as_judge.py index d3bb3165..606b1f2a 100644 --- a/tutorial/example_math_agent/math_answer_as_judge.py +++ b/tutorial/example_math_agent/math_answer_as_judge.py @@ -1,8 +1,8 @@ import re -from astuner.task_judge.base_judge import BaseJudge -from astuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.task_judge.base_judge import BaseJudge +from agentscope_tuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class MathAnswerAsJudge(BaseJudge): diff --git a/tutorial/example_rm_auto_grader/auto_grader.md b/tutorial/example_rm_auto_grader/auto_grader.md index 9a67d274..50e41d57 100644 --- a/tutorial/example_rm_auto_grader/auto_grader.md +++ b/tutorial/example_rm_auto_grader/auto_grader.md @@ -102,7 +102,7 @@ Each sample contains a query with multiple ranked candidates: ### 3. Basic Usage ```python -from astuner.task_judge.rm_auto_grader_judge import AutoGraderJudge +from agentscope_tuner.task_judge.rm_auto_grader_judge import AutoGraderJudge # Initialize judge judge = AutoGraderJudge(config) diff --git a/tutorial/example_rm_auto_grader/auto_grader_example.py b/tutorial/example_rm_auto_grader/auto_grader_example.py index 1970ce9d..4af8323b 100644 --- a/tutorial/example_rm_auto_grader/auto_grader_example.py +++ b/tutorial/example_rm_auto_grader/auto_grader_example.py @@ -20,9 +20,9 @@ POINTWISE_EVALUATION_TEMPLATE, ) -from astuner.schema.task import Task -from astuner.task_judge.rm_auto_grader_judge import AutoGraderJudge -from astuner.workflow import WorkflowOutput, WorkflowTask +from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_judge.rm_auto_grader_judge import AutoGraderJudge +from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask # ============================================ # Example 1: Pre-generated Rubrics Approach diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index 2232ea3f..c99d2d5c 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -122,7 +122,7 @@ astuner --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='debug' "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "astuner/cli/launcher.py", + "program": "agentscope_tuner/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/tutorial/example_rubrics_judge/math_agent.py b/tutorial/example_rubrics_judge/math_agent.py index c006f6d8..d3ade27c 100644 --- a/tutorial/example_rubrics_judge/math_agent.py +++ b/tutorial/example_rubrics_judge/math_agent.py @@ -2,7 +2,7 @@ from loguru import logger from pydantic import BaseModel, Field -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -41,9 +41,7 @@ class FinalResult(BaseModel): class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml index b8910d19..24920128 100644 --- a/tutorial/example_rubrics_judge/r_judge.yaml +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -60,9 +60,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index 2f399053..f787471e 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -17,7 +17,7 @@ from loguru import logger from pydantic import BaseModel, Field -from astuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask from tutorial.example_werewolves.game import BadGuyException, werewolves_game @@ -86,9 +86,7 @@ class ExampleWerewolves(Workflow): default=["werewolf"], description="List of agents to be fine-tuned." ) - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: # ensure trainable targets is legal if "werewolf" in self.trainable_targets: assert len(self.trainable_targets) == 1, "Cannot train hostile roles simultaneously." diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index c3306eba..6524716e 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -67,7 +67,7 @@ "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "astuner/cli/launcher.py", + "program": "agentscope_tuner/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index 58e394e7..aaec31e4 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -64,9 +64,9 @@ astuner: # ------------------ do not edit ------------------ hydra: searchpath: - - file://astuner/default_config - - file://astuner/default_config/verl # verl only - - file://astuner/default_config/trinity # trinity only + - file://agentscope_tuner/default_config + - file://agentscope_tuner/default_config/verl # verl only + - file://agentscope_tuner/default_config/trinity # trinity only # ------------------ do not edit ------------------ defaults: From 3a37a6cf9a36f8d011bc4b3deb36d665ed7a4491 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 26 Dec 2025 02:08:40 +0800 Subject: [PATCH 359/462] feat: add prompt tuning to future features list in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 59ace986..79557940 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ ASTuner is a constantly evolving project. We are planning to add the following f - [ ] Advanced LLM-based multi-agent reinforcement learning. - [ ] Training dataset generation from few-shot samples. +- [ ] Prompt tuning. - [ ] Multi-modal training support. - [ ] Cross-process Tuner wrapper to pass though process forking. - [ ] Providing training → user feedback → data augmentation → retraining data flywheel example. From db26aef1be78fb149cf9aab50e80facd898d7fc9 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 26 Dec 2025 02:12:08 +0800 Subject: [PATCH 360/462] feat: add launcher back --- .gitignore | 3 +- agentscope_tuner/cli/launcher.py | 326 +++++++++++++++++++++++++++++++ 2 files changed, 327 insertions(+), 2 deletions(-) create mode 100644 agentscope_tuner/cli/launcher.py diff --git a/.gitignore b/.gitignore index 94704b1f..59bb052c 100644 --- a/.gitignore +++ b/.gitignore @@ -145,9 +145,8 @@ auto/auto_grader.json tutorial/example_math_agent/math_agent_debug.yaml saved_experiments tests/temp -launcher.py vsdb.py appworld_pack_v2.tar* saved_checkpoints data -datasets \ No newline at end of file +datasets diff --git a/agentscope_tuner/cli/launcher.py b/agentscope_tuner/cli/launcher.py new file mode 100644 index 00000000..53bf6ad0 --- /dev/null +++ b/agentscope_tuner/cli/launcher.py @@ -0,0 +1,326 @@ +import argparse +import os +import subprocess + +from dotenv import load_dotenv +from loguru import logger + +from agentscope_tuner.utils.cleaner import fast_kill_by_keyword_bash +from agentscope_tuner.utils.config_utils import prepare_experiment_config +from agentscope_tuner.utils.launch_utils import ( + execute_training_process, + launch_logview, + set_loguru_default_color, + start_ray_service, +) +from agentscope_tuner.utils.pty import pty_launch + +set_loguru_default_color() +load_dotenv() + + +def parse_args(): + parser = argparse.ArgumentParser(description="AgentScope-Tuner Launcher") + parser.add_argument( + "--backbone", + type=str, + default="trinity", + required=False, + help="verl or trinity or debug", + ) + parser.add_argument( + "--conf", + type=str, + default="", + required=False, + help="Path to configuration file", + ) + parser.add_argument( + "--exp-dir", + type=str, + default="saved_experiments", + required=False, + help="Path to experiment directory", + ) + parser.add_argument( + "--debug", + "--db", + type=str, + default="", + required=False, + help="Path to configuration file", + ) + + parser.add_argument("--with-ray", action="store_true", default=False, help="Launch ray") + parser.add_argument("--with-ray-cluster", action="store_true", default=False, help="Launch ray") + parser.add_argument( + "--with-appworld", + action="store_true", + default=False, + help="Launch appworld", + ) + parser.add_argument( + "--with-webshop", + action="store_true", + default=False, + help="Launch webshop", + ) + parser.add_argument("--with-bfcl", action="store_true", default=False, help="Launch bfcl") + parser.add_argument( + "--with-logview", + action="store_true", + default=False, + help="Launch logview", + ) + parser.add_argument( + "--with-crafters", + action="store_true", + default=False, + help="Launch Crafters Env Simulation", + ) + parser.add_argument("--reboot", action="store_true", default=False, help="reboot flag") + parser.add_argument( + "--kill", + type=str, + default="", + required=False, + help="list of keywords for killing processes", + ) + parser.add_argument( + "--autokill", + action="store_true", + default=False, + help="Kill system processes (ray + vllm + python) that may block the current experiment", + ) + return parser.parse_args() + + +def check_debugpy_version(): + try: + import debugpy + except ImportError: + raise RuntimeError( + "Module 'debugpy>=1.8.0' cannot be loaded. " + "Ray Debugpy Debugger will not work without 'debugpy>=1.8.0' installed. " + "Install this module using 'pip install debugpy>=1.8.0'" + ) + version = getattr(debugpy, "__version__", "0.0.0") + from packaging import version as packaging_version + + if packaging_version.parse(version) < packaging_version.parse("1.8.0"): + raise RuntimeError( + f"debugpy version {version} is too old. " + "Ray Debugpy Debugger requires 'debugpy>=1.8.0'. " + "Upgrade using 'pip install debugpy>=1.8.0'" + ) + logger.info(f"✓ debugpy version {version} meets requirement (>=1.8.0)") + + +def check_avail_gpu(min_free_ratio: float = 0.95): + """ + Ensure there is at least one GPU and all GPUs have >= min_free_ratio free memory. + + Uses `nvidia-smi` to query total and used memory for each GPU. + Raises RuntimeError if no GPU is found or any GPU violates the free ratio threshold. + """ + try: + # Query GPU memory via nvidia-smi; output in MiB + result = subprocess.run( + [ + "nvidia-smi", + "--query-gpu=name,memory.total,memory.used", + "--format=csv,noheader,nounits", + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + check=False, + ) + except FileNotFoundError: + raise RuntimeError("nvidia-smi not found. NVIDIA drivers/GPU may be unavailable.") + + if result.returncode != 0: + raise RuntimeError(f"Failed to query GPUs via nvidia-smi: {result.stderr.strip()}") + + lines = [line.strip() for line in result.stdout.splitlines() if line.strip()] + if not lines: + raise RuntimeError("No GPUs detected by nvidia-smi.") + + violations = [] + for idx, line in enumerate(lines): + # Expected format: ", , " + parts = [p.strip() for p in line.split(",")] + if len(parts) < 3: + violations.append((idx, "parse-error", line)) + continue + name, total_str, used_str = parts[0], parts[1], parts[2] + try: + total = float(total_str) + used = float(used_str) + except ValueError: + violations.append((idx, "parse-error", line)) + continue + free = max(total - used, 0.0) + free_ratio = free / total if total > 0 else 0.0 + logger.info( + f"GPU {idx} ({name}): total={total:.0f} MiB, used={used:.0f} MiB, free_ratio={free_ratio:.3f}" + ) + if free_ratio < min_free_ratio: + violations.append((idx, name, f"free_ratio={free_ratio:.3f} < {min_free_ratio:.3f}")) + + if violations: + details = "; ".join([f"GPU {i} ({n}): {msg}" for i, n, msg in violations]) + raise RuntimeError( + "GPU memory check failed: all GPUs must have >= " + f"{int(min_free_ratio*100)}% free. Violations: {details}" + ) + logger.info( + f"✓ GPU check passed: {len(lines)} GPUs, all >= {int(min_free_ratio*100)}% free memory" + ) + + +def get_backbone_target(backbone): + """ + Determine the appropriate backbone target module based on the backbone name. + + Args: + backbone (str): The backbone name (e.g., "verl", "debug", "trinity") + + Returns: + str: The full module path for the specified backbone + """ + backbone_target = "agentscope_tuner.backbone.main_trinity" # Default to trinity + if backbone == "verl": + backbone_target = "agentscope_tuner.backbone.main_verl" + if backbone == "debug": + backbone_target = "agentscope_tuner.backbone.main_vllm" + if backbone == "trinity": + backbone_target = "agentscope_tuner.backbone.main_trinity" + return backbone_target + + +def setup_environment_vars(args, exp_config, main_yaml_fp): + """ + Configure environment variables based on command line arguments. + + Args: + args: Command line arguments + exp_config: Experiment configuration dictionary + main_yaml_fp: Path to main YAML configuration file + + Returns: + dict: Configured environment variables dictionary + """ + env = os.environ.copy() + if args.debug: + env["RAY_DEBUG_POST_MORTEM"] = "1" + env["DEBUG_TAGS"] = args.debug + env["RAY_record_task_actor_creation_sites"] = "true" + # assert exp_config["astuner"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore + logger.warning("Debug mode is ON") + else: + logger.warning("Debug mode is OFF") + if args.conf: + assert exp_config["astuner"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore + if args.backbone == "trinity": + env["ASTUNER_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore + if args.backbone == "debug": + env["ASTUNER_DEBUG"] = "1" # type: ignore + return env + + +def check_model_file_exists(exp_config): + model_path = exp_config["astuner"]["model"]["path"] + # if model_path has more than 2 '/', we consider it as a dir path + if model_path.count("/") > 2: + assert os.path.exists( + model_path + ), f"Model path {model_path} does not exist. Please check your configuration." + + +def main(): + args = parse_args() + + # Enforce GPU availability and free memory threshold before proceeding + if (args.backbone != "debug") and (not args.kill) and (not args.autokill): + check_avail_gpu(min_free_ratio=0.95) + + if args.autokill: + args.kill = "ray|vllm|VLLM|python" + + # Handle kill-keywords argument if provided + if args.kill: + logger.info(f"Killing processes matching keywords: {args.kill}") + for keyword in args.kill.split("|"): + logger.info(f"Killing processes matching keyword: {keyword}") + killed_pids = fast_kill_by_keyword_bash(keyword) + if killed_pids: + logger.success(f"Successfully killed processes with PIDs: {killed_pids}") + else: + logger.warning(f"No processes found matching keyword: {keyword}") + if not args.conf: + return + + # Initialize variables with default values to avoid "possibly unbound" errors + main_yaml_fp = None + exe_exp_base = None + exp_name = None + + # switch backbone target + backbone_target = get_backbone_target(args.backbone) + + exp_config = None + exp_dir = args.exp_dir or "saved_experiments" + if args.conf: + yaml_path = args.conf + ( + main_yaml_fp, + exe_exp_base, + exp_name, + exp_config, + ) = prepare_experiment_config(yaml_path, exp_dir, args.backbone) + + env = setup_environment_vars(args, exp_config, main_yaml_fp) + if args.with_ray: + assert ( + not args.with_ray_cluster + ), "Cannot use both --with-ray and --with-ray-cluster simultaneously." + start_ray_service(args, env) + + if args.with_appworld: + pty_launch("appworld") + + if args.with_crafters: + pty_launch("crafters") + + if args.with_webshop: + pty_launch("webshop") + + if args.with_bfcl: + pty_launch("bfcl") + + if args.with_logview: + launch_logview(exp_name) + + if args.with_ray_cluster: + assert ( + not args.with_ray + ), "Cannot use both --with-ray and --with-ray-cluster simultaneously." + start_ray_service(args, env, cluster=True) + + if args.conf and main_yaml_fp and exe_exp_base and exp_config: + check_model_file_exists(exp_config) + execute_training_process( + args, + backbone_target, + main_yaml_fp, + exe_exp_base, + main_yaml_fp, + env, + exp_config, + ) + + +if __name__ == "__main__": + check_debugpy_version() + main() From 8f83390a37be0c222e640e283fa88aeabfc6641d Mon Sep 17 00:00:00 2001 From: binary-husky Date: Fri, 26 Dec 2025 12:31:53 +0800 Subject: [PATCH 361/462] feat: enhance Python environment verification --- agentscope_tuner/utils/launch_utils.py | 19 +++++++++++++++---- docs/en/installation.md | 5 +++-- docs/zh/installation.md | 4 ++-- pyproject.toml | 2 +- tests/bench/README.md | 10 ++++++++-- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/agentscope_tuner/utils/launch_utils.py b/agentscope_tuner/utils/launch_utils.py index 37182d8d..5dd78434 100644 --- a/agentscope_tuner/utils/launch_utils.py +++ b/agentscope_tuner/utils/launch_utils.py @@ -108,17 +108,28 @@ def start_ray_service(args, env, cluster=False): ) -def verify_python_env(args): +def verify_python_env(args, exp_config): """ Verify that the current Python environment matches the expected executable. Args: args: Command line arguments containing the expected python_executable """ + if exp_config["astuner"]["trainer_common"]["logger"] == "swanlab": + if os.environ.get("SWANLAB_API_KEY", "") == "": + cause = "SWANLAB_API_KEY is not set in the environment." + solution = "To use the swanlab logger, please set `SWANLAB_API_KEY`. Otherwise, set `astuner.trainer_common.logger=tensorboard`" + print_dict( + { + "Python Environment Check": "FAILED", + "Cause": cause, + "Solution": solution, + } + ) + time.sleep(5) + raise ImportError(cause + " " + solution) - # check: when args.backbone == "trinity", import verl, verl.__version__.startswith("0.5.0.post") import verl - if args.backbone == "trinity": if verl.__version__.startswith("0.5.0.post"): cause = "Python environment does not match current backbone 'trinity'." @@ -233,7 +244,7 @@ def execute_training_process( "YAML Config": exe_yaml_path, } ) - verify_python_env(args) + verify_python_env(args, exp_config) subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) except subprocess.CalledProcessError as e: logger.error(f"Error running subprocess: {e}") diff --git a/docs/en/installation.md b/docs/en/installation.md index 60bdfcf8..e8a1f784 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -40,7 +40,7 @@ We recommend using `uv` to manage your Python environment as it is incredibly fa uv venv --python=3.10 source .venv/bin/activate uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` @@ -48,9 +48,10 @@ We recommend using `uv` to manage your Python environment as it is incredibly fa ```bash source .venv/bin/activate uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps, export MAX_JOBS=${N_CPU} to build faster + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps, to ensure a successful installation, export MAX_JOBS=${N_CPU} to build faster, or, ensure health connection to Github to install pre-compiled wheels ``` + #### 2. Install one-click via docker If you prefer one-click dependency installation, we provide image to jump start! diff --git a/docs/zh/installation.md b/docs/zh/installation.md index 06da6aa7..b970e940 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -35,7 +35,7 @@ AgentScope-Tuner 支持多种训练后端(backbone),目前包括 `verl` uv venv --python=3.10 source .venv/bin/activate uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] - uv pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache # 提示:flash-attn 必须在其他依赖安装完成后再安装 + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` * 使用 `verl` 训练后端安装 @@ -43,7 +43,7 @@ AgentScope-Tuner 支持多种训练后端(backbone),目前包括 `verl` ```bash source .venv/bin/activate uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # 提示:flash-attn 必须在其他依赖安装完成后再安装,你可以 (1) 通过 export MAX_JOBS=${N_CPU} 加快编译速度,或者 (2) 通过确保 Github 访问畅通来直接安装预编译轮子 ``` #### 2)通过 Docker 一键安装 diff --git a/pyproject.toml b/pyproject.toml index c601d3d7..ed9dcdf6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ dependencies = [ [project.optional-dependencies] trinity = [ - "trinity-rft==0.3.3" + "trinity-rft @ git+https://github.com/modelscope/Trinity-RFT.git" ] verl = [ diff --git a/tests/bench/README.md b/tests/bench/README.md index 8f32de51..76ac7e3f 100644 --- a/tests/bench/README.md +++ b/tests/bench/README.md @@ -4,15 +4,21 @@ Note: `tests/bench` source code is for test robot only, therefore `yaml` configu - Benchmarking-docker-image for test-robot will be released in 2026 Feb. -## Running Command +## Cheat Sheet ```python +# prepare model path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen +# prepare dataset path +# prepare swanlab api + +source .venv/bin/activate + python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py python -m pytest -s tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py -python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_02_begin_trinity python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_01_begin_verl +python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_02_begin_trinity ``` From 581df6cb48f901dc42dd09a390921fbdc303ae96 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 26 Dec 2025 12:35:00 +0800 Subject: [PATCH 362/462] docs: minor fix --- README.md | 2 +- docs/en/example_app_world.md | 2 +- docs/en/example_countdown.md | 2 +- docs/en/example_math_agent.md | 2 +- docs/en/example_werewolves.md | 2 +- docs/en/intro.md | 4 ++-- docs/en/introduction.md | 4 ++-- docs/en/quickstart.md | 4 ++-- docs/zh/example_app_world.md | 2 +- docs/zh/example_countdown.md | 2 +- docs/zh/example_math_agent.md | 2 +- docs/zh/example_werewolves.md | 2 +- docs/zh/intro.md | 6 +++--- docs/zh/introduction.md | 6 +++--- docs/zh/quickstart.md | 4 ++-- tutorial/example_appworld/appworld.md | 8 ++++---- tutorial/example_math_agent/math_agent.md | 8 ++++---- tutorial/example_math_agent/math_agent.yaml | 2 +- tutorial/example_rubrics_judge/math_agent.md | 8 ++++---- tutorial/example_werewolves/werewolves.md | 8 ++++---- 20 files changed, 40 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 79557940..613bb26c 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Let's begin with the simplest example: a math agent with a tool call. ```python from agentscope_tuner import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow - model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" + model_path = "YOUR_MODEL_PATH" job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) job.set_workflow(MathToolWorkflow) job.set_data(type="hf", dataset_path='openai/gsm8k') diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index 1e98be9d..a169d90b 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -153,7 +153,7 @@ astuner: judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ Set the model to be trained - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH rollout: # ✨✨✨✨ Implement and select the Agent agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index 665661a9..4c0260b5 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -129,7 +129,7 @@ astuner: judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge model: # ✨✨✨✨ Set the model to be trained - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct + path: YOUR_MODEL_PATH ``` ### 3.3 Code Map diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index 461a81c4..b54981b6 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -121,7 +121,7 @@ astune: judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge model: - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH ``` #### 3.3 Code Walkthrough diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index a564d335..113f581d 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -90,7 +90,7 @@ astuner: judge_protocol: null model: # Set the model to be trained - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH rollout: # Select the AgentScope Workflow entry agentscope_workflow: tutorial.example_werewolves.start->ExampleWerewolves diff --git a/docs/en/intro.md b/docs/en/intro.md index 54fcae85..c76fd50a 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -11,9 +11,9 @@ Simply provide your AgentScope workflow, training data, and reward function, and We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: - **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. -- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) as tutorials. +- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](#example-library) as tutorials. - **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. -- **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a timeline merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. ASTuner supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: diff --git a/docs/en/introduction.md b/docs/en/introduction.md index aeccead9..098c899c 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -11,9 +11,9 @@ Simply provide your AgentScope workflow, training data, and reward function, and We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: - **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. -- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) as tutorials. +- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](#example-library) as tutorials. - **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. -- **Flexible and Fast**. ASTuner supports [multi-agent workflows](./workflow.md) and adopts a timeline merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. ASTuner supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index 334f9855..fafe28a0 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -11,12 +11,12 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' Let's begin with the simplest example: a math agent with a tool call. -- First, please check out the [installation guide](docs/en/installation.md) to set up the training environment. +- First, please check out the [installation guide](./installation.md) to set up the training environment. - Then, tune your first model using the minimum example below (suppose you have written an Agent called `MathToolWorkflow`). ```python from agentscope_tuner import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow - model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" + model_path = "YOUR_MODEL_PATH" job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) job.set_workflow(MathToolWorkflow) job.set_data(type="hf", dataset_path='openai/gsm8k') diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 8d78887f..6e98e1d7 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -118,7 +118,7 @@ astuner: judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置需要训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH rollout: # ✨✨✨✨ 编写并选择智能体 agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index b685eadb..ddc70803 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -105,7 +105,7 @@ astuner: judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge model: # ✨✨✨✨ 设置需要训练的模型 - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct + path: YOUR_MODEL_PATH ``` ### 3.3 代码解读 diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index 7e401938..ab573c87 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -125,7 +125,7 @@ astune: judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge model: - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH ``` diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index da7b9ccc..fccf3f5b 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -68,7 +68,7 @@ astuner: judge_protocol: null model: # 设置需要训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH rollout: # 选择 AgentScope Workflow 的入口 agentscope_workflow: tutorial.example_werewolves.start->ExampleWerewolves diff --git a/docs/zh/intro.md b/docs/zh/intro.md index 77493e56..3ad55e75 100644 --- a/docs/zh/intro.md +++ b/docs/zh/intro.md @@ -11,9 +11,9 @@ 我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: * **简单友好**:ASTuner 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 -* **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 +* **丰富的教程库**:ASTuner 提供了丰富的[示例库](#id6)作为学习教程。 * **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 -* **灵活且快速**:ASTuner 支持 [多智能体工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging)。当工作流涉及多轮(或多智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 +* **灵活且快速**:ASTuner 支持 [多智能体工作流](./workflow.md),并采用了上下文合并技术。当工作流涉及多轮(或多智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 * **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 针对进阶研究者,ASTuner 还提供了高分辨率的日志记录和调试方案: @@ -74,7 +74,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。
-image +image
diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index 7502e95d..95838480 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -11,10 +11,10 @@ 我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: * **简单友好**:ASTuner 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 -* **丰富的教程库**:ASTuner 提供了丰富的 [示例库](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) 作为学习教程。 +* **丰富的教程库**:ASTuner 提供了丰富的 [示例库](#id6) 作为学习教程。 * **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 -* **灵活且快速**:ASTuner 支持 [多智能体工作流](./workflow.md),并采用了时间线合并技术(Timeline Merging)。当工作流涉及多轮(或多 智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 -* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.智能体-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 +* **灵活且快速**:ASTuner 支持 [多智能体工作流](./workflow.md),并采用了上下文合并技术。当工作流涉及多轮(或多 智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 +* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 针对进阶研究者,ASTuner 还提供了高分辨率的日志记录和调试方案: diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md index 32955bd3..b9c3b534 100644 --- a/docs/zh/quickstart.md +++ b/docs/zh/quickstart.md @@ -10,13 +10,13 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 我们从最简单的示例开始:一个带工具调用的数学智能体。 -* 首先,请查看 [installation guide](docs/en/installation.md) 来搭建训练环境。 +* 首先,请查看 [installation guide](./installation.md) 来搭建训练环境。 * 然后,使用下面的最小示例来调优你的第一个模型(假设你已经编写了一个名为 `MathToolWorkflow` 的智能体)。 ```python from agentscope_tuner import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow - model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" + model_path = "YOUR_MODEL_PATH" job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) job.set_workflow(MathToolWorkflow) job.set_data(type="hf", dataset_path='openai/gsm8k') diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 7ea7b46c..712a39fc 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -69,7 +69,7 @@ astuner judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH rollout: # ✨✨✨✨ 编写并选择Agent agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow @@ -134,9 +134,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout + - /astuner/astuner/saved_experiments + - /astuner/astuner/saved_experiments/exp_yaml_file_name + - /astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index 56406303..cb43ca23 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -102,7 +102,7 @@ astuner judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH ``` @@ -159,9 +159,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout + - /astuner/astuner/saved_experiments + - /astuner/astuner/saved_experiments/exp_yaml_file_name + - /astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 738b77be..4c6f3892 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,7 +15,7 @@ astuner: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + path: Qwen/Qwen2.5-7B rollout: agentscope_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index c99d2d5c..1ef3fef2 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -102,7 +102,7 @@ astuner judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH ``` @@ -159,9 +159,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout + - /astuner/astuner/saved_experiments + - /astuner/astuner/saved_experiments/exp_yaml_file_name + - /astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index 6524716e..9aca0f8b 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -45,7 +45,7 @@ judge_protocol: null model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + path: YOUR_MODEL_PATH rollout: agentscope_workflow: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent ``` @@ -105,9 +105,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name - - /mnt/data/qingxu.fu/astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout + - /astuner/astuner/saved_experiments + - /astuner/astuner/saved_experiments/exp_yaml_file_name + - /astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 From 383b94ced4476634aae1b7b3dacbc0cb5355f757 Mon Sep 17 00:00:00 2001 From: binary-husky Date: Fri, 26 Dec 2025 15:24:55 +0800 Subject: [PATCH 363/462] explicitly disable critic init --- .../default_config/verl/verl_default.yaml | 2 +- docs/en/hardware_related_solution.md | 20 +++++++++++++++++++ docs/en/installation.md | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 docs/en/hardware_related_solution.md diff --git a/agentscope_tuner/default_config/verl/verl_default.yaml b/agentscope_tuner/default_config/verl/verl_default.yaml index 4ebda602..2f8a1730 100644 --- a/agentscope_tuner/default_config/verl/verl_default.yaml +++ b/agentscope_tuner/default_config/verl/verl_default.yaml @@ -231,7 +231,7 @@ critic: - optimizer - extra cliprange_value: 0.5 - enable: null + enable: false forward_max_token_len_per_gpu: 32768 forward_micro_batch_size: null forward_micro_batch_size_per_gpu: null diff --git a/docs/en/hardware_related_solution.md b/docs/en/hardware_related_solution.md new file mode 100644 index 00000000..d19f5942 --- /dev/null +++ b/docs/en/hardware_related_solution.md @@ -0,0 +1,20 @@ +This document records a list of **Hardware Related** issues for future reference. + +## 1. ncclUnhandledCudaError: Call to CUDA function failed. + +- Problem: + + ```python + File "/root/agentscope-tuner/.venv/lib/python3.10/site-packages/torch/distributed/utils.py", line 322, in _sync_params_and_buffers + dist._broadcast_coalesced( + torch.distributed.DistBackendError: NCCL error in: /pytorch/torch/csrc/distributed/c10d/NCCLUtils.cpp:77, unhandled cuda error (run with NCCL_DEBUG=INFO for details), NCCL version 2.26.2 + ncclUnhandledCudaError: Call to CUDA function failed. + Last error: + Cuda failure 1 'invalid argument' + ``` + +- Solution: + + ```bash + export NCCL_NVLS_ENABLE=0 + ``` \ No newline at end of file diff --git a/docs/en/installation.md b/docs/en/installation.md index e8a1f784..a182bb16 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -46,6 +46,7 @@ We recommend using `uv` to manage your Python environment as it is incredibly fa - Install with `verl` training backbone. ```bash + uv venv --python=3.10 source .venv/bin/activate uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps, to ensure a successful installation, export MAX_JOBS=${N_CPU} to build faster, or, ensure health connection to Github to install pre-compiled wheels From fbee2689739315e59a60800bb0175639f1cf45eb Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 26 Dec 2025 15:54:07 +0800 Subject: [PATCH 364/462] docs: restructure README with improved organization and clarity --- README.md | 165 ++++++++++++++++++++---------------------------------- 1 file changed, 61 insertions(+), 104 deletions(-) diff --git a/README.md b/README.md index 613bb26c..d3eca760 100644 --- a/README.md +++ b/README.md @@ -16,28 +16,20 @@ Simply provide your AgentScope workflow, training data, and reward function, and Let's begin with the simplest example: a math agent with a tool call. - First, please check out the [installation guide](docs/en/installation.md) to set up the training environment. -- Then, tune your first model using the minimum example below (suppose you have written an Agent called `MathToolWorkflow`). +- Then, tune your first model using the minimum example. ```python - from agentscope_tuner import AstunerJob - from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow - model_path = "YOUR_MODEL_PATH" - job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) - job.set_workflow(MathToolWorkflow) - job.set_data(type="hf", dataset_path='openai/gsm8k') - # [Optional: Save yaml file for manual adjustment] job.dump_job_as_yaml('saved_experiments/math.yaml') - # [Optional: Load yaml file from manual adjustment] job.load_job_from_yaml('saved_experiments/math.yaml') - tuned_model = job.tune() # Equivalent to `astuner --conf ./saved_experiments/math.yaml` in the terminal + astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -## 🚀 Features +## Features We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: - **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](docs/en/installation.md) backbone. -- **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a timeline merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: @@ -46,77 +38,89 @@ For advanced researchers, ASTuner also provides high-resolution logging and debu - **High-Resolution Logging**: ASTuner allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. - **Fast Debugging**: ASTuner also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. +--- -## 🪐Getting Started +### 🚀 Quick Start -### Getting Started: Installation +#### Installation -There are many options to install AgentScope-Tuner (ASTuner). Please refer to [`installation.md`](docs/en/installation.md) for detailed guidelines. Here we demonstrate how to install ASTuner using uv. +We recommend using `uv` for dependency management. -1. Clone the Repository. -Clone the AgentScope Tuner repository from GitHub and navigate into the project directory: - ```bash - git clone https://github.com/agentscope-ai/agentscope-tuner.git - cd agentscope-tuner - ``` +1. **Clone the Repository**: +```bash +git clone https://github.com/agentscope-ai/agentscope-tuner.git +cd agentscope-tuner +``` -2. Set up dependencies. - ```bash - uv venv --python=3.10 && source .venv/bin/activate - uv pip install -e .[trinity] # or `uv pip install -e .[verl]` if you prefer using verl as backbone - uv pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps - ``` -### Getting Started: Tutorial Example Library +2. **Set up Environment**: +```bash +uv venv --python=3.10.16 && source .venv/bin/activate +uv pip install -e .[trinity] +# Note: flash-attn must be installed after other dependencies +uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir +``` -Explore our rich library of examples to kickstart your journey: -- 🚀 [**Training a math agent that can write python code**](docs/en/example_math_agent.md). -- 🍳 [**Developing Werewolves RPG agents and training them**](docs/en/example_werewolves.md). -- ⚙️ [**Learning to ask questions like a doctor**](docs/en/example_learning_to_ask.md). -- 💼 [**Creating an AppWorld agent using AgentScope and training it**](docs/en/example_app_world.md). -- 📊 [**Writing a countdown game using AgentScope and solving it**](docs/en/example_countdown.md). -- 🚀 [**Solving a frozen lake walking puzzle using ASTuner**](docs/en). -- 📔 [**Learn how to train using user feedback tracing**](tutorial/example_feedback_tracing/README.md). +#### Run Training + +You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](docs/en/example_math_agent.md) as an example: + +```bash +astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +``` +#### Example Library + +Explore our rich library of examples to kickstart your journey: -## 💡 Architecture +- 🔢 [**Training a math agent that can write python code**](docs/en/example_math_agent.md). +- 📱 [**Creating an AppWorld agent using AgentScope and training it**](docs/en/example_app_world.md). +- 🐺 [**Developing Werewolves RPG agents and training them**](docs/en/example_werewolves.md). +- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](docs/en/example_learning_to_ask.md). +- 🎴 [**Writing a countdown game using AgentScope and solving it**](docs/en/example_countdown.md). +- 🚶 [**Solving a frozen lake walking puzzle using ASTuner**](docs/en/example_frozenlake.md). -AgentScope Tuner makes agent fine-tuning unprecedentedly straightforward. It encapsulates complex fine-tuning training into a simple module driven by three core inputs: -- **Workflow**: User-defined agent workflow to finish customized tasks. Accepts single-agent or multi-agent workflows, including workflows that mix trainable and non-trainable agents. -- **Task Dataset**: Tasks used in reinforcement learning or a Gym environment, expected to contain a training set and a validation set. -- **Task Judge**: User-defined reward function used to generate a score after each workflow episode. **If the workflow computes reward inside itself** and returns a non-empty reward, the task judge will be **ignored**. +--- +### 🧩 Core Concepts +ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic.
image
-Of course, fine-tuning the workflow would not be possible without the support of the following core modules: +#### 1. The User-Centric Interface -- Launcher Module: Routing program according to `--backbone`. Managing background service processes. -- Task Rollout Module: Unifying LLM engine APIs and managing the Gym environment and retry mechanism. -- Task Runner Module: Running the **Workflow** and **Task Judge**. -- Model Tuner Module: Forwarding the request to the LLM engine. -- Context Tracker Module: Tracking LLM requests and responses, automatically merging shared-history timelines, and generating training samples. +To optimize an agent, you provide three core inputs: +* [**Trainable Workflow**](docs/en/workflow.md): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. +* [**Task Reader**](docs/en/data_pipeline.md): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. +* [**Task Judger**](docs/en/task_judger.md): Evaluates agent outputs and assigns rewards to guide training. +#### 2. Internal System Architecture +The internal system orchestrates several specialized modules to handle the complexities of RL training and agent interactions. +* **Launcher**: Manages background service processes (Ray, vLLM) and routes the backbone. +* **Task Reader**: Handles data ingestion, augmentation, and filtering. +* **Task Rollout**: Bridges LLM engines and manages the Gym environment lifecycle. +* **Task Runner**: Executes the AgentScope workflow and calculates rewards. +* **Model Tuner**: Forwards inference requests from the workflow to the LLM engine. +* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **3x to 10x**. - - - - - - - - - +--- + +### 🚦 Navigation + +* 📖 **Tutorials**: From [Installation](docs/en/installation.md) to [Tuning your first agent](docs/en/tutorial.md) — the essential path for beginners. +* 🛠️ **Core Components**: Define your [Trainable Workflow](docs/en/workflow.md) and manage [Data](docs/en/data_pipeline.md) and [Reward](docs/en/tune_your_first_agent.md). +* 💡 **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](docs/en/example_math_agent.md), [Werewolves game](docs/en/example_werewolves.md) and [Learning to ask task](docs/en/example_learning_to_ask.md). +* ⚙️ **Deep Dive**: Master advanced [Configuration](docs/en/configuration.md). ## 🗺️ Roadmap @@ -130,51 +134,4 @@ ASTuner is a constantly evolving project. We are planning to add the following f - [ ] Providing training → user feedback → data augmentation → retraining data flywheel example. - [ ] Optimize configurations for long-context adaptation on smaller GPUs. - [ ] Add LoRA training examples. -- [ ] Covering LangGraph and AutoGen frameworks. - - - - - - - - - - - - - +- [ ] Covering LangGraph and AutoGen frameworks. \ No newline at end of file From 44fb325115fa98e4f2b5f65503c514fbbc3e3507 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 26 Dec 2025 16:34:41 +0800 Subject: [PATCH 365/462] docs: replace AppWorld environment setup instructions --- docs/zh/example_app_world.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 6e98e1d7..2cfd0383 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -18,10 +18,26 @@ AppWorld 是一个模拟现实 APP 操作的沙盒环境,包含 9 个日常应 首先,需要准备 AppWorld 所需的环境服务: -- 下载并部署 `env_service` -- 下载并部署 `appworld` +```bash +base_path="/tmp" +export APPWORLD_PATH="${base_path}/pack_all_in_one" +export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" + +rm -rf "${APPWORLD_PATH}" +rm -f ./appworld_pack_v2.tar.gz + +wget -q "https://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/astuner_archive/appworld_pack_v2.tar.gz" -O appworld_pack_v2.tar.gz +tar -xzf ./appworld_pack_v2.tar.gz -C "${base_path}" +``` + +然后,设置如下的环境变量(在开启新的 shell 窗口都需要运行): + +```bash +export BASE_PATH=/tmp +export APPWORLD_PATH="${BASE_PATH}/pack_all_in_one" +export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" +``` -详细的安装与启动步骤,请参考 [EnvService 文档](https://modelscope.github.io/AgentEvolver/tutorial/install/#step-2-setup-env-service-appworld-as-example)。 ### 2.2 开始训练 From 91372d4dcbd15fe37df6e33ae9ca05d464089aa6 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 26 Dec 2025 16:42:28 +0800 Subject: [PATCH 366/462] docs: update VSCode debug --- docs/en/example_app_world.md | 4 ++-- docs/en/example_countdown.md | 4 ++-- docs/en/example_frozenlake.md | 4 ++-- docs/en/example_math_agent.md | 4 ++-- docs/en/example_werewolves.md | 4 ++-- docs/en/tune_your_first_agent.md | 34 +++++++++++++++----------------- docs/zh/example_math_agent.md | 4 ++-- docs/zh/tune_your_first_agent.md | 34 +++++++++++++++----------------- 8 files changed, 44 insertions(+), 48 deletions(-) diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index a169d90b..08d037c6 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -59,7 +59,7 @@ clear && \ astuner --conf tutorial/example_appworld/math_agent.yaml --backbone='debug' --with-logview ``` -When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: +When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: ```json { @@ -69,7 +69,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` lik "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "module": "agentscope_tuner.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index 4c0260b5..dff09217 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -47,7 +47,7 @@ clear && \ astuner --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview ``` -When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: +When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: ```json { @@ -57,7 +57,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` lik "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "module": "agentscope_tuner.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index 16664802..0fcb05c4 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -45,7 +45,7 @@ clear && \ astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview ``` -When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: +When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: ```json { @@ -55,7 +55,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` lik "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "module": "agentscope_tuner.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index b54981b6..ce4f592f 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -52,7 +52,7 @@ clear && \ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview ``` -When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: +When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: ```json { @@ -62,7 +62,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` lik "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "module": "agentscope_tuner.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index 113f581d..878e95b6 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -42,7 +42,7 @@ clear && \ astuner --conf tutorial/example_werewolves/math_agent.yaml --backbone='debug' --with-logview ``` -When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` like below: +When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: ```json { @@ -52,7 +52,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `launch.json` lik "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "module": "agentscope_tuner.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 0b712c48..c332e836 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -306,27 +306,25 @@ Start training in debug mode: astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview ``` -In debug mode, the Ray cluster will not be started, which is very suitable for single-machine debugging. In addition, you can configure `launch.json` in VS Code to conveniently debug with breakpoints: +In debug mode, the Ray cluster will not be started, which is very suitable for single-machine debugging. In addition, you can configure `.vscode/launch.json` in VS Code to conveniently debug with breakpoints: ```json { - - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "program": "launcher.py", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "xxxx/xxxx/xxxx.yaml" - ], - "env": { - } - }, - ] + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "module": "agentscope_tuner.cli.launcher", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "math_agent/math_agent.yaml" + ], + "env": {} + } + ] } ``` diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index ab573c87..6769d4fa 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -52,7 +52,7 @@ clear && \ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview ``` -当 `--backbone=debug` 时,Ray 会被禁用。你可以使用类似下面的 VSCode `launch.json`: +当 `--backbone=debug` 时,Ray 会被禁用。你可以使用类似下面的 VSCode `.vscode/launch.json`: ```json { @@ -62,7 +62,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' -- "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "launcher.py", + "module": "agentscope_tuner.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index f80dddc7..e344ffea 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -297,27 +297,25 @@ trinity: astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview ``` -debug 模式不会启动 ray 集群,非常适合单机代码调试。另外,我们也可以编写 VS Code 的 `launch.json` 进行便捷的断点调试: +debug 模式不会启动 ray 集群,非常适合单机代码调试。另外,我们也可以编写 VS Code 的 `.vscode/launch.json` 进行便捷的断点调试: ```json { - - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "program": "launcher.py", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "xxxx/xxxx/xxxx.yaml" - ], - "env": { - } - }, - ] + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "module": "agentscope_tuner.cli.launcher", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "math_agent/math_agent.yaml" + ], + "env": {} + } + ] } ``` From 1d3c03ac89a1c8f167bf6b1a680049f2e1a01cd4 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 26 Dec 2025 16:42:39 +0800 Subject: [PATCH 367/462] docs: clarify reward scoring for conversation ending in learning to ask example --- docs/en/example_learning_to_ask.md | 4 ++-- docs/zh/example_learning_to_ask.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index 7e0f871a..9eeab5ab 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -106,12 +106,12 @@ At the code level, everything is implemented in `tutorial/example_learn2ask/lear - It outputs two scores: **Format Score** + **Content Score** (scored separately, then combined by `reward_fn` into the training reward). **Format Score**: scored by the number of questions in the doctor’s last message -- 1.0: exactly **one question** +- 1.0: exactly **one question**, or correctly output `` when no question is needed - 0.5: **two questions** - 0.0: **three or more questions** **Content Score**: scored by whether the question targets the “missing information” in `Reference Information` (i.e., information the doctor does not yet know) -- 1.0: the question **directly asks about** an item in `Reference Information` +- 1.0: the question **directly asks about** an item in `Reference Information`, or correctly end the conversation when no more information is needed - 0.1: the question is too generic (a general question that could apply to almost any symptom) - 0.0: the question is **irrelevant** to the missing items in `Reference Information` - Additionally: **ambiguous or uninformative questions are treated as low-quality** (e.g., unclear references), and will typically receive a score of 0 or close to 0 diff --git a/docs/zh/example_learning_to_ask.md b/docs/zh/example_learning_to_ask.md index 47279088..c1d59246 100644 --- a/docs/zh/example_learning_to_ask.md +++ b/docs/zh/example_learning_to_ask.md @@ -103,12 +103,12 @@ astune: - 输出两个分数:**Format Score** + **Content Score**(分别打分,后续由 `reward_fn` 组合成训练用 reward)。 **Format Score(格式分)**:根据“最后一句话里问题的数量”计分 -- 1.0:恰好 **1 个问题** +- 1.0:恰好 **1 个问题**,或者在判断对话结束时正确输出了 `` - 0.5:包含 **2 个问题** - 0.0:包含 **3 个及以上问题** **Content Score(内容分)**:根据问题是否命中 `Reference Information` 中“医生尚未知晓的缺失信息”计分 -- 1.0:问题**直接询问** `Reference Information` 里的某个缺失项 +- 1.0:问题**直接询问** `Reference Information` 里的某个缺失项,或者在信息足够时及时结束对话 - 0.1:问题过于泛化(对任何症状都适用的通用问题) - 0.0:问题与 `Reference Information` 的缺失项**无关** - 另外:**含糊/无信息量的问题按低质量处理**(例如指代不明的提问),通常会得到 0 或接近 0 的得分 From 17c20b4ddbb782466767f6dd8e59e1caea82d2e1 Mon Sep 17 00:00:00 2001 From: binary-husky Date: Fri, 26 Dec 2025 17:19:52 +0800 Subject: [PATCH 368/462] feat: add n_gpu_for_infer parameter and validation for trinity backbone; update default config --- agentscope_tuner/cli/job.py | 11 +++++++++++ agentscope_tuner/default_config/astune_default.py | 2 ++ agentscope_tuner/default_config/astune_default.yaml | 2 +- mini_test.py | 8 ++++---- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/agentscope_tuner/cli/job.py b/agentscope_tuner/cli/job.py index 49f3d8b6..feeac2ca 100644 --- a/agentscope_tuner/cli/job.py +++ b/agentscope_tuner/cli/job.py @@ -41,6 +41,8 @@ def __init__( model: str = "Qwen/Qwen2___5-7B-Instruct", n_gpu: int = 8, algorithm: str = "grpo", + n_gpu_for_infer: int | None = None, # only for trinity backbone + *kwargs, ) -> None: self.backbone = backbone self.config_as_dict: dict = self.build_job_from_yaml(None) @@ -50,6 +52,15 @@ def __init__( self.config.astuner.model.path = model self.config.astuner.trainer_common.n_gpus_per_node = n_gpu self.config.astuner.trainer_common.algorithm.adv_estimator = algorithm + if n_gpu_for_infer is None and backbone == "trinity": + raise ValueError("Please specify `n_gpu_for_infer` (n_gpu_for_infer < n_gpu) for trinity backbone.") + if n_gpu_for_infer is not None and backbone == "verl": + raise ValueError("n_gpu_for_infer is only for trinity backbone, please set it to `None`.") + else: + assert isinstance(n_gpu_for_infer, int) + assert n_gpu_for_infer < n_gpu, "`n_gpu_for_infer` should be less than `n_gpu`." + self.config.astuner.rollout.n_vllm_engine = n_gpu_for_infer + self.config.astuner.rollout.tensor_model_parallel_size = 1 def build_job_from_yaml(self, yaml_path: str | None) -> dict: self.exp_name = datetime.now().strftime("astuner_job_%Y%m%d_%H%M%S") diff --git a/agentscope_tuner/default_config/astune_default.py b/agentscope_tuner/default_config/astune_default.py index f106481a..7fb7fc0e 100644 --- a/agentscope_tuner/default_config/astune_default.py +++ b/agentscope_tuner/default_config/astune_default.py @@ -28,6 +28,8 @@ class AstunerData: @dataclass class AstunerRollout: agentscope_workflow: str = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow" + n_vllm_engine: int = 1 + tensor_model_parallel_size: int = 1 @dataclass diff --git a/agentscope_tuner/default_config/astune_default.yaml b/agentscope_tuner/default_config/astune_default.yaml index 17e2c236..ea8b463a 100644 --- a/agentscope_tuner/default_config/astune_default.yaml +++ b/agentscope_tuner/default_config/astune_default.yaml @@ -60,7 +60,7 @@ astuner: tensor_model_parallel_size: 1 # the number of vllm engines, number of gpus for infer is `n_vllm_engine*tensor_model_parallel_size`, this argument is NOT effective when NOT using trinity - n_vllm_engine: 2 + n_vllm_engine: 1 # how many sequences are allowed to be processed in parallel by each vllm engine max_num_seqs: 10 diff --git a/mini_test.py b/mini_test.py index b2fc9a56..aa533c19 100644 --- a/mini_test.py +++ b/mini_test.py @@ -1,12 +1,12 @@ from agentscope_tuner import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow -model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct" -job = AstunerJob(backbone="verl", n_gpu=8, algorithm="grpo", model=model_path) +model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-1___5B-Instruct" +job = AstunerJob(backbone="trinity", n_gpu=2, n_gpu_for_infer=1, algorithm="grpo", model=model_path) job.set_workflow(MathToolWorkflow, ensure_reward_in_workflow=True) job.set_data(type="hf", dataset_path="openai/gsm8k") -# [Optional] job.dump_job_as_yaml('saved_experiments/math.yaml') # Save yaml file for manual adjustment -# [Optional] job.load_job_from_yaml('saved_experiments/math.yaml') # Load yaml file from manual adjustment +# [Optional] job.dump_job_as_yaml('./saved_experiments/math.yaml') # Save yaml file for manual adjustment +# [Optional] job.load_job_from_yaml('./saved_experiments/math.yaml') # Load yaml file from manual adjustment # Equivalent to `astuner --conf ./saved_experiments/math.yaml` in the terminal tuned_model = job.tune() From 093be06d3f1433cbe3609d063358e3182e458030 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sat, 27 Dec 2025 20:46:32 +0800 Subject: [PATCH 369/462] add deploy model script --- scripts/deploy_model.py | 114 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 scripts/deploy_model.py diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py new file mode 100644 index 00000000..cbecb89a --- /dev/null +++ b/scripts/deploy_model.py @@ -0,0 +1,114 @@ +import argparse +import os +import sys + +import torch + +# Add current directory to path before other imports +sys.path.append(os.getcwd()) # noqa: E402 + +from loguru import logger # noqa: E402 + +from agentscope_tuner.utils.cleaner import fast_kill_by_keyword_bash # noqa: E402 +from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent # noqa: E402 + +parser = argparse.ArgumentParser(description="deploy Hugging Face model") +parser.add_argument( + "--target", + default="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-235B-A22B-Instruct-2507/", + type=str, + help="Model path", +) +parser.add_argument( + "--alias", + default="Qwen/Qwen3-235B-A22B-Instruct-2507", + type=str, + help="Model alias", +) +parser.add_argument( + "--kill", + default="", + type=str, + help="Keywords to kill related processes, separated by |", +) +parser.add_argument( + "--autokill", + default=False, + action="store_true", + help="Automatically kill related processes", +) +parser.add_argument("--port", default="2888", type=str, help="Port number") +args = parser.parse_args() + +if args.autokill: + args.kill = "ray|vllm|VLLM|python" + +# Handle kill-keywords argument if provided +if args.kill: + logger.info(f"Killing processes matching keywords: {args.kill}") + for keyword in args.kill.split("|"): + logger.info(f"Killing processes matching keyword: {keyword}") + killed_pids = fast_kill_by_keyword_bash(keyword) + if killed_pids: + logger.success(f"Successfully killed processes with PIDs: {killed_pids}") + else: + logger.warning(f"No processes found matching keyword: {keyword}") + + +def companion_launch(): + print("Launching companion process for async LLM server...") + model_path = args.target + n_avail_gpus = torch.cuda.device_count() + tensor_parallel_size = n_avail_gpus + if tensor_parallel_size > n_avail_gpus: + print( + f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." + ) + tensor_parallel_size = n_avail_gpus + + # gpu_memory_utilization = 0.95 + # max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs + # max_model_len = config.astune.rollout.max_model_len + # seed = config.astune.debug.debug_vllm_seed + # vllm_port = config.astune.debug.debug_vllm_port + vllm_port = args.port + companion = LaunchCommandWhenAbsent( + full_argument_list=[ + sys.executable, + "-m", + "vllm.entrypoints.cli.main", + "serve", + model_path, + "--tensor-parallel-size", + str(tensor_parallel_size), + "--dtype", + "auto", + # "--enforce-eager", + # "--gpu-memory-utilization", str(gpu_memory_utilization), + # "--disable-custom-all-reduce", + # "--max-num-seqs", str(max_num_seqs), + # "--max-model-len", str(max_model_len), + "--load-format", + "auto", + "--served-model-name", + args.alias, + "--enable-chunked-prefill", + "--enable-auto-tool-choice", + "--tool-call-parser", + "hermes", + "--enable-prefix-caching", + # "--seed", str(seed), + "--port", + vllm_port, + ], + dir="./", + tag="api_vllm_server", + ) + companion.launch( + launch_wait_time=1800, + success_std_string="Application startup complete", + env_dict={**os.environ}, + ) + + +companion_launch() From 564ee41dcf6f2aaee9bc82c3e7b04c65f60b09c8 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 30 Dec 2025 11:02:59 +0800 Subject: [PATCH 370/462] update benchmark probes --- .../bench/benchmark_frozenlake/benchmark_frozenlake.py | 10 +++++----- tests/bench/benchmark_learn2ask/benchmark_learn2ask.py | 9 ++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py index fc9d4d9c..ba5bd50c 100644 --- a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py @@ -11,14 +11,14 @@ def __init__(self): self.expected_train_time = 3600 * 12 # 12 hours budget for frozenlake easy benchmark self.begin_time = time.time() self.reward_array = [] - self.reward_expectation_avg_window = 5 + self.reward_expectation_avg_window = 20 self.reward_expectation = { # step : expected local average reward range # step : [low, high ] - 5 : [0.0, 99999.0], - 10 : [0.0, 99999.0], - 15 : [0.0, 99999.0], - 20 : [0.0, 99999.0], + 50 : [0.0, 99999.0], + 100 : [0.0, 99999.0], + 150 : [0.0, 99999.0], + 200 : [0.0, 99999.0], } # fmt: on self.probe_list = ["reward_probe"] diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py index 825f2e32..9e46a659 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py @@ -11,14 +11,13 @@ def __init__(self): self.expected_train_time = 3600 * 24 # 24 hours self.begin_time = time.time() self.reward_array = [] - self.reward_expectation_avg_window = 5 + self.reward_expectation_avg_window = 20 self.reward_expectation = { # step : expected local average reward range # step : [low, high ] - 5 : [0.0, 99999.0], - 10 : [0.0, 99999.0], - 20 : [0.0, 99999.0], - 30 : [0.0, 99999.0], + 50 : [0.0, 99999.0], + 100 : [0.0, 99999.0], + 200 : [0.0, 99999.0], } # fmt: on self.probe_list = ["reward_probe"] From 5dc54a8c0e04e7913ec827549933f8a3e48e6094 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 30 Dec 2025 18:14:48 +0800 Subject: [PATCH 371/462] improve docs --- .../default_config/verl/verl_default.yaml | 2 + agentscope_tuner/utils/cleaner.py | 2 +- agentscope_tuner/utils/launch_utils.py | 6 +- docs/en/debugging_guide.md | 77 +++++++++++++++++++ scripts/test_dashscope_api.py | 30 ++++++++ tests/bench/README.md | 3 + tutorial/example_learn2ask/learn2ask.py | 23 +++++- 7 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 docs/en/debugging_guide.md create mode 100644 scripts/test_dashscope_api.py diff --git a/agentscope_tuner/default_config/verl/verl_default.yaml b/agentscope_tuner/default_config/verl/verl_default.yaml index 2f8a1730..bd5309bf 100644 --- a/agentscope_tuner/default_config/verl/verl_default.yaml +++ b/agentscope_tuner/default_config/verl/verl_default.yaml @@ -166,6 +166,7 @@ actor_rollout_ref: max_assistant_turns: null max_parallel_calls: 1 max_sample_per_task: 4 + expected_steps: 1 max_steps: 30 max_tool_response_length: 256 max_user_turns: null @@ -326,6 +327,7 @@ data: val_files: ~/data/rlhf/gsm8k/test.parquet validation_shuffle: false video_key: videos + seed: 42 ray_init: diff --git a/agentscope_tuner/utils/cleaner.py b/agentscope_tuner/utils/cleaner.py index 2d04e857..3260b084 100644 --- a/agentscope_tuner/utils/cleaner.py +++ b/agentscope_tuner/utils/cleaner.py @@ -20,7 +20,7 @@ def kill_ray_processes(): def fast_kill_by_keyword_bash( keyword: str, - exclude_substrings=["vscode", "benchmark", "jupyter", "supervisord"], + exclude_substrings=["vscode", "benchmark", "jupyter", "supervisord", "download_model"], grace_seconds: float = 1.0, ): """Use bash pipelines to kill processes matching keyword quickly. diff --git a/agentscope_tuner/utils/launch_utils.py b/agentscope_tuner/utils/launch_utils.py index 5dd78434..c57bbae5 100644 --- a/agentscope_tuner/utils/launch_utils.py +++ b/agentscope_tuner/utils/launch_utils.py @@ -131,7 +131,7 @@ def verify_python_env(args, exp_config): import verl if args.backbone == "trinity": - if verl.__version__.startswith("0.5.0.post"): + if any([v in verl.__version__ for v in ["0.5.0.post", "0.7.0.post"]]): cause = "Python environment does not match current backbone 'trinity'." solution = "Please `cd /path/to/project/agentscope-tuner` and run `(uv) pip install -e .[trinity]` to install the correct environment." print_dict( @@ -144,9 +144,7 @@ def verify_python_env(args, exp_config): time.sleep(5) raise ImportError(cause + " " + solution) elif args.backbone == "verl": - if not verl.__version__.startswith( - "0.5.0.post" - ): # you must install via `pip install -e .[verl]` to get every dependency right + if not any([v in verl.__version__ for v in ["0.5.0.post", "0.7.0.post"]]): # you must install via `pip install -e .[verl]` to get every dependency right cause = "Python environment does not match current backbone 'verl'." solution = "Please `cd /path/to/project/agentscope-tuner` and run `(uv) pip install -e .[verl]` to install the correct environment." print_dict( diff --git a/docs/en/debugging_guide.md b/docs/en/debugging_guide.md new file mode 100644 index 00000000..abaefb41 --- /dev/null +++ b/docs/en/debugging_guide.md @@ -0,0 +1,77 @@ +In this tutorial, we introduce the way to debug the workflow and the training algorithms. + +## Workflow Debugging + +1. Install VSCode and connect to GPU server. + +VSCode is a open-source software and provides all debugging plugins for free. Therefore, we choose VSCode as our debugging platform. + +VSCode can connect to remote ssh server and operate it as if it is your local machine. +For more details, please refer to VSCode official documents. + +2. Install VSCode Python Extension Bundle + + +3. Create `.vscode/launch.json`. If `.vscode` does not exists yet, create it. + + +4. Copy and paste the following configuration into `launch.json` + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "module": "agentscope_tuner.cli.launcher", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "./path/to/yaml.yaml" + ], + "env": {} + } + ] +} +``` + +5. Modify `./path/to/yaml.yaml` field to your task yaml. + + +6. For more sophisticated task with additional external service, add env variables or more args. For example, if your original training command is: + +```bash +export DASHSCOPE_API_KEY="sk-abcdefg" +astuner --conf tutorial/example_appworld/appworld.yaml --with-appworld --backbone='verl' +``` + +Then, the modified launch.json will be + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "module": "agentscope_tuner.cli.launcher", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", // verl -> debug + "--conf", "tutorial/example_appworld/appworld.yaml", + "--with-appworld", + ], + "env": { + "DASHSCOPE_API_KEY": "sk-abcdefg" + } + } + ] +} +``` + +7. Press `F5` to start debugging. + +8. You can set breakpoint inside the workflow to observe program execution now. \ No newline at end of file diff --git a/scripts/test_dashscope_api.py b/scripts/test_dashscope_api.py new file mode 100644 index 00000000..0b989df0 --- /dev/null +++ b/scripts/test_dashscope_api.py @@ -0,0 +1,30 @@ + + +import asyncio +from agentscope_tuner.utils.robust_dashscope import RobustDashScopeChatModel + + +async def test_dashscope_api(): + """Test the RobustDashScopeChatModel by making a simple API call.""" + try: + llm = RobustDashScopeChatModel("qwen-plus", stream=False) + + # Sample messages for a basic conversation + messages = [ + {"role": "user", "content": "Hello! Can you tell me a short joke?"} + ] + + # Call the model + response = await llm(messages) + + # Print and verify the response + print(response) + + + except Exception as e: + print(f"Test failed with error: {e}") + raise + + +if __name__ == "__main__": + asyncio.run(test_dashscope_api()) diff --git a/tests/bench/README.md b/tests/bench/README.md index 76ac7e3f..660a5499 100644 --- a/tests/bench/README.md +++ b/tests/bench/README.md @@ -21,4 +21,7 @@ python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_01_begin_verl python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_02_begin_trinity + +python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py::TestBenchmarkLearnToAsk::test_02_begin_verl +python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py::TestBenchmarkLearnToAsk::test_01_begin_trinity ``` diff --git a/tutorial/example_learn2ask/learn2ask.py b/tutorial/example_learn2ask/learn2ask.py index 4f2bf336..40d10f8f 100644 --- a/tutorial/example_learn2ask/learn2ask.py +++ b/tutorial/example_learn2ask/learn2ask.py @@ -1,5 +1,8 @@ + import re import time +import asyncio +import threading from agentscope.message import Msg from loguru import logger @@ -142,6 +145,24 @@ async def reward_fn(init_messages: list[Msg], response: str, truth_action: str, return final_reward +_reward_semaphore = threading.Semaphore(16) + +async def reward_fn_with_semaphore(*args, **kwargs): + + get_sem_ok = False + while not get_sem_ok: + get_sem_ok = _reward_semaphore.acquire(blocking=False) + if not get_sem_ok: + await asyncio.sleep(1) + + try: + fn_result = await reward_fn(*args, **kwargs) + finally: + _reward_semaphore.release() + + return fn_result + + class ExampleLearn2Ask(Workflow): name: str = "math_agent_workflow" @@ -176,5 +197,5 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> response = result.content[0]["text"] # type: ignore else: raise NotImplementedError(f"do not know how to handle {type(result.content)}") - reward = await reward_fn(msg, response, truth_action, truth_info) + reward = await reward_fn_with_semaphore(msg, response, truth_action, truth_info) return WorkflowOutput(reward=reward) From fff9b5c2503a778161c831a5b2961bb6f85b860b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sat, 3 Jan 2026 15:45:32 +0800 Subject: [PATCH 372/462] fix task loading bug --- agentscope_tuner/backbone/trainer_trinity.py | 10 +++------ agentscope_tuner/backbone/trainer_verl.py | 8 ++++--- agentscope_tuner/task_reader/__init__.py | 23 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/agentscope_tuner/backbone/trainer_trinity.py b/agentscope_tuner/backbone/trainer_trinity.py index dae35bf3..596a33ed 100644 --- a/agentscope_tuner/backbone/trainer_trinity.py +++ b/agentscope_tuner/backbone/trainer_trinity.py @@ -23,6 +23,7 @@ MultiAgentContextTracker, ) from agentscope_tuner.schema.trajectory import Sample +from agentscope_tuner.task_reader import dict_to_astuner_task from agentscope_tuner.task_rollout.native_parallel_worker import DynamicRolloutManager from agentscope_tuner.utils.config_utils import read_astune_config_with_cache from agentscope_tuner.utils.testing_utils import _test_if_test_mode @@ -65,13 +66,8 @@ def __init__( def convert_task(self, task: TrinityTask): from agentscope_tuner.schema.task import Task - - d = {} - for vip_key in ["main_query", "task_id", "env_type", "metadata", "init_messages"]: - if vip_key not in task.raw_task: - raise ValueError(f"Key {vip_key} not found in task.raw_task") - d[vip_key] = task.raw_task[vip_key] - return Task(**d) + assert isinstance(task.raw_task, dict) + return dict_to_astuner_task(task.raw_task) def thread_worker(self): observation_window = { diff --git a/agentscope_tuner/backbone/trainer_verl.py b/agentscope_tuner/backbone/trainer_verl.py index c242cbd4..eba46241 100644 --- a/agentscope_tuner/backbone/trainer_verl.py +++ b/agentscope_tuner/backbone/trainer_verl.py @@ -52,6 +52,7 @@ from agentscope_tuner.backbone.warm_up import warm_up_process from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker from agentscope_tuner.schema.task import Task +from agentscope_tuner.task_reader import dict_to_astuner_task from agentscope_tuner.task_rollout.native_parallel_worker import VerlRolloutManager @@ -552,13 +553,14 @@ def fit(self): # noqa: C901 logger.info("=== wake up begin ===") self.async_rollout_manager.wake_up() logger.info("=== wake up end ===") - tasks = [ - Task( + tasks: List[Task] = [ + dict_to_astuner_task(dict( task_id=gen_batch.non_tensor_batch["task_id"][i], main_query=gen_batch.non_tensor_batch["main_query"][i], env_type=gen_batch.non_tensor_batch["env_type"][i], metadata=gen_batch.non_tensor_batch["metadata"][i], - ) + init_messages=gen_batch.non_tensor_batch["init_messages"][i], + )) for i in range(len(gen_batch)) ] logger.info( diff --git a/agentscope_tuner/task_reader/__init__.py b/agentscope_tuner/task_reader/__init__.py index d22975f5..2a7ae243 100644 --- a/agentscope_tuner/task_reader/__init__.py +++ b/agentscope_tuner/task_reader/__init__.py @@ -101,3 +101,26 @@ def task_to_standard_dataset(tasks: List[Task]) -> datasets.Dataset: data["metadata"].append(task.metadata) return datasets.Dataset.from_dict(data) + + +def dict_to_astuner_task(task_dict: dict) -> Task: + """ + Convert a dictionary to a Task object. + + Args: + task_dict (dict): Dictionary containing task fields. + + Returns: + Task: Task object created from the dictionary. + """ + for vip_key in ["main_query", "task_id", "env_type", "metadata", "init_messages"]: + if vip_key not in task_dict: + raise ValueError(f"Key {vip_key} not found in task.raw_task") + + return Task( + main_query=task_dict.get("main_query", ""), + init_messages=task_dict.get("init_messages", []), + task_id=task_dict.get("task_id", ""), + env_type=task_dict.get("env_type", ""), + metadata=task_dict.get("metadata", {}), + ) \ No newline at end of file From d0237c1374e87ffa0abe41eb6613ede5a3ce6b39 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Sun, 4 Jan 2026 11:21:48 +0800 Subject: [PATCH 373/462] update expected reward ranges in TestProbe for trinity and verl benchmarks --- .../benchmark_learn2ask/benchmark_learn2ask.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py index 9e46a659..d4d19755 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py @@ -3,6 +3,15 @@ from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton +# trinity b.b. expectation +# [TestProbe] Step 50: local average reward over last self.reward_expectation_avg_window steps: 2.6618, expected range: [0.0, 99999.0] +# [TestProbe] Step 100: local average reward over last self.reward_expectation_avg_window steps: 2.8733, expected range: [0.0, 99999.0] +# [TestProbe] Step 200: local average reward over last self.reward_expectation_avg_window steps: 2.9725, expected range: [0.0, 99999.0] + +# verl b.b. expectation +# [TestProbe] Step 50: local average reward over last self.reward_expectation_avg_window steps: 3.1562, expected range: [0.0, 99999.0] +# [TestProbe] Step 100: local average reward over last self.reward_expectation_avg_window steps: 3.4732, expected range: [0.0, 99999.0] +# [TestProbe] Step 200: local average reward over last self.reward_expectation_avg_window steps: 3.5645, expected range: [0.0, 99999.0] @singleton class TestProbe(BenchmarkProbe): @@ -15,9 +24,9 @@ def __init__(self): self.reward_expectation = { # step : expected local average reward range # step : [low, high ] - 50 : [0.0, 99999.0], - 100 : [0.0, 99999.0], - 200 : [0.0, 99999.0], + 50 : [2.5, 99999.0], + 100 : [2.7, 99999.0], + 200 : [2.9, 99999.0], } # fmt: on self.probe_list = ["reward_probe"] From 7cc447bfd8d40cc9c7df0f767673895516ba1ff5 Mon Sep 17 00:00:00 2001 From: "liuboyin.lby" Date: Mon, 5 Jan 2026 17:40:23 +0800 Subject: [PATCH 374/462] docs: update documentation files and add mkdocs configuration --- docs/en/configuration.md | 721 +++++------- docs/en/data_generation.md | 32 +- docs/en/data_pipeline.md | 119 +- docs/en/example_app_world.md | 8 +- docs/en/example_countdown.md | 10 +- docs/en/example_math_agent.md | 275 ++--- docs/en/installation.md | 121 +- docs/en/intro.md | 126 ++- docs/en/introduction.md | 28 +- docs/en/quickstart.md | 90 +- docs/en/task_judger.md | 149 +-- docs/en/tune_your_first_agent.md | 335 +++--- docs/en/visualization.md | 106 +- docs/en/workflow.md | 196 ++-- docs/index.md | 126 +++ docs/javascripts/animations.js | 402 +++++++ docs/javascripts/code-copy.js | 174 +++ docs/javascripts/code-zoom.js | 2 + docs/javascripts/nav-scroll-fix.js | 141 +++ docs/javascripts/responsive.js | 356 ++++++ docs/javascripts/search-fix.js | 2 + docs/javascripts/tabbed-code.js | 177 +++ docs/requirements.txt | 14 + docs/stylesheets/animations.css | 878 ++++++++++++++ docs/stylesheets/code-enhancements.css | 513 +++++++++ docs/stylesheets/feature-cards.css | 543 +++++++++ docs/stylesheets/flowchart.css | 403 +++++++ docs/stylesheets/jupyter-simple.css | 259 +++++ docs/stylesheets/mermaid.css | 108 ++ docs/stylesheets/mkdocstrings.css | 325 ++++++ docs/stylesheets/nav-scroll-fix.css | 482 ++++++++ docs/stylesheets/readability-enhancements.css | 253 +++++ docs/stylesheets/responsive.css | 1007 +++++++++++++++++ docs/stylesheets/syntax-highlight.css | 306 +++++ docs/stylesheets/tabbed-code.css | 410 +++++++ docs/stylesheets/table-enhancements.css | 321 ++++++ docs/stylesheets/workflow.css | 290 +++++ docs/zh/beast_logger.md | 97 +- docs/zh/configuration.md | 729 +++++------- docs/zh/data_generation.md | 332 +++--- docs/zh/data_pipeline.md | 113 +- docs/zh/example_app_world.md | 201 ++-- docs/zh/example_countdown.md | 10 +- docs/zh/example_math_agent.md | 274 ++--- docs/zh/example_werewolves.md | 212 ++-- docs/zh/installation.md | 122 +- docs/zh/intro.md | 135 ++- docs/zh/introduction.md | 28 +- docs/zh/quickstart.md | 91 +- docs/zh/task_judger.md | 243 ++-- docs/zh/tune_your_first_agent.md | 242 ++-- docs/zh/visualization.md | 101 +- docs/zh/workflow.md | 228 ++-- mkdocs.yml | 134 +++ 54 files changed, 10453 insertions(+), 2647 deletions(-) create mode 100644 docs/index.md create mode 100644 docs/javascripts/animations.js create mode 100644 docs/javascripts/code-copy.js create mode 100644 docs/javascripts/code-zoom.js create mode 100644 docs/javascripts/nav-scroll-fix.js create mode 100644 docs/javascripts/responsive.js create mode 100644 docs/javascripts/search-fix.js create mode 100644 docs/javascripts/tabbed-code.js create mode 100644 docs/requirements.txt create mode 100644 docs/stylesheets/animations.css create mode 100644 docs/stylesheets/code-enhancements.css create mode 100644 docs/stylesheets/feature-cards.css create mode 100644 docs/stylesheets/flowchart.css create mode 100644 docs/stylesheets/jupyter-simple.css create mode 100644 docs/stylesheets/mermaid.css create mode 100644 docs/stylesheets/mkdocstrings.css create mode 100644 docs/stylesheets/nav-scroll-fix.css create mode 100644 docs/stylesheets/readability-enhancements.css create mode 100644 docs/stylesheets/responsive.css create mode 100644 docs/stylesheets/syntax-highlight.css create mode 100644 docs/stylesheets/tabbed-code.css create mode 100644 docs/stylesheets/table-enhancements.css create mode 100644 docs/stylesheets/workflow.css create mode 100644 mkdocs.yml diff --git a/docs/en/configuration.md b/docs/en/configuration.md index 8a64bcf6..f6333618 100644 --- a/docs/en/configuration.md +++ b/docs/en/configuration.md @@ -1,191 +1,152 @@ # Configuration -This page provides a detailed description of the configuration files. +This page provides a detailed description of the configuration files for AgentScope Tuner. + +--- ## Overview -AgentScope Tuner uses YAML-format configuration files to set up the data, algorithms, reward, logging and other runtime behaviors. The default config is located at `astuner/default_config/astune_default.yaml`. - -At a high level, a typical config contains a single root section `astuner`, which is further divided into several logical parts: - -- **Basic metadata** - - `project_name`, `experiment_name`, `experiment_dir`: Identify where experiments are stored. - - `backbone`: Select the training backend, e.g. `debug`, `trinity`, or `verl`. -- **Data & Reward** - - `task_reader`: How to load training / validation samples (EnvService, local file, HuggingFace dataset, etc.). - - `task_judge`: How to evaluate the agent and compute rewards (custom judge or LLM-based auto-grader). - - `data`: Prompt / response length and batch sizes. -- **Model** - - `model`: Where to load the base model to be trained (local path or HuggingFace repo). -- **Rollout & interaction** - - `rollout`: How the agent interacts with the environment (protocol, sampling parameters, max steps, etc.). - - `context_tracker`: How the conversation / history is managed. -- **Training loop** - - `trainer_common`: Global training hyperparameters (epochs, checkpoints, algorithms, KL loss, FSDP, logger, etc.). - - `debug`: Extra debug-only settings used when `backbone: debug`. - -You can start from the default YAML and only modify the sections relevant to your use case. The **full configuration example** is provided in the *Appendix* at the end of this page as a reference. - -## Model Registry -To train an agent, we first need to specify the model to be trained and some environment variables used during the training process. - -In the configuration file, you can set the path to load model parameters from a specific location. - -```yaml -astuner: - # ... - # model to be trained - model: - path: path/to/model +AgentScope Tuner uses YAML-format configuration files to set up data, algorithms, rewards, logging, and other runtime behaviors. - # ... +!!! info "Default Configuration" + The default config is located at `astuner/default_config/astune_default.yaml`. -``` +At a high level, a typical config contains a single root section `astuner`, which is divided into several logical parts: + +
+ +-  **Basic Metadata** — Project name, experiment name, experiment directory, and backbone selection + - `project_name`, `experiment_name`, `experiment_dir` + - `backbone`: Select training backend (`debug`, `trinity`, or `verl`) -We can use +-  **Data & Reward** — How to load data and evaluate agents + - `task_reader`: Load training/validation samples + - `task_judge`: Evaluate agents and compute rewards + - `data`: Prompt/response length and batch sizes -+ Local file: Points to a local directory containing a model in transformers format, e.g., `/mnt/data/models/Qwen2.5-14B-Instruct` -+ HuggingFace repo: Points to a HuggingFace repo, e.g., `Qwen/Qwen2.5-14B-Instruct`. The model will be automatically downloaded to local and loaded. +-  **Model & Rollout** — Model configuration and agent interaction + - `model`: Base model to train + - `rollout`: Agent-environment interaction settings + - `context_tracker`: Conversation/history management +
+--- + +## Model Configuration + +### Specifying the Model + +```yaml title="config.yaml" +astuner: + model: + path: path/to/model +``` -Additionally, if LLM-as-a-Judge is used in training, some necessary environment variables need to be configured: +| Source Type | Example | +|-------------|---------| +| **Local file** | `/mnt/data/models/Qwen2.5-14B-Instruct` | +| **HuggingFace repo** | `Qwen/Qwen2.5-14B-Instruct` (auto-downloaded) | + +### Environment Variables for LLM-as-Judge + +If using LLM-as-a-Judge, configure these environment variables: ```bash -# the API key of DashScope, which provides the remove LLM calling +# DashScope API key for remote LLM calling export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' ``` -## Data -Configuring data mainly involves two parts: `task_reader` and `task_judge`. +--- + +## Data Configuration ### Task Reader -`task_reader` defines how to read training and validation data. Multiple reader types are supported. -```yaml -astuner: - task_reader: - # options: - # env_service: read dataset from EnvService - # jsonl_dataset_file: read dataset from local JSONL file - # huggingface_dat_repo: read dataset from huggingface repo - # data_generation: generate dataset from documents and queries - # random_dummy: generate random dummy tasks for quick pipeline checks - type: env_service - - # 1. env_service reader config - env_service: - env_type: "appworld" - env_url: "http://127.0.0.1:8080" - env_action_preference: code - training_split: train - validation_split: dev - - # 2. jsonl_dataset_file reader config - jsonl_dataset_file: - training: - file_path: "xxxx.jsonl" - validation: - file_path: "xxxx.jsonl" - - # 3. huggingface_dat_repo reader config - huggingface_dat_repo: - dataset_path: "gsm8k" - training_split: "train" - validation_split: "validation" - - # 4. data_generation reader config - data_generation: - document_reader: - document_path: - - 'dataset/document/your-document1.pdf' - languages: - - eng - query_reader: - type: dataset_file - dataset_file: +`task_reader` defines how to read training and validation data. + +=== "EnvService" + + ```yaml + astuner: + task_reader: + type: env_service + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code + training_split: train + validation_split: dev + ``` + +=== "JSONL File" + + ```yaml + astuner: + task_reader: + type: jsonl_dataset_file + jsonl_dataset_file: training: - file_path: 'dataset/jsonl/your-queries.jsonl' - task_num: 10 - llm_model: qwen-long - llm_response_length: 8192 - num_workers: 32 - sampling_params: - temperature: 0 - filter: - type: deduplication - enabled: true - params: - similarity_threshold: 0.8 - db_path: ./.similarity_db - model: text-embedding-v4 - api_key: null - base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 -``` - -+ `env_service`: Read data from EnvService, for tasks that need to interact with the EnvService. - - `env_type`: Environment type, must be consistent with the type initialized in EnvService (e.g., `appworld`). - - `env_url`: The service address of EnvService (e.g., `http://127.0.0.1:8080`). - - `env_action_preference`: The preferred format of Action, options: `code`, `text`, or `box`. - - `training_split`: The name of the dataset split used for training in the environment. - - `validation_split`: The name of the dataset split used for validation in the environment. -+ `jsonl_dataset_file`: Read data from local files, usually in JSONL format. - - `training.file_path`: Local file path of the training dataset. - - `validation.file_path`: Local file path of the validation dataset. -+ `huggingface_dat_repo`: Read datasets directly from HuggingFace repositories. - - `dataset_path`: The dataset repository name on HuggingFace (e.g., `gsm8k`). - - `training_split`: The dataset split name for training. - - `validation_split`: The dataset split name for validation. - -`data_generation` and `random_dummy` are also available for special workflows (see `astune_default.yaml` for the full schema). + file_path: "data/train.jsonl" + validation: + file_path: "data/val.jsonl" + ``` + +=== "HuggingFace" + + ```yaml + astuner: + task_reader: + type: huggingface_dat_repo + huggingface_dat_repo: + dataset_path: "gsm8k" + training_split: "train" + validation_split: "validation" + ``` ### Task Judge -`task_judge` is used to evaluate Agent performance and calculate rewards. -```yaml +`task_judge` evaluates agent performance and calculates rewards. + +```yaml title="config.yaml" astuner: task_judge: - # options: 'customized_protocol', 'rubrics_auto_grader' - judge_type: customized_protocol - # the package path to judge (reward) function + judge_type: customized_protocol # or 'rubrics_auto_grader' judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge - # the helper LLM model used for LLM-AS-Judge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - - # when `judge_type == rubrics_auto_grader` - rubrics_auto_grader: - model_name: qwen-max - grader_mode: pointwise - # ... ``` -+ `judge_type`: Judge type. - - `customized_protocol`: Use a custom Python class for scoring. Need to specify the class path via `judge_protocol` (e.g., `package.module->ClassName`). - - `rubrics_auto_grader`: Use LLM-based automatic grading. -+ `alien_llm_model`: Auxiliary LLM model that may be used during judgment. +| Option | Description | +|--------|-------------| +| `customized_protocol` | Use a custom Python class for scoring | +| `rubrics_auto_grader` | Use LLM-based automatic grading | + +--- ## Training Configuration -### Backend -AgentScope Tuner supports three training backends, including **trinity** and **verl**, as well as an extra **debug** mode. -+ **trinity**: The default option. A general-purpose, flexible and scalable framework designed for reinforcement fine-tuning of LLMs. -+ **verl**: Volcano engine reinforcement learning for LLMs. -+ **debug**: A backend that allows users to set breakpoint and debug code. +### Backend Selection + +AgentScope Tuner supports three training backends: -To configure the backend to be used, you can modify +| Backend | Description | +|---------|-------------| +| **trinity** | Default. Flexible and scalable framework for RL fine-tuning | +| **verl** | Volcano Engine reinforcement learning for LLMs | +| **debug** | Allows breakpoint debugging in IDEs | -```yaml +```yaml title="config.yaml" astuner: - # debug or trinity or verl - backbone: trinity + backbone: trinity # debug, trinity, or verl ``` -### Rollout -The rollout section controls the behavior of the Agent during the interaction sampling process with the environment. +### Rollout Configuration -```yaml +Controls agent behavior during environment interaction: + +```yaml title="config.yaml" astuner: rollout: agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow @@ -197,15 +158,16 @@ astuner: num_repeat: 4 ``` -+ `agentscope_workflow`: Specify the specific interaction protocol implementation class. -+ `temperature` / `top_p`: Sampling parameters. -+ `name`: Inference engine name (e.g., `vllm`). -+ `n_vllm_engine`: The number of vLLM engines to use (effective when backbone is trinity). +| Parameter | Description | +|-----------|-------------| +| `agentscope_workflow` | Path to workflow implementation class | +| `temperature` / `top_p` | Sampling parameters | +| `name` | Inference engine (e.g., `vllm`) | +| `n_vllm_engine` | Number of vLLM engines (Trinity only) | -### Common Parameters -`trainer_common` contains common parameters for training flow control: +### Common Training Parameters -```yaml +```yaml title="config.yaml" astuner: trainer_common: total_epochs: 50 @@ -216,28 +178,22 @@ astuner: nnodes: 1 n_gpus_per_node: 8 mini_batch_num: 1 - ulysses_sequence_parallel_size: 1 fsdp_config: param_offload: True optimizer_offload: True ``` -+ `total_epochs`: Total number of training epochs. -+ `save_freq`: Frequency of saving model checkpoints (in steps). -+ `test_freq`: Frequency of validation/testing (in steps). -+ `val_before_train`: Whether to perform a validation before training starts. -+ `val_pass_n`: Number of samples per question in validation phase (Pass@N). -+ `nnodes` / `n_gpus_per_node`: Distributed training configuration, specifying the number of nodes and GPUs per node. -+ `mini_batch_num`: Number of mini-batches for accumulation. -+ `ulysses_sequence_parallel_size`: Sequence parallel size for Ulysses attention. -+ `fsdp_config`: FSDP (Fully Sharded Data Parallel) configuration. - - `param_offload`: Whether to offload model parameters to CPU to save GPU memory. - - `optimizer_offload`: Whether to offload optimizer state to CPU. +| Parameter | Description | +|-----------|-------------| +| `total_epochs` | Total training epochs | +| `save_freq` | Checkpoint save frequency (steps) | +| `test_freq` | Validation frequency (steps) | +| `nnodes` / `n_gpus_per_node` | Distributed training setup | +| `fsdp_config` | FSDP memory optimization | ### Optimization Algorithms -Optimization algorithms and hyperparameters are mainly set in `algorithm`, `optim`, and root configuration: -```yaml +```yaml title="config.yaml" astuner: trainer_common: algorithm: @@ -250,19 +206,20 @@ astuner: kl_loss_type: low_var_kl ``` -+ `optim`: - - `lr`: Learning Rate. -+ `algorithm`: - - `adv_estimator`: Advantage estimator, e.g., `grpo` (Group Relative Policy Optimization). - - `use_kl_in_reward`: Whether to include KL divergence as part of the reward. -+ `use_kl_loss`: Whether to include KL divergence constraint in loss calculation. -+ `kl_loss_coef`: Coefficient for KL loss. -+ `kl_loss_type`: Calculation method of KL loss, e.g., `low_var_kl`. +| Parameter | Description | +|-----------|-------------| +| `adv_estimator` | Advantage estimator (e.g., `grpo`) | +| `lr` | Learning rate | +| `use_kl_loss` | Include KL divergence in loss | +| `kl_loss_coef` | KL loss coefficient | + +--- + +## Debug Mode -### Debug Mode -When `backbone` is set to `debug`, the `debug` section controls the behavior of the debug backend. +When `backbone: debug`, additional settings are available: -```yaml +```yaml title="config.yaml" astuner: debug: debug_max_parallel: 16 @@ -272,284 +229,146 @@ astuner: debug_tensor_parallel_size: 4 ``` -Typical usages include: +!!! tip "Debug Mode Use Cases" + - **Limiting tasks**: Quickly verify the pipeline on a few tasks + - **Fixing randomness**: `debug_vllm_seed` helps reproduce issues + - **Reduced parallelism**: Easier to debug with smaller concurrency -- **Limiting tasks and concurrency**: quickly verify the training pipeline on a few tasks with small parallelism. -- **Fixing randomness**: `debug_vllm_seed` helps reproduce issues. +--- ## Logging & Monitoring -### Configure Logger -AgentScope Tuner supports multiple logging backends, configured via `trainer_common.logger`: -+ `console`: Standard output logs for quick progress checking. -+ `wandb`: Integrated with wandb experiment tracking platform, providing visualized training curves and metric monitoring. -+ `swanlab`: Log with SwanLab. +### Logger Selection -```yaml +```yaml title="config.yaml" astuner: trainer_common: - logger: swanlab + logger: swanlab # console, wandb, or swanlab ``` -### Log Structure -All experiment outputs will be saved in `./launcher_record/{experiment_name}`: - -+ **Logs:** Logs and error messages generated by the launcher and trainer. -+ **Metrics:** - - The exact metric destination depends on the selected logger backend. -+ **Checkpoint:** Checkpoints of the trained models. - - -## Appendix: Full configuration example - -```yaml -# ------------------ main configuration ------------------ -astuner: - project_name: "astuner_default_project" - experiment_name: "read_yaml_name" - experiment_dir: "auto" # {exp-dir}/{experiment_name} - backbone: debug # `debug` or `trinity` or `verl` - - - model: - # which model should be trained - path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct - - data: - # max number of tokens for prompt - max_prompt_length: 3000 - # max number of tokens for response - max_response_length: 15000 - # how many tasks per training batch - train_batch_size: 32 - # [Hint]: The final number of samples per update will be: N_{sample} = (data.train_batch_size * rollout.num_repeat * rollout.multi_turn.expected_steps) - - - rollout: - - # the path to the workflow class - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - - # whether or not to disable all tool calls - agentscope_disable_toolcalls: False - - # maximum number of parallel environments / simulate workers - max_env_worker: 128 - - # step reward gamma (experimental, do not change) - gamma: 1.0 - - # monitor LLM's abormal behaviors during rollout - compute_madness_checklist: - - "nonsense" - # send signal to terminate context tracing when LLM is losing control - agent_madness_termination: True # terminate_after_gone_mad - # punish the LLM when it is detected as lost control - agent_madness_reward: -1.0 - - # max response length in one turn - max_response_length_in_one_turn: 4096 - - # max token length allowed for the model during rollout - max_model_len: 18000 - - multi_turn: - # how many samples should be collected for each task run - max_sample_per_task: 30 - # limit the maximum steps for each task - max_steps: 30 - # the expected steps for each task, used to calculate the training batch size for trinity - expected_steps: 1 - - # TP size for rollout engine - tensor_model_parallel_size: 1 - - # the number of vllm engines, number of gpus for infer is `n_vllm_engine*tensor_model_parallel_size`, this argument is NOT effective when NOT using trinity - n_vllm_engine: 2 - - # how many sequences are allowed to be processed in parallel by each vllm engine - max_num_seqs: 10 - - # the usage of infer engine, options: (vllm, sglang) - name: vllm - - # how many times a task should be repeated - num_repeat: 4 - - # rollout kwargs - temperature: 0.9 - top_p: 1.0 - - # validation kwargs - val_kwargs: - temperature: 0.0 - top_k: -1 - top_p: 1.0 - do_sample: False - num_repeat: 1 - - - task_reader: - # the type of task_reader - # options: - # env_service: read dataset from EnvService - # jsonl_dataset_file: read dataset from local JSONL file - # huggingface_dat_repo: read dataset from huggingface repo - # data_generation: generate dataset from documents and queries - # random_dummy: generate random dummy tasks for quick pipeline checks - type: env_service # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` - # when `type == jsonl_dataset_file` - jsonl_dataset_file: - training: - file_path: "/path/to/training/data.jsonl" - validation: - file_path: "/path/to/validation/data.jsonl" - # when `type == env_service` - env_service: - # the type of env, must be init in EnvService first - env_type: "appworld" - # the url of the service - env_url: "http://127.0.0.1:8080" - # code, text, box - env_action_preference: code - # the name of training split in this environment - training_split: train - # the name of validation split in this environment - validation_split: dev - # when `type == huggingface_dat_repo` - huggingface_dat_repo: - # the repo name - dataset_path: "gsm8k" - # the name of training split - training_split: "train" - # the name of validation split - validation_split: "validation" - - # when `type == data_generation` - data_generation: - document_reader: - document_path: - - 'dataset/document/your-document1.pdf' - - 'dataset/document/your-document2.pdf' - languages: - - eng - query_reader: - type: dataset_file - dataset_file: - training: - file_path: 'dataset/jsonl/your-queries.jsonl' - task_num: 10 - llm_model: qwen-long - llm_response_length: 8192 - num_workers: 32 - sampling_params: - temperature: 0 - filter: - type: deduplication - enabled: true - params: - similarity_threshold: 0.8 - db_path: ./.similarity_db - model: text-embedding-v4 - api_key: null # load from the env - base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 - - # task judge. it provide rewards for agent training - task_judge: - judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' - - # when `judge_type == customized_protocol` - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge - - # the helper LLM model used for LLM-AS-Judge - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - - # when `judge_type == rubrics_auto_grader` - rubrics_auto_grader: - model_name: qwen-max - # reward mode - grader_mode: pointwise - # the language of prompts, tasks, llm outputs - language: en - query_specific_generate_number: 1 - enable_categorization: false - categories_number: 5 - grader_name: "auto_grader" - query_field: main_query - answer_field: final_answer - reference_field: answer - custom_evaluation_prompt: null # dict or PromptTemplate or None - input_data_type: dataset_file # `env_service` or `dataset_file` or `huggingface_dat_repo` - dataset_file: - training: - file_path: "tutorial/example_rm_auto_grader/rubrics_train.jsonl" - # Pointwise mode settings - min_score: 0 - max_score: 1 - - - # when backbone is `debug`, debug related configurations - debug: - debug_max_parallel: 16 - debug_first_n_tasks: 2 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - debug_tensor_parallel_size: 4 - - - # trainer common configurations - trainer_common: - # validate before the first epoch - val_before_train: False - # the rollout size in validation phase - val_pass_n: 4 - # the frequency (step) of checkpoint saving - save_freq: 20 - # the frequency (step) of test phase - test_freq: 20 - # totol epochs to train - total_epochs: 50 - # the number of nodes in clusters - nnodes: 1 - # the number of gpus in each node - n_gpus_per_node: 8 - logger: swanlab - # optimization algorithms - algorithm: - adv_estimator: grpo - use_kl_in_reward: False - mini_batch_num: 1 - # FSDP config - fsdp_config: - # offload param to save gpu memory - param_offload: True - # offload optimizer to save gpu memory - optimizer_offload: True - # optimizer config - optim: - # learning rate - lr: 1e-6 - # use KL loss in training - use_kl_loss: True - # KL loss coefficient - kl_loss_coef: 0.002 - # type of KL loss - kl_loss_type: low_var_kl - ulysses_sequence_parallel_size: 1 - checkpoint_base_dir: ./saved_checkpoints - - - # context tracker protocol is valid ONLY when `use_agentscope_protocol=False` - context_tracker: - context_tracker_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - max_env_len: 4096 - - - # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. - execute_test: False # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. - execute_testing_lambda: "" # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. - -``` +| Logger | Description | +|--------|-------------| +| `console` | Standard output for quick progress checking | +| `wandb` | Weights & Biases experiment tracking | +| `swanlab` | SwanLab logging | + +### Output Structure + +All experiment outputs are saved in `./launcher_record/{experiment_name}`: + +| Directory | Contents | +|-----------|----------| +| **Logs** | Logs and error messages | +| **Metrics** | Training metrics (depends on logger) | +| **Checkpoint** | Model checkpoints | + +--- + +## Full Configuration Example + +??? example "Complete Configuration Template" + ```yaml title="config.yaml" + astuner: + project_name: "astuner_default_project" + experiment_name: "read_yaml_name" + experiment_dir: "auto" + backbone: debug + + model: + path: /path/to/model/Qwen2.5-14B-Instruct + + data: + max_prompt_length: 3000 + max_response_length: 15000 + train_batch_size: 32 + + rollout: + agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + agentscope_disable_toolcalls: False + max_env_worker: 128 + gamma: 1.0 + compute_madness_checklist: + - "nonsense" + agent_madness_termination: True + agent_madness_reward: -1.0 + max_response_length_in_one_turn: 4096 + max_model_len: 18000 + multi_turn: + max_sample_per_task: 30 + max_steps: 30 + expected_steps: 1 + tensor_model_parallel_size: 1 + n_vllm_engine: 2 + max_num_seqs: 10 + name: vllm + num_repeat: 4 + temperature: 0.9 + top_p: 1.0 + val_kwargs: + temperature: 0.0 + top_k: -1 + top_p: 1.0 + do_sample: False + num_repeat: 1 + + task_reader: + type: env_service + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code + training_split: train + validation_split: dev + + task_judge: + judge_type: customized_protocol + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + + debug: + debug_max_parallel: 16 + debug_first_n_tasks: 2 + debug_vllm_port: 18000 + debug_vllm_seed: 12345 + debug_tensor_parallel_size: 4 + + trainer_common: + val_before_train: False + val_pass_n: 4 + save_freq: 20 + test_freq: 20 + total_epochs: 50 + nnodes: 1 + n_gpus_per_node: 8 + logger: swanlab + algorithm: + adv_estimator: grpo + use_kl_in_reward: False + mini_batch_num: 1 + fsdp_config: + param_offload: True + optimizer_offload: True + optim: + lr: 1e-6 + use_kl_loss: True + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + ulysses_sequence_parallel_size: 1 + checkpoint_base_dir: ./saved_checkpoints + + context_tracker: + context_tracker_type: "linear" + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + max_env_len: 4096 + ``` + +--- + +## Next Steps + + diff --git a/docs/en/data_generation.md b/docs/en/data_generation.md index 65c566a6..bf5e0cb3 100644 --- a/docs/en/data_generation.md +++ b/docs/en/data_generation.md @@ -54,7 +54,7 @@ These examples will be merged with the tasks generated in the first stage to for ] ``` -## 🚀 Quick Start +## Quick Start `Data Generation Reader` can load a few user-provided tasks and optional documents (in various formats such as PDF, Word, and TXT) from a local path, then generates tasks and loads them as training tasks. ### Step 1: Prepare data @@ -170,18 +170,18 @@ Based on user-provided documents (optional) and a few task examples, the `Data G ## Detailed Config Options | Parameter Path | Type | Default | Required | Description | | --- | --- | --- | --- | --- | -| `document_reader.document_path` | list[str] | - | ❌ | List of document file paths. Supports PDF, Word, TXT, and more. | -| `document_reader.languages` | list[str] | `['eng']` | ❌ | List of document languages for OCR and text parsing, e.g., `eng` (English), `chs` (Simplified Chinese). | -| `query_reader.type` | str | `jsonl_dataset_file` | ✅ | Reader type. Options: `jsonl_dataset_file`, `env_service`, `huggingface_dat_repo`. | -| `query_reader.jsonl_dataset_file.training.file_path` | str | - | ✅ | Path to the training tasks JSONL file (when `type: jsonl_dataset_file`). | -| `task_num` | int | `10` | ✅ | Number of tasks to generate. The actual number may be reduced by filtering. | -| `llm_model` | str | `qwen-long` | ✅ | LLM model name used for task generation. | -| `llm_response_length` | int | `8192` | ❌ | Maximum number of tokens in the LLM response. | -| `num_workers` | int | `32` | ❌ | Number of parallel worker threads for speeding up task generation. | -| `sampling_params.temperature` | float | `0` | ❌ | Sampling temperature. `0` means greedy decoding (deterministic output); higher values make outputs more random. | -| `deduplication_filter.enabled` | bool | `true` | ❌ | Whether to enable the deduplication filter. | -| `deduplication_filter.params.similarity_threshold` | float | `0.8` | ✅ | Similarity threshold (0–1). Tasks above this threshold will be filtered out. | -| `deduplication_filter.params.db_path` | str | `./.similarity_db` | ❌ | Path to the similarity database used to cache embeddings. | -| `deduplication_filter.params.model` | str | `text-embedding-v4` | ✅ | Embedding model used to compute similarity. | -| `deduplication_filter.params.api_key` | str | `null` | ❌ | API key. If `null`, it will be loaded from the `DASHSCOPE_API_KEY` environment variable. | -| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | ❌ | Base URL for the embedding API. | +| `document_reader.document_path` | list[str] | - | No | List of document file paths. Supports PDF, Word, TXT, and more. | +| `document_reader.languages` | list[str] | `['eng']` | No | List of document languages for OCR and text parsing, e.g., `eng` (English), `chs` (Simplified Chinese). | +| `query_reader.type` | str | `jsonl_dataset_file` | Yes | Reader type. Options: `jsonl_dataset_file`, `env_service`, `huggingface_dat_repo`. | +| `query_reader.jsonl_dataset_file.training.file_path` | str | - | Yes | Path to the training tasks JSONL file (when `type: jsonl_dataset_file`). | +| `task_num` | int | `10` | Yes | Number of tasks to generate. The actual number may be reduced by filtering. | +| `llm_model` | str | `qwen-long` | Yes | LLM model name used for task generation. | +| `llm_response_length` | int | `8192` | No | Maximum number of tokens in the LLM response. | +| `num_workers` | int | `32` | No | Number of parallel worker threads for speeding up task generation. | +| `sampling_params.temperature` | float | `0` | No | Sampling temperature. `0` means greedy decoding (deterministic output); higher values make outputs more random. | +| `deduplication_filter.enabled` | bool | `true` | No | Whether to enable the deduplication filter. | +| `deduplication_filter.params.similarity_threshold` | float | `0.8` | Yes | Similarity threshold (0–1). Tasks above this threshold will be filtered out. | +| `deduplication_filter.params.db_path` | str | `./.similarity_db` | No | Path to the similarity database used to cache embeddings. | +| `deduplication_filter.params.model` | str | `text-embedding-v4` | Yes | Embedding model used to compute similarity. | +| `deduplication_filter.params.api_key` | str | `null` | No | API key. If `null`, it will be loaded from the `DASHSCOPE_API_KEY` environment variable. | +| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | No | Base URL for the embedding API. | diff --git a/docs/en/data_pipeline.md b/docs/en/data_pipeline.md index 71247cf8..9dfed503 100644 --- a/docs/en/data_pipeline.md +++ b/docs/en/data_pipeline.md @@ -2,18 +2,23 @@ AgentScope Tuner loads training tasks from various data sources through Task Reader. This page covers the Task schema definition and different built-in Task Readers for common scenarios. +--- + ## Overview -In agent training, all training data must be represented as **tasks** following a unified schema. AgentScope Tuner provides multiple Task Readers to load tasks from different data sources: +In agent training, all training data must be represented as **tasks** following a unified schema. -- **Unified Schema**: All tasks conform to the `Task` structure regardless of source -- **Multiple Sources**: Load from local files, HuggingFace datasets, interactive environments, or auto-generate new tasks -- **Automatic Routing**: The framework selects the appropriate reader based on `astuner.task_reader.type` in your configuration +!!! info "Key Concepts" + - **Unified Schema**: All tasks conform to the `Task` structure regardless of source + - **Multiple Sources**: Load from local files, HuggingFace datasets, interactive environments, or auto-generate new tasks + - **Automatic Routing**: The framework selects the appropriate reader based on `astuner.task_reader.type` ``` Data Source → Task Reader → Unified Task Schema → Training Pipeline ``` +--- + ## Task Schema All training tasks must be defined according to the following structure: @@ -39,7 +44,7 @@ class Task(BaseModel): ### Example Task -```json +```json title="example_task.json" { "main_query": "What is 15 * 23?", "init_messages": [ @@ -57,23 +62,24 @@ class Task(BaseModel): } ``` -**Best Practices:** -- Use `metadata` to store information needed for reward computation (e.g., reference answers, scoring rubrics) -- Keep `main_query` clear and concise -- Use `init_messages` for system prompts or few-shot examples +!!! tip "Best Practices" + - Use `metadata` to store information needed for reward computation (e.g., reference answers, scoring rubrics) + - Keep `main_query` clear and concise + - Use `init_messages` for system prompts or few-shot examples + +--- ## Built-in Task Readers -AgentScope Tuner provides six built-in Task Readers for different scenarios. The framework automatically routes to the correct reader based on `astuner.task_reader.type` in your configuration. +AgentScope Tuner provides multiple built-in Task Readers for different scenarios. The framework automatically routes to the correct reader based on `astuner.task_reader.type`. ### Quick Selection Guide -| Scenario | Reader Type | When to Use | -|----------|-------------|-------------| -| **Local JSONL file** | `jsonl_dataset_file` | You have prepared task data in JSONL format | -| **HuggingFace dataset** | `huggingface_dat_repo` | Load tasks from HuggingFace Hub (e.g., GSM8K) | -| **Interactive environment** | `env_service` | Tasks come from a running environment service (e.g., AppWorld, FrozenLake) | -| **Auto-generate from documents** | `data_generation` | Generate tasks from knowledge documents or existing tasks | +
+

JSONL File

You have prepared task data in JSONL format locally.

+

HuggingFace

Load tasks from HuggingFace Hub (e.g., GSM8K, MATH).

+

EnvService

Tasks come from a running environment service.

+
--- @@ -81,32 +87,32 @@ AgentScope Tuner provides six built-in Task Readers for different scenarios. The **When to use:** You have prepared training tasks in JSONL format locally. -**Configuration:** +=== "Configuration" -```yaml -astuner: - task_reader: - type: jsonl_dataset_file - jsonl_dataset_file: - training: - file_path: "data/train.jsonl" - validation: - file_path: "data/val.jsonl" -``` + ```yaml title="config.yaml" + astuner: + task_reader: + type: jsonl_dataset_file + jsonl_dataset_file: + training: + file_path: "data/train.jsonl" + validation: + file_path: "data/val.jsonl" + ``` -**JSONL Format:** +=== "JSONL Format" -Each line should be a JSON object conforming to the Task schema: + Each line should be a JSON object conforming to the Task schema: -```json -{"main_query": "Solve: x + 5 = 12", "task_id": "algebra_01", "env_type": "math", "metadata": {"answer": "7"}} -{"main_query": "What is the capital of France?", "task_id": "geo_01", "env_type": "qa", "metadata": {"answer": "Paris"}} -``` + ```json title="data/train.jsonl" + {"main_query": "Solve: x + 5 = 12", "task_id": "algebra_01", "env_type": "math", "metadata": {"answer": "7"}} + {"main_query": "What is the capital of France?", "task_id": "geo_01", "env_type": "qa", "metadata": {"answer": "Paris"}} + ``` -**How it works:** -- Reads tasks line-by-line from specified JSONL files -- Automatically validates against Task schema -- Supports separate training and validation splits +!!! note "How it works" + - Reads tasks line-by-line from specified JSONL files + - Automatically validates against Task schema + - Supports separate training and validation splits --- @@ -114,9 +120,7 @@ Each line should be a JSON object conforming to the Task schema: **When to use:** Load tasks from HuggingFace Hub datasets (e.g., GSM8K, MATH). -**Configuration:** - -```yaml +```yaml title="config.yaml" astuner: task_reader: type: huggingface_dat_repo @@ -127,12 +131,10 @@ astuner: validation_split: "test" # Validation split name ``` -**How it works:** -- Downloads dataset from HuggingFace Hub using `datasets` library -- Automatically maps dataset fields to Task schema -- Caches downloaded data locally for faster subsequent runs - -**Supported datasets:** Any HuggingFace dataset that can be mapped to the Task schema. +!!! note "How it works" + - Downloads dataset from HuggingFace Hub using `datasets` library + - Automatically maps dataset fields to Task schema + - Caches downloaded data locally for faster subsequent runs --- @@ -140,9 +142,7 @@ astuner: **When to use:** Tasks are provided by an interactive environment service (e.g., AppWorld, RL gym environments). -**Configuration:** - -```yaml +```yaml title="config.yaml" astuner: task_reader: type: env_service @@ -154,13 +154,20 @@ astuner: validation_split: dev ``` -**How it works:** -- Connects to a running environment service via HTTP -- Pulls task instances from the environment -- Supports dynamic task generation from interactive environments +!!! note "How it works" + - Connects to a running environment service via HTTP + - Pulls task instances from the environment + - Supports dynamic task generation from interactive environments + +!!! example "Use Cases" + - Training agents in simulated environments (e.g., FrozenLake, game environments) + - Complex interactive scenarios where tasks are generated dynamically -**Use cases:** -- Training agents in simulated environments (e.g., FrozenLake, game environments) -- Complex interactive scenarios where tasks are generated dynamically +--- +## Next Steps + diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index 08d037c6..cdb989c4 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -134,7 +134,7 @@ In `astuner/task_judge/env_service_as_judge.py`, we read the reward signal from You can also refer to this file to implement your own Judge for your specific task. ### 3.3 Configuration Details -Copy and modify the key parameters in `tutorial/example_appworld/appworld.yaml`. The parts most relevant to this document are marked with ✨✨✨✨ in the yaml file: +Copy and modify the key parameters in `tutorial/example_appworld/appworld.yaml`. The parts most relevant to this document are marked with in the yaml file: 1. **Read tasks** (corresponding config field: `astuner.task_reader`) 2. **Define the workflow** (corresponding config field: `astuner.rollout.agentscope_workflow`) @@ -149,13 +149,13 @@ astuner: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: - # ✨✨✨✨ Implement and select the evaluation function + # [key] Implement and select the evaluation function judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: - # ✨✨✨✨ Set the model to be trained + # [key] Set the model to be trained path: YOUR_MODEL_PATH rollout: - # ✨✨✨✨ Implement and select the Agent + # [key] Implement and select the Agent agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: True debug: diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index dff09217..a81d41c6 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -107,7 +107,7 @@ WorkflowOutput( ``` ### 3.2 Configuration Details -Copy and modify key parameters in `tutorial/example_countdown/countdown.yaml`. The most relevant parts in the yaml file are marked with ✨✨✨✨ symbols. +Copy and modify key parameters in `tutorial/example_countdown/countdown.yaml`. The most relevant parts in the yaml file are marked with symbols. 1. Read task (corresponds to configuration field `astuner.task_reader`) 2. Define Workflow (corresponds to configuration field `astuner.rollout.agentscope_workflow`) @@ -121,14 +121,14 @@ Copy and modify key parameters in `tutorial/example_countdown/countdown.yaml`. T ```yaml astuner: task_reader: - type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `data_generation` + type: huggingface_dat_repo # [key] `env_service` or `dataset_file` or `huggingface_dat_repo` or `data_generation` rollout: - agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # ✨✨✨✨ Write and select Agent + agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # [key] Write and select Agent task_judge: - # ✨✨✨✨ Write and select evaluation function + # [key] Write and select evaluation function judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge model: - # ✨✨✨✨ Set the model to be trained + # [key] Set the model to be trained path: YOUR_MODEL_PATH ``` diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index ce4f592f..2973daee 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -1,28 +1,27 @@ # Math Agent -Train a **tool-using Math Agent** (ReAct + Python executor) to solve GSM8K-style math problems. -Rewards come from a **judge** that checks final-answer correctness (and can optionally penalize bad tool-call behaviors). +Train a **tool-using Math Agent** (ReAct + Python executor) to solve GSM8K-style math problems. Rewards come from a **judge** that checks final-answer correctness. --- -### 1. Overview +## Overview -In **Math Agent**, each training sample is a math word problem (e.g., GSM8K). The agent learns to: - -- **reason step by step** (ReAct-style), -- **call a Python tool** when computation is needed, -- produce a final answer that matches the reference. +
+

+In Math Agent, each training sample is a math word problem (e.g., GSM8K). The agent learns to reason step by step (ReAct-style), call a Python tool when computation is needed, and produce a final answer that matches the reference. +

+
This tutorial is organized in two steps: -1) **Run it**: download the dataset and start training with the default YAML config. -2) **Understand & customize**: read the workflow (`ExampleMathLearn`) and the judge/reward (`MathAnswerAndLlmAsJudge`). +1. **Run it**: Download the dataset and start training with the default YAML config +2. **Understand & customize**: Read the workflow and the judge/reward logic --- -### 2. Quick Start +## Quick Start -#### 2.1 Prepare Dataset +### Prepare Dataset Download the `openai/gsm8k` dataset: @@ -30,7 +29,7 @@ Download the `openai/gsm8k` dataset: python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/store/dataset ``` -#### 2.2 Start Training +### Start Training ```bash # (optional) recommended cleanup before training @@ -39,80 +38,74 @@ python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/sto astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -
-Quick Debugging (Optional) - -If you want to breakpoint-debug the workflow/judge locally: +??? tip "Quick Debugging (Optional)" + If you want to breakpoint-debug the workflow/judge locally: -```bash -# (optional) recommended cleanup before debug -# astuner --kill="python|ray" + ```bash + # (optional) recommended cleanup before debug + # astuner --kill="python|ray" -clear && \ -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview -``` + clear && \ + astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview + ``` -When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: + When `--backbone=debug`, Ray is disabled. You can use a VSCode launch config: -```json -{ - "version": "0.2.0", - "configurations": [ + ```json title=".vscode/launch.json" { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "module": "agentscope_tuner.cli.launcher", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "./path/to/yaml.yaml" - ], - "env": {} + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "module": "agentscope_tuner.cli.launcher", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "./path/to/yaml.yaml" + ], + "env": {} + } + ] } - ] -} -``` -
+ ``` --- -### 3. Understand - -#### 3.1 What happens each step +## Understanding the Training Pipeline -Each training step does: +### What Happens Each Step -1. **Load one problem** from the dataset (`task_reader`). -2. Run the **AgentScope workflow**: +
+
Training Step Flow
- * Build the prompt from the problem text, - * Let the ReAct agent optionally call a Python tool for computation, - * Extract the **final answer**. -3. Register key info for evaluation (important!): +
+
    +
  1. Load one problem - * The workflow should return a `WorkflowOutput` whose `metadata` carries the final answer, e.g. `WorkflowOutput(reward=None, metadata={"final_answer": final_answer})`. Judges read this metadata directly; no extra API call is needed. -4. Run the **judge** to compute reward: +Load a math problem from the dataset via `task_reader`.
  2. +
  3. Run the AgentScope workflow - * compare `final_answer` with the reference answer from the task, - * output `raw_reward` and `is_success`, - * the trainer uses them to update the policy. +Build the prompt, let the ReAct agent call Python tools, and extract the final answer.
  4. +
  5. Register info for evaluation -#### 3.2 YAML Configuration +Return `WorkflowOutput(reward=None, metadata={"final_answer": final_answer})`.
  6. +
  7. Run the judge -Most wiring happens in `tutorial/example_math_agent/math_agent.yaml`. The key fields are: +Compare `final_answer` with reference, compute `raw_reward` and `is_success`.
  8. +
+
+
-* `astune.task_reader`: where tasks come from -* `astune.rollout.agentscope_workflow`: which workflow runs per sample -* `astune.task_judge.judge_protocol`: which judge computes rewards -* `astune.model.path`: pretrained model you fine-tune +### YAML Configuration -Minimal example: +Most wiring happens in `tutorial/example_math_agent/math_agent.yaml`: -```yaml -astune: +```yaml title="math_agent.yaml" +astuner: task_reader: - type: huggingface_dat_repo # also supports: dataset_file / env_service (if enabled) + type: huggingface_dat_repo # also supports: dataset_file / env_service rollout: agentscope_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn @@ -124,21 +117,18 @@ astune: path: YOUR_MODEL_PATH ``` -#### 3.3 Code Walkthrough +| Field | Description | +|-------|-------------| +| `task_reader` | Where tasks come from | +| `agentscope_workflow` | Which workflow runs per sample | +| `judge_protocol` | Which judge computes rewards | +| `model.path` | Pretrained model to fine-tune | -**Workflow (AgentScope):** `tutorial/example_math_agent/math_agent.py` +### Code Walkthrough -The workflow typically: +**Workflow:** `tutorial/example_math_agent/math_agent.py` -* registers tools (e.g., `execute_python_code`) -* constructs a ReAct agent -* runs one turn from the user problem -* parses the final answer -* returns it via `WorkflowOutput(..., metadata={"final_answer": final_answer})` so the judge can score - -Workflow sketch: - -```python +```python title="Workflow Sketch" self.toolkit = Toolkit() self.toolkit.register_tool_function(execute_python_code) @@ -159,103 +149,82 @@ final_answer = extract_final_answer(result) return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` -**Judge / Reward:** `tutorial/example_math_agent/math_answer_as_judge.py` - -Two simple judges are provided there; you can add your own judge anywhere in the project. - -#### 3.4 Reward - -The judge receives two objects: - -* `workflow_task`: task info; reference answer can be retrieved from here -* `workflow_output`: returned by the workflow; access the final answer with `workflow_output.metadata["final_answer"]` +!!! warning "Important" + Always provide the final answer via `WorkflowOutput.metadata` so the judge can score it. -The judge returns: +### Reward Computation -* `raw_reward` -* `is_success` +The judge receives: -**Practical tip:** -If you observe the model “almost solved it but messed up tool-call formatting / impatiently skipped tool execution”, you can extend the judge to: +| Object | Contains | +|--------|----------| +| `workflow_task` | Task info; reference answer from `metadata` | +| `workflow_output` | Workflow result; final answer from `metadata["final_answer"]` | -* add a format penalty (invalid ``) -* add a behavior penalty (tool called but no `print` / execution result not used) -* keep answer correctness as the primary signal +!!! tip "Extending the Judge" + If you observe issues like "almost solved but messed up tool-call formatting", you can extend the judge to add: + + - Format penalty (invalid ``) + - Behavior penalty (tool called but no `print`) + - Keep answer correctness as the primary signal --- -### 4. Results +## Results -#### 4.1 Training Curve +### Training Curve -![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) +![Training curve](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) -> **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. +!!! info "Visualization" + Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup. -Interpretation: as training progresses, reward increases. This usually means the agent becomes more stable on **two things**: +**Interpretation:** As training progresses, reward increases. This usually means the agent becomes more stable at: -* **Using tools when it should**: it can correctly emit a `` and call `execute_python_code` for computation. -* **Producing more reliable answers**: it can use the tool return (e.g., ``) to output a final answer aligned with the reference. +- **Using tools when needed**: Correctly emitting `` and calling `execute_python_code` +- **Producing reliable answers**: Using tool output to produce final answers aligned with reference -> In practice, the gain here is often less about “stronger math ability” and more about “better tool discipline + more consistent use of execution results”. +### Case Study: Tool Discipline Improvement ---- - -#### 4.2 Case Study: from “can solve” to “can solve with tools” - -Before training, the agent may already solve many problems. However, smaller models often fail at **tool-call discipline**, e.g.: - -* forgetting to `print` the computed value in Python (the tool ran, but produced no usable output), -* outputting the final answer before the tool execution finishes (premature answering), -* malformed `` blocks (tool not triggered / parsing fails). - -##### Bad cases: what typical failures look like - -```text -# bad case 1: forgot to print the result in python code - -{"name": "execute_python_code", "arguments": {"code": "... height_difference"}} - +Before training, the agent may solve many problems but often fails at **tool-call discipline**: -# bad case 2: too impatient — outputs final answer without waiting for the tool result - {"name": "execute_python_code", ...} - {"name": "generate_response", "arguments": {"response": "... \\boxed{48} ..."}} -``` - -These failures are usually not because the model “can’t do math”, but because it **does not close the loop** by incorporating the tool execution result: - -* bad case 1: the tool may succeed, but without `print`, `stdout` is empty and the model can’t reliably read the value. -* bad case 2: the model generates a tool call and a final answer back-to-back in the same turn, effectively **skipping the “wait for ``” step**. +=== "Bad Cases" ---- - -##### Good case: after tuning, the tool-use loop becomes closed + ```text + # bad case 1: forgot to print the result in python code + + {"name": "execute_python_code", "arguments": {"code": "... height_difference"}} + -After tuning, the agent often follows a clean 3-stage pattern (corresponding to Message 3/4/5 in the screenshots): + # bad case 2: too impatient — outputs final answer without waiting for tool result + {"name": "execute_python_code", ...} + {"name": "generate_response", "arguments": {"response": "... \\boxed{48} ..."}} + ``` -1. **Message 3 (assistant)**: decomposes the problem + emits a ``, and uses `print(...)` to output key values -2. **Message 4 (tool_response)**: the tool returns execution results (e.g., `returncode=0`, `stdout=...`) -3. **Message 5 (assistant)**: reads `stdout` and then produces the final answer (e.g., `\\boxed{18}`) + These failures are not because the model "can't do math", but because it **does not close the loop** by incorporating the tool execution result. -![image](https://img.alicdn.com/imgextra/i4/O1CN01v1gGQZ1ftMiil5Cxg_!!6000000004064-2-tps-1367-684.png) +=== "Good Case (After Tuning)" -![image](https://img.alicdn.com/imgextra/i4/O1CN01WarPpf1yNk4awZOIO_!!6000000006567-2-tps-1363-422.png) + After tuning, the agent follows a clean 3-stage pattern: -> **Token-level Visualization:** These detailed logs are generated by Beast-Logger. See [Beast-Logger Usage](./beast_logger.md) for more details. + 1. **Message 3 (assistant)**: Decomposes problem + emits `` with `print(...)` + 2. **Message 4 (tool_response)**: Tool returns execution results + 3. **Message 5 (assistant)**: Reads `stdout` and produces final answer -On the right side of the figure, the colored blocks are a **token-level sequence visualization**: + ![Good case](https://img.alicdn.com/imgextra/i4/O1CN01v1gGQZ1ftMiil5Cxg_!!6000000004064-2-tps-1367-684.png) -* **each block is one token** (the number inside is the token id), -* the order of blocks is the order the model **consumed/generated** tokens, -* what matters is not the token id itself, but whether you can see clear boundary markers such as: +!!! note "Token-level Visualization" + The colored blocks show token-level sequence visualization from [Beast-Logger](./beast_logger.md): + + - **Yellow tokens**: Excluded from loss computation + - **Blue tokens**: Participate in loss computation (light to dark = high to low logprob) - * ` assistant ... ... ` - * ` user ... 18.0 ... ` - * ` assistant ... \\boxed{18} ... ` -* Yellow tokens: tokens that are excluded from loss computation. Blue tokens: tokens that participant loss computation (Blue color from light to dark indicates `logprob` from high to low). +--- -A “good” tool-call behavior typically shows up in logs as: +## Next Steps -* `` and `` appear in **separate turns** (call → response → answer), -* `` contains **non-empty stdout**, -* the final answer appears **after** the tool returns, rather than being produced prematurely. + diff --git a/docs/en/installation.md b/docs/en/installation.md index a182bb16..40948b89 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -2,16 +2,19 @@ This document provides a step-by-step guide to installing AgentScope-Tuner. -```{tip} -AgentScope Tuner is under active development and iteration. We recommend installing from source to get the latest futures and bug fixes. -``` +!!! tip "Latest Version Recommended" + AgentScope Tuner is under active development and iteration. We recommend installing from source to get the latest features and bug fixes. -## Prerequisites +--- -- Python 3.10 +## Prerequisites -- CUDA 12.8 or higher +| Requirement | Version | +|-------------|---------| +| **Python** | 3.10 | +| **CUDA** | 12.8 or higher | +--- ## Install from Source @@ -24,45 +27,57 @@ git clone https://github.com/agentscope-ai/agentscope-tuner.git cd agentscope-tuner ``` - ### Step 2: Install Dependencies -#### 1. Install in your native system +AgentScope-Tuner supports multiple backbones. Currently we have `verl` and `trinity` (recommended). + +!!! info "Package Manager" + We recommend using `uv` to manage your Python environment as it is incredibly fast. See also [`uv` installation document](https://docs.astral.sh/uv/getting-started/installation/). + + If you prefer `conda`, you can also install via conda and pip (simply change `uv pip` to `pip`). + +=== "Trinity (Recommended)" -AgentScope-Tuner supports multiple backbones, currently we have `verl` and `trinity` (recommended). -You can choose you backbone as you wish, and choose any one of them during training as you wish. -We recommend using `uv` to manage your Python environment as it is incredibly fast. See also [`uv` installation document](https://docs.astral.sh/uv/getting-started/installation/). However, if you wish to use `conda`, you can also install it via conda and pip (simply change to `uv pip` to `pip`): + Install with `trinity` training backbone for fully asynchronous RFT: + ```bash + uv venv --python=3.10 + source .venv/bin/activate + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + ``` +=== "Verl" -- Install with `trinity` training backbone (Recommended). - ```bash - uv venv --python=3.10 - source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache - ``` + Install with `verl` training backbone: + ```bash + uv venv --python=3.10 + source .venv/bin/activate + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + ``` -- Install with `verl` training backbone. - ```bash - uv venv --python=3.10 - source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # Hint: flash-attn must be installed after other deps, to ensure a successful installation, export MAX_JOBS=${N_CPU} to build faster, or, ensure health connection to Github to install pre-compiled wheels - ``` + !!! warning "flash-attn Installation" + `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. +--- -#### 2. Install one-click via docker +## Install via Docker -If you prefer one-click dependency installation, we provide image to jump start! +If you prefer one-click dependency installation, we provide a Docker image to jump start! -However, before proceeding, ensure you have `nvidia docker` installed on your system. -Cuda is needed inside our docker container, which need toolkits from Nvidia for GPU support. -Please install nvidia docker runtime on the host ubuntu system. -For details, refer to [nvidia official document](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian). -According the link above, we also write a manual about installing nvidia docker runtime in ubuntu linux environment, please read [set up nvidia docker environment](./setup_ubuntu.md). +!!! warning "Prerequisites" + Before proceeding, ensure you have **nvidia docker** installed on your system. CUDA is needed inside our docker container, which requires toolkits from Nvidia for GPU support. +### Setup Nvidia Docker Runtime + +Please install nvidia docker runtime on the host Ubuntu system. For details, refer to: + +- [Nvidia Official Document](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian) +- [Setup Ubuntu Guide](./setup_ubuntu.md) (our step-by-step manual) + +### Run Docker Container This command mounts your current working directory (the root directory of agentscope-tuner) to `/workspace` and your data directory to `/data` inside the container. @@ -75,3 +90,45 @@ docker run -it \ -v /path/to/your/checkpoint/and/data:/data \ agentscope-tuner:latest ``` + +--- + +## Verify Installation + +After installation, verify that everything is working correctly: + +```python +import agentscope_tuner +print(agentscope_tuner.__version__) +``` + +--- + +## Troubleshooting + +??? note "Common Issues" + **Issue**: `flash-attn` installation fails + + **Solution**: Make sure you have CUDA toolkit installed and `MAX_JOBS` environment variable set: + ```bash + export MAX_JOBS=4 + uv pip install flash-attn --no-build-isolation + ``` + +??? note "GPU Not Detected" + **Issue**: Docker container doesn't see GPU + + **Solution**: Ensure nvidia-docker is properly installed: + ```bash + nvidia-smi # Should show GPU info + docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi + ``` + +--- + +## Next Steps + + diff --git a/docs/en/intro.md b/docs/en/intro.md index c76fd50a..be16b2c4 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -6,103 +6,119 @@ Simply provide your AgentScope workflow, training data, and reward function, and --- -### ✨ Features +## Features -We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: +We aim to build an easy-to-learn AgentScope tuner that unlocks more possibilities for agent developers: -- **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. -- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](#example-library) as tutorials. -- **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. -- **Flexible and Fast**. ASTuner supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. -- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). + + +!!! tip "Multi-Agent Support" + ASTuner supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by **1.5x to 20x** when the workflow involves multi-turn (or multi-agent) conversations. + +!!! info "Reliability & Reproducibility" + Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/). -For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: - +### For Advanced Researchers -- **High-Resolution Logging**: ASTuner allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. -- **Fast Debugging**: ASTuner also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. +ASTuner also provides high-resolution logging and debugging solutions: + +| Feature | Description | +|---------|-------------| +| **High-Resolution Logging** | Save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs | +| **Fast Debugging** | Use `--backbone=debug` option, shortening wait time from minutes to seconds after code changes | --- -### 🚀 Quick Start +## Quick Start -#### Installation +### Installation We recommend using `uv` for dependency management. -1. **Clone the Repository**: -```bash -git clone https://github.com/agentscope-ai/agentscope-tuner.git -cd agentscope-tuner -``` +=== "Step 1: Clone Repository" + ```bash + git clone https://github.com/agentscope-ai/agentscope-tuner.git + cd agentscope-tuner + ``` -2. **Set up Environment**: -```bash -uv venv --python=3.10.16 && source .venv/bin/activate -uv pip install -e .[trinity] -# Note: flash-attn must be installed after other dependencies -uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir -``` +=== "Step 2: Setup Environment" + ```bash + uv venv --python=3.10.16 && source .venv/bin/activate + uv pip install -e .[trinity] + # Note: flash-attn must be installed after other dependencies + uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir + ``` -#### Run Training +### Run Training You can start training your first agent with a single command using a pre-configured YAML file: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -Details in [Math agent](./example_math_agent.md) -#### Example Library +!!! example "Learn More" + See the [Math Agent](./example_math_agent.md) example for detailed explanation. -Explore our rich library of examples to kickstart your journey: +--- + +## Example Library {#example-library} -- 🔢 [**Training a math agent that can write python code**](./example_math_agent.md). -- 📱 [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). -- 🐺 [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). -- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). -- 🎴 [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). -- 🚶 [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). +Explore our rich library of examples to kickstart your journey: + --- -### 🧩 Core Concepts +## Core Concepts ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic.
-image - +ASTuner Architecture
-#### 1. The User-Centric Interface +### 1. The User-Centric Interface To optimize an agent, you provide three core inputs: -* [**Trainable Workflow**](./workflow.md): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. -* [**Task Reader**](./data_pipeline.md): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. -* [**Task Judger**](./task_judger.md): Evaluates agent outputs and assigns rewards to guide training. + -#### 2. Internal System Architecture +### 2. Internal System Architecture The internal system orchestrates several specialized modules to handle the complexities of RL training and agent interactions. -* **Launcher**: Manages background service processes (Ray, vLLM) and routes the backbone. -* **Task Reader**: Handles data ingestion, augmentation, and filtering. -* **Task Rollout**: Bridges LLM engines and manages the Gym environment lifecycle. -* **Task Runner**: Executes the AgentScope workflow and calculates rewards. -* **Model Tuner**: Forwards inference requests from the workflow to the LLM engine. -* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **3x to 10x**. - +| Module | Description | +|--------|-------------| +| **Launcher** | Manages background service processes (Ray, vLLM) and routes the backbone | +| **Task Reader** | Handles data ingestion, augmentation, and filtering | +| **Task Rollout** | Bridges LLM engines and manages the Gym environment lifecycle | +| **Task Runner** | Executes the AgentScope workflow and calculates rewards | +| **Model Tuner** | Forwards inference requests from the workflow to the LLM engine | +| **Context Tracker** | Monitors LLM calls and automatically merges shared-history timelines (**3x-10x** efficiency boost) | --- -### 🚦 Navigation +## Next Steps -* 📖 **Tutorials**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. -* 🛠️ **Core Components**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). -* 💡 **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). -* ⚙️ **Deep Dive**: Master advanced [Configuration](./configuration.md). + diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 098c899c..a3d73f38 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -6,7 +6,7 @@ Simply provide your AgentScope workflow, training data, and reward function, and --- -### ✨ Features +### Features We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: @@ -24,7 +24,7 @@ For advanced researchers, ASTuner also provides high-resolution logging and debu --- -### 🚀 Quick Start +### Quick Start #### Installation @@ -58,17 +58,17 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' Explore our rich library of examples to kickstart your journey: -- 🔢 [**Training a math agent that can write python code**](./example_math_agent.md). -- 📱 [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). -- 🐺 [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). -- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). -- 🎴 [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). -- 🚶 [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). +- [**Training a math agent that can write python code**](./example_math_agent.md). +- [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). +- [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). +- [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). +- [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). +- [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). --- -### 🧩 Core Concepts +### Core Concepts ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. @@ -99,9 +99,9 @@ The internal system orchestrates several specialized modules to handle the compl --- -### 🚦 Navigation +### Navigation -* 📖 **Tutorials**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. -* 🛠️ **Core Components**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). -* 💡 **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). -* ⚙️ **Deep Dive**: Master advanced [Configuration](./configuration.md). +* **Tutorials**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. +* **Core Components**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). +* **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). +* **Deep Dive**: Master advanced [Configuration](./configuration.md). diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index fafe28a0..7b4117a4 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -6,39 +6,79 @@ AgentScope Tuner provides a complete feature set for tuning agents. You can try astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` +--- -### Minimum Example +## Minimum Example Let's begin with the simplest example: a math agent with a tool call. -- First, please check out the [installation guide](./installation.md) to set up the training environment. -- Then, tune your first model using the minimum example below (suppose you have written an Agent called `MathToolWorkflow`). - ```python - from agentscope_tuner import AstunerJob - from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow - model_path = "YOUR_MODEL_PATH" - job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) - job.set_workflow(MathToolWorkflow) - job.set_data(type="hf", dataset_path='openai/gsm8k') - # [Optional: Save yaml file for manual adjustment] job.dump_job_as_yaml('saved_experiments/math.yaml') - # [Optional: Load yaml file from manual adjustment] job.load_job_from_yaml('saved_experiments/math.yaml') - tuned_model = job.tune() # Equivalent to `astuner --conf ./saved_experiments/math.yaml` in the terminal - ``` - -### Explore Examples +
+
Getting Started Flow
+ +
+
    +
  1. Set up Environment + +Check out the [installation guide](./installation.md) to set up the training environment.
  2. +
  3. Define Your Workflow + +Write an Agent class (e.g., `MathToolWorkflow`) that inherits from the base Workflow class.
  4. +
  5. Configure and Run + +Use the `AstunerJob` API to configure and start training.
  6. +
+
+
+ +### Code Example + +```python title="train_math_agent.py" +from agentscope_tuner import AstunerJob +from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow + +model_path = "YOUR_MODEL_PATH" +job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) +job.set_workflow(MathToolWorkflow) +job.set_data(type="hf", dataset_path='openai/gsm8k') + +# [Optional] Save yaml file for manual adjustment +# job.dump_job_as_yaml('saved_experiments/math.yaml') + +# [Optional] Load yaml file from manual adjustment +# job.load_job_from_yaml('saved_experiments/math.yaml') + +# Start training +tuned_model = job.tune() +``` + +!!! tip "CLI Alternative" + The code above is equivalent to running in terminal: + ```bash + astuner --conf ./saved_experiments/math.yaml + ``` + +--- + +## Explore Examples Explore our rich library of examples to kickstart your journey: -- 🔢 [**Training a math agent that can write python code**](./example_math_agent.md). -- 📱 [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). -- 🐺 [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). -- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). -- 🎴 [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). -- 🚶 [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). + +--- -### Tune Your First Agent From Scratch +--- -Begin to build your own agent and tune it following our document: +## Next Steps -- 📚 [**Tune Your First Agent**](./tune_your_first_agent.md). + diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index 58a60f7e..6d3ab99e 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -8,10 +8,13 @@ Task Judger evaluates agent outputs and assigns rewards during training. This pa A Task Judger evaluates the agent's execution results and returns two values: -- **`raw_reward`** (`float`): Numerical score representing output quality (often normalized, e.g. 0.0 to 1.0, but may exceed 1.0 depending on the judger) -- **`is_success`** (`bool`): Whether the task was successfully completed +| Return Value | Type | Description | +|--------------|------|-------------| +| `raw_reward` | `float` | Numerical score representing output quality (often 0.0 to 1.0) | +| `is_success` | `bool` | Whether the task was successfully completed | -These values guide the RL training process, helping agents learn which behaviors produce better outcomes. +!!! info "Training Guidance" + These values guide the RL training process, helping agents learn which behaviors produce better outcomes. --- @@ -19,7 +22,7 @@ These values guide the RL training process, helping agents learn which behaviors All Task Judgers inherit from `BaseJudge` and implement the `compute_reward` method: -```python +```python title="base_judge.py" from agentscope_tuner.task_judge.base_judge import BaseJudge from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask @@ -53,31 +56,32 @@ AgentScope Tuner provides three built-in judgers for common evaluation scenarios Evaluates mathematical answers by exact string matching, designed for tasks where answers are formatted in LaTeX `\boxed{}` notation. -**When to use:** +!!! tip "When to use" + - Math problem solving tasks + - Tasks with deterministic, exact answers + - Answers formatted as `\boxed{result}` -* Math problem solving tasks -* Tasks with deterministic, exact answers -* Answers formatted as `\boxed{result}` +=== "Configuration" -**Configuration:** - -```yaml -astuner: - task_judge: - judge_type: customized_protocol + ```yaml title="config.yaml" + astuner: + task_judge: + judge_type: customized_protocol judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge -``` + ``` -**How it works:** +=== "How it works" -1. Extracts the answer from `\boxed{...}` in the agent's output -2. Compares with the reference answer from `workflow_task.task.metadata["answer"]` -3. Returns `(1.0, True)` for correct answers, `(0.0, False)` otherwise + 1. Extracts the answer from `\boxed{...}` in the agent's output + 2. Compares with the reference answer from `workflow_task.task.metadata["answer"]` + 3. Returns `(1.0, True)` for correct answers, `(0.0, False)` otherwise **Required metadata:** -* `workflow_output.metadata["final_answer"]`: Agent's answer with `\boxed{}` format -* `workflow_task.task.metadata["answer"]`: Reference answer +| Field | Source | Description | +|-------|--------|-------------| +| `final_answer` | `workflow_output.metadata` | Agent's answer with `\boxed{}` format | +| `answer` | `workflow_task.task.metadata` | Reference answer | --- @@ -85,32 +89,27 @@ astuner: Evaluates mathematical equations with partial credit for proper formatting. -**When to use:** - -* Number puzzle tasks (e.g., Countdown game) -* Tasks where partial credit is appropriate -* Need to reward proper formatting even when answer is wrong +!!! tip "When to use" + - Number puzzle tasks (e.g., Countdown game) + - Tasks where partial credit is appropriate + - Need to reward proper formatting even when answer is wrong -**Configuration:** +=== "Configuration" -```yaml -astuner: - task_judge: - judge_type: customized_protocol + ```yaml title="config.yaml" + astuner: + task_judge: + judge_type: customized_protocol judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge -``` + ``` -**Scoring:** +=== "Scoring" -* `0.0`: Invalid or missing answer -* `0.1`: Properly formatted equation but wrong result -* `1.0`: Correct equation and result - -**Required metadata:** - -* `workflow_output.metadata["final_answer"]`: Equation string with `\boxed{}` format -* `workflow_output.metadata["target"]`: Target number -* `workflow_output.metadata["nums"]`: Available numbers for the equation + | Score | Condition | + |-------|-----------| + | `0.0` | Invalid or missing answer | + | `0.1` | Properly formatted equation but wrong result | + | `1.0` | Correct equation and result | --- @@ -118,28 +117,23 @@ astuner: Delegates evaluation to an external environment service, useful for complex interactive environments. -**When to use:** - -* Tasks with external simulators (e.g., AppWorld) -* Complex state-based evaluation -* Interactive environments with built-in evaluators - -**Configuration:** +!!! tip "When to use" + - Tasks with external simulators (e.g., AppWorld) + - Complex state-based evaluation + - Interactive environments with built-in evaluators -```yaml +```yaml title="config.yaml" astuner: task_judge: judge_type: customized_protocol judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge ``` -**How it works:** - -1. Calls `workflow_task.gym_env.evaluate()` to get a score from the environment -2. Converts the score to a normalized reward: - - * Success (score ≥ 1): `1.0 + score * 0.5` - * Failure (score < 1): `0.0 + score * 0.5` +!!! note "How it works" + 1. Calls `workflow_task.gym_env.evaluate()` to get a score from the environment + 2. Converts the score to a normalized reward: + - Success (score ≥ 1): `1.0 + score * 0.5` + - Failure (score < 1): `0.0 + score * 0.5` --- @@ -147,11 +141,27 @@ astuner: For specialized evaluation needs, create your own judger by inheriting `BaseJudge`: -### Step 1: Implement Your Judger +
+
Custom Judger Steps
+ +
+
    +
  1. Implement Your Judger + +Create a new file with your custom judger class.
  2. +
  3. Configure Your Judger + +Point to your custom class in the YAML configuration.
  4. +
  5. Pass Data to the Judger + +Populate `workflow_output.metadata` with the data your judger needs.
  6. +
+
+
-Create a new file (e.g., `tutorial/my_task/my_judge.py`): +### Step 1: Implement Your Judger -```python +```python title="tutorial/my_task/my_judge.py" from agentscope_tuner.task_judge.base_judge import BaseJudge from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask @@ -180,9 +190,7 @@ class MyCustomJudge(BaseJudge): ### Step 2: Configure Your Judger -In your YAML configuration: - -```yaml +```yaml title="config.yaml" astuner: task_judge: judge_type: customized_protocol @@ -191,9 +199,7 @@ astuner: ### Step 3: Pass Data to the Judger -In your workflow, populate `workflow_output.metadata` with the data your judger needs: - -```python +```python title="workflow.py" class MyWorkflow(Workflow): async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: final_answer = await self.agent.reply(msg) @@ -209,9 +215,18 @@ class MyWorkflow(Workflow): ## Configuration Summary -```yaml +```yaml title="config.yaml" astuner: task_judge: judge_type: customized_protocol judge_protocol: agentscope_tuner.task_judge.-> ``` + +--- + +## Next Steps + + diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index c332e836..597b7e17 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -1,19 +1,44 @@ # Tune Your First Agent -In this document, we demonstrate how to implement and train, from scratch, this agent that can use Python to perform calculations and solve complex math problems. +In this document, we demonstrate how to implement and train, from scratch, an agent that can use Python to perform calculations and solve complex math problems. -We will go through the following steps in order: +
+
Training Pipeline Overview
-1. Prepare training data and environment -2. Define the agent and a trainable workflow -3. Define reward -4. Configure training hyperparameters -5. Debug -6. Start training & monitor metrics +
+
    +
  1. Prepare training data and environment -After completing the whole process, you will obtain a Math Agent that can be used in a math task environment, understand the core concepts in AgentScope Tuner, and learn how to design your own training pipeline. +Set up the dataset and configure the task reader.
  2. +
  3. Define the agent and trainable workflow -## Prepare the working directory +Create your agent using AgentScope and wrap it in a Workflow class.
  4. +
  5. Define reward function + +Configure how the agent's outputs are evaluated and scored.
  6. +
  7. Configure training hyperparameters + +Set model path, batch size, and other training parameters.
  8. +
  9. Debug + +Test your workflow in debug mode before full training.
  10. +
  11. Start training & monitor metrics + +Launch the training process and track progress.
  12. +
+
+
+ +!!! success "What You'll Learn" + After completing this guide, you will: + + - Obtain a Math Agent that can solve math problems using Python + - Understand the core concepts in AgentScope Tuner + - Learn how to design your own training pipeline + +--- + +## Step 1: Prepare the Working Directory First, create a directory for this training project: @@ -29,14 +54,16 @@ After running the commands above, the directory should contain: ``` /math_agent /math_agent.yaml # Configuration file - /workflow.py # Training workflow; will contain the definition of the agent and its interaction with the environment + /workflow.py # Training workflow definition ``` -## Configure Project Name +--- -Next, give the project a shiny name in the config file: +## Step 2: Configure Project Name -```yaml +Give the project a name in the config file: + +```yaml title="math_agent.yaml" astuner: project_name: math_agent @@ -53,27 +80,26 @@ defaults: - trinity_default # trinity inherit 1/1 - astuner_default - _self_ - ``` +``` -## Prepare training data +--- -The agent needs to be trained in a specific task environment, driven by training data. In this section we first prepare the data and environment. +## Step 3: Prepare Training Data -ASTuner provides multiple ways to read data: +The agent needs to be trained in a specific task environment, driven by training data. -- Read from local files on disk -- Read from a Hugging Face repo -- Read from an EnvService +!!! info "Data Sources" + ASTuner provides multiple ways to read data: + + - Read from local files on disk + - Read from a Hugging Face repo + - Read from an EnvService All data will be converted into a unified ASTuner data format after loading. -In this example, we will directly use the `openai/gsm8k` dataset from a Hugging Face repo as our training data. +In this example, we will use the `openai/gsm8k` dataset from Hugging Face: -> `openai/gsm8k` is a classic math problem dataset. - -Add the following to `math_agent.yaml`: - -```yaml +```yaml title="math_agent.yaml" astuner: project_name: math_agent task_reader: @@ -88,22 +114,29 @@ astuner: max_response_length: 10000 ``` -In this configuration we: +| Configuration | Description | +|--------------|-------------| +| `type` | Use the `huggingface_dat_repo` reader | +| `dataset_path` | Path to the HuggingFace dataset | +| `train_batch_size` | Training batch size (hyperparameter) | +| `max_prompt_length` | Maximum input length | +| `max_response_length` | Maximum response/answer length | -- Specify that we use the `huggingface_dat_repo` reader, and configure the dataset path and the names of the training and validation splits -- Configure the training batch size (a hyperparameter), and set the maximum input length and maximum response length (answer length) +--- -At this point, all data-related configuration is finished, and the remaining work will be handled automatically by ASTuner. +## Step 4: Prepare the Workflow -## Prepare the workflow +In ASTuner, a workflow is the basic unit for training. It defines: -In ASTuner, a workflow is the basic unit for training. It defines the agent's behavior, tools, context, the detailed interaction procedure between the agent and the environment, and how to calculate rewards. +- Agent's behavior and tools +- Interaction procedure with the environment +- How to calculate rewards -We will implement our workflow in `workflow.py`. +### Define the Agent -First, import the necessary dependencies from `agentscope` and design an agent: +First, import dependencies and design an agent in `workflow.py`: -```python +```python title="workflow.py" from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -113,16 +146,17 @@ system_prompt = """ You are an agent specialized in solving math problems with tools. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. -You should return your final answer within \\boxed{{}}. +You should return your final answer within \\boxed{}. """ toolkit = Toolkit() toolkit.register_tool_function(execute_python_code) +# Agent definition (model will be set later) ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model= # leave empty for now, + model=None, # leave empty for now formatter=DashScopeChatFormatter(), toolkit=toolkit, memory=InMemoryMemory(), @@ -130,18 +164,19 @@ ReActAgent( ) ``` -With this code, we quickly define a complete ReAct agent: +!!! note "Agent Features" + This agent: + + - Uses the ReAct paradigm to interact with tools + - Has a custom system prompt + - Registers `execute_python_code` as a tool + - Implements in-memory memory -- Uses the ReAct paradigm to interact with the environment/tools -- Sets a system prompt -- Registers a tool: execute_python_code -- Implements in-memory memory +### Wrap in Workflow Class -> For more detailed configuration options, please refer to the official AgentScope documentation. +Next, wrap the agent into a trainable workflow: -Next, we implement the remaining code for training this agent: - -```python +```python title="workflow.py" from agentscope_tuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from loguru import logger @@ -150,7 +185,7 @@ system_prompt = """ You are an agent specialized in solving math problems with tools. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. -You should return your final answer within \\boxed{{}}. +You should return your final answer within \\boxed{}. """ def extract_final_answer(result) -> str: @@ -171,6 +206,7 @@ def extract_final_answer(result) -> str: logger.warning(f"Extract final answer error: {e}. Raw: {result}") return str(result) + class MathAgentWorkflow(Workflow): name: str = "math_agent_workflow" @@ -188,7 +224,7 @@ class MathAgentWorkflow(Workflow): self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner # use model_tuner as the model, + model=model_tuner, # use model_tuner as the model formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -203,143 +239,142 @@ class MathAgentWorkflow(Workflow): final_answer = extract_final_answer(result) # pass the final answer to the output return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) - ``` +``` -In this code, we wrap the agent into a workflow and implement the `execute` function: +!!! warning "Key Change" + The critical step is setting `model=model_tuner` — this is what makes the agent trainable! -1. Read the input from `WorkflowTask` -2. Construct the agent in the same way as before, but **set `model` to `model_tuner`** — this is the key to making the agent trainable -3. Run the agent -4. Parse the agent's output and pack the answer into a `WorkflowOutput` object +### Configure Workflow in YAML -After defining the workflow, we also need to tell ASTuner to use this class as the training protocol. Add the following to `math_agent.yaml`: +Add the workflow configuration to `math_agent.yaml`: -```yaml +```yaml title="math_agent.yaml" astuner: # ... rollout: agentscope_workflow: workflow.py->MathAgentWorkflow -``` - -There is one more thing we have not addressed yet: the reward. Fortunately, ASTuner also supports customizing how rewards are calculated through configuration. Continue editing the config: - -```yaml -astuner: - #... task_judge: judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge ``` -Here we directly use the built-in math judge provided by ASTuner. The judge reads `final_answer` from `metadata` and compares it with the ground-truth answers in the dataset to produce a score. +The judge reads `final_answer` from `metadata` and compares it with ground-truth answers to produce a score. -## Configure required parameters +--- -Next, to actually start training, we need to add several required configuration parameters. +## Step 5: Configure Required Parameters -### Pretrained model +### Pretrained Model -In `math_agent.yaml`, specify the LLM used by the agent, i.e., the model we are going to train: +Specify the LLM to train: -```yaml +```yaml title="math_agent.yaml" astuner: model: path: Qwen/Qwen2.5-14B-Instruct ``` -The `path` can be a remote Hugging Face repo, or a local directory path. - -### Training hyperparameters - -We also need to configure several important training hyperparameters: - -```yaml -astuner: - # ... - rollout: - agentscope_workflow: workflow.py->MathAgentWorkflow - # Model temperature - temperature: 0.7 - # Maximum number of parallel rollout workers - max_env_worker: 64 - num_repeat: 4 - # Forced reward when the model outputs gibberish - agent_madness_reward: 0.0 - # vLLM tensor parallelism - tensor_model_parallel_size: 1 - # Maximum number of parallel sequences in vLLM - max_num_seqs: 40 - multi_turn: - max_sample_per_task: 4 - # Types of gibberish to check for: meaningless content, wrong tool calls - compute_madness_checklist: - - "nonsense" - - "wrong_toolcall" - # Maximum response length in a single interaction - max_response_length_in_one_turn: 1024 - # Maximum context length of the model - max_model_len: 13000 - - trainer_common: - # Save interval (save every n steps) - save_freq: 99999 - # Evaluation interval (evaluate every n steps) - test_freq: 99999 - # Total number of training epochs - total_epochs: 99999 - # Number of vLLM engines, must be divisible by tensor_model_parallel_size - trinity_only__n_vllm_engine: 2 - -trinity: - trainer: - max_token_len_per_gpu: 13000 -``` - -## Debug - -At this point, all the code and configuration required to train an agent are ready. - -Next, we will start the training process in debug mode to check whether there are any issues. You can also skip this step and directly start training. - -Start training in debug mode: +!!! tip "Model Path" + The `path` can be a remote Hugging Face repo, or a local directory path. + +### Training Hyperparameters + +Configure important training hyperparameters: + +??? example "Full Configuration Example" + ```yaml title="math_agent.yaml" + astuner: + # ... + rollout: + agentscope_workflow: workflow.py->MathAgentWorkflow + temperature: 0.7 + max_env_worker: 64 + num_repeat: 4 + agent_madness_reward: 0.0 + tensor_model_parallel_size: 1 + max_num_seqs: 40 + multi_turn: + max_sample_per_task: 4 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" + max_response_length_in_one_turn: 1024 + max_model_len: 13000 + + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + trinity_only__n_vllm_engine: 2 + + trinity: + trainer: + max_token_len_per_gpu: 13000 + ``` + +| Parameter | Description | +|-----------|-------------| +| `temperature` | Model sampling temperature | +| `max_env_worker` | Maximum parallel rollout workers | +| `num_repeat` | Number of repetitions per sample | +| `save_freq` | Checkpoint save interval | +| `test_freq` | Evaluation interval | + +--- + +## Step 6: Debug + +Before full training, test in debug mode: ```bash astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview ``` -In debug mode, the Ray cluster will not be started, which is very suitable for single-machine debugging. In addition, you can configure `.vscode/launch.json` in VS Code to conveniently debug with breakpoints: - -```json -{ - "version": "0.2.0", - "configurations": [ +!!! tip "VS Code Debugging" + You can configure `.vscode/launch.json` for breakpoint debugging: + + ```json { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "module": "agentscope_tuner.cli.launcher", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "math_agent/math_agent.yaml" - ], - "env": {} + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "module": "agentscope_tuner.cli.launcher", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "math_agent/math_agent.yaml" + ], + "env": {} + } + ] } - ] -} -``` + ``` + +--- -## Training +## Step 7: Start Training -After debugging, you can start training: +After debugging, launch the full training: ```bash astuner --conf math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -You can find training logs and checkpoints in the `./launcher_record/{exp_yaml_file_name}` directory. +!!! success "Output Location" + Training logs and checkpoints will be saved to: + ``` + ./launcher_record/{exp_yaml_file_name}/ + ``` +--- -## Read more +## Next Steps -We provide more detailed explanations for ASTuner's core concepts and many examples. -You can find them in the left sidebar navigation. + diff --git a/docs/en/visualization.md b/docs/en/visualization.md index 15e91ed0..14057113 100644 --- a/docs/en/visualization.md +++ b/docs/en/visualization.md @@ -1,33 +1,32 @@ # Training Visualization -Monitoring training progress through visualized metrics is essential for understanding model behavior and tuning hyperparameters effectively. AgentScope Tuner supports multiple visualization backends to track training curves, reward trends, and other key metrics in real-time. +Monitoring training progress through visualized metrics is essential for understanding model behavior and tuning hyperparameters effectively. --- -### 1. Supported Visualization Tools +## Supported Visualization Tools -AgentScope Tuner supports the following visualization backends: - -- **SwanLab** (Recommended): A modern experiment tracking platform designed for AI research. [Learn more about SwanLab](https://docs.swanlab.cn/guide_cloud/general/what-is-swanlab.html) -- **WandB**: Weights & Biases experiment tracking platform -- **TensorBoard**: Traditional visualization toolkit from TensorFlow -- **Console**: Simple text-based logging to standard output +
+

SwanLab ⭐

Modern experiment tracking platform designed for AI research. Recommended.

+

WandB

Weights & Biases experiment tracking platform.

+

Console

Simple text-based logging to standard output.

+
--- -### 2. Quick Start with SwanLab +## Quick Start with SwanLab -#### 2.1 Configure SwanLab +### Step 1: Configure SwanLab Simply set the logger backend to `swanlab` in your YAML configuration: -```yaml +```yaml title="config.yaml" astuner: trainer_common: logger: swanlab ``` -#### 2.2 Start Training +### Step 2: Start Training Launch your training as usual: @@ -35,72 +34,73 @@ Launch your training as usual: astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -#### 2.3 View Training Curves - -Once training starts, SwanLab will automatically: +### Step 3: View Training Curves -1. Track key metrics (reward, success rate, loss, etc.) -2. Generate real-time training curves -3. Provide a web dashboard for visualization +!!! success "Automatic Tracking" + Once training starts, SwanLab will automatically: + + 1. Track key metrics (reward, success rate, loss, etc.) + 2. Generate real-time training curves + 3. Provide a web dashboard for visualization -You can access the SwanLab dashboard through the URL printed in the training logs, or visit the SwanLab web interface to view your experiments. +You can access the SwanLab dashboard through the URL printed in the training logs. --- -### 3. Understanding Training Curves - -#### 3.1 Key Metrics to Monitor +## Understanding Training Curves -The following metrics are typically tracked during training: +### Key Metrics to Monitor -- **Reward**: The average reward per episode, indicating task performance -- **Success Rate**: Percentage of successfully completed tasks -- **Loss**: Training loss from the policy optimization algorithm -- **Response Length**: Average length of model responses -- **KL Divergence**: Divergence between the current policy and the reference policy +| Metric | Description | +|--------|-------------| +| **Reward** | Average reward per episode, indicating task performance | +| **Success Rate** | Percentage of successfully completed tasks | +| **Loss** | Training loss from the policy optimization algorithm | +| **Response Length** | Average length of model responses | +| **KL Divergence** | Divergence between current and reference policy | -#### 3.2 Interpreting the Curves +### Interpreting the Curves -**Reward Curve:** +**Example Training Curve:** ![Example Training Curve](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) A typical reward curve shows: -- **Initial Phase**: Reward may be low or unstable as the model explores -- **Learning Phase**: Reward gradually increases as the model learns better strategies -- **Convergence**: Reward plateaus when the model reaches optimal performance +| Phase | Description | +|-------|-------------| +| **Initial** | Reward may be low or unstable as the model explores | +| **Learning** | Reward gradually increases as the model learns better strategies | +| **Convergence** | Reward plateaus when the model reaches optimal performance | -**What to look for:** - -- **Rising trend**: Indicates successful learning -- **Plateaus**: May indicate convergence or need for hyperparameter adjustment -- **Sudden drops**: Could signal instability or overfitting +!!! tip "What to Look For" + - **Rising trend**: Indicates successful learning + - **Plateaus**: May indicate convergence or need for hyperparameter adjustment + - **Sudden drops**: Could signal instability or overfitting --- -### 4. Best Practices +## Best Practices -#### 4.1 Monitor Multiple Runs +### Monitor Multiple Runs -Compare different hyperparameter settings by running multiple experiments and comparing their curves side-by-side in SwanLab or WandB. +Compare different hyperparameter settings by running multiple experiments and comparing their curves side-by-side. -#### 4.2 Set Appropriate Logging Frequency +### Set Appropriate Logging Frequency Balance between logging detail and training overhead: -```yaml +```yaml title="config.yaml" astuner: trainer_common: - # Log every N steps - log_freq: 1 + log_freq: 1 # Log every N steps ``` -#### 4.3 Save Checkpoints at Key Points +### Save Checkpoints at Key Points Configure checkpoint saving to preserve models at peak performance: -```yaml +```yaml title="config.yaml" astuner: trainer_common: save_freq: 100 # Save every 100 steps @@ -108,10 +108,10 @@ astuner: --- -### 5. Learn More - -For more detailed information about visualization and monitoring: +## Next Steps -- [SwanLab Documentation](https://docs.swanlab.cn/guide_cloud/general/what-is-swanlab.html) -- [Configuration Guide](./configuration.md#logging--monitoring) -- [Beast-Logger Usage](./beast_logger.md) - Token-level debugging visualization + diff --git a/docs/en/workflow.md b/docs/en/workflow.md index 6e2c563a..ec2599ca 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -1,11 +1,14 @@ # Trainable Workflow -This tutorial introduces how to define a trainable workflow 🚀 with AgentScope. +This tutorial introduces how to define a trainable workflow with AgentScope. -ASTuner provides two convenient and **mutually compatible** ways to wrap an AgentScope Workflow: +!!! info "Two Approaches" + ASTuner provides two convenient and **mutually compatible** ways to wrap an AgentScope Workflow: + + - **Simple**: Emphasizes simplicity, ease of use, and readability + - **Advanced**: Emphasizes flexibility, controllability, and extensibility -- The first emphasizes **simplicity, ease of use, and readability**; -- The second emphasizes **flexibility, controllability, and extensibility**. +--- ## Simple Agent Scenario @@ -13,65 +16,53 @@ ASTuner provides two convenient and **mutually compatible** ways to wrap an Agen Simply set ReActAgent's `model` argument to `model_tuner` when initializing your agent. -
修改前
- - - - - - - - - - - - -
BeforeAfter
-
agent_instance = ReActAgent(
-   name=f"Friday",
-   sys_prompt="You are a helpful assistant",
-   model=DashScopeChatModel(model_name="qwen-max", stream=False),
-   formatter=DashScopeChatFormatter(),
-)
-
-
agent_instance = ReActAgent(
-   name=f"Friday",
-   sys_prompt="You are a helpful assistant",
-   model=model_tuner,  # change here
-   formatter=DashScopeChatFormatter(),
-)
-
+=== "Before" + + ```python + agent_instance = ReActAgent( + name=f"Friday", + sys_prompt="You are a helpful assistant", + model=DashScopeChatModel(model_name="qwen-max", stream=False), + formatter=DashScopeChatFormatter(), + ) + ``` + +=== "After" -Then, wrap your workflow in a class that inherits `Workflow` (`from astnuer import Workflow`), and the workflow is ready to be tuned. + ```python + agent_instance = ReActAgent( + name=f"Friday", + sys_prompt="You are a helpful assistant", + model=model_tuner, # ← change here + formatter=DashScopeChatFormatter(), + ) + ``` + +Then, wrap your workflow in a class that inherits `Workflow`: ```python +from agentscope_tuner import Workflow, WorkflowTask, WorkflowOutput, ModelTuner + class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: - ... your ReActAgent workflow here ... + # ... your ReActAgent workflow here ... return WorkflowOutput(reward=workflow_reward) - ``` - ### 2. When to Use This Simple Practice -This practice suits most users. You can choose it if you: - -- 🌟 Know exactly which agents should be trained, or the number of agents are small; -- ✨ Already finished basic debugging of your workflow, confirming that your workflow works well when implemented with a non-tuned model such as `qwen-max`; -- 🎇 Do not need to change which agents are trained on the fly. - +!!! tip "Choose Simple Practice If You..." + - Know exactly which agents should be trained, or the number of agents is small + - Already finished basic debugging of your workflow + - Do not need to change which agents are trained on the fly ### 3. Code Example -Suppose you have built a ReAct agent that looks like this: +Suppose you have built a ReAct agent: -```python +```python title="Original AgentScope Code" from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -92,9 +83,9 @@ result = await self.agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) ``` -Then, wrap it in a workflow class: +Wrap it in a workflow class: -```python +```python title="Trainable Workflow" class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" @@ -109,7 +100,7 @@ class ExampleMathLearn(Workflow): self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, + model=model_tuner, # ← Key change! formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -122,17 +113,18 @@ class ExampleMathLearn(Workflow): return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` - +--- ## Advanced Agent Scenario -When designing a **multi-agent collaborative** workflow in which each agent plays a different **role**, ASTuner can provide better training and debugging capabilities. - -With a multi-agent setup, you can: +When designing a **multi-agent collaborative** workflow where each agent plays a different **role**, ASTuner provides enhanced training and debugging capabilities. -- 🌟 **Precisely control** which agents are fine-tuned; -- ✨ Explicitly define the default model used by agents that are **not being trained**; -- ⚡ Switch trainable targets on the fly **without modifying** the workflow source code. +!!! success "Multi-Agent Benefits" + With a multi-agent setup, you can: + + - **Precisely control** which agents are fine-tuned + - Explicitly define the default model for agents **not being trained** + - Switch trainable targets on the fly **without modifying** source code ### 1. Trainability Switch and Model Lifecycle @@ -140,35 +132,39 @@ With a multi-agent setup, you can: In a multi-agent workflow, each agent is associated with a role. -Within the workflow, we register roles to be tuned, and specify the role explicitly when creating agents: - -- **Register**: `model_tuner.register_model(agent_role, default_model=...)` - - Definition: register an agent role in the tuner and provide the default model to be used when the role is not trained / not being trained. -- **Use (bind)**: `model_tuner.get_model(agent_role)` - - Definition: when constructing agents or executing the workflow, return the model object bound to the given `agent_role`. +| Method | Description | +|--------|-------------| +| `model_tuner.register_model(role, default_model=...)` | Register an agent role and provide the default model for non-training scenarios | +| `model_tuner.get_model(role)` | Return the model object bound to the given role | #### Trainable vs. Non-trainable Models -In a workflow, trainability can be controlled at the role level. Whether a role participates in training is determined by the workflow's **`trainable_targets`**: +Trainability is controlled at the role level via **`trainable_targets`**: ```python class ExampleMathLearn(Workflow): name: str = "a_workflow" - trainable_targets: list = ["TYPE-ZERO", ...] + trainable_targets: list = ["TYPE-ZERO", ...] # ← Roles to train # ... ``` -- **Trainable**: if an agent appears in `trainable_targets`, the agent uses the trainable model. -- **Non-trainable**: if an agent does not appear in `trainable_targets`, the agent uses the registered default model. +| Scenario | Model Used | +|----------|------------| +| Role in `trainable_targets` | Trainable model | +| Role NOT in `trainable_targets` | Registered default model | -Regardless of role differences, all agents share a single model instance; i.e., one set of parameters is used to play different roles. +!!! note "Shared Parameters" + Regardless of role differences, all agents share a single model instance (one set of parameters playing different roles). ### 2. Promote to An Advanced ASTuner Workflow -This section demonstrates how to register role-specific trainable targets via `model_tuner.register_model`, and bind models to agents by role during construction. +
+
Conversion Steps
-- Let's begin from a basic AgentScope `ReActAgent`: +
+
    +
  1. Start with a basic AgentScope ReActAgent ```python agent_instance = ReActAgent( @@ -178,46 +174,64 @@ agent_instance = ReActAgent( formatter=DashScopeChatFormatter(), ) ``` +
  2. +
  3. Register the agent role with model_tuner -- Declare the tag of an agent, and specify what model should be used when an agent is not being trained using `model_tuner.register_model`: ```python agent_role = "TYPE-ZERO" -default_model_when_not_training = DashScopeChatModel(model_name="qwen-max", stream=False) -model_tuner.register_model(agent_role, default_model=default_model_when_not_training) +default_model = DashScopeChatModel(model_name="qwen-max", stream=False) +model_tuner.register_model(agent_role, default_model=default_model) ``` +
  4. +
  5. Create ReActAgent linked to the role -- Create `ReActAgent` to link with the `agent_role` using `model_tuner.get_model`: ```python agent_instance = ReActAgent( name=f"Player-X", sys_prompt="You are a helpful assistant", - model=model_tuner.get_model(agent_role), # replace there + model=model_tuner.get_model(agent_role), # ← Bind to role formatter=DashScopeChatFormatter(), ) ``` - -- Wrap the workflow in a class and define `trainable_targets`: +
  6. +
  7. Wrap in workflow class with trainable_targets ```python class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - trainable_targets: list = ["TYPE-ZERO", ...] async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: - ... your agents and workflow here ... + # ... agents and workflow here ... ``` +
  8. +
+
+
-### 3. A Multi-agent Example +### 3. Multi-Agent Example -```python +Here's a complete example with multiple agent roles (Werewolves game): + +```python title="Multi-Agent Workflow" roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] players = [] + for i, role in enumerate(roles): + # Define different default models for different roles default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) - chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys # 🌟 + + chosen_model = ( + default_model_for_good_guys + if role != "werewolf" + else default_model_for_bad_guys + ) + + # Register role with its default model model_tuner.register_model(role, default_model=chosen_model) + + # Create agent bound to the role players += [ReActAgent( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), @@ -226,8 +240,18 @@ for i, role in enumerate(roles): )] ``` -In this example: +!!! tip "Configuration Flexibility" + In this example: + + - `role` describes an agent's in-game identity (werewolf, villager, etc.) + - `chosen_model` defines the default model when the role is not being trained + - You can flexibly switch training targets by modifying `trainable_targets` + +--- + +## Next Steps -- `role` describes an agent's in-game identity (e.g., werewolf, villager) and also serves as the key for `model_tuner.register_model`. -- `chosen_model` defines the default base model to use when the role is not being trained. -- With this setup, you can flexibly specify and switch training and inference behaviors by role in multi-agent workflows. + diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..e1bb7a14 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,126 @@ +# AgentScope Tuner + +**AgentScope Tuner (ASTuner)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. + +Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! + +--- + +## Key Features + + + +--- + +## Quick Start + +### Installation + +We recommend using `uv` for dependency management. + +**1. Clone the Repository:** + +```bash +git clone https://github.com/agentscope-ai/agentscope-tuner.git +cd agentscope-tuner +``` + +**2. Set up Environment:** + +```bash +uv venv --python=3.10.16 && source .venv/bin/activate +uv pip install -e .[trinity] +# Note: flash-attn must be installed after other dependencies +uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir +``` + +### Run Training + +You can start training your first agent with a single command using a pre-configured YAML file: + +```bash +astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +``` + +--- + +## Example Library {#example-library} + +Explore our rich library of examples to kickstart your journey: + + + +--- + +## Core Concepts + +ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. + +
+ASTuner Architecture +
+ +### The User-Centric Interface + +To optimize an agent, you provide three core inputs: + + + +### Internal System Architecture + +The internal system orchestrates several specialized modules: + +| Module | Description | +|--------|-------------| +| **Launcher** | Manages background service processes (Ray, vLLM) and routes the backbone | +| **Task Rollout** | Bridges LLM engines and manages the Gym environment lifecycle | +| **Task Runner** | Executes the AgentScope workflow and calculates rewards | +| **Model Tuner** | Forwards inference requests from the workflow to the LLM engine | +| **Context Tracker** | Monitors LLM calls and automatically merges shared-history timelines (3x-10x efficiency boost) | + +--- + +## For Advanced Researchers + +ASTuner provides high-resolution logging and debugging solutions: + +!!! tip "High-Resolution Logging" + Save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. + +!!! info "Fast Debugging" + Use the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes. + +--- + +## Getting Started + +Follow this learning path to master ASTuner: + + + +--- + +## 中文文档 + +

查看中文文档

完整的中文教程和指南。

+ diff --git a/docs/javascripts/animations.js b/docs/javascripts/animations.js new file mode 100644 index 00000000..00e3603b --- /dev/null +++ b/docs/javascripts/animations.js @@ -0,0 +1,402 @@ +/** + * Animations & Visual Enhancements JavaScript + * Phase 3: 视觉增强 + * + * Features: + * - Scroll-triggered animations + * - Image lazy loading complete handler + * - Copy button animations + * - Smooth scroll behaviors + */ + +(function() { + 'use strict'; + + // ======================================== + // Configuration + // ======================================== + + const config = { + scrollThreshold: 0.1, // 10% of element visible triggers animation + observerOptions: { + root: null, + rootMargin: '0px', + threshold: 0.1 + } + }; + + // ======================================== + // Scroll Animations + // ======================================== + + /** + * Initialize Intersection Observer for scroll animations + */ + function initScrollAnimations() { + // Check if browser supports IntersectionObserver + if (!('IntersectionObserver' in window)) { + console.log('IntersectionObserver not supported, skipping scroll animations'); + return; + } + + // Select elements to animate on scroll + const animateElements = document.querySelectorAll('.fade-in-on-scroll, .slide-in-left, .slide-in-right'); + + if (animateElements.length === 0) return; + + const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('visible'); + // Optionally unobserve after animation + // observer.unobserve(entry.target); + } + }); + }, config.observerOptions); + + animateElements.forEach(el => observer.observe(el)); + } + + // ======================================== + // Image Loading + // ======================================== + + /** + * Handle image lazy loading completion + */ + function initImageAnimations() { + const lazyImages = document.querySelectorAll('img[loading="lazy"]'); + + lazyImages.forEach(img => { + // If image is already loaded + if (img.complete) { + img.classList.add('loaded'); + } else { + // Wait for image to load + img.addEventListener('load', function() { + this.classList.add('loaded'); + }); + + // Handle load errors + img.addEventListener('error', function() { + console.warn('Failed to load image:', this.src); + this.classList.add('loaded'); // Remove shimmer even on error + }); + } + }); + } + + // ======================================== + // Code Block Enhancements + // ======================================== + + /** + * Add language badges to code blocks + */ + function addCodeLanguageBadges() { + const codeBlocks = document.querySelectorAll('pre code[class*="language-"]'); + + codeBlocks.forEach(code => { + const parentPre = code.closest('pre'); + if (!parentPre || parentPre.querySelector('.language-name')) return; + + // Extract language from class + const languageClass = Array.from(code.classList).find(cls => cls.startsWith('language-')); + if (!languageClass) return; + + const language = languageClass.replace('language-', ''); + + // Create badge + const badge = document.createElement('span'); + badge.className = 'language-name'; + badge.textContent = language; + + // Add to parent pre + parentPre.style.position = 'relative'; + parentPre.appendChild(badge); + }); + } + + /** + * Enhanced copy button behavior + */ + function initCopyButtonAnimations() { + // Listen for copy events on the document + document.addEventListener('click', function(e) { + const copyButton = e.target.closest('.copy-button, .md-clipboard, [data-clipboard-target]'); + if (!copyButton) return; + + // Add copied class for animation + copyButton.classList.add('copied'); + + // Optional: Change button text temporarily + const originalText = copyButton.textContent; + if (originalText && !copyButton.querySelector('svg')) { + copyButton.textContent = '✓ Copied!'; + } + + // Remove after animation + setTimeout(() => { + copyButton.classList.remove('copied'); + if (originalText && !copyButton.querySelector('svg')) { + copyButton.textContent = originalText; + } + }, 2000); + }); + } + + // ======================================== + // Smooth Scroll + // ======================================== + + /** + * Smooth scroll to anchor links + */ + function initSmoothScroll() { + document.addEventListener('click', function(e) { + const link = e.target.closest('a[href^="#"]'); + if (!link) return; + + const targetId = link.getAttribute('href').slice(1); + if (!targetId) return; + + const targetElement = document.getElementById(targetId); + if (!targetElement) return; + + e.preventDefault(); + + targetElement.scrollIntoView({ + behavior: 'smooth', + block: 'start' + }); + + // Update URL without jumping + if (history.pushState) { + history.pushState(null, null, `#${targetId}`); + } + }); + } + + // ======================================== + // Reduced Motion Preference + // ======================================== + + /** + * Respect user's reduced motion preference + */ + function handleReducedMotion() { + const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)'); + + function applyReducedMotion(e) { + if (e.matches) { + document.documentElement.style.setProperty('--rm-transition-fast', '0.01ms'); + document.documentElement.style.setProperty('--rm-transition-normal', '0.01ms'); + document.documentElement.style.setProperty('--rm-transition-slow', '0.01ms'); + } else { + document.documentElement.style.setProperty('--rm-transition-fast', '0.15s'); + document.documentElement.style.setProperty('--rm-transition-normal', '0.25s'); + document.documentElement.style.setProperty('--rm-transition-slow', '0.4s'); + } + } + + // Initial check + applyReducedMotion(prefersReducedMotion); + + // Listen for changes + prefersReducedMotion.addEventListener('change', applyReducedMotion); + } + + // ======================================== + // Tab Switching Enhancements + // ======================================== + + /** + * Add smooth transitions to tab content + */ + function enhanceTabSwitching() { + const tabInputs = document.querySelectorAll('.tabbed-set input[type="radio"]'); + + tabInputs.forEach(input => { + input.addEventListener('change', function() { + const tabbedSet = this.closest('.tabbed-set'); + if (!tabbedSet) return; + + const activeBlock = tabbedSet.querySelector('.tabbed-block--active'); + if (activeBlock) { + // Add fade-out animation to old content + activeBlock.style.animation = 'fadeOut 0.15s ease-out'; + + setTimeout(() => { + activeBlock.style.animation = ''; + }, 150); + } + }); + }); + } + + // ======================================== + // Collapsible Details Enhancement + // ======================================== + + /** + * Enhance details/summary elements + */ + function enhanceDetails() { + const detailsElements = document.querySelectorAll('details'); + + detailsElements.forEach(details => { + details.addEventListener('toggle', function() { + if (this.open) { + // Add expand animation + const content = Array.from(this.children).find(el => el.tagName !== 'SUMMARY'); + if (content) { + content.style.animation = 'slideDown 0.25s ease-out'; + } + } + }); + }); + } + + // ======================================== + // Navigation Enhancements + // ======================================== + + /** + * Add active indicator animations to navigation + */ + function enhanceNavigation() { + // Highlight current page in navigation + const currentPath = window.location.pathname; + const navLinks = document.querySelectorAll('.md-nav__link, nav a'); + + navLinks.forEach(link => { + const linkPath = new URL(link.href, window.location.origin).pathname; + + if (linkPath === currentPath) { + link.classList.add('active'); + link.setAttribute('aria-current', 'page'); + + // Ensure parent items are expanded + let parent = link.closest('.md-nav__item--nested, li.has-children'); + while (parent) { + const toggle = parent.querySelector('input[type="checkbox"], .md-nav__toggle'); + if (toggle) { + toggle.checked = true; + } + parent = parent.parentElement.closest('.md-nav__item--nested, li.has-children'); + } + } + }); + } + + // ======================================== + // Performance: Debounce utility + // ======================================== + + function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + + // ======================================== + // Scroll Progress Indicator (Optional) + // ======================================== + + /** + * Add reading progress bar to top of page + */ + function initScrollProgress() { + // Check if progress bar element exists + let progressBar = document.querySelector('.scroll-progress'); + + if (!progressBar) { + // Create progress bar + progressBar = document.createElement('div'); + progressBar.className = 'scroll-progress'; + progressBar.style.cssText = ` + position: fixed; + top: 0; + left: 0; + width: 0%; + height: 3px; + background: var(--primary, #3b82f6); + z-index: 9999; + transition: width 0.1s ease-out; + `; + document.body.appendChild(progressBar); + } + + const updateProgress = debounce(() => { + const windowHeight = window.innerHeight; + const documentHeight = document.documentElement.scrollHeight - windowHeight; + const scrolled = window.scrollY; + const progress = (scrolled / documentHeight) * 100; + + progressBar.style.width = `${Math.min(progress, 100)}%`; + }, 10); + + window.addEventListener('scroll', updateProgress); + updateProgress(); // Initial call + } + + // ======================================== + // Initialization + // ======================================== + + /** + * Initialize all animations when DOM is ready + */ + function init() { + console.log('🎨 Initializing OpenJudge animations...'); + + // Core animations + handleReducedMotion(); + initScrollAnimations(); + initImageAnimations(); + initSmoothScroll(); + + // UI enhancements + addCodeLanguageBadges(); + initCopyButtonAnimations(); + enhanceTabSwitching(); + enhanceDetails(); + enhanceNavigation(); + + // Optional: Enable scroll progress + // initScrollProgress(); + + console.log('✨ Animations initialized successfully'); + } + + // Run on DOM ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + // DOM is already ready + init(); + } + + // Re-initialize on page navigation (for SPA-like behavior) + if ('navigation' in window && 'addEventListener' in window.navigation) { + window.navigation.addEventListener('navigate', () => { + setTimeout(init, 100); + }); + } + + // Expose utilities to global scope (optional) + window.OpenJudgeAnimations = { + debounce, + initScrollAnimations, + initImageAnimations, + addCodeLanguageBadges + }; + +})(); + diff --git a/docs/javascripts/code-copy.js b/docs/javascripts/code-copy.js new file mode 100644 index 00000000..9f66108f --- /dev/null +++ b/docs/javascripts/code-copy.js @@ -0,0 +1,174 @@ +/** + * Code Copy Button - Universal code block copy functionality + * Adds copy buttons to all code blocks (non-tabbed) + */ + +(function() { + 'use strict'; + + function initCodeCopyButtons() { + // Find all code blocks that don't already have a copy button + // Exclude tabbed code blocks (handled by tabbed-code.js) + const codeBlocks = document.querySelectorAll('article pre, .prose pre, .md-typeset pre'); + + codeBlocks.forEach(function(preElement) { + // Skip if already has a copy button + if (preElement.querySelector('.copy-button')) { + return; + } + + // Skip if it's inside a tabbed set + if (preElement.closest('.tabbed-set')) { + return; + } + + // Skip if it's a tabbed block + if (preElement.classList.contains('tabbed-block') || preElement.closest('.tabbed-block')) { + return; + } + + // Create copy button + const copyButton = document.createElement('button'); + copyButton.className = 'copy-button code-copy-btn'; + copyButton.innerHTML = ''; + copyButton.setAttribute('aria-label', 'Copy code'); + copyButton.setAttribute('title', 'Copy code'); + + // Add click handler + copyButton.addEventListener('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + + // Get code content + const codeElement = preElement.querySelector('code'); + if (!codeElement) return; + + const code = codeElement.textContent; + + // Use modern clipboard API + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(code).then(function() { + showCopiedState(copyButton); + }).catch(function(err) { + console.error('Failed to copy:', err); + fallbackCopyTextToClipboard(code, copyButton); + }); + } else { + // Fallback for older browsers or non-secure contexts + fallbackCopyTextToClipboard(code, copyButton); + } + }); + + // Insert copy button into pre element + preElement.style.position = 'relative'; + preElement.appendChild(copyButton); + }); + + // Also handle .highlight wrapper (Pygments) + const highlightBlocks = document.querySelectorAll('article .highlight, .prose .highlight, .md-typeset .highlight'); + + highlightBlocks.forEach(function(highlightElement) { + // Skip if already has a copy button + if (highlightElement.querySelector('.copy-button')) { + return; + } + + // Skip if it's inside a tabbed set + if (highlightElement.closest('.tabbed-set')) { + return; + } + + // Skip if it's a tabbed block + if (highlightElement.classList.contains('tabbed-block') || highlightElement.closest('.tabbed-block')) { + return; + } + + // Create copy button + const copyButton = document.createElement('button'); + copyButton.className = 'copy-button code-copy-btn'; + copyButton.innerHTML = ''; + copyButton.setAttribute('aria-label', 'Copy code'); + copyButton.setAttribute('title', 'Copy code'); + + // Add click handler + copyButton.addEventListener('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + + // Get code content + const codeElement = highlightElement.querySelector('pre code') || highlightElement.querySelector('code'); + if (!codeElement) return; + + const code = codeElement.textContent; + + // Use modern clipboard API + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(code).then(function() { + showCopiedState(copyButton); + }).catch(function(err) { + console.error('Failed to copy:', err); + fallbackCopyTextToClipboard(code, copyButton); + }); + } else { + // Fallback for older browsers or non-secure contexts + fallbackCopyTextToClipboard(code, copyButton); + } + }); + + // Insert copy button into highlight element + highlightElement.style.position = 'relative'; + highlightElement.appendChild(copyButton); + }); + } + + function fallbackCopyTextToClipboard(text, button) { + const textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + textArea.style.top = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + const successful = document.execCommand('copy'); + if (successful) { + showCopiedState(button); + } + } catch (err) { + console.error('Fallback: Failed to copy', err); + } + + document.body.removeChild(textArea); + } + + function showCopiedState(button) { + const originalHTML = button.innerHTML; + button.innerHTML = ''; + button.classList.add('copied'); + + setTimeout(function() { + button.innerHTML = originalHTML; + button.classList.remove('copied'); + }, 2000); + } + + // Run on DOM ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initCodeCopyButtons); + } else { + initCodeCopyButtons(); + } + + // Also re-initialize on navigation (for SPA-like behavior in MkDocs Material) + if (typeof document$ !== 'undefined') { + document$.subscribe(function() { + // Use setTimeout to ensure DOM is fully updated + setTimeout(initCodeCopyButtons, 100); + }); + } + + // Export for manual re-initialization if needed + window.initCodeCopyButtons = initCodeCopyButtons; +})(); diff --git a/docs/javascripts/code-zoom.js b/docs/javascripts/code-zoom.js new file mode 100644 index 00000000..e2a08f6d --- /dev/null +++ b/docs/javascripts/code-zoom.js @@ -0,0 +1,2 @@ +/* Code zoom - placeholder */ + diff --git a/docs/javascripts/nav-scroll-fix.js b/docs/javascripts/nav-scroll-fix.js new file mode 100644 index 00000000..3b295f8b --- /dev/null +++ b/docs/javascripts/nav-scroll-fix.js @@ -0,0 +1,141 @@ +/** + * Navigation Scroll Position Preservation + * + * This script preserves the sidebar scroll position when navigating between pages. + * Without this, clicking a link in the scrolled sidebar would reset it to the top. + */ + +(function() { + 'use strict'; + + const STORAGE_KEY = 'open_judge-sidebar-scroll'; + const SIDEBAR_SELECTORS = [ + '[data-slot="sidebar-content"]', // Current theme's sidebar container + '[data-sidebar="content"]', // Alternative selector + '.md-sidebar--primary', // MkDocs Material theme + 'nav.sidebar', + '.md-sidebar', + '.nav-sidebar', + 'aside.sidebar' + ]; + + /** + * Get the primary sidebar element + */ + function getSidebar() { + for (const selector of SIDEBAR_SELECTORS) { + const sidebar = document.querySelector(selector); + if (sidebar) { + return sidebar; + } + } + return null; + } + + /** + * Restore scroll position instantly without smooth scrolling flicker. + */ + function setScrollTopInstant(sidebar, position) { + if (!sidebar) return; + const originalBehavior = sidebar.style.scrollBehavior; + sidebar.style.scrollBehavior = 'auto'; + sidebar.scrollTop = position; + // Restore original behavior on next frame to keep smooth scrolling elsewhere. + requestAnimationFrame(() => { + if (originalBehavior) { + sidebar.style.scrollBehavior = originalBehavior; + } else { + sidebar.style.removeProperty('scroll-behavior'); + } + }); + } + + /** + * Save sidebar scroll position to sessionStorage + */ + function saveSidebarScroll() { + const sidebar = getSidebar(); + if (sidebar) { + try { + const scrollData = { + position: sidebar.scrollTop, + timestamp: Date.now() + }; + sessionStorage.setItem(STORAGE_KEY, JSON.stringify(scrollData)); + } catch (e) { + console.warn('Failed to save sidebar scroll position:', e); + } + } + } + + /** + * Restore sidebar scroll position from sessionStorage + */ + function restoreSidebarScroll() { + const sidebar = getSidebar(); + if (!sidebar) return; + + try { + const stored = sessionStorage.getItem(STORAGE_KEY); + if (stored) { + const scrollData = JSON.parse(stored); + + // Only restore if saved within the last 5 minutes + const age = Date.now() - scrollData.timestamp; + if (age < 5 * 60 * 1000) { + // Use requestAnimationFrame to ensure DOM is ready + requestAnimationFrame(() => { + setScrollTopInstant(sidebar, scrollData.position); + }); + } else { + // Clear old data + sessionStorage.removeItem(STORAGE_KEY); + } + } + } catch (e) { + console.warn('Failed to restore sidebar scroll position:', e); + } + } + + /** + * Initialize scroll position preservation + */ + function init() { + // Restore scroll position on page load + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', restoreSidebarScroll); + } else { + restoreSidebarScroll(); + } + + // Save scroll position before navigation + window.addEventListener('beforeunload', saveSidebarScroll); + + // Save scroll position when clicking sidebar links + document.addEventListener('click', function(e) { + const link = e.target.closest('a'); + if (!link) return; + + // Check if the link is inside the sidebar + const sidebar = getSidebar(); + if (sidebar && sidebar.contains(link)) { + // Save current scroll position + saveSidebarScroll(); + } + }); + + // Periodically save scroll position while user scrolls + const sidebar = getSidebar(); + if (sidebar) { + let scrollTimeout; + sidebar.addEventListener('scroll', function() { + clearTimeout(scrollTimeout); + scrollTimeout = setTimeout(saveSidebarScroll, 150); + }); + } + } + + // Initialize when script loads + init(); + +})(); diff --git a/docs/javascripts/responsive.js b/docs/javascripts/responsive.js new file mode 100644 index 00000000..663e371f --- /dev/null +++ b/docs/javascripts/responsive.js @@ -0,0 +1,356 @@ +/** + * Responsive Enhancements for OpenJudge Documentation + * Phase 5: 响应式完善 + * + * Features: + * - Mobile menu toggle + * - Table scroll detection + * - Touch event optimization + * - Viewport resize handling + */ + +(function() { + 'use strict'; + + // ======================================== + // Mobile Navigation Toggle + // ======================================== + + function initMobileNav() { + const sidebar = document.querySelector('.md-sidebar--primary, nav.sidebar, .nav-sidebar'); + const menuToggle = document.querySelector('.mobile-menu-toggle'); + let overlay = document.querySelector('.mobile-nav-overlay'); + + // Create overlay if it doesn't exist + if (!overlay && sidebar) { + overlay = document.createElement('div'); + overlay.className = 'mobile-nav-overlay'; + document.body.appendChild(overlay); + } + + // Create menu toggle if it doesn't exist + if (!menuToggle && sidebar) { + const toggle = document.createElement('button'); + toggle.className = 'mobile-menu-toggle'; + toggle.setAttribute('aria-label', 'Toggle navigation menu'); + toggle.innerHTML = ` + + + + + + + + + + `; + document.body.appendChild(toggle); + + toggle.addEventListener('click', toggleMobileNav); + } + + if (overlay) { + overlay.addEventListener('click', closeMobileNav); + } + + // Close on escape key + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape') { + closeMobileNav(); + } + }); + + // Close on resize to desktop + window.addEventListener('resize', debounce(function() { + if (window.innerWidth >= 768) { + closeMobileNav(); + } + }, 100)); + } + + function toggleMobileNav() { + const sidebar = document.querySelector('.md-sidebar--primary, nav.sidebar, .nav-sidebar'); + const menuToggle = document.querySelector('.mobile-menu-toggle'); + const overlay = document.querySelector('.mobile-nav-overlay'); + + if (sidebar) { + sidebar.classList.toggle('open'); + } + if (menuToggle) { + menuToggle.classList.toggle('active'); + } + if (overlay) { + overlay.classList.toggle('visible'); + } + + // Prevent body scroll when menu is open + document.body.classList.toggle('nav-open'); + } + + function closeMobileNav() { + const sidebar = document.querySelector('.md-sidebar--primary, nav.sidebar, .nav-sidebar'); + const menuToggle = document.querySelector('.mobile-menu-toggle'); + const overlay = document.querySelector('.mobile-nav-overlay'); + + if (sidebar) { + sidebar.classList.remove('open'); + } + if (menuToggle) { + menuToggle.classList.remove('active'); + } + if (overlay) { + overlay.classList.remove('visible'); + } + document.body.classList.remove('nav-open'); + } + + // ======================================== + // Table Scroll Detection + // ======================================== + + function initTableScroll() { + const tables = document.querySelectorAll('.table-responsive, table'); + + tables.forEach(function(table) { + let wrapper = table; + + // Wrap table if not already in a responsive container + if (!table.classList.contains('table-responsive') && table.tagName === 'TABLE') { + wrapper = document.createElement('div'); + wrapper.className = 'table-responsive'; + table.parentNode.insertBefore(wrapper, table); + wrapper.appendChild(table); + } + + // Check scroll state + updateTableScrollState(wrapper); + + // Listen for scroll + wrapper.addEventListener('scroll', function() { + updateTableScrollState(wrapper); + }); + }); + + // Update on resize + window.addEventListener('resize', debounce(function() { + document.querySelectorAll('.table-responsive').forEach(updateTableScrollState); + }, 100)); + } + + function updateTableScrollState(wrapper) { + if (!wrapper) return; + + const scrollLeft = wrapper.scrollLeft; + const scrollWidth = wrapper.scrollWidth; + const clientWidth = wrapper.clientWidth; + + // Check if table is scrollable + const canScroll = scrollWidth > clientWidth; + + // Update classes + wrapper.classList.toggle('can-scroll', canScroll); + wrapper.classList.toggle('can-scroll-left', scrollLeft > 0); + wrapper.classList.toggle('can-scroll-right', scrollLeft < scrollWidth - clientWidth - 1); + } + + // ======================================== + // Touch Event Optimization + // ======================================== + + function initTouchOptimization() { + // Detect touch device + const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; + + if (isTouchDevice) { + document.body.classList.add('touch-device'); + + // Fast tap for navigation links + const navLinks = document.querySelectorAll('.md-nav__link, nav a'); + navLinks.forEach(function(link) { + link.addEventListener('touchend', function(e) { + // Prevent double-tap zoom on navigation + if (e.target.tagName === 'A') { + e.preventDefault(); + window.location.href = e.target.href; + } + }); + }); + } else { + document.body.classList.add('pointer-device'); + } + } + + // ======================================== + // Viewport Height Fix (Mobile Safari) + // ======================================== + + function initViewportFix() { + // Fix for mobile viewport height (100vh issue) + function setViewportHeight() { + const vh = window.innerHeight * 0.01; + document.documentElement.style.setProperty('--vh', `${vh}px`); + } + + setViewportHeight(); + + window.addEventListener('resize', debounce(setViewportHeight, 100)); + window.addEventListener('orientationchange', function() { + setTimeout(setViewportHeight, 100); + }); + } + + // ======================================== + // Scroll Progress Indicator + // ======================================== + + function initScrollProgress() { + let progressBar = document.querySelector('.scroll-progress'); + + // Create progress bar if it doesn't exist + if (!progressBar) { + progressBar = document.createElement('div'); + progressBar.className = 'scroll-progress'; + document.body.prepend(progressBar); + } + + function updateProgress() { + const scrollTop = window.scrollY || document.documentElement.scrollTop; + const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; + const progress = scrollHeight > 0 ? (scrollTop / scrollHeight) * 100 : 0; + + progressBar.style.width = `${progress}%`; + } + + window.addEventListener('scroll', throttle(updateProgress, 10)); + updateProgress(); + } + + // ======================================== + // Scroll to Top Button + // ======================================== + + function initScrollToTop() { + let scrollBtn = document.querySelector('.scroll-to-top'); + + // Create button if it doesn't exist + if (!scrollBtn) { + scrollBtn = document.createElement('button'); + scrollBtn.className = 'scroll-to-top'; + scrollBtn.setAttribute('aria-label', 'Scroll to top'); + scrollBtn.innerHTML = ` + + + + `; + document.body.appendChild(scrollBtn); + } + + function toggleButton() { + const scrollTop = window.scrollY || document.documentElement.scrollTop; + scrollBtn.classList.toggle('visible', scrollTop > 300); + } + + scrollBtn.addEventListener('click', function() { + window.scrollTo({ + top: 0, + behavior: 'smooth' + }); + }); + + window.addEventListener('scroll', throttle(toggleButton, 100)); + toggleButton(); + } + + // ======================================== + // Responsive Image Loading + // ======================================== + + function initResponsiveImages() { + // Lazy load images + const images = document.querySelectorAll('img[loading="lazy"]'); + + if ('IntersectionObserver' in window) { + const imageObserver = new IntersectionObserver(function(entries) { + entries.forEach(function(entry) { + if (entry.isIntersecting) { + const img = entry.target; + img.classList.add('loaded'); + imageObserver.unobserve(img); + } + }); + }, { + rootMargin: '50px 0px' + }); + + images.forEach(function(img) { + imageObserver.observe(img); + }); + } else { + // Fallback for browsers without IntersectionObserver + images.forEach(function(img) { + img.classList.add('loaded'); + }); + } + } + + // ======================================== + // Utility Functions + // ======================================== + + function debounce(func, wait) { + let timeout; + return function executedFunction() { + const context = this; + const args = arguments; + clearTimeout(timeout); + timeout = setTimeout(function() { + func.apply(context, args); + }, wait); + }; + } + + function throttle(func, limit) { + let inThrottle; + return function() { + const context = this; + const args = arguments; + if (!inThrottle) { + func.apply(context, args); + inThrottle = true; + setTimeout(function() { + inThrottle = false; + }, limit); + } + }; + } + + // ======================================== + // Initialize All + // ======================================== + + function init() { + initMobileNav(); + initTableScroll(); + initTouchOptimization(); + initViewportFix(); + initScrollProgress(); + initScrollToTop(); + initResponsiveImages(); + } + + // Run on DOM ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } + + // Expose functions for external use + window.OpenJudgeResponsive = { + toggleMobileNav: toggleMobileNav, + closeMobileNav: closeMobileNav, + updateTableScrollState: updateTableScrollState + }; + +})(); + diff --git a/docs/javascripts/search-fix.js b/docs/javascripts/search-fix.js new file mode 100644 index 00000000..e8436240 --- /dev/null +++ b/docs/javascripts/search-fix.js @@ -0,0 +1,2 @@ +/* Search fix - placeholder */ + diff --git a/docs/javascripts/tabbed-code.js b/docs/javascripts/tabbed-code.js new file mode 100644 index 00000000..880ba944 --- /dev/null +++ b/docs/javascripts/tabbed-code.js @@ -0,0 +1,177 @@ +/** + * Tabbed Code Blocks - JavaScript Enhancement for shadcn/ui theme + * Provides fallback functionality for pymdownx.tabbed alternate_style + */ + +(function() { + 'use strict'; + + function initTabbedSets() { + // Find all tabbed sets + const tabbedSets = document.querySelectorAll('.tabbed-set.tabbed-alternate'); + + tabbedSets.forEach(function(tabbedSet) { + const inputs = tabbedSet.querySelectorAll(':scope > input[type="radio"]'); + const labels = tabbedSet.querySelectorAll(':scope > .tabbed-labels > label'); + const blocks = tabbedSet.querySelectorAll(':scope > .tabbed-content > .tabbed-block'); + + // Function to update active state + function updateActiveState() { + let activeIndex = 0; + + // Find which input is checked + inputs.forEach(function(input, index) { + if (input.checked) { + activeIndex = index; + } + }); + + // Update labels + labels.forEach(function(label, index) { + if (index === activeIndex) { + label.classList.add('tabbed-label--active'); + label.setAttribute('data-active', 'true'); + } else { + label.classList.remove('tabbed-label--active'); + label.setAttribute('data-active', 'false'); + } + }); + + // Update content blocks + blocks.forEach(function(block, index) { + if (index === activeIndex) { + block.style.display = 'block'; + block.classList.add('tabbed-block--active'); + } else { + block.style.display = 'none'; + block.classList.remove('tabbed-block--active'); + } + }); + } + + // Listen for changes on radio inputs + inputs.forEach(function(input) { + input.addEventListener('change', updateActiveState); + }); + + // Also handle label clicks directly (backup for CSS label-for behavior) + labels.forEach(function(label, index) { + label.addEventListener('click', function(e) { + if (inputs[index]) { + inputs[index].checked = true; + // Trigger change event + inputs[index].dispatchEvent(new Event('change')); + } + }); + }); + + // Initialize state + updateActiveState(); + + // Add copy button to tabbed code blocks + addCopyButtonToTabbedSet(tabbedSet); + }); + } + + function addCopyButtonToTabbedSet(tabbedSet) { + // Check if copy button already exists + if (tabbedSet.querySelector('.copy-button')) { + return; + } + + // Find the labels container + const labelsContainer = tabbedSet.querySelector('.tabbed-labels'); + if (!labelsContainer) return; + + // Create copy button + const copyButton = document.createElement('button'); + copyButton.className = 'copy-button'; + copyButton.innerHTML = ''; + copyButton.setAttribute('aria-label', 'Copy code'); + copyButton.setAttribute('title', 'Copy code'); + + // Add click handler + copyButton.addEventListener('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + + // Find the active code block + const activeBlock = tabbedSet.querySelector('.tabbed-block--active'); + if (!activeBlock) return; + + // Get code content + const codeElement = activeBlock.querySelector('pre code') || activeBlock.querySelector('code'); + if (!codeElement) return; + + // Copy to clipboard + const code = codeElement.textContent; + + // Use modern clipboard API + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(code).then(function() { + showCopiedState(copyButton); + }).catch(function(err) { + console.error('Failed to copy:', err); + fallbackCopyTextToClipboard(code, copyButton); + }); + } else { + // Fallback for older browsers + fallbackCopyTextToClipboard(code, copyButton); + } + }); + + // Insert copy button into labels container + labelsContainer.appendChild(copyButton); + } + + function fallbackCopyTextToClipboard(text, button) { + const textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + textArea.style.top = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + const successful = document.execCommand('copy'); + if (successful) { + showCopiedState(button); + } + } catch (err) { + console.error('Fallback: Failed to copy', err); + } + + document.body.removeChild(textArea); + } + + function showCopiedState(button) { + const originalHTML = button.innerHTML; + button.innerHTML = ''; + button.classList.add('copied'); + + setTimeout(function() { + button.innerHTML = originalHTML; + button.classList.remove('copied'); + }, 2000); + } + + // Run on DOM ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initTabbedSets); + } else { + initTabbedSets(); + } + + // Also re-initialize on navigation (for SPA-like behavior) + if (typeof document$ !== 'undefined') { + document$.subscribe(function() { + initTabbedSets(); + }); + } + + // Export for manual re-initialization if needed + window.initTabbedSets = initTabbedSets; +})(); + diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 00000000..968bb898 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,14 @@ +# MkDocs and theme +mkdocs==1.6.1 +mkdocs-shadcn==0.9.5 + +# Plugins +mkdocstrings==0.30.1 +mkdocstrings-python==1.18.2 + +# Markdown extensions (pymdownx is included in pymdown-extensions) +pymdown-extensions==10.16.1 + +# Syntax highlighting +Pygments>=2.18.0 + diff --git a/docs/stylesheets/animations.css b/docs/stylesheets/animations.css new file mode 100644 index 00000000..2129b6d8 --- /dev/null +++ b/docs/stylesheets/animations.css @@ -0,0 +1,878 @@ +/* + * Animations & Visual Enhancements for OpenJudge Documentation + * Phase 3: 视觉增强 + * + * Features: + * - Keyframe Animations (fadeIn, slideUp, shimmer, pulse, etc.) + * - Page Load Effects + * - Hover Interactions + * - Transition Effects + * - Visual Polish (shadows, gradients, etc.) + */ + +/* ======================================== + CSS Variables - Animation System + ======================================== */ + +:root { + /* Animation Timing */ + --rm-transition-fast: 0.15s; + --rm-transition-normal: 0.25s; + --rm-transition-slow: 0.4s; + --rm-ease-smooth: cubic-bezier(0.4, 0, 0.2, 1); + --rm-ease-in: cubic-bezier(0.4, 0, 1, 1); + --rm-ease-out: cubic-bezier(0, 0, 0.2, 1); + --rm-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); + + /* Shadow System */ + --rm-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --rm-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + --rm-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + --rm-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + + /* Hover Lift */ + --rm-lift-sm: translateY(-2px); + --rm-lift-md: translateY(-4px); +} + +/* Dark mode shadows */ +.dark, +.dark { + --rm-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + --rm-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -1px rgba(0, 0, 0, 0.3); + --rm-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -2px rgba(0, 0, 0, 0.3); + --rm-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 10px 10px -5px rgba(0, 0, 0, 0.4); +} + +/* ======================================== + Keyframe Animations + ======================================== */ + +/* Fade In */ +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Fade In Up */ +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Fade In Down */ +@keyframes fadeInDown { + from { + opacity: 0; + transform: translateY(-20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Slide Up */ +@keyframes slideUp { + from { + transform: translateY(10px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +/* Slide Down */ +@keyframes slideDown { + from { + transform: translateY(-10px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +/* Slide In From Left */ +@keyframes slideInLeft { + from { + transform: translateX(-20px); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +/* Slide In From Right */ +@keyframes slideInRight { + from { + transform: translateX(20px); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +/* Scale In */ +@keyframes scaleIn { + from { + transform: scale(0.95); + opacity: 0; + } + to { + transform: scale(1); + opacity: 1; + } +} + +/* Pulse */ +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.7; + } +} + +/* Shimmer (Loading effect) */ +@keyframes shimmer { + 0% { + background-position: -1000px 0; + } + 100% { + background-position: 1000px 0; + } +} + +/* Spin */ +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* Bounce */ +@keyframes bounce { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-10px); + } +} + +/* Wiggle */ +@keyframes wiggle { + 0%, 100% { + transform: rotate(0deg); + } + 25% { + transform: rotate(-3deg); + } + 75% { + transform: rotate(3deg); + } +} + +/* Expand (for collapsible sections) */ +@keyframes expand { + from { + max-height: 0; + opacity: 0; + } + to { + max-height: 2000px; + opacity: 1; + } +} + +/* Collapse */ +@keyframes collapse { + from { + max-height: 2000px; + opacity: 1; + } + to { + max-height: 0; + opacity: 0; + } +} + +/* Glow */ +@keyframes glow { + 0%, 100% { + box-shadow: 0 0 5px currentColor; + } + 50% { + box-shadow: 0 0 20px currentColor; + } +} + +/* ======================================== + Page Load Animations + ======================================== */ + +/* Main content fade in */ +article, +.md-content__inner, +main.md-main { + animation: fadeInUp 0.5s var(--rm-ease-out) forwards; +} + +/* Stagger animation for list items on load */ +article > *:nth-child(1) { animation-delay: 0ms; } +article > *:nth-child(2) { animation-delay: 50ms; } +article > *:nth-child(3) { animation-delay: 100ms; } +article > *:nth-child(4) { animation-delay: 150ms; } +article > *:nth-child(5) { animation-delay: 200ms; } + +/* Reduce motion for accessibility */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } + + article, + .md-content__inner, + main.md-main { + animation: none; + } +} + +/* ======================================== + Link Hover Effects + ======================================== */ + +article a:not(.button):not(.btn), +.prose a:not(.button):not(.btn), +.md-typeset a:not(.button):not(.btn) { + position: relative; + transition: color var(--rm-transition-fast) var(--rm-ease-smooth); +} + +/* Animated underline on hover */ +article a:not(.button):not(.btn)::after, +.prose a:not(.button):not(.btn)::after { + content: ''; + position: absolute; + left: 0; + bottom: -2px; + width: 0; + height: 1px; + background: currentColor; + transition: width var(--rm-transition-normal) var(--rm-ease-out); +} + +article a:not(.button):not(.btn):hover::after, +.prose a:not(.button):not(.btn):hover::after { + width: 100%; +} + +/* External link icon animation */ +article a[href^="http"]::after, +.prose a[href^="http"]::after { + display: inline-block; + transition: transform var(--rm-transition-fast) var(--rm-ease-smooth); +} + +article a[href^="http"]:hover::after, +.prose a[href^="http"]:hover::after { + transform: translate(2px, -2px); +} + +/* ======================================== + Button Hover Effects + ======================================== */ + +button, +.button, +.btn, +.md-button, +input[type="submit"], +input[type="button"] { + position: relative; + transition: all var(--rm-transition-normal) var(--rm-ease-smooth); + cursor: pointer; +} + +button:hover, +.button:hover, +.btn:hover, +.md-button:hover { + transform: var(--rm-lift-sm); + box-shadow: var(--rm-shadow-md); +} + +button:active, +.button:active, +.btn:active, +.md-button:active { + transform: scale(0.98); + box-shadow: var(--rm-shadow-sm); +} + +/* Ripple effect on click */ +button::before, +.button::before, +.btn::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + background: rgba(255, 255, 255, 0.3); + transform: translate(-50%, -50%); + transition: width 0.6s, height 0.6s; +} + +button:active::before, +.button:active::before, +.btn:active::before { + width: 300px; + height: 300px; +} + +/* ======================================== + Code Block Hover Effects + ======================================== */ + +/* Code block container */ +.highlight, +.codehilite, +pre[class*="language-"], +div[class*="highlight-"] { + position: relative; + transition: all var(--rm-transition-normal) var(--rm-ease-smooth); + box-shadow: var(--rm-shadow-sm); +} + +.highlight:hover, +.codehilite:hover, +pre[class*="language-"]:hover, +div[class*="highlight-"]:hover { + box-shadow: var(--rm-shadow-md); + transform: translateY(-1px); +} + +/* Copy button hover effect */ +.copy-button, +button[data-clipboard-target], +.md-clipboard { + opacity: 0; + transform: scale(0.9); + transition: all var(--rm-transition-fast) var(--rm-ease-smooth); +} + +.highlight:hover .copy-button, +.codehilite:hover .copy-button, +pre:hover .copy-button, +.highlight:hover .md-clipboard, +.codehilite:hover .md-clipboard, +pre:hover .md-clipboard { + opacity: 1; + transform: scale(1); +} + +.copy-button:hover, +.md-clipboard:hover { + transform: scale(1.1); + background: var(--primary, #3b82f6); + color: white; +} + +.copy-button:active, +.md-clipboard:active { + transform: scale(0.95); +} + +/* Copy success animation */ +.copy-button.copied, +.md-clipboard.copied { + animation: pulse 0.4s var(--rm-ease-smooth); +} + +/* Code language badge */ +.highlight > .language-name, +pre > .language-name, +.code-lang-badge { + position: absolute; + top: 0.5rem; + right: 0.5rem; + padding: 0.125rem 0.5rem; + font-size: 0.75rem; + font-weight: 500; + background: rgba(0, 0, 0, 0.6); + color: rgba(255, 255, 255, 0.9); + border-radius: 0.25rem; + text-transform: uppercase; + letter-spacing: 0.05em; + opacity: 0.7; + transition: opacity var(--rm-transition-fast) var(--rm-ease-smooth); + pointer-events: none; + backdrop-filter: blur(4px); +} + +.highlight:hover > .language-name, +pre:hover > .language-name, +.code-lang-badge:hover { + opacity: 1; +} + +/* ======================================== + Card & Container Effects + ======================================== */ + +/* Admonition hover effect */ +article .admonition, +.prose .admonition, +.md-typeset .admonition { + transition: all var(--rm-transition-normal) var(--rm-ease-smooth); + box-shadow: var(--rm-shadow-sm); +} + +article .admonition:hover, +.prose .admonition:hover, +.md-typeset .admonition:hover { + box-shadow: var(--rm-shadow-md); + transform: translateY(-2px); +} + +/* Workflow steps hover */ +.workflow ol > li, +ol.workflow-steps > li { + transition: all var(--rm-transition-normal) var(--rm-ease-smooth); +} + +.workflow ol > li:hover, +ol.workflow-steps > li:hover { + transform: translateX(4px); +} + +.workflow ol > li::before, +ol.workflow-steps > li::before { + transition: all var(--rm-transition-normal) var(--rm-ease-smooth); +} + +.workflow ol > li:hover::before, +ol.workflow-steps > li:hover::before { + transform: scale(1.1); + box-shadow: var(--rm-shadow-md); +} + +/* ======================================== + Tab Switching Animations + ======================================== */ + +/* Tab content transition */ +.tabbed-block { + animation: fadeIn var(--rm-transition-normal) var(--rm-ease-smooth); +} + +.tabbed-block--active { + animation: slideDown var(--rm-transition-normal) var(--rm-ease-smooth); +} + +/* Tab label transition */ +.tabbed-labels > label, +.tabbed-set label { + position: relative; + transition: all var(--rm-transition-fast) var(--rm-ease-smooth); +} + +.tabbed-labels > label:hover, +.tabbed-set label:hover { + transform: translateY(-2px); +} + +/* Active tab indicator animation */ +.tabbed-labels > label::after, +.tabbed-set label::after { + transition: all var(--rm-transition-normal) var(--rm-ease-smooth); +} + +/* ======================================== + Collapsible/Details Animation + ======================================== */ + +/* Details element smooth expand/collapse */ +article details, +.prose details, +.md-typeset details { + overflow: hidden; + transition: all var(--rm-transition-normal) var(--rm-ease-smooth); +} + +article details[open], +.prose details[open], +.md-typeset details[open] { + animation: slideDown var(--rm-transition-normal) var(--rm-ease-smooth); +} + +article details summary, +.prose details summary, +.md-typeset details summary { + transition: all var(--rm-transition-fast) var(--rm-ease-smooth); +} + +article details summary:hover, +.prose details summary:hover, +.md-typeset details summary:hover { + background: var(--muted, #f3f4f6); + padding-left: 1.5rem; +} + +/* Arrow rotation animation is already in readability-enhancements.css */ + +/* ======================================== + Image & Media Effects + ======================================== */ + +/* Image lazy loading placeholder */ +img[loading="lazy"] { + background: linear-gradient( + 90deg, + var(--muted, #f3f4f6) 0%, + var(--muted-foreground, #e5e7eb) 50%, + var(--muted, #f3f4f6) 100% + ); + background-size: 200% 100%; + animation: shimmer 1.5s infinite; +} + +img[loading="lazy"].loaded { + animation: fadeIn 0.3s var(--rm-ease-out); + background: transparent; +} + +/* Image hover effect */ +article img, +.prose img, +.md-typeset img { + transition: all var(--rm-transition-normal) var(--rm-ease-smooth); +} + +article img:hover, +.prose img:hover, +.md-typeset img:hover { + transform: scale(1.02); + box-shadow: var(--rm-shadow-lg); +} + +/* Figure animation */ +article figure, +.prose figure, +.md-typeset figure { + animation: fadeInUp 0.6s var(--rm-ease-out); +} + +/* ======================================== + Table Hover Effects + ======================================== */ + +/* Table row hover (already in table-enhancements.css, just adding animation) */ +article table tbody tr, +.prose table tbody tr, +.md-typeset table tbody tr { + transition: all var(--rm-transition-fast) var(--rm-ease-smooth); +} + +/* ======================================== + Navigation & Sidebar Effects + ======================================== */ + +/* Sidebar items */ +.md-nav__item, +.md-nav__link, +nav li a { + transition: all var(--rm-transition-fast) var(--rm-ease-smooth); +} + +.md-nav__link:hover, +nav li a:hover { + transform: translateX(4px); + color: var(--primary, #3b82f6); +} + +/* Active nav item indicator */ +.md-nav__link--active, +nav li a.active, +nav li a[aria-current="page"] { + position: relative; +} + +.md-nav__link--active::before, +nav li a.active::before, +nav li a[aria-current="page"]::before { + content: ''; + position: absolute; + left: -1rem; + top: 50%; + transform: translateY(-50%); + width: 3px; + height: 70%; + background: var(--primary, #3b82f6); + border-radius: 2px; + animation: slideInLeft 0.3s var(--rm-ease-out); +} + +/* ======================================== + Loading States + ======================================== */ + +/* Skeleton loader */ +.skeleton { + background: linear-gradient( + 90deg, + var(--muted, #f3f4f6) 25%, + var(--muted-foreground, #e5e7eb) 50%, + var(--muted, #f3f4f6) 75% + ); + background-size: 200% 100%; + animation: shimmer 1.5s infinite; + border-radius: var(--radius, 0.375rem); +} + +/* Spinner */ +.spinner, +.loading-spinner { + display: inline-block; + width: 1em; + height: 1em; + border: 2px solid var(--muted, #e5e7eb); + border-top-color: var(--primary, #3b82f6); + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +/* ======================================== + Decorative Elements + ======================================== */ + +/* Gradient dividers */ +hr.gradient, +.divider-gradient { + height: 2px; + background: linear-gradient( + 90deg, + transparent 0%, + var(--primary, #3b82f6) 50%, + transparent 100% + ); + border: none; + margin: 3em 0; +} + +/* Animated gradient background (optional) */ +.hero-gradient, +.gradient-bg { + background: linear-gradient( + 135deg, + var(--primary, #3b82f6) 0%, + var(--primary-dark, #2563eb) 100% + ); + background-size: 200% 200%; + animation: gradientShift 8s ease infinite; +} + +@keyframes gradientShift { + 0%, 100% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } +} + +/* Glow effect for highlights */ +.glow, +.highlight-glow { + animation: glow 2s ease-in-out infinite; +} + +/* ======================================== + Scroll Animations + ======================================== */ + +/* Fade in elements on scroll (requires JS) */ +.fade-in-on-scroll { + opacity: 0; + transform: translateY(20px); + transition: opacity 0.6s var(--rm-ease-out), transform 0.6s var(--rm-ease-out); +} + +.fade-in-on-scroll.visible { + opacity: 1; + transform: translateY(0); +} + +/* Slide in from left on scroll */ +.slide-in-left { + opacity: 0; + transform: translateX(-40px); + transition: opacity 0.6s var(--rm-ease-out), transform 0.6s var(--rm-ease-out); +} + +.slide-in-left.visible { + opacity: 1; + transform: translateX(0); +} + +/* Slide in from right on scroll */ +.slide-in-right { + opacity: 0; + transform: translateX(40px); + transition: opacity 0.6s var(--rm-ease-out), transform 0.6s var(--rm-ease-out); +} + +.slide-in-right.visible { + opacity: 1; + transform: translateX(0); +} + +/* ======================================== + Focus States (Accessibility) + ======================================== */ + +/* Enhance focus indicators with animation */ +a:focus-visible, +button:focus-visible, +input:focus-visible, +textarea:focus-visible, +select:focus-visible { + outline: 2px solid var(--primary, #3b82f6); + outline-offset: 2px; + animation: pulse 0.4s var(--rm-ease-smooth); +} + +/* ======================================== + Special Effects + ======================================== */ + +/* Confetti effect (for success states) */ +@keyframes confetti { + 0% { + transform: translateY(0) rotate(0deg); + opacity: 1; + } + 100% { + transform: translateY(100vh) rotate(720deg); + opacity: 0; + } +} + +/* Shake (for errors) */ +@keyframes shake { + 0%, 100% { + transform: translateX(0); + } + 10%, 30%, 50%, 70%, 90% { + transform: translateX(-4px); + } + 20%, 40%, 60%, 80% { + transform: translateX(4px); + } +} + +.shake { + animation: shake 0.4s var(--rm-ease-smooth); +} + +/* Bounce in (for notifications) */ +@keyframes bounceIn { + 0% { + opacity: 0; + transform: scale(0.3); + } + 50% { + opacity: 1; + transform: scale(1.05); + } + 70% { + transform: scale(0.9); + } + 100% { + transform: scale(1); + } +} + +.bounce-in { + animation: bounceIn 0.6s var(--rm-ease-out); +} + +/* ======================================== + Performance Optimizations + ======================================== */ + +/* Hardware acceleration for smooth animations */ +.highlight, +.codehilite, +.admonition, +button, +.button, +a, +img { + will-change: auto; + backface-visibility: hidden; + -webkit-backface-visibility: hidden; +} + +/* Prevent layout shifts during animations */ +* { + transform: translateZ(0); +} + +/* ======================================== + Utility Classes + ======================================== */ + +.animate-fadeIn { animation: fadeIn 0.3s var(--rm-ease-out); } +.animate-fadeInUp { animation: fadeInUp 0.5s var(--rm-ease-out); } +.animate-fadeInDown { animation: fadeInDown 0.5s var(--rm-ease-out); } +.animate-slideUp { animation: slideUp 0.3s var(--rm-ease-out); } +.animate-slideDown { animation: slideDown 0.3s var(--rm-ease-out); } +.animate-slideInLeft { animation: slideInLeft 0.4s var(--rm-ease-out); } +.animate-slideInRight { animation: slideInRight 0.4s var(--rm-ease-out); } +.animate-scaleIn { animation: scaleIn 0.3s var(--rm-ease-out); } +.animate-pulse { animation: pulse 2s infinite; } +.animate-spin { animation: spin 1s linear infinite; } +.animate-bounce { animation: bounce 1s infinite; } +.animate-wiggle { animation: wiggle 0.5s var(--rm-ease-smooth); } + +/* Delay utilities */ +.delay-100 { animation-delay: 100ms; } +.delay-200 { animation-delay: 200ms; } +.delay-300 { animation-delay: 300ms; } +.delay-500 { animation-delay: 500ms; } + +/* Duration utilities */ +.duration-fast { animation-duration: var(--rm-transition-fast); } +.duration-normal { animation-duration: var(--rm-transition-normal); } +.duration-slow { animation-duration: var(--rm-transition-slow); } + diff --git a/docs/stylesheets/code-enhancements.css b/docs/stylesheets/code-enhancements.css new file mode 100644 index 00000000..462435b7 --- /dev/null +++ b/docs/stylesheets/code-enhancements.css @@ -0,0 +1,513 @@ +/* + * Code Enhancements for OpenJudge Documentation + * Phase 1: 代码块样式增强 + * + * Features: + * - 行内代码样式优化 + * - 代码块圆角和边框 + * - 代码块标题栏样式 + * - 行号样式优化 + * - 代码复制按钮样式 + * - 语法高亮微调 + * - 长代码横向滚动指示 + */ + +/* ======================================== + Inline Code Styling + ======================================== */ + +article code:not(pre code), +.prose code:not(pre code), +.md-typeset code:not(pre code) { + font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace; + font-size: 0.875em; + font-weight: 450; + padding: 0.2em 0.4em; + margin: 0 0.1em; + background: var(--muted, #f3f4f6); + border: 1px solid var(--border, #e5e7eb); + border-radius: 0.375rem; + color: var(--foreground, #1f2937); + word-break: break-word; + -webkit-font-smoothing: antialiased; +} + +/* Inline code in links - inherit link color */ +article a code:not(pre code), +.prose a code:not(pre code), +.md-typeset a code:not(pre code) { + color: inherit; + background: transparent; + border: 1px solid; + border-color: color-mix(in srgb, currentColor 30%, transparent); +} + +/* Fallback for browsers without color-mix support */ +@supports not (border-color: color-mix(in srgb, currentColor 30%, transparent)) { + article a code:not(pre code), + .prose a code:not(pre code), + .md-typeset a code:not(pre code) { + border-color: currentColor; + opacity: 0.8; + } +} + +/* Inline code in headings */ +article h1 code, article h2 code, article h3 code, +article h4 code, article h5 code, article h6 code, +.prose h1 code, .prose h2 code, .prose h3 code, +.prose h4 code, .prose h5 code, .prose h6 code { + font-size: 0.9em; +} + +/* ======================================== + Code Block Container + ======================================== */ + +article pre, +.prose pre, +.md-typeset pre { + margin: 1.5em 0; + padding: 0; + /* Fallback for browsers without OKLCH support */ + background: #ffffff; + background: var(--background, #ffffff); + border: 1px solid #e5e7eb; + border: 1px solid var(--border, #e5e7eb); + border-radius: var(--radius-lg, 0.5rem); + overflow: visible; + position: relative; +} + +/* Code inside pre */ +article pre code, +.prose pre code, +.md-typeset pre code { + display: block; + padding: 1rem 1.25rem; + overflow-x: auto; + overflow-y: auto; + max-height: 600px; + font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace; + font-size: 0.8125rem; + line-height: 1.7; + background: transparent; + border: none; + border-radius: var(--radius-lg, 0.5rem); + -webkit-font-smoothing: antialiased; + tab-size: 2; +} + +/* ======================================== + Code Block with Title + ======================================== */ + +/* Title bar for code blocks (when using title="filename.py") */ +article .highlight .filename, +.prose .highlight .filename, +.md-typeset .highlight .filename { + display: block; + padding: 0.5rem 1rem; + font-family: 'JetBrains Mono', ui-monospace, monospace; + font-size: 0.75rem; + font-weight: 500; + color: #6b7280; + color: var(--muted-foreground, #6b7280); + /* Fallback for browsers without OKLCH support */ + background: #ffffff; + background: var(--background, #ffffff); + border-bottom: 1px solid #e5e7eb; + border-bottom: 1px solid var(--border, #e5e7eb); + user-select: none; +} + +/* Code block with data-title attribute */ +article pre[data-title]::before, +.prose pre[data-title]::before, +.md-typeset pre[data-title]::before { + content: attr(data-title); + display: block; + padding: 0.5rem 1rem; + font-family: 'JetBrains Mono', ui-monospace, monospace; + font-size: 0.75rem; + font-weight: 500; + color: #6b7280; + color: var(--muted-foreground, #6b7280); + /* Fallback for browsers without OKLCH support */ + background: #ffffff; + background: var(--background, #ffffff); + border-bottom: 1px solid #e5e7eb; + border-bottom: 1px solid var(--border, #e5e7eb); + user-select: none; +} + +/* ======================================== + Syntax Highlighting Wrapper + ======================================== */ + +article .highlight, +.prose .highlight, +.md-typeset .highlight { + margin: 1.5em 0; + border-radius: var(--radius-lg, 0.5rem); + overflow: visible; + /* Fallback for browsers without OKLCH support */ + border: 1px solid #e5e7eb; + border: 1px solid var(--border, #e5e7eb); + background: #ffffff; + background: var(--background, #ffffff); +} + +article .highlight pre, +.prose .highlight pre, +.md-typeset .highlight pre { + margin: 0; + border: none; + border-radius: var(--radius-lg, 0.5rem); + overflow: visible; +} + +/* ======================================== + Line Numbers + ======================================== */ + +/* Line number gutter */ +article .highlight .linenos, +article .highlight .linenodiv, +.prose .highlight .linenos, +.prose .highlight .linenodiv, +.md-typeset .highlight .linenos, +.md-typeset .highlight .linenodiv { + padding: 1rem 0; + padding-right: 1rem; + padding-left: 0.75rem; + text-align: right; + color: var(--muted-foreground, #9ca3af); + background: rgba(0, 0, 0, 0.02); + border-right: none; + user-select: none; + font-size: 0.75rem; + line-height: 1.7; +} + +/* Individual line numbers */ +article .highlight .linenos span, +article .highlight .linenodiv pre span, +.prose .highlight .linenos span, +.md-typeset .highlight .linenos span { + display: block; + line-height: 1.7; +} + +/* Highlighted line */ +article .highlight .hll, +.prose .highlight .hll, +.md-typeset .highlight .hll { + background: rgba(255, 213, 0, 0.15); + display: block; + margin: 0 -1.25rem; + padding: 0 1.25rem; +} + +/* ======================================== + Code Copy Button + ======================================== */ + +article .highlight .copy-button, +article pre .copy-button, +.prose .highlight .copy-button, +.md-typeset .highlight .copy-button, +button.copy-code-button, +.code-copy-btn { + position: absolute; + top: 0.5rem; + right: 0.5rem; + padding: 0.375rem 0.5rem; + font-size: 0.75rem; + font-weight: 500; + color: #6b7280; + color: var(--muted-foreground, #6b7280); + /* Fallback for browsers without OKLCH support */ + background: #ffffff; + background: var(--background, #fff); + border: 1px solid #e5e7eb; + border: 1px solid var(--border, #e5e7eb); + border-radius: 0.375rem; + cursor: pointer; + opacity: 0; + transition: all 0.15s ease; + z-index: 10; +} + +article .highlight:hover .copy-button, +article pre:hover .copy-button, +.prose .highlight:hover .copy-button, +.md-typeset .highlight:hover .copy-button, +.highlight:hover button.copy-code-button, +pre:hover .code-copy-btn { + opacity: 1; +} + +article .highlight .copy-button:hover, +article pre .copy-button:hover, +.prose .highlight .copy-button:hover, +.md-typeset .highlight .copy-button:hover, +button.copy-code-button:hover, +.code-copy-btn:hover { + color: var(--foreground, #1f2937); + background: var(--muted, #f3f4f6); + border-color: var(--border, #d1d5db); +} + +/* Copy button success state */ +article .highlight .copy-button.copied, +article pre .copy-button.copied, +button.copy-code-button.copied, +.code-copy-btn.copied { + color: var(--success, #10b981); + border-color: var(--success, #10b981); +} + +/* ======================================== + Language Label + ======================================== */ + +article .highlight[data-lang]::before, +.prose .highlight[data-lang]::before, +.md-typeset .highlight[data-lang]::before { + content: attr(data-lang); + position: absolute; + top: 0.5rem; + right: 3.5rem; + font-family: 'JetBrains Mono', monospace; + font-size: 0.625rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--muted-foreground, #9ca3af); + opacity: 0.7; + pointer-events: none; +} + +/* ======================================== + Scroll Indicator (Horizontal & Vertical) + ======================================== */ + +article pre code, +.prose pre code, +.md-typeset pre code { + scrollbar-width: thin; + scrollbar-color: var(--muted-foreground, #9ca3af) transparent; +} + +/* Horizontal scrollbar */ +article pre code::-webkit-scrollbar, +.prose pre code::-webkit-scrollbar, +.md-typeset pre code::-webkit-scrollbar { + height: 6px; + width: 6px; +} + +article pre code::-webkit-scrollbar-track, +.prose pre code::-webkit-scrollbar-track, +.md-typeset pre code::-webkit-scrollbar-track { + background: transparent; +} + +article pre code::-webkit-scrollbar-thumb, +.prose pre code::-webkit-scrollbar-thumb, +.md-typeset pre code::-webkit-scrollbar-thumb { + background: var(--muted-foreground, #d1d5db); + border-radius: 3px; +} + +article pre code::-webkit-scrollbar-thumb:hover, +.prose pre code::-webkit-scrollbar-thumb:hover, +.md-typeset pre code::-webkit-scrollbar-thumb:hover { + background: var(--foreground, #9ca3af); +} + +/* Scrollbar corner (when both scrollbars are present) */ +article pre code::-webkit-scrollbar-corner, +.prose pre code::-webkit-scrollbar-corner, +.md-typeset pre code::-webkit-scrollbar-corner { + background: transparent; +} + +/* ======================================== + Dark Mode + ======================================== */ + +/* Dark mode inline code */ +.dark article code:not(pre code), +.dark .prose code:not(pre code), +.dark .md-typeset code:not(pre code), +.dark article code:not(pre code), +.dark .prose code:not(pre code), +.dark .md-typeset code:not(pre code) { + background: var(--muted, #1f2937); + border-color: var(--border, #374151); + color: var(--foreground, #e5e7eb); +} + +/* Dark mode code blocks */ +.dark article pre, +.dark .prose pre, +.dark .md-typeset pre, +.dark article .highlight, +.dark .prose .highlight, +.dark .md-typeset .highlight { + /* Fallback for browsers without OKLCH support */ + background: #0a0a0a; + background: var(--background, #0a0a0a); + border-color: #374151; + border-color: var(--border, #374151); +} + +/* Dark mode code color is handled by syntax-highlight.css */ + +/* Dark mode title bar */ +.dark article .highlight .filename, +.dark .prose .highlight .filename, +.dark .md-typeset .highlight .filename { + /* Fallback for browsers without OKLCH support */ + background: #0a0a0a; + background: var(--background, #0a0a0a); + border-bottom-color: #374151; + border-bottom-color: var(--border, #374151); + color: #9ca3af; + color: var(--muted-foreground, #9ca3af); +} + +/* Dark mode line numbers */ +.dark article .highlight .linenos, +.dark article .highlight .linenodiv, +.dark .prose .highlight .linenos, +.dark .md-typeset .highlight .linenos, +.dark article .highlight .linenos, +.dark article .highlight .linenodiv, +.dark .prose .highlight .linenos, +.dark .md-typeset .highlight .linenos { + background: rgba(255, 255, 255, 0.02); + border-right: none; + color: var(--muted-foreground, #6b7280); +} + +/* Dark mode highlighted line */ +.dark article .highlight .hll, +.dark .prose .highlight .hll, +.dark .md-typeset .highlight .hll, +.dark article .highlight .hll, +.dark .prose .highlight .hll, +.dark .md-typeset .highlight .hll { + background: rgba(255, 213, 0, 0.1); +} + +/* Dark mode copy button */ +.dark article .highlight .copy-button, +.dark article pre .copy-button, +.dark button.copy-code-button, +.dark .code-copy-btn { + /* Fallback for browsers without OKLCH support */ + background: #1f2937; + background: var(--background, #1f2937); + border-color: #374151; + border-color: var(--border, #374151); + color: #9ca3af; + color: var(--muted-foreground, #9ca3af); +} + +.dark article .highlight .copy-button:hover, +.dark article pre .copy-button:hover, +.dark button.copy-code-button:hover, +.dark .code-copy-btn:hover { + /* Fallback for browsers without OKLCH support */ + background: #374151; + background: var(--muted, #374151); + color: #e5e7eb; + color: var(--foreground, #e5e7eb); +} + +/* Dark mode scrollbar */ +.dark article pre code::-webkit-scrollbar-thumb, +.dark .prose pre code::-webkit-scrollbar-thumb, +.dark .md-typeset pre code::-webkit-scrollbar-thumb, +.dark article pre code::-webkit-scrollbar-thumb, +.dark .prose pre code::-webkit-scrollbar-thumb, +.dark .md-typeset pre code::-webkit-scrollbar-thumb { + background: var(--muted-foreground, #4b5563); +} + +/* ======================================== + Responsive + ======================================== */ + +@media (max-width: 640px) { + article code:not(pre code), + .prose code:not(pre code), + .md-typeset code:not(pre code) { + font-size: 0.8125em; + padding: 0.15em 0.35em; + } + + article pre code, + .prose pre code, + .md-typeset pre code { + padding: 0.875rem 1rem; + font-size: 0.75rem; + max-height: 400px; + } + + article .highlight .copy-button, + article pre .copy-button, + button.copy-code-button, + .code-copy-btn { + opacity: 1; + padding: 0.25rem 0.375rem; + font-size: 0.6875rem; + } +} + +/* ======================================== + Special Code Block Styles + ======================================== */ + +/* Terminal/Shell style */ +article pre.terminal code, +article .highlight.terminal pre code, +.prose pre.terminal code { + color: #22c55e; +} + +article pre.terminal code::before, +article .highlight.terminal pre code::before, +.prose pre.terminal code::before { + content: '$ '; + color: #9ca3af; + user-select: none; +} + +/* Output style (muted) */ +article pre.output code, +article .highlight.output pre code, +.prose pre.output code { + color: var(--muted-foreground, #6b7280); + font-style: italic; +} + +/* Diff style enhancements */ +article .highlight .gi, +.prose .highlight .gi, +.md-typeset .highlight .gi { + background: rgba(34, 197, 94, 0.15); + display: inline-block; + width: 100%; +} + +article .highlight .gd, +.prose .highlight .gd, +.md-typeset .highlight .gd { + background: rgba(239, 68, 68, 0.15); + display: inline-block; + width: 100%; +} diff --git a/docs/stylesheets/feature-cards.css b/docs/stylesheets/feature-cards.css new file mode 100644 index 00000000..03fe0464 --- /dev/null +++ b/docs/stylesheets/feature-cards.css @@ -0,0 +1,543 @@ +/* Feature Cards Styles */ +/* Supports dark mode and hover effects */ + +/* Card Container */ +.card-grid { + display: flex; + flex-wrap: wrap; + gap: 20px; + margin: 1rem 0; +} + +.card-grid-2 { + composes: card-grid; +} + +.card-grid-3 { + composes: card-grid; +} + +/* Base Card Style */ +.feature-card { + flex: 1 1 45%; + min-width: 280px; + text-decoration: none; + color: inherit; + border: 1px solid var(--md-default-fg-color--lightest, #e0e0e0); + border-radius: 12px; + padding: 20px; + transition: all 0.25s ease; + background: var(--md-default-bg-color, #fff); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); + cursor: pointer; + display: block; +} + +.feature-card:hover { + transform: translateY(-3px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); + border-color: var(--md-primary-fg-color, #4051b5); + text-decoration: none; + color: inherit; +} + +/* Three column cards */ +.feature-card-sm { + flex: 1 1 30%; + min-width: 250px; + text-decoration: none; + color: inherit; + border: 1px solid var(--md-default-fg-color--lightest, #e0e0e0); + border-radius: 12px; + padding: 20px; + transition: all 0.25s ease; + background: var(--md-default-bg-color, #fff); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); + cursor: pointer; + display: block; +} + +.feature-card-sm:hover { + transform: translateY(-3px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); + border-color: var(--md-primary-fg-color, #4051b5); + text-decoration: none; + color: inherit; +} + +/* Work in Progress Card */ +.feature-card-wip { + flex: 1 1 30%; + min-width: 250px; + text-decoration: none; + color: inherit; + border: 1px dashed var(--md-default-fg-color--light, #b0b0b0); + border-radius: 12px; + padding: 20px; + transition: all 0.25s ease; + background: var(--md-default-bg-color--light, #fafafa); + box-shadow: none; + opacity: 0.65; + pointer-events: none; + cursor: default; +} + +.feature-card-wip:hover { + transform: none; + box-shadow: none; + text-decoration: none; + color: inherit; +} + +/* Card Header */ +.card-header { + display: inline-flex !important; + align-items: center !important; + flex-wrap: nowrap !important; + margin-bottom: 12px; + white-space: nowrap; + pointer-events: none; +} + +.card-header h3 { + margin: 0 !important; + font-size: 16px; + font-weight: 600; + white-space: nowrap !important; + display: inline !important; + pointer-events: none; +} + +.card-header-lg h3 { + font-size: 18px; +} + +/* Card Icon */ +.card-icon { + height: 1.3em; + width: 1.3em; + min-width: 1.3em; + margin-right: 10px; + opacity: 0.9; + transition: all 0.25s ease; + flex-shrink: 0; + pointer-events: none; +} + +.feature-card:hover .card-icon, +.feature-card-sm:hover .card-icon, +.feature-card-wip:hover .card-icon { + opacity: 1; + transform: scale(1.1); +} + +/* Icon Colors by Category */ +.card-icon-agent { + filter: invert(45%) sepia(80%) saturate(500%) hue-rotate(190deg) brightness(95%); +} + +.card-icon-general { + filter: invert(50%) sepia(60%) saturate(400%) hue-rotate(100deg) brightness(95%); +} + +.card-icon-multimodal { + filter: invert(40%) sepia(70%) saturate(500%) hue-rotate(250deg) brightness(95%); +} + +.card-icon-math { + filter: invert(55%) sepia(70%) saturate(500%) hue-rotate(10deg) brightness(95%); +} + +.card-icon-tool { + filter: invert(45%) sepia(60%) saturate(400%) hue-rotate(170deg) brightness(95%); +} + +.card-icon-data { + filter: invert(50%) sepia(60%) saturate(450%) hue-rotate(130deg) brightness(95%); +} + +.card-icon-integration { + filter: invert(45%) sepia(70%) saturate(450%) hue-rotate(220deg) brightness(95%); +} + +/* Card Description */ +.card-desc { + margin: 0; + font-size: 13px; + opacity: 0.8; + line-height: 1.6; + pointer-events: none; +} + +.card-desc-lg { + font-size: 14px; +} + +/* Make all children non-interactive so clicks pass through to the link */ +.feature-card *, +.feature-card-sm * { + pointer-events: none; +} + +/* Badge for Work in Progress */ +.badge-wip { + font-size: 12px; + background-color: var(--md-warning-fg-color--light, #fff3cd); + color: var(--md-warning-fg-color, #856404); + padding: 2px 10px; + border-radius: 12px; + margin-left: 10px; + font-weight: 500; +} + +/* Callout Tip - Highlighted intro section */ +.callout-tip { + background: linear-gradient(135deg, rgba(245, 158, 11, 0.04) 0%, rgba(245, 158, 11, 0.01) 100%); + border: 1px solid rgba(245, 158, 11, 0.1); + border-left: 3px solid rgba(245, 158, 11, 0.5); + border-radius: 10px; + padding: 18px 22px; + margin: 1.5rem 0; + position: relative; +} + +.callout-tip p { + margin: 0; + line-height: 1.7; + font-size: 15px; +} + +.callout-tip .callout-icon { + height: 1.3em; + width: 1.3em; + margin-right: 10px; + vertical-align: middle; + display: inline-block; + opacity: 0.6; + filter: invert(60%) sepia(50%) saturate(400%) hue-rotate(5deg) brightness(100%); + flex-shrink: 0; +} + +/* Dark Mode for Callout Tip */ +.dark .callout-tip { + background: linear-gradient(135deg, rgba(245, 158, 11, 0.08) 0%, rgba(245, 158, 11, 0.02) 100%); + border-color: rgba(245, 158, 11, 0.15); + border-left-color: rgba(245, 158, 11, 0.6); +} + +.dark .callout-tip .callout-icon { + filter: invert(75%) sepia(60%) saturate(500%) hue-rotate(5deg) brightness(110%); +} + +/* Key Features Section */ +.key-features { + background: var(--md-default-bg-color, #fff); + border-radius: 12px; + padding: 8px; + margin: 1rem 0; +} + +.key-features ul { + margin: 0; + padding-left: 0; + list-style: none; +} + +.key-features > ul > li { + margin-bottom: 12px; + padding: 16px 20px; + border-radius: 10px; + border: 1px solid transparent; + transition: all 0.2s ease; +} + +.key-features > ul > li:last-child { + margin-bottom: 0; +} + +/* Feature 1: Library - Blue */ +.key-features > ul > li:nth-child(1) { + background: linear-gradient(135deg, rgba(59, 130, 246, 0.08) 0%, rgba(59, 130, 246, 0.02) 100%); + border-color: rgba(59, 130, 246, 0.12); +} + +.key-features > ul > li:nth-child(1):hover { + background: linear-gradient(135deg, rgba(59, 130, 246, 0.12) 0%, rgba(59, 130, 246, 0.04) 100%); + border-color: rgba(59, 130, 246, 0.18); +} + +/* Feature 2: Building - Green */ +.key-features > ul > li:nth-child(2) { + background: linear-gradient(135deg, rgba(16, 185, 129, 0.08) 0%, rgba(16, 185, 129, 0.02) 100%); + border-color: rgba(16, 185, 129, 0.12); +} + +.key-features > ul > li:nth-child(2):hover { + background: linear-gradient(135deg, rgba(16, 185, 129, 0.12) 0%, rgba(16, 185, 129, 0.04) 100%); + border-color: rgba(16, 185, 129, 0.18); +} + +/* Feature 3: Integration - Purple */ +.key-features > ul > li:nth-child(3) { + background: linear-gradient(135deg, rgba(139, 92, 246, 0.08) 0%, rgba(139, 92, 246, 0.02) 100%); + border-color: rgba(139, 92, 246, 0.12); +} + +.key-features > ul > li:nth-child(3):hover { + background: linear-gradient(135deg, rgba(139, 92, 246, 0.12) 0%, rgba(139, 92, 246, 0.04) 100%); + border-color: rgba(139, 92, 246, 0.18); +} + +.key-features ul ul { + margin-top: 10px; + padding-left: 20px; +} + +.key-features ul ul li { + margin-bottom: 6px; + position: relative; + opacity: 0.85; +} + +/* Removed arrow decoration for cleaner appearance */ +/* .key-features ul ul li::before { + content: "›"; + position: absolute; + left: -16px; + font-weight: bold; + opacity: 0.5; +} + +.key-features > ul > li:nth-child(1) ul li::before { + color: #3b82f6; +} + +.key-features > ul > li:nth-child(2) ul li::before { + color: #10b981; +} + +.key-features > ul > li:nth-child(3) ul li::before { + color: #8b5cf6; +} */ + +/* Dark Mode Adjustments */ +.dark .feature-card, +.dark .feature-card-sm { + background: rgba(30, 30, 30, 0.6); + border-color: rgba(255, 255, 255, 0.1); +} + +.dark .feature-card:hover, +.dark .feature-card-sm:hover { + background: rgba(40, 40, 40, 0.8); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); + border-color: rgba(255, 255, 255, 0.2); +} + +.dark .feature-card-wip { + background: rgba(30, 30, 30, 0.4); + border-color: rgba(255, 255, 255, 0.08); +} + +.dark .key-features { + background: rgba(255, 255, 255, 0.02); +} + +/* Feature 1: Library - Blue (Dark Mode) */ +.dark .key-features > ul > li:nth-child(1) { + background: linear-gradient(135deg, rgba(59, 130, 246, 0.18) 0%, rgba(59, 130, 246, 0.05) 100%); + border: 1px solid rgba(59, 130, 246, 0.2); +} + +.dark .key-features > ul > li:nth-child(1):hover { + background: linear-gradient(135deg, rgba(59, 130, 246, 0.28) 0%, rgba(59, 130, 246, 0.08) 100%); + border-color: rgba(59, 130, 246, 0.35); +} + +/* Feature 2: Building - Green (Dark Mode) */ +.dark .key-features > ul > li:nth-child(2) { + background: linear-gradient(135deg, rgba(16, 185, 129, 0.18) 0%, rgba(16, 185, 129, 0.05) 100%); + border: 1px solid rgba(16, 185, 129, 0.2); +} + +.dark .key-features > ul > li:nth-child(2):hover { + background: linear-gradient(135deg, rgba(16, 185, 129, 0.28) 0%, rgba(16, 185, 129, 0.08) 100%); + border-color: rgba(16, 185, 129, 0.35); +} + +/* Feature 3: Integration - Purple (Dark Mode) */ +.dark .key-features > ul > li:nth-child(3) { + background: linear-gradient(135deg, rgba(139, 92, 246, 0.18) 0%, rgba(139, 92, 246, 0.05) 100%); + border: 1px solid rgba(139, 92, 246, 0.2); +} + +.dark .key-features > ul > li:nth-child(3):hover { + background: linear-gradient(135deg, rgba(139, 92, 246, 0.28) 0%, rgba(139, 92, 246, 0.08) 100%); + border-color: rgba(139, 92, 246, 0.35); +} + +.dark .badge-wip { + background-color: rgba(255, 193, 7, 0.25); + color: #ffc107; +} + +/* Ensure text readability in dark mode */ +.dark .key-features ul ul li { + opacity: 0.9; +} + +.dark .key-features strong, +.dark .key-features b { + color: rgba(255, 255, 255, 0.95); +} + +/* Key Features Sub-point Links */ +.key-features ul ul li a.feature-link { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 12px; + font-weight: 500; + text-decoration: none; + padding: 3px 10px; + border-radius: 4px; + margin-left: 8px; + transition: all 0.2s ease; + vertical-align: baseline; + pointer-events: auto; + white-space: nowrap; + line-height: 1.4; +} + +.key-features ul ul li a.feature-link .link-arrow { + font-size: 11px; + transition: transform 0.2s ease; + display: inline-block; +} + +.key-features ul ul li a.feature-link:hover .link-arrow { + transform: translateX(2px); +} + +/* Blue links for Feature 1 (Library) */ +.key-features > ul > li:nth-child(1) ul li a.feature-link { + color: #3b82f6; + background: rgba(59, 130, 246, 0.08); + border: 1px solid rgba(59, 130, 246, 0.15); +} + +.key-features > ul > li:nth-child(1) ul li a.feature-link:hover { + background: rgba(59, 130, 246, 0.15); + border-color: rgba(59, 130, 246, 0.3); + text-decoration: none; +} + +/* Green links for Feature 2 (Building) */ +.key-features > ul > li:nth-child(2) ul li a.feature-link { + color: #10b981; + background: rgba(16, 185, 129, 0.08); + border: 1px solid rgba(16, 185, 129, 0.15); +} + +.key-features > ul > li:nth-child(2) ul li a.feature-link:hover { + background: rgba(16, 185, 129, 0.15); + border-color: rgba(16, 185, 129, 0.3); + text-decoration: none; +} + +/* Purple links for Feature 3 (Integration) */ +.key-features > ul > li:nth-child(3) ul li a.feature-link { + color: #8b5cf6; + background: rgba(139, 92, 246, 0.08); + border: 1px solid rgba(139, 92, 246, 0.15); +} + +.key-features > ul > li:nth-child(3) ul li a.feature-link:hover { + background: rgba(139, 92, 246, 0.15); + border-color: rgba(139, 92, 246, 0.3); + text-decoration: none; +} + +/* Dark mode adjustments for feature links */ +.dark .key-features > ul > li:nth-child(1) ul li a.feature-link { + color: #60a5fa; + background: rgba(59, 130, 246, 0.15); + border-color: rgba(59, 130, 246, 0.25); +} + +.dark .key-features > ul > li:nth-child(1) ul li a.feature-link:hover { + background: rgba(59, 130, 246, 0.25); + border-color: rgba(59, 130, 246, 0.4); +} + +.dark .key-features > ul > li:nth-child(2) ul li a.feature-link { + color: #34d399; + background: rgba(16, 185, 129, 0.15); + border-color: rgba(16, 185, 129, 0.25); +} + +.dark .key-features > ul > li:nth-child(2) ul li a.feature-link:hover { + background: rgba(16, 185, 129, 0.25); + border-color: rgba(16, 185, 129, 0.4); +} + +.dark .key-features > ul > li:nth-child(3) ul li a.feature-link { + color: #a78bfa; + background: rgba(139, 92, 246, 0.15); + border-color: rgba(139, 92, 246, 0.25); +} + +.dark .key-features > ul > li:nth-child(3) ul li a.feature-link:hover { + background: rgba(139, 92, 246, 0.25); + border-color: rgba(139, 92, 246, 0.4); +} + +/* Card with arrow indicator */ +.feature-card::after, +.feature-card-sm::after { + content: "→"; + position: absolute; + right: 16px; + bottom: 16px; + opacity: 0; + transition: all 0.25s ease; + color: var(--md-primary-fg-color, #4051b5); +} + +.feature-card:hover::after, +.feature-card-sm:hover::after { + opacity: 0.6; + right: 12px; +} + +.feature-card, +.feature-card-sm, +.feature-card-wip { + position: relative; +} + +/* Inline Icons for text content (replacing emoji) */ +.inline-icon { + height: 1em; + width: 1em; + vertical-align: -0.125em; + display: inline; + opacity: 0.85; + filter: var(--inline-icon-filter, none); +} + +/* Dark mode filter for inline icons */ +.dark .inline-icon { + filter: invert(1) hue-rotate(180deg); + opacity: 0.9; +} + +/* Alternative: use CSS variables for color control */ +:root { + --inline-icon-filter: none; +} + +.dark { + --inline-icon-filter: invert(1) hue-rotate(180deg); +} + diff --git a/docs/stylesheets/flowchart.css b/docs/stylesheets/flowchart.css new file mode 100644 index 00000000..175dc123 --- /dev/null +++ b/docs/stylesheets/flowchart.css @@ -0,0 +1,403 @@ +/* Flowchart Component Styling */ +/* Modern, card-based flowchart with dark mode support */ + +/* ======================================== + Flowchart Container + ======================================== */ + +.flowchart-container { + margin: 2rem 0; + padding: 0; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 0; + width: 100%; + overflow-x: auto; +} + +/* ======================================== + Flowchart Box Styles + ======================================== */ + +.flowchart-box { + position: relative; + padding: 1.5rem 1.75rem; + margin: 0; + width: 24rem; + min-width: 22rem; + flex-shrink: 0; + border-radius: 0.75rem; + border: 1px solid #e5e7eb; + background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.06); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + overflow: visible; +} + +.flowchart-box:hover { + border-color: #d1d5db; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.06); + transform: translateY(-2px); +} + +/* Dark mode */ +.dark .flowchart-box { + border-color: #374151; + background: linear-gradient(135deg, #1f2937 0%, #1a2332 100%); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.4); +} + +.dark .flowchart-box:hover { + border-color: #4b5563; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5), 0 2px 4px rgba(0, 0, 0, 0.4); +} + +/* ======================================== + Box Header (Title) + ======================================== */ + +.flowchart-box-header { + font-size: 1rem; + font-weight: 700; + color: #111827; + margin-bottom: 1rem; + padding-bottom: 0.75rem; + border-bottom: 2px solid #e5e7eb; + display: flex; + align-items: center; + gap: 0.625rem; + white-space: nowrap; + overflow: visible; +} + +.dark .flowchart-box-header { + color: #f3f4f6; + border-bottom-color: #374151; +} + +/* Header icon */ +.flowchart-box-header::before { + content: ""; + display: inline-block; + width: 1.25rem; + height: 1.25rem; + flex-shrink: 0; + background-color: #6b7280; + mask-repeat: no-repeat; + mask-position: center; + mask-size: contain; +} + +.dark .flowchart-box-header::before { + background-color: #9ca3af; +} + +/* Input box icon */ +.flowchart-box.input .flowchart-box-header::before { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'%3E%3C/path%3E%3Cpolyline points='14 2 14 8 20 8'%3E%3C/polyline%3E%3C/svg%3E"); + background-color: #3b82f6; +} + +.dark .flowchart-box.input .flowchart-box-header::before { + background-color: #60a5fa; +} + +/* Grader box icon */ +.flowchart-box.grader .flowchart-box-header::before { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + background-color: #10b981; +} + +.dark .flowchart-box.grader .flowchart-box-header::before { + background-color: #34d399; +} + +/* Output box icon */ +.flowchart-box.output .flowchart-box-header::before { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'%3E%3C/path%3E%3Cpolyline points='7 10 12 15 17 10'%3E%3C/polyline%3E%3Cline x1='12' y1='15' x2='12' y2='3'%3E%3C/line%3E%3C/svg%3E"); + background-color: #8b5cf6; +} + +.dark .flowchart-box.output .flowchart-box-header::before { + background-color: #a78bfa; +} + +/* ======================================== + Box Content (List Items) + ======================================== */ + +.flowchart-box-content { + margin: 0; + padding: 0; + list-style: none; + overflow: visible; +} + +.flowchart-box-content li { + position: relative; + padding-left: 1.75rem; + margin-bottom: 0.625rem; + font-size: 0.9375rem; + line-height: 1.6; + color: #4b5563; + word-wrap: break-word; + overflow-wrap: break-word; +} + +.flowchart-box-content li:last-child { + margin-bottom: 0; +} + +.dark .flowchart-box-content li { + color: #d1d5db; +} + +/* List item bullet */ +.flowchart-box-content li::before { + content: ""; + position: absolute; + left: 0; + top: 0.5rem; + width: 0.375rem; + height: 0.375rem; + background: #9ca3af; + border-radius: 50%; +} + +.dark .flowchart-box-content li::before { + background: #6b7280; +} + +/* Label styling (e.g., "Query", "Response") */ +.flowchart-box-content li strong { + font-weight: 600; + color: #1f2937; +} + +.dark .flowchart-box-content li strong { + color: #f9fafb; +} + +/* Tag styling (e.g., "(optional)", "(required)") */ +.flowchart-box-content li em { + font-style: normal; + font-size: 0.8125rem; + font-weight: 500; + padding: 0.125rem 0.5rem; + margin-left: 0.5rem; + border-radius: 0.25rem; + background: rgba(59, 130, 246, 0.1); + color: #3b82f6; +} + +.flowchart-box-content li em.optional { + background: rgba(107, 114, 128, 0.1); + color: #6b7280; +} + +.dark .flowchart-box-content li em { + background: rgba(96, 165, 250, 0.15); + color: #60a5fa; +} + +.dark .flowchart-box-content li em.optional { + background: rgba(156, 163, 175, 0.15); + color: #9ca3af; +} + +/* Nested list for sub-items */ +.flowchart-box-content ul { + margin: 0.5rem 0 0 0; + padding-left: 1.25rem; + list-style: none; + overflow: visible; +} + +.flowchart-box-content ul li { + font-size: 0.875rem; + color: #6b7280; + padding-left: 1.5rem; + word-wrap: break-word; + overflow-wrap: break-word; +} + +.dark .flowchart-box-content ul li { + color: #9ca3af; +} + +.flowchart-box-content ul li::before { + width: 0.25rem; + height: 0.25rem; + top: 0.5rem; +} + +/* ======================================== + Arrow Connector + ======================================== */ + +.flowchart-arrow { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 3rem; + height: auto; + margin: 0; + flex-shrink: 0; +} + +.flowchart-arrow::before { + content: ""; + width: 100%; + height: 2px; + background: linear-gradient(90deg, #d1d5db 0%, #9ca3af 50%, #d1d5db 100%); + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.dark .flowchart-arrow::before { + background: linear-gradient(90deg, #4b5563 0%, #6b7280 50%, #4b5563 100%); +} + +/* Arrow icon */ +.flowchart-arrow::after { + content: ""; + width: 1.5rem; + height: 1.5rem; + background-color: #6b7280; + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3Cpolyline points='12 5 19 12 12 19'%3E%3C/polyline%3E%3C/svg%3E"); + mask-repeat: no-repeat; + mask-position: center; + mask-size: contain; + position: relative; + animation: arrow-bounce-horizontal 2s ease-in-out infinite; +} + +.dark .flowchart-arrow::after { + background-color: #9ca3af; +} + +/* Arrow bounce animation (horizontal) */ +@keyframes arrow-bounce-horizontal { + 0%, 100% { + transform: translateX(0); + } + 50% { + transform: translateX(4px); + } +} + +/* ======================================== + Responsive Design + ======================================== */ + +@media (max-width: 1024px) { + .flowchart-container { + flex-direction: column; + gap: 0; + } + + .flowchart-box { + width: 100%; + max-width: 42rem; + margin: 0 auto; + } + + .flowchart-arrow { + width: auto; + height: 2.5rem; + margin: 0 auto; + } + + .flowchart-arrow::before { + width: 2px; + height: 100%; + background: linear-gradient(180deg, #d1d5db 0%, #9ca3af 50%, #d1d5db 100%); + top: 0; + left: 50%; + transform: translateX(-50%); + } + + .dark .flowchart-arrow::before { + background: linear-gradient(180deg, #4b5563 0%, #6b7280 50%, #4b5563 100%); + } + + .flowchart-arrow::after { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='12' y1='5' x2='12' y2='19'%3E%3C/line%3E%3Cpolyline points='19 12 12 19 5 12'%3E%3C/polyline%3E%3C/svg%3E"); + animation: arrow-bounce 2s ease-in-out infinite; + } + + @keyframes arrow-bounce { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(4px); + } + } +} + +@media (max-width: 640px) { + .flowchart-box { + padding: 1.25rem 1.5rem; + } + + .flowchart-box-header { + font-size: 0.9375rem; + } + + .flowchart-box-content li { + font-size: 0.875rem; + } + + .flowchart-arrow { + height: 2rem; + } +} + +/* ======================================== + Special Variants + ======================================== */ + +/* Highlighted box variant */ +.flowchart-box.highlight { + border-color: #10b981; + background: linear-gradient(135deg, #f0fdf4 0%, #dcfce7 100%); + box-shadow: 0 2px 8px rgba(16, 185, 129, 0.15), 0 1px 2px rgba(16, 185, 129, 0.1); +} + +.flowchart-box.highlight:hover { + border-color: #059669; + box-shadow: 0 4px 12px rgba(16, 185, 129, 0.2), 0 2px 4px rgba(16, 185, 129, 0.15); +} + +.dark .flowchart-box.highlight { + border-color: #34d399; + background: linear-gradient(135deg, #064e3b 0%, #065f46 100%); + box-shadow: 0 2px 8px rgba(52, 211, 153, 0.3), 0 1px 2px rgba(52, 211, 153, 0.2); +} + +.dark .flowchart-box.highlight:hover { + border-color: #10b981; + box-shadow: 0 4px 12px rgba(52, 211, 153, 0.4), 0 2px 4px rgba(52, 211, 153, 0.3); +} + +/* Compact variant */ +.flowchart-box.compact { + padding: 1rem 1.25rem; +} + +.flowchart-box.compact .flowchart-box-header { + font-size: 0.9375rem; + margin-bottom: 0.75rem; + padding-bottom: 0.5rem; +} + +.flowchart-box.compact .flowchart-box-content li { + font-size: 0.875rem; + margin-bottom: 0.5rem; +} + diff --git a/docs/stylesheets/jupyter-simple.css b/docs/stylesheets/jupyter-simple.css new file mode 100644 index 00000000..401abf67 --- /dev/null +++ b/docs/stylesheets/jupyter-simple.css @@ -0,0 +1,259 @@ +/* Jupyter notebook presentation styles for OpenJudge docs */ +/* Applies to common nbconvert / mkdocs-jupyter markup */ + +article .jupyter-notebook, +article .nb-notebook, +article .jp-Notebook, +article .notebook { + display: block; + margin: 2.5rem 0; + gap: 1.5rem; +} + +article .jupyter-notebook .cell, +article .nb-notebook .cell, +article .jp-Notebook .jp-Cell, +article .notebook .cell, +article .jupyter-cell, +article .nb-cell { + position: relative; + margin: 1.75rem 0; + border: 1px solid var(--border, rgba(148, 163, 184, 0.35)); + border-radius: var(--radius-lg, 0.75rem); + background: var(--card, #ffffff); + overflow: hidden; + box-shadow: 0 18px 38px rgba(15, 23, 42, 0.08); +} + +article .jupyter-notebook .cell:first-of-type, +article .nb-notebook .cell:first-of-type, +article .notebook .cell:first-of-type { + margin-top: 0; +} + +/* Cell header ribbon */ +/* Support both data-type attribute and standard nbconvert class names */ +article .jupyter-notebook .cell::before, +article .nb-notebook .cell::before, +article .jp-Notebook .jp-Cell::before, +article .jupyter-cell::before, +article .nb-cell::before, +article .cell.code_cell::before, +article .cell.text_cell::before, +article .cell.markdown::before { + content: ""; + position: absolute; + top: 0.85rem; + left: 1rem; + padding: 0.15rem 0.55rem; + font-size: 0.75rem; + font-weight: 600; + line-height: 1rem; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--muted-foreground, #4b5563); + background: rgba(148, 163, 184, 0.16); + border-radius: 999px; +} + +/* Markdown cells - via data-type or class */ +article .jupyter-notebook .cell[data-type="markdown"]::before, +article .nb-notebook .cell[data-type="markdown"]::before, +article .jupyter-cell[data-type="markdown"]::before, +article .cell.text_cell::before, +article .cell.markdown::before { + content: "Markdown"; +} + +/* Code cells - via data-type or class */ +article .jupyter-notebook .cell[data-type="code"]::before, +article .nb-notebook .cell[data-type="code"]::before, +article .jupyter-cell[data-type="code"]::before, +article .cell.code_cell::before { + content: "Code"; + color: var(--primary-foreground, #0f172a); + background: rgba(14, 165, 233, 0.15); +} + +/* Input (code) area */ +article .cell .input, +article .cell .input_area, +article .jupyter-cell .input, +article .nbinput, +article .jp-InputArea { + display: grid; + grid-template-columns: minmax(3.5rem, auto) minmax(0, 1fr); + gap: 0.5rem 1rem; + padding: 1.5rem 1.75rem 1.1rem; + background: var(--muted, rgba(15, 23, 42, 0.04)); + border-bottom: 1px solid var(--border, rgba(148, 163, 184, 0.28)); +} + +article .cell .input pre, +article .nbinput pre, +article .jp-InputArea pre { + margin: 0; + border-radius: var(--radius-md, 0.5rem); + background: transparent; + /* Inherit syntax highlighting background from Pygments or theme */ +} + +article .input_prompt, +article .prompt, +article .nbinput .prompt, +article .jp-InputArea-prompt { + font-family: var(--font-mono, "JetBrains Mono", "Fira Code", monospace); + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.02em; + color: var(--primary, #0ea5e9); + padding-top: 0.25rem; +} + +article .input_prompt::after, +article .prompt.input_prompt::after, +article .jp-InputArea-prompt::after { + content: " ➜"; + opacity: 0.6; +} + +/* Output area */ +article .cell .output_wrapper, +article .cell .output, +article .nboutput, +article .jp-OutputArea { + display: block; + padding: 1.35rem 1.75rem; + background: var(--card, #ffffff); +} + +article .nboutput .prompt, +article .jp-OutputArea-prompt { + font-family: var(--font-mono, "JetBrains Mono", monospace); + font-size: 0.75rem; + font-weight: 600; + color: var(--primary, #0ea5e9); + opacity: 0.75; + margin-bottom: 0.75rem; +} + +article .nboutput pre, +article .jp-OutputArea pre { + background: rgba(15, 23, 42, 0.05); + border-radius: var(--radius-md, 0.5rem); + padding: 1rem 1.25rem; + margin: 0; +} + +article .nboutput table, +article .jp-OutputArea table { + width: 100%; + margin: 0.5rem 0 0; + border-collapse: collapse; + font-size: 0.875rem; +} + +article .nboutput table th, +article .jp-OutputArea table th, +article .nboutput table td, +article .jp-OutputArea table td { + border: 1px solid rgba(148, 163, 184, 0.25); + padding: 0.5rem 0.75rem; + text-align: left; +} + +/* Error outputs */ +article .nboutput.error, +article .jp-OutputArea[data-mime-type*="error"], +article .cell .output.stderr { + border-left: 3px solid #ef4444; + background: rgba(248, 113, 113, 0.12); + color: #991b1b; +} + +.dark article .nboutput.error, +.dark article .jp-OutputArea[data-mime-type*="error"], +.dark article .cell .output.stderr, +.dark article .nboutput.error, +.dark article .jp-OutputArea[data-mime-type*="error"], +.dark article .cell .output.stderr { + border-left-color: #fca5a5; + background: rgba(248, 113, 113, 0.21); + color: #fecaca; +} + +/* Markdown cells */ +article .cell.markdown, +article .cell.text_cell, +article .jupyter-cell[data-type="markdown"] { + padding: 2.25rem 2.5rem; + background: linear-gradient(135deg, rgba(59, 130, 246, 0.06), transparent); +} + +article .cell.markdown p:last-child, +article .cell.markdown ul:last-child, +article .cell.markdown ol:last-child { + margin-bottom: 0; +} + +/* Dark theme tuning */ +.dark article .jupyter-notebook .cell, +.dark article .nb-notebook .cell, +.dark article .jp-Notebook .jp-Cell, +.dark article .jupyter-notebook .cell, +.dark article .nb-notebook .cell, +.dark article .jp-Notebook .jp-Cell { + background: rgba(15, 23, 42, 0.75); + border-color: rgba(148, 163, 184, 0.22); + box-shadow: 0 20px 40px rgba(2, 6, 23, 0.65); +} + +.dark article .cell .input, +.dark article .cell .input, +.dark article .nbinput, +.dark article .nbinput { + background: rgba(148, 163, 184, 0.08); + border-bottom-color: rgba(148, 163, 184, 0.2); +} + +.dark article .nboutput pre, +.dark article .nboutput pre, +.dark article .jp-OutputArea pre, +.dark article .jp-OutputArea pre { + background: rgba(148, 163, 184, 0.12); +} + +.dark article .cell.markdown, +.dark article .cell.markdown, +.dark article .jupyter-cell[data-type="markdown"], +.dark article .jupyter-cell[data-type="markdown"] { + background: linear-gradient(135deg, rgba(14, 165, 233, 0.18), transparent); +} + +/* Responsive tweaks */ +@media (max-width: 768px) { + article .cell .input, + article .nbinput, + article .jp-InputArea { + grid-template-columns: minmax(0, 1fr); + padding: 1.25rem 1.25rem 0.9rem; + } + + article .cell .input pre, + article .nbinput pre, + article .jp-InputArea pre { + font-size: 0.85rem; + } + + article .cell .output_wrapper, + article .nboutput, + article .jp-OutputArea { + padding: 1.15rem 1.25rem; + } + + article .cell::before { + left: 1.25rem; + top: 0.75rem; + } +} + diff --git a/docs/stylesheets/mermaid.css b/docs/stylesheets/mermaid.css new file mode 100644 index 00000000..f6425914 --- /dev/null +++ b/docs/stylesheets/mermaid.css @@ -0,0 +1,108 @@ +/* Mermaid diagram styling for OpenJudge docs */ +/* Aligns diagrams, adds padding, and keeps them readable across themes */ + +article .mermaid { + position: relative; + display: block; + margin: 2rem auto; + padding: 1.5rem; + border: 1px solid var(--border, rgba(148, 163, 184, 0.4)); + border-radius: var(--radius-lg, 0.75rem); + background: var(--card, #ffffff); + box-shadow: 0 12px 24px rgba(15, 23, 42, 0.06); + overflow-x: auto; + overflow-y: hidden; + text-align: center; + max-width: min(100%, 68rem); + scrollbar-width: thin; +} + +article .mermaid::-webkit-scrollbar { + height: 8px; +} + +article .mermaid::-webkit-scrollbar-thumb { + border-radius: 999px; + background: rgba(148, 163, 184, 0.45); +} + +article .mermaid::-webkit-scrollbar-track { + background: transparent; +} + +article .mermaid svg, +article .mermaid > svg { + display: inline-block; + width: auto; + max-width: none; + color: inherit; +} + +article .mermaid text { + font-family: var(--font-sans, "Inter", "Manrope", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif); + font-size: 0.95rem; + fill: var(--foreground, #0f172a); +} + +article .mermaid .label { + color: var(--foreground, #0f172a); +} + +article .mermaid a { + color: var(--primary-foreground, var(--primary, #0284c7)); +} + +article figure.mermaid { + margin: 2rem auto; +} + +article figure.mermaid figcaption { + margin-top: 1rem; + font-size: 0.875rem; + color: var(--muted-foreground, #475569); + text-align: center; +} + +/* Dark theme adjustments */ +.dark article .mermaid, +.dark article .mermaid { + border-color: rgba(148, 163, 184, 0.2); + background: rgba(15, 23, 42, 0.55); + box-shadow: 0 12px 28px rgba(15, 23, 42, 0.65); +} + +.dark article .mermaid text, +.dark article .mermaid text { + fill: var(--muted-foreground, #e2e8f0); +} + +.dark article .mermaid .label, +.dark article .mermaid .label { + color: var(--muted-foreground, #e2e8f0); +} + +.dark article figure.mermaid figcaption, +.dark article figure.mermaid figcaption { + color: var(--muted-foreground, #cbd5f5); +} + +/* Hide raw fenced code only when Mermaid successfully renders */ +/* If .mermaid exists as a sibling, the diagram rendered successfully */ +article .mermaid ~ pre code.language-mermaid, +article .mermaid + pre code.language-mermaid { + display: none; +} + +/* Alternative: if Mermaid wraps the pre, hide the pre entirely */ +article .mermaid pre { + display: none; +} + +/* Responsive tweaks */ +@media (max-width: 640px) { + article .mermaid { + margin: 1.5rem -1rem; + padding: 1.25rem; + border-radius: var(--radius-md, 0.5rem); + } +} diff --git a/docs/stylesheets/mkdocstrings.css b/docs/stylesheets/mkdocstrings.css new file mode 100644 index 00000000..77b042c6 --- /dev/null +++ b/docs/stylesheets/mkdocstrings.css @@ -0,0 +1,325 @@ +/* mkdocstrings API documentation styling */ +/* Brings structured cards, signatures, and definition lists inline with OpenJudge visuals */ +/* + * IMPORTANT: These selectors target the default mkdocstrings-python template classes: + * - .doc, .doc-object, .doc-heading, .doc-signature, .doc-contents + * + * If you've customized your mkdocstrings template or upgraded to a version with + * different class names, you may need to adjust these selectors. + * + * Test with: mkdocs build && check generated API pages for matching classes + */ + +article .mkdocstrings, +article .doc.doc-object { + display: block; + margin: 2.5rem 0; +} + +article .mkdocstrings .doc, +article .doc.doc-object { + position: relative; + margin: 2.25rem 0; + border: 1px solid var(--border, rgba(148, 163, 184, 0.32)); + border-radius: var(--radius-xl, 1rem); + background: var(--card, #ffffff); + box-shadow: 0 24px 44px rgba(15, 23, 42, 0.08); + overflow: hidden; +} + +article .mkdocstrings .doc .doc-heading, +article .doc.doc-object .doc-heading { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 1rem; + padding: 1.75rem 2rem 1.25rem; + background: linear-gradient(135deg, rgba(14, 165, 233, 0.12), transparent); + border-bottom: 1px solid rgba(148, 163, 184, 0.2); +} + +article .mkdocstrings .doc .doc-heading h2, +article .mkdocstrings .doc .doc-heading h3, +article .doc.doc-object .doc-heading h2, +article .doc.doc-object .doc-heading h3 { + margin: 0; + font-size: clamp(1.25rem, 2.5vw, 1.75rem); + font-weight: 700; + color: var(--foreground, #0f172a); +} + +article .mkdocstrings .doc .doc-heading .doc-link, +article .doc.doc-object .doc-heading .doc-link { + font-size: 0.85rem; + font-weight: 500; + color: var(--primary, #0284c7); + text-decoration: none; + opacity: 0.85; +} + +article .mkdocstrings .doc .doc-heading .doc-link:hover, +article .doc.doc-object .doc-heading .doc-link:hover { + text-decoration: underline; + opacity: 1; +} + +/* Object signature */ +article .mkdocstrings .doc .doc-signature, +article .doc.doc-object .doc-signature, +article .mkdocstrings .doc pre.docstring-signature, +article .doc.doc-object pre.docstring-signature { + margin: 0; + padding: 1.25rem 2rem; + background: rgba(15, 23, 42, 0.05); + border-bottom: 1px solid rgba(148, 163, 184, 0.18); + overflow-x: auto; + font-family: var(--font-mono, "JetBrains Mono", "Fira Code", monospace); + font-size: 0.9rem; +} + +article .mkdocstrings .doc .doc-signature code, +article .doc.doc-object .doc-signature code, +article .mkdocstrings .doc pre.docstring-signature code, +article .doc.doc-object pre.docstring-signature code { + background: transparent; + padding: 0; + font-size: inherit; +} + +/* Docstring content */ +article .mkdocstrings .doc .doc-contents, +article .doc.doc-object .doc-contents { + padding: 1.75rem 2rem 2.25rem; + display: grid; + gap: 1.75rem; +} + +article .mkdocstrings .doc .doc-contents > p:first-child { + font-size: 1rem; + line-height: 1.8; + color: var(--muted-foreground, #475569); +} + +/* Definition lists (Parameters, Returns, etc.) */ +article .mkdocstrings dl, +article .doc.doc-object dl { + margin: 0; + padding: 1.25rem 1.5rem; + border: 1px solid rgba(148, 163, 184, 0.25); + border-radius: var(--radius-lg, 0.75rem); + background: rgba(148, 163, 184, 0.08); + display: grid; + gap: 0.85rem; +} + +article .mkdocstrings dl dt, +article .doc.doc-object dl dt { + font-family: var(--font-mono, "JetBrains Mono", monospace); + font-size: 0.85rem; + font-weight: 600; + color: var(--foreground, #0f172a); + display: flex; + align-items: baseline; + gap: 0.5rem; +} + +article .mkdocstrings dl dt .name, +article .doc.doc-object dl dt .name { + padding: 0.1rem 0.45rem; + border-radius: 0.45rem; + background: rgba(14, 165, 233, 0.15); + color: var(--primary-foreground, #0f172a); +} + +article .mkdocstrings dl dt .type, +article .doc.doc-object dl dt .type { + font-size: 0.76rem; + color: var(--muted-foreground, #475569); +} + +article .mkdocstrings dl dd, +article .doc.doc-object dl dd { + margin-left: 0; + font-size: 0.95rem; + color: var(--muted-foreground, #475569); + line-height: 1.7; +} + +article .mkdocstrings dl dd > :last-child { + margin-bottom: 0; +} + +/* Members tables */ +article .mkdocstrings table, +article .doc.doc-object table { + width: 100%; + border-collapse: collapse; + margin: 1rem 0 0; + font-size: 0.95rem; +} + +article .mkdocstrings table th, +article .doc.doc-object table th, +article .mkdocstrings table td, +article .doc.doc-object table td { + border: 1px solid rgba(148, 163, 184, 0.2); + padding: 0.65rem 0.85rem; + text-align: left; +} + +article .mkdocstrings table tr:nth-child(even), +article .doc.doc-object table tr:nth-child(even) { + background: rgba(148, 163, 184, 0.12); +} + +/* Collapsible members */ +article details.doc-section, +article .mkdocstrings details { + border: 1px solid rgba(148, 163, 184, 0.24); + border-radius: var(--radius-lg, 0.75rem); + background: rgba(15, 23, 42, 0.03); + padding: 1rem 1.35rem; +} + +article details.doc-section summary, +article .mkdocstrings details summary { + cursor: pointer; + font-weight: 600; + color: var(--foreground, #0f172a); +} + +article .mkdocstrings details[open] { + background: rgba(14, 165, 233, 0.08); +} + +/* Source buttons */ +article .mkdocstrings .doc .view-source, +article .doc.doc-object .view-source { + position: absolute; + top: 0.85rem; + right: 1.25rem; + display: inline-flex; + align-items: center; + gap: 0.35rem; + font-size: 0.8rem; + font-weight: 600; + color: var(--primary, #0284c7); + text-decoration: none; + padding: 0.45rem 0.65rem; + border-radius: 999px; + background: rgba(14, 165, 233, 0.15); + transition: transform 0.15s ease, box-shadow 0.15s ease; +} + +article .mkdocstrings .doc .view-source:hover, +article .doc.doc-object .view-source:hover { + transform: translateY(-1px); + box-shadow: 0 8px 20px rgba(14, 165, 233, 0.3); +} + +/* Dark theme adjustments */ +.dark article .mkdocstrings .doc, +.dark article .doc.doc-object, +.dark article .mkdocstrings .doc, +.dark article .doc.doc-object { + background: rgba(15, 23, 42, 0.82); + border-color: rgba(148, 163, 184, 0.18); + box-shadow: 0 28px 60px rgba(2, 6, 23, 0.75); +} + +.dark article .mkdocstrings .doc .doc-heading, +.dark article .mkdocstrings .doc .doc-heading { + background: linear-gradient(135deg, rgba(14, 165, 233, 0.22), transparent); + border-bottom-color: rgba(148, 163, 184, 0.25); +} + +.dark article .mkdocstrings dl, +.dark article .mkdocstrings dl { + background: rgba(148, 163, 184, 0.16); + border-color: rgba(148, 163, 184, 0.32); +} + +.dark article .mkdocstrings dl dt, +.dark article .mkdocstrings dl dt { + color: #e2e8f0; +} + +.dark article .mkdocstrings dl dt .type, +.dark article .mkdocstrings dl dt .type { + color: rgba(226, 232, 240, 0.74); +} + +.dark article .mkdocstrings dl dd, +.dark article .mkdocstrings dl dd { + color: rgba(226, 232, 240, 0.78); +} + +.dark article .mkdocstrings table tr:nth-child(even), +.dark article .mkdocstrings table tr:nth-child(even) { + background: rgba(148, 163, 184, 0.18); +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + article .mkdocstrings .doc, + article .doc.doc-object { + margin: 1.75rem -0.75rem; + border-radius: var(--radius-lg, 0.75rem); + } + + article .mkdocstrings .doc .doc-heading, + article .doc.doc-object .doc-heading { + padding: 1.5rem 1.75rem; + flex-direction: column; + align-items: flex-start; + gap: 0.6rem; + } + + article .mkdocstrings .doc .doc-signature, + article .doc.doc-object .doc-signature, + article .mkdocstrings .doc pre.docstring-signature, + article .doc.doc-object pre.docstring-signature { + padding: 1rem 1.5rem; + } + + article .mkdocstrings .doc .doc-contents, + article .doc.doc-object .doc-contents { + padding: 1.5rem 1.5rem 1.9rem; + } +} + +/* ======================================== + Fallback Styles for Generic API Docs + (if mkdocstrings classes are unavailable) + ======================================== */ + +/* Generic API section styling - applies to any .api-doc container */ +article .api-doc, +article [class*="api-"], +article [class*="autodoc"] { + margin: 2rem 0; + border: 1px solid var(--border, rgba(148, 163, 184, 0.3)); + border-radius: var(--radius-lg, 0.75rem); + background: var(--card, #ffffff); + padding: 1.5rem; +} + +/* Generic function/class signature in monospace */ +article .signature, +article [class*="sig"], +article code.signature { + font-family: var(--font-mono, "JetBrains Mono", monospace); + font-size: 0.9rem; + display: block; + padding: 0.75rem 1rem; + background: rgba(15, 23, 42, 0.05); + border-radius: var(--radius-md, 0.5rem); + overflow-x: auto; +} + +.dark article .signature, +.dark article [class*="sig"], +.dark article .signature, +.dark article [class*="sig"] { + background: rgba(148, 163, 184, 0.12); +} diff --git a/docs/stylesheets/nav-scroll-fix.css b/docs/stylesheets/nav-scroll-fix.css new file mode 100644 index 00000000..c4fefc16 --- /dev/null +++ b/docs/stylesheets/nav-scroll-fix.css @@ -0,0 +1,482 @@ +/* + * Navigation & Scroll Enhancements for OpenJudge Documentation + * Phase 1: 导航滚动修复 + * + * Features: + * - 侧边栏滚动优化 + * - 当前页面高亮 + * - 滚动时侧边栏固定 + * - 目录 (TOC) 滚动跟随 + * - 平滑滚动 + */ + +/* ======================================== + Global Smooth Scroll + ======================================== */ + +html { + scroll-behavior: smooth; +} + +/* Respect reduced motion preference */ +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } +} + +/* ======================================== + Sidebar Navigation + ======================================== */ + +/* Sidebar container - sticky positioning */ +nav.sidebar, +.md-sidebar, +.nav-sidebar, +aside.sidebar { + position: sticky; + top: 0; + max-height: 100vh; + overflow-y: auto; + overflow-x: hidden; + /* Hide scrollbar by default, show on hover */ + scrollbar-width: none; + scrollbar-color: var(--muted-foreground, #d1d5db) transparent; +} + +/* Show scrollbar on hover (Firefox) */ +nav.sidebar:hover, +.md-sidebar:hover, +.nav-sidebar:hover, +aside.sidebar:hover { + scrollbar-width: thin; +} + +/* Custom scrollbar for sidebar (Webkit - hidden by default) */ +nav.sidebar::-webkit-scrollbar, +.md-sidebar::-webkit-scrollbar, +.nav-sidebar::-webkit-scrollbar, +aside.sidebar::-webkit-scrollbar { + width: 0; +} + +/* Show scrollbar on hover (Webkit) */ +nav.sidebar:hover::-webkit-scrollbar, +.md-sidebar:hover::-webkit-scrollbar, +.nav-sidebar:hover::-webkit-scrollbar, +aside.sidebar:hover::-webkit-scrollbar { + width: 4px; +} + +nav.sidebar::-webkit-scrollbar-track, +.md-sidebar::-webkit-scrollbar-track, +.nav-sidebar::-webkit-scrollbar-track, +aside.sidebar::-webkit-scrollbar-track { + background: transparent; +} + +nav.sidebar::-webkit-scrollbar-thumb, +.md-sidebar::-webkit-scrollbar-thumb, +.nav-sidebar::-webkit-scrollbar-thumb, +aside.sidebar::-webkit-scrollbar-thumb { + background: var(--muted-foreground, #d1d5db); + border-radius: 2px; +} + +nav.sidebar::-webkit-scrollbar-thumb:hover, +.md-sidebar::-webkit-scrollbar-thumb:hover, +.nav-sidebar::-webkit-scrollbar-thumb:hover, +aside.sidebar::-webkit-scrollbar-thumb:hover { + background: var(--foreground, #9ca3af); +} + +/* ======================================== + Navigation Links + ======================================== */ + +/* Base nav link styles */ +nav.sidebar a, +.md-sidebar a, +.nav-sidebar a, +aside.sidebar a, +.md-nav__link { + display: block; + padding: 0.5rem 0.75rem; + color: var(--muted-foreground, #6b7280); + text-decoration: none; + border-radius: 0.375rem; + transition: all 0.15s ease; + font-size: 0.875rem; + line-height: 1.5; +} + +/* Hover state */ +nav.sidebar a:hover, +.md-sidebar a:hover, +.nav-sidebar a:hover, +aside.sidebar a:hover, +.md-nav__link:hover { + color: var(--foreground, #1f2937); + background: var(--muted, rgba(0, 0, 0, 0.04)); +} + +/* ======================================== + Current Page Highlight + ======================================== */ + +/* Active/current page indicator */ +nav.sidebar a.active, +nav.sidebar a[aria-current="page"], +.md-sidebar a.active, +.md-sidebar a[aria-current="page"], +.nav-sidebar a.active, +.nav-sidebar a[aria-current="page"], +aside.sidebar a.active, +aside.sidebar a[aria-current="page"], +.md-nav__link--active, +.md-nav__item--active > .md-nav__link { + color: var(--primary, #3b82f6); + background: rgba(59, 130, 246, 0.1); + font-weight: 500; + position: relative; +} + +/* Active indicator bar */ +nav.sidebar a.active::before, +nav.sidebar a[aria-current="page"]::before, +.md-sidebar a.active::before, +.md-sidebar a[aria-current="page"]::before, +.nav-sidebar a.active::before, +aside.sidebar a.active::before, +.md-nav__link--active::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 3px; + height: 1.25rem; + background: var(--primary, #3b82f6); + border-radius: 0 2px 2px 0; +} + +/* ======================================== + Table of Contents (TOC) + ======================================== */ + +/* TOC container */ +.toc, +.md-sidebar--secondary, +.table-of-contents, +nav.toc { + position: sticky; + top: 1rem; + max-height: calc(100vh - 2rem); + overflow-y: auto; + padding-right: 0.5rem; +} + +/* TOC title */ +.toc-title, +.md-sidebar--secondary .md-nav__title, +.table-of-contents-title { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--muted-foreground, #9ca3af); + margin-bottom: 0.75rem; + padding: 0 0.5rem; +} + +/* TOC links */ +.toc a, +.md-sidebar--secondary a, +.table-of-contents a, +nav.toc a { + display: block; + padding: 0.375rem 0.5rem; + font-size: 0.8125rem; + color: var(--muted-foreground, #6b7280); + text-decoration: none; + border-left: 2px solid transparent; + transition: all 0.15s ease; + line-height: 1.4; +} + +.toc a:hover, +.md-sidebar--secondary a:hover, +.table-of-contents a:hover, +nav.toc a:hover { + color: var(--foreground, #1f2937); + border-left-color: var(--muted-foreground, #d1d5db); +} + +/* Active TOC item (scroll spy) */ +.toc a.active, +.toc a[aria-current="true"], +.md-sidebar--secondary a.active, +.table-of-contents a.active, +nav.toc a.active { + color: var(--primary, #3b82f6); + border-left-color: var(--primary, #3b82f6); + font-weight: 500; +} + +/* Nested TOC levels */ +.toc ul ul a, +.md-sidebar--secondary .md-nav--secondary a, +.table-of-contents ul ul a { + padding-left: 1rem; + font-size: 0.75rem; +} + +.toc ul ul ul a, +.table-of-contents ul ul ul a { + padding-left: 1.5rem; +} + +/* ======================================== + Scroll Progress Indicator + ======================================== */ + +.scroll-progress { + position: fixed; + top: 0; + left: 0; + width: 0%; + height: 2px; + background: var(--primary, #3b82f6); + z-index: 9999; + transition: width 0.1s ease-out; +} + +/* ======================================== + Scroll to Top Button + ======================================== */ + +.scroll-to-top { + position: fixed; + bottom: 2rem; + right: 2rem; + width: 2.5rem; + height: 2.5rem; + display: flex; + align-items: center; + justify-content: center; + background: var(--background, #fff); + border: 1px solid var(--border, #e5e7eb); + border-radius: 50%; + color: var(--muted-foreground, #6b7280); + cursor: pointer; + opacity: 0; + visibility: hidden; + transition: all 0.2s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + z-index: 100; +} + +.scroll-to-top.visible { + opacity: 1; + visibility: visible; +} + +.scroll-to-top:hover { + color: var(--foreground, #1f2937); + border-color: var(--primary, #3b82f6); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +/* ======================================== + Header Offset for Anchor Links + ======================================== */ + +/* Offset for fixed header when jumping to anchors */ +:target::before { + content: ''; + display: block; + height: 80px; + margin-top: -80px; + visibility: hidden; + pointer-events: none; +} + +/* Alternative using scroll-margin */ +h1[id], h2[id], h3[id], h4[id], h5[id], h6[id], +[id]:target { + scroll-margin-top: 80px; +} + +/* ======================================== + Dark Mode + ======================================== */ + +/* Dark mode scrollbar */ +.dark nav.sidebar::-webkit-scrollbar-thumb, +.dark .md-sidebar::-webkit-scrollbar-thumb, +.dark .nav-sidebar::-webkit-scrollbar-thumb, +.dark aside.sidebar::-webkit-scrollbar-thumb, +.dark nav.sidebar::-webkit-scrollbar-thumb, +.dark .md-sidebar::-webkit-scrollbar-thumb { + background: var(--muted-foreground, #4b5563); +} + +/* Dark mode nav links */ +.dark nav.sidebar a, +.dark .md-sidebar a, +.dark .nav-sidebar a, +.dark aside.sidebar a, +.dark nav.sidebar a, +.dark .md-sidebar a { + color: var(--muted-foreground, #9ca3af); +} + +.dark nav.sidebar a:hover, +.dark .md-sidebar a:hover, +.dark .nav-sidebar a:hover, +.dark aside.sidebar a:hover, +.dark nav.sidebar a:hover, +.dark .md-sidebar a:hover { + color: var(--foreground, #f3f4f6); + background: rgba(255, 255, 255, 0.05); +} + +/* Dark mode active state */ +.dark nav.sidebar a.active, +.dark nav.sidebar a[aria-current="page"], +.dark .md-sidebar a.active, +.dark .md-nav__link--active, +.dark nav.sidebar a.active, +.dark .md-sidebar a.active { + color: var(--primary, #60a5fa); + background: rgba(96, 165, 250, 0.1); +} + +/* Dark mode TOC */ +.dark .toc a, +.dark .md-sidebar--secondary a, +.dark .table-of-contents a, +.dark .toc a, +.dark .md-sidebar--secondary a { + color: var(--muted-foreground, #9ca3af); +} + +.dark .toc a:hover, +.dark .md-sidebar--secondary a:hover, +.dark .toc a:hover, +.dark .md-sidebar--secondary a:hover { + color: var(--foreground, #f3f4f6); + border-left-color: var(--muted-foreground, #6b7280); +} + +.dark .toc a.active, +.dark .md-sidebar--secondary a.active, +.dark .toc a.active, +.dark .md-sidebar--secondary a.active { + color: var(--primary, #60a5fa); + border-left-color: var(--primary, #60a5fa); +} + +/* Dark mode scroll to top */ +.dark .scroll-to-top, +.dark .scroll-to-top { + background: var(--background, #1f2937); + border-color: var(--border, #374151); + color: var(--muted-foreground, #9ca3af); +} + +.dark .scroll-to-top:hover, +.dark .scroll-to-top:hover { + color: var(--foreground, #f3f4f6); + border-color: var(--primary, #60a5fa); +} + +/* ======================================== + Mobile Navigation + ======================================== */ + +@media (max-width: 768px) { + /* Mobile sidebar - only apply custom positioning if sidebar has .mobile-drawer class */ + nav.sidebar.mobile-drawer, + .md-sidebar.mobile-drawer, + .nav-sidebar.mobile-drawer, + aside.sidebar.mobile-drawer { + position: fixed; + top: 0; + left: 0; + width: 280px; + height: 100vh; + max-height: 100vh; + transform: translateX(-100%); + transition: transform 0.3s ease; + z-index: 1000; + background: var(--background, #fff); + border-right: 1px solid var(--border, #e5e7eb); + padding: 1rem; + } + + /* Open state for drawer navigation */ + nav.sidebar.mobile-drawer.open, + .md-sidebar.mobile-drawer.open, + .nav-sidebar.mobile-drawer.open, + aside.sidebar.mobile-drawer.open { + transform: translateX(0); + } + + /* Mobile TOC - hidden by default */ + .toc, + .md-sidebar--secondary, + .table-of-contents { + display: none; + } + + /* Scroll to top - smaller on mobile */ + .scroll-to-top { + bottom: 1rem; + right: 1rem; + width: 2.25rem; + height: 2.25rem; + } + + /* Reduce scroll margin for smaller header */ + h1[id], h2[id], h3[id], h4[id], h5[id], h6[id], + [id]:target { + scroll-margin-top: 60px; + } +} + +/* Dark mode mobile sidebar */ +@media (max-width: 768px) { + .dark nav.sidebar.mobile-drawer, + .dark .md-sidebar.mobile-drawer, + .dark .nav-sidebar.mobile-drawer, + .dark aside.sidebar.mobile-drawer, + .dark nav.sidebar.mobile-drawer, + .dark .md-sidebar.mobile-drawer { + background: var(--background, #111827); + border-right-color: var(--border, #374151); + } +} + +/* ======================================== + Overlay for Mobile Menu + ======================================== */ + +.nav-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; + z-index: 999; +} + +.nav-overlay.visible { + opacity: 1; + visibility: visible; +} diff --git a/docs/stylesheets/readability-enhancements.css b/docs/stylesheets/readability-enhancements.css new file mode 100644 index 00000000..19865c41 --- /dev/null +++ b/docs/stylesheets/readability-enhancements.css @@ -0,0 +1,253 @@ +/* Readability enhancements */ + +/* ======================================== + Collapsible Sections (Details/Summary) + ======================================== */ + +/* Details container base styles */ +article details, +.prose details, +.md-typeset details { + margin: 1.5rem 0; + padding: 0; + border: 1px solid var(--border, #e5e7eb); + border-radius: 0.5rem; + background: var(--card, #ffffff); + overflow: hidden; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05); +} + +/* Dark mode support */ +.dark article details, +.dark .prose details, +.dark .md-typeset details { + background: var(--card, #1f2937); + border-color: var(--border, #374151); +} + +/* Summary (clickable header) */ +article details summary, +.prose details summary, +.md-typeset details summary { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.875rem 1rem; + font-weight: 600; + font-size: 0.95rem; + cursor: pointer; + user-select: none; + list-style: none; + background: var(--muted, #f9fafb); + border-bottom: 1px solid transparent; + transition: all 0.2s ease; +} + +/* Remove default marker */ +article details summary::-webkit-details-marker, +.prose details summary::-webkit-details-marker, +.md-typeset details summary::-webkit-details-marker { + display: none; +} + +article details summary::marker, +.prose details summary::marker, +.md-typeset details summary::marker { + display: none; + content: ""; +} + +/* Chevron icon (using CSS pseudo-element) */ +article details summary::before, +.prose details summary::before, +.md-typeset details summary::before { + content: ""; + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.25rem; + height: 1.25rem; + flex-shrink: 0; + background-color: var(--foreground, #111827); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E"); + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E"); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-size: contain; + mask-size: contain; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Rotate chevron when open */ +article details[open] summary::before, +.prose details[open] summary::before, +.md-typeset details[open] summary::before { + transform: rotate(90deg); +} + +/* Summary hover state */ +article details summary:hover, +.prose details summary:hover, +.md-typeset details summary:hover { + background: var(--accent, #f3f4f6); +} + +/* Dark mode summary */ +.dark article details summary, +.dark .prose details summary, +.dark .md-typeset details summary { + background: var(--muted, #1f2937); +} + +.dark article details summary::before, +.dark .prose details summary::before, +.dark .md-typeset details summary::before { + background-color: var(--foreground, #f9fafb); +} + +.dark article details summary:hover, +.dark .prose details summary:hover, +.dark .md-typeset details summary:hover { + background: var(--accent, #374151); +} + +/* Open state: show border under summary */ +article details[open] summary, +.prose details[open] summary, +.md-typeset details[open] summary { + border-bottom-color: var(--border, #e5e7eb); +} + +.dark article details[open] summary, +.dark .prose details[open] summary, +.dark .md-typeset details[open] summary { + border-bottom-color: var(--border, #374151); +} + +/* Details content area */ +article details > *:not(summary), +.prose details > *:not(summary), +.md-typeset details > *:not(summary) { + padding: 0 1rem; +} + +article details > *:not(summary):first-of-type, +.prose details > *:not(summary):first-of-type, +.md-typeset details > *:not(summary):first-of-type { + padding-top: 1rem; +} + +article details > *:not(summary):last-child, +.prose details > *:not(summary):last-child, +.md-typeset details > *:not(summary):last-child { + padding-bottom: 1rem; +} + +/* ======================================== + Admonition-style Details (note, tip, warning, etc.) + For pymdownx.details integration + ======================================== */ + +/* Note style details */ +article details.note summary, +.prose details.note summary, +.md-typeset details.note summary { + background: rgba(59, 130, 246, 0.08); +} + +article details.note summary::before, +.prose details.note summary::before, +.md-typeset details.note summary::before { + background-color: #3b82f6; +} + +/* Tip style details */ +article details.tip summary, +.prose details.tip summary, +.md-typeset details.tip summary { + background: rgba(16, 185, 129, 0.08); +} + +article details.tip summary::before, +.prose details.tip summary::before, +.md-typeset details.tip summary::before { + background-color: #10b981; +} + +/* Warning style details */ +article details.warning summary, +.prose details.warning summary, +.md-typeset details.warning summary { + background: rgba(245, 158, 11, 0.08); +} + +article details.warning summary::before, +.prose details.warning summary::before, +.md-typeset details.warning summary::before { + background-color: #f59e0b; +} + +/* Danger style details */ +article details.danger summary, +.prose details.danger summary, +.md-typeset details.danger summary { + background: rgba(239, 68, 68, 0.08); +} + +article details.danger summary::before, +.prose details.danger summary::before, +.md-typeset details.danger summary::before { + background-color: #ef4444; +} + +/* Info style details */ +article details.info summary, +.prose details.info summary, +.md-typeset details.info summary { + background: rgba(6, 182, 212, 0.08); +} + +article details.info summary::before, +.prose details.info summary::before, +.md-typeset details.info summary::before { + background-color: #06b6d4; +} + +/* Example style details */ +article details.example summary, +.prose details.example summary, +.md-typeset details.example summary { + background: rgba(139, 92, 246, 0.08); +} + +article details.example summary::before, +.prose details.example summary::before, +.md-typeset details.example summary::before { + background-color: #8b5cf6; +} + +/* ======================================== + Focus styles for accessibility + ======================================== */ + +article details summary:focus, +.prose details summary:focus, +.md-typeset details summary:focus { + outline: 2px solid var(--ring, #3b82f6); + outline-offset: 2px; +} + +article details summary:focus:not(:focus-visible), +.prose details summary:focus:not(:focus-visible), +.md-typeset details summary:focus:not(:focus-visible) { + outline: none; +} + +article details summary:focus-visible, +.prose details summary:focus-visible, +.md-typeset details summary:focus-visible { + outline: 2px solid var(--ring, #3b82f6); + outline-offset: 2px; +} diff --git a/docs/stylesheets/responsive.css b/docs/stylesheets/responsive.css new file mode 100644 index 00000000..5b03d369 --- /dev/null +++ b/docs/stylesheets/responsive.css @@ -0,0 +1,1007 @@ +/* + * Responsive Enhancements for OpenJudge Documentation + * Phase 5: 响应式完善 + * + * Features: + * - 统一断点系统 + * - 移动端导航优化 + * - 触摸友好交互 + * - 多设备布局适配 + * - 响应式工具类 + * - 打印样式优化 + */ + +/* ======================================== + Breakpoint System (CSS Custom Properties) + ======================================== */ + +:root { + /* Breakpoint values (for reference in media queries) */ + /* --breakpoint-xs: 0px; Mobile portrait */ + /* --breakpoint-sm: 640px; Mobile landscape */ + /* --breakpoint-md: 768px; Tablet portrait */ + /* --breakpoint-lg: 1024px; Tablet landscape / Small desktop */ + /* --breakpoint-xl: 1280px; Desktop */ + /* --breakpoint-2xl: 1536px; Large desktop */ + + /* Container max-widths */ + --container-sm: 640px; + --container-md: 768px; + --container-lg: 1024px; + --container-xl: 1280px; + --container-2xl: 1536px; + + /* Responsive spacing */ + --spacing-mobile: 1rem; + --spacing-tablet: 1.5rem; + --spacing-desktop: 2rem; + + /* Touch target minimum size */ + --touch-target-min: 44px; +} + +/* ======================================== + Base Responsive Container + ======================================== */ + +.container, +article, +.md-content__inner, +.prose { + width: 100%; + margin-left: auto; + margin-right: auto; + padding-left: var(--spacing-mobile); + padding-right: var(--spacing-mobile); +} + +@media (min-width: 640px) { + .container, + article, + .md-content__inner, + .prose { + padding-left: var(--spacing-tablet); + padding-right: var(--spacing-tablet); + } +} + +@media (min-width: 1024px) { + .container, + article, + .md-content__inner, + .prose { + padding-left: var(--spacing-desktop); + padding-right: var(--spacing-desktop); + max-width: var(--container-lg); + } +} + +@media (min-width: 1280px) { + .container, + article, + .md-content__inner, + .prose { + max-width: var(--container-xl); + } +} + +/* ======================================== + Mobile First Base Styles (< 640px) + ======================================== */ + +/* Typography scaling */ +html { + font-size: 15px; +} + +@media (min-width: 640px) { + html { + font-size: 16px; + } +} + +/* Mobile layout adjustments */ +@media (max-width: 639px) { + /* Main content full width */ + .md-main__inner, + main.md-main { + padding: 0; + } + + /* Reduce margins on mobile */ + article > *, + .prose > *, + .md-typeset > * { + margin-left: 0; + margin-right: 0; + } + + /* Stack grids on mobile */ + .grid, + .md-grid { + display: block; + } + + .grid > *, + .md-grid > * { + width: 100%; + margin-bottom: 1rem; + } + + /* Hide TOC on mobile */ + .md-sidebar--secondary, + .toc, + .table-of-contents { + display: none; + } + + /* Full width code blocks */ + pre, + .highlight, + .codehilite { + margin-left: calc(-1 * var(--spacing-mobile)); + margin-right: calc(-1 * var(--spacing-mobile)); + border-radius: 0; + border-left: none; + border-right: none; + } + + pre code { + padding-left: var(--spacing-mobile); + padding-right: var(--spacing-mobile); + } + + /* Full width tables */ + .table-responsive, + table { + margin-left: calc(-1 * var(--spacing-mobile)); + margin-right: calc(-1 * var(--spacing-mobile)); + width: calc(100% + 2 * var(--spacing-mobile)); + } + + /* Reduce heading sizes on mobile */ + h1 { font-size: 1.75rem; } + h2 { font-size: 1.375rem; } + h3 { font-size: 1.125rem; } + h4 { font-size: 1rem; } +} + +/* ======================================== + Tablet Styles (640px - 1023px) + ======================================== */ + +@media (min-width: 640px) and (max-width: 1023px) { + /* Two column layout for larger tablets */ + .md-main__inner { + display: flex; + flex-wrap: wrap; + } + + /* Sidebar takes full width on tablet portrait */ + .md-sidebar--primary { + width: 100%; + max-width: none; + position: relative; + height: auto; + max-height: none; + } + + /* Content takes full width */ + .md-content { + width: 100%; + max-width: none; + } + + /* Hide secondary sidebar on tablet */ + .md-sidebar--secondary { + display: none; + } + + /* Grid adjustments */ + .grid-cols-3, + .md-grid-3 { + grid-template-columns: repeat(2, 1fr); + } + + .grid-cols-4, + .md-grid-4 { + grid-template-columns: repeat(2, 1fr); + } +} + +/* ======================================== + Desktop Styles (1024px+) + ======================================== */ + +@media (min-width: 1024px) { + /* Three column layout */ + .md-main__inner { + display: flex; + } + + /* Primary sidebar */ + .md-sidebar--primary { + width: 240px; + flex-shrink: 0; + } + + /* Main content */ + .md-content { + flex: 1; + min-width: 0; + } + + /* Secondary sidebar (TOC) */ + .md-sidebar--secondary { + width: 200px; + flex-shrink: 0; + display: block; + } +} + +@media (min-width: 1280px) { + .md-sidebar--primary { + width: 280px; + } + + .md-sidebar--secondary { + width: 240px; + } +} + +/* ======================================== + Touch Friendly Interactions + ======================================== */ + +/* Ensure minimum touch target size */ +@media (hover: none) and (pointer: coarse) { + /* Touch devices */ + + a, + button, + .btn, + .button, + input[type="button"], + input[type="submit"], + .md-nav__link, + .tabbed-labels > label, + details summary { + min-height: var(--touch-target-min); + min-width: var(--touch-target-min); + padding: 0.75rem 1rem; + } + + /* Increase tap targets in navigation */ + .md-nav__link, + nav.sidebar a, + .nav-sidebar a { + padding: 0.875rem 1rem; + } + + /* Larger checkboxes */ + input[type="checkbox"], + input[type="radio"] { + width: 1.25rem; + height: 1.25rem; + } + + /* Remove hover effects on touch - use active instead */ + .highlight:hover, + .codehilite:hover, + pre:hover { + transform: none; + box-shadow: var(--rm-shadow-sm); + } + + .highlight:active, + .codehilite:active, + pre:active { + transform: scale(0.99); + } + + /* Show copy button always on touch devices */ + .copy-button, + .md-clipboard, + button[data-clipboard-target] { + opacity: 1 !important; + } + + /* Disable hover lift effects */ + button:hover, + .button:hover, + .btn:hover { + transform: none; + } + + button:active, + .button:active, + .btn:active { + transform: scale(0.98); + } +} + +/* Hover-capable devices */ +@media (hover: hover) and (pointer: fine) { + /* Enable hover effects */ + .highlight:hover, + .admonition:hover, + .workflow ol > li:hover { + transform: translateY(-2px); + } +} + +/* ======================================== + Mobile Navigation Enhancements + ======================================== */ + +/* Mobile menu toggle button */ +.mobile-menu-toggle { + display: none; + position: fixed; + bottom: 1.5rem; + left: 1.5rem; + width: 3rem; + height: 3rem; + border-radius: 50%; + background: var(--primary, #3b82f6); + color: white; + border: none; + box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4); + cursor: pointer; + z-index: 1001; + transition: all 0.2s ease; +} + +.mobile-menu-toggle:active { + transform: scale(0.95); +} + +@media (max-width: 767px) { + .mobile-menu-toggle { + display: flex; + align-items: center; + justify-content: center; + } +} + +/* Mobile menu icon */ +.mobile-menu-toggle .icon-menu { + width: 1.25rem; + height: 1.25rem; +} + +.mobile-menu-toggle .icon-close { + display: none; + width: 1.25rem; + height: 1.25rem; +} + +.mobile-menu-toggle.active .icon-menu { + display: none; +} + +.mobile-menu-toggle.active .icon-close { + display: block; +} + +/* Mobile sidebar drawer */ +@media (max-width: 767px) { + .md-sidebar--primary, + nav.sidebar, + .nav-sidebar { + position: fixed; + top: 0; + left: 0; + width: 85%; + max-width: 320px; + height: 100vh; + max-height: 100vh; + background: var(--background, #fff); + border-right: 1px solid var(--border, #e5e7eb); + transform: translateX(-100%); + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); + z-index: 1000; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + padding: 1rem; + padding-top: 2rem; + } + + .md-sidebar--primary.open, + nav.sidebar.open, + .nav-sidebar.open { + transform: translateX(0); + } + + /* Dark mode mobile sidebar */ + .dark .md-sidebar--primary, + .dark nav.sidebar, + .dark .md-sidebar--primary { + background: var(--background, #111827); + border-right-color: var(--border, #374151); + } +} + +/* Mobile navigation overlay */ +.mobile-nav-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + z-index: 999; + opacity: 0; + transition: opacity 0.3s ease; +} + +@media (max-width: 767px) { + .mobile-nav-overlay { + display: block; + pointer-events: none; + } + + .mobile-nav-overlay.visible { + opacity: 1; + pointer-events: auto; + } +} + +/* ======================================== + Responsive Images + ======================================== */ + +article img, +.prose img, +.md-typeset img { + max-width: 100%; + height: auto; +} + +/* Full bleed images on mobile */ +@media (max-width: 639px) { + article img.full-bleed, + .prose img.full-bleed, + figure.full-bleed img { + margin-left: calc(-1 * var(--spacing-mobile)); + margin-right: calc(-1 * var(--spacing-mobile)); + max-width: calc(100% + 2 * var(--spacing-mobile)); + width: calc(100% + 2 * var(--spacing-mobile)); + border-radius: 0; + } +} + +/* Image grids */ +.image-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; +} + +@media (min-width: 640px) { + .image-grid { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (min-width: 1024px) { + .image-grid { + grid-template-columns: repeat(4, 1fr); + } +} + +/* ======================================== + Responsive Tables + ======================================== */ + +/* Table wrapper for horizontal scroll */ +.table-responsive { + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + margin: 1.5em 0; +} + +/* Scroll shadow indicators */ +.table-responsive { + position: relative; +} + +.table-responsive::before, +.table-responsive::after { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 30px; + pointer-events: none; + opacity: 0; + transition: opacity 0.2s ease; + z-index: 1; +} + +.table-responsive::before { + left: 0; + background: linear-gradient(to right, var(--background, #fff) 0%, transparent 100%); +} + +.table-responsive::after { + right: 0; + background: linear-gradient(to left, var(--background, #fff) 0%, transparent 100%); +} + +/* Show shadows when scrollable */ +.table-responsive.can-scroll-left::before { + opacity: 1; +} + +.table-responsive.can-scroll-right::after { + opacity: 1; +} + +/* Card-style tables on mobile */ +@media (max-width: 639px) { + table.responsive-cards, + .table-cards table { + display: block; + } + + table.responsive-cards thead, + .table-cards thead { + display: none; + } + + table.responsive-cards tbody, + table.responsive-cards tr, + .table-cards tbody, + .table-cards tr { + display: block; + } + + table.responsive-cards tr, + .table-cards tr { + margin-bottom: 1rem; + padding: 1rem; + border: 1px solid var(--border, #e5e7eb); + border-radius: var(--radius-lg, 0.5rem); + background: var(--card, #fff); + } + + table.responsive-cards td, + .table-cards td { + display: flex; + justify-content: space-between; + padding: 0.5rem 0; + border: none; + border-bottom: 1px solid var(--border, #e5e7eb); + } + + table.responsive-cards td:last-child, + .table-cards td:last-child { + border-bottom: none; + } + + table.responsive-cards td::before, + .table-cards td::before { + content: attr(data-label); + font-weight: 600; + color: var(--muted-foreground, #6b7280); + margin-right: 1rem; + } +} + +/* ======================================== + Responsive Code Blocks + ======================================== */ + +@media (max-width: 639px) { + /* Smaller font on mobile */ + pre code, + .highlight code, + code { + font-size: 0.75rem; + line-height: 1.6; + } + + /* Reduce padding */ + pre code, + .highlight pre code { + padding: 0.75rem 1rem; + } + + /* Hide line numbers on very small screens */ + .highlight .linenos, + .highlight .linenodiv { + display: none; + } + + /* Simpler copy button */ + .copy-button, + .md-clipboard { + padding: 0.25rem 0.5rem; + font-size: 0.6875rem; + } +} + +/* ======================================== + Responsive Typography + ======================================== */ + +/* Fluid typography scale */ +@media (max-width: 639px) { + article, + .prose, + .md-typeset { + font-size: 0.9375rem; + line-height: 1.65; + } + + article h1, + .prose h1, + .md-typeset h1 { + font-size: 1.625rem; + line-height: 1.2; + } + + article h2, + .prose h2, + .md-typeset h2 { + font-size: 1.25rem; + margin-top: 2em; + } + + article h3, + .prose h3, + .md-typeset h3 { + font-size: 1.0625rem; + } + + /* Tighter spacing */ + article p, + .prose p { + margin-bottom: 1em; + } + + article ul, + article ol, + .prose ul, + .prose ol { + padding-left: 1.25rem; + } +} + +/* ======================================== + Responsive Admonitions & Cards + ======================================== */ + +@media (max-width: 639px) { + article .admonition, + .prose .admonition, + .md-typeset .admonition, + article details, + .prose details { + margin-left: calc(-1 * var(--spacing-mobile)); + margin-right: calc(-1 * var(--spacing-mobile)); + border-radius: 0; + border-left: none; + border-right: none; + border-top: 3px solid; + padding: 0.875rem 1rem; + } + + article .admonition-title, + .prose .admonition-title, + article details summary { + margin: -0.875rem -1rem 0.75rem; + padding: 0.625rem 1rem; + font-size: 0.875rem; + } + + /* Workflow adjustments */ + .workflow ol > li, + ol.workflow-steps > li { + padding-left: 2.5rem; + } + + .workflow ol > li::before, + ol.workflow-steps > li::before { + width: 1.5rem; + height: 1.5rem; + font-size: 0.75rem; + } + + .workflow ol > li::after, + ol.workflow-steps > li::after { + left: calc(0.75rem - 0.5px); + top: 1.5rem; + height: calc(100% - 1.5rem); + } +} + +/* ======================================== + Responsive Tabs + ======================================== */ + +@media (max-width: 639px) { + /* Scrollable tabs on mobile */ + .tabbed-labels, + .tabbed-set > .tabbed-labels { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; + -ms-overflow-style: none; + } + + .tabbed-labels::-webkit-scrollbar { + display: none; + } + + .tabbed-labels > label, + .tabbed-set label { + flex-shrink: 0; + padding: 0.5rem 0.875rem; + font-size: 0.8125rem; + } +} + +/* ======================================== + Responsive Utility Classes + ======================================== */ + +/* Hide on specific breakpoints */ +@media (max-width: 639px) { + .hide-mobile, + .hidden-mobile, + .sm\:hidden { + display: none !important; + } +} + +@media (min-width: 640px) and (max-width: 767px) { + .hide-tablet-portrait, + .md\:hidden { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 1023px) { + .hide-tablet, + .lg\:hidden { + display: none !important; + } +} + +@media (min-width: 1024px) { + .hide-desktop, + .hidden-desktop, + .xl\:hidden { + display: none !important; + } +} + +/* Show on specific breakpoints */ +@media (max-width: 639px) { + .show-mobile, + .visible-mobile { + display: block !important; + } +} + +@media (min-width: 640px) { + .show-mobile, + .visible-mobile { + display: none !important; + } +} + +@media (min-width: 1024px) { + .show-desktop, + .visible-desktop { + display: block !important; + } +} + +@media (max-width: 1023px) { + .show-desktop, + .visible-desktop { + display: none !important; + } +} + +/* Text alignment utilities */ +@media (max-width: 639px) { + .text-center-mobile { + text-align: center; + } + + .text-left-mobile { + text-align: left; + } +} + +/* Spacing utilities */ +@media (max-width: 639px) { + .p-mobile-0 { padding: 0 !important; } + .p-mobile-1 { padding: 0.25rem !important; } + .p-mobile-2 { padding: 0.5rem !important; } + .p-mobile-4 { padding: 1rem !important; } + + .m-mobile-0 { margin: 0 !important; } + .m-mobile-auto { margin: auto !important; } +} + +/* ======================================== + Print Styles + ======================================== */ + +@media print { + /* Hide non-essential elements */ + nav, + .md-sidebar, + .sidebar, + .nav-sidebar, + .toc, + .table-of-contents, + .scroll-to-top, + .mobile-menu-toggle, + .mobile-nav-overlay, + .copy-button, + .md-clipboard, + footer, + .md-footer { + display: none !important; + } + + /* Full width content */ + .md-content, + article, + .prose, + main { + width: 100% !important; + max-width: none !important; + margin: 0 !important; + padding: 0 !important; + } + + /* Print-friendly colors */ + body, + article, + .prose, + .md-typeset { + color: #000 !important; + background: #fff !important; + } + + /* Links show URL */ + a[href]::after { + content: " (" attr(href) ")"; + font-size: 0.8em; + color: #666; + } + + /* Don't show URL for internal links */ + a[href^="#"]::after, + a[href^="/"]::after { + content: ""; + } + + /* Avoid page breaks in bad places */ + h1, h2, h3, h4, h5, h6 { + page-break-after: avoid; + } + + pre, blockquote, table, figure, .admonition { + page-break-inside: avoid; + } + + /* Code blocks */ + pre, .highlight { + border: 1px solid #ccc; + background: #f5f5f5 !important; + overflow-x: visible; + white-space: pre-wrap; + word-wrap: break-word; + } + + /* Tables */ + table { + border-collapse: collapse; + } + + th, td { + border: 1px solid #ccc; + padding: 0.5rem; + } +} + +/* ======================================== + Landscape Orientation Fixes + ======================================== */ + +@media (max-height: 500px) and (orientation: landscape) { + /* Reduce header size on short landscape screens */ + .md-header, + header { + padding: 0.5rem 1rem; + } + + /* Reduce scroll margin for shorter header */ + h1[id], h2[id], h3[id], h4[id], h5[id], h6[id] { + scroll-margin-top: 50px; + } + + /* Compact navigation */ + .md-nav__link, + nav a { + padding: 0.375rem 0.75rem; + } +} + +/* ======================================== + High DPI / Retina Display + ======================================== */ + +@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + /* Thinner borders on retina */ + .highlight, + pre, + table, + .admonition, + details { + border-width: 0.5px; + } +} + +/* ======================================== + Dark Mode Responsive Adjustments + ======================================== */ + +@media (max-width: 639px) { + .dark .mobile-nav-overlay, + .dark .mobile-nav-overlay { + background: rgba(0, 0, 0, 0.7); + } + + /* Dark mode scroll shadows */ + .dark .table-responsive::before, + .dark .table-responsive::before { + background: linear-gradient(to right, var(--background, #111827) 0%, transparent 100%); + } + + .dark .table-responsive::after, + .dark .table-responsive::after { + background: linear-gradient(to left, var(--background, #111827) 0%, transparent 100%); + } +} + +/* ======================================== + Safe Area Insets (Notch devices) + ======================================== */ + +@supports (padding: max(0px)) { + /* Account for notch on modern phones */ + .md-header, + header { + padding-left: max(1rem, env(safe-area-inset-left)); + padding-right: max(1rem, env(safe-area-inset-right)); + } + + .md-sidebar--primary, + nav.sidebar { + padding-left: max(1rem, env(safe-area-inset-left)); + } + + .mobile-menu-toggle { + bottom: max(1.5rem, calc(env(safe-area-inset-bottom) + 0.5rem)); + left: max(1.5rem, calc(env(safe-area-inset-left) + 0.5rem)); + } + + .scroll-to-top { + bottom: max(2rem, calc(env(safe-area-inset-bottom) + 0.5rem)); + right: max(2rem, calc(env(safe-area-inset-right) + 0.5rem)); + } +} + diff --git a/docs/stylesheets/syntax-highlight.css b/docs/stylesheets/syntax-highlight.css new file mode 100644 index 00000000..3c651185 --- /dev/null +++ b/docs/stylesheets/syntax-highlight.css @@ -0,0 +1,306 @@ +/* + * Syntax Highlighting Theme for OpenJudge + * Based on modern code editor color schemes + */ + +/* ======================================== + Light Mode Syntax Highlighting + ======================================== */ + +/* Keywords: from, import, def, return, lambda, class, etc. */ +.highlight .k, /* Keyword */ +.highlight .kn, /* Keyword.Namespace (import, from) */ +.highlight .kd, /* Keyword.Declaration (def, class) */ +.highlight .kr, /* Keyword.Reserved (return) */ +.highlight .kc, /* Keyword.Constant (True, False, None) */ +.codehilite .k, +.codehilite .kn, +.codehilite .kd, +.codehilite .kr, +.codehilite .kc { + color: #cf222e; + font-weight: 500; +} + +/* Strings: "...", '...' */ +.highlight .s, /* String */ +.highlight .s1, /* String.Single */ +.highlight .s2, /* String.Double */ +.highlight .se, /* String.Escape */ +.codehilite .s, +.codehilite .s1, +.codehilite .s2, +.codehilite .se { + color: #0a3069; +} + +/* Comments */ +.highlight .c, /* Comment */ +.highlight .c1, /* Comment.Single */ +.highlight .cm, /* Comment.Multiline */ +.highlight .cp, /* Comment.Preproc */ +.codehilite .c, +.codehilite .c1, +.codehilite .cm, +.codehilite .cp { + color: #6e7781; + font-style: italic; +} + +/* Function and Class Names */ +.highlight .nf, /* Name.Function */ +.highlight .nc, /* Name.Class */ +.codehilite .nf, +.codehilite .nc { + color: #0550ae; +} + +/* Builtin Functions: dict, bool, etc. */ +.highlight .nb, /* Name.Builtin */ +.highlight .bp, /* Name.Builtin.Pseudo */ +.codehilite .nb, +.codehilite .bp { + color: #953800; +} + +/* Numbers */ +.highlight .m, /* Number */ +.highlight .mi, /* Number.Integer */ +.highlight .mf, /* Number.Float */ +.codehilite .m, +.codehilite .mi, +.codehilite .mf { + color: #0550ae; +} + +/* Operators: =, ==, ->, etc. */ +.highlight .o, /* Operator */ +.highlight .ow, /* Operator.Word (and, or, in) */ +.codehilite .o, +.codehilite .ow { + color: #cf222e; + font-weight: 500; +} + +/* Punctuation: (), [], {}, :, , */ +.highlight .p, /* Punctuation */ +.codehilite .p { + color: #24292f; +} + +/* Variables and Parameters */ +.highlight .n, /* Name */ +.highlight .nv, /* Name.Variable */ +.codehilite .n, +.codehilite .nv { + color: #24292f; +} + +/* Decorators: @decorator */ +.highlight .nd, /* Name.Decorator */ +.codehilite .nd { + color: #8250df; +} + +/* Module/Package Names */ +.highlight .nn, /* Name.Namespace */ +.codehilite .nn { + color: #24292f; +} + +/* ======================================== + Dark Mode Syntax Highlighting + ======================================== */ + +.dark .highlight .k, +.dark .highlight .kn, +.dark .highlight .kd, +.dark .highlight .kr, +.dark .highlight .kc, +.dark .codehilite .k, +.dark .codehilite .kn, +.dark .codehilite .kd, +.dark .codehilite .kr, +.dark .codehilite .kc, +.dark .highlight .k, +.dark .highlight .kn, +.dark .highlight .kd, +.dark .highlight .kr, +.dark .highlight .kc { + color: #ff7b72; + font-weight: 500; +} + +.dark .highlight .s, +.dark .highlight .s1, +.dark .highlight .s2, +.dark .highlight .se, +.dark .codehilite .s, +.dark .codehilite .s1, +.dark .codehilite .s2, +.dark .codehilite .se, +.dark .highlight .s, +.dark .highlight .s1, +.dark .highlight .s2, +.dark .highlight .se { + color: #a5d6ff; +} + +.dark .highlight .c, +.dark .highlight .c1, +.dark .highlight .cm, +.dark .highlight .cp, +.dark .codehilite .c, +.dark .codehilite .c1, +.dark .codehilite .cm, +.dark .codehilite .cp, +.dark .highlight .c, +.dark .highlight .c1, +.dark .highlight .cm, +.dark .highlight .cp { + color: #8b949e; + font-style: italic; +} + +.dark .highlight .nf, +.dark .highlight .nc, +.dark .codehilite .nf, +.dark .codehilite .nc, +.dark .highlight .nf, +.dark .highlight .nc { + color: #d2a8ff; +} + +.dark .highlight .nb, +.dark .highlight .bp, +.dark .codehilite .nb, +.dark .codehilite .bp, +.dark .highlight .nb, +.dark .highlight .bp { + color: #ffa657; +} + +.dark .highlight .m, +.dark .highlight .mi, +.dark .highlight .mf, +.dark .codehilite .m, +.dark .codehilite .mi, +.dark .codehilite .mf, +.dark .highlight .m, +.dark .highlight .mi, +.dark .highlight .mf { + color: #79c0ff; +} + +.dark .highlight .o, +.dark .highlight .ow, +.dark .codehilite .o, +.dark .codehilite .ow, +.dark .highlight .o, +.dark .highlight .ow { + color: #ff7b72; + font-weight: 500; +} + +.dark .highlight .p, +.dark .codehilite .p, +.dark .highlight .p, +.dark .codehilite .p { + color: #c9d1d9; +} + +.dark .highlight .n, +.dark .highlight .nv, +.dark .codehilite .n, +.dark .codehilite .nv, +.dark .highlight .n, +.dark .highlight .nv { + color: #c9d1d9; +} + +.dark .highlight .nd, +.dark .codehilite .nd, +.dark .highlight .nd, +.dark .codehilite .nd { + color: #d2a8ff; +} + +.dark .highlight .nn, +.dark .codehilite .nn, +.dark .highlight .nn, +.dark .codehilite .nn { + color: #c9d1d9; +} + +/* ======================================== + Special Highlighting + ======================================== */ + +/* Highlighted lines */ +.highlight .hll, +.codehilite .hll { + background-color: rgba(255, 213, 0, 0.15); + display: block; + margin: 0 -1.25rem; + padding: 0 1.25rem; +} + +.dark .highlight .hll, +.dark .codehilite .hll, +.dark .highlight .hll, +.dark .codehilite .hll { + background-color: rgba(255, 213, 0, 0.1); +} + +/* Error highlighting */ +.highlight .err, +.codehilite .err { + color: #cf222e; +} + +.dark .highlight .err, +.dark .codehilite .err, +.dark .highlight .err, +.dark .codehilite .err { + color: #ff7b72; +} + +/* ======================================== + Language-Specific Adjustments + ======================================== */ + +/* Python-specific */ +.highlight .language-python .nv, +.codehilite .language-python .nv { + color: #24292f; +} + +.dark .highlight .language-python .nv, +.dark .codehilite .language-python .nv, +.dark .highlight .language-python .nv, +.dark .codehilite .language-python .nv { + color: #c9d1d9; +} + +/* JavaScript/TypeScript-specific */ +.highlight .language-javascript .kd, +.highlight .language-typescript .kd, +.codehilite .language-javascript .kd, +.codehilite .language-typescript .kd { + color: #cf222e; + font-weight: 500; +} + +/* JSON-specific */ +.highlight .language-json .nd, +.codehilite .language-json .nd { + color: #0550ae; +} + +.dark .highlight .language-json .nd, +.dark .codehilite .language-json .nd, +.dark .highlight .language-json .nd, +.dark .codehilite .language-json .nd { + color: #79c0ff; +} + diff --git a/docs/stylesheets/tabbed-code.css b/docs/stylesheets/tabbed-code.css new file mode 100644 index 00000000..220b4d3d --- /dev/null +++ b/docs/stylesheets/tabbed-code.css @@ -0,0 +1,410 @@ +/* + * Tabbed Code Blocks Styling for pymdownx.tabbed alternate_style with shadcn/ui theme + * Override base.css styles for alternate_style: true + */ + +/* ======================================== + Override base.css tabbed-set styles for alternate_style + Using higher specificity selectors + ======================================== */ + +/* Reset base.css flex-wrap that breaks alternate layout */ +article .tabbed-set.tabbed-alternate { + flex-flow: column nowrap !important; + display: flex !important; + margin: 1.5em 0 !important; + /* Fallback for browsers without OKLCH support */ + border: 1px solid #e5e7eb !important; + border: 1px solid var(--border, #e5e7eb) !important; + border-radius: 0.5rem !important; + overflow: hidden !important; + background: #ffffff !important; + background: var(--background, #ffffff) !important; + box-shadow: none !important; +} + +/* Special styling for Workflow tabs - no border */ +article .tabbed-set.tabbed-alternate:has(.workflow) { + border: none !important; + border-radius: 0 !important; + background: transparent !important; + overflow: visible !important; +} + +/* Hide radio inputs */ +article .tabbed-set.tabbed-alternate > input[type="radio"] { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; + display: block !important; /* Override base.css display: none */ +} + +/* Tab labels container */ +article .tabbed-set.tabbed-alternate > .tabbed-labels { + display: flex !important; + flex-direction: row !important; + background: transparent !important; + /* Fallback for browsers without OKLCH support */ + border-bottom: 1px solid #e5e7eb !important; + border-bottom: 1px solid var(--border, #e5e7eb) !important; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + padding: 0.5rem 0.5rem 0 0.5rem !important; + padding-right: 3rem !important; + margin: 0 !important; + overflow-x: auto !important; + order: 1 !important; + position: relative !important; + scrollbar-width: none !important; + -ms-overflow-style: none !important; +} + +/* Hide scrollbar for webkit browsers */ +article .tabbed-set.tabbed-alternate > .tabbed-labels::-webkit-scrollbar { + display: none !important; +} + +/* Tab label buttons - override base.css label styles */ +article .tabbed-set.tabbed-alternate > .tabbed-labels > label { + padding: 0.5rem 1rem !important; + font-size: 0.875rem !important; + font-weight: 500 !important; + line-height: 1.25rem !important; + /* Fallback for browsers without OKLCH support */ + color: #6b7280 !important; + color: var(--muted-foreground, #6b7280) !important; + cursor: pointer !important; + border: none !important; + border-bottom: 2px solid transparent !important; + border-radius: 0 !important; + background: transparent !important; + transition: all 0.2s ease !important; + white-space: nowrap !important; + position: relative !important; + margin: 0 !important; + margin-bottom: -1px !important; + display: inline-flex !important; + align-items: center !important; + user-select: none !important; + order: unset !important; + flex-basis: auto !important; +} + +article .tabbed-set.tabbed-alternate > .tabbed-labels > label:first-of-type { + margin-left: 0 !important; +} + +article .tabbed-set.tabbed-alternate > .tabbed-labels > label:hover { + color: var(--foreground) !important; + background: transparent !important; +} + +/* Tab content container - override base.css */ +article .tabbed-set.tabbed-alternate > .tabbed-content { + display: block !important; + position: relative !important; + background: transparent !important; + order: 2 !important; + flex-basis: auto !important; + border-top: none !important; + padding: 0 !important; + margin: 0 !important; +} + +/* Ensure content flows naturally inside the border */ +article .tabbed-set.tabbed-alternate .tabbed-block { + padding: 0 !important; + margin: 0 !important; +} + +/* Individual tab blocks - hide by default */ +article .tabbed-set.tabbed-alternate > .tabbed-content > .tabbed-block { + display: none !important; +} + +/* ======================================== + Active Tab States - CSS :checked method + ======================================== */ + +/* Active label - Tab 1 */ +article .tabbed-set.tabbed-alternate > input:nth-child(1):checked ~ .tabbed-labels > label:nth-child(1) { + color: #14b8a6 !important; + background: transparent !important; + border-bottom-color: #14b8a6 !important; + box-shadow: none !important; +} + +/* Active label - Tab 2 */ +article .tabbed-set.tabbed-alternate > input:nth-child(2):checked ~ .tabbed-labels > label:nth-child(2) { + color: #14b8a6 !important; + background: transparent !important; + border-bottom-color: #14b8a6 !important; + box-shadow: none !important; +} + +/* Active label - Tab 3 */ +article .tabbed-set.tabbed-alternate > input:nth-child(3):checked ~ .tabbed-labels > label:nth-child(3) { + color: #14b8a6 !important; + background: transparent !important; + border-bottom-color: #14b8a6 !important; + box-shadow: none !important; +} + +/* Active label - Tab 4 */ +article .tabbed-set.tabbed-alternate > input:nth-child(4):checked ~ .tabbed-labels > label:nth-child(4) { + color: #14b8a6 !important; + background: transparent !important; + border-bottom-color: #14b8a6 !important; + box-shadow: none !important; +} + +/* Active label - Tab 5 */ +article .tabbed-set.tabbed-alternate > input:nth-child(5):checked ~ .tabbed-labels > label:nth-child(5) { + color: #14b8a6 !important; + background: transparent !important; + border-bottom-color: #14b8a6 !important; + box-shadow: none !important; +} + +/* Active label - Tab 6 */ +article .tabbed-set.tabbed-alternate > input:nth-child(6):checked ~ .tabbed-labels > label:nth-child(6) { + color: #14b8a6 !important; + background: transparent !important; + border-bottom-color: #14b8a6 !important; + box-shadow: none !important; +} + +/* Show active tab content */ +article .tabbed-set.tabbed-alternate > input:nth-child(1):checked ~ .tabbed-content > .tabbed-block:nth-child(1) { + display: block !important; +} + +article .tabbed-set.tabbed-alternate > input:nth-child(2):checked ~ .tabbed-content > .tabbed-block:nth-child(2) { + display: block !important; +} + +article .tabbed-set.tabbed-alternate > input:nth-child(3):checked ~ .tabbed-content > .tabbed-block:nth-child(3) { + display: block !important; +} + +article .tabbed-set.tabbed-alternate > input:nth-child(4):checked ~ .tabbed-content > .tabbed-block:nth-child(4) { + display: block !important; +} + +article .tabbed-set.tabbed-alternate > input:nth-child(5):checked ~ .tabbed-content > .tabbed-block:nth-child(5) { + display: block !important; +} + +article .tabbed-set.tabbed-alternate > input:nth-child(6):checked ~ .tabbed-content > .tabbed-block:nth-child(6) { + display: block !important; +} + +/* JS fallback method */ +article .tabbed-set.tabbed-alternate > .tabbed-content > .tabbed-block.tabbed-block--active { + display: block !important; +} + +article .tabbed-set.tabbed-alternate > .tabbed-labels > label.tabbed-label--active, +article .tabbed-set.tabbed-alternate > .tabbed-labels > label[data-active="true"] { + color: #14b8a6 !important; + background: transparent !important; + border-bottom-color: #14b8a6 !important; + box-shadow: none !important; +} + +/* ======================================== + Code Block Styling Inside Tabs + ======================================== */ + +article .tabbed-set.tabbed-alternate .tabbed-block .highlight, +article .tabbed-set.tabbed-alternate .tabbed-block .codehilite { + margin: 0 !important; + border-radius: 0 !important; + border: none !important; + position: relative !important; +} + +article .tabbed-set.tabbed-alternate .tabbed-block pre { + margin: 0 !important; + border-radius: 0 !important; + border: none !important; + background: transparent !important; + position: relative !important; +} + +article .tabbed-set.tabbed-alternate .tabbed-block pre code { + display: block !important; + padding: 1rem 1.25rem !important; + overflow-x: auto !important; + font-size: 0.8125rem !important; + line-height: 1.7 !important; +} + +/* Copy button for tabbed code blocks */ +article .tabbed-set.tabbed-alternate .tabbed-labels .copy-button { + position: absolute !important; + top: 0.625rem !important; + right: 0.75rem !important; + padding: 0.375rem 0.5rem !important; + font-size: 0.75rem !important; + font-weight: 500 !important; + /* Fallback for browsers without OKLCH support */ + color: #6b7280 !important; + color: var(--muted-foreground, #6b7280) !important; + background: #ffffff !important; + background: var(--background, #ffffff) !important; + border: 1px solid #e5e7eb !important; + border: 1px solid var(--border, #e5e7eb) !important; + border-radius: 0.375rem !important; + cursor: pointer !important; + opacity: 0 !important; + transition: all 0.15s ease !important; + z-index: 10 !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + min-width: 2rem !important; + height: 2rem !important; +} + +article .tabbed-set.tabbed-alternate .tabbed-labels .copy-button svg { + width: 1rem !important; + height: 1rem !important; + display: block !important; +} + +article .tabbed-set.tabbed-alternate:hover .copy-button { + opacity: 1 !important; +} + +article .tabbed-set.tabbed-alternate .copy-button:hover { + color: var(--foreground, #1f2937) !important; + background: var(--muted, #f3f4f6) !important; + border-color: var(--border, #d1d5db) !important; +} + +article .tabbed-set.tabbed-alternate .copy-button.copied { + color: var(--success, #10b981) !important; + border-color: var(--success, #10b981) !important; +} + +/* ======================================== + Dark Mode Support + ======================================== */ + +.dark article .tabbed-set.tabbed-alternate { + /* Fallback for browsers without OKLCH support */ + background: #0a0a0a !important; + background: var(--background, #0a0a0a) !important; + border: 1px solid #374151 !important; + border: 1px solid var(--border, #374151) !important; +} + +/* Special styling for Workflow tabs in dark mode - no border */ +.dark article .tabbed-set.tabbed-alternate:has(.workflow), +.dark article .tabbed-set.tabbed-alternate:has(.workflow) { + border: none !important; + background: transparent !important; +} + +.dark article .tabbed-set.tabbed-alternate > .tabbed-labels { + background: transparent !important; + /* Fallback for browsers without OKLCH support */ + border-bottom-color: #374151 !important; + border-bottom-color: var(--border, #374151) !important; +} + +.dark article .tabbed-set.tabbed-alternate > .tabbed-labels > label { + color: var(--muted-foreground) !important; +} + +.dark article .tabbed-set.tabbed-alternate > .tabbed-labels > label:hover { + color: var(--foreground) !important; + background: rgba(255, 255, 255, 0.05) !important; +} + +.dark article .tabbed-set.tabbed-alternate > input:checked ~ .tabbed-labels > label.tabbed-label--active, +.dark article .tabbed-set.tabbed-alternate > .tabbed-labels > label[data-active="true"], +.dark article .tabbed-set.tabbed-alternate > input:nth-child(1):checked ~ .tabbed-labels > label:nth-child(1), +.dark article .tabbed-set.tabbed-alternate > input:nth-child(2):checked ~ .tabbed-labels > label:nth-child(2), +.dark article .tabbed-set.tabbed-alternate > input:nth-child(3):checked ~ .tabbed-labels > label:nth-child(3), +.dark article .tabbed-set.tabbed-alternate > input:nth-child(4):checked ~ .tabbed-labels > label:nth-child(4), +.dark article .tabbed-set.tabbed-alternate > input:nth-child(5):checked ~ .tabbed-labels > label:nth-child(5), +.dark article .tabbed-set.tabbed-alternate > input:nth-child(6):checked ~ .tabbed-labels > label:nth-child(6) { + color: #2dd4bf !important; + background: transparent !important; + border-bottom-color: #2dd4bf !important; + box-shadow: none !important; +} + +.dark article .tabbed-set.tabbed-alternate .tabbed-block pre, +.dark article .tabbed-set.tabbed-alternate .tabbed-block pre { + background: transparent !important; + border: none !important; +} + +.dark article .tabbed-set.tabbed-alternate .tabbed-block .highlight, +.dark article .tabbed-set.tabbed-alternate .tabbed-block .codehilite, +.dark article .tabbed-set.tabbed-alternate .tabbed-block .highlight, +.dark article .tabbed-set.tabbed-alternate .tabbed-block .codehilite { + border: none !important; +} + +.dark article .tabbed-set.tabbed-alternate .tabbed-labels .copy-button { + /* Fallback for browsers without OKLCH support */ + background: #1f2937 !important; + background: var(--background, #1f2937) !important; + border-color: #374151 !important; + border-color: var(--border, #374151) !important; + color: #9ca3af !important; + color: var(--muted-foreground, #9ca3af) !important; +} + +.dark article .tabbed-set.tabbed-alternate .copy-button:hover { + /* Fallback for browsers without OKLCH support */ + background: #374151 !important; + background: var(--muted, #374151) !important; + color: #e5e7eb !important; + color: var(--foreground, #e5e7eb) !important; +} + +/* ======================================== + Responsive Design + ======================================== */ + +@media (max-width: 640px) { + article .tabbed-set.tabbed-alternate > .tabbed-labels { + padding: 0.375rem 2.75rem 0 0.375rem !important; + } + + article .tabbed-set.tabbed-alternate > .tabbed-labels > label { + padding: 0.375rem 0.625rem !important; + font-size: 0.8125rem !important; + margin: 0 0.125rem !important; + } + + article .tabbed-set.tabbed-alternate .tabbed-block pre code { + padding: 0.875rem 1rem !important; + font-size: 0.75rem !important; + } + + article .tabbed-set.tabbed-alternate .tabbed-labels .copy-button { + opacity: 1 !important; + min-width: 1.75rem !important; + height: 1.75rem !important; + padding: 0.25rem !important; + top: 0.5rem !important; + right: 0.5rem !important; + } + + article .tabbed-set.tabbed-alternate .tabbed-labels .copy-button svg { + width: 0.875rem !important; + height: 0.875rem !important; + } +} diff --git a/docs/stylesheets/table-enhancements.css b/docs/stylesheets/table-enhancements.css new file mode 100644 index 00000000..78be88b2 --- /dev/null +++ b/docs/stylesheets/table-enhancements.css @@ -0,0 +1,321 @@ +/* + * Table Enhancements for OpenJudge Documentation + * Phase 1: 表格样式增强 + * + * Features: + * - 表头样式优化 + * - 单元格垂直居中 + * - 斑马条纹 + * - 悬停高亮 + * - 响应式滚动 + * - 暗色模式支持 + */ + +/* ======================================== + Base Table Styles + ======================================== */ + +article table, +.prose table, +.md-typeset table:not([class]) { + width: 100%; + border-collapse: separate; + border-spacing: 0; + margin: 1.5em 0; + font-size: 0.9375rem; + line-height: 1.6; + overflow: hidden; + border: 1px solid var(--border, #e5e7eb); + border-radius: var(--radius-lg, 0.5rem); +} + +/* ======================================== + Table Header + ======================================== */ + +article table thead, +.prose table thead, +.md-typeset table:not([class]) thead { + background: var(--muted, #f9fafb); +} + +article table th, +.prose table th, +.md-typeset table:not([class]) th { + padding: 0.75rem 1rem; + font-weight: 600; + font-size: 0.875rem; + text-align: left; + color: var(--foreground, #111827); + border-bottom: 1px solid var(--border, #e5e7eb); + white-space: nowrap; +} + +/* First header cell - round top-left corner */ +article table th:first-child, +.prose table th:first-child, +.md-typeset table:not([class]) th:first-child { + border-top-left-radius: calc(var(--radius-lg, 0.5rem) - 1px); +} + +/* Last header cell - round top-right corner */ +article table th:last-child, +.prose table th:last-child, +.md-typeset table:not([class]) th:last-child { + border-top-right-radius: calc(var(--radius-lg, 0.5rem) - 1px); +} + +/* ======================================== + Table Body & Cells + ======================================== */ + +article table td, +.prose table td, +.md-typeset table:not([class]) td { + padding: 0.75rem 1rem; + vertical-align: middle; + color: var(--foreground, #374151); + border-bottom: 1px solid var(--border, #e5e7eb); + line-height: 1.5; +} + +/* Remove border from last row */ +article table tbody tr:last-child td, +.prose table tbody tr:last-child td, +.md-typeset table:not([class]) tbody tr:last-child td { + border-bottom: none; +} + +/* ======================================== + Zebra Stripes (Alternating Row Colors) + ======================================== */ + +article table tbody tr:nth-child(even), +.prose table tbody tr:nth-child(even), +.md-typeset table:not([class]) tbody tr:nth-child(even) { + background: rgba(0, 0, 0, 0.02); +} + +/* ======================================== + Row Hover Effect + ======================================== */ + +article table tbody tr, +.prose table tbody tr, +.md-typeset table:not([class]) tbody tr { + transition: background-color 0.15s ease; +} + +article table tbody tr:hover, +.prose table tbody tr:hover, +.md-typeset table:not([class]) tbody tr:hover { + background: rgba(0, 0, 0, 0.04); +} + +/* ======================================== + Code in Table Cells + ======================================== */ + +article table code, +.prose table code, +.md-typeset table:not([class]) code { + font-size: 0.8125rem; + padding: 0.125rem 0.375rem; + background: var(--muted, #f3f4f6); + border-radius: 0.25rem; + font-family: 'JetBrains Mono', ui-monospace, monospace; +} + +/* ======================================== + Links in Table Cells + ======================================== */ + +article table a, +.prose table a, +.md-typeset table:not([class]) a { + color: var(--primary, #3b82f6); + text-decoration: none; + font-weight: 500; +} + +article table a:hover, +.prose table a:hover, +.md-typeset table:not([class]) a:hover { + text-decoration: underline; + text-underline-offset: 2px; +} + +/* ======================================== + Dark Mode + ======================================== */ + +.dark article table, +.dark .prose table, +.dark .md-typeset table:not([class]), +.dark article table, +.dark .prose table, +.dark .md-typeset table:not([class]) { + border-color: var(--border, #374151); +} + +.dark article table thead, +.dark .prose table thead, +.dark .md-typeset table:not([class]) thead, +.dark article table thead, +.dark .prose table thead, +.dark .md-typeset table:not([class]) thead { + background: var(--muted, #1f2937); +} + +.dark article table th, +.dark .prose table th, +.dark .md-typeset table:not([class]) th, +.dark article table th, +.dark .prose table th, +.dark .md-typeset table:not([class]) th { + color: var(--foreground, #f9fafb); + border-bottom-color: var(--border, #374151); +} + +.dark article table td, +.dark .prose table td, +.dark .md-typeset table:not([class]) td, +.dark article table td, +.dark .prose table td, +.dark .md-typeset table:not([class]) td { + color: var(--foreground, #e5e7eb); + border-bottom-color: var(--border, #374151); +} + +/* Dark mode zebra stripes */ +.dark article table tbody tr:nth-child(even), +.dark .prose table tbody tr:nth-child(even), +.dark .md-typeset table:not([class]) tbody tr:nth-child(even), +.dark article table tbody tr:nth-child(even), +.dark .prose table tbody tr:nth-child(even), +.dark .md-typeset table:not([class]) tbody tr:nth-child(even) { + background: rgba(255, 255, 255, 0.02); +} + +/* Dark mode hover */ +.dark article table tbody tr:hover, +.dark .prose table tbody tr:hover, +.dark .md-typeset table:not([class]) tbody tr:hover, +.dark article table tbody tr:hover, +.dark .prose table tbody tr:hover, +.dark .md-typeset table:not([class]) tbody tr:hover { + background: rgba(255, 255, 255, 0.05); +} + +/* Dark mode code in tables */ +.dark article table code, +.dark .prose table code, +.dark .md-typeset table:not([class]) code, +.dark article table code, +.dark .prose table code, +.dark .md-typeset table:not([class]) code { + background: var(--muted, #374151); +} + +/* ======================================== + Responsive Table (Horizontal Scroll) + ======================================== */ + +.table-responsive, +.md-typeset .table-responsive { + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + margin: 1.5em 0; +} + +.table-responsive table, +.md-typeset .table-responsive table { + margin: 0; + min-width: 600px; +} + +/* Scroll shadow indicators */ +.table-responsive { + position: relative; +} + +.table-responsive::before, +.table-responsive::after { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 20px; + pointer-events: none; + opacity: 0; + transition: opacity 0.2s ease; + z-index: 1; +} + +.table-responsive::before { + left: 0; + background: linear-gradient(to right, var(--background, #fff), transparent); +} + +.table-responsive::after { + right: 0; + background: linear-gradient(to left, var(--background, #fff), transparent); +} + +.table-responsive.scroll-left::before, +.table-responsive.scroll-right::after { + opacity: 1; +} + +/* ======================================== + Compact Table Variant + ======================================== */ + +article table.compact th, +article table.compact td, +.prose table.compact th, +.prose table.compact td { + padding: 0.5rem 0.75rem; + font-size: 0.8125rem; +} + +/* ======================================== + Wide Table Variant + ======================================== */ + +article table.wide, +.prose table.wide { + min-width: 100%; +} + +/* ======================================== + Mobile Responsive + ======================================== */ + +@media (max-width: 640px) { + article table, + .prose table, + .md-typeset table:not([class]) { + font-size: 0.875rem; + display: block; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + + article table th, + article table td, + .prose table th, + .prose table td, + .md-typeset table:not([class]) th, + .md-typeset table:not([class]) td { + padding: 0.625rem 0.75rem; + white-space: nowrap; + } + + article table th, + .prose table th, + .md-typeset table:not([class]) th { + font-size: 0.8125rem; + } +} diff --git a/docs/stylesheets/workflow.css b/docs/stylesheets/workflow.css new file mode 100644 index 00000000..2bac2c94 --- /dev/null +++ b/docs/stylesheets/workflow.css @@ -0,0 +1,290 @@ +/* Workflow Component Styling */ +/* A step-by-step workflow display with numbered badges and vertical connector lines */ + +/* Workflow container */ +.workflow { + margin: 1.5em 0; + padding: 1rem 0; +} + +/* Workflow title */ +.workflow-title { + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 1rem; + color: #1f2937; +} + +.dark .workflow-title, +.dark .workflow-title { + color: #f3f4f6; +} + +/* Workflow steps list */ +.workflow ol, +ol.workflow-steps { + list-style: none; + padding: 0; + margin: 0; + counter-reset: workflow-counter; +} + +/* Individual step item */ +.workflow ol > li, +ol.workflow-steps > li { + position: relative; + padding: 0 0 1.75rem 3.5rem; + margin: 0; + counter-increment: workflow-counter; +} + +.workflow ol > li:last-child, +ol.workflow-steps > li:last-child { + padding-bottom: 0; +} + +/* Step number badge */ +.workflow ol > li::before, +ol.workflow-steps > li::before { + content: counter(workflow-counter); + position: absolute; + left: 0; + top: 0; + width: 2rem; + height: 2rem; + background: #f9fafb; + border: 1.5px solid #d1d5db; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.875rem; + font-weight: 500; + color: #6b7280; + z-index: 2; +} + +.dark .workflow ol > li::before, +.dark ol.workflow-steps > li::before, +.dark .workflow ol > li::before, +.dark ol.workflow-steps > li::before { + background: #374151; + border-color: #4b5563; + color: #d1d5db; +} + +/* Vertical connector line */ +.workflow ol > li::after, +ol.workflow-steps > li::after { + content: ''; + position: absolute; + left: calc(1rem - 0.5px); + top: 2rem; + width: 1px; + height: calc(100% - 2rem); + background: #d1d5db; + z-index: 1; +} + +/* Hide connector line on last item */ +.workflow ol > li:last-child::after, +ol.workflow-steps > li:last-child::after { + display: none; +} + +.dark .workflow ol > li::after, +.dark ol.workflow-steps > li::after, +.dark .workflow ol > li::after, +.dark ol.workflow-steps > li::after { + background: #4b5563; +} + +/* Step title */ +.workflow ol > li strong:first-child, +ol.workflow-steps > li strong:first-child, +.workflow-step-title { + display: block; + font-size: 1rem; + font-weight: 600; + color: #111827; + margin-bottom: 0.5rem; + line-height: 2rem; +} + +.dark .workflow ol > li strong:first-child, +.dark ol.workflow-steps > li strong:first-child, +.dark .workflow-step-title, +.dark .workflow ol > li strong:first-child, +.dark ol.workflow-steps > li strong:first-child, +.dark .workflow-step-title { + color: #f9fafb; +} + +/* Step description */ +.workflow ol > li p, +ol.workflow-steps > li p, +.workflow-step-desc { + margin: 0 0 0.5rem 0; + font-size: 0.9375rem; + color: #4b5563; + line-height: 1.6; +} + +.dark .workflow ol > li p, +.dark ol.workflow-steps > li p, +.dark .workflow-step-desc, +.dark .workflow ol > li p, +.dark ol.workflow-steps > li p, +.dark .workflow-step-desc { + color: #9ca3af; +} + +/* Links in workflow */ +.workflow a, +ol.workflow-steps a { + color: #059669; + text-decoration: underline; + text-underline-offset: 2px; +} + +.workflow a:hover, +ol.workflow-steps a:hover { + color: #047857; +} + +.dark .workflow a, +.dark ol.workflow-steps a, +.dark .workflow a, +.dark ol.workflow-steps a { + color: #34d399; +} + +.dark .workflow a:hover, +.dark ol.workflow-steps a:hover, +.dark .workflow a:hover, +.dark ol.workflow-steps a:hover { + color: #6ee7b7; +} + +/* Nested list in workflow steps */ +.workflow ol > li ul, +ol.workflow-steps > li ul { + margin: 0.5rem 0 0 0; + padding-left: 1.25rem; + list-style: disc; +} + +.workflow ol > li ul li, +ol.workflow-steps > li ul li { + padding: 0.25rem 0; + font-size: 0.9375rem; + color: #4b5563; +} + +/* Reset nested list items - don't apply workflow counter styles */ +.workflow ol > li ul li::before, +ol.workflow-steps > li ul li::before, +.workflow ol > li ul li::after, +ol.workflow-steps > li ul li::after { + display: none; + content: none; +} + +.dark .workflow ol > li ul li, +.dark ol.workflow-steps > li ul li, +.dark .workflow ol > li ul li, +.dark ol.workflow-steps > li ul li { + color: #9ca3af; +} + +/* Workflow inside tabs - seamless integration */ +.tabbed-block .workflow { + padding: 1.5rem 1rem; +} + +.tabbed-block .workflow ol, +.tabbed-block ol.workflow-steps { + margin: 0; +} + +.tabbed-block .workflow ol > li, +.tabbed-block ol.workflow-steps > li { + padding: 0 0 1.75rem 3.5rem; +} + +/* Single workflow (no tabs needed) */ +.workflow-single { + margin: 1.5em 0; + padding: 0; + border: 1px solid #e5e7eb; + border-radius: 0.5rem; + overflow: hidden; +} + +.workflow-single .workflow-header { + font-size: 0.875rem; + font-weight: 500; + color: #111827; + padding: 0.75rem 1rem; + border-bottom: 1px solid #e5e7eb; + background: #f9fafb; +} + +.dark .workflow-single, +.dark .workflow-single { + border-color: #374151; +} + +.dark .workflow-single .workflow-header, +.dark .workflow-single .workflow-header { + color: #f3f4f6; + border-bottom-color: #374151; + background: #1f2937; +} + +.workflow-single .workflow { + padding: 1.5rem 1rem 1rem; + margin: 0; +} + +/* Compact workflow variant */ +.workflow-compact ol > li, +ol.workflow-steps.compact > li { + padding: 0 0 1.25rem 3rem; +} + +.workflow-compact ol > li::before, +ol.workflow-steps.compact > li::before { + width: 1.75rem; + height: 1.75rem; + font-size: 0.8125rem; +} + +.workflow-compact ol > li::after, +ol.workflow-steps.compact > li::after { + left: calc(0.875rem - 0.5px); + top: 1.75rem; + height: calc(100% - 1.75rem); +} + +/* Responsive */ +@media (max-width: 640px) { + .workflow ol > li, + ol.workflow-steps > li { + padding-left: 3rem; + } + + .workflow ol > li::before, + ol.workflow-steps > li::before { + width: 1.75rem; + height: 1.75rem; + font-size: 0.8125rem; + } + + .workflow ol > li::after, + ol.workflow-steps > li::after { + left: calc(0.875rem - 0.5px); + top: 1.75rem; + height: calc(100% - 1.75rem); + } +} diff --git a/docs/zh/beast_logger.md b/docs/zh/beast_logger.md index eb141e39..5788290e 100644 --- a/docs/zh/beast_logger.md +++ b/docs/zh/beast_logger.md @@ -2,35 +2,104 @@ Beast-logger 是一个面向 LLM 系统构建的日志工具包,能够提供可靠的、细粒度到 **token-level** 的高分辨率 LLM 活动日志,这种粒度与完整性在其他项目中几乎前所未有。 -下面介绍如何在 agentscope-tuner 中使用 beast-logger。 +!!! success "核心优势" + Beast-logger 可以记录每一个 token 的详细信息,包括 Token ID、Loss Mask 和 Logprobs,非常适合工作流开发和智能体诊断。 + +--- ## 在 agentscope-tuner 中使用 -1. 使用 agentscope-tuner 的 launcher 启动训练或调试。 +
+
使用流程
+ +
+
    +
  1. 启动训练 + +使用 agentscope-tuner 的 launcher 启动训练或调试。
  2. +
  3. 等待数据生成 + +等待第一个 batch 完成,日志文件会自动生成。
  4. +
  5. 启动 Web 查看器 + +运行 `beast_logger_go` 命令打开可视化界面。
  6. +
  7. 浏览日志 + +选择日志目录并查看 token 级别的详细信息。
  8. +
+
+
+ +--- + +## 详细步骤 + +### Step 1:启动训练 + +使用 agentscope-tuner 的 launcher 启动训练或调试。 + +### Step 2:找到日志文件 + +等待第一个 batch 完成后,日志文件会保存在 `saved_experiments/${experiment_name}` 目录下。 -2. 等待第一个 batch 完成。 +!!! example "日志目录示例" + ``` + saved_experiments/benchmark_frozenlake_20251223_2305 + ``` -3. 找到日志文件。默认情况下,它们会放在 `saved_experiments/${experiment_name}` 目录下。例如: - `saved_experiments/benchmark_frozenlake_20251223_2305` +### Step 3:启动 Web 查看器 -4. 在 VSCode 终端(或任何支持端口转发的软件)中运行 `beast_logger_go` 命令启动 Web 日志查看器。然后点击 `http://127.0.0.1:8181` 打开页面(VSCode 会自动将该端口从服务器转发到你的本地电脑)。 +在 VSCode 终端(或任何支持端口转发的软件)中运行: + +```bash +beast_logger_go +``` + +然后点击 `http://127.0.0.1:8181` 打开页面。 + +!!! tip "端口转发" + VSCode 会自动将该端口从服务器转发到您的本地电脑。
-image +Beast Logger 启动界面
-5. 填入日志文件所在目录的**绝对路径(ABSOLUTE path)**,然后点击 `submit`。(Beast-logger 会递归扫描该路径,并在可能的情况下自动选择包含文件数量最少的最深层目录。) +### Step 4:选择日志目录 + +填入日志文件所在目录的**绝对路径(ABSOLUTE path)**,然后点击 `submit`。 + +!!! warning "重要提示" + Beast-logger 会递归扫描该路径,并在可能的情况下自动选择包含文件数量最少的最深层目录。
-image +选择日志目录
-6. 选择要展示的条目(entry)。 +### Step 5:浏览日志 -* 黄色 tokens:被排除在 loss 计算之外的 tokens -* 蓝色 tokens:参与 loss 计算的 tokens -* 将鼠标悬停在某个 token 上:会显示该 token 的 logprob 值 +选择要展示的条目(entry),查看 token 级别的详细信息:
-image +Token 级日志展示 +
+ +--- + +## Token 颜色说明 + +| 颜色 | 含义 | +|------|------| +| **黄色** | 被排除在 loss 计算之外的 tokens | +| **蓝色** | 参与 loss 计算的 tokens | + +!!! tip "查看 Logprob" + 将鼠标悬停在某个 token 上,会显示该 token 的 logprob 值。 + +--- + +## 下一步 + + diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md index c1e09a77..6809a4d2 100644 --- a/docs/zh/configuration.md +++ b/docs/zh/configuration.md @@ -2,190 +2,189 @@ 本页对 AgentScope Tuner 的配置文件进行详细说明。 +--- + ## 总览 -AgentScope Tuner 使用 YAML 格式的配置文件来设置数据、训练算法、奖励、日志以及其他运行时行为。默认配置文件位于 `astuner/default_config/astune_default.yaml`。 + +AgentScope Tuner 使用 YAML 格式的配置文件来设置数据、训练算法、奖励、日志以及其他运行时行为。 + +!!! info "默认配置文件" + 默认配置文件位于 `astuner/default_config/astune_default.yaml`。 一个典型的配置文件包含一个根节点 `astuner`,进一步被划分为若干部分: -- **基础信息** - - `project_name`, `experiment_name`, `experiment_dir`:用于标识实验及其保存位置。 - - `backbone`:选择训练后端,例如 `debug`、`trinity` 或 `verl`。 -- **数据与奖励** - - `task_reader`:如何加载训练 / 验证样本(EnvService、本地文件、HuggingFace 数据集等)。 - - `task_judge`:如何评估智能体并计算奖励(自定义评测器或基于 LLM 的自动打分器)。 - - `data`:Prompt / Response 的长度和 batch 大小等。 -- **模型** - - `model`:要训练的基础模型从哪里加载(本地路径或 HuggingFace 仓库)。 -- **Rollout 与交互配置** - - `rollout`:智能体如何与环境交互(协议、采样参数、最大步数等)。 - - `context_tracker`:如何管理对话 / 历史信息。 -- **训练配置** - - `trainer_common`:全局训练超参数(epoch、checkpoint、优化算法参数、损失、FSDP、logger 等)。 - - `debug`:当 `backbone: debug` 时使用的额外调试配置。 - -你可以从默认 YAML 开始,只修改与你的使用场景相关的部分。文末 *附录* 提供了一个 **完整配置示例** 供参考。 - -## 模型 -要训练一个智能体,首先需要指定待训练的模型,以及训练过程中使用的一些环境变量。 - -在配置文件中,你可以设置从某个位置加载模型参数的路径: +| 类别 | 配置项 | 说明 | +|------|--------|------| +| **基础信息** | `project_name`, `experiment_name`, `experiment_dir`, `backbone` | 标识实验及其保存位置,选择训练后端 | +| **数据与奖励** | `task_reader`, `task_judge`, `data` | 数据加载、评估和 batch 配置 | +| **模型** | `model` | 要训练的基础模型路径 | +| **Rollout** | `rollout`, `context_tracker` | 智能体交互配置和历史管理 | +| **训练** | `trainer_common`, `debug` | 训练超参数和调试配置 | -```yaml -astuner: - # ... +!!! tip "配置建议" + 您可以从默认 YAML 开始,只修改与您的使用场景相关的部分。文末*附录*提供了一个**完整配置示例**供参考。 - # 待训练的模型 - model: - path: path/to/model +--- - # ... +## 模型配置 +要训练一个智能体,首先需要指定待训练的模型: + +```yaml title="model 配置" +astuner: + model: + path: path/to/model ``` -你可以通过以下方式指定模型来源: +=== "本地文件" -+ 本地文件:指向包含 Transformers 格式模型的本地目录,例如 `/mnt/data/models/Qwen2.5-14B-Instruct` -+ HuggingFace 仓库:指向某个 HuggingFace 仓库,例如 `Qwen/Qwen2.5-14B-Instruct`。模型会自动下载并加载。 + 指向包含 Transformers 格式模型的本地目录: + + ```yaml + astuner: + model: + path: /mnt/data/models/Qwen2.5-14B-Instruct + ``` +=== "HuggingFace 仓库" + 指向 HuggingFace 仓库,模型会自动下载并加载: + + ```yaml + astuner: + model: + path: Qwen/Qwen2.5-14B-Instruct + ``` -另外,如果在训练中使用 LLM-as-a-Judge,则需要配置一些必要的环境变量: +!!! warning "LLM-as-a-Judge 环境变量" + 如果在训练中使用 LLM-as-a-Judge,需要配置必要的环境变量: + + ```bash + export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' + export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' + ``` -```bash -# the API key of DashScope, which provides the remove LLM calling -export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' -export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' -``` +--- + +## 数据配置 -## 数据 数据相关的配置主要包括两部分:`task_reader` 和 `task_judge`。 ### Task Reader -`task_reader` 用于定义如何读取训练集和验证集。支持多种 reader 类型。 -```yaml -astuner: - task_reader: - # options: - # env_service: read dataset from EnvService - # jsonl_dataset_file: read dataset from local JSONL file - # huggingface_dat_repo: read dataset from huggingface repo - # data_generation: generate dataset from documents and queries - # random_dummy: generate random dummy tasks for quick pipeline checks - type: env_service - - # 1. env_service reader config - env_service: - env_type: "appworld" - env_url: "http://127.0.0.1:8080" - env_action_preference: code - training_split: train - validation_split: dev - - # 2. jsonl_dataset_file reader config - jsonl_dataset_file: - training: - file_path: "xxxx.jsonl" - validation: - file_path: "xxxx.jsonl" - - # 3. huggingface_dat_repo reader config - huggingface_dat_repo: - dataset_path: "gsm8k" - training_split: "train" - validation_split: "validation" - - # 4. data_generation reader config - data_generation: - document_reader: - document_path: - - 'dataset/document/your-document1.pdf' - languages: - - eng - query_reader: - type: dataset_file - dataset_file: +`task_reader` 用于定义如何读取训练集和验证集。支持多种 reader 类型: + +=== "EnvService" + + 从 EnvService 中读取数据: + + ```yaml + astuner: + task_reader: + type: env_service + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code + training_split: train + validation_split: dev + ``` + +=== "JSONL 文件" + + 从本地 JSONL 文件读取: + + ```yaml + astuner: + task_reader: + type: jsonl_dataset_file + jsonl_dataset_file: training: - file_path: 'dataset/jsonl/your-queries.jsonl' - task_num: 10 - llm_model: qwen-long - llm_response_length: 8192 - num_workers: 32 - sampling_params: - temperature: 0 - filter: - type: deduplication - enabled: true - params: - similarity_threshold: 0.8 - db_path: ./.similarity_db - model: text-embedding-v4 - api_key: null - base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 -``` - -+ `env_service`:从 EnvService 中读取数据,适用于需要与 EnvService 交互的任务。 - - `env_type`:环境类型,需要与 EnvService 中初始化的环境类型保持一致(例如 `appworld`)。 - - `env_url`:EnvService 的服务地址(例如 `http://127.0.0.1:8080`)。 - - `env_action_preference`:偏好的 Action 形式,可选 `code`、`text` 或 `box`。 - - `training_split`:在环境中用于训练的数据切分名称。 - - `validation_split`:在环境中用于验证的数据切分名称。 -+ `jsonl_dataset_file`:从本地文件中读取数据,通常为 JSONL 格式。 - - `training.file_path`:训练数据集的本地路径。 - - `validation.file_path`:验证数据集的本地路径。 -+ `huggingface_dat_repo`:直接从 HuggingFace 仓库中读取数据集。 - - `dataset_path`:HuggingFace 上的数据集仓库名(例如 `gsm8k`)。 - - `training_split`:用于训练的数据集切分名称。 - - `validation_split`:用于验证的数据集切分名称。 - -`data_generation` 和 `random_dummy` 也可用于特殊工作流(完整 schema 可参考 `astune_default.yaml`)。 + file_path: "xxxx.jsonl" + validation: + file_path: "xxxx.jsonl" + ``` + +=== "HuggingFace" + + 从 HuggingFace 仓库读取: + + ```yaml + astuner: + task_reader: + type: huggingface_dat_repo + huggingface_dat_repo: + dataset_path: "gsm8k" + training_split: "train" + validation_split: "validation" + ``` + +=== "数据生成" + + 从文档自动生成任务: + + ```yaml + astuner: + task_reader: + type: data_generation + data_generation: + document_reader: + document_path: + - 'dataset/document/your-document.pdf' + languages: + - eng + query_reader: + type: dataset_file + dataset_file: + training: + file_path: 'dataset/jsonl/your-queries.jsonl' + task_num: 10 + llm_model: qwen-long + ``` ### Task Judge -`task_judge` 用于评估智能体的表现并计算奖励。 -```yaml +`task_judge` 用于评估智能体的表现并计算奖励: + +```yaml title="task_judge 配置" astuner: task_judge: - # options: 'customized_protocol', 'rubrics_auto_grader' - judge_type: customized_protocol - # the package path to judge (reward) function + judge_type: customized_protocol # 或 'rubrics_auto_grader' judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge - # LLM, which may be used by judge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - - # rubrics_auto_grader config - rubrics_auto_grader: # only active when `judge_type: rubrics_auto_grader` - model_name: qwen-max - grader_mode: pointwise - # ... ``` -+ `judge_type`:评测方式。 - - `customized_protocol`:使用自定义 Python 类进行打分。需要通过 `judge_protocol` 指定类路径(例如 `package.module->ClassName`)。 - - `rubrics_auto_grader`:使用基于 LLM 的自动打分。 -+ `alien_llm_model`:评测时可能用到的辅助 LLM 模型。 +| 配置项 | 说明 | +|--------|------| +| `judge_type` | 评测方式:`customized_protocol` 或 `rubrics_auto_grader` | +| `judge_protocol` | 自定义评测器的类路径(格式:`package.module->ClassName`) | +| `alien_llm_model` | 评测时可能用到的辅助 LLM 模型 | + +--- ## 训练配置 -### 后端 -AgentScope Tuner 支持三种训练后端:**trinity**、**verl**,以及一个额外的 **debug** 模式。 -+ **trinity**:默认选项。一个通用、灵活且可扩展的框架,用于大模型的强化微调。 -+ **verl**:Volcano engine reinforcement learning for LLMs。 -+ **debug**:允许用户设置断点并调试代码的后端。 +### 后端选择 -要配置所使用的后端,可以修改: +AgentScope Tuner 支持三种训练后端: + +| 后端 | 说明 | +|------|------| +| **trinity** | 默认选项。通用、灵活且可扩展的大模型强化微调框架 | +| **verl** | Volcano engine reinforcement learning for LLMs | +| **debug** | 允许用户设置断点并调试代码 | ```yaml astuner: - # debug or trinity or verl - backbone: trinity + backbone: trinity # debug 或 trinity 或 verl ``` -### Rollout -`rollout` 配置控制智能体在与环境进行交互采样过程中的行为。 +### Rollout 配置 -```yaml +`rollout` 配置控制智能体在与环境进行交互采样过程中的行为: + +```yaml title="rollout 配置" astuner: rollout: agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow @@ -197,15 +196,18 @@ astuner: num_repeat: 4 ``` -+ `agentscope_workflow`:指定具体的交互协议实现类。 -+ `temperature` / `top_p`:采样参数。 -+ `name`:推理引擎名称(例如 `vllm`)。 -+ `n_vllm_engine`:使用的 vLLM 引擎数量(仅在 backbone 为 trinity 时生效)。 +| 配置项 | 说明 | +|--------|------| +| `agentscope_workflow` | 具体的交互协议实现类 | +| `temperature` / `top_p` | 采样参数 | +| `name` | 推理引擎名称(例如 `vllm`) | +| `n_vllm_engine` | vLLM 引擎数量(仅 trinity 后端有效) | + +### 通用训练参数 -### 通用参数 `trainer_common` 包含训练流程控制的通用参数: -```yaml +```yaml title="trainer_common 配置" astuner: trainer_common: total_epochs: 50 @@ -222,22 +224,23 @@ astuner: optimizer_offload: True ``` -+ `total_epochs`:训练总 epoch 数。 -+ `save_freq`:保存模型 checkpoint 的频率(以 step 计)。 -+ `test_freq`:执行验证 / 测试的频率(以 step 计)。 -+ `val_before_train`:是否在训练开始前先执行一次验证。 -+ `val_pass_n`:验证阶段每个问题的采样数量(Pass@N)。 -+ `nnodes` / `n_gpus_per_node`:分布式训练配置,用于指定节点数以及每个节点的 GPU 数量。 -+ `mini_batch_num`:梯度累积的 mini-batch 数量。 -+ `ulysses_sequence_parallel_size`:Ulysses attention 的序列并行大小。 -+ `fsdp_config`:FSDP(Fully Sharded Data Parallel)配置。 - - `param_offload`:是否将模型参数 offload 到 CPU 以节省 GPU 显存。 - - `optimizer_offload`:是否将优化器状态 offload 到 CPU。 +??? note "参数详解" + | 配置项 | 说明 | + |--------|------| + | `total_epochs` | 训练总 epoch 数 | + | `save_freq` | 保存模型 checkpoint 的频率(以 step 计) | + | `test_freq` | 执行验证/测试的频率(以 step 计) | + | `val_before_train` | 是否在训练开始前先执行一次验证 | + | `val_pass_n` | 验证阶段每个问题的采样数量(Pass@N) | + | `nnodes` / `n_gpus_per_node` | 分布式训练配置 | + | `mini_batch_num` | 梯度累积的 mini-batch 数量 | + | `fsdp_config` | FSDP 配置,控制参数和优化器 offload | ### 优化算法 -优化算法及其超参数主要在 `algorithm`、`optim` 和根配置中进行设置: -```yaml +优化算法及其超参数主要在 `algorithm`、`optim` 中设置: + +```yaml title="优化算法配置" astuner: trainer_common: algorithm: @@ -250,19 +253,18 @@ astuner: kl_loss_type: low_var_kl ``` -+ `optim`: - - `lr`:学习率(Learning Rate)。 -+ `algorithm`: - - `adv_estimator`:Advantage 计算方法,例如 `grpo`(Group Relative Policy Optimization)。 - - `use_kl_in_reward`:是否在奖励中加入 KL 散度项。 -+ `use_kl_loss`:是否在损失计算中加入 KL 约束。 -+ `kl_loss_coef`:KL 损失系数。 -+ `kl_loss_type`:KL 损失的计算方式,例如 `low_var_kl`。 +| 配置项 | 说明 | +|--------|------| +| `adv_estimator` | Advantage 计算方法(例如 `grpo`) | +| `lr` | 学习率 | +| `use_kl_loss` | 是否在损失计算中加入 KL 约束 | +| `kl_loss_coef` | KL 损失系数 | ### 调试模式 -当 `backbone` 设置为 `debug` 时所使用的配置。 -```yaml +当 `backbone` 设置为 `debug` 时使用的配置: + +```yaml title="debug 配置" astuner: debug: debug_max_parallel: 16 @@ -272,18 +274,23 @@ astuner: debug_tensor_parallel_size: 4 ``` -该模式和配置可用于: +!!! tip "调试模式用途" + - **限制任务数与并发数**:在少量任务和较小并发下快速验证训练流程 + - **固定随机性**:通过 `debug_vllm_seed` 帮助复现问题 -- **限制任务数与并发数**:在少量任务和较小并发下快速验证训练流程。 -- **固定随机性**:通过 `debug_vllm_seed` 帮助复现问题。 +--- ## 日志与训练监控 + ### 配置 Logger -AgentScope Tuner 支持多种日志后端,可通过 `trainer_common.logger` 进行配置: -+ `console`:将日志输出到标准输出,方便快速查看训练进度。 -+ `wandb`:对接 wandb 平台,提供可视化训练曲线和指标监控。 -+ `swanlab`:使用 SwanLab 进行日志记录。 +AgentScope Tuner 支持多种日志后端: + +| 后端 | 说明 | +|------|------| +| `console` | 将日志输出到标准输出 | +| `wandb` | 对接 Weights & Biases 平台 | +| `swanlab` | 使用 SwanLab 进行日志记录 | ```yaml astuner: @@ -292,262 +299,122 @@ astuner: ``` ### 日志结构 + 所有实验输出都会保存在 `./launcher_record/{experiment_name}` 目录下: -+ **Logs:** 训练过程生成的日志与错误信息。 -+ **Metrics:** - - 具体的指标输出位置取决于所选的 logger 后端。 -+ **Checkpoint:** 训练得到的模型 checkpoint。 +| 类型 | 说明 | +|------|------| +| **Logs** | 训练过程生成的日志与错误信息 | +| **Metrics** | 具体输出位置取决于所选的 logger 后端 | +| **Checkpoint** | 训练得到的模型 checkpoint | +--- ## 附录:完整配置示例 -```yaml -# ------------------ main configuration ------------------ -astuner: - project_name: "astuner_default_project" - experiment_name: "read_yaml_name" - experiment_dir: "auto" # {exp-dir}/{experiment_name} - backbone: debug # `debug` or `trinity` or `verl` - - - model: - # which model should be trained - path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct - - data: - # max number of tokens for prompt - max_prompt_length: 3000 - # max number of tokens for response - max_response_length: 15000 - # how many tasks per training batch - train_batch_size: 32 - # [Hint]: The final number of samples per update will be: N_{sample} = (data.train_batch_size * rollout.num_repeat * rollout.multi_turn.expected_steps) - - - rollout: - - # the path to the workflow class - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - - # whether or not to disable all tool calls - agentscope_disable_toolcalls: False - - # maximum number of parallel environments / simulate workers - max_env_worker: 128 - - # step reward gamma (experimental, do not change) - gamma: 1.0 - - # monitor LLM's abormal behaviors during rollout - compute_madness_checklist: - - "nonsense" - # send signal to terminate context tracing when LLM is losing control - agent_madness_termination: True # terminate_after_gone_mad - # punish the LLM when it is detected as lost control - agent_madness_reward: -1.0 - - # max response length in one turn - max_response_length_in_one_turn: 4096 - - # max token length allowed for the model during rollout - max_model_len: 18000 - - multi_turn: - # how many samples should be collected for each task run - max_sample_per_task: 30 - # limit the maximum steps for each task - max_steps: 30 - # the expected steps for each task, used to calculate the training batch size for trinity - expected_steps: 1 - - # TP size for rollout engine - tensor_model_parallel_size: 1 - - # the number of vllm engines, number of gpus for infer is `n_vllm_engine*tensor_model_parallel_size`, this argument is NOT effective when NOT using trinity - n_vllm_engine: 2 - - # how many sequences are allowed to be processed in parallel by each vllm engine - max_num_seqs: 10 - - # the usage of infer engine, options: (vllm, sglang) - name: vllm - - # how many times a task should be repeated - num_repeat: 4 - - # rollout kwargs - temperature: 0.9 - top_p: 1.0 - - # validation kwargs - val_kwargs: - temperature: 0.0 - top_k: -1 - top_p: 1.0 - do_sample: False - num_repeat: 1 - - - task_reader: - # the type of task_reader - # options: - # env_service: read dataset from EnvService - # jsonl_dataset_file: read dataset from local JSONL file - # huggingface_dat_repo: read dataset from huggingface repo - # data_generation: generate dataset from documents and queries - # random_dummy: generate random dummy tasks for quick pipeline checks - type: env_service # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` - # when `type == jsonl_dataset_file` - jsonl_dataset_file: - training: - file_path: "/path/to/training/data.jsonl" - validation: - file_path: "/path/to/validation/data.jsonl" - # when `type == env_service` - env_service: - # the type of env, must be init in EnvService first - env_type: "appworld" - # the url of the service - env_url: "http://127.0.0.1:8080" - # code, text, box - env_action_preference: code - # the name of training split in this environment - training_split: train - # the name of validation split in this environment - validation_split: dev - # when `type == huggingface_dat_repo` - huggingface_dat_repo: - # the repo name - dataset_path: "gsm8k" - # the name of training split - training_split: "train" - # the name of validation split - validation_split: "validation" - - # when `type == data_generation` - data_generation: - document_reader: - document_path: - - 'dataset/document/your-document1.pdf' - - 'dataset/document/your-document2.pdf' - languages: - - eng - query_reader: - type: dataset_file - dataset_file: +??? example "完整配置文件" + ```yaml + astuner: + project_name: "astuner_default_project" + experiment_name: "read_yaml_name" + experiment_dir: "auto" + backbone: debug + + model: + path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct + + data: + max_prompt_length: 3000 + max_response_length: 15000 + train_batch_size: 32 + + rollout: + agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + agentscope_disable_toolcalls: False + max_env_worker: 128 + gamma: 1.0 + compute_madness_checklist: + - "nonsense" + agent_madness_termination: True + agent_madness_reward: -1.0 + max_response_length_in_one_turn: 4096 + max_model_len: 18000 + multi_turn: + max_sample_per_task: 30 + max_steps: 30 + expected_steps: 1 + tensor_model_parallel_size: 1 + n_vllm_engine: 2 + max_num_seqs: 10 + name: vllm + num_repeat: 4 + temperature: 0.9 + top_p: 1.0 + val_kwargs: + temperature: 0.0 + top_k: -1 + top_p: 1.0 + do_sample: False + num_repeat: 1 + + task_reader: + type: env_service + jsonl_dataset_file: training: - file_path: 'dataset/jsonl/your-queries.jsonl' - task_num: 10 - llm_model: qwen-long - llm_response_length: 8192 - num_workers: 32 - sampling_params: - temperature: 0 - filter: - type: deduplication - enabled: true - params: - similarity_threshold: 0.8 - db_path: ./.similarity_db - model: text-embedding-v4 - api_key: null # load from the env - base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 - - # task judge. it provide rewards for agent training - task_judge: - judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' - # the package path to judge (reward) function - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge - - # the helper LLM model used for LLM-AS-Judge - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - # when `judge_type == rubrics_auto_grader` - rubrics_auto_grader: - model_name: qwen-max - # reward mode - grader_mode: pointwise - # the language of prompts, tasks, llm outputs - language: en - query_specific_generate_number: 1 - enable_categorization: false - categories_number: 5 - grader_name: "auto_grader" - query_field: main_query - answer_field: final_answer - reference_field: answer - custom_evaluation_prompt: null # dict or PromptTemplate or None - input_data_type: dataset_file # `env_service` or `dataset_file` or `huggingface_dat_repo` - dataset_file: - training: - file_path: "tutorial/example_rm_auto_grader/rubrics_train.jsonl" - # Pointwise mode settings - min_score: 0 - max_score: 1 - - - # when backbone is `debug`, debug related configurations - debug: - debug_max_parallel: 16 - debug_first_n_tasks: 2 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - debug_tensor_parallel_size: 4 - - # trainer common configurations - trainer_common: - # validate before the first epoch - val_before_train: False - # the rollout size in validation phase - val_pass_n: 4 - # the frequency (step) of checkpoint saving - save_freq: 20 - # the frequency (step) of test phase - test_freq: 20 - # totol epochs to train - total_epochs: 50 - # the number of nodes in clusters - nnodes: 1 - # the number of gpus in each node - n_gpus_per_node: 8 - logger: swanlab - # optimization algorithms - algorithm: - adv_estimator: grpo - use_kl_in_reward: False - mini_batch_num: 1 - # FSDP config - fsdp_config: - # offload param to save gpu memory - param_offload: True - # offload optimizer to save gpu memory - optimizer_offload: True - # optimizer config - optim: - # learning rate - lr: 1e-6 - # use KL loss in training - use_kl_loss: True - # KL loss coefficient - kl_loss_coef: 0.002 - # type of KL loss - kl_loss_type: low_var_kl - ulysses_sequence_parallel_size: 1 - checkpoint_base_dir: ./saved_checkpoints - - - # context tracker protocol is valid ONLY when `use_agentscope_protocol=False` - context_tracker: - context_tracker_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - max_env_len: 4096 - - - - # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. - execute_test: False # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. - execute_testing_lambda: "" # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. - -``` + file_path: "/path/to/training/data.jsonl" + validation: + file_path: "/path/to/validation/data.jsonl" + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code + training_split: train + validation_split: dev + huggingface_dat_repo: + dataset_path: "gsm8k" + training_split: "train" + validation_split: "validation" + + task_judge: + judge_type: customized_protocol + judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + + debug: + debug_max_parallel: 16 + debug_first_n_tasks: 2 + debug_vllm_port: 18000 + debug_vllm_seed: 12345 + debug_tensor_parallel_size: 4 + + trainer_common: + val_before_train: False + val_pass_n: 4 + save_freq: 20 + test_freq: 20 + total_epochs: 50 + nnodes: 1 + n_gpus_per_node: 8 + logger: swanlab + algorithm: + adv_estimator: grpo + use_kl_in_reward: False + mini_batch_num: 1 + fsdp_config: + param_offload: True + optimizer_offload: True + optim: + lr: 1e-6 + use_kl_loss: True + kl_loss_coef: 0.002 + kl_loss_type: low_var_kl + ulysses_sequence_parallel_size: 1 + checkpoint_base_dir: ./saved_checkpoints + + context_tracker: + context_tracker_type: "linear" + alien_llm_model: qwen3-235b-a22b-instruct-2507 + alien_llm_response_length: 512 + max_env_len: 4096 + ``` diff --git a/docs/zh/data_generation.md b/docs/zh/data_generation.md index 4cfaebd4..b59ee2e2 100644 --- a/docs/zh/data_generation.md +++ b/docs/zh/data_generation.md @@ -1,161 +1,186 @@ # 数据生成 +`Data Generation Reader` 提供了一个智能化的数据生成方法,旨在简化高质量训练数据的创建过程。方法设计灵活、高效,可以基于 Few-shot 数据与文档(可选)来生成领域特定的任务(Query)。 + +--- + ## 概述 -`Data Generation Reader` 提供了一个智能化的数据生成方法,旨在简化高质量训练数据的创建过程。方法设计灵活、高效,可以基于Few-shot数据与文档(可选)来生成领域特定的任务(Query)。 + +!!! info "核心特点" + `Data Generation Reader` 采用两阶段任务生成流程,可以从少量样本和文档中自动生成大量训练任务。 + +--- ## 方法简介 -`Data Generation Reader` 采用两阶段任务生成流程: ### 第一阶段(可选):基于文档的数据生成 -此阶段为可选步骤。`Document-based Data Generation` 会基于提供的文档内容,生成知识类提问任务。用户可以提供一个或多个文档(支持 PDF、Word、TXT 等格式): -```plain -According to the Anti-Money Laundering and Counter-Terrorist Financing Ordinance and related Guideline, banks are required to identify and take reasonable measures to verify the identity of the beneficial owner of corporate customers so that the bank is ... -``` +此阶段为可选步骤。`Document-based Data Generation` 会基于提供的文档内容,生成知识类提问任务。 -生成器会读取文档内容,并借助大语言模型批量生成与文档知识相关的提问任务: +=== "输入:文档内容" -```json -[ - { - "main_query": "What are the key requirements of Customer Due Diligence in AML procedures?", - "related_doc": "Customer Due Diligence measures should include: (a) identifying the customer and verifying the customer's identity..." - }, - { - "main_query": "How should financial institutions handle Suspicious Transaction Reports?", - "related_doc": "When someone knows or suspects that any property represents the proceeds of an indictable offense..." - } - ... -] -``` + ```plain + According to the Anti-Money Laundering and Counter-Terrorist + Financing Ordinance and related Guideline, banks are required + to identify and take reasonable measures to verify the identity + of the beneficial owner of corporate customers so that the bank is ... + ``` -若提供文档进行生成数据,该部分生成的数据会补充到后续的训练过程中的验证任务集合。 +=== "输出:生成的任务" + + ```json + [ + { + "main_query": "What are the key requirements of Customer Due Diligence in AML procedures?", + "related_doc": "Customer Due Diligence measures should include: (a) identifying the customer..." + }, + { + "main_query": "How should financial institutions handle Suspicious Transaction Reports?", + "related_doc": "When someone knows or suspects that any property represents the proceeds..." + } + ] + ``` + +!!! tip "文档生成的数据用途" + 若提供文档进行生成数据,该部分生成的数据会补充到后续的训练过程中的验证任务集合。 ### 第二阶段:少样本数据生成 -此阶段会生成最终的训练任务。`Few-shot Data Generation` 将少量用户提供的任务与第一阶段生成的知识类任务的组合,并参考文档内容生成训练任务。首先,用户需要提供少量的任务示例: -```json -{"main_query": "Can banks ask corporate customers to provide information of its ownership?", "answer": "According to the Anti-Money Laundering and ..."} -{"main_query": "Can a bank close my account?", "answer": "Either a customer or a bank may close an account at any time subject to any specific terms and ..."} -... -``` +此阶段会生成最终的训练任务。`Few-shot Data Generation` 将少量用户提供的任务与第一阶段生成的知识类任务组合,并参考文档内容生成训练任务。 -这些示例将与第一阶段生成的任务合并,构成一个完整的示例任务集合。生成器会从此集合中进行采样,作为少样本(Few-shot)任务演示,并结合相关的文档内容,引导大模型批量生成训练任务: +=== "输入:少量任务示例" -```json -[ - { - "main_query": "Are financial institutions required to verify the source of funds for corporate clients during account opening?" - }, - { - "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" - } - ... -] -``` + ```json + {"main_query": "Can banks ask corporate customers to provide information of its ownership?", "answer": "According to the Anti-Money Laundering..."} + {"main_query": "Can a bank close my account?", "answer": "Either a customer or a bank may close an account at any time..."} + ``` -## 🚀 快速开始 -`Data Generation Reader` 可以从本地路径读取用户提供的少量任务以及PDF、Word、TXT等多种格式的文档(可选),生成任务并读取为训练任务。 +=== "输出:批量生成的任务" -### 步骤 1: 准备数据 -提供少量原始任务数据: + ```json + [ + { + "main_query": "Are financial institutions required to verify the source of funds for corporate clients during account opening?" + }, + { + "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" + } + ] + ``` -```json +--- + +## 快速开始 + +`Data Generation Reader` 可以从本地路径读取用户提供的少量任务以及 PDF、Word、TXT 等多种格式的文档(可选),生成任务并读取为训练任务。 + +### 步骤 1:准备数据 + +**提供少量原始任务数据:** + +```json title="your-queries.jsonl" {"main_query": "What is the capital of France?", "answer": "..."} {"main_query": "How to cook pasta?", "answer": "..."} ``` -提供文档(可选),将文档放置在指定目录: +**提供文档(可选):** ```bash mkdir -p dataset/document cp your-document.pdf dataset/document/ ``` -### 步骤 2: 生成训练任务 -#### 方式1:将生成任务接入训练流程 -拷贝并修改 `astuner/default_config/astune_default.yaml` 中的关键配置参数,将`astuner.task_reader.type` 设置为 `data_generation` 即可启用该 reader。 - -```yaml -astuner: - task_reader: - type: data_generation - # when `type == data_generation` - data_generation: - # 文档读取器配置 - document_reader: - document_path: - - 'dataset/document/your-document1.pdf' - - 'dataset/document/your-document2.pdf' - languages: - - eng - # 任务读取器(用于现有任务) - query_reader: - type: jsonl_dataset_file - jsonl_dataset_file: - training: - file_path: 'dataset/jsonl/your-queries.jsonl' - # 生成任务的数量 - task_num: 10 - # LLM配置 - llm_model: qwen-long - llm_response_length: 8192 - num_workers: 32 - sampling_params: - temperature: 0 - # 任务过滤配置 - deduplication_filter: - enabled: true - params: - similarity_threshold: 0.8 - db_path: ./.similarity_db - model: text-embedding-v4 - api_key: null # load from the env - base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 -``` - -#### 方式2:单独运行生成脚本 -```python -from agentscope_tuner.data_generator.config import * -from agentscope_tuner.task_reader.data_generator_reader import DataGeneratorTaskReader - -def run(): - config = TaskReaderConfig( - data_generation=DataGenerationConfig( - document_reader=DocumentReaderConfig( - document_path=['dataset/document/your-document1.pdf', 'dataset/document/your-document2.pdf'], - languages=["eng"], - chunk_size=5120, - split_by="sentence", - ), - query_reader=QueryReaderConfig( - type="jsonl_dataset_file", - jsonl_dataset_file=DatasetFileConfig( - training=TrainingDatasetConfig(file_path='dataset/jsonl/your-queries.jsonl') +### 步骤 2:生成训练任务 + +=== "方式 1:接入训练流程" + + 修改配置文件,将 `astuner.task_reader.type` 设置为 `data_generation`: + + ```yaml title="config.yaml" + astuner: + task_reader: + type: data_generation + data_generation: + # 文档读取器配置 + document_reader: + document_path: + - 'dataset/document/your-document1.pdf' + - 'dataset/document/your-document2.pdf' + languages: + - eng + # 任务读取器配置 + query_reader: + type: jsonl_dataset_file + jsonl_dataset_file: + training: + file_path: 'dataset/jsonl/your-queries.jsonl' + # 生成任务的数量 + task_num: 10 + # LLM 配置 + llm_model: qwen-long + llm_response_length: 8192 + num_workers: 32 + sampling_params: + temperature: 0 + # 任务过滤配置 + deduplication_filter: + enabled: true + params: + similarity_threshold: 0.8 + db_path: ./.similarity_db + model: text-embedding-v4 + api_key: null + base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 + ``` + +=== "方式 2:单独运行脚本" + + ```python title="generate_data.py" + from agentscope_tuner.data_generator.config import * + from agentscope_tuner.task_reader.data_generator_reader import DataGeneratorTaskReader + + def run(): + config = TaskReaderConfig( + data_generation=DataGenerationConfig( + document_reader=DocumentReaderConfig( + document_path=['dataset/document/your-document1.pdf'], + languages=["eng"], + chunk_size=5120, + split_by="sentence", + ), + query_reader=QueryReaderConfig( + type="jsonl_dataset_file", + jsonl_dataset_file=DatasetFileConfig( + training=TrainingDatasetConfig( + file_path='dataset/jsonl/your-queries.jsonl' + ) + ), ), - ), - task_num=50, - llm_model="qwen-long", - num_workers=16, - sampling_params=SamplingParamsConfig(temperature=0.0), - deduplication_filter=DeduplicationFilterConfig( - enabled=True, - params=DeduplicationFilterParamsConfig( - similarity_threshold=0.8, - model="text-embedding-v4", + task_num=50, + llm_model="qwen-long", + num_workers=16, + sampling_params=SamplingParamsConfig(temperature=0.0), + deduplication_filter=DeduplicationFilterConfig( + enabled=True, + params=DeduplicationFilterParamsConfig( + similarity_threshold=0.8, + model="text-embedding-v4", + ), ), - ), + ) ) - ) - reader = DataGeneratorTaskReader(reader_config=config) + reader = DataGeneratorTaskReader(reader_config=config) -run() -``` + run() + ``` + +--- ## 生成任务示例 -`Data Generation Reader`基于用户提供的文档(可选)与少量任务示例,即可批量生成训练任务: -```json +`Data Generation Reader` 基于用户提供的文档(可选)与少量任务示例,即可批量生成训练任务: + +```json title="生成的任务" [ { "main_query": "Are financial institutions required to verify the source of funds for corporate clients during account opening?" @@ -163,25 +188,52 @@ run() { "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" } - ... ] ``` +--- + ## 详细配置选项 -| 参数路径 | 类型 | 默认值 | 必填 | 说明 | -| --- | --- | --- | --- | --- | -| `document_reader.document_path` | list[str] | - | ❌ | 文档文件路径列表,支持 PDF、Word、TXT 等多种格式 | -| `document_reader.languages` | list[str] | `['eng']` | ❌ | 文档语言列表,用于 OCR 和文本解析,如 `eng`(英语)、`chs`(简体中文) | -| `query_reader.type` | str | `jsonl_dataset_file` | ✅ | 读取器类型,可选:`jsonl_dataset_file`、`env_service`、`huggingface_dat_repo` | -| `query_reader.jsonl_dataset_file.training.file_path` | str | - | ✅ | 训练任务 JSONL 文件路径(当 `type: jsonl_dataset_file` 时) | -| `task_num` | int | `10` | ✅ | 要生成的任务数量,实际数量可能因过滤而减少 | -| `llm_model` | str | `qwen-long` | ✅ | 用于生成任务的 LLM 模型名称 | -| `llm_response_length` | int | `8192` | ❌ | LLM 响应的最大 token 长度 | -| `num_workers` | int | `32` | ❌ | 并行工作线程数,用于多线程加速任务生成 | -| `sampling_params.temperature` | float | `0` | ❌ | 采样温度,0 表示贪婪解码(确定性输出),值越高输出越随机 | -| `deduplication_filter.enabled` | bool | `true` | ❌ | 是否启用去重过滤器 | -| `deduplication_filter.params.similarity_threshold` | float | `0.8` | ✅ | 相似度阈值 (0-1),超过此值的任务会被过滤 | -| `deduplication_filter.params.db_path` | str | `./.similarity_db` | ❌ | 相似度数据库存储路径,用于缓存 embedding | -| `deduplication_filter.params.model` | str | `text-embedding-v4` | ✅ | 用于计算相似度的 embedding 模型 | -| `deduplication_filter.params.api_key` | str | `null` | ❌ | API Key,为 `null` 时从环境变量 `DASHSCOPE_API_KEY` 加载 | -| `deduplication_filter.params.base_url` | str | `https://dashscope.aliyuncs.com/compatible-mode/v1` | ❌ | Embedding API 的基础 URL | + +### 文档读取器配置 + +| 参数 | 类型 | 默认值 | 必填 | 说明 | +|------|------|--------|------|------| +| `document_path` | `list[str]` | - | 否 | 文档文件路径列表,支持 PDF、Word、TXT 等 | +| `languages` | `list[str]` | `['eng']` | 否 | 文档语言列表,如 `eng`、`chs` | + +### 任务读取器配置 + +| 参数 | 类型 | 默认值 | 必填 | 说明 | +|------|------|--------|------|------| +| `type` | `str` | `jsonl_dataset_file` | 是 | 读取器类型:`jsonl_dataset_file`、`env_service`、`huggingface_dat_repo` | +| `file_path` | `str` | - | 是 | 训练任务 JSONL 文件路径 | + +### 生成配置 + +| 参数 | 类型 | 默认值 | 必填 | 说明 | +|------|------|--------|------|------| +| `task_num` | `int` | `10` | 是 | 要生成的任务数量 | +| `llm_model` | `str` | `qwen-long` | 是 | 用于生成任务的 LLM 模型 | +| `llm_response_length` | `int` | `8192` | 否 | LLM 响应的最大 token 长度 | +| `num_workers` | `int` | `32` | 否 | 并行工作线程数 | +| `temperature` | `float` | `0` | 否 | 采样温度,0 表示贪婪解码 | + +### 去重过滤配置 + +| 参数 | 类型 | 默认值 | 必填 | 说明 | +|------|------|--------|------|------| +| `enabled` | `bool` | `true` | 否 | 是否启用去重过滤器 | +| `similarity_threshold` | `float` | `0.8` | 是 | 相似度阈值(0-1),超过此值的任务会被过滤 | +| `db_path` | `str` | `./.similarity_db` | 否 | 相似度数据库存储路径 | +| `model` | `str` | `text-embedding-v4` | 是 | 用于计算相似度的 embedding 模型 | +| `api_key` | `str` | `null` | 否 | API Key,为 `null` 时从环境变量加载 | + +--- + +## 下一步 + + diff --git a/docs/zh/data_pipeline.md b/docs/zh/data_pipeline.md index 7f07435a..31cc8b6b 100644 --- a/docs/zh/data_pipeline.md +++ b/docs/zh/data_pipeline.md @@ -2,18 +2,23 @@ AgentScope Tuner 通过 Task Reader 从多种数据源加载训练任务。本页面介绍 Task 的统一 Schema 定义,以及面向常见场景的内置 Task Reader。 +--- + ## 概览 -在智能体训练中,所有训练数据都必须以**任务(task)**的形式表示,并遵循统一的 Schema。AgentScope Tuner 提供了多个 Task Reader,用于从不同数据源加载任务: +在智能体训练中,所有训练数据都必须以**任务(task)**的形式表示,并遵循统一的 Schema。 -* **统一 Schema**:无论数据源是什么,所有任务都统一映射为 `Task` 结构 -* **多种来源**:支持从本地文件、HuggingFace 数据集、交互式环境加载,或自动生成新任务 -* **自动路由**:框架会根据配置中的 `astuner.task_reader.type` 自动选择合适的 reader +!!! info "Task Reader 核心特性" + - **统一 Schema**:无论数据源是什么,所有任务都统一映射为 `Task` 结构 + - **多种来源**:支持从本地文件、HuggingFace 数据集、交互式环境加载,或自动生成新任务 + - **自动路由**:框架会根据配置中的 `astuner.task_reader.type` 自动选择合适的 reader ``` Data Source → Task Reader → Unified Task Schema → Training Pipeline ``` +--- + ## 任务结构 所有训练任务都必须按照以下结构定义: @@ -29,17 +34,17 @@ class Task(BaseModel): ### 字段说明 -| 字段 | 类型 | 说明 | -| --------------- | ------------ | ------------------------------------------------------- | -| `main_query` | `str` | 智能体需要解决的主要指令或问题 | +| 字段 | 类型 | 说明 | +|------|------|------| +| `main_query` | `str` | 智能体需要解决的主要指令或问题 | | `init_messages` | `List[dict]` | 初始对话消息(例如 system prompt)。每条消息必须包含 `role` 和 `content` 字段 | -| `task_id` | `str` | 任务的唯一标识 | -| `env_type` | `str` | 环境类型(例如 `"math"`、`"appworld"`) | -| `metadata` | `dict` | 额外的上下文信息(例如用于奖励计算的参考答案) | +| `task_id` | `str` | 任务的唯一标识 | +| `env_type` | `str` | 环境类型(例如 `"math"`、`"appworld"`) | +| `metadata` | `dict` | 额外的上下文信息(例如用于奖励计算的参考答案) | ### Task 示例 -```json +```json title="task_example.json" { "main_query": "What is 15 * 23?", "init_messages": [ @@ -57,11 +62,12 @@ class Task(BaseModel): } ``` -**最佳实践:** +!!! tip "最佳实践" + - 使用 `metadata` 存储奖励计算所需的信息(例如参考答案、评分规则) + - 保持 `main_query` 清晰且简洁 + - 使用 `init_messages` 提供 system prompt 或 few-shot 示例 -* 使用 `metadata` 存储奖励计算所需的信息(例如参考答案、评分规则) -* 保持 `main_query` 清晰且简洁 -* 使用 `init_messages` 提供 system prompt 或 few-shot 示例 +--- ## 内置 Task Readers @@ -69,22 +75,20 @@ AgentScope Tuner 提供了 6 个内置 Task Reader,覆盖不同场景。框架 ### 快速选择指南 -| 场景 | Reader Type | 适用情况 | -| ------------------- | ---------------------- | ------------------------------------ | -| **本地 JSONL 文件** | `jsonl_dataset_file` | 你已经准备好 JSONL 格式的任务数据 | -| **HuggingFace 数据集** | `huggingface_dat_repo` | 从 HuggingFace Hub 加载任务(例如 GSM8K) | -| **交互式环境** | `env_service` | 任务来自运行中的环境服务(例如 AppWorld、FrozenLake) | -| **从文档自动生成** | `data_generation` | 从知识文档生成任务或基于已有任务进行扩增 | +| 场景 | Reader Type | 适用情况 | +|------|-------------|----------| +| **本地 JSONL 文件** | `jsonl_dataset_file` | 您已经准备好 JSONL 格式的任务数据 | +| **HuggingFace 数据集** | `huggingface_dat_repo` | 从 HuggingFace Hub 加载任务(例如 GSM8K) | +| **交互式环境** | `env_service` | 任务来自运行中的环境服务(例如 AppWorld、FrozenLake) | +| **从文档自动生成** | `data_generation` | 从知识文档生成任务或基于已有任务进行扩增 | --- ### 1. JSONL 文件 Reader -**适用场景:**你在本地以 JSONL 格式准备了训练任务。 - -**配置方式:** +**适用场景:** 您在本地以 JSONL 格式准备了训练任务。 -```yaml +```yaml title="配置方式" astuner: task_reader: type: jsonl_dataset_file @@ -95,30 +99,25 @@ astuner: file_path: "data/val.jsonl" ``` -**JSONL 格式:** - -每一行都应是一个符合 Task Schema 的 JSON 对象: +**JSONL 格式要求:** 每一行都应是一个符合 Task Schema 的 JSON 对象: -```json +```json title="train.jsonl" {"main_query": "Solve: x + 5 = 12", "task_id": "algebra_01", "env_type": "math", "metadata": {"answer": "7"}} {"main_query": "What is the capital of France?", "task_id": "geo_01", "env_type": "qa", "metadata": {"answer": "Paris"}} ``` -**工作原理:** - -* 按行读取指定的 JSONL 文件 -* 自动按 Task Schema 校验数据 -* 支持训练集与验证集分离 +!!! note "工作原理" + - 按行读取指定的 JSONL 文件 + - 自动按 Task Schema 校验数据 + - 支持训练集与验证集分离 --- ### 2. HuggingFace 数据集 Reader -**适用场景:**从 HuggingFace Hub 的数据集中加载任务(例如 GSM8K、MATH)。 - -**配置方式:** +**适用场景:** 从 HuggingFace Hub 的数据集中加载任务(例如 GSM8K、MATH)。 -```yaml +```yaml title="配置方式" astuner: task_reader: type: huggingface_dat_repo @@ -129,23 +128,20 @@ astuner: validation_split: "test" # Validation split name ``` -**工作原理:** - -* 使用 `datasets` 库从 HuggingFace Hub 下载数据集 -* 自动将数据集字段映射到 Task Schema -* 将下载的数据缓存在本地,便于后续更快重复运行 +!!! note "工作原理" + - 使用 `datasets` 库从 HuggingFace Hub 下载数据集 + - 自动将数据集字段映射到 Task Schema + - 将下载的数据缓存在本地,便于后续更快重复运行 -**支持的数据集:**任意可映射到 Task Schema 的 HuggingFace 数据集。 +**支持的数据集:** 任意可映射到 Task Schema 的 HuggingFace 数据集。 --- ### 3. EnvService Reader -**适用场景:**任务由交互式环境服务提供(例如 AppWorld、RL gym 环境)。 +**适用场景:** 任务由交互式环境服务提供(例如 AppWorld、RL gym 环境)。 -**配置方式:** - -```yaml +```yaml title="配置方式" astuner: task_reader: type: env_service @@ -157,13 +153,20 @@ astuner: validation_split: dev ``` -**工作原理:** +!!! note "工作原理" + - 通过 HTTP 连接到正在运行的环境服务 + - 从环境中拉取任务实例 + - 支持从交互式环境中动态生成任务 + +!!! example "典型用例" + - 在模拟环境中训练智能体(例如 FrozenLake、各类游戏环境) + - 任务需要动态生成、评测依赖环境状态的复杂交互场景 -* 通过 HTTP 连接到正在运行的环境服务 -* 从环境中拉取任务实例 -* 支持从交互式环境中动态生成任务 +--- -**典型用例:** +## 下一步 -* 在模拟环境中训练智能体(例如 FrozenLake、各类游戏环境) -* 任务需要动态生成、评测依赖环境状态的复杂交互场景 + diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 2cfd0383..477e8f07 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -1,20 +1,28 @@ -# App交互模拟 +# AppWorld 智能体 本教程介绍如何训练一个智能体与 AppWorld 交互并解决复杂的任务。 -## 1. 概述 +--- +## 概述 + +
+

AppWorld 是一个模拟现实 APP 操作的沙盒环境,包含 9 个日常应用,可通过 457 个 API 操作,并预置了 106 个在模拟世界中生活的数字用户行为数据。我们的目标是调优一个智能体,使其能够有效地在这些应用中执行并完成复杂任务。 +

+
本文结构如下: -- 快速开始 -- 理解实现:Workflow 核心流程、配置、代码位置、奖励机制 -- 结果:训练曲线与案例对比 +1. 快速开始 +2. 理解实现:Workflow 核心流程、配置、代码位置、奖励机制 +3. 结果:训练曲线与案例对比 + +--- -## 2. 快速开始 +## 快速开始 -### 2.1 准备工作 +### 准备工作 首先,需要准备 AppWorld 所需的环境服务: @@ -30,16 +38,16 @@ wget -q "https://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/astuner_archive/appwor tar -xzf ./appworld_pack_v2.tar.gz -C "${base_path}" ``` -然后,设置如下的环境变量(在开启新的 shell 窗口都需要运行): - -```bash -export BASE_PATH=/tmp -export APPWORLD_PATH="${BASE_PATH}/pack_all_in_one" -export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" -``` - +!!! warning "环境变量设置" + 每次开启新的 shell 窗口都需要运行以下环境变量设置: + + ```bash + export BASE_PATH=/tmp + export APPWORLD_PATH="${BASE_PATH}/pack_all_in_one" + export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" + ``` -### 2.2 开始训练 +### 开始训练 运行训练脚本: @@ -47,30 +55,24 @@ export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" astuner --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray ``` -
-快速调试(可选) - -不启用 Ray 在本地运行,便于更快迭代: +??? tip "快速调试(可选)" + 不启用 Ray 在本地运行,便于更快迭代: -```bash -astuner --conf tutorial/example_appworld/learn2ask.yaml --backbone='debug' --with-logview -``` + ```bash + astuner --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview + ``` -如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 + 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与您的代码位置一致。 -
+--- -## 3. 理解实现 +## 理解实现 -本节将对如何搭建 AppWorld workflow 进行更详细的说明,包括核心流程、配置与关键代码位置。 - -### 3.1 核心流程 +### 核心流程 AppWorld 示例所使用的 AgentScope Workflow 代码位于:`tutorial/example_appworld/appworld.py`。 -代码首先定义了 AgentScope Workflow(将智能体的 `model` 设置为 `model_tuner`): - -```python +```python title="Workflow 核心代码" agent = ReActAgent( name="Qwen", sys_prompt=first_msg["content"], @@ -98,45 +100,34 @@ for step in range(model_tuner.config.astuner.rollout.multi_turn.max_steps): break ``` -在上述代码中: - -- `env.step`:模拟 gym 接口。输入一个 action,返回四元组 `(observation, reward, terminate_flag, info)`。 -- `model_tuner.get_context_tracker().context_overflow`:检查当前上下文窗口是否已经超过 token 限制。 - - -### 3.2 奖励 - -在 `astuner/task_judge/env_service_as_judge.py` 中,我们通过 `env.evaluate(...)` 从环境中读取奖励信号。 +| 关键点 | 说明 | +|--------|------| +| `env.step` | 模拟 gym 接口。输入一个 action,返回 `(observation, reward, terminate_flag, info)` | +| `context_overflow` | 检查当前上下文窗口是否已经超过 token 限制 | -你也可以参考该文件,为自己的任务实现专用的 Judge 模块。 +### 奖励机制 +在 `astuner/task_judge/env_service_as_judge.py` 中,通过 `env.evaluate(...)` 从环境中读取奖励信号。 -### 3.3 配置说明 +!!! tip "自定义 Judge" + 您可以参考该文件,为自己的任务实现专用的 Judge 模块。 -`tutorial/example_appworld/appworld.yaml` 中的关键配置参数用 ✨✨✨✨ 标出: +### 配置说明 -1. **读取任务**(对应字段:`astuner.task_reader`) -2. **定义 Workflow**(对应字段:`astuner.rollout.agentscope_workflow`) - - 示例:如果 AgentScope Workflow 定义在 `tutorial/example_appworld/appworld.py` 中的 `ExampleAgentScopeWorkflow` 类里 - - 则配置: -`astuner.rollout.agentscope_workflow = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow"` -3. **定义评分函数**(对应字段:`astuner.task_judge.judge_protocol`) - - 示例: -`astuner.task_judge.judge_protocol = "astuner.task_judge.env_service_as_judge->EnvServiceJudge"` -4. **指定模型**(对应字段:`astuner.model.path`) +`tutorial/example_appworld/appworld.yaml` 中的关键配置参数: -```yaml +```yaml title="appworld.yaml" astuner: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: - # ✨✨✨✨ 编写并选择评估函数 + # [关键] 编写并选择评估函数 judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge model: - # ✨✨✨✨ 设置需要训练的模型 + # [关键] 设置需要训练的模型 path: YOUR_MODEL_PATH rollout: - # ✨✨✨✨ 编写并选择智能体 + # [关键] 编写并选择智能体 agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: True debug: @@ -144,47 +135,69 @@ astuner: debug_first_n_tasks: 1 ``` -## 4. 结果 +| 配置项 | 说明 | +|--------|------| +| `task_reader` | 读取任务 | +| `agentscope_workflow` | 定义 Workflow | +| `judge_protocol` | 定义评分函数 | +| `model.path` | 指定模型 | -### 4.1 训练曲线 +--- -![Training curve (small batch)](https://img.alicdn.com/imgextra/i2/O1CN01toRt2c1Nj8nKDqoTd_!!6000000001605-2-tps-1410-506.png) +## 结果 -> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). +### 训练曲线 -随着训练的进展,奖励也会增加。这通常意味着智能体在**两个方面**变得更加稳定: - -* **遵循正确的 API 协议**:它学会在调用前查阅 API 文档,并使用有效的 API 端点,而不是虚构不存在的 API。 -* **完成多步工作流**:它能够正确获取 access token,并串联多个 API 调用以完成复杂任务。 - -### 4.2 案例展示 - -#### 调优前: - -1. 频繁调用不存在的 API - -![Before tuning](https://img.alicdn.com/imgextra/i1/O1CN015FgjqI20Ip3AJybr0_!!6000000006827-2-tps-1259-683.png) - -智能体在不检查 API 是否存在的情况下产生幻觉,导致重复失败。 - -2. 没有学会按照说明去获取 access token +
+训练曲线 +
-![Before tuning](https://img.alicdn.com/imgextra/i1/O1CN01bGZ1s01VyjCSrTJte_!!6000000002722-2-tps-1181-954.png) +!!! info "可视化说明" + 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 -智能体在未先获取所需的访问令牌(access token)的情况下尝试调用受保护的 API,导致认证错误。 - -#### 调优后: - -1. 会先查阅 API 文档,并学会使用有效的 API - -![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01VRIDy922PoKD1bETl_!!6000000007113-2-tps-1180-944.png) - -智能体现在会先检查可用的 API 再发起调用,从而避免臆造不存在的接口端点。 - -2. 学会正确获取 access token - -![After tuning](https://img.alicdn.com/imgextra/i2/O1CN01xiF9UU20h62dyrZ4x_!!6000000006880-2-tps-1182-793.png) - -智能体在访问受保护的 API 之前,会先正确完成认证步骤。 +随着训练的进展,奖励也会增加。这通常意味着智能体在**两个方面**变得更加稳定: -> **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). +- **遵循正确的 API 协议**:学会在调用前查阅 API 文档,并使用有效的 API 端点 +- **完成多步工作流**:能够正确获取 access token,并串联多个 API 调用以完成复杂任务 + +### 案例展示 + +=== "调优前" + + **问题 1:频繁调用不存在的 API** + + ![调优前 - 幻觉 API](https://img.alicdn.com/imgextra/i1/O1CN015FgjqI20Ip3AJybr0_!!6000000006827-2-tps-1259-683.png) + + 智能体在不检查 API 是否存在的情况下产生幻觉,导致重复失败。 + + **问题 2:没有学会按照说明获取 access token** + + ![调优前 - Token 问题](https://img.alicdn.com/imgextra/i1/O1CN01bGZ1s01VyjCSrTJte_!!6000000002722-2-tps-1181-954.png) + + 智能体在未先获取所需的访问令牌的情况下尝试调用受保护的 API,导致认证错误。 + +=== "调优后" + + **改进 1:会先查阅 API 文档,使用有效的 API** + + ![调优后 - 正确的 API](https://img.alicdn.com/imgextra/i4/O1CN01VRIDy922PoKD1bETl_!!6000000007113-2-tps-1180-944.png) + + 智能体现在会先检查可用的 API 再发起调用,从而避免臆造不存在的接口端点。 + + **改进 2:学会正确获取 access token** + + ![调优后 - Token 正确](https://img.alicdn.com/imgextra/i2/O1CN01xiF9UU20h62dyrZ4x_!!6000000006880-2-tps-1182-793.png) + + 智能体在访问受保护的 API 之前,会先正确完成认证步骤。 + +!!! note "Token 级可视化" + 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md)。 + +--- + +## 下一步 + + diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index ddc70803..c9ebe221 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -83,7 +83,7 @@ WorkflowOutput( ``` ### 3.2 配置说明 -拷贝并修改 `tutorial/example_countdown/countdown.yaml` 中的关键配置参数。yaml 中与本示例最相关的部分已经用 ✨✨✨✨ 标出。 +拷贝并修改 `tutorial/example_countdown/countdown.yaml` 中的关键配置参数。yaml 中与本示例最相关的部分已经用 标出。 1. 读取任务(对应配置字段 `astuner.task_reader`) 2. 定义 Workflow(对应配置字段 `astuner.rollout.agentscope_workflow`) @@ -97,14 +97,14 @@ WorkflowOutput( ```yaml astuner: task_reader: - type: huggingface_dat_repo # ✨✨✨✨ `env_service` 或 `dataset_file` 或 `huggingface_dat_repo` 或 `data_generation` + type: huggingface_dat_repo # [关键] `env_service` 或 `dataset_file` 或 `huggingface_dat_repo` 或 `data_generation` rollout: - agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # ✨✨✨✨ 编写并选择智能体 + agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # [关键] 编写并选择智能体 task_judge: - # ✨✨✨✨ 编写并选择评估函数 + # [关键] 编写并选择评估函数 judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge model: - # ✨✨✨✨ 设置需要训练的模型 + # [关键] 设置需要训练的模型 path: YOUR_MODEL_PATH ``` diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index 6769d4fa..f179cf6c 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -1,28 +1,27 @@ # 数学智能体 -训练一个**会用工具的数学智能体**(ReAct + Python 执行器),用于解决 GSM8K 风格的小学应用题。 -奖励来自一个**评审器 (judge)**:它检查最终答案是否正确(并且可选地惩罚不良的工具调用行为)。 +训练一个**会用工具的数学智能体**(ReAct + Python 执行器),用于解决 GSM8K 风格的小学应用题。奖励来自一个**评审器 (judge)**:它检查最终答案是否正确(并且可选地惩罚不良的工具调用行为)。 --- -### 1. 概览 +## 概览 -在 **Math 智能体** 中,每条训练样本是一道数学文字题(如 GSM8K)。智能体将学习: - -* **分步推理**(ReAct 风格), -* 在需要计算时**调用 Python 工具**, -* 产出与参考答案一致的最终答案。 +
+

+在 Math 智能体 中,每条训练样本是一道数学文字题(如 GSM8K)。智能体将学习分步推理(ReAct 风格),在需要计算时调用 Python 工具,并产出与参考答案一致的最终答案。 +

+
本教程分两步组织: -1. **先跑起来**:下载数据集,并用默认 YAML 配置启动训练。 -2. **理解与自定义**:理解 workflow 代码(`ExampleMathLearn`)与 judge/reward(`MathAnswerAndLlmAsJudge`)。 +1. **先跑起来**:下载数据集,并用默认 YAML 配置启动训练 +2. **理解与自定义**:理解 workflow 代码与 judge/reward --- -### 2. 快速开始 +## 快速开始 -#### 2.1 准备数据集 +### 准备数据集 下载 `openai/gsm8k` 数据集: @@ -30,7 +29,7 @@ python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/store/dataset ``` -#### 2.2 启动训练 +### 启动训练 ```bash # (可选)训练前建议清理残留进程 @@ -39,84 +38,74 @@ python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/sto astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -
-快速调试(可选) - -如果你想在本地对 workflow / judge 打断点调试: +??? tip "快速调试(可选)" + 如果您想在本地对 workflow / judge 打断点调试: -```bash -# (可选)调试前建议清理残留进程 -# astuner --kill="python|ray" + ```bash + # (可选)调试前建议清理残留进程 + # astuner --kill="python|ray" -clear && \ -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview -``` + clear && \ + astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview + ``` -当 `--backbone=debug` 时,Ray 会被禁用。你可以使用类似下面的 VSCode `.vscode/launch.json`: + 当 `--backbone=debug` 时,Ray 会被禁用。您可以使用类似下面的 VSCode 配置: -```json -{ - "version": "0.2.0", - "configurations": [ + ```json title=".vscode/launch.json" { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "module": "agentscope_tuner.cli.launcher", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "./path/to/yaml.yaml" - ], - "env": {} + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Launch rollout", + "type": "debugpy", + "request": "launch", + "module": "agentscope_tuner.cli.launcher", + "console": "integratedTerminal", + "args": [ + "--backbone", "debug", + "--conf", "./path/to/yaml.yaml" + ], + "env": {} + } + ] } - ] -} - -``` - -
+ ``` --- -### 3. 理解实现 +## 理解训练流程 -#### 3.1 每一步训练都发生了什么 +### 每一步训练都发生了什么 -每个 training step 会做: +
+
训练步骤流程
-1. 从数据集加载**一道题**(`task_reader`)。 -2. 运行 **AgentScope workflow**: -* 用题目文本构造 prompt, -* 让 ReAct 智能体在需要时调用 Python 工具进行计算, -* 抽取**最终答案**。 +
+
    +
  1. 加载一道题 +从数据集通过 `task_reader` 加载一道数学题。
  2. +
  3. 运行 AgentScope workflow -3. **注册用于评估的关键信息(很重要!)**: -* Workflow 应该返回一个 `WorkflowOutput` 对象,其 `metadata` 携带最终答案,例如:`WorkflowOutput(reward=None, metadata={"final_answer": final_answer})`。评审器(Judge)会直接读取此 metadata,无需额外的 API 调用。 +用题目文本构造 prompt,让 ReAct 智能体调用 Python 工具,并抽取最终答案。
  4. +
  5. 注册用于评估的关键信息 +返回 `WorkflowOutput(reward=None, metadata={"final_answer": final_answer})`。
  6. +
  7. 运行 judge -4. 运行 **judge** 计算 reward: -* 将 `final_answer` 与任务中的参考答案对比, -* 输出 `raw_reward` 与 `is_success`, -* Trainer 使用这些结果来更新策略。 +将 `final_answer` 与参考答案对比,计算 `raw_reward` 和 `is_success`。
  8. +
+
+
+### YAML 配置说明 -#### 3.2 YAML 配置说明 +大部分"连线"都在 `tutorial/example_math_agent/math_agent.yaml` 中完成: -大部分“连线”都在 `tutorial/example_math_agent/math_agent.yaml` 中完成。关键字段包括: - -* `astune.task_reader`:任务来源 -* `astune.rollout.agentscope_workflow`:每条样本运行哪个 workflow -* `astune.task_judge.judge_protocol`:由哪个 judge 计算 reward -* `astune.model.path`:要微调的预训练模型路径 - -最小示例: - -```yaml -astune: +```yaml title="math_agent.yaml" +astuner: task_reader: - type: huggingface_dat_repo # 也支持: dataset_file / env_service(如果启用) + type: huggingface_dat_repo # 也支持: dataset_file / env_service rollout: agentscope_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn @@ -126,24 +115,20 @@ astune: model: path: YOUR_MODEL_PATH - ``` -#### 3.3 代码解读 +| 字段 | 说明 | +|------|------| +| `task_reader` | 任务来源 | +| `agentscope_workflow` | 每条样本运行哪个 workflow | +| `judge_protocol` | 由哪个 judge 计算 reward | +| `model.path` | 要微调的预训练模型路径 | -**Workflow (AgentScope):** `tutorial/example_math_agent/math_agent.py` +### 代码解读 -Workflow 通常会做: +**Workflow:** `tutorial/example_math_agent/math_agent.py` -* 注册工具(例如 `execute_python_code`) -* 构造一个 ReAct 智能体 -* 从用户题目运行一轮对话 -* 解析最终答案 -* 通过 `WorkflowOutput(..., metadata={"final_answer": final_answer})` 返回答案,以便评审器评分。 - -Workflow 代码梗概: - -```python +```python title="Workflow 代码梗概" self.toolkit = Toolkit() self.toolkit.register_tool_function(execute_python_code) @@ -164,99 +149,82 @@ final_answer = extract_final_answer(result) return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` -**Judge / Reward:** `tutorial/example_math_agent/math_answer_as_judge.py` - -该文件内提供了两个简单的评审器;你也可以在项目的任何位置添加自己的评审器。 +!!! warning "重要提示" + 始终通过 `WorkflowOutput.metadata` 提供最终答案,以便 judge 进行评分。 -#### 3.4 奖励 (Reward) +### 奖励计算 评审器接收两个对象: -* `workflow_task`:任务信息,可从中检索参考答案。 -* `workflow_output`:由 workflow 返回;通过 `workflow_output.metadata["final_answer"]` 获取最终答案。 +| 对象 | 包含内容 | +|------|----------| +| `workflow_task` | 任务信息;从 `metadata` 获取参考答案 | +| `workflow_output` | Workflow 结果;从 `metadata["final_answer"]` 获取最终答案 | -评审器返回: - -* `raw_reward` -* `is_success` - -**实用建议:** -如果你观察到模型“几乎做对了,但搞错了工具调用格式 / 没等工具执行就跳过了”,你可以扩展评审器来: - -* 增加格式惩罚(无效的 ``) -* 增加行为惩罚(调用了工具但没 `print` / 没用到执行结果) -* 同时保持“答案正确性”作为主要信号。 - ---- - -### 4. 结果 - -#### 4.1 训练曲线 - -> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 - -解读:随着训练进行,reward 随之上升。这通常意味着智能体在**两件事**上变得更稳定: - -* **该用工具时会用**:能正确发起 ``,并在需要计算时调用 `execute_python_code`。 -* **产出更可靠的答案**:能基于工具返回的结果(例如 ``)输出与参考答案一致的最终答案。 - -> 在实践中,这里的提升往往不在于“数学能力变强”,而在于“更好的工具调用纪律 + 对执行结果更一致的使用”。 +!!! tip "扩展 Judge" + 如果您观察到模型"几乎做对了,但搞错了工具调用格式",可以扩展评审器来: + + - 增加格式惩罚(无效的 ``) + - 增加行为惩罚(调用了工具但没 `print`) + - 同时保持"答案正确性"作为主要信号 --- -#### 4.2 案例展示:从“会算”到“会用工具算” +## 结果 -训练前,智能体可能已经能解出不少题。然而,小模型经常在**工具调用规范**上翻车,例如: +### 训练曲线 -* 忘记在 Python 代码里 `print` 计算结果(工具运行了,但没有产出可用的输出)。 -* 在工具执行结束前就急着输出最终答案(抢答)。 -* `` 块格式错误(导致工具不触发或解析失败)。 +![训练曲线](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) -##### Bad case:典型失败表现 +!!! info "可视化说明" + 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 -```text -# bad case 1: 忘记在 Python 代码里 print 结果 - -{"name": "execute_python_code", "arguments": {"code": "... height_difference"}} - +**解读:** 随着训练进行,reward 随之上升。这通常意味着智能体在两件事上变得更稳定: -# bad case 2: 太心急 —— 没等工具返回结果就输出了最终答案 - {"name": "execute_python_code", ...} - {"name": "generate_response", "arguments": {"response": "... \\boxed{48} ..."}} +- **该用工具时会用**:能正确发起 ``,并在需要计算时调用 `execute_python_code` +- **产出更可靠的答案**:能基于工具返回的结果输出与参考答案一致的最终答案 -``` +### 案例展示:工具调用纪律的改进 -这些失败本质上不是因为模型“不会算”,而是因为它**没有形成决策闭环**,未能将工具执行结果纳入考虑: +训练前,智能体可能已经能解出不少题。然而,小模型经常在**工具调用规范**上翻车。 -* bad case 1:工具可能执行成功,但没有 `print`,`stdout` 就是空的,模型无法可靠地读取数值。 -* bad case 2:模型在同一轮中连续生成工具调用和最终回答,实际上**跳过了“等待 ``”的步骤**。 +=== "Bad Cases" ---- + ```text + # bad case 1: 忘记在 Python 代码里 print 结果 + + {"name": "execute_python_code", "arguments": {"code": "... height_difference"}} + -##### Good case:调优后,工具调用链路变得闭环 + # bad case 2: 太心急 —— 没等工具返回结果就输出了最终答案 + {"name": "execute_python_code", ...} + {"name": "generate_response", "arguments": {"response": "... \\boxed{48} ..."}} + ``` -调优后,智能体通常会遵循规范的三段式结构(对应截图中的 Message 3/4/5): + 这些失败本质上不是因为模型"不会算",而是因为它**没有形成决策闭环**,未能将工具执行结果纳入考虑。 -1. **Message 3 (assistant)**:拆解问题 + 发起 ``,并在代码里使用 `print(...)` 输出关键数值。 -2. **Message 4 (tool_response)**:工具返回执行结果(如 `returncode=0`, `stdout=...`)。 -3. **Message 5 (assistant)**:读取 `stdout`,然后产出最终答案(如 `\\boxed{18}`)。 +=== "Good Case(调优后)" -图中右侧彩色块是 **token 级别的序列可视化**: + 调优后,智能体通常会遵循规范的三段式结构: -> **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md)。 + 1. **Message 3 (assistant)**:拆解问题 + 发起 ``,并在代码里使用 `print(...)` + 2. **Message 4 (tool_response)**:工具返回执行结果 + 3. **Message 5 (assistant)**:读取 `stdout`,然后产出最终答案 -* **每个小块代表一个 token**(块内数字是 token id)。 -* 块的顺序就是模型**消耗/生成** token 的顺序。 -* 重点不在于 token id 本身,而在于你能否看到清晰的边界标记,例如: -* ` assistant ... ... ` -* ` user ... 18.0 ... ` -* ` assistant ... \\boxed{18} ... ` + ![Good case](https://img.alicdn.com/imgextra/i4/O1CN01v1gGQZ1ftMiil5Cxg_!!6000000004064-2-tps-1367-684.png) +!!! note "Token 级可视化" + 图中彩色块是 [Beast-Logger](./beast_logger.md) 生成的 token 级别序列可视化: + + - **黄色 token**:排除在损失函数(loss)计算之外的 token + - **蓝色 token**:参与损失计算的 token(从浅蓝到深蓝表示 logprob 从高到低) -* **黄色 token**:排除在损失函数(loss)计算之外的 token。**蓝色 token**:参与损失计算的 token(从浅蓝到深蓝表示 `logprob` 从高到低)。 +--- -一个“好”的 tool-call 行为在日志中通常体现为: +## 下一步 -* `` 和 `` **分轮出现**(发起调用 -> 得到响应 -> 最终回答)。 -* `` 包含 **非空的 stdout**。 -* 最终答案出现在工具返回**之后**,而不是提前抢答。 + diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index fccf3f5b..01527879 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -1,139 +1,195 @@ -# 狼人杀 +# 狼人杀游戏 -本教程展示了如何使用 AgentScope Tuner 来处理多 智能体 训练,令多个 智能体 在狼人杀游戏中决策、对抗和协作。 +本教程展示了如何使用 AgentScope Tuner 来处理多智能体训练,令多个智能体在狼人杀游戏中决策、对抗和协作。 -## 1. 概述 +--- -狼人杀角色扮演游戏是一个典型的 POMDP(部分可观测马尔可夫决策过程,Partially Observable Markov Decision Process)问题。我们可以在这个协作型多 智能体 问题中使用「参数共享」的方法来训练 Agent。 +## 概述 -术语说明: -- **部分可观测(Partially Observable)**:Agent 只能接收**局部信息**。即使属于同一阵营,一个 智能体 也无法获得其他 智能体 的观测信息。 -- **马尔可夫决策过程(Markov Decision Process)**:根据当前局面做决策。 -- **参数共享(Shared-parameter)**:多个 智能体 使用同一个模型作为策略。但需要注意:Agent **共享**策略(模型参数),但**不共享**感知(模型输入)。 -- **协作型多 智能体 问题(Cooperative multi-agent problem)**:Agent 之间目标一致(奖励一致)。 -- **环境(Environment)**:使用静态 **`Qwen3-235B-A22B`** 作为对手(不可训练 Agent),使用 **`Qwen2-7B`** 作为可训练 Agent(即 `trainable_targets`)。 +
+

+狼人杀角色扮演游戏是一个典型的 POMDP(部分可观测马尔可夫决策过程)问题。我们可以在这个协作型多智能体问题中使用「参数共享」的方法来训练 Agent。 +

+
-![image](https://img.alicdn.com/imgextra/i2/O1CN012JgVZC2ABczBhAzJs_!!6000000008165-0-tps-2048-2048.jpg) +| 术语 | 说明 | +|------|------| +| **部分可观测** | Agent 只能接收局部信息。即使属于同一阵营,一个智能体也无法获得其他智能体的观测信息 | +| **马尔可夫决策过程** | 根据当前局面做决策 | +| **参数共享** | 多个智能体使用同一个模型作为策略,但不共享感知(模型输入) | +| **协作型多智能体问题** | Agent 之间目标一致(奖励一致) | -本页展示如何将狼人杀这种社交推理类游戏作为多 Agent 环境,完成:准备数据与环境、编写 AgentScope Workflow、配置奖励模块,以及从本地调试到正式训练的完整流程。 +!!! info "实验环境" + - 使用静态 **Qwen3-235B-A22B** 作为对手(不可训练 Agent) + - 使用 **Qwen2-7B** 作为可训练 Agent(即 `trainable_targets`) -场景概述 -- **场景**:经典狼人杀游戏,包括狼人(werewolf)、村民(villager)、预言家(seer)、女巫(witch)、猎人(hunter)等角色。 -- **目标**:训练某一指定角色(本示例中为 `werewolf`),在对局中获得更高的胜率。 +
+狼人杀游戏 +
-## 2. 快速开始 +**场景概述:** + +- **场景**:经典狼人杀游戏,包括狼人、村民、预言家、女巫、猎人等角色 +- **目标**:训练某一指定角色(本示例中为 `werewolf`),在对局中获得更高的胜率 + +--- + +## 快速开始 正式训练(启用 Ray): + ```bash # ( astuner --kill="python|ray|vllm" ) astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray ``` -
-快速调试(可选) +??? tip "快速调试(可选)" + 不启用 Ray 在本地运行,便于更快迭代: -不启用 Ray 在本地运行,便于更快迭代: + ```bash + astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview + ``` -```bash -astuner --conf tutorial/example_werewolves/learn2ask.yaml --backbone='debug' --with-logview -``` + 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与您的代码位置一致。 + +--- + +## 理解实现 + +### 核心流程 + +
+
训练迭代流程
-如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 +
+
    +
  1. 生成游戏设置 -
+生成一局新的游戏设置(玩家、角色分配、初始状态)。 +
  • 模拟对局 -## 3. 理解实现 +调用 AgentScope Workflow 来模拟完整对局。
  • +
  • 智能体决策 -### 3.1 核心流程 +智能体调用可训练模型(`model_tuner`)做决策,对手使用固定模型。
  • +
  • 计算奖励 -从训练迭代视角来看,整体流程可以概括为: -- 生成一局新的游戏设置(玩家、角色分配、初始状态)。 -- 调用 AgentScope Workflow 来模拟完整对局。 -- 智能体 调用可训练模型(`model_tuner`)做决策,对手使用固定模型。 -- 环境产出本局的 reward / outcome。 -- 收集对局轨迹更新可训练模型。 +环境产出本局的 reward / outcome。
  • +
  • 更新模型 -### 3.2 配置说明 +收集对局轨迹更新可训练模型。
  • + + + -本小节对应 `tutorial/example_werewolves/werewolves.yaml`,关键配置项如下: +### 配置说明 -```yaml +关键配置在 `tutorial/example_werewolves/werewolves.yaml`: + +```yaml title="werewolves.yaml" astuner: task_reader: - # random seed to shuffle players - type: random_dummy + type: random_dummy # random seed to shuffle players task_judge: - # 编写并选择评估函数 - # (在本示例中,你可以先将其设为 null,仅依赖 rollout 内部返回的 reward) - judge_protocol: null + judge_protocol: null # 依赖 rollout 内部返回的 reward model: - # 设置需要训练的模型 path: YOUR_MODEL_PATH rollout: - # 选择 AgentScope Workflow 的入口 agentscope_workflow: tutorial.example_werewolves.start->ExampleWerewolves ``` -### 3.3 代码解读 - -- `tutorial/example_werewolves/werewolves.yaml`:将 task reader、judge、model 与 workflow 入口串联起来。 -- `tutorial/example_werewolves/start.py`:AgentScope Workflow 实现(`ExampleWerewolves`)。 -- `tutorial/example_werewolves/game.py`:狼人杀游戏逻辑实现。 -- `tutorial/example_werewolves/prompt.py`:游戏相关的提示词模板。 -- `tutorial/example_werewolves/structured_model.py`:定义了各个角色的输出结构化格式。 -- `tutorial/example_werewolves/utils.py`:包含游戏状态管理和辅助函数。 +### 代码结构 -### 3.4 奖励 +| 文件 | 说明 | +|------|------| +| `tutorial/example_werewolves/werewolves.yaml` | 将 task reader、judge、model 与 workflow 入口串联 | +| `tutorial/example_werewolves/start.py` | AgentScope Workflow 实现(`ExampleWerewolves`) | +| `tutorial/example_werewolves/game.py` | 狼人杀游戏逻辑实现 | +| `tutorial/example_werewolves/prompt.py` | 游戏相关的提示词模板 | +| `tutorial/example_werewolves/structured_model.py` | 各个角色的输出结构化格式 | +| `tutorial/example_werewolves/utils.py` | 游戏状态管理和辅助函数 | -当 `judge_protocol: null` 时,训练默认依赖 rollout / environment 内部给出的 reward 或胜负结果。在本示例中,reward 在 `tutorial/example_werewolves/start.py` 的 workflow 中给出。 +### 奖励机制 -在 `ExampleWerewolves.execute()` 中,workflow 会先运行一整局游戏:调用 `werewolves_game(players, roles)`,并得到 `good_guy_win`(好人阵营是否获胜)。 +当 `judge_protocol: null` 时,训练默认依赖 rollout / environment 内部给出的 reward 或胜负结果。 -随后 reward 采用**回合级别的稀疏胜负奖励**: -- 若 `good_guy_win == True` 且训练目标不是 `werewolf`(即训练好人阵营角色),则 `raw_reward = 1`,并设置 `is_success = True`。 -- 若 `good_guy_win == False` 且训练目标是 `werewolf`(即训练狼人阵营角色),则 `raw_reward = 1`,并设置 `is_success = True`。 -- 其他情况表示训练方阵营未获胜,`raw_reward = 0`,`is_success = False`。 +!!! note "奖励计算规则" + 采用**回合级别的稀疏胜负奖励**: + + | 条件 | 奖励 | 状态 | + |------|------|------| + | 好人阵营获胜 且 训练好人角色 | `raw_reward = 1` | `is_success = True` | + | 狼人阵营获胜 且 训练狼人角色 | `raw_reward = 1` | `is_success = True` | + | 训练方阵营未获胜 | `raw_reward = 0` | `is_success = False` | + | 游戏抛出异常 | `raw_reward = -0.1` | `is_success = False` | -异常/违规惩罚: -- 若游戏过程中抛出异常(对局无法继续等),会统一对可训练目标进行惩罚:`raw_reward = -0.1`,`is_success = False`。 +!!! tip "自定义 Judge" + 如果您希望更细粒度的评估(例如对关键决策给部分分),可以实现自定义 Judge,并在 `astuner.task_judge.judge_protocol` 中启用。 -如果你希望更细粒度的评估(例如对关键决策给部分分、而不仅仅是 win/loss),可以实现自定义 Judge,并在 `astuner.task_judge.judge_protocol` 中启用。 +--- -## 4. 结果 +## 结果 -### 4.1 训练曲线 +### 训练曲线 `Qwen2-7B` 在大约 20 个 step 左右,可以达到约 60% 的胜率。 -![image](https://img.alicdn.com/imgextra/i3/O1CN01ldZYDT1ZqGLHuwsrS_!!6000000003245-2-tps-2000-839.png) +
    +训练曲线 +
    -> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). +!!! info "可视化说明" + 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 -随着训练推进,胜率不断上升。这通常意味着 智能体 在以下两方面变得更稳定: +随着训练推进,胜率不断上升。这通常意味着智能体在以下两方面变得更稳定: -- **角色扮演一致性**: 智能体 学会在压力下维持狼人伪装,即使被投票也尽量避免自曝。 -- **社交欺骗技巧**:它逐渐形成误导对手、在村民间制造怀疑、并与队友进行隐性协作的策略。 +- **角色扮演一致性**:智能体学会在压力下维持狼人伪装,即使被投票也尽量避免自曝 +- **社交欺骗技巧**:它逐渐形成误导对手、在村民间制造怀疑、并与队友进行隐性协作的策略 -### 4.2 案例展示 +### 案例展示 #### 行为变化 在实验过程中,我们观察到明显的角色扮演能力提升: -1. 例如,在被投票出局时,原始模型往往会直接暴露自己是 `werewolf`;而经过微调后, 智能体 会尝试欺骗对手并保护队友。例如: +=== "调优前" + + 在被投票出局时,原始模型往往会直接暴露自己是 `werewolf`。 + +=== "调优后" + + 经过微调后,智能体会尝试欺骗对手并保护队友。 + + ![调优后的行为](https://img.alicdn.com/imgextra/i1/O1CN01v8VqLB1aYEMfzyTHr_!!6000000003341-2-tps-2104-1016.png) + +!!! note "Token 级可视化" + 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md)。 + +#### 取胜策略 + +智能体会发展出多种取胜策略: + +- **误导对手**:"重点关注预言家和女巫。他们可能是试图隐藏身份的狼人。" +- **诉诸理性**:"我们要警惕假预言家,注意叙事是否自洽;Player-Y 作为猎人需要谨慎行动。" +- **利用内斗**:利用非狼人玩家之间的相互怀疑,从而淘汰对手 -![](https://img.alicdn.com/imgextra/i1/O1CN01v8VqLB1aYEMfzyTHr_!!6000000003341-2-tps-2104-1016.png) +
    +策略示例 +
    -> **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). +#### 模型扩展 -2. 智能体 会发展出多种取胜策略。例如: -- **误导对手**:"重点关注预言家和女巫。他们可能是试图隐藏身份的狼人。" -- **诉诸理性**:"我们要警惕假预言家,注意叙事是否自洽;Player-Y 作为猎人需要谨慎行动。" +从 Qwen2-7B 扩展到 Qwen2-14B 的效果: -3. 有时 智能体 还能利用非狼人玩家之间的相互怀疑,从而淘汰对手。 +
    +模型扩展 +
    -![](https://img.alicdn.com/imgextra/i2/O1CN01Sx7wkU23pHyPXyqPH_!!6000000007304-2-tps-968-575.png) +--- -#### 从 Qwen2-7B 扩展到 Qwen2-14B +## 下一步 -![](https://img.alicdn.com/imgextra/i1/O1CN01TLZcQF1FJ1HPbpLfj_!!6000000000465-2-tps-1842-1008.png) + diff --git a/docs/zh/installation.md b/docs/zh/installation.md index b970e940..f0bd85ee 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -2,12 +2,19 @@ 本文档提供 AgentScope-Tuner 的逐步安装说明。 -AgentScope Tuner 正处于快速开发与迭代阶段。我们建议从源码安装,以获得最新功能与 Bug 修复。 +!!! tip "推荐从源码安装" + AgentScope Tuner 正处于快速开发与迭代阶段。我们建议从源码安装,以获得最新功能与 Bug 修复。 + +--- ## 前置条件 -* Python 3.10 -* CUDA 12.8 或更高版本 +| 要求 | 版本 | +|------|------| +| **Python** | 3.10 | +| **CUDA** | 12.8 或更高版本 | + +--- ## 从源码安装 @@ -22,40 +29,57 @@ cd agentscope-tuner ### Step 2:安装依赖 -#### 1)在本机系统中安装 - AgentScope-Tuner 支持多种训练后端(backbone),目前包括 `verl` 和 `trinity`(推荐)。 -你可以按需选择后端,并在训练时自由选择使用其中任意一个。 -我们推荐使用 `uv` 来管理 Python 环境,因为它速度非常快。也可参考 [`uv` 安装文档](https://docs.astral.sh/uv/getting-started/installation/)。 -当然,如果你更希望使用 `conda`,也可以通过 conda + pip 安装(只需将 `uv pip` 替换为 `pip` 即可)。 -* 使用 `trinity` 训练后端安装(推荐) +!!! info "包管理器" + 我们推荐使用 `uv` 来管理 Python 环境,因为它速度非常快。参考 [`uv` 安装文档](https://docs.astral.sh/uv/getting-started/installation/)。 + + 如果您更希望使用 `conda`,也可以通过 conda + pip 安装(只需将 `uv pip` 替换为 `pip` 即可)。 + +=== "Trinity(推荐)" + + 使用 `trinity` 训练后端安装,支持全异步 RFT: + + ```bash + uv venv --python=3.10 + source .venv/bin/activate + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + ``` + +=== "Verl" + + 使用 `verl` 训练后端安装: + + ```bash + uv venv --python=3.10 + source .venv/bin/activate + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + ``` + + !!! warning "flash-attn 安装说明" + `flash-attn` 必须在其他依赖安装完成后再安装。为加快编译速度,可通过 `export MAX_JOBS=${N_CPU}` 设置并行编译数,或确保 GitHub 访问畅通以直接安装预编译轮子。 + +--- + +## 通过 Docker 一键安装 - ```bash - uv venv --python=3.10 - source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache - ``` +如果您希望一键完成依赖安装,我们提供了镜像用于快速上手。 -* 使用 `verl` 训练后端安装 +!!! warning "前置条件" + 在继续之前,请确保您的系统已安装 **nvidia docker**。我们的 Docker 容器内部需要使用 CUDA,因此必须依赖 Nvidia 的工具链来提供 GPU 支持。 - ```bash - source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache # 提示:flash-attn 必须在其他依赖安装完成后再安装,你可以 (1) 通过 export MAX_JOBS=${N_CPU} 加快编译速度,或者 (2) 通过确保 Github 访问畅通来直接安装预编译轮子 - ``` +### 设置 Nvidia Docker Runtime -#### 2)通过 Docker 一键安装 +请在宿主机的 Ubuntu 系统上安装 nvidia docker runtime。详细步骤请参考: -如果你希望一键完成依赖安装,我们提供了镜像用于快速上手。 +- [Nvidia 官方文档](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian) +- [Ubuntu 环境设置指南](./setup_ubuntu.md)(我们的详细安装说明) -在继续之前,请确保你的系统已安装 `nvidia docker`。 -我们的 Docker 容器内部需要使用 CUDA,因此必须依赖 Nvidia 的工具链来提供 GPU 支持。 -请在宿主机的 Ubuntu 系统上安装 nvidia docker runtime。具体步骤可参考 [nvidia official document](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian)。 -基于上述链接,我们也编写了一份在 Ubuntu Linux 环境中安装 nvidia docker runtime 的说明文档,请阅读 [set up nvidia docker environment](./setup_ubuntu.md)。 +### 运行 Docker 容器 -以下命令会将你当前工作目录(agentscope-tuner 的根目录)挂载到容器内的 `/workspace`,并将你的数据目录挂载到容器内的 `/data`。 +以下命令会将您当前工作目录(agentscope-tuner 的根目录)挂载到容器内的 `/workspace`,并将您的数据目录挂载到容器内的 `/data`: ```bash docker run -it \ @@ -66,3 +90,45 @@ docker run -it \ -v /path/to/your/checkpoint/and/data:/data \ agentscope-tuner:latest ``` + +--- + +## 验证安装 + +安装完成后,验证一切是否正常工作: + +```python +import agentscope_tuner +print(agentscope_tuner.__version__) +``` + +--- + +## 常见问题 + +??? note "flash-attn 安装失败" + **问题**:`flash-attn` 安装失败 + + **解决方案**:确保已安装 CUDA 工具包,并设置 `MAX_JOBS` 环境变量: + ```bash + export MAX_JOBS=4 + uv pip install flash-attn --no-build-isolation + ``` + +??? note "GPU 未检测到" + **问题**:Docker 容器无法识别 GPU + + **解决方案**:确保 nvidia-docker 已正确安装: + ```bash + nvidia-smi # 应该显示 GPU 信息 + docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi + ``` + +--- + +## 下一步 + + diff --git a/docs/zh/intro.md b/docs/zh/intro.md index 3ad55e75..8f8700e7 100644 --- a/docs/zh/intro.md +++ b/docs/zh/intro.md @@ -1,107 +1,130 @@ # 项目简介 -**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的 智能体 和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 -您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的 智能体 达到最佳性能! +您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的智能体达到最佳性能! --- -### ✨ 特性 +## 特性 我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: -* **简单友好**:ASTuner 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 -* **丰富的教程库**:ASTuner 提供了丰富的[示例库](#id6)作为学习教程。 -* **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 -* **灵活且快速**:ASTuner 支持 [多智能体工作流](./workflow.md),并采用了上下文合并技术。当工作流涉及多轮(或多智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 -* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 +
    -针对进阶研究者,ASTuner 还提供了高分辨率的日志记录和调试方案: +-  **简单友好** — ASTuner 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 -* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和智能体诊断。 -* **快速调试**:ASTuner 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 +-  **丰富的教程库** — ASTuner 提供了丰富的[示例库](#example-library)作为学习教程。 + - 数学智能体、狼人杀游戏、AppWorld 等 查看示例 ---- +-  **高效且可扩展** — 默认使用 [Trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。 + - 支持 [verl](./installation.md) 后端作为备选方案 了解更多 -### 🚀 快速上手 +
    -#### 安装 +!!! tip "多智能体支持" + ASTuner 支持 [多智能体工作流](./workflow.md),并采用上下文合并技术,当工作流涉及多轮(或多智能体)对话时,可将训练速度提升 **1.5 倍至 20 倍**。 -我们推荐使用 `uv` 进行依赖管理。 +!!! info "可靠性与可复现性" + 我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现。 -1. **克隆仓库**: +### 面向进阶研究者 -```bash -git clone https://github.com/agentscope-ai/agentscope-tuner.git -cd agentscope-tuner +ASTuner 还提供了高分辨率的日志记录和调试方案: -``` +| 功能 | 说明 | +|------|------| +| **高分辨率日志** | 保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs | +| **快速调试** | 使用 `--backbone=debug` 选项,将代码修改后的等待时间从分钟级缩短至秒级 | -2. **设置环境**: +--- -```bash -uv venv --python=3.10.16 && source .venv/bin/activate -uv pip install -e .[trinity] -# 注意:flash-attn 必须在其他依赖安装完成后安装 -uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir +## 快速上手 -``` +### 安装 + +我们推荐使用 `uv` 进行依赖管理。 + +=== "步骤 1:克隆仓库" -#### 运行训练 + ```bash + git clone https://github.com/agentscope-ai/agentscope-tuner.git + cd agentscope-tuner + ``` -您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个智能体。以 [数学 智能体](./example_math_agent.md) 为例: +=== "步骤 2:设置环境" + + ```bash + uv venv --python=3.10.16 && source .venv/bin/activate + uv pip install -e .[trinity] + # 注意:flash-attn 必须在其他依赖安装完成后安装 + uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir + ``` + +### 运行训练 + +您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个智能体: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray - ``` -#### 示例库 +!!! example "了解更多" + 查看 [数学智能体](./example_math_agent.md) 示例获取详细说明。 + +--- + +## 示例库 {#example-library} 探索我们丰富的示例库,开启您的探索之旅: -* 🔢 **[训练一个可以编写 Python 代码的数学智能体](./example_math_agent.md)**。 -* 📱 **[使用 AgentScope 创建并训练 AppWorld 智能体](./example_app_world.md)**。 -* 🐺 **[开发并训练“狼人杀”RPG 智能体](./example_werewolves.md)**。 -* 👩🏻‍⚕️ **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 -* 🎴 **[使用 AgentScope 编写并解决“倒计时”游戏](./example_countdown.md)**。 -* 🚶 **[使用 ASTuner 解决“冰湖”行走谜题](./example_frozenlake.md)**。 + --- -### 🧩 核心概念 +## 核心概念 ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。
    -image - +ASTuner 架构图
    -#### 1. 以用户为中心的接口 +### 1. 以用户为中心的接口 为了优化智能体,您需要提供三个核心输入: -* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义您的智能体逻辑,支持简单的智能体设置以及高级的多智能体协作。 -* **[任务读取器 (Task Reader)](./data_pipeline.md)**:从 JSONL 文件、HuggingFace 数据集、交互式环境加载训练任务,或从文档自动生成任务。 -* **[任务判别器 (Task Judger)](./task_judger.md)**:评估智能体输出并分配奖励(Reward)以指导训练。 + -#### 2. 内部系统架构 +### 2. 内部系统架构 内部系统协调多个专门模块,以处理强化学习(RL)训练和智能体交互的复杂性。 -* **启动器 (Launcher)**:管理后台服务进程(Ray, vLLM)并路由后端。 -* **任务读取器 (Task Reader)**:处理数据摄取、增强和过滤。 -* **任务展开 (Task Rollout)**:连接大语言模型(LLM)引擎并管理 Gym 环境生命周期。 -* **任务运行器 (Task Runner)**:执行 AgentScope 工作流并计算奖励。 -* **模型微调器 (Model Tuner)**:将工作流中的推理请求转发至 LLM 引擎。 -* **上下文追踪器 (Context Tracker)**:监控 LLM 调用,并自动合并共享历史的时间线,将训练效率提升 **3 到 10 倍**。 +| 模块 | 说明 | +|------|------| +| **启动器 (Launcher)** | 管理后台服务进程(Ray, vLLM)并路由后端 | +| **任务读取器 (Task Reader)** | 处理数据摄取、增强和过滤 | +| **任务展开 (Task Rollout)** | 连接大语言模型(LLM)引擎并管理 Gym 环境生命周期 | +| **任务运行器 (Task Runner)** | 执行 AgentScope 工作流并计算奖励 | +| **模型微调器 (Model Tuner)** | 将工作流中的推理请求转发至 LLM 引擎 | +| **上下文追踪器 (Context Tracker)** | 监控 LLM 调用,并自动合并共享历史的时间线(**3-10 倍**效率提升) | --- -### 🚦 导航 +## 下一步 -* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个智能体](./tutorial.md) —— 初学者的必经之路。 -* 🛠️ **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 -* 💡 **示例**:查看上方的 [示例库](#example-librar),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 -* ⚙️ **深入了解**:掌握高级 [配置方案](./configuration.md)。 + diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index 95838480..9d94c808 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -6,7 +6,7 @@ --- -### ✨ 特性 +### 特性 我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: @@ -23,7 +23,7 @@ --- -### 🚀 快速上手 +### 快速上手 #### 安装 @@ -60,16 +60,16 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 探索我们丰富的示例库,开启您的探索之旅: -* 🔢 **[训练一个可以编写 Python 代码的数学智能体](./example_math_agent.md)**。 -* 📱 **[使用 AgentScope 创建并训练 AppWorld 智能体](./example_app_world.md)**。 -* 🐺 **[开发并训练“狼人杀”RPG智能体](./example_werewolves.md)**。 -* 👩🏻‍⚕️ **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 -* 🎴 **[使用 AgentScope 编写并解决“倒计时”游戏](./example_countdown.md)**。 -* 🚶 **[使用 ASTuner 解决“冰湖”行走谜题](./example_frozenlake.md)**。 +* **[训练一个可以编写 Python 代码的数学智能体](./example_math_agent.md)**。 +* **[使用 AgentScope 创建并训练 AppWorld 智能体](./example_app_world.md)**。 +* **[开发并训练"狼人杀"RPG智能体](./example_werewolves.md)**。 +* **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 +* **[使用 AgentScope 编写并解决"倒计时"游戏](./example_countdown.md)**。 +* **[使用 ASTuner 解决"冰湖"行走谜题](./example_frozenlake.md)**。 --- -### 🧩 核心概念 +### 核心概念 ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。 @@ -99,9 +99,9 @@ ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调 --- -### 🚦 导航 +### 导航 -* 📖 **教程**:从 [安装](./installation.md) 到 [微调您的第一个智能体](./tutorial.md) —— 初学者的必经之路。 -* 🛠️ **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 -* 💡 **示例**:查看上方的 [示例库](#example-librar),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 -* ⚙️ **深入了解**:掌握高级 [配置方案](./configuration.md)。 +* **教程**:从 [安装](./installation.md) 到 [微调您的第一个智能体](./tutorial.md) —— 初学者的必经之路。 +* **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 +* **示例**:查看上方的 [示例库](#example-librar),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 +* **深入了解**:掌握高级 [配置方案](./configuration.md)。 diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md index b9c3b534..2ea4c014 100644 --- a/docs/zh/quickstart.md +++ b/docs/zh/quickstart.md @@ -1,43 +1,82 @@ # 快速开始 -AgentScope Tuner 提供了一套完整的智能体调优功能。你可以立刻尝试启动一个智能体的训练: +AgentScope Tuner 提供了一套完整的智能体调优功能。您可以立刻尝试启动一个智能体的训练: ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -### 最小示例 +--- + +## 最小示例 我们从最简单的示例开始:一个带工具调用的数学智能体。 -* 首先,请查看 [installation guide](./installation.md) 来搭建训练环境。 -* 然后,使用下面的最小示例来调优你的第一个模型(假设你已经编写了一个名为 `MathToolWorkflow` 的智能体)。 +
    +
    快速上手流程
    + +
    +
      +
    1. 设置环境 + +查看 [安装指南](./installation.md) 来搭建训练环境。
    2. +
    3. 定义工作流 + +编写一个继承自 Workflow 基类的 Agent 类(例如 `MathToolWorkflow`)。
    4. +
    5. 配置并运行 + +使用 `AstunerJob` API 配置并启动训练。
    6. +
    +
    +
    + +### 代码示例 + +```python title="train_math_agent.py" +from agentscope_tuner import AstunerJob +from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow + +model_path = "YOUR_MODEL_PATH" +job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) +job.set_workflow(MathToolWorkflow) +job.set_data(type="hf", dataset_path='openai/gsm8k') + +# [可选] 保存 yaml 文件以便手动调整 +# job.dump_job_as_yaml('saved_experiments/math.yaml') + +# [可选] 从手动调整后的 yaml 文件加载 +# job.load_job_from_yaml('saved_experiments/math.yaml') + +# 开始训练 +tuned_model = job.tune() +``` + +!!! tip "命令行替代方案" + 上述代码等价于在终端执行: + ```bash + astuner --conf ./saved_experiments/math.yaml + ``` - ```python - from agentscope_tuner import AstunerJob - from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow - model_path = "YOUR_MODEL_PATH" - job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) - job.set_workflow(MathToolWorkflow) - job.set_data(type="hf", dataset_path='openai/gsm8k') - # [可选:保存 yaml 文件以便手动调整] job.dump_job_as_yaml('saved_experiments/math.yaml') - # [可选:从手动调整后的 yaml 文件加载] job.load_job_from_yaml('saved_experiments/math.yaml') - tuned_model = job.tune() # 等价于在终端执行 `astuner --conf ./saved_experiments/math.yaml` - ``` +--- -### 浏览示例 +## 浏览示例 -浏览我们丰富的示例库,为你的旅程快速起步: +探索我们丰富的示例库,为您的旅程快速起步: -* 🔢 [**训练一个能写 python 代码的数学智能体**](./example_math_agent.md)。 -* 📱 [**使用 AgentScope 创建 AppWorld 智能体并训练它**](./example_app_world.md)。 -* 🐺 [**开发狼人杀 RPG 智能体并训练它们**](./example_werewolves.md)。 -* 👩🏻‍⚕️ [**学习像医生一样提问**](./example_learning_to_ask.md)。 -* 🎴 [**使用 AgentScope 编写倒计时游戏并求解**](./example_countdown.md)。 -* 🚶 [**使用 ASTuner 解决 Frozen Lake 行走谜题**](./example_frozenlake.md)。 + -### 从零开始调优你的第一个智能体 +--- -开始构建你自己的智能体,并按照我们的文档进行调优: +## 下一步 -* 📚 [**调优你的第一个智能体**](./tune_your_first_agent.md)。 + diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md index 2d01867e..5f04e954 100644 --- a/docs/zh/task_judger.md +++ b/docs/zh/task_judger.md @@ -8,10 +8,13 @@ Task Judger 用于在训练过程中评估智能体(agent)的输出,并据 Task Judger 会评估智能体的执行结果,并返回两个值: -* **`raw_reward`** (`float`):表示输出质量的数值分数(通常为 0.0 到 1.0) -* **`is_success`** (`bool`):任务是否成功完成 +| 返回值 | 类型 | 说明 | +|--------|------|------| +| `raw_reward` | `float` | 表示输出质量的数值分数(通常为 0.0 到 1.0) | +| `is_success` | `bool` | 任务是否成功完成 | -这两个值会引导 RL 训练过程,帮助智能体学习哪些行为能带来更好的结果。 +!!! info "奖励的作用" + 这两个值会引导 RL 训练过程,帮助智能体学习哪些行为能带来更好的结果。 --- @@ -19,7 +22,7 @@ Task Judger 会评估智能体的执行结果,并返回两个值: 所有 Task Judger 都继承自 `BaseJudge`,并实现 `compute_reward` 方法: -```python +```python title="base_judge.py" from agentscope_tuner.task_judge.base_judge import BaseJudge from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask @@ -49,19 +52,25 @@ class BaseJudge: AgentScope Tuner 提供了 4 个内置评测器,用于覆盖常见的评测场景: -### 1. MathAnswerAsJudge +
    +

    MathAnswerAsJudge

    精确字符串匹配,适用于数学答案评测。

    +

    CountdownAnswerAsJudge

    支持部分奖励的数学等式评测。

    +

    EnvServiceJudge

    委托外部环境服务进行评测。

    +

    AutoGraderJudge

    通过 LLM 自动生成评测 Rubric。

    +
    -通过**精确字符串匹配**来评估数学答案,适用于答案以 LaTeX `\boxed{}` 形式输出的任务。 +--- -**适用场景:** +### 1. MathAnswerAsJudge -* 数学解题类任务 -* 答案确定且唯一的任务 -* 答案格式为 `\boxed{result}` +通过**精确字符串匹配**来评估数学答案,适用于答案以 LaTeX `\boxed{}` 形式输出的任务。 -**配置方式:** +!!! tip "适用场景" + - 数学解题类任务 + - 答案确定且唯一的任务 + - 答案格式为 `\boxed{result}` -```yaml +```yaml title="配置方式" astuner: task_judge: judge_type: customized_protocol @@ -74,26 +83,23 @@ astuner: 2. 与 `workflow_task.task.metadata["answer"]` 中的参考答案进行比对 3. 正确返回 `(1.0, True)`,否则返回 `(0.0, False)` -**必需的 metadata:** - -* `workflow_output.metadata["final_answer"]`:智能体答案(包含 `\boxed{}` 格式) -* `workflow_task.task.metadata["answer"]`:参考答案 +| 必需的 metadata | 说明 | +|-----------------|------| +| `workflow_output.metadata["final_answer"]` | 智能体答案(包含 `\boxed{}` 格式) | +| `workflow_task.task.metadata["answer"]` | 参考答案 | --- ### 2. CountdownAnswerAsJudge -评估数学等式,并支持对“格式正确但结果错误”的输出给予**部分奖励**。 +评估数学等式,并支持对"格式正确但结果错误"的输出给予**部分奖励**。 -**适用场景:** +!!! tip "适用场景" + - 数字谜题类任务(例如 Countdown game) + - 需要部分得分的任务 + - 希望即使答案不对,也能奖励良好格式的场景 -* 数字谜题类任务(例如 Countdown game) -* 需要部分得分的任务 -* 希望即使答案不对,也能奖励良好格式的场景 - -**配置方式:** - -```yaml +```yaml title="配置方式" astuner: task_judge: judge_type: customized_protocol @@ -102,15 +108,11 @@ astuner: **评分规则:** -* `0.0`:答案无效或缺失 -* `0.1`:等式格式正确,但结果错误 -* `1.0`:等式与结果都正确 - -**必需的 metadata:** - -* `workflow_output.metadata["final_answer"]`:等式字符串(包含 `\boxed{}` 格式) -* `workflow_output.metadata["target"]`:目标数字 -* `workflow_output.metadata["nums"]`:可用数字列表(构造等式所允许使用的数字) +| 分数 | 条件 | +|------|------| +| `0.0` | 答案无效或缺失 | +| `0.1` | 等式格式正确,但结果错误 | +| `1.0` | 等式与结果都正确 | --- @@ -118,15 +120,12 @@ astuner: 将评测委托给外部环境服务,适用于复杂的交互式环境。 -**适用场景:** - -* 依赖外部模拟器的任务(例如 AppWorld) -* 基于状态的复杂评估 -* 环境自身带有 evaluator 的交互式任务 +!!! tip "适用场景" + - 依赖外部模拟器的任务(例如 AppWorld) + - 基于状态的复杂评估 + - 环境自身带有 evaluator 的交互式任务 -**配置方式:** - -```yaml +```yaml title="配置方式" astuner: task_judge: judge_type: customized_protocol @@ -137,9 +136,8 @@ astuner: 1. 调用 `workflow_task.gym_env.evaluate()` 从环境获取 score 2. 将 score 转换为归一化 reward: - - * 成功(score ≥ 1):`1.0 + score * 0.5` - * 失败(score < 1):`0.0 + score * 0.5` + - 成功(score ≥ 1):`1.0 + score * 0.5` + - 失败(score < 1):`0.0 + score * 0.5` --- @@ -147,41 +145,29 @@ astuner: 通过 LLM 自动从参考样本生成评测 Rubric,用于主观性较强的评测任务。 -**适用场景:** - -* 主观评测任务(例如写作质量、对话连贯性) -* 没有明确标准答案的任务 -* 有标注训练样本,但需要更灵活的评测标准 +!!! tip "适用场景" + - 主观评测任务(例如写作质量、对话连贯性) + - 没有明确标准答案的任务 + - 有标注训练样本,但需要更灵活的评测标准 -**配置方式:** - -```yaml +```yaml title="配置方式" astuner: task_judge: judge_type: rubrics_auto_grader rubrics_auto_grader: - # 用于 rubric 生成与评测的模型 - model_name: "qwen-plus" # or "gpt-4", "claude-3-sonnet" - api_key: "your-api-key" # or set DASHSCOPE_API_KEY env var - - # 评测模式 - grader_mode: "pointwise" # or "listwise" for ranking multiple outputs - language: "en" # or "zh" - - # pointwise 模式配置 - min_score: 0 + model_name: "qwen-plus" # 用于 rubric 生成与评测的模型 + api_key: "your-api-key" # 或设置 DASHSCOPE_API_KEY 环境变量 + grader_mode: "pointwise" # 或 "listwise" 用于排序多个输出 + language: "en" # 或 "zh" + min_score: 0 # pointwise 模式配置 max_score: 10 - - # 用于 rubric 生成的参考数据 input_data_type: "dataset_file" dataset_file: training: file_path: "path/to/rubrics_train.jsonl" - - # 字段映射 - query_field: "main_query" # query 对应字段名 - answer_field: "final_answer" # workflow output 中的字段 - reference_field: "answer" # task metadata 中的字段 + query_field: "main_query" # query 对应字段名 + answer_field: "final_answer" # workflow output 中的字段 + reference_field: "answer" # task metadata 中的字段 ``` **工作原理:** @@ -189,45 +175,43 @@ astuner: 1. **训练阶段**:基于带标注的样本,通过迭代式优化生成 rubrics 2. **评测阶段**:使用生成的 rubrics,通过 LLM 调用对新输出打分 -**所需数据格式:** - -**pointwise** 模式(对单个输出打分): - -```json -{ - "main_query": "Explain quantum entanglement", - "metadata": { - "answer": "Quantum entanglement is...", - "score": 8 - } -} -``` - -**listwise** 模式(对多个候选输出排序): - -```json -{ - "main_query": "Write a poem about spring", - "metadata": { - "candidates": [ - {"answer": "Flowers bloom...", "rank": 1}, - {"answer": "Spring is here...", "rank": 2} - ] - } -} -``` +=== "Pointwise 模式(单个输出打分)" + + ```json + { + "main_query": "Explain quantum entanglement", + "metadata": { + "answer": "Quantum entanglement is...", + "score": 8 + } + } + ``` + +=== "Listwise 模式(多个候选输出排序)" + + ```json + { + "main_query": "Write a poem about spring", + "metadata": { + "candidates": [ + {"answer": "Flowers bloom...", "rank": 1}, + {"answer": "Spring is here...", "rank": 2} + ] + } + } + ``` --- ## 创建自定义 Task Judger -当你有更专门的评测需求时,可以通过继承 `BaseJudge` 来实现自己的评测器。 +当您有更专门的评测需求时,可以通过继承 `BaseJudge` 来实现自己的评测器。 ### Step 1:实现评测器 创建一个新文件(例如 `tutorial/my_task/my_judge.py`): -```python +```python title="my_judge.py" import re from agentscope_tuner.task_judge.base_judge import BaseJudge from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask @@ -235,7 +219,6 @@ from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask class MyCustomJudge(BaseJudge): def __init__(self, config): super().__init__(config) - # 初始化所需资源(例如外部 API、模型等) self.threshold = 0.8 def compute_reward( @@ -245,22 +228,20 @@ class MyCustomJudge(BaseJudge): ) -> tuple: # 从 workflow_output 中读取数据 agent_answer = workflow_output.metadata.get("final_answer", "") - + # 从 workflow_task 中读取参考答案 reference_answer = workflow_task.task.metadata.get("answer", "") - + # 自定义评测逻辑 similarity = self._compute_similarity(agent_answer, reference_answer) - + # 基于阈值判断是否成功 is_success = similarity >= self.threshold - - # 返回 (reward, success) + return similarity, is_success def _compute_similarity(self, text1: str, text2: str) -> float: - # 自定义相似度度量 - # 这里只是一个简单示例 + # 自定义相似度度量(这里只是示例) return len(set(text1.split()) & set(text2.split())) / max( len(text1.split()), len(text2.split()), 1 ) @@ -268,9 +249,7 @@ class MyCustomJudge(BaseJudge): ### Step 2:配置评测器 -在 YAML 配置中: - -```yaml +```yaml title="config.yaml" astuner: task_judge: judge_type: customized_protocol @@ -281,7 +260,7 @@ astuner: 在 workflow 中,将评测器所需字段写入 `workflow_output.metadata`: -```python +```python title="workflow.py" class MyWorkflow(Workflow): async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: # 智能体逻辑 @@ -292,7 +271,7 @@ class MyWorkflow(Workflow): reward=None, # 将由 judger 填充 metadata={ "final_answer": final_answer, - # 添加其他你的 judger 需要的字段 + # 添加其他您的 judger 需要的字段 } ) ``` @@ -301,23 +280,23 @@ class MyWorkflow(Workflow): ## 配置速查 -### 使用内置 Judger - -```yaml -astuner: - task_judge: - judge_type: customized_protocol - judge_protocol: agentscope_tuner.task_judge.-> -``` - -### 使用 Auto Grader - -```yaml -astuner: - task_judge: - judge_type: rubrics_auto_grader - rubrics_auto_grader: - model_name: "qwen-plus" - grader_mode: "pointwise" - # ... 其他配置 -``` +=== "使用内置 Judger" + + ```yaml + astuner: + task_judge: + judge_type: customized_protocol + judge_protocol: agentscope_tuner.task_judge.-> + ``` + +=== "使用 Auto Grader" + + ```yaml + astuner: + task_judge: + judge_type: rubrics_auto_grader + rubrics_auto_grader: + model_name: "qwen-plus" + grader_mode: "pointwise" + # ... 其他配置 + ``` diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index e344ffea..db929208 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -1,20 +1,41 @@ # 训练你的第一个智能体 +在本文档中,我们会从零开始,带你实现并训练一个能够使用 Python 进行计算、解决复杂数学问题的智能体。 -在本文档中,我们会从零开始,带你实现并训练这样一个能够使用 Python 进行计算、解决复杂数学问题的智能体。 +--- -我们将依次完成以下步骤: +## 学习路径 -1. 训练数据与环境准备 -2.智能体与可训练 workflow 的定义 -3. Reward 计算 -4. 训练参数设置 -5. 调试 -6. 开始训练 & 监测指标 +
    +
    完整训练流程
    -完成整个过程后,你将得到一个可在数学任务环境中使用的 Math 智能体,理解 AgentScope Tuner 中的核心概念,并学会如何设计你自己的训练流程。 +
    +
      +
    1. 准备目录 + +创建项目结构和配置文件。
    2. +
    3. 配置参数 + +设置项目名称和基础配置。
    4. +
    5. 准备训练数据 + +配置数据源和加载方式。
    6. +
    7. 准备 Workflow + +定义智能体行为和奖励计算。
    8. +
    9. 调试与训练 + +验证代码并启动正式训练。
    10. +
    +
    +
    + +完成整个过程后,您将得到一个可在数学任务环境中使用的 Math 智能体,理解 AgentScope Tuner 中的核心概念,并学会如何设计您自己的训练流程。 + +--- ## 准备目录 + 首先,我们为训练准备一个目录: ```bash @@ -24,19 +45,21 @@ touch math_agent.yaml touch workflow.py ``` -在执行上述命令后,当前目录应当包含以下文件: +执行上述命令后,当前目录应当包含以下文件: ``` /math_agent - /math_agent.yaml # 配置文件 - /workflow.py # 训练 workflow,将包含智能体和环境交互的定义 + /math_agent.yaml # 配置文件 + /workflow.py # 训练 workflow,包含智能体和环境交互的定义 ``` +--- + ## 配置参数 -我们在配置文件中为项目起一个闪亮的名字: +我们在配置文件中为项目起一个名字: -```yaml +```yaml title="math_agent.yaml" astuner: project_name: math_agent @@ -55,24 +78,29 @@ defaults: - _self_ ``` -## 准备训练数据 -智能体需要在指定的任务环境下,使用训练数据驱动进行训练。本节中我们首先解决数据和环境的问题。 +--- -ASTuner 提供了多种读取数据的方式: +## 准备训练数据 -- 从本地硬盘中的文件读取 -- 从 Hugginface Repo 中读取 -- 从 EnvService 中读取 +智能体需要在指定的任务环境下,使用训练数据驱动进行训练。 -所有数据在读取后,都会被转换为 ASTuner 中统一的数据格式。 +!!! info "支持的数据源" + ASTuner 提供了多种读取数据的方式: + + - 从本地硬盘中的文件读取 + - 从 HuggingFace Repo 中读取 + - 从 EnvService 中读取 + + 所有数据在读取后,都会被转换为 ASTuner 中统一的数据格式。 -在本示例中,我们将直接从 Huggingface Repo 获取 `openai/gsm8k` 作为训练数据。 +在本示例中,我们将直接从 HuggingFace Repo 获取 `openai/gsm8k` 作为训练数据。 -> `openai/gsm8k` 是一个经典的数学问题数据集。 +!!! tip "关于 GSM8K" + `openai/gsm8k` 是一个经典的数学问题数据集,非常适合用于训练数学推理智能体。 -我们在 `math_agent.yaml` 中写入: +在 `math_agent.yaml` 中添加数据配置: -```yaml +```yaml title="math_agent.yaml" astuner: project_name: math_agent task_reader: @@ -87,20 +115,31 @@ astuner: max_response_length: 10000 ``` -在这段配置中,我们: -- 指定使用 huggingface_dat_repo 读取器,并设置了 dataset 的 path,以及训练集与验证集划分的名称 -- 设置了数据的 batch size(训练参数),并指定了数据的最长输入长度、最长回复长度(答案长度) +| 配置项 | 说明 | +|--------|------| +| `type` | 指定使用 `huggingface_dat_repo` 读取器 | +| `dataset_path` | HuggingFace 上的数据集路径 | +| `training_split` | 训练集划分名称 | +| `validation_split` | 验证集划分名称 | +| `train_batch_size` | 每批次的任务数量 | +| `max_prompt_length` | 输入的最大 token 长度 | +| `max_response_length` | 回复的最大 token 长度 | 至此,我们就完成了数据相关的全部配置,剩余的工作将由 ASTuner 自动完成。 +--- + ## 准备 Workflow + 在 ASTuner 中,workflow 是进行训练的基本单元。它定义了智能体的行为、工具、上下文等,智能体与环境交互的具体流程,以及 Reward 的计算方法。 我们将在 `workflow.py` 中实现我们的 workflow。 -首先,我们引入 agentscope 的必要依赖,并设计一个 Agent: +### 定义 Agent + +首先,引入 agentscope 的必要依赖,并设计一个 Agent: -```python +```python title="workflow.py" from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -119,7 +158,7 @@ toolkit.register_tool_function(execute_python_code) ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model= #暂时留空, + model= # 暂时留空, formatter=DashScopeChatFormatter(), toolkit=toolkit, memory=InMemoryMemory(), @@ -127,17 +166,21 @@ ReActAgent( ) ``` -通过这段代码,我们快速地定义了一个完整的 ReAct智能体: -- 使用 ReAct 范式与环境/工具交互 -- 设置了 system prompt -- 注册了一个工具:执行 Python 代码 -- 实现了 in-memory 的记忆机制 +!!! note "ReActAgent 说明" + 通过这段代码,我们定义了一个完整的 ReAct 智能体: + + - 使用 ReAct 范式与环境/工具交互 + - 设置了 system prompt + - 注册了一个工具:执行 Python 代码 + - 实现了 in-memory 的记忆机制 + + 更多具体的配置可参考 AgentScope 官方文档。 -> 更多具体的配置可参考 AgentScope 官方文档。 +### 封装为 Workflow -接下来,我们实现训练该智能体的其余代码: +接下来,将智能体封装进一个 Workflow 类中: -```python +```python title="workflow.py" from agentscope_tuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from loguru import logger @@ -184,112 +227,102 @@ class MathAgentWorkflow(Workflow): self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner # use model_tuner as model, + model=model_tuner, # 使用 model_tuner 作为模型 formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), max_iters=2, ) - # disable console output + # 禁用控制台输出 self.agent.set_console_output_enabled(False) msg = Msg("user", query, role="user") - # call agent to do task + # 调用智能体执行任务 result = await self.agent.reply(msg) - # extract the final answer + # 提取最终答案 final_answer = extract_final_answer(result) - # bring final answer to the output + # 将答案封装为输出 return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` -在这段代码中,我们将智能体封装进一个 Workflow 中,并实现了其中的 `execute` 函数: -1. 从 `WorkflowTask` 中取出输入 -2. 用与前面相同的方式构造智能体,但 **指定 model 为 model_tuner** —— 这是使智能体可被训练的关键 -3. 执行智能体 -4. 解析智能体输出,并将答案封装为 `WorkflowOutput` 返回 +!!! warning "关键点:model_tuner" + 在构造智能体时,**必须将 model 参数设置为 model_tuner**,这是使智能体可被训练的关键! -在定义好 workflow 后,我们还需要告诉 ASTuner 使用这个 class 作为训练协议。在 `math_agent.yaml` 中写入: +### 配置 Workflow 和 Reward -```yaml +在 `math_agent.yaml` 中添加 workflow 和奖励配置: + +```yaml title="math_agent.yaml" astuner: # ... rollout: agentscope_workflow: workflow.py->MathAgentWorkflow -``` -我们还有一件事情尚未解决:Reward。幸运的是,ASTuner 同样支持通过配置自定义 Reward 计算方法。继续在配置中写入: - -```yaml -astuner: - #... task_judge: judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge ``` -这里我们直接使用 ASTuner 内部提供的 math judge。Judge 会读取 metadata 中的 final_answer,并与数据集中的 ground_truth 对比来得到评分。 +!!! info "关于 Judge" + 这里我们使用 ASTuner 内部提供的 math judge。Judge 会读取 metadata 中的 `final_answer`,并与数据集中的 ground_truth 对比来得到评分。 + +--- ## 设置必要的参数 -接下来,为了正式开始训练,还需要补充一些必要的参数配置。 ### 预训练模型 -在 `math_agent.yaml` 中指定 智能体 使用的 LLM,也就是我们将要训练的模型: -```yaml +在 `math_agent.yaml` 中指定智能体使用的 LLM,也就是我们将要训练的模型: + +```yaml title="math_agent.yaml" astuner: model: path: Qwen/Qwen2.5-14B-Instruct ``` -这里的 path 既支持 Huggingface Repo 中的远程地址,也可以是本地目录路径。 +!!! tip "模型来源" + `path` 既支持 HuggingFace Repo 中的远程地址,也可以是本地目录路径。 ### 训练参数 -我们还需要设置一些必要的训练参数: -```yaml +添加必要的训练参数配置: + +```yaml title="math_agent.yaml" astuner: # ... rollout: agentscope_workflow: workflow.py->MathAgentWorkflow - # 模型温度 - temperature: 0.7 - # 最大的 rollout 多线程数量 - max_env_worker: 64 - num_repeat: 4 - # 模型乱码输出时的强制 reward - agent_madness_reward: 0.0 - # vllm 的并行参数 - tensor_model_parallel_size: 1 - # vllm 最大的并行 sequence 数量 - max_num_seqs: 40 + temperature: 0.7 # 模型温度 + max_env_worker: 64 # 最大的 rollout 多线程数量 + num_repeat: 4 # 每个任务重复次数 + agent_madness_reward: 0.0 # 模型乱码输出时的强制 reward + tensor_model_parallel_size: 1 # vllm 的并行参数 + max_num_seqs: 40 # vllm 最大的并行 sequence 数量 multi_turn: max_sample_per_task: 4 - # 检查的模型乱码输出类型:无意义内容、错误的 tollcall - compute_madness_checklist: + compute_madness_checklist: # 检查的模型乱码输出类型 - "nonsense" - "wrong_toolcall" - # 一轮交互中的最长回复长度 - max_response_length_in_one_turn: 1024 - # 模型的最长上下文长度 - max_model_len: 13000 + max_response_length_in_one_turn: 1024 # 一轮交互中的最长回复长度 + max_model_len: 13000 # 模型的最长上下文长度 trainer_common: - # 保存周期(每 n 步保存一次) - save_freq: 99999 - # 验证周期(每 n 步验证一次) - test_freq: 99999 - # 训练 epoch 总量 - total_epochs: 99999 - # vllm engine 数量,必须能够整除 tensor_model_parallel_size - trinity_only__n_vllm_engine: 2 + save_freq: 99999 # 保存周期(每 n 步保存一次) + test_freq: 99999 # 验证周期(每 n 步验证一次) + total_epochs: 99999 # 训练 epoch 总量 + trinity_only__n_vllm_engine: 2 # vllm engine 数量 trinity: trainer: max_token_len_per_gpu: 13000 ``` +--- + ## 调试 + 到目前为止,我们已经完成了训练一个智能体所需的全部代码与配置。 -接下来,我们将在 debug 模式下启动训练流程,检查代码是否有误。你也可以跳过这一步,直接开始训练。 +!!! tip "推荐调试模式" + 接下来,我们将在 debug 模式下启动训练流程,检查代码是否有误。您也可以跳过这一步,直接开始训练。 使用 debug 模式启动训练: @@ -297,9 +330,14 @@ trinity: astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview ``` -debug 模式不会启动 ray 集群,非常适合单机代码调试。另外,我们也可以编写 VS Code 的 `.vscode/launch.json` 进行便捷的断点调试: +!!! info "Debug 模式特点" + debug 模式不会启动 ray 集群,非常适合单机代码调试。 + +### VS Code 断点调试 + +编写 VS Code 的 `.vscode/launch.json` 进行便捷的断点调试: -```json +```json title=".vscode/launch.json" { "version": "0.2.0", "configurations": [ @@ -319,16 +357,26 @@ debug 模式不会启动 ray 集群,非常适合单机代码调试。另外, } ``` +--- + ## 训练 -当调试完成后,即可开始训练: + +调试完成后,即可开始正式训练: + ```bash astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -你可以在 `./launcher_record/{exp_yaml_file_name}` 目录下找到训练日志和 checkpoint。 +!!! success "训练输出" + 您可以在 `./launcher_record/{exp_yaml_file_name}` 目录下找到训练日志和 checkpoint。 +--- -## 阅读更多 +## 了解更多 -我们还在左侧边栏提供了更多详细的使用案例和教程,包括数据处理、模型训练、多智能体协作等高级主题。 -你可以阅读并深入了解使用方法。 + diff --git a/docs/zh/visualization.md b/docs/zh/visualization.md index 77209597..0d725b7f 100644 --- a/docs/zh/visualization.md +++ b/docs/zh/visualization.md @@ -4,20 +4,20 @@ --- -### 1. 支持的可视化工具 +## 支持的可视化工具 -AgentScope Tuner 支持以下可视化后端: - -* **SwanLab**(推荐):面向 AI 研究的现代化实验跟踪平台。[了解 SwanLab](https://docs.swanlab.cn/guide_cloud/general/what-is-swanlab.html) -* **WandB**:Weights & Biases 实验跟踪平台 -* **TensorBoard**:TensorFlow 提供的传统可视化工具 -* **Console**:将日志以纯文本形式输出到标准输出 +
    +

    SwanLab

    面向 AI 研究的现代化实验跟踪平台(推荐)。

    +

    WandB

    Weights & Biases 实验跟踪平台。

    +

    TensorBoard

    TensorFlow 提供的传统可视化工具。

    +

    Console

    将日志以纯文本形式输出到标准输出。

    +
    --- -### 2. SwanLab 快速开始 +## SwanLab 快速开始 -#### 2.1 配置 SwanLab +### 配置 SwanLab 只需在 YAML 配置中将 logger 后端设置为 `swanlab`: @@ -27,7 +27,7 @@ astuner: logger: swanlab ``` -#### 2.2 启动训练 +### 启动训练 像平时一样启动训练: @@ -35,68 +35,71 @@ astuner: astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` -#### 2.3 查看训练曲线 - -训练启动后,SwanLab 会自动: +### 查看训练曲线 -1. 记录关键指标(reward、success rate、loss 等) -2. 生成实时训练曲线 -3. 提供可视化的 Web Dashboard +!!! success "自动记录" + 训练启动后,SwanLab 会自动: + + 1. 记录关键指标(reward、success rate、loss 等) + 2. 生成实时训练曲线 + 3. 提供可视化的 Web Dashboard -你可以通过训练日志中打印的 URL 打开 SwanLab 面板,或直接访问 SwanLab 的 Web 界面查看你的实验记录。 +您可以通过训练日志中打印的 URL 打开 SwanLab 面板,或直接访问 SwanLab 的 Web 界面查看您的实验记录。 --- -### 3. 理解训练曲线 - -#### 3.1 需要重点关注的指标 +## 理解训练曲线 -训练过程中通常会跟踪以下指标: +### 需要重点关注的指标 -* **Reward**:每个 episode 的平均奖励,反映任务表现 -* **Success Rate**:任务成功完成的比例 -* **Loss**:策略优化算法的训练损失 -* **Response Length**:模型回复的平均长度 -* **KL Divergence**:当前策略与参考策略之间的 KL 散度 +| 指标 | 说明 | +|------|------| +| **Reward** | 每个 episode 的平均奖励,反映任务表现 | +| **Success Rate** | 任务成功完成的比例 | +| **Loss** | 策略优化算法的训练损失 | +| **Response Length** | 模型回复的平均长度 | +| **KL Divergence** | 当前策略与参考策略之间的 KL 散度 | -#### 3.2 如何解读曲线 +### 如何解读曲线 -**Reward 曲线:** +**Reward 曲线示例:** -![Example Training Curve](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) +
    +Example Training Curve +
    -一条典型的 reward 曲线通常包含: - -* **初始阶段**:模型仍在探索,reward 可能较低或波动较大 -* **学习阶段**:随着策略变好,reward 逐步上升 -* **收敛阶段**:当模型接近最优表现时,reward 开始趋于平稳(平台期) +!!! info "典型的 Reward 曲线阶段" + | 阶段 | 特征 | + |------|------| + | **初始阶段** | 模型仍在探索,reward 可能较低或波动较大 | + | **学习阶段** | 随着策略变好,reward 逐步上升 | + | **收敛阶段** | 当模型接近最优表现时,reward 开始趋于平稳(平台期) | **建议重点观察:** -* **持续上升趋势**:通常意味着学习有效 -* **平台期**:可能表示已经收敛,或需要调整超参数以进一步提升 -* **突然下降**:可能是训练不稳定、或出现过拟合等问题信号 +- **持续上升趋势**:通常意味着学习有效 +- **平台期**:可能表示已经收敛,或需要调整超参数以进一步提升 +- **突然下降**:可能是训练不稳定、或出现过拟合等问题信号 --- -### 4. 最佳实践 +## 最佳实践 -#### 4.1 对比多次实验 +### 对比多次实验 通过多次实验对比不同超参数设置的效果,并在 SwanLab 或 WandB 中将曲线并排比较,能更高效地定位有效配置。 -#### 4.2 设置合适的日志频率 +### 设置合适的日志频率 在日志细节与训练开销之间取得平衡: ```yaml astuner: trainer_common: - # 每 N step 记录一次日志 - log_freq: 1 + log_freq: 1 # 每 N step 记录一次日志 ``` -#### 4.3 在关键位置保存 Checkpoint +### 在关键位置保存 Checkpoint 配置 checkpoint 保存策略,以保留峰值表现阶段的模型: @@ -108,10 +111,10 @@ astuner: --- -### 5. 了解更多 - -关于可视化与监控的更多信息: +## 了解更多 -* [SwanLab Documentation](https://docs.swanlab.cn/guide_cloud/general/what-is-swanlab.html) -* [Configuration Guide](./configuration.md#logging--monitoring) -* [Beast-Logger Usage](./beast_logger.md) - token-level 调试可视化 + diff --git a/docs/zh/workflow.md b/docs/zh/workflow.md index d5811b23..6bc7ede8 100644 --- a/docs/zh/workflow.md +++ b/docs/zh/workflow.md @@ -1,13 +1,14 @@ # 可训练工作流 -本教程介绍如何在 AgentScope 中定义一个可训练的工作流(Workflow)🚀。 +本教程介绍如何在 AgentScope 中定义一个可训练的工作流(Workflow)。 -ASTuner 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封装方式: +!!! info "两种封装方式" + ASTuner 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封装方式: + + - **简单模式**:强调简单、易用、容易理解 + - **进阶模式**:强调灵活、可控、易扩展 -- 第一种更强调 **简单、易用、容易理解**; -- 第二种更强调 **灵活、可控、易扩展**。 - -下面分别说明。 +--- ## 简单智能体场景 @@ -15,62 +16,55 @@ ASTuner 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封 **只需要在初始化 ReActAgent 时,把 `model` 参数替换为 `model_tuner` 即可。** - - - - - - - - - - - - - -
    修改前修改后
    -
    agent_instance = ReActAgent(
    -   name=f"Friday",
    -   sys_prompt="You are a helpful assistant",
    -   model=DashScopeChatModel(model_name="qwen-max", stream=False),
    -   formatter=DashScopeChatFormatter(),
    -)
    -
    -
    agent_instance = ReActAgent(
    -   name=f"Friday",
    -   sys_prompt="You are a helpful assistant",
    -   model=model_tuner,  # change here
    -   formatter=DashScopeChatFormatter(),
    -)
    -
    - -然后,将你的 Workflow 封装到一个继承自 `Workflow` 的类中(`from astnuer import Workflow`),这样这个 Workflow 就可以被 ASTuner 训练了。 +=== "修改前" + + ```python + agent_instance = ReActAgent( + name=f"Friday", + sys_prompt="You are a helpful assistant", + model=DashScopeChatModel(model_name="qwen-max", stream=False), + formatter=DashScopeChatFormatter(), + ) + ``` + +=== "修改后" + + ```python + agent_instance = ReActAgent( + name=f"Friday", + sys_prompt="You are a helpful assistant", + model=model_tuner, # 关键修改点 + formatter=DashScopeChatFormatter(), + ) + ``` + +然后,将您的 Workflow 封装到一个继承自 `Workflow` 的类中: ```python +from agentscope_tuner import Workflow, WorkflowTask, WorkflowOutput, ModelTuner + class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: - ... your ReActAgent workflow here ... + # ... your ReActAgent workflow here ... return WorkflowOutput(reward=workflow_reward) ``` -### 2. 什么时候使用这种「简单实践」 - -这种写法适合大多数用户,如果你满足下面的情况,可以优先采用: +### 2. 什么时候使用「简单模式」 -- 🌟 很清楚**哪些智能体需要被训练**,或者智能体的数量本身就不多; -- ✨ 已经完成了 Workflow 的基础调试,确认在使用非微调模型(例如 `qwen-max`)时工作流是正常可用的; -- 🎇 不需要在运行过程中**动态改变**要训练的智能体集合。 +!!! tip "适用场景" + 这种写法适合大多数用户,如果您满足下面的情况,可以优先采用: + + - 很清楚**哪些智能体需要被训练**,或者智能体的数量本身就不多 + - 已经完成了 Workflow 的基础调试,确认在使用非微调模型时工作流正常可用 + - 不需要在运行过程中**动态改变**要训练的智能体集合 ### 3. 代码示例 -- 假设你已经实现了一个 ReAct智能体,大致如下: +假设您已经实现了一个 ReAct 智能体: -```python +```python title="原始智能体代码" from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -91,9 +85,9 @@ result = await self.agent.reply(msg, structured_model=FinalResult) final_answer = extract_final_answer(result) ``` -- 那么,你只需要把它包裹进一个 Workflow 类即可: +只需将它包裹进一个 Workflow 类即可: -```python +```python title="封装为 Workflow" class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" @@ -108,7 +102,7 @@ class ExampleMathLearn(Workflow): self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, # 这里改为使用 model_tuner + model=model_tuner, # 关键:改为使用 model_tuner formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -121,32 +115,33 @@ class ExampleMathLearn(Workflow): return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` +--- ## 进阶智能体场景 当设计的是一个**多智能体协作**的复杂 Workflow,并且每个智能体扮演不同**角色**时,如果 ASTuner 能够「知道」每个智能体的身份,那么在训练和调试时就能提供更好的能力和更高的可控性。 -通过多智能体协作,你可以 -- 🌟 **精细地控制**哪些智能体会被微调; -- ✨ 为「当前未被训练」的智能体明确定义其使用的默认模型; -- ⚡ 在**不修改 Workflow 源码**的前提下,动态切换不同的可训练目标(trainable agent targets)。 +!!! success "进阶模式的优势" + 通过多智能体协作,您可以: + + - **精细地控制**哪些智能体会被微调 + - 为「当前未被训练」的智能体明确定义其使用的默认模型 + - 在**不修改 Workflow 源码**的前提下,动态切换不同的可训练目标 ### 1. 可训练开关与模型生命周期 #### 模型多角色注册与使用 -在多智能体协作中,每个智能体拥有自己的「角色」。 +在多智能体协作中,每个智能体拥有自己的「角色」。在 Workflow 中,我们需要显式地注册待训练的智能体角色: -在 Workflow 中,我们需要显式的注册待训练的智能体角色,并在创建智能体的时候显式的指明角色: - -- **注册(register)**:`model_tuner.register_model(agent_role, default_model=...)` - - 定义:向 Tuner 注册一个待训练的智能体角色,并指定该角色在未训练/不训练时的默认模型。 -- **使用(get/bind)**:`model_tuner.get_model(agent_role)` - - 定义:在构建智能体或执行 Workflow 时,根据 `agent_role` 返回该智能体的模型对象。 +| 操作 | 方法 | 说明 | +|------|------|------| +| **注册** | `model_tuner.register_model(agent_role, default_model=...)` | 向 Tuner 注册一个待训练的智能体角色,并指定该角色在未训练时的默认模型 | +| **使用** | `model_tuner.get_model(agent_role)` | 根据 `agent_role` 返回该智能体的模型对象 | #### 可训练模型 vs 不可训练模型 -在 Workflow 中能够自由地控制每个智能体的训练状态。一个智能体是否参与训练由 Workflow 的 **`trainable_targets`** 声明决定: +在 Workflow 中可以自由控制每个智能体的训练状态。一个智能体是否参与训练由 Workflow 的 **`trainable_targets`** 声明决定: ```python class ExampleMathLearn(Workflow): @@ -156,68 +151,77 @@ class ExampleMathLearn(Workflow): # ... ``` -- **可训练(trainable)**:如果智能体(角色)在 `trainable_targets` 列表中,则设置可训练模型。 -- **不可训练(non-trainable)**:智能体(角色)不在 `trainable_targets` 列表中,则智能体将使用默认模型。 +| 状态 | 条件 | 行为 | +|------|------|------| +| **可训练** | 角色在 `trainable_targets` 列表中 | 使用可训练模型 | +| **不可训练** | 角色不在 `trainable_targets` 列表中 | 使用默认模型 | -无论角色异同,所有智能体(角色)共享一个模型实例。也就是具有相同参数的模型将分别扮演不同的角色。 +!!! info "模型共享" + 无论角色异同,所有智能体(角色)共享一个模型实例。也就是说,具有相同参数的模型将分别扮演不同的角色。 ### 2. 升级为进阶 ASTuner Workflow -本节通过一个简单的例子展示使用 `ModelTuner.register_model` 为不同角色注册「可训练模型」,并在构建智能体时以角色维度进行模型绑定。 +本节通过一个简单的例子展示使用 `ModelTuner.register_model` 为不同角色注册「可训练模型」。 -- 先从一个基础的 AgentScope `ReActAgent` 开始: +=== "步骤 1:基础智能体" -```python -agent_instance = ReActAgent( - name=f"Player-X", - sys_prompt="You are a helpful assistant", - model=DashScopeChatModel(model_name="qwen-max", stream=False), - formatter=DashScopeChatFormatter(), -) -``` + ```python + agent_instance = ReActAgent( + name=f"Player-X", + sys_prompt="You are a helpful assistant", + model=DashScopeChatModel(model_name="qwen-max", stream=False), + formatter=DashScopeChatFormatter(), + ) + ``` -- 为智能体声明一个角色标记(tag),并通过 `model_tuner.register_model` 指定该智能体**在未被训练时**应当使用的默认模型: +=== "步骤 2:注册角色" -```python -agent_role = "TYPE-ZERO" -default_model_when_not_training = DashScopeChatModel(model_name="qwen-max", stream=False) -model_tuner.register_model(agent_role, default_model=default_model_when_not_training) -``` + ```python + agent_role = "TYPE-ZERO" + default_model = DashScopeChatModel(model_name="qwen-max", stream=False) + model_tuner.register_model(agent_role, default_model=default_model) + ``` -- 再使用 `model_tuner.get_model` 创建与 `agent_role` 绑定的 `ReActAgent`: +=== "步骤 3:绑定模型" -```python -agent_instance = ReActAgent( - name=f"Player-X", - sys_prompt="You are a helpful assistant", - model=model_tuner.get_model(agent_role), # replace there - formatter=DashScopeChatFormatter(), -) -``` + ```python + agent_instance = ReActAgent( + name=f"Player-X", + sys_prompt="You are a helpful assistant", + model=model_tuner.get_model(agent_role), # 使用角色绑定的模型 + formatter=DashScopeChatFormatter(), + ) + ``` -- 最后,将 Workflow 封装到类中,并定义 `trainable_targets`: +=== "步骤 4:定义 Workflow" -```python -class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - trainable_targets: list = ["TYPE-ZERO", ...] + ```python + class ExampleMathLearn(Workflow): + name: str = "math_agent_workflow" + trainable_targets: list = ["TYPE-ZERO", ...] - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: - ... your agents and workflow here ... -``` + async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + # ... your agents and workflow here ... + ``` -### 3. 一个多智能体示例 +### 3. 多智能体示例 -下面是一个多智能体场景的示例代码片段: +下面是一个狼人杀游戏的多智能体场景示例: -```python +```python title="werewolves_workflow.py" roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] players = [] + for i, role in enumerate(roles): + # 好人使用 qwen-max,狼人使用 qwen-plus default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) - chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys # 🌟 + chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys + + # 注册角色 model_tuner.register_model(role, default_model=chosen_model) + + # 创建智能体 players += [ReActAgent( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), @@ -226,9 +230,17 @@ for i, role in enumerate(roles): )] ``` -在这里: +!!! note "代码说明" + - `role` 既描述了智能体在游戏中的身份(例如狼人、村民等) + - 又作为 `model_tuner.register_model` 的 key,标识一个**可训练目标** + - `chosen_model` 定义了该角色在「当前未训练」时所使用的默认底座模型 + - 通过这种方式,可以在多智能体场景下灵活地指定和切换各角色的训练与推理行为 + +--- + +## 下一步 -- `role` 既描述了智能体在游戏中的身份(例如狼人、村民等), -- 又作为 `model_tuner.register_model` 的 key,标识一个**可训练目标**; -- `chosen_model` 定义了该角色在「当前未训练」时所使用的默认底座模型; -- 通过这种方式,可以在多智能体场景下灵活地指定和切换各角色的训练与推理行为。 \ No newline at end of file + diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..f69cace4 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,134 @@ +site_name: AgentScope Tuner +site_url: https://agentscope-ai.github.io/agentscope-tuner/ +site_description: "A cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes." +site_author: "Alibaba Tongyi Lab" +repo_url: https://github.com/agentscope-ai/agentscope-tuner +repo_name: agentscope-ai/agentscope-tuner +copyright: "Copyright © 2025 Alibaba Tongyi Lab" +theme: + name: shadcn + show_stargazers: true + git_enabled: false + nav_sort: false + features: + - content.code.copy + - content.code.annotate +nav: + - Overview: index.md + + - Tutorial: + - Introduction: en/intro.md + - Installation: en/installation.md + - Quick Start: en/quickstart.md + - Tune Your First Agent: en/tune_your_first_agent.md + + - Examples: + - Math Agent: en/example_math_agent.md + - AppWorld Agent: en/example_app_world.md + - Werewolves Game: en/example_werewolves.md + - Learning to Ask: en/example_learning_to_ask.md + - Frozen Lake: en/example_frozenlake.md + - Countdown Game: en/example_countdown.md + + - Components: + - Workflow: en/workflow.md + - Data Pipeline: en/data_pipeline.md + - Task Judger: en/task_judger.md + + - Deep Dive: + - Configuration: en/configuration.md + - Visualization: en/visualization.md + - Beast Logger: en/beast_logger.md + - Data Generation: en/data_generation.md + - Tracing Feedback Loop: en/example_tracing_feedback_loop.md + + - 中文文档: + - 简介: zh/intro.md + - 安装: zh/installation.md + - 快速开始: zh/quickstart.md + - 调优你的第一个 Agent: zh/tune_your_first_agent.md + - 示例: + - 数学 Agent: zh/example_math_agent.md + - AppWorld Agent: zh/example_app_world.md + - 狼人杀游戏: zh/example_werewolves.md + - 学会提问: zh/example_learning_to_ask.md + - 冰湖问题: zh/example_frozenlake.md + - 倒计时游戏: zh/example_countdown.md + - 组件: + - 工作流: zh/workflow.md + - 数据管道: zh/data_pipeline.md + - 任务评判器: zh/task_judger.md + - 深入探索: + - 配置: zh/configuration.md + - 可视化: zh/visualization.md + - Beast Logger: zh/beast_logger.md + - 数据生成: zh/data_generation.md + - Tracing 反馈循环: zh/example_tracing_feedback_loop.md + +plugins: + - search: + lang: + - en + - zh + separator: '[\s\-\.\(\)\/]+' + min_search_length: 2 + prebuild_index: true + indexing: 'full' + - mkdocstrings: + handlers: + python: + paths: [.] + options: + docstring_style: google + show_source: true + show_root_heading: true + show_root_full_path: false + members_order: source + show_submodules: true +markdown_extensions: + - admonition + - footnotes + - tables + - extra + - attr_list + - md_in_html + - pymdownx.details + - pymdownx.tabbed: + alternate_style: true + - pymdownx.progressbar + - pymdownx.snippets + - pymdownx.arithmatex: + generic: true + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.superfences + - shadcn.extensions.iconify + +extra_css: + - https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap + - stylesheets/feature-cards.css + - stylesheets/tabbed-code.css + - stylesheets/readability-enhancements.css + - stylesheets/code-enhancements.css + - stylesheets/syntax-highlight.css + - stylesheets/table-enhancements.css + - stylesheets/jupyter-simple.css + - stylesheets/nav-scroll-fix.css + - stylesheets/workflow.css + - stylesheets/animations.css + - stylesheets/mermaid.css + - stylesheets/mkdocstrings.css + - stylesheets/responsive.css + +extra_javascript: + - javascripts/tabbed-code.js + - javascripts/code-copy.js + - javascripts/search-fix.js + - javascripts/code-zoom.js + - javascripts/nav-scroll-fix.js + - javascripts/animations.js + - javascripts/responsive.js + From d1f1788b292156fd775e7574d1d4e76a1d60c26f Mon Sep 17 00:00:00 2001 From: "liuboyin.lby" Date: Mon, 5 Jan 2026 17:51:12 +0800 Subject: [PATCH 375/462] docs: update index page styling and section title --- docs/index.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/index.md b/docs/index.md index e1bb7a14..a4980d1a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -107,9 +107,7 @@ ASTuner provides high-resolution logging and debugging solutions: --- -## Getting Started - -Follow this learning path to master ASTuner: +## Next Steps

    Installation

    Set up ASTuner environment and dependencies.

    @@ -122,5 +120,6 @@ Follow this learning path to master ASTuner: ## 中文文档 -

    查看中文文档

    完整的中文教程和指南。

    + From 3534e087bbb07454e1921299e542346a03438928 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 6 Jan 2026 14:13:53 +0800 Subject: [PATCH 376/462] add tuner v2 --- .../tuner_lib/weight_tuner/__init__.py | 4 + .../weight_tuner/as_agentscope_model.py | 118 ++++++++++ .../weight_tuner/as_oai_sdk_model.py | 0 .../tuner_lib/weight_tuner/middleware.py | 181 ++++++++++++++ agentscope_tuner/tuner_v2.md | 81 +++++++ agentscope_tuner/tuner_v2.py | 221 ++++++++++++++++++ agentscope_tuner/utils/magic_mock.py | 22 ++ scripts/deploy_model.py | 5 +- 8 files changed, 630 insertions(+), 2 deletions(-) create mode 100644 agentscope_tuner/tuner_lib/weight_tuner/__init__.py create mode 100644 agentscope_tuner/tuner_lib/weight_tuner/as_agentscope_model.py create mode 100644 agentscope_tuner/tuner_lib/weight_tuner/as_oai_sdk_model.py create mode 100644 agentscope_tuner/tuner_lib/weight_tuner/middleware.py create mode 100644 agentscope_tuner/tuner_v2.md create mode 100644 agentscope_tuner/tuner_v2.py create mode 100644 agentscope_tuner/utils/magic_mock.py diff --git a/agentscope_tuner/tuner_lib/weight_tuner/__init__.py b/agentscope_tuner/tuner_lib/weight_tuner/__init__.py new file mode 100644 index 00000000..2a9c9311 --- /dev/null +++ b/agentscope_tuner/tuner_lib/weight_tuner/__init__.py @@ -0,0 +1,4 @@ + +from agentscope_tuner.tuner_lib.weight_tuner.as_agentscope_model import AgentScopeModelTuner +from agentscope_tuner.tuner_lib.weight_tuner.as_oai_sdk_model import OpenaiClientModelTuner + diff --git a/agentscope_tuner/tuner_lib/weight_tuner/as_agentscope_model.py b/agentscope_tuner/tuner_lib/weight_tuner/as_agentscope_model.py new file mode 100644 index 00000000..f18b7494 --- /dev/null +++ b/agentscope_tuner/tuner_lib/weight_tuner/as_agentscope_model.py @@ -0,0 +1,118 @@ +from typing import TYPE_CHECKING, Any, Literal, Type + +from agentscope._utils._common import _create_tool_from_base_model +from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel +from loguru import logger +from pydantic import BaseModel + +from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracker, +) +from agentscope_tuner.task_rollout.async_llm_bridge import AgentScopeLlmProxy + +if TYPE_CHECKING: + from agentscope_tuner import Workflow + + +class AgentScopeModelTuner(DashScopeChatModel): + """ + ModelTuner for Agentscope workflow. + It keeps record of all registered agent types (by their target names), + And when request comes, it calls `self.llm_proxy` to handle the request. + """ + + def __init__( + self, + config, + context_tracker: MultiAgentContextTracker, + agentscope_workflow: "Workflow", + agent_name: str, + debug_model: DashScopeChatModel, + use_debug_model: bool = False, + **kwargs, + ) -> None: + self.config = config + self.context_tracker = context_tracker + self.agentscope_workflow = agentscope_workflow + + self.agent_name = agent_name + self.debug_model = debug_model + self.use_debug_model = use_debug_model + self.llm_proxy = AgentScopeLlmProxy( + context_tracker=context_tracker, config=config, **kwargs + ) + super().__init__( + model_name="astuner", + api_key="dummy-api-key", + stream=False, + ) + + + async def __call__( + self, + messages: list[dict[str, Any]], + tools: list[dict] | None = None, + tool_choice: Literal["auto", "none", "any", "required"] | str | None = None, + structured_model: Type[BaseModel] | None = None, + **kwargs: Any, + ) -> ChatResponse: + + # route first + if self.use_debug_model: + chatresponse = await self.debug_model(messages, tools, tool_choice, structured_model, **kwargs) + assert isinstance(chatresponse, ChatResponse) + return chatresponse + + + # For qvq and qwen-vl models, the content field cannot be `None` or + # `[{"text": None}]`, so we need to convert it to an empty list. + if self.model_name.startswith("qvq") or "-vl" in self.model_name: + raise NotImplementedError("Not implemented for qvq and qwen-vl models yet.") + + kwargs = { + "messages": messages, + "model": self.model_name, + "stream": self.stream, + **self.generate_kwargs, + **kwargs, + "result_format": "message", + # In agentscope, the `incremental_output` must be `True` when + # `self.stream` is True + "incremental_output": self.stream, + } + + if tools: + kwargs["tools"] = self._format_tools_json_schemas(tools) + + if tool_choice: + self._validate_tool_choice(tool_choice, tools) + kwargs["tool_choice"] = self._format_tool_choice(tool_choice) + + if self.enable_thinking is not None and "enable_thinking" not in kwargs: + kwargs["enable_thinking"] = self.enable_thinking + + if structured_model: + if tools or tool_choice: + logger.warning( + "structured_model is provided. Both 'tools' and " + "'tool_choice' parameters will be overridden and " + "ignored. The model will only perform structured output " + "generation without calling any other tools.", + ) + format_tool = _create_tool_from_base_model(structured_model) + kwargs["tools"] = self._format_tools_json_schemas( + [format_tool], + ) + kwargs["tool_choice"] = self._format_tool_choice( + format_tool["function"]["name"], + ) + + # call llm model ✨ + response_gen = await self.llm_proxy( + api_key=self.api_key, + structured_model=structured_model, + **kwargs, + ) + + # Return the AsyncGenerator directly + return response_gen diff --git a/agentscope_tuner/tuner_lib/weight_tuner/as_oai_sdk_model.py b/agentscope_tuner/tuner_lib/weight_tuner/as_oai_sdk_model.py new file mode 100644 index 00000000..e69de29b diff --git a/agentscope_tuner/tuner_lib/weight_tuner/middleware.py b/agentscope_tuner/tuner_lib/weight_tuner/middleware.py new file mode 100644 index 00000000..f2689e0a --- /dev/null +++ b/agentscope_tuner/tuner_lib/weight_tuner/middleware.py @@ -0,0 +1,181 @@ +# EXPERIMENTAL: +# This is a global store for cross-machine tuner request proxy +# unless your workflow have to be executed across multiple machines +# you probably don't need this at all. + +global CROSS_MACHINE_TUNER_REQUEST_PROXY_STORE +CROSS_MACHINE_TUNER_REQUEST_PROXY_STORE = dict() + +import asyncio +from typing import Optional, Union, Annotated +from fastapi import APIRouter, Depends, Request, HTTPException, status +from fastapi.responses import JSONResponse, StreamingResponse +from pydantic import BaseModel, ConfigDict, Field +from collections.abc import AsyncGenerator, AsyncIterator +from collections.abc import Sequence as GenericSequence +from http import HTTPStatus +from vllm.entrypoints.openai.protocol import (CompletionLogProbs, + CompletionRequest, + CompletionResponse, + CompletionResponseChoice, + CompletionResponseStreamChoice, + CompletionStreamResponse, + ErrorResponse, + PromptTokenUsageInfo, + RequestResponseMetadata, + UsageInfo) +from transformers import (AutoTokenizer, PreTrainedTokenizer, + PreTrainedTokenizerFast) +from vllm.inputs.parse import parse_and_batch_prompt +from vllm.entrypoints.openai.serving_engine import ( + TextTokensPrompt, + EmbedsPrompt, + AnyRequest, +) + +router = APIRouter() + +async def _normalize_prompt_text_to_input( + request: AnyRequest, + tokenizer: PreTrainedTokenizer, + prompt: str, + truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]], + add_special_tokens: bool, +) -> TextTokensPrompt: + + def _get_async_tokenizer(tokenizer: PreTrainedTokenizer): + async def async_tokenizer( + prompt: str, + add_special_tokens: bool = True, + truncation: bool = False, + ): + return await asyncio.to_thread( + tokenizer.__call__, + prompt, + add_special_tokens=add_special_tokens, + truncation=truncation, + ) + return async_tokenizer + + assert truncate_prompt_tokens is None + async_tokenizer = _get_async_tokenizer(tokenizer) + encoded = await async_tokenizer(prompt, add_special_tokens=add_special_tokens) + + input_ids = encoded.input_ids + input_text = prompt + + return self._validate_input(request, input_ids, input_text) + + +async def _tokenize_prompt_input_or_inputs_async( + request: AnyRequest, + tokenizer: PreTrainedTokenizer, + input_or_inputs: Optional[Union[str, list[str], list[int], + list[list[int]]]], + truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None, + add_special_tokens: bool = True, +) -> tuple[list[TextTokensPrompt], list[EmbedsPrompt]]: + + inputs_text = list[TextTokensPrompt]() + + # Parse and batch the input prompts + batch_inputs = parse_and_batch_prompt(input_or_inputs) + + # Process each input in the batch concurrently + tasks = [] + for prompt_input in batch_inputs: + assert not prompt_input["is_tokens"] + task = _normalize_prompt_text_to_input( + request, + tokenizer, + prompt_input["content"], + truncate_prompt_tokens=truncate_prompt_tokens, + add_special_tokens=add_special_tokens) + + tasks.append(task) + + # Wait for all tokenization tasks to complete + results = await asyncio.gather(*tasks) + inputs_text.extend(results) + + return inputs_text, [] + +async def _preprocess_completion( + request, + tokenizer, + input_or_inputs: Optional[Union[str, list[str], list[int], + list[list[int]]]], + truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None, + add_special_tokens: bool = True, +): + + (request_prompts_text, request_prompts_embeds + ) = await _tokenize_prompt_input_or_inputs_async( + request, + tokenizer, + input_or_inputs, + truncate_prompt_tokens=truncate_prompt_tokens, + add_special_tokens=add_special_tokens, + ) + + request_prompts = request_prompts_text + return request_prompts, None + +async def create_completion( + request: CompletionRequest, + raw_request: Optional[Request] = None, +) -> Union[AsyncGenerator[str, None], CompletionResponse, ErrorResponse]: + + tokenizer = await self.engine_client.get_tokenizer(lora_request) + + request_prompts, engine_prompts = await _preprocess_completion( + request, + tokenizer, + request.prompt, + truncate_prompt_tokens=request.truncate_prompt_tokens, + add_special_tokens=request.add_special_tokens, + ) + return request_prompts + + + +@router.post("/v1/completions", + dependencies=[Depends(validate_json_request)], + responses={ + HTTPStatus.OK.value: { + "content": { + "text/event-stream": {} + } + }, + HTTPStatus.BAD_REQUEST.value: { + "model": ErrorResponse + }, + HTTPStatus.NOT_FOUND.value: { + "model": ErrorResponse + }, + HTTPStatus.INTERNAL_SERVER_ERROR.value: { + "model": ErrorResponse + }, + }) +async def create_completion(request: CompletionRequest, raw_request: Request): + """The idea is simple: parse request, get apply chat template and tokenize + + Args: + request (CompletionRequest): _description_ + raw_request (Request): _description_ + + Returns: + _type_: _description_ + """ + + + # from api key or url, read `agent_name`, `uuid` etc + + session_uuid = ... + CROSS_MACHINE_TUNER_REQUEST_PROXY_STORE[session_uuid] = request + + # convert to prompt + request_prompts = await create_completion(request, raw_request) + + + return StreamingResponse(content=generator, media_type="text/event-stream") diff --git a/agentscope_tuner/tuner_v2.md b/agentscope_tuner/tuner_v2.md new file mode 100644 index 00000000..fb3c2da7 --- /dev/null +++ b/agentscope_tuner/tuner_v2.md @@ -0,0 +1,81 @@ + + + +# Type 1-1: AgentScope Agents + +```python +class ExampleMathLearn(Workflow): + + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + + query = workflow_task.task.main_query + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=model_tuner, # 🌟 this will do the trick + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), + max_iters=2, + ) + + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg) + final_answer = extract_final_answer(result) + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + +``` + + + +# Type 1-2: AgentScope Agents: Triple-M (Multi-Role, Multi-Agent, Multi-Turn) Case + +```python +roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] +players = [] +for i, agent_role in enumerate(roles): + if agent_role != "werewolf": + chosen_model_for_current_agent = OpenAIChatModel(model_name="qwen-max", stream=False) + else: + chosen_model_for_current_agent = OpenAIChatModel(model_name="qwen-plus", stream=False) + players += [ReActAgent( + name=f"Player{i + 1}", + sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), + model=agentscope_model, + model=model_tuner.as_agentscope_model( + agent_name=f"Player{i + 1}", + target_tag=agent_role, # 🌟 tag agents with their role + debug_model=chosen_model_for_current_agent # 🌟 assign a debug model, ONLY used when we are NOT training this agent + ) + formatter=OpenAIMultiAgentFormatter(), + )] +``` + + + +# Type 2: Raw OpenAI SDK Agents + +```python + +import openai +client = openai.OpenAI(api_key='dummy-api-key') + +response = client.chat.completions.create( + model="gpt-3.5-turbo", # You can replace this with "gpt-4" if available + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello! Tell me a joke about programming."} + ], + max_tokens=100, # Limit the response length + temperature=0.7 # Control the randomness of the output +) + + +``` \ No newline at end of file diff --git a/agentscope_tuner/tuner_v2.py b/agentscope_tuner/tuner_v2.py new file mode 100644 index 00000000..6c31dd40 --- /dev/null +++ b/agentscope_tuner/tuner_v2.py @@ -0,0 +1,221 @@ +from typing import TYPE_CHECKING, Any, Literal, Type, Union + +from agentscope._utils._common import _create_tool_from_base_model +from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel +from loguru import logger +from pydantic import BaseModel + +from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracker, +) +from agentscope_tuner.task_rollout.async_llm_bridge import AgentScopeLlmProxy +from agentscope_tuner.tuner_lib.weight_tuner import as_agentscope_model, as_oai_sdk_model +from agentscope_tuner.utils.magic_mock import SpecialMagicMock + +if TYPE_CHECKING: + from agentscope_tuner import Workflow + from openai.types.chat.chat_completion import ChatCompletion + from agentscope_tuner.tuner_lib.weight_tuner.agentscope_tuner import AgentScopeModelTuner + + + +class Agent2Proxy(DashScopeChatModel): + """ + Handler for **NAMED** agent trainning targets. + It stores the target name, and a reference to the ModelTuner. + When request comes, it switches between default model (dashscope or openai models) and ModelTuner + """ + + def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase): + self.name = name + self.tuner = tuner + self.default_model = default_model + super().__init__( + model_name="astuner", + api_key="dummy-api-key", + stream=False, + ) + + def __call__(self, *args, **kwargs): + if not self.tuner.is_target_trainable(self.name): + # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, + # and self.name is not in it, use default model + return self.default_model(*args, **kwargs) + else: + # [TRAIN] + return self.tuner(*args, **kwargs) + + + + +class OpenaiClientModelTuner: + + def __init__(self): + # Create a custom callable object for chat.completions.create + self.chat = SpecialMagicMock(allowed_attributes="completions") # Empty object for `chat` + self.chat.completions = SpecialMagicMock(allowed_attributes="create") # Empty object for `completions` + self.chat.completions.create = self.create # Redirect to create + + def create( + self, + *, + messages, + model, + audio, + frequency_penalty, + function_call, + functions, + logit_bias, + logprobs, + max_completion_tokens, + max_tokens, + metadata, + modalities, + n, + parallel_tool_calls, + prediction, + presence_penalty, + reasoning_effort, + response_format, + seed, + service_tier, + stop, + store, + stream, + stream_options, + temperature, + tool_choice, + tools, + top_logprobs, + top_p, + user, + web_search_options, + extra_headers, + extra_query, + extra_body, + timeout, + ) -> ChatCompletion: + # call llm model ✨ + response_gen = await self.llm_proxy( + api_key=self.api_key, + structured_model=structured_model, + **kwargs, + ) + +TunerTypeUnion = Union[Type["TunerV2"], Type["AgentScopeModelTuner"], Type["OpenaiClientModelTuner"]] + +class TunerV2(BaseModel): + + def __init__( + self, + config, + context_tracker: MultiAgentContextTracker, + workflow: "Workflow", + **kwargs, + ) -> None: + self.config = config + self.workflow = workflow + self.context_tracker = context_tracker + self.target2proxy_registry: dict[str, TunerTypeUnion] = {} + + + def as_agentscope_model( + self, + agent_name="default_agent_name", + target_tag="default_target_tag", + debug_model=None + ) -> "AgentScopeModelTuner": + """Convert to ModelTuner instance for Agentscope workflow. + Returns: + ModelTuner: + The ModelTuner instance for Agentscope workflow. + """ + explicit_tuner_as_modelscope_model = AgentScopeModelTuner( + config=self.config, + context_tracker=self.context_tracker, + workflow=self.workflow, + agent_name=agent_name, + debug_model=debug_model, + use_debug_model=(not self.is_target_trainable(target_tag)), + ) + self.register_model(target_tag, explicit_tuner_as_modelscope_model) + return explicit_tuner_as_modelscope_model + + + def as_raw_openai_sdk_client( + self, + agent_name="default_agent_name", + target_tag="default_target_tag", + debug_model=None + ) -> Any: + """Convert to raw OpenAI SDK client for advanced usage. + Returns: + Any: + The raw OpenAI SDK client. + """ + return OpenaiClientModelTuner( + + ) + + + def __call__(self, **kwargs): + """This method is **deprecated**. + The current behavior of this method is pretend as a agentscope model + """ + explicit_tuner = AgentScopeModelTuner( + config=self.config, + context_tracker=self.context_tracker, + workflow=self.workflow, + )(**kwargs) + self.register_model("default_target_tag", explicit_tuner) + return explicit_tuner + + + + # ------------------------------------------------------------------------ + # other helper methods + # ------------------------------------------------------------------------ + + def register_model(self, target_name: str, explicit_tuner: TunerTypeUnion) -> TunerTypeUnion: + """Register an agent type. + Args: + target_name (`str`): + The name to register the agent type under. + default_model (`ChatModelBase`): + The model to use when you are NOT training this agent type. + Returns: + Agent2Proxy: + The agent type instance corresponding to the provided name. + """ + self.target2proxy_registry[target_name] = explicit_tuner + return explicit_tuner + + def is_target_trainable(self, target_name) -> bool: + """Determine whether user have used `trainable_targets` to explicitly control training targets. + """ + if self.workflow.trainable_targets is None: + # always assume trainable when user has never changed trainable_targets + return True + if not self.workflow.trainable_targets: + # always assume trainable when trainable_targets is [] + return True + if target_name in self.workflow.trainable_targets: + return True + else: + return False + + def get_llm_proxy(self) -> AgentScopeLlmProxy: + """Get the LlmProxyForAgentScope instance. + Returns: + LlmProxyForAgentScope: + The LlmProxyForAgentScope instance used by the ModelTuner. + """ + return self.llm_proxy + + def get_context_tracker(self) -> MultiAgentContextTracker: + """Get the context tracker instance. + Returns: + LlmProxyForAgentScope: + The context tracker instance used by the ModelTuner. + """ + return self.context_tracker \ No newline at end of file diff --git a/agentscope_tuner/utils/magic_mock.py b/agentscope_tuner/utils/magic_mock.py new file mode 100644 index 00000000..5a9b1448 --- /dev/null +++ b/agentscope_tuner/utils/magic_mock.py @@ -0,0 +1,22 @@ +class SpecialMagicMock(object): + + def __init__(self, allowed_attributes=[]): + # Use __dict__ to avoid triggering __setattr__ + self.__dict__['allowed_attributes'] = allowed_attributes + self.__dict__['attr_store'] = {} + + def __getattr__(self, name): + if name in self.allowed_attributes: + return self.attr_store.get(name) + else: + raise ValueError(f"Attribute {name} is not allowed.") + + def __setattr__(self, name, value): + if name in self.allowed_attributes: + # Use __dict__ to avoid recursion + self.__dict__['attr_store'][name] = value + elif name in ('allowed_attributes', 'attr_store'): + # Allow setting internal attributes directly + self.__dict__[name] = value + else: + raise ValueError(f"Attribute {name} is not allowed.") diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py index cbecb89a..c57edca0 100644 --- a/scripts/deploy_model.py +++ b/scripts/deploy_model.py @@ -15,13 +15,14 @@ parser = argparse.ArgumentParser(description="deploy Hugging Face model") parser.add_argument( "--target", - default="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-235B-A22B-Instruct-2507/", + # default="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-235B-A22B-Instruct-2507/", + default="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-Coder-480B-A35B-Instruct", type=str, help="Model path", ) parser.add_argument( "--alias", - default="Qwen/Qwen3-235B-A22B-Instruct-2507", + default="Qwen/Qwen3-Coder-480B-A35B-Instruct", type=str, help="Model alias", ) From f38690239f6172e429080837b6193d431d42550f Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 6 Jan 2026 14:38:09 +0800 Subject: [PATCH 377/462] project name to ajet --- .github/workflows/docker/docker-compose.yaml | 6 +- .github/workflows/unittest.yaml | 28 ++++---- README.md | 16 ++--- agentscope_tuner/__init__.py | 14 ---- .../config_auto_convertion_trinity.jsonc | 26 ------- .../trinity/trinity_launch.yaml | 6 -- .../verl/config_auto_convertion_verl.jsonc | 39 ----------- .../tuner_lib/weight_tuner/__init__.py | 4 -- ajet/__init__.py | 14 ++++ .../backbone/__init__.py | 2 +- .../backbone/main_trinity.py | 4 +- .../backbone/main_verl.py | 16 ++--- .../backbone/main_vllm.py | 46 ++++++------- .../backbone/trainer_trinity.py | 28 ++++---- .../backbone/trainer_verl.py | 48 ++++++------- .../backbone/warm_up.py | 6 +- {agentscope_tuner => ajet}/cli/__init__.py | 0 {agentscope_tuner => ajet}/cli/job.py | 42 ++++++------ {agentscope_tuner => ajet}/cli/launcher.py | 22 +++--- .../context_tracker/__init__.py | 0 .../agentscope_tracker/multiagent_tracking.py | 38 +++++------ .../agentscope_tracker/timeline_merging.py | 2 +- .../context_tracker/base_tracker.py | 14 ++-- .../context_tracker/basic_tracker.py | 18 ++--- .../data_generator/__init__.py | 0 .../data_generator/base_data_generator.py | 6 +- .../data_generator/config.py | 0 .../data_generator/knowledge_augmentation.py | 6 +- .../data_generator/task_augmentation.py | 6 +- .../default_config/README.md | 0 .../default_config/astune_default.py | 2 +- .../default_config/astune_default.yaml | 4 +- .../default_config/trinity/README.md | 8 +-- .../default_config/trinity/README_ZH.md | 8 +-- .../config_auto_convertion_trinity.jsonc | 26 +++++++ .../trinity/trinity_default.yaml | 8 +-- .../trinity/trinity_launch.yaml | 6 ++ .../verl/config_auto_convertion_verl.jsonc | 39 +++++++++++ .../default_config/verl/verl_default.yaml | 8 +-- {agentscope_tuner => ajet}/schema/__init__.py | 0 {agentscope_tuner => ajet}/schema/document.py | 0 .../schema/extended_msg.py | 2 +- {agentscope_tuner => ajet}/schema/logprob.py | 0 {agentscope_tuner => ajet}/schema/task.py | 0 .../schema/trajectory.py | 6 +- .../task_judge/base_judge.py | 2 +- .../task_judge/env_service_as_judge.py | 4 +- .../task_judge/rm_auto_grader_judge.py | 34 +++++----- .../task_reader/__init__.py | 14 ++-- .../task_reader/data_generator_reader.py | 14 ++-- .../task_reader/document_reader/doc_reader.py | 4 +- .../document_reader/document_reader_base.py | 2 +- .../task_reader/env_service_reader.py | 6 +- .../task_reader/hf_dataset_reader.py | 4 +- .../task_reader/jsonl_reader.py | 4 +- .../task_reader/task_reader_base.py | 2 +- .../task_reader/tracing_reader/__init__.py | 8 +-- .../task_reader/tracing_reader/connector.py | 2 +- .../tracing_reader/filters/__init__.py | 0 .../tracing_reader/filters/base.py | 2 +- .../filters/deduplication_filter.py | 4 +- .../tracing_reader/filters/factory.py | 0 .../filters/llm_evaluate_filter.py | 4 +- .../task_reader/tracing_reader/llm_client.py | 0 .../task_rollout/__init__.py | 0 .../task_rollout/async_llm_bridge.py | 26 +++---- .../task_rollout/dashscope_llm_bridge.py | 0 .../task_rollout/native_parallel_worker.py | 22 +++--- .../task_rollout/resource_keeper.py | 12 ++-- .../task_rollout/single_worker.py | 18 ++--- .../task_runner/__init__.py | 0 .../task_runner/agentscope_runner.py | 18 ++--- .../task_runner/base_runner.py | 24 +++---- {agentscope_tuner => ajet}/tuner.py | 10 +-- ajet/tuner_lib/weight_tuner/__init__.py | 4 ++ .../weight_tuner/as_agentscope_model.py | 8 +-- .../weight_tuner/as_oai_sdk_model.py | 0 .../tuner_lib/weight_tuner/middleware.py | 0 {agentscope_tuner => ajet}/tuner_v2.md | 0 {agentscope_tuner => ajet}/tuner_v2.py | 14 ++-- {agentscope_tuner => ajet}/utils/__init__.py | 0 .../utils/async_utils.py | 0 {agentscope_tuner => ajet}/utils/cleaner.py | 0 {agentscope_tuner => ajet}/utils/color_hsl.py | 0 .../utils/compute_madness.py | 0 .../utils/config_computer.py | 24 +++---- .../utils/config_utils.py | 26 +++---- .../utils/core_env_vars.py | 2 +- .../utils/dynamic_import.py | 0 .../utils/embedding_client.py | 0 .../utils/env_service_client/__init__.py | 0 .../utils/env_service_client/env_client_ng.py | 0 .../utils/launch_utils.py | 14 ++-- .../utils/magic_mock.py | 0 .../utils/message_utils.py | 0 .../utils/process_dataset.py | 0 {agentscope_tuner => ajet}/utils/pty.py | 2 +- {agentscope_tuner => ajet}/utils/retry.py | 2 +- .../utils/robust_dashscope.py | 0 {agentscope_tuner => ajet}/utils/sample.py | 20 +++--- .../utils/smart_daemon.py | 2 +- .../utils/testing_utils.py | 20 +++--- {agentscope_tuner => ajet}/utils/tokenizer.py | 0 {agentscope_tuner => ajet}/workflow.py | 4 +- docs/en/configuration.md | 32 ++++----- docs/en/data_generation.md | 8 +-- docs/en/data_pipeline.md | 10 +-- docs/en/debugging_guide.md | 6 +- docs/en/example_app_world.md | 28 ++++---- docs/en/example_countdown.md | 24 +++---- docs/en/example_frozenlake.md | 14 ++-- docs/en/example_learning_to_ask.md | 22 +++--- docs/en/example_math_agent.md | 16 ++--- docs/en/example_tracing_feedback_loop.md | 10 +-- docs/en/example_werewolves.md | 14 ++-- docs/en/installation.md | 10 +-- docs/en/intro.md | 2 +- docs/en/introduction.md | 2 +- docs/en/quickstart.md | 6 +- docs/en/task_judger.md | 22 +++--- docs/en/tune_your_first_agent.md | 32 ++++----- docs/en/visualization.md | 10 +-- docs/en/workflow.md | 18 ++--- docs/index.md | 2 +- docs/zh/configuration.md | 68 +++++++++---------- docs/zh/data_generation.md | 14 ++-- docs/zh/data_pipeline.md | 10 +-- docs/zh/example_app_world.md | 34 +++++----- docs/zh/example_countdown.md | 18 ++--- docs/zh/example_frozenlake.md | 10 +-- docs/zh/example_learning_to_ask.md | 18 ++--- docs/zh/example_math_agent.md | 16 ++--- docs/zh/example_tracing_feedback_loop.md | 10 +-- docs/zh/example_werewolves.md | 12 ++-- docs/zh/installation.md | 10 +-- docs/zh/intro.md | 2 +- docs/zh/introduction.md | 2 +- docs/zh/quickstart.md | 6 +- docs/zh/task_judger.md | 34 +++++----- docs/zh/tune_your_first_agent.md | 32 ++++----- docs/zh/visualization.md | 10 +-- docs/zh/workflow.md | 12 ++-- mini_test.py | 4 +- pyproject.toml | 4 +- pyrightconfig.json | 2 +- scripts/deploy_model.py | 10 +-- scripts/docker/dockerfile | 4 +- scripts/test_dashscope_api.py | 2 +- setup.py | 2 +- .../benchmark_appworld/benchmark_appworld.py | 2 +- .../benchmark_appworld.yaml | 10 +-- .../benchmark_appworld_2nodes.yaml | 10 +-- .../execute_benchmark_appworld.py | 2 +- tests/bench/benchmark_base.py | 8 +-- .../benchmark_countdown.py | 2 +- .../benchmark_countdown.yaml | 8 +-- .../benchmark_frozenlake.py | 2 +- .../benchmark_frozenlake.yaml | 8 +-- .../benchmark_learn2ask.py | 2 +- .../benchmark_learn2ask.yaml | 8 +-- tests/bench/benchmark_math/benchmark_math.py | 2 +- .../bench/benchmark_math/benchmark_math.yaml | 8 +-- tests/config_test.py | 20 +++--- tests/data_gen.py | 10 +-- tests/data_gen.yaml | 2 +- tests/test_benchmark_report.py | 2 +- tests/test_compute_madness.py | 2 +- tests/test_dynamic_import.py | 2 +- tests/test_tracing_reader.py | 6 +- tutorial/example_appworld/appworld.md | 36 +++++----- tutorial/example_appworld/appworld.py | 6 +- tutorial/example_appworld/appworld.yaml | 10 +-- tutorial/example_countdown/countdown.py | 2 +- tutorial/example_countdown/countdown.yaml | 8 +-- .../countdown_answer_as_judge.py | 4 +- tutorial/example_feedback_tracing/README.md | 2 +- .../example_feedback_tracing.yaml | 8 +-- tutorial/example_feedback_tracing/train.py | 2 +- tutorial/example_frozenlake/frozenlake.py | 6 +- .../example_frozenlake/frozenlake_easy.yaml | 8 +-- .../example_frozenlake/frozenlake_hard.yaml | 8 +-- tutorial/example_learn2ask/learn2ask.md | 2 +- tutorial/example_learn2ask/learn2ask.py | 4 +- tutorial/example_learn2ask/learn2ask.yaml | 8 +-- tutorial/example_math_agent/math_agent.md | 30 ++++---- tutorial/example_math_agent/math_agent.py | 2 +- tutorial/example_math_agent/math_agent.yaml | 8 +-- .../example_math_agent/math_agent_simplify.py | 2 +- .../math_answer_as_judge.py | 10 +-- .../example_rm_auto_grader/auto_grader.md | 6 +- .../auto_grader_example.py | 16 ++--- tutorial/example_rm_auto_grader/config.md | 10 +-- tutorial/example_rubrics_judge/math_agent.md | 30 ++++---- tutorial/example_rubrics_judge/math_agent.py | 2 +- tutorial/example_rubrics_judge/r_judge.yaml | 8 +-- tutorial/example_werewolves/start.py | 4 +- tutorial/example_werewolves/werewolves.md | 22 +++--- tutorial/example_werewolves/werewolves.yaml | 8 +-- 198 files changed, 989 insertions(+), 989 deletions(-) delete mode 100644 agentscope_tuner/__init__.py delete mode 100644 agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc delete mode 100644 agentscope_tuner/default_config/trinity/trinity_launch.yaml delete mode 100644 agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc delete mode 100644 agentscope_tuner/tuner_lib/weight_tuner/__init__.py create mode 100644 ajet/__init__.py rename {agentscope_tuner => ajet}/backbone/__init__.py (83%) rename {agentscope_tuner => ajet}/backbone/main_trinity.py (89%) rename {agentscope_tuner => ajet}/backbone/main_verl.py (95%) rename {agentscope_tuner => ajet}/backbone/main_vllm.py (78%) rename {agentscope_tuner => ajet}/backbone/trainer_trinity.py (94%) rename {agentscope_tuner => ajet}/backbone/trainer_verl.py (96%) rename {agentscope_tuner => ajet}/backbone/warm_up.py (89%) rename {agentscope_tuner => ajet}/cli/__init__.py (100%) rename {agentscope_tuner => ajet}/cli/job.py (79%) rename {agentscope_tuner => ajet}/cli/launcher.py (92%) rename {agentscope_tuner => ajet}/context_tracker/__init__.py (100%) rename {agentscope_tuner => ajet}/context_tracker/agentscope_tracker/multiagent_tracking.py (92%) rename {agentscope_tuner => ajet}/context_tracker/agentscope_tracker/timeline_merging.py (98%) rename {agentscope_tuner => ajet}/context_tracker/base_tracker.py (91%) rename {agentscope_tuner => ajet}/context_tracker/basic_tracker.py (96%) rename {agentscope_tuner => ajet}/data_generator/__init__.py (100%) rename {agentscope_tuner => ajet}/data_generator/base_data_generator.py (92%) rename {agentscope_tuner => ajet}/data_generator/config.py (100%) rename {agentscope_tuner => ajet}/data_generator/knowledge_augmentation.py (97%) rename {agentscope_tuner => ajet}/data_generator/task_augmentation.py (97%) rename {agentscope_tuner => ajet}/default_config/README.md (100%) rename {agentscope_tuner => ajet}/default_config/astune_default.py (97%) rename {agentscope_tuner => ajet}/default_config/astune_default.yaml (98%) rename {agentscope_tuner => ajet}/default_config/trinity/README.md (84%) rename {agentscope_tuner => ajet}/default_config/trinity/README_ZH.md (84%) create mode 100644 ajet/default_config/trinity/config_auto_convertion_trinity.jsonc rename {agentscope_tuner => ajet}/default_config/trinity/trinity_default.yaml (84%) create mode 100644 ajet/default_config/trinity/trinity_launch.yaml create mode 100644 ajet/default_config/verl/config_auto_convertion_verl.jsonc rename {agentscope_tuner => ajet}/default_config/verl/verl_default.yaml (96%) rename {agentscope_tuner => ajet}/schema/__init__.py (100%) rename {agentscope_tuner => ajet}/schema/document.py (100%) rename {agentscope_tuner => ajet}/schema/extended_msg.py (99%) rename {agentscope_tuner => ajet}/schema/logprob.py (100%) rename {agentscope_tuner => ajet}/schema/task.py (100%) rename {agentscope_tuner => ajet}/schema/trajectory.py (96%) rename {agentscope_tuner => ajet}/task_judge/base_judge.py (76%) rename {agentscope_tuner => ajet}/task_judge/env_service_as_judge.py (82%) rename {agentscope_tuner => ajet}/task_judge/rm_auto_grader_judge.py (93%) rename {agentscope_tuner => ajet}/task_reader/__init__.py (88%) rename {agentscope_tuner => ajet}/task_reader/data_generator_reader.py (97%) rename {agentscope_tuner => ajet}/task_reader/document_reader/doc_reader.py (98%) rename {agentscope_tuner => ajet}/task_reader/document_reader/document_reader_base.py (79%) rename {agentscope_tuner => ajet}/task_reader/env_service_reader.py (86%) rename {agentscope_tuner => ajet}/task_reader/hf_dataset_reader.py (95%) rename {agentscope_tuner => ajet}/task_reader/jsonl_reader.py (94%) rename {agentscope_tuner => ajet}/task_reader/task_reader_base.py (86%) rename {agentscope_tuner => ajet}/task_reader/tracing_reader/__init__.py (93%) rename {agentscope_tuner => ajet}/task_reader/tracing_reader/connector.py (99%) rename {agentscope_tuner => ajet}/task_reader/tracing_reader/filters/__init__.py (100%) rename {agentscope_tuner => ajet}/task_reader/tracing_reader/filters/base.py (96%) rename {agentscope_tuner => ajet}/task_reader/tracing_reader/filters/deduplication_filter.py (90%) rename {agentscope_tuner => ajet}/task_reader/tracing_reader/filters/factory.py (100%) rename {agentscope_tuner => ajet}/task_reader/tracing_reader/filters/llm_evaluate_filter.py (96%) rename {agentscope_tuner => ajet}/task_reader/tracing_reader/llm_client.py (100%) rename {agentscope_tuner => ajet}/task_rollout/__init__.py (100%) rename {agentscope_tuner => ajet}/task_rollout/async_llm_bridge.py (93%) rename {agentscope_tuner => ajet}/task_rollout/dashscope_llm_bridge.py (100%) rename {agentscope_tuner => ajet}/task_rollout/native_parallel_worker.py (97%) rename {agentscope_tuner => ajet}/task_rollout/resource_keeper.py (94%) rename {agentscope_tuner => ajet}/task_rollout/single_worker.py (87%) rename {agentscope_tuner => ajet}/task_runner/__init__.py (100%) rename {agentscope_tuner => ajet}/task_runner/agentscope_runner.py (81%) rename {agentscope_tuner => ajet}/task_runner/base_runner.py (63%) rename {agentscope_tuner => ajet}/tuner.py (96%) create mode 100644 ajet/tuner_lib/weight_tuner/__init__.py rename {agentscope_tuner => ajet}/tuner_lib/weight_tuner/as_agentscope_model.py (94%) rename {agentscope_tuner => ajet}/tuner_lib/weight_tuner/as_oai_sdk_model.py (100%) rename {agentscope_tuner => ajet}/tuner_lib/weight_tuner/middleware.py (100%) rename {agentscope_tuner => ajet}/tuner_v2.md (100%) rename {agentscope_tuner => ajet}/tuner_v2.py (93%) rename {agentscope_tuner => ajet}/utils/__init__.py (100%) rename {agentscope_tuner => ajet}/utils/async_utils.py (100%) rename {agentscope_tuner => ajet}/utils/cleaner.py (100%) rename {agentscope_tuner => ajet}/utils/color_hsl.py (100%) rename {agentscope_tuner => ajet}/utils/compute_madness.py (100%) rename {agentscope_tuner => ajet}/utils/config_computer.py (87%) rename {agentscope_tuner => ajet}/utils/config_utils.py (92%) rename {agentscope_tuner => ajet}/utils/core_env_vars.py (95%) rename {agentscope_tuner => ajet}/utils/dynamic_import.py (100%) rename {agentscope_tuner => ajet}/utils/embedding_client.py (100%) rename {agentscope_tuner => ajet}/utils/env_service_client/__init__.py (100%) rename {agentscope_tuner => ajet}/utils/env_service_client/env_client_ng.py (100%) rename {agentscope_tuner => ajet}/utils/launch_utils.py (93%) rename {agentscope_tuner => ajet}/utils/magic_mock.py (100%) rename {agentscope_tuner => ajet}/utils/message_utils.py (100%) rename {agentscope_tuner => ajet}/utils/process_dataset.py (100%) rename {agentscope_tuner => ajet}/utils/pty.py (98%) rename {agentscope_tuner => ajet}/utils/retry.py (95%) rename {agentscope_tuner => ajet}/utils/robust_dashscope.py (100%) rename {agentscope_tuner => ajet}/utils/sample.py (50%) rename {agentscope_tuner => ajet}/utils/smart_daemon.py (99%) rename {agentscope_tuner => ajet}/utils/testing_utils.py (93%) rename {agentscope_tuner => ajet}/utils/tokenizer.py (100%) rename {agentscope_tuner => ajet}/workflow.py (97%) diff --git a/.github/workflows/docker/docker-compose.yaml b/.github/workflows/docker/docker-compose.yaml index 83629fb8..8faf5d1d 100644 --- a/.github/workflows/docker/docker-compose.yaml +++ b/.github/workflows/docker/docker-compose.yaml @@ -1,6 +1,6 @@ services: - astuner-node-1: + ajet-node-1: image: agentscope-tuner-unittest:latest pull_policy: never command: bash -c "uv pip install -e .[trinity] && ray start --head --dashboard-host 0.0.0.0 --include-dashboard true --block" @@ -10,7 +10,7 @@ services: - RAY_ADDRESS=auto working_dir: /workspace volumes: - - astuner-volume:/mnt + - ajet-volume:/mnt - ../../..:/workspace shm_size: "64G" deploy: @@ -22,5 +22,5 @@ services: capabilities: [gpu] volumes: - astuner-volume: + ajet-volume: external: true diff --git a/.github/workflows/unittest.yaml b/.github/workflows/unittest.yaml index 72652eb7..fa2a7df5 100644 --- a/.github/workflows/unittest.yaml +++ b/.github/workflows/unittest.yaml @@ -19,22 +19,22 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - path: astuner-${{ github.run_id }} + path: ajet-${{ github.run_id }} ref: refs/pull/${{ github.event.issue.number }}/head - name: Setup docker compose - working-directory: astuner-${{ github.run_id }}/.github/workflows/docker + working-directory: ajet-${{ github.run_id }}/.github/workflows/docker run: | docker compose up -d sleep 15s - name: Check ray status - working-directory: astuner-${{ github.run_id }}/.github/workflows/docker + working-directory: ajet-${{ github.run_id }}/.github/workflows/docker run: | MAX_RETRIES=20 RETRY_INTERVAL=5 for i in $(seq 1 $MAX_RETRIES); do - docker compose exec astuner-node-1 ray status && docker compose exec astuner-node-2 ray status && break + docker compose exec ajet-node-1 ray status && docker compose exec ajet-node-2 ray status && break echo "Waiting for ray cluster to be ready... ($i/$MAX_RETRIES)" sleep $RETRY_INTERVAL if [ "$i" -eq "$MAX_RETRIES" ]; then @@ -45,7 +45,7 @@ jobs: - name: Decide test type id: test_type - working-directory: astuner-${{ github.run_id }} + working-directory: ajet-${{ github.run_id }} run: | COMMENT="${{ github.event.comment.body }}" if [[ "$COMMENT" == "/unittest"* ]]; then @@ -53,16 +53,16 @@ jobs: fi - name: Run unittest - working-directory: astuner-${{ github.run_id }}/.github/workflows/docker + working-directory: ajet-${{ github.run_id }}/.github/workflows/docker run: | TYPE="${{ steps.test_type.outputs.type }}" if [ "$TYPE" = "all" ]; then echo "tests_run=true" >> $GITHUB_ENV - docker compose exec astuner-node-1 pytest tests -v -s --ctrf report.json + docker compose exec ajet-node-1 pytest tests -v -s --ctrf report.json fi - name: Convert report.json time to ms - working-directory: astuner-${{ github.run_id }} + working-directory: ajet-${{ github.run_id }} if: env.tests_run == 'true' || failure() run: | REPORT=report.json @@ -71,10 +71,10 @@ jobs: fi - name: Clean checkpoint dir - working-directory: astuner-${{ github.run_id }}/.github/workflows/docker + working-directory: ajet-${{ github.run_id }}/.github/workflows/docker if: always() run: | - docker compose exec astuner-node-1 rm -rf /mnt/checkpoints/* + docker compose exec ajet-node-1 rm -rf /mnt/checkpoints/* continue-on-error: true - name: Upload test results @@ -82,14 +82,14 @@ jobs: uses: actions/upload-artifact@v4 with: name: pytest-results - path: astuner-${{ github.run_id }}/report.json + path: ajet-${{ github.run_id }}/report.json continue-on-error: true - name: Publish Test Report if: env.tests_run == 'true' || failure() uses: ctrf-io/github-test-reporter@v1 with: - report-path: astuner-${{ github.run_id }}/report.json + report-path: ajet-${{ github.run_id }}/report.json summary: true pull-request: false issue: ${{ github.event.issue.number }} @@ -98,7 +98,7 @@ jobs: continue-on-error: true - name: Remove docker compose - working-directory: astuner-${{ github.run_id }}/.github/workflows/docker + working-directory: ajet-${{ github.run_id }}/.github/workflows/docker if: always() run: | docker compose down --remove-orphans @@ -107,5 +107,5 @@ jobs: - name: Cleanup workspace if: always() run: | - rm -rf astuner-${{ github.run_id }} 2>/dev/null + rm -rf ajet-${{ github.run_id }} 2>/dev/null continue-on-error: true diff --git a/README.md b/README.md index d3eca760..87a1c332 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ -# AgentScope Tuner Documentation +# AgentJet [![Benchmarking](https://img.shields.io/badge/Benchmarking-0078D4?style=for-the-badge&logo=github)](https://benchmark.agent-matrix.com/) [![Docs](https://img.shields.io/badge/Docs-Read%20the%20Guide-0A7ECC?style=for-the-badge&logo=readthedocs&logoColor=white)](docs/en/installation.md) [![License](https://img.shields.io/badge/License-Apache--2.0-4c1?style=for-the-badge)](LICENSE) [![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=for-the-badge&logo=python&logoColor=white)](docs/en/installation.md#requirements) -**AgentScope Tuner (ASTuner)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentJet (AJet)** is a cutting-edge, user-friendly training framework designed to optimize agents and workflows (built with OpenAI SDK, AgentScope, and even vllm http requests), fine-tuning language model weights behind the scenes. -Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! +Simply provide your Agent workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! @@ -18,17 +18,17 @@ Let's begin with the simplest example: a math agent with a tool call. - First, please check out the [installation guide](docs/en/installation.md) to set up the training environment. - Then, tune your first model using the minimum example. ```python - astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray + ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' --with-ray ``` ## Features -We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: +We aim to build a easy-to-learn Agent tuner that unlock more possibilities for agent developers: - **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) as tutorials. -- **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](docs/en/installation.md) backbone. +- **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=verl`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](docs/en/installation.md) backbone. **把verl换成默认BB** - **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). @@ -67,7 +67,7 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](docs/en/example_math_agent.md) as an example: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` #### Example Library @@ -108,7 +108,7 @@ The internal system orchestrates several specialized modules to handle the compl * **Launcher**: Manages background service processes (Ray, vLLM) and routes the backbone. * **Task Reader**: Handles data ingestion, augmentation, and filtering. * **Task Rollout**: Bridges LLM engines and manages the Gym environment lifecycle. -* **Task Runner**: Executes the AgentScope workflow and calculates rewards. +* **Task Runner**: Executes the Agent workflow and calculates rewards. * **Model Tuner**: Forwards inference requests from the workflow to the LLM engine. * **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **3x to 10x**. diff --git a/agentscope_tuner/__init__.py b/agentscope_tuner/__init__.py deleted file mode 100644 index 6541160d..00000000 --- a/agentscope_tuner/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from agentscope_tuner.cli.job import AstunerJob -from agentscope_tuner.schema.task import WorkflowOutput, WorkflowTask -from agentscope_tuner.tuner import ModelTuner -from agentscope_tuner.workflow import Workflow - -__all__ = [ - "Workflow", - "WorkflowTask", - "WorkflowOutput", - "ModelTuner", - "AstunerJob", -] - -__version__ = "0.1.0" diff --git a/agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc b/agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc deleted file mode 100644 index 2ded0e61..00000000 --- a/agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc +++ /dev/null @@ -1,26 +0,0 @@ -{ - "astuner.trainer_common.nnodes": "cluster.node_num", - "astuner.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", - "astuner.trainer_common.total_epochs": "buffer.total_epochs", - "astuner.trainer_common.test_freq": "explorer.eval_interval", - "astuner.trainer_common.save_freq": "trainer.save_interval", - "astuner.trainer_common.ulysses_sequence_parallel_size": "trainer.ulysses_sequence_parallel_size", - "astuner.trainer_common.optim.lr": "algorithm.optimizer.lr", - "astuner.trainer_common.logger": "monitor.monitor_type", - "astuner.trainer_common.checkpoint_base_dir": "checkpoint_root_dir", - "astuner.rollout.n_vllm_engine": "explorer.rollout_model.engine_num", - "astuner.model.path": "model.model_path", - "astuner.project_name": "project", - "astuner.experiment_name": "name", - "astuner.data.max_response_length": "model.max_response_tokens", - "astuner.rollout.num_repeat": "algorithm.repeat_times", - "astuner.rollout.tensor_model_parallel_size": "explorer.rollout_model.tensor_parallel_size", - "astuner.rollout.max_model_len": [ - "model.max_model_len", - "trainer.max_token_len_per_gpu" - ], - - "astuner.data.train_batch_size": "buffer.batch_size", - "(astuner.data.train_batch_size * astuner.rollout.num_repeat * astuner.rollout.multi_turn.expected_steps)": "buffer.train_batch_size", - "(min(astuner.rollout.max_env_worker, 128) // astuner.rollout.n_vllm_engine)": "explorer.runner_per_model" -} diff --git a/agentscope_tuner/default_config/trinity/trinity_launch.yaml b/agentscope_tuner/default_config/trinity/trinity_launch.yaml deleted file mode 100644 index f4c64c6c..00000000 --- a/agentscope_tuner/default_config/trinity/trinity_launch.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD - -algorithm: - algorithm_type: multi_step_grpo diff --git a/agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc b/agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc deleted file mode 100644 index a1014188..00000000 --- a/agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc +++ /dev/null @@ -1,39 +0,0 @@ -{ - "astuner.trainer_common.total_epochs": "trainer.total_epochs", - - "astuner.trainer_common.val_before_train": "trainer.val_before_train", - "astuner.trainer_common.n_gpus_per_node": "trainer.n_gpus_per_node", - "astuner.trainer_common.nnodes": "trainer.nnodes", - "astuner.trainer_common.logger": "trainer.logger", - "astuner.trainer_common.checkpoint_base_dir": "trainer.checkpoint_base_dir", - "astuner.trainer_common.algorithm.adv_estimator": "algorithm.adv_estimator", - "astuner.trainer_common.algorithm.use_kl_in_reward": "algorithm.use_kl_in_reward", - "astuner.trainer_common.mini_batch_num": "actor_rollout_ref.actor.override_ppo_mini_batch_num", - "astuner.trainer_common.fsdp_config": "actor_rollout_ref.actor.fsdp_config", - "astuner.trainer_common.optim": "actor_rollout_ref.actor.optim", - "astuner.trainer_common.use_kl_loss": "actor_rollout_ref.actor.use_kl_loss", - "astuner.trainer_common.kl_loss_coef": "actor_rollout_ref.actor.kl_loss_coef", - "astuner.trainer_common.kl_loss_type": "actor_rollout_ref.actor.kl_loss_type", - "astuner.trainer_common.ulysses_sequence_parallel_size": "actor_rollout_ref.actor.ulysses_sequence_parallel_size", - - "astuner.trainer_common.save_freq": "trainer.save_freq", - "astuner.trainer_common.test_freq": "trainer.test_freq", - - "astuner.data.max_prompt_length": "data.max_prompt_length", - "astuner.data.max_response_length": "data.max_response_length", - "astuner.data.train_batch_size": "data.train_batch_size", - - "astuner.rollout.max_model_len": [ - "actor_rollout_ref.rollout.max_model_len", - "actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu", - "actor_rollout_ref.actor.ppo_max_token_len_per_gpu", - "actor_rollout_ref.ref.log_prob_max_token_len_per_gpu" - ], - - "astuner.rollout.multi_turn": "actor_rollout_ref.rollout.multi_turn", - "astuner.rollout.val_kwargs": "actor_rollout_ref.rollout.val_kwargs", - - "astuner.model.path": "actor_rollout_ref.model.path", - "astuner.project_name": "trainer.project_name", - "astuner.experiment_name": "trainer.experiment_name" -} diff --git a/agentscope_tuner/tuner_lib/weight_tuner/__init__.py b/agentscope_tuner/tuner_lib/weight_tuner/__init__.py deleted file mode 100644 index 2a9c9311..00000000 --- a/agentscope_tuner/tuner_lib/weight_tuner/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ - -from agentscope_tuner.tuner_lib.weight_tuner.as_agentscope_model import AgentScopeModelTuner -from agentscope_tuner.tuner_lib.weight_tuner.as_oai_sdk_model import OpenaiClientModelTuner - diff --git a/ajet/__init__.py b/ajet/__init__.py new file mode 100644 index 00000000..74030ac9 --- /dev/null +++ b/ajet/__init__.py @@ -0,0 +1,14 @@ +from ajet.cli.job import AstunerJob +from ajet.schema.task import WorkflowOutput, WorkflowTask +from ajet.tuner import ModelTuner +from ajet.workflow import Workflow + +__all__ = [ + "Workflow", + "WorkflowTask", + "WorkflowOutput", + "ModelTuner", + "AstunerJob", +] + +__version__ = "0.1.0" diff --git a/agentscope_tuner/backbone/__init__.py b/ajet/backbone/__init__.py similarity index 83% rename from agentscope_tuner/backbone/__init__.py rename to ajet/backbone/__init__.py index 30ae802c..7364d0ff 100644 --- a/agentscope_tuner/backbone/__init__.py +++ b/ajet/backbone/__init__.py @@ -1,7 +1,7 @@ from loguru import logger try: - from agentscope_tuner.backbone.trainer_trinity import ( + from ajet.backbone.trainer_trinity import ( ASTunerTaskReader, ASTunerWorkflowWrap, TrinityRolloutManager, diff --git a/agentscope_tuner/backbone/main_trinity.py b/ajet/backbone/main_trinity.py similarity index 89% rename from agentscope_tuner/backbone/main_trinity.py rename to ajet/backbone/main_trinity.py index 08c105ae..fe510399 100644 --- a/agentscope_tuner/backbone/main_trinity.py +++ b/ajet/backbone/main_trinity.py @@ -4,8 +4,8 @@ from trinity.explorer.explorer import Explorer from trinity.trainer.trainer import Trainer -from agentscope_tuner.utils.core_env_vars import get_runtime_env -from agentscope_tuner.utils.launch_utils import set_loguru_default_color +from ajet.utils.core_env_vars import get_runtime_env +from ajet.utils.launch_utils import set_loguru_default_color set_loguru_default_color() diff --git a/agentscope_tuner/backbone/main_verl.py b/ajet/backbone/main_verl.py similarity index 95% rename from agentscope_tuner/backbone/main_verl.py rename to ajet/backbone/main_verl.py index fb5367cc..fc1af4e4 100644 --- a/agentscope_tuner/backbone/main_verl.py +++ b/ajet/backbone/main_verl.py @@ -26,8 +26,8 @@ from verl.trainer.ppo.reward import load_reward_manager from verl.utils.device import is_cuda_available -from agentscope_tuner.utils.core_env_vars import get_runtime_env -from agentscope_tuner.utils.launch_utils import set_loguru_default_color +from ajet.utils.core_env_vars import get_runtime_env +from ajet.utils.launch_utils import set_loguru_default_color set_loguru_default_color() @@ -119,7 +119,7 @@ def run(self, config): # Download the checkpoint from HDFS to the local machine. # `use_shm` determines whether to use shared memory, which could lead to faster model loading if turned on local_path = copy_to_local( - config.astuner.model.path, + config.ajet.model.path, use_shm=config.actor_rollout_ref.model.get("use_shm", False), ) @@ -231,21 +231,21 @@ def run(self, config): from verl.utils.dataset.rl_dataset import collate_fn # Create training and validation datasets. - from agentscope_tuner.task_reader import ( + from ajet.task_reader import ( RouterTaskReader, task_to_standard_dataset, ) - from agentscope_tuner.utils.process_dataset import create_rl_sampler + from ajet.utils.process_dataset import create_rl_sampler task_reader = RouterTaskReader( - config.astuner.task_reader.type, - config.astuner.task_reader, + config.ajet.task_reader.type, + config.ajet.task_reader, ) val_dataset = task_to_standard_dataset(task_reader.get_validation_tasks()) train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from agentscope_tuner.backbone.trainer_verl import ASTunerRayPPOTrainer + from ajet.backbone.trainer_verl import ASTunerRayPPOTrainer # Initialize the PPO trainer. trainer = ASTunerRayPPOTrainer( diff --git a/agentscope_tuner/backbone/main_vllm.py b/ajet/backbone/main_vllm.py similarity index 78% rename from agentscope_tuner/backbone/main_vllm.py rename to ajet/backbone/main_vllm.py index 112c16f8..ba681593 100644 --- a/agentscope_tuner/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -5,9 +5,9 @@ import hydra from openai import OpenAI -from agentscope_tuner.backbone.warm_up import warm_up_process -from agentscope_tuner.task_rollout.native_parallel_worker import VerlRolloutManager -from agentscope_tuner.utils.launch_utils import set_loguru_default_color +from ajet.backbone.warm_up import warm_up_process +from ajet.task_rollout.native_parallel_worker import VerlRolloutManager +from ajet.utils.launch_utils import set_loguru_default_color set_loguru_default_color() @@ -29,7 +29,7 @@ def __init__(self, url, config): self.url = url self.config = config - self.tokenizer = AutoTokenizer.from_pretrained(self.config.astuner.model.path) + self.tokenizer = AutoTokenizer.from_pretrained(self.config.ajet.model.path) self.chat_scheduler = SimpleNamespace( model_name="dummy-model-name", weighted_addresses="dummy-weighted-addresses", @@ -43,24 +43,24 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ ) sampling_params = dict( n=1, - max_completion_tokens=self.config.astuner.rollout.max_response_length_in_one_turn, + max_completion_tokens=self.config.ajet.rollout.max_response_length_in_one_turn, ) - sampling_params["temperature"] = self.config.astuner.rollout.val_kwargs.temperature - sampling_params["top_k"] = self.config.astuner.rollout.val_kwargs.top_k - sampling_params["top_p"] = self.config.astuner.rollout.val_kwargs.top_p + sampling_params["temperature"] = self.config.ajet.rollout.val_kwargs.temperature + sampling_params["top_k"] = self.config.ajet.rollout.val_kwargs.top_k + sampling_params["top_p"] = self.config.ajet.rollout.val_kwargs.top_p sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) if tools: completion = client.chat.completions.create( - model=self.config.astuner.model.path, + model=self.config.ajet.model.path, messages=messages, tools=tools, extra_body=sampling_params, ) else: completion = client.chat.completions.create( - model=self.config.astuner.model.path, + model=self.config.ajet.model.path, messages=messages, extra_body=sampling_params, ) @@ -85,9 +85,9 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ def run(config): # --------- fast adjustment for debugging --------- warm_up_process(config) - max_parallel = config.astuner.debug.debug_max_parallel - n_task = config.astuner.debug.debug_first_n_tasks - vllm_port = config.astuner.debug.debug_vllm_port + max_parallel = config.ajet.debug.debug_max_parallel + n_task = config.ajet.debug.debug_first_n_tasks + vllm_port = config.ajet.debug.debug_vllm_port # --------- init --------- async_rollout_manager = ChatCompletionScheduler( @@ -102,11 +102,11 @@ def run(config): tokenizer=async_rollout_manager.tokenizer, ) - from agentscope_tuner.task_reader import RouterTaskReader + from ajet.task_reader import RouterTaskReader task_reader = RouterTaskReader( - config.astuner.task_reader.type, - config.astuner.task_reader, + config.ajet.task_reader.type, + config.ajet.task_reader, ) tasks = task_reader.get_validation_tasks() print(tasks[:2]) @@ -118,7 +118,7 @@ def run(config): @hydra.main( - config_path="agentscope_tuner/default_config", + config_path="ajet/default_config", config_name="astune_default", version_base=None, ) @@ -131,11 +131,11 @@ def main(config): def companion_launch(): import torch - from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent + from ajet.utils.smart_daemon import LaunchCommandWhenAbsent print("Launching companion process for async LLM server...") - model_path = config.astuner.model.path - tensor_parallel_size = config.astuner.debug.debug_tensor_parallel_size + model_path = config.ajet.model.path + tensor_parallel_size = config.ajet.debug.debug_tensor_parallel_size n_avail_gpus = torch.cuda.device_count() if tensor_parallel_size > n_avail_gpus: print( @@ -144,9 +144,9 @@ def companion_launch(): tensor_parallel_size = n_avail_gpus gpu_memory_utilization = config.actor_rollout_ref.rollout.gpu_memory_utilization max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs - max_model_len = config.astuner.rollout.max_model_len - seed = config.astuner.debug.debug_vllm_seed - vllm_port = config.astuner.debug.debug_vllm_port + max_model_len = config.ajet.rollout.max_model_len + seed = config.ajet.debug.debug_vllm_seed + vllm_port = config.ajet.debug.debug_vllm_port companion = LaunchCommandWhenAbsent( full_argument_list=[ sys.executable, diff --git a/agentscope_tuner/backbone/trainer_trinity.py b/ajet/backbone/trainer_trinity.py similarity index 94% rename from agentscope_tuner/backbone/trainer_trinity.py rename to ajet/backbone/trainer_trinity.py index 596a33ed..01ab8f5b 100644 --- a/agentscope_tuner/backbone/trainer_trinity.py +++ b/ajet/backbone/trainer_trinity.py @@ -18,15 +18,15 @@ from trinity.utils.log import get_logger from trinity.utils.monitor import MONITOR, Monitor -from agentscope_tuner.backbone.warm_up import warm_up_process -from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.backbone.warm_up import warm_up_process +from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from agentscope_tuner.schema.trajectory import Sample -from agentscope_tuner.task_reader import dict_to_astuner_task -from agentscope_tuner.task_rollout.native_parallel_worker import DynamicRolloutManager -from agentscope_tuner.utils.config_utils import read_astune_config_with_cache -from agentscope_tuner.utils.testing_utils import _test_if_test_mode +from ajet.schema.trajectory import Sample +from ajet.task_reader import dict_to_astuner_task +from ajet.task_rollout.native_parallel_worker import DynamicRolloutManager +from ajet.utils.config_utils import read_astune_config_with_cache +from ajet.utils.testing_utils import _test_if_test_mode def get_astune_config_from_trinity_side(): @@ -65,7 +65,7 @@ def __init__( ) def convert_task(self, task: TrinityTask): - from agentscope_tuner.schema.task import Task + from ajet.schema.task import Task assert isinstance(task.raw_task, dict) return dict_to_astuner_task(task.raw_task) @@ -188,7 +188,7 @@ async def run_async(self): try: - @READER.register_module("astuner") + @READER.register_module("ajet") class ASTunerTaskReader(TaskFileReader): def __init__(self, config): self.config = config @@ -197,14 +197,14 @@ def __init__(self, config): astune_config = get_astune_config_from_trinity_side() - from agentscope_tuner.task_reader import ( + from ajet.task_reader import ( RouterTaskReader, task_to_standard_dataset, ) task_reader = RouterTaskReader( - astune_config.astuner.task_reader.type, - astune_config.astuner.task_reader, + astune_config.ajet.task_reader.type, + astune_config.ajet.task_reader, ) dataset_segments = [] @@ -358,13 +358,13 @@ def log(self, data: dict, step: int, commit: bool = False) -> None: self.console_logger.info(f"Step {step}: {data}") astune_config = get_astune_config_from_trinity_side() - experiment_dir = astune_config.astuner.experiment_dir + experiment_dir = astune_config.ajet.experiment_dir trinity_log = f"{experiment_dir}/{self.exp_name}.log" with open(trinity_log, "a") as f: f.write(f"Step {step}: {data}\n") - if astune_config.astuner.execute_test: # apply a test probe + if astune_config.ajet.execute_test: # apply a test probe if "critic/score/mean" in data: return if "experience_pipeline/group_advantages/reward_mean/mean" not in data: diff --git a/agentscope_tuner/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py similarity index 96% rename from agentscope_tuner/backbone/trainer_verl.py rename to ajet/backbone/trainer_verl.py index eba46241..35337795 100644 --- a/agentscope_tuner/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -49,11 +49,11 @@ from verl.utils.debug import marked_timer from verl.utils.metric import reduce_metrics -from agentscope_tuner.backbone.warm_up import warm_up_process -from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_reader import dict_to_astuner_task -from agentscope_tuner.task_rollout.native_parallel_worker import VerlRolloutManager +from ajet.backbone.warm_up import warm_up_process +from ajet.context_tracker.basic_tracker import BaseContextTracker +from ajet.schema.task import Task +from ajet.task_reader import dict_to_astuner_task +from ajet.task_rollout.native_parallel_worker import VerlRolloutManager def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | torch.Tensor: @@ -212,7 +212,7 @@ def _validate_config(self): # 1. Check total batch size for data correctness real_train_batch_size = ( - config.astuner.data.train_batch_size * config.astuner.rollout.num_repeat + config.ajet.data.train_batch_size * config.ajet.rollout.num_repeat ) assert real_train_batch_size % minimal_bsz == 0, ( f"real_train_batch_size ({real_train_batch_size}) must be divisible by minimal possible batch size " @@ -261,7 +261,7 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): actor_config = omega_conf_to_dataclass(config.actor_rollout_ref.actor) actor_config.validate( n_gpus, - config.astuner.data.train_batch_size, + config.ajet.data.train_batch_size, config.actor_rollout_ref.model, ) except hydra.errors.InstantiationException: @@ -279,8 +279,8 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # The rollout section also has log_prob_micro_batch_size vs. log_prob_micro_batch_size_per_gpu check_mutually_exclusive( - config.astuner.rollout.log_prob_micro_batch_size, - config.astuner.rollout.log_prob_micro_batch_size_per_gpu, + config.ajet.rollout.log_prob_micro_batch_size, + config.ajet.rollout.log_prob_micro_batch_size_per_gpu, "actor_rollout_ref.rollout", ) @@ -298,7 +298,7 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): # critic if self.use_critic: critic_config = omega_conf_to_dataclass(config.critic) - critic_config.validate(n_gpus, config.astuner.data.train_batch_size) + critic_config.validate(n_gpus, config.ajet.data.train_batch_size) if config.data.get("val_batch_size", None) is not None: print( @@ -308,9 +308,9 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): ) # check eval config - if config.astuner.rollout.val_kwargs.do_sample: + if config.ajet.rollout.val_kwargs.do_sample: assert ( - config.astuner.rollout.temperature > 0 + config.ajet.rollout.temperature > 0 ), "validation gen temperature should be greater than 0 when enabling do_sample" print("[validate_config] All configuration checks passed successfully!") @@ -439,7 +439,7 @@ def init_workers(self): self.parallel_env = VerlRolloutManager( config=self.config, async_rollout_manager=self.async_rollout_manager, - max_parallel=self.config.astuner.rollout.max_env_worker, + max_parallel=self.config.ajet.rollout.max_env_worker, tokenizer=self.tokenizer, ) @@ -458,8 +458,8 @@ def fit(self): # noqa: C901 warm_up_process(self.config) self.verl_logger = Tracking( - project_name=self.config.astuner.project_name, - experiment_name=self.config.astuner.experiment_name, + project_name=self.config.ajet.project_name, + experiment_name=self.config.ajet.experiment_name, default_backend=self.config.trainer.logger, config=OmegaConf.to_container(self.config, resolve=True), ) @@ -602,10 +602,10 @@ def fit(self): # noqa: C901 ), } ) - if self.config.astuner.execute_test: # apply a test probe + if self.config.ajet.execute_test: # apply a test probe from swanlab.data.run.main import get_run - from agentscope_tuner.utils.testing_utils import ( + from ajet.utils.testing_utils import ( _test_if_test_mode, ) @@ -736,7 +736,7 @@ def fit(self): # noqa: C901 adv_estimator=self.config.algorithm.adv_estimator, gamma=self.config.algorithm.gamma, lam=self.config.algorithm.lam, - num_repeat=self.config.astuner.rollout.num_repeat, + num_repeat=self.config.ajet.rollout.num_repeat, norm_adv_by_std_in_grpo=norm_adv_by_std_in_grpo, config=self.config.algorithm, ) @@ -857,7 +857,7 @@ def _validate(self): # repeat test batch test_batch = test_batch.repeat( - repeat_times=self.config.astuner.rollout.val_kwargs.num_repeat, + repeat_times=self.config.ajet.rollout.val_kwargs.num_repeat, interleave=True, ) @@ -898,7 +898,7 @@ def _validate(self): "eos_token_id": self.tokenizer.eos_token_id, "pad_token_id": self.tokenizer.pad_token_id, "recompute_log_prob": False, - "do_sample": self.config.astuner.rollout.val_kwargs.do_sample, + "do_sample": self.config.ajet.rollout.val_kwargs.do_sample, "validate": True, "global_steps": self.global_steps, } @@ -980,7 +980,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): Returns: Tuple of (ctx_trackers, tasks) containing trajectory results and task definitions """ - pass_n = self.config.astuner.trainer_common.val_pass_n + pass_n = self.config.ajet.trainer_common.val_pass_n tasks = [] for _ in range(pass_n): @@ -1051,11 +1051,11 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): return ctx_trackers, tasks, val_metrics def get_eval_dataset(self): - from agentscope_tuner.task_reader import RouterTaskReader + from ajet.task_reader import RouterTaskReader task_reader = RouterTaskReader( - self.config.astuner.task_reader.type, - self.config.astuner.task_reader, + self.config.ajet.task_reader.type, + self.config.ajet.task_reader, ) tasks = task_reader.get_validation_tasks() self.main_val_dataset = tasks diff --git a/agentscope_tuner/backbone/warm_up.py b/ajet/backbone/warm_up.py similarity index 89% rename from agentscope_tuner/backbone/warm_up.py rename to ajet/backbone/warm_up.py index 034af00d..fb42e309 100644 --- a/agentscope_tuner/backbone/warm_up.py +++ b/ajet/backbone/warm_up.py @@ -49,14 +49,14 @@ def warm_up_process(config): if "PROCESS_LEVEL_WARMUP_INIT" in os.environ: return os.environ["PROCESS_LEVEL_WARMUP_INIT"] = "1" - experiment_name = config.astuner.experiment_name + experiment_name = config.ajet.experiment_name init_parallel_rollout_logger(experiment_name) warm_up_task_judge_when_needed(config) def warm_up_task_judge_when_needed(config): - if config.astuner.task_judge.judge_type == "rubrics_auto_grader": - from agentscope_tuner.task_judge.rm_auto_grader_judge import AutoGraderJudge + if config.ajet.task_judge.judge_type == "rubrics_auto_grader": + from ajet.task_judge.rm_auto_grader_judge import AutoGraderJudge judge = AutoGraderJudge(config) asyncio.run(judge.generate_rubrics_from_samples()) diff --git a/agentscope_tuner/cli/__init__.py b/ajet/cli/__init__.py similarity index 100% rename from agentscope_tuner/cli/__init__.py rename to ajet/cli/__init__.py diff --git a/agentscope_tuner/cli/job.py b/ajet/cli/job.py similarity index 79% rename from agentscope_tuner/cli/job.py rename to ajet/cli/job.py index feeac2ca..67d7ba4b 100644 --- a/agentscope_tuner/cli/job.py +++ b/ajet/cli/job.py @@ -17,19 +17,19 @@ import yaml from loguru import logger -from agentscope_tuner.cli.launcher import ( +from ajet.cli.launcher import ( check_avail_gpu, get_backbone_target, setup_environment_vars, ) -from agentscope_tuner.default_config.astune_default import Config -from agentscope_tuner.utils.config_utils import ( +from ajet.default_config.astune_default import Config +from ajet.utils.config_utils import ( expand_astune_hierarchical_config, prepare_experiment_config, read_astune_hierarchical_config, ) -from agentscope_tuner.utils.dynamic_import import cls_to_path -from agentscope_tuner.utils.launch_utils import execute_training_process +from ajet.utils.dynamic_import import cls_to_path +from ajet.utils.launch_utils import execute_training_process class AstunerJob: @@ -48,10 +48,10 @@ def __init__( self.config_as_dict: dict = self.build_job_from_yaml(None) self.config = Config.update_from_dict_recursive(Config(), self.config_as_dict) - self.config.astuner.backbone = backbone - self.config.astuner.model.path = model - self.config.astuner.trainer_common.n_gpus_per_node = n_gpu - self.config.astuner.trainer_common.algorithm.adv_estimator = algorithm + self.config.ajet.backbone = backbone + self.config.ajet.model.path = model + self.config.ajet.trainer_common.n_gpus_per_node = n_gpu + self.config.ajet.trainer_common.algorithm.adv_estimator = algorithm if n_gpu_for_infer is None and backbone == "trinity": raise ValueError("Please specify `n_gpu_for_infer` (n_gpu_for_infer < n_gpu) for trinity backbone.") if n_gpu_for_infer is not None and backbone == "verl": @@ -59,8 +59,8 @@ def __init__( else: assert isinstance(n_gpu_for_infer, int) assert n_gpu_for_infer < n_gpu, "`n_gpu_for_infer` should be less than `n_gpu`." - self.config.astuner.rollout.n_vllm_engine = n_gpu_for_infer - self.config.astuner.rollout.tensor_model_parallel_size = 1 + self.config.ajet.rollout.n_vllm_engine = n_gpu_for_infer + self.config.ajet.rollout.tensor_model_parallel_size = 1 def build_job_from_yaml(self, yaml_path: str | None) -> dict: self.exp_name = datetime.now().strftime("astuner_job_%Y%m%d_%H%M%S") @@ -87,7 +87,7 @@ def dump_job_as_yaml(self, yaml_path: str) -> str: def set_workflow( self, workflow: Union[str, Callable[..., Any]], ensure_reward_in_workflow: bool = False ) -> "AstunerJob": - self.config.astuner.rollout.agentscope_workflow = cls_to_path(workflow) + self.config.ajet.rollout.agentscope_workflow = cls_to_path(workflow) # TODO: validate workflow outputs contain reward # ensure_reward_in_workflow return self @@ -105,12 +105,12 @@ def set_data( # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` if type in {"hf", "huggingface", "huggingface_dat_repo"}: - self.config.astuner.task_reader.type = "huggingface_dat_repo" - self.config.astuner.task_reader.huggingface_dat_repo.dataset_path = dataset_path - self.config.astuner.task_reader.huggingface_dat_repo.training_split = training_split - self.config.astuner.task_reader.huggingface_dat_repo.validation_split = validation_split + self.config.ajet.task_reader.type = "huggingface_dat_repo" + self.config.ajet.task_reader.huggingface_dat_repo.dataset_path = dataset_path + self.config.ajet.task_reader.huggingface_dat_repo.training_split = training_split + self.config.ajet.task_reader.huggingface_dat_repo.validation_split = validation_split elif type in {"random_dummy", "dummy"}: - self.config.astuner.task_reader.type = "random_dummy" + self.config.ajet.task_reader.type = "random_dummy" else: raise NotImplementedError( f"Please edit yaml to directly set up task reader of type {type}." @@ -119,14 +119,14 @@ def set_data( return self def tune(self, *args, **kwargs) -> "AstunerJob": - ast_cfg = self.config.astuner + ast_cfg = self.config.ajet if not ast_cfg.rollout or not ast_cfg.rollout.agentscope_workflow: raise ValueError("Workflow must be set via set_workflow before tuning.") if not ast_cfg.task_reader: raise ValueError("Data source must be set via set_data before tuning.") - backbone = self.config.astuner.backbone - exp_dir = self.config.astuner.experiment_dir + backbone = self.config.ajet.backbone + exp_dir = self.config.ajet.experiment_dir with tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".yaml") as temp_yaml: yaml_path = temp_yaml.name @@ -153,7 +153,7 @@ def tune(self, *args, **kwargs) -> "AstunerJob": # start ray if not already started if not ray.is_initialized(): - from agentscope_tuner.utils.launch_utils import start_ray_service + from ajet.utils.launch_utils import start_ray_service start_ray_service(args, env) else: diff --git a/agentscope_tuner/cli/launcher.py b/ajet/cli/launcher.py similarity index 92% rename from agentscope_tuner/cli/launcher.py rename to ajet/cli/launcher.py index 53bf6ad0..fc1da5f3 100644 --- a/agentscope_tuner/cli/launcher.py +++ b/ajet/cli/launcher.py @@ -5,15 +5,15 @@ from dotenv import load_dotenv from loguru import logger -from agentscope_tuner.utils.cleaner import fast_kill_by_keyword_bash -from agentscope_tuner.utils.config_utils import prepare_experiment_config -from agentscope_tuner.utils.launch_utils import ( +from ajet.utils.cleaner import fast_kill_by_keyword_bash +from ajet.utils.config_utils import prepare_experiment_config +from ajet.utils.launch_utils import ( execute_training_process, launch_logview, set_loguru_default_color, start_ray_service, ) -from agentscope_tuner.utils.pty import pty_launch +from ajet.utils.pty import pty_launch set_loguru_default_color() load_dotenv() @@ -189,13 +189,13 @@ def get_backbone_target(backbone): Returns: str: The full module path for the specified backbone """ - backbone_target = "agentscope_tuner.backbone.main_trinity" # Default to trinity + backbone_target = "ajet.backbone.main_trinity" # Default to trinity if backbone == "verl": - backbone_target = "agentscope_tuner.backbone.main_verl" + backbone_target = "ajet.backbone.main_verl" if backbone == "debug": - backbone_target = "agentscope_tuner.backbone.main_vllm" + backbone_target = "ajet.backbone.main_vllm" if backbone == "trinity": - backbone_target = "agentscope_tuner.backbone.main_trinity" + backbone_target = "ajet.backbone.main_trinity" return backbone_target @@ -216,12 +216,12 @@ def setup_environment_vars(args, exp_config, main_yaml_fp): env["RAY_DEBUG_POST_MORTEM"] = "1" env["DEBUG_TAGS"] = args.debug env["RAY_record_task_actor_creation_sites"] = "true" - # assert exp_config["astuner"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore + # assert exp_config["ajet"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") if args.conf: - assert exp_config["astuner"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore + assert exp_config["ajet"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": env["ASTUNER_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore if args.backbone == "debug": @@ -230,7 +230,7 @@ def setup_environment_vars(args, exp_config, main_yaml_fp): def check_model_file_exists(exp_config): - model_path = exp_config["astuner"]["model"]["path"] + model_path = exp_config["ajet"]["model"]["path"] # if model_path has more than 2 '/', we consider it as a dir path if model_path.count("/") > 2: assert os.path.exists( diff --git a/agentscope_tuner/context_tracker/__init__.py b/ajet/context_tracker/__init__.py similarity index 100% rename from agentscope_tuner/context_tracker/__init__.py rename to ajet/context_tracker/__init__.py diff --git a/agentscope_tuner/context_tracker/agentscope_tracker/multiagent_tracking.py b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py similarity index 92% rename from agentscope_tuner/context_tracker/agentscope_tracker/multiagent_tracking.py rename to ajet/context_tracker/agentscope_tracker/multiagent_tracking.py index 08fc460c..5b1b3067 100644 --- a/agentscope_tuner/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -7,18 +7,18 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from agentscope_tuner.context_tracker.agentscope_tracker.timeline_merging import ( +from ajet.context_tracker.agentscope_tracker.timeline_merging import ( merge_tracker_timelines, ) -from agentscope_tuner.context_tracker.basic_tracker import ( +from ajet.context_tracker.basic_tracker import ( BaseContextTracker, ExtendedMessage, ) -from agentscope_tuner.schema.extended_msg import INVALID_LOG_PROB_VALUE -from agentscope_tuner.schema.trajectory import Reward -from agentscope_tuner.utils.color_hsl import adjust_color_hsl -from agentscope_tuner.utils.compute_madness import compute_string_madness -from agentscope_tuner.utils.tokenizer import astune_apply_chat_template +from ajet.schema.extended_msg import INVALID_LOG_PROB_VALUE +from ajet.schema.trajectory import Reward +from ajet.utils.color_hsl import adjust_color_hsl +from ajet.utils.compute_madness import compute_string_madness +from ajet.utils.tokenizer import astune_apply_chat_template class MultiAgentContextTracker(BaseContextTracker): @@ -43,7 +43,7 @@ def __init__( def step_prepare(self, messages: List[dict], tools: List = []): self.full_context = [] consider_roles = ["user", "assistant", "system", "tool"] - disable_toolcalls = self.config.astuner.rollout.agentscope_disable_toolcalls + disable_toolcalls = self.config.ajet.rollout.agentscope_disable_toolcalls if disable_toolcalls: consider_roles.remove("tool") tools = [] @@ -131,7 +131,7 @@ def step_track( if ( compute_string_madness( completion=llm_output["content"], - checklist=self.config.astuner.rollout.compute_madness_checklist, + checklist=self.config.ajet.rollout.compute_madness_checklist, ) < 0.0 ): @@ -141,7 +141,7 @@ def step_track( # err_type = "" if llm_output.get("tool_calls", []): # llm_output["tool_calls"] is not None, and is not [] tool_calls = llm_output["tool_calls"] - if "wrong_toolcall" in self.config.astuner.rollout.compute_madness_checklist: + if "wrong_toolcall" in self.config.ajet.rollout.compute_madness_checklist: # check tool call formating copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False @@ -174,7 +174,7 @@ def step_track( # logger.bind(exception=True).warning( # f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n" # ) - if "wrong_toolcall" in self.config.astuner.rollout.compute_madness_checklist: + if "wrong_toolcall" in self.config.ajet.rollout.compute_madness_checklist: logger.bind(exception=True).warning( f"Detected wrong toolcall format from LLM content" ) @@ -208,8 +208,8 @@ def step_track( assert ( len(precise_manual_token) - <= self.config.astuner.rollout.max_response_length_in_one_turn - ), f"Generated token length {len(precise_manual_token)} exceeds max_response_length_in_one_turn {self.config.astuner.rollout.max_response_length_in_one_turn}" + <= self.config.ajet.rollout.max_response_length_in_one_turn + ), f"Generated token length {len(precise_manual_token)} exceeds max_response_length_in_one_turn {self.config.ajet.rollout.max_response_length_in_one_turn}" self.generated_token_callback_fn(llm_ext_msg.token_arr) # take snapshot of current timeline @@ -224,7 +224,7 @@ def step_track( ) self.full_context += [llm_ext_msg] is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) - if length > self.config.astuner.rollout.max_model_len: + if length > self.config.ajet.rollout.max_model_len: raise RuntimeError( f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" ) @@ -434,8 +434,8 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tokenize=False, ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore - max_response_length = self.config.astuner.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astuner.rollout.max_model_len + max_response_length = self.config.ajet.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.ajet.rollout.max_model_len max_seq_length: int = max_model_len - max_response_length if length < max_seq_length: @@ -454,8 +454,8 @@ def check_context_token_num_safe( tokenize=False, ) length = len(self.tokenizer(prompt_text, return_tensors="pt", padding=False)["input_ids"][0]) # type: ignore - max_response_length = self.config.astuner.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astuner.rollout.max_model_len + max_response_length = self.config.ajet.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.ajet.rollout.max_model_len max_seq_length: int = max_model_len - max_response_length if length < max_seq_length: token_overflow = False @@ -463,7 +463,7 @@ def check_context_token_num_safe( token_overflow = True if self.should_interrupt_fn(): ret = (False, token_overflow, "externally_interrupted") - elif self.already_mad_flag and self.config.astuner.rollout.agent_madness_termination: + elif self.already_mad_flag and self.config.ajet.rollout.agent_madness_termination: ret = (False, token_overflow, "already_mad") elif length < max_seq_length: ret = ( diff --git a/agentscope_tuner/context_tracker/agentscope_tracker/timeline_merging.py b/ajet/context_tracker/agentscope_tracker/timeline_merging.py similarity index 98% rename from agentscope_tuner/context_tracker/agentscope_tracker/timeline_merging.py rename to ajet/context_tracker/agentscope_tracker/timeline_merging.py index 3dfc4b42..daff09e7 100644 --- a/agentscope_tuner/context_tracker/agentscope_tracker/timeline_merging.py +++ b/ajet/context_tracker/agentscope_tracker/timeline_merging.py @@ -2,7 +2,7 @@ from beast_logger import print_listofdict -from agentscope_tuner.context_tracker.basic_tracker import ExtendedMessage +from ajet.context_tracker.basic_tracker import ExtendedMessage def is_timeline_mergeable( diff --git a/agentscope_tuner/context_tracker/base_tracker.py b/ajet/context_tracker/base_tracker.py similarity index 91% rename from agentscope_tuner/context_tracker/base_tracker.py rename to ajet/context_tracker/base_tracker.py index 98023e3c..68d13a7d 100644 --- a/agentscope_tuner/context_tracker/base_tracker.py +++ b/ajet/context_tracker/base_tracker.py @@ -1,11 +1,11 @@ from typing import List, Tuple, Union -from agentscope_tuner.schema.extended_msg import ( +from ajet.schema.extended_msg import ( INVALID_LOG_PROB_VALUE, ExtendedMessage, find_sublist_indices, ) -from agentscope_tuner.schema.trajectory import Reward +from ajet.schema.trajectory import Reward def replace_token_ids( @@ -119,10 +119,10 @@ def __init__(self, config, tokenizer, **kwargs): self.full_context: List[ExtendedMessage] = [] self.grouped_steps: List[List[ExtendedMessage]] = [] self.current_context_status = "" - max_response_length = self.config.astuner.rollout.max_response_length_in_one_turn - max_model_len: int = self.config.astuner.rollout.max_model_len + max_response_length = self.config.ajet.rollout.max_response_length_in_one_turn + max_model_len: int = self.config.ajet.rollout.max_model_len self.max_seq_length: int = max_model_len - max_response_length - self.max_env_output_length: int = self.config.astuner.context_tracker.max_env_len + self.max_env_output_length: int = self.config.ajet.context_tracker.max_env_len self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") self._im_start_token_id = tokenizer.encode("<|im_start|>")[0] self.generated_token_cnt = 0 @@ -139,8 +139,8 @@ def __init__(self, config, tokenizer, **kwargs): self.generation_prompt_token = None assert ( - self.config.astuner.data.max_prompt_length - + self.config.astuner.data.max_response_length + self.config.ajet.data.max_prompt_length + + self.config.ajet.data.max_response_length <= max_model_len ) diff --git a/agentscope_tuner/context_tracker/basic_tracker.py b/ajet/context_tracker/basic_tracker.py similarity index 96% rename from agentscope_tuner/context_tracker/basic_tracker.py rename to ajet/context_tracker/basic_tracker.py index 1d470d15..7336139d 100644 --- a/agentscope_tuner/context_tracker/basic_tracker.py +++ b/ajet/context_tracker/basic_tracker.py @@ -4,13 +4,13 @@ import torch -from agentscope_tuner.context_tracker.base_tracker import ( +from ajet.context_tracker.base_tracker import ( BaseTracker, ExtendedMessage, replace_token_ids, ) -from agentscope_tuner.schema.trajectory import Reward, Sample -from agentscope_tuner.utils.tokenizer import astune_apply_chat_template +from ajet.schema.trajectory import Reward, Sample +from ajet.utils.tokenizer import astune_apply_chat_template class BaseContextTracker(BaseTracker): @@ -170,7 +170,7 @@ def compute_step_level_reward( # --------------- global level reward --------------- global_reward = self.reward_structure.raw_reward - gamma = self.config.astuner.rollout.gamma + gamma = self.config.ajet.rollout.gamma step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) assert ( gamma == 1.0 @@ -179,7 +179,7 @@ def compute_step_level_reward( # --------------- compute step level reward --------------- step_reward = step_reward_base # reward scalar if self.already_mad_flag: - step_reward = self.config.astuner.rollout.agent_madness_reward + step_reward = self.config.ajet.rollout.agent_madness_reward self.reward_structure.madness = -1.0 return step_reward @@ -214,7 +214,7 @@ def group_tokenize(self): def group_tokenize_multi_group(self): sample_arr = [] - max_num_group = self.config.astuner.rollout.multi_turn.max_sample_per_task + max_num_group = self.config.ajet.rollout.multi_turn.max_sample_per_task for index, ext_steps in enumerate(self.grouped_steps): tracker_tokenized = self.tokenize_steps( ext_steps=ext_steps, @@ -309,9 +309,9 @@ def tokenize_steps( break # no matter what, the split index should not exceed max prompt length - # make sure that the prompt length does not exceed `config.astuner.data.max_prompt_length` - if split_prompt_reponse_index > self.config.astuner.data.max_prompt_length: - split_prompt_reponse_index = self.config.astuner.data.max_prompt_length + # make sure that the prompt length does not exceed `config.ajet.data.max_prompt_length` + if split_prompt_reponse_index > self.config.ajet.data.max_prompt_length: + split_prompt_reponse_index = self.config.ajet.data.max_prompt_length # check assert len(ext_steps) == len( diff --git a/agentscope_tuner/data_generator/__init__.py b/ajet/data_generator/__init__.py similarity index 100% rename from agentscope_tuner/data_generator/__init__.py rename to ajet/data_generator/__init__.py diff --git a/agentscope_tuner/data_generator/base_data_generator.py b/ajet/data_generator/base_data_generator.py similarity index 92% rename from agentscope_tuner/data_generator/base_data_generator.py rename to ajet/data_generator/base_data_generator.py index 540ebaa7..4f117d23 100644 --- a/agentscope_tuner/data_generator/base_data_generator.py +++ b/ajet/data_generator/base_data_generator.py @@ -1,8 +1,8 @@ from typing import Any, Dict, List, Optional, Union -from agentscope_tuner.schema.document import Document -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn +from ajet.schema.document import Document +from ajet.schema.task import Task +from ajet.task_rollout.dashscope_llm_bridge import create_external_llm_fn class BaseDataGenerator: diff --git a/agentscope_tuner/data_generator/config.py b/ajet/data_generator/config.py similarity index 100% rename from agentscope_tuner/data_generator/config.py rename to ajet/data_generator/config.py diff --git a/agentscope_tuner/data_generator/knowledge_augmentation.py b/ajet/data_generator/knowledge_augmentation.py similarity index 97% rename from agentscope_tuner/data_generator/knowledge_augmentation.py rename to ajet/data_generator/knowledge_augmentation.py index 2d53f8c4..4febac03 100644 --- a/agentscope_tuner/data_generator/knowledge_augmentation.py +++ b/ajet/data_generator/knowledge_augmentation.py @@ -2,9 +2,9 @@ import re from typing import Any, Dict, List, Optional -from agentscope_tuner.data_generator.base_data_generator import BaseDataGenerator -from agentscope_tuner.schema.document import Document -from agentscope_tuner.schema.task import Task +from ajet.data_generator.base_data_generator import BaseDataGenerator +from ajet.schema.document import Document +from ajet.schema.task import Task class KnowledgeAugmentor(BaseDataGenerator): diff --git a/agentscope_tuner/data_generator/task_augmentation.py b/ajet/data_generator/task_augmentation.py similarity index 97% rename from agentscope_tuner/data_generator/task_augmentation.py rename to ajet/data_generator/task_augmentation.py index d1b0e172..1db723e7 100644 --- a/agentscope_tuner/data_generator/task_augmentation.py +++ b/ajet/data_generator/task_augmentation.py @@ -1,9 +1,9 @@ import re from typing import Any, Dict, Optional, Union -from agentscope_tuner.data_generator.base_data_generator import BaseDataGenerator -from agentscope_tuner.schema.document import Document -from agentscope_tuner.schema.task import Task +from ajet.data_generator.base_data_generator import BaseDataGenerator +from ajet.schema.document import Document +from ajet.schema.task import Task class TaskAugmentor(BaseDataGenerator): diff --git a/agentscope_tuner/default_config/README.md b/ajet/default_config/README.md similarity index 100% rename from agentscope_tuner/default_config/README.md rename to ajet/default_config/README.md diff --git a/agentscope_tuner/default_config/astune_default.py b/ajet/default_config/astune_default.py similarity index 97% rename from agentscope_tuner/default_config/astune_default.py rename to ajet/default_config/astune_default.py index 7fb7fc0e..5f1637b0 100644 --- a/agentscope_tuner/default_config/astune_default.py +++ b/ajet/default_config/astune_default.py @@ -61,7 +61,7 @@ class AstunerDefaultConfig: @dataclass class Config: - astuner: AstunerDefaultConfig = field(default_factory=AstunerDefaultConfig) + ajet: AstunerDefaultConfig = field(default_factory=AstunerDefaultConfig) @staticmethod def _to_dict(obj: Any) -> Any: diff --git a/agentscope_tuner/default_config/astune_default.yaml b/ajet/default_config/astune_default.yaml similarity index 98% rename from agentscope_tuner/default_config/astune_default.yaml rename to ajet/default_config/astune_default.yaml index ea8b463a..8cdf7c7c 100644 --- a/agentscope_tuner/default_config/astune_default.yaml +++ b/ajet/default_config/astune_default.yaml @@ -1,5 +1,5 @@ # ------------------ main configuration ------------------ -astuner: +ajet: project_name: "astune_default_project" experiment_name: "read_yaml_name" experiment_dir: "auto" # {exp-dir}/{experiment_name} @@ -140,7 +140,7 @@ astuner: judge_type: customized_protocol # Options: 'customized_protocol', 'rubrics_auto_grader' # when `judge_type == customized_protocol` - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge # the helper LLM model used for LLM-AS-Judge alien_llm_model: qwen3-235b-a22b-instruct-2507 diff --git a/agentscope_tuner/default_config/trinity/README.md b/ajet/default_config/trinity/README.md similarity index 84% rename from agentscope_tuner/default_config/trinity/README.md rename to ajet/default_config/trinity/README.md index 489ffb9b..1f4d662c 100644 --- a/agentscope_tuner/default_config/trinity/README.md +++ b/ajet/default_config/trinity/README.md @@ -2,7 +2,7 @@ ## How to Modify Trinity Configuration in ASTuner -1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `astuner/default_config/astune_default.yaml` configuration file, and ASTuner will **automatically** handle parameter mapping for you. +1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `ajet/default_config/astune_default.yaml` configuration file, and ASTuner will **automatically** handle parameter mapping for you. 2. ⚙️ **Special Cases**: Some Trinity tuning parameters are not yet mapped in ASTuner. You can refer to Trinity’s documentation and modify them in the following format: @@ -13,13 +13,13 @@ trinity: ``` 3. 🚫 **Never Edit**: - - Never edit `astuner/default_config/trinity/trinity_launcher.yaml` - - Never edit `astuner/default_config/trinity/trinity_default.yaml` + - Never edit `ajet/default_config/trinity/trinity_launcher.yaml` + - Never edit `ajet/default_config/trinity/trinity_default.yaml` ## Configuration Mapping Modification 🔄 Some ASTune configurations overlap with Trinity. -You can configure mappings via the `astuner/default_config/trinity/config_auto_convertion_trinity.jsonc` file. +You can configure mappings via the `ajet/default_config/trinity/config_auto_convertion_trinity.jsonc` file. ## Trinity Hyperparameter Quick Guide 📊 diff --git a/agentscope_tuner/default_config/trinity/README_ZH.md b/ajet/default_config/trinity/README_ZH.md similarity index 84% rename from agentscope_tuner/default_config/trinity/README_ZH.md rename to ajet/default_config/trinity/README_ZH.md index 7d80712c..7f343e44 100644 --- a/agentscope_tuner/default_config/trinity/README_ZH.md +++ b/ajet/default_config/trinity/README_ZH.md @@ -2,7 +2,7 @@ ## 如何修改 Trinity 配置 -1. 🎯 **推荐方式**:在大多数情况下,您无需直接调整 Trinity 参数,只需参考并修改上层的 `astuner/default_config/astune_default.yaml` 配置文件即可, +1. 🎯 **推荐方式**:在大多数情况下,您无需直接调整 Trinity 参数,只需参考并修改上层的 `ajet/default_config/astune_default.yaml` 配置文件即可, ASTuner 会**自动**帮您完成参数映射。 2. ⚙️ **特殊情况**:部分 Trinity 调优参数目前尚未在 ASTuner 中建立映射,您可以参考 Trinity 的文档,然后通过以下形式进行修改: @@ -14,13 +14,13 @@ trinity: ``` 3. 🚫 **永远不要编辑**: - - 永远不要编辑 `astuner/default_config/trinity/trinity_launcher.yaml` - - 永远不要编辑 `astuner/default_config/trinity/trinity_default.yaml` + - 永远不要编辑 `ajet/default_config/trinity/trinity_launcher.yaml` + - 永远不要编辑 `ajet/default_config/trinity/trinity_default.yaml` ## 配置映射修改 🔄 某些 ASTune 配置与 Trinity 存在重叠, -可通过 `astuner/default_config/trinity/config_auto_convertion_trinity.jsonc` 文件进行映射配置 +可通过 `ajet/default_config/trinity/config_auto_convertion_trinity.jsonc` 文件进行映射配置 ## Trinity 超参数简明指南 📊 diff --git a/ajet/default_config/trinity/config_auto_convertion_trinity.jsonc b/ajet/default_config/trinity/config_auto_convertion_trinity.jsonc new file mode 100644 index 00000000..02b8f812 --- /dev/null +++ b/ajet/default_config/trinity/config_auto_convertion_trinity.jsonc @@ -0,0 +1,26 @@ +{ + "ajet.trainer_common.nnodes": "cluster.node_num", + "ajet.trainer_common.n_gpus_per_node": "cluster.gpu_per_node", + "ajet.trainer_common.total_epochs": "buffer.total_epochs", + "ajet.trainer_common.test_freq": "explorer.eval_interval", + "ajet.trainer_common.save_freq": "trainer.save_interval", + "ajet.trainer_common.ulysses_sequence_parallel_size": "trainer.ulysses_sequence_parallel_size", + "ajet.trainer_common.optim.lr": "algorithm.optimizer.lr", + "ajet.trainer_common.logger": "monitor.monitor_type", + "ajet.trainer_common.checkpoint_base_dir": "checkpoint_root_dir", + "ajet.rollout.n_vllm_engine": "explorer.rollout_model.engine_num", + "ajet.model.path": "model.model_path", + "ajet.project_name": "project", + "ajet.experiment_name": "name", + "ajet.data.max_response_length": "model.max_response_tokens", + "ajet.rollout.num_repeat": "algorithm.repeat_times", + "ajet.rollout.tensor_model_parallel_size": "explorer.rollout_model.tensor_parallel_size", + "ajet.rollout.max_model_len": [ + "model.max_model_len", + "trainer.max_token_len_per_gpu" + ], + + "ajet.data.train_batch_size": "buffer.batch_size", + "(ajet.data.train_batch_size * ajet.rollout.num_repeat * ajet.rollout.multi_turn.expected_steps)": "buffer.train_batch_size", + "(min(ajet.rollout.max_env_worker, 128) // ajet.rollout.n_vllm_engine)": "explorer.runner_per_model" +} diff --git a/agentscope_tuner/default_config/trinity/trinity_default.yaml b/ajet/default_config/trinity/trinity_default.yaml similarity index 84% rename from agentscope_tuner/default_config/trinity/trinity_default.yaml rename to ajet/default_config/trinity/trinity_default.yaml index 939aca05..c3e6c458 100644 --- a/agentscope_tuner/default_config/trinity/trinity_default.yaml +++ b/ajet/default_config/trinity/trinity_default.yaml @@ -1,6 +1,6 @@ -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD trinity: algorithm: @@ -28,7 +28,7 @@ trinity: rollout_args: temperature: 1.0 split: train - storage_type: astuner + storage_type: ajet subset_name: "" total_epochs: 1000 # Trainer-side mini-batch consumed from the explorer queue per optimization step (consumer input size) diff --git a/ajet/default_config/trinity/trinity_launch.yaml b/ajet/default_config/trinity/trinity_launch.yaml new file mode 100644 index 00000000..4a5d333a --- /dev/null +++ b/ajet/default_config/trinity/trinity_launch.yaml @@ -0,0 +1,6 @@ +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD + +algorithm: + algorithm_type: multi_step_grpo diff --git a/ajet/default_config/verl/config_auto_convertion_verl.jsonc b/ajet/default_config/verl/config_auto_convertion_verl.jsonc new file mode 100644 index 00000000..378fd112 --- /dev/null +++ b/ajet/default_config/verl/config_auto_convertion_verl.jsonc @@ -0,0 +1,39 @@ +{ + "ajet.trainer_common.total_epochs": "trainer.total_epochs", + + "ajet.trainer_common.val_before_train": "trainer.val_before_train", + "ajet.trainer_common.n_gpus_per_node": "trainer.n_gpus_per_node", + "ajet.trainer_common.nnodes": "trainer.nnodes", + "ajet.trainer_common.logger": "trainer.logger", + "ajet.trainer_common.checkpoint_base_dir": "trainer.checkpoint_base_dir", + "ajet.trainer_common.algorithm.adv_estimator": "algorithm.adv_estimator", + "ajet.trainer_common.algorithm.use_kl_in_reward": "algorithm.use_kl_in_reward", + "ajet.trainer_common.mini_batch_num": "actor_rollout_ref.actor.override_ppo_mini_batch_num", + "ajet.trainer_common.fsdp_config": "actor_rollout_ref.actor.fsdp_config", + "ajet.trainer_common.optim": "actor_rollout_ref.actor.optim", + "ajet.trainer_common.use_kl_loss": "actor_rollout_ref.actor.use_kl_loss", + "ajet.trainer_common.kl_loss_coef": "actor_rollout_ref.actor.kl_loss_coef", + "ajet.trainer_common.kl_loss_type": "actor_rollout_ref.actor.kl_loss_type", + "ajet.trainer_common.ulysses_sequence_parallel_size": "actor_rollout_ref.actor.ulysses_sequence_parallel_size", + + "ajet.trainer_common.save_freq": "trainer.save_freq", + "ajet.trainer_common.test_freq": "trainer.test_freq", + + "ajet.data.max_prompt_length": "data.max_prompt_length", + "ajet.data.max_response_length": "data.max_response_length", + "ajet.data.train_batch_size": "data.train_batch_size", + + "ajet.rollout.max_model_len": [ + "actor_rollout_ref.rollout.max_model_len", + "actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu", + "actor_rollout_ref.actor.ppo_max_token_len_per_gpu", + "actor_rollout_ref.ref.log_prob_max_token_len_per_gpu" + ], + + "ajet.rollout.multi_turn": "actor_rollout_ref.rollout.multi_turn", + "ajet.rollout.val_kwargs": "actor_rollout_ref.rollout.val_kwargs", + + "ajet.model.path": "actor_rollout_ref.model.path", + "ajet.project_name": "trainer.project_name", + "ajet.experiment_name": "trainer.experiment_name" +} diff --git a/agentscope_tuner/default_config/verl/verl_default.yaml b/ajet/default_config/verl/verl_default.yaml similarity index 96% rename from agentscope_tuner/default_config/verl/verl_default.yaml rename to ajet/default_config/verl/verl_default.yaml index bd5309bf..6cae84d0 100644 --- a/agentscope_tuner/default_config/verl/verl_default.yaml +++ b/ajet/default_config/verl/verl_default.yaml @@ -1,8 +1,8 @@ -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `astuner/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD -astuner: +ajet: rollout: step_skip_action: 0 submit_oversample_multiplier: 1.5 diff --git a/agentscope_tuner/schema/__init__.py b/ajet/schema/__init__.py similarity index 100% rename from agentscope_tuner/schema/__init__.py rename to ajet/schema/__init__.py diff --git a/agentscope_tuner/schema/document.py b/ajet/schema/document.py similarity index 100% rename from agentscope_tuner/schema/document.py rename to ajet/schema/document.py diff --git a/agentscope_tuner/schema/extended_msg.py b/ajet/schema/extended_msg.py similarity index 99% rename from agentscope_tuner/schema/extended_msg.py rename to ajet/schema/extended_msg.py index d789d743..840325a9 100644 --- a/agentscope_tuner/schema/extended_msg.py +++ b/ajet/schema/extended_msg.py @@ -4,7 +4,7 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from agentscope_tuner.utils.tokenizer import astune_apply_chat_template +from ajet.utils.tokenizer import astune_apply_chat_template # import numpy as np # INVALID_LOG_PROB_VALUE = np.inf # when debuging, set to np.inf, if anything goes wrong, we can sense that immediately diff --git a/agentscope_tuner/schema/logprob.py b/ajet/schema/logprob.py similarity index 100% rename from agentscope_tuner/schema/logprob.py rename to ajet/schema/logprob.py diff --git a/agentscope_tuner/schema/task.py b/ajet/schema/task.py similarity index 100% rename from agentscope_tuner/schema/task.py rename to ajet/schema/task.py diff --git a/agentscope_tuner/schema/trajectory.py b/ajet/schema/trajectory.py similarity index 96% rename from agentscope_tuner/schema/trajectory.py rename to ajet/schema/trajectory.py index b96100b4..225ba3c4 100644 --- a/agentscope_tuner/schema/trajectory.py +++ b/ajet/schema/trajectory.py @@ -76,10 +76,10 @@ class Sample(BaseModel): def __init__(self, tracker_tokenized: dict, messages, config, **kwargs): super().__init__(**kwargs) - self.max_prompt_len = config.astuner.data.max_prompt_length - self.max_response_len = config.astuner.data.max_response_length + self.max_prompt_len = config.ajet.data.max_prompt_length + self.max_response_len = config.ajet.data.max_response_length self.max_model_len = ( - config.astuner.data.max_response_length + config.astuner.data.max_prompt_length + config.ajet.data.max_response_length + config.ajet.data.max_prompt_length ) self.input_ids = tracker_tokenized["input_ids"] diff --git a/agentscope_tuner/task_judge/base_judge.py b/ajet/task_judge/base_judge.py similarity index 76% rename from agentscope_tuner/task_judge/base_judge.py rename to ajet/task_judge/base_judge.py index 7ec5b63f..01fc8fae 100644 --- a/agentscope_tuner/task_judge/base_judge.py +++ b/ajet/task_judge/base_judge.py @@ -1,4 +1,4 @@ -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.workflow import WorkflowOutput, WorkflowTask class BaseJudge: diff --git a/agentscope_tuner/task_judge/env_service_as_judge.py b/ajet/task_judge/env_service_as_judge.py similarity index 82% rename from agentscope_tuner/task_judge/env_service_as_judge.py rename to ajet/task_judge/env_service_as_judge.py index ffa145dd..3703a7ca 100644 --- a/agentscope_tuner/task_judge/env_service_as_judge.py +++ b/ajet/task_judge/env_service_as_judge.py @@ -1,5 +1,5 @@ -from agentscope_tuner.task_judge.base_judge import BaseJudge -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.task_judge.base_judge import BaseJudge +from ajet.workflow import WorkflowOutput, WorkflowTask class EnvServiceJudge(BaseJudge): diff --git a/agentscope_tuner/task_judge/rm_auto_grader_judge.py b/ajet/task_judge/rm_auto_grader_judge.py similarity index 93% rename from agentscope_tuner/task_judge/rm_auto_grader_judge.py rename to ajet/task_judge/rm_auto_grader_judge.py index c97fc5be..d5734cde 100644 --- a/agentscope_tuner/task_judge/rm_auto_grader_judge.py +++ b/ajet/task_judge/rm_auto_grader_judge.py @@ -1,7 +1,7 @@ """ RM Gallery Iterative Rubric Judge Integration -This module integrates RM Gallery's IterativeRubricsGenerator capabilities into astuner's judge system. +This module integrates RM Gallery's IterativeRubricsGenerator capabilities into ajet's judge system. It provides a data-driven approach to evaluate workflow outputs using automatically generated rubrics from training samples. @@ -11,7 +11,7 @@ - MCR²-based smart sampling for large datasets - Optional LLM-based categorization to organize rubrics - Flexible scoring based on LLM-generated rubrics -- Seamless integration with astuner's workflow system +- Seamless integration with ajet's workflow system """ import asyncio @@ -31,8 +31,8 @@ from rm_gallery.core.models.dashscope_chat_model import DashScopeChatModel from rm_gallery.core.models.schema.prompt_template import LanguageEnum -from agentscope_tuner.schema.task import Task, WorkflowOutput -from agentscope_tuner.task_judge.base_judge import BaseJudge +from ajet.schema.task import Task, WorkflowOutput +from ajet.task_judge.base_judge import BaseJudge class AutoGraderJudge(BaseJudge): @@ -95,11 +95,11 @@ def __init__(self, config): import os api_key = getattr( - config.astuner.task_judge.rubrics_auto_grader, "api_key", None + config.ajet.task_judge.rubrics_auto_grader, "api_key", None ) or os.getenv("DASHSCOPE_API_KEY") self.model = DashScopeChatModel( - model=config.astuner.task_judge.rubrics_auto_grader.model_name, + model=config.ajet.task_judge.rubrics_auto_grader.model_name, api_key=api_key, stream=False, enable_thinking=False, @@ -114,13 +114,13 @@ def __init__(self, config): # Field mappings for data extraction self.query_field = getattr( - config.astuner.task_judge.rubrics_auto_grader, "query_field", "main_query" + config.ajet.task_judge.rubrics_auto_grader, "query_field", "main_query" ) self.answer_field = getattr( - config.astuner.task_judge.rubrics_auto_grader, "answer_field", "final_answer" + config.ajet.task_judge.rubrics_auto_grader, "answer_field", "final_answer" ) self.reference_field = getattr( - config.astuner.task_judge.rubrics_auto_grader, "reference_field", "answer" + config.ajet.task_judge.rubrics_auto_grader, "reference_field", "answer" ) logger.info( @@ -131,8 +131,8 @@ def __init__(self, config): def _parse_config( self, ) -> IterativePointwiseRubricsGeneratorConfig | IterativeListwiseRubricsGeneratorConfig: - """Parse astuner config into IterativeRubricsGeneratorConfig.""" - judge_config = self.config.astuner.task_judge.rubrics_auto_grader + """Parse ajet config into IterativeRubricsGeneratorConfig.""" + judge_config = self.config.ajet.task_judge.rubrics_auto_grader # Parse grader mode grader_mode_str = getattr(judge_config, "grader_mode", "pointwise").lower() @@ -177,11 +177,11 @@ def _parse_config( async def read_reference_samples_from_dataset(self) -> List[Task]: # read dataset from config - from agentscope_tuner.task_reader import RouterTaskReader + from ajet.task_reader import RouterTaskReader reader = RouterTaskReader( - reader_type=self.config.astuner.task_judge.rubrics_auto_grader.input_data_type, - reader_config=self.config.astuner.task_judge.rubrics_auto_grader, + reader_type=self.config.ajet.task_judge.rubrics_auto_grader.input_data_type, + reader_config=self.config.ajet.task_judge.rubrics_auto_grader, ) return reader.task_reader.get_training_tasks() @@ -220,7 +220,7 @@ async def generate_rubrics_from_samples(self, reference_samples: List[Task] = [] self.llm_grader = await generator.generate(dataset=training_dataset) # Save the grader - experiment_dir = self.config.astuner.experiment_dir + experiment_dir = self.config.ajet.experiment_dir grader_save_dir = os.path.join(experiment_dir, "auto_grader.json") # make dirs if not exist os.makedirs(experiment_dir, exist_ok=True) @@ -247,7 +247,7 @@ async def load_rubrics_from_cache(self) -> None: # Load grader config and inject model try: - experiment_dir = self.config.astuner.experiment_dir + experiment_dir = self.config.ajet.experiment_dir grader_save_dir = os.path.join(experiment_dir, "auto_grader.json") grader_config = json.load(open(grader_save_dir, "r", encoding="utf-8")) grader_config["model"] = self.model @@ -384,7 +384,7 @@ def compute_reward(self, task: Task, workflow_output: WorkflowOutput) -> tuple: """ Compute reward for a workflow output (synchronous wrapper). - This is the main interface called by astuner's workflow system. + This is the main interface called by ajet's workflow system. Args: task: The task being evaluated diff --git a/agentscope_tuner/task_reader/__init__.py b/ajet/task_reader/__init__.py similarity index 88% rename from agentscope_tuner/task_reader/__init__.py rename to ajet/task_reader/__init__.py index 2a7ae243..9d72a30d 100644 --- a/agentscope_tuner/task_reader/__init__.py +++ b/ajet/task_reader/__init__.py @@ -3,13 +3,13 @@ import datasets import numpy as np -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_reader.data_generator_reader import DataGeneratorTaskReader -from agentscope_tuner.task_reader.env_service_reader import EnvServiceTaskReader -from agentscope_tuner.task_reader.hf_dataset_reader import HuggingFaceTaskReader -from agentscope_tuner.task_reader.jsonl_reader import JsonlTaskReader -from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader -from agentscope_tuner.task_reader.tracing_reader import TracingReader +from ajet.schema.task import Task +from ajet.task_reader.data_generator_reader import DataGeneratorTaskReader +from ajet.task_reader.env_service_reader import EnvServiceTaskReader +from ajet.task_reader.hf_dataset_reader import HuggingFaceTaskReader +from ajet.task_reader.jsonl_reader import JsonlTaskReader +from ajet.task_reader.task_reader_base import BaseTaskReader +from ajet.task_reader.tracing_reader import TracingReader class RandomDummyTaskReader(BaseTaskReader): diff --git a/agentscope_tuner/task_reader/data_generator_reader.py b/ajet/task_reader/data_generator_reader.py similarity index 97% rename from agentscope_tuner/task_reader/data_generator_reader.py rename to ajet/task_reader/data_generator_reader.py index f925c42b..5110a98f 100644 --- a/agentscope_tuner/task_reader/data_generator_reader.py +++ b/ajet/task_reader/data_generator_reader.py @@ -11,12 +11,12 @@ from loguru import logger from tqdm import tqdm -from agentscope_tuner.data_generator.knowledge_augmentation import KnowledgeAugmentor -from agentscope_tuner.data_generator.task_augmentation import TaskAugmentor -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_reader.document_reader.doc_reader import DocReader -from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader -from agentscope_tuner.task_reader.tracing_reader.filters.deduplication_filter import ( +from ajet.data_generator.knowledge_augmentation import KnowledgeAugmentor +from ajet.data_generator.task_augmentation import TaskAugmentor +from ajet.schema.task import Task +from ajet.task_reader.document_reader.doc_reader import DocReader +from ajet.task_reader.task_reader_base import BaseTaskReader +from ajet.task_reader.tracing_reader.filters.deduplication_filter import ( DeduplicationFilter, ) @@ -95,7 +95,7 @@ def __init__(self, reader_config): else: self.duplicate_filter = None # Initialize task reader - from agentscope_tuner.task_reader import RouterTaskReader + from ajet.task_reader import RouterTaskReader task_reader = RouterTaskReader( reader_type=self.reader_config.data_generation.query_reader.type, diff --git a/agentscope_tuner/task_reader/document_reader/doc_reader.py b/ajet/task_reader/document_reader/doc_reader.py similarity index 98% rename from agentscope_tuner/task_reader/document_reader/doc_reader.py rename to ajet/task_reader/document_reader/doc_reader.py index 7b7b84a8..e73c3bdf 100644 --- a/agentscope_tuner/task_reader/document_reader/doc_reader.py +++ b/ajet/task_reader/document_reader/doc_reader.py @@ -13,8 +13,8 @@ except Exception: logger.warning("Cannot import dependency `unstructured`") -from agentscope_tuner.schema.document import Document -from agentscope_tuner.task_reader.document_reader.document_reader_base import ( +from ajet.schema.document import Document +from ajet.task_reader.document_reader.document_reader_base import ( DocReaderBase, ) diff --git a/agentscope_tuner/task_reader/document_reader/document_reader_base.py b/ajet/task_reader/document_reader/document_reader_base.py similarity index 79% rename from agentscope_tuner/task_reader/document_reader/document_reader_base.py rename to ajet/task_reader/document_reader/document_reader_base.py index 6dae1603..ab7db97c 100644 --- a/agentscope_tuner/task_reader/document_reader/document_reader_base.py +++ b/ajet/task_reader/document_reader/document_reader_base.py @@ -1,6 +1,6 @@ from typing import List, Optional -from agentscope_tuner.schema.document import Document +from ajet.schema.document import Document class DocReaderBase: diff --git a/agentscope_tuner/task_reader/env_service_reader.py b/ajet/task_reader/env_service_reader.py similarity index 86% rename from agentscope_tuner/task_reader/env_service_reader.py rename to ajet/task_reader/env_service_reader.py index d60f1282..00aa26bf 100644 --- a/agentscope_tuner/task_reader/env_service_reader.py +++ b/ajet/task_reader/env_service_reader.py @@ -1,6 +1,6 @@ -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader -from agentscope_tuner.utils.env_service_client.env_client_ng import EnvClient +from ajet.schema.task import Task +from ajet.task_reader.task_reader_base import BaseTaskReader +from ajet.utils.env_service_client.env_client_ng import EnvClient class EnvServiceTaskReader(BaseTaskReader): diff --git a/agentscope_tuner/task_reader/hf_dataset_reader.py b/ajet/task_reader/hf_dataset_reader.py similarity index 95% rename from agentscope_tuner/task_reader/hf_dataset_reader.py rename to ajet/task_reader/hf_dataset_reader.py index 7b470d43..381e48e2 100644 --- a/agentscope_tuner/task_reader/hf_dataset_reader.py +++ b/ajet/task_reader/hf_dataset_reader.py @@ -2,8 +2,8 @@ import datasets -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader +from ajet.schema.task import Task +from ajet.task_reader.task_reader_base import BaseTaskReader class HuggingFaceTaskReader(BaseTaskReader): diff --git a/agentscope_tuner/task_reader/jsonl_reader.py b/ajet/task_reader/jsonl_reader.py similarity index 94% rename from agentscope_tuner/task_reader/jsonl_reader.py rename to ajet/task_reader/jsonl_reader.py index 33fab1ca..14462371 100644 --- a/agentscope_tuner/task_reader/jsonl_reader.py +++ b/ajet/task_reader/jsonl_reader.py @@ -1,8 +1,8 @@ import json from typing import List -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_reader.task_reader_base import BaseTaskReader +from ajet.schema.task import Task +from ajet.task_reader.task_reader_base import BaseTaskReader class JsonlTaskReader(BaseTaskReader): diff --git a/agentscope_tuner/task_reader/task_reader_base.py b/ajet/task_reader/task_reader_base.py similarity index 86% rename from agentscope_tuner/task_reader/task_reader_base.py rename to ajet/task_reader/task_reader_base.py index a5ff20ed..3f17911c 100644 --- a/agentscope_tuner/task_reader/task_reader_base.py +++ b/ajet/task_reader/task_reader_base.py @@ -1,6 +1,6 @@ from typing import List -from agentscope_tuner.schema.task import Task +from ajet.schema.task import Task class BaseTaskReader: diff --git a/agentscope_tuner/task_reader/tracing_reader/__init__.py b/ajet/task_reader/tracing_reader/__init__.py similarity index 93% rename from agentscope_tuner/task_reader/tracing_reader/__init__.py rename to ajet/task_reader/tracing_reader/__init__.py index 02325d7d..52479e2e 100644 --- a/agentscope_tuner/task_reader/tracing_reader/__init__.py +++ b/ajet/task_reader/tracing_reader/__init__.py @@ -5,9 +5,9 @@ from loguru import logger -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_reader.tracing_reader.filters.base import Filter -from agentscope_tuner.task_reader.tracing_reader.filters.factory import build_filters +from ajet.schema.task import Task +from ajet.task_reader.tracing_reader.filters.base import Filter +from ajet.task_reader.tracing_reader.filters.factory import build_filters from ..task_reader_base import BaseTaskReader @@ -25,7 +25,7 @@ def __init__( train_ratio: float = 0.7, split_seed: int = 42, ) -> None: - from agentscope_tuner.task_reader.tracing_reader.connector import ( + from ajet.task_reader.tracing_reader.connector import ( LocalSqliteConnectorV1, ) diff --git a/agentscope_tuner/task_reader/tracing_reader/connector.py b/ajet/task_reader/tracing_reader/connector.py similarity index 99% rename from agentscope_tuner/task_reader/tracing_reader/connector.py rename to ajet/task_reader/tracing_reader/connector.py index 4a4c2358..d45256a3 100644 --- a/agentscope_tuner/task_reader/tracing_reader/connector.py +++ b/ajet/task_reader/tracing_reader/connector.py @@ -10,7 +10,7 @@ import requests from loguru import logger -from agentscope_tuner.schema.task import Task +from ajet.schema.task import Task class TracingConnector(Protocol): diff --git a/agentscope_tuner/task_reader/tracing_reader/filters/__init__.py b/ajet/task_reader/tracing_reader/filters/__init__.py similarity index 100% rename from agentscope_tuner/task_reader/tracing_reader/filters/__init__.py rename to ajet/task_reader/tracing_reader/filters/__init__.py diff --git a/agentscope_tuner/task_reader/tracing_reader/filters/base.py b/ajet/task_reader/tracing_reader/filters/base.py similarity index 96% rename from agentscope_tuner/task_reader/tracing_reader/filters/base.py rename to ajet/task_reader/tracing_reader/filters/base.py index 65567266..fbdde8d0 100644 --- a/agentscope_tuner/task_reader/tracing_reader/filters/base.py +++ b/ajet/task_reader/tracing_reader/filters/base.py @@ -3,7 +3,7 @@ from abc import ABC, abstractmethod from typing import Iterable, List -from agentscope_tuner.schema.task import Task +from ajet.schema.task import Task class Filter(ABC): diff --git a/agentscope_tuner/task_reader/tracing_reader/filters/deduplication_filter.py b/ajet/task_reader/tracing_reader/filters/deduplication_filter.py similarity index 90% rename from agentscope_tuner/task_reader/tracing_reader/filters/deduplication_filter.py rename to ajet/task_reader/tracing_reader/filters/deduplication_filter.py index 1430f06a..588a2a56 100644 --- a/agentscope_tuner/task_reader/tracing_reader/filters/deduplication_filter.py +++ b/ajet/task_reader/tracing_reader/filters/deduplication_filter.py @@ -2,8 +2,8 @@ import shutil from typing import Iterable, List -from agentscope_tuner.schema.task import Task -from agentscope_tuner.utils.embedding_client import EmbeddingClient +from ajet.schema.task import Task +from ajet.utils.embedding_client import EmbeddingClient from .base import Filter diff --git a/agentscope_tuner/task_reader/tracing_reader/filters/factory.py b/ajet/task_reader/tracing_reader/filters/factory.py similarity index 100% rename from agentscope_tuner/task_reader/tracing_reader/filters/factory.py rename to ajet/task_reader/tracing_reader/filters/factory.py diff --git a/agentscope_tuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/ajet/task_reader/tracing_reader/filters/llm_evaluate_filter.py similarity index 96% rename from agentscope_tuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py rename to ajet/task_reader/tracing_reader/filters/llm_evaluate_filter.py index 956ebe87..b49c480a 100644 --- a/agentscope_tuner/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/ajet/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -7,8 +7,8 @@ from agentscope.model import DashScopeChatModel from pydantic import BaseModel, Field -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn +from ajet.schema.task import Task +from ajet.task_rollout.dashscope_llm_bridge import create_external_llm_fn from .base import Filter diff --git a/agentscope_tuner/task_reader/tracing_reader/llm_client.py b/ajet/task_reader/tracing_reader/llm_client.py similarity index 100% rename from agentscope_tuner/task_reader/tracing_reader/llm_client.py rename to ajet/task_reader/tracing_reader/llm_client.py diff --git a/agentscope_tuner/task_rollout/__init__.py b/ajet/task_rollout/__init__.py similarity index 100% rename from agentscope_tuner/task_rollout/__init__.py rename to ajet/task_rollout/__init__.py diff --git a/agentscope_tuner/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py similarity index 93% rename from agentscope_tuner/task_rollout/async_llm_bridge.py rename to ajet/task_rollout/async_llm_bridge.py index 3eff07b5..37169171 100644 --- a/agentscope_tuner/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -14,13 +14,13 @@ from transformers.tokenization_utils import PreTrainedTokenizer from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser -from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from agentscope_tuner.schema.logprob import TokenAndProb -from agentscope_tuner.utils.async_utils import run_async_coroutine_with_timeout -from agentscope_tuner.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode -from agentscope_tuner.utils.tokenizer import astune_apply_chat_template +from ajet.schema.logprob import TokenAndProb +from ajet.utils.async_utils import run_async_coroutine_with_timeout +from ajet.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode +from ajet.utils.tokenizer import astune_apply_chat_template class AsyncLlmBridge(object): @@ -63,7 +63,7 @@ def llm_chat( ) prompt_ids = self.tokenizer(prompt_text)["input_ids"] - if self.config.astuner.execute_test: + if self.config.ajet.execute_test: _test_if_test_mode("prompt_text", prompt_text, self.config) final_res = run_async_coroutine_with_timeout( @@ -75,13 +75,13 @@ def llm_chat( timeout=1800, ) - if self.config.astuner.rollout.name == "vllm": + if self.config.ajet.rollout.name == "vllm": token_array = final_res.outputs[0].token_ids - elif self.config.astuner.rollout.name == "sglang": + elif self.config.ajet.rollout.name == "sglang": token_array = final_res decoded_text = self.tokenizer.decode(token_array) # type: ignore - if self.config.astuner.execute_test: + if self.config.ajet.execute_test: decoded_text = _mock_if_test_mode("mock_decoded_text", decoded_text, self.config) if decoded_text.endswith("<|im_end|>"): @@ -92,12 +92,12 @@ def llm_chat( if ( ("" in decoded_text) and ("" in decoded_text) - and (not self.config.astuner.rollout.agentscope_disable_toolcalls) + and (not self.config.ajet.rollout.agentscope_disable_toolcalls) ): tool_parser = Hermes2ProToolParser(self.tokenizer) parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() - if self.config.astuner.execute_test: + if self.config.ajet.execute_test: _test_if_test_mode( "parsed_tool_calls", parsed_tool_calls["tool_calls"], self.config ) @@ -148,7 +148,7 @@ def llm_chat_remote( input_messages = copy.deepcopy(messages) for i in range(self.max_llm_retries): try: - # this function is defined in `astuner/backbone/main_vllm.py` + # this function is defined in `ajet/backbone/main_vllm.py` output_message = self.async_rollout_manager.submit_chat_completions( messages=input_messages, sampling_params=updated_sampling_params, @@ -275,7 +275,7 @@ async def __call__( logger.warning(f"[{info}] detected.") self.context_tracker.context_overflow = True if token_overflow: - # astune_action_when_overflow = self.config.astuner.rollout.astune_action_when_overflow + # astune_action_when_overflow = self.config.ajet.rollout.astune_action_when_overflow # cannot proceed due to context overflow return ChatResponse( content=[ diff --git a/agentscope_tuner/task_rollout/dashscope_llm_bridge.py b/ajet/task_rollout/dashscope_llm_bridge.py similarity index 100% rename from agentscope_tuner/task_rollout/dashscope_llm_bridge.py rename to ajet/task_rollout/dashscope_llm_bridge.py diff --git a/agentscope_tuner/task_rollout/native_parallel_worker.py b/ajet/task_rollout/native_parallel_worker.py similarity index 97% rename from agentscope_tuner/task_rollout/native_parallel_worker.py rename to ajet/task_rollout/native_parallel_worker.py index a27de7b9..35f76ba5 100644 --- a/agentscope_tuner/task_rollout/native_parallel_worker.py +++ b/ajet/task_rollout/native_parallel_worker.py @@ -15,10 +15,10 @@ from verl import DataProto from verl.utils.torch_functional import pad_sequence_to_length -from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker -from agentscope_tuner.schema.task import Task -from agentscope_tuner.schema.trajectory import Sample -from agentscope_tuner.task_rollout.single_worker import BaseRolloutManager +from ajet.context_tracker.basic_tracker import BaseContextTracker +from ajet.schema.task import Task +from ajet.schema.trajectory import Sample +from ajet.task_rollout.single_worker import BaseRolloutManager class DynamicRolloutManager(BaseRolloutManager): @@ -142,7 +142,7 @@ def rollout( if ( mode == "sample" and (self.rollout_n != 1) - and self.config.astuner.rollout.enable_oversample + and self.config.ajet.rollout.enable_oversample ): return self.rollout_dynamic(tasks, mode, epoch) else: @@ -207,7 +207,7 @@ def rollout_dynamic( # noqa: C901 assert mode != "validate" rollout_n = self.rollout_n self.current_token_count_time = time.time() - submit_oversample_multiplier = self.config.astuner.rollout.submit_oversample_multiplier + submit_oversample_multiplier = self.config.ajet.rollout.submit_oversample_multiplier rollout_n_oversample = int(rollout_n * submit_oversample_multiplier) rollout_n_confirm = int(rollout_n * (1 + submit_oversample_multiplier) / 2) assert ( @@ -487,7 +487,7 @@ def trajectories_to_samples(self, tracker_array: List[BaseContextTracker]) -> Li ) sample_arr_final += sample_arr - if self.config.astuner.backbone in ["verl"]: + if self.config.ajet.backbone in ["verl"]: world_size = self.config.trainer.n_gpus_per_node * self.config.trainer.nnodes remainder = len(sample_arr_final) % world_size if remainder != 0: @@ -527,10 +527,10 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: task_ids.append(sample.task_id) rollout_ids.append(sample.task_tag) - if len(sample.prompt_ids) > self.config.astuner.data.max_prompt_length: + if len(sample.prompt_ids) > self.config.ajet.data.max_prompt_length: raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") - if len(sample.response_ids) > self.config.astuner.data.max_response_length: + if len(sample.response_ids) > self.config.ajet.data.max_response_length: raise RuntimeError(f"Sample has prompt_ids length {len(sample.prompt_ids)} ") assert len(sample.prompt_ids) != 0 @@ -559,9 +559,9 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: step_reward_scores.append(sample.step_reward) # append reward scalar max_prompt_length_this_batch = max([p.shape[-1] for p in prompt_ids]) - assert max_prompt_length_this_batch <= self.config.astuner.data.max_prompt_length + assert max_prompt_length_this_batch <= self.config.ajet.data.max_prompt_length max_response_length_this_batch = max([p.shape[-1] for p in response_ids]) - assert max_response_length_this_batch <= self.config.astuner.data.max_response_length + assert max_response_length_this_batch <= self.config.ajet.data.max_response_length prompt_ids = pad_sequence( prompt_ids, diff --git a/agentscope_tuner/task_rollout/resource_keeper.py b/ajet/task_rollout/resource_keeper.py similarity index 94% rename from agentscope_tuner/task_rollout/resource_keeper.py rename to ajet/task_rollout/resource_keeper.py index b6a99497..76feeb7e 100644 --- a/agentscope_tuner/task_rollout/resource_keeper.py +++ b/ajet/task_rollout/resource_keeper.py @@ -3,8 +3,8 @@ from loguru import logger from omegaconf import DictConfig -from agentscope_tuner.schema.task import WorkflowTask -from agentscope_tuner.utils.env_service_client.env_client_ng import ( +from ajet.schema.task import WorkflowTask +from ajet.utils.env_service_client.env_client_ng import ( EnvClient as EnvClientNg, ) @@ -25,9 +25,9 @@ def __enter__(self): self.tokenizer = self.workflow_task.tokenizer self.llm_inference_fn = self.workflow_task.llm_inference_fn self.observation_window = self.workflow_task.observation_window - if self.config.astuner.task_reader.type == "env_service": - url = self.config.astuner.task_reader.env_service.env_url - env_type = self.config.astuner.task_reader.env_service.env_type + if self.config.ajet.task_reader.type == "env_service": + url = self.config.ajet.task_reader.env_service.env_url + env_type = self.config.ajet.task_reader.env_service.env_type self.env = EnvClientNg(base_url=url) self.env_params = {} self.env_type: str = env_type @@ -74,7 +74,7 @@ def _initialize_environment_and_messages(self) -> List[dict]: Exception: If environment creation fails or required task data is missing """ - if self.config.astuner.task_reader.type == "env_service": + if self.config.ajet.task_reader.type == "env_service": if self.env is None: raise ValueError("Environment client is None but env_service type is specified") try: diff --git a/agentscope_tuner/task_rollout/single_worker.py b/ajet/task_rollout/single_worker.py similarity index 87% rename from agentscope_tuner/task_rollout/single_worker.py rename to ajet/task_rollout/single_worker.py index 019d24d3..666771d1 100644 --- a/agentscope_tuner/task_rollout/single_worker.py +++ b/ajet/task_rollout/single_worker.py @@ -7,14 +7,14 @@ from omegaconf import DictConfig from transformers.tokenization_utils import PreTrainedTokenizer -from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker -from agentscope_tuner.schema.task import Task, WorkflowTask -from agentscope_tuner.task_rollout.async_llm_bridge import AsyncLlmBridge -from agentscope_tuner.task_rollout.resource_keeper import ResourceKeeper -from agentscope_tuner.task_runner.agentscope_runner import AgentScopeRunner -from agentscope_tuner.utils.retry import retry_with_backoff -from agentscope_tuner.utils.sample import get_sample_params -from agentscope_tuner.utils.testing_utils import TestFailException, TestSuccessException +from ajet.context_tracker.basic_tracker import BaseContextTracker +from ajet.schema.task import Task, WorkflowTask +from ajet.task_rollout.async_llm_bridge import AsyncLlmBridge +from ajet.task_rollout.resource_keeper import ResourceKeeper +from ajet.task_runner.agentscope_runner import AgentScopeRunner +from ajet.utils.retry import retry_with_backoff +from ajet.utils.sample import get_sample_params +from ajet.utils.testing_utils import TestFailException, TestSuccessException class BaseRolloutManager: @@ -53,7 +53,7 @@ def __init__( self.async_rollout_manager = async_rollout_manager self.max_parallel: int = max_parallel self.max_llm_retries: int = max_llm_retries - self.rollout_n = config.astuner.rollout.num_repeat + self.rollout_n = config.ajet.rollout.num_repeat self.tokenizer = tokenizer self.pad_token_id: int = self.tokenizer.pad_token_id # type: ignore assert isinstance(self.pad_token_id, int), "pad_token_id must be an integer" diff --git a/agentscope_tuner/task_runner/__init__.py b/ajet/task_runner/__init__.py similarity index 100% rename from agentscope_tuner/task_runner/__init__.py rename to ajet/task_runner/__init__.py diff --git a/agentscope_tuner/task_runner/agentscope_runner.py b/ajet/task_runner/agentscope_runner.py similarity index 81% rename from agentscope_tuner/task_runner/agentscope_runner.py rename to ajet/task_runner/agentscope_runner.py index a5951e0a..2c28bc5f 100644 --- a/agentscope_tuner/task_runner/agentscope_runner.py +++ b/ajet/task_runner/agentscope_runner.py @@ -1,14 +1,14 @@ import asyncio -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput -from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet import ModelTuner, Workflow, WorkflowOutput +from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker -from agentscope_tuner.schema.task import WorkflowTask -from agentscope_tuner.schema.trajectory import Reward -from agentscope_tuner.task_runner.base_runner import BaseAgentRunner -from agentscope_tuner.utils.dynamic_import import dynamic_import +from ajet.context_tracker.basic_tracker import BaseContextTracker +from ajet.schema.task import WorkflowTask +from ajet.schema.trajectory import Reward +from ajet.task_runner.base_runner import BaseAgentRunner +from ajet.utils.dynamic_import import dynamic_import class AgentScopeRunner(BaseAgentRunner): @@ -19,9 +19,9 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: task_tag = workflow_task.task_tag task_id = workflow_task.task_id - workflow_import = self.config.astuner.rollout.agentscope_workflow + workflow_import = self.config.ajet.rollout.agentscope_workflow workflow_cls = dynamic_import(workflow_import) - agentscope_workflow: Workflow = workflow_cls(name="astuner-trinity") + agentscope_workflow: Workflow = workflow_cls(name="ajet-trinity") hooks = self.runner_hooks( observation_window=observation_window, diff --git a/agentscope_tuner/task_runner/base_runner.py b/ajet/task_runner/base_runner.py similarity index 63% rename from agentscope_tuner/task_runner/base_runner.py rename to ajet/task_runner/base_runner.py index 259bef2a..abbb654d 100644 --- a/agentscope_tuner/task_runner/base_runner.py +++ b/ajet/task_runner/base_runner.py @@ -1,9 +1,9 @@ from typing import Any, Callable, Union -from agentscope_tuner.context_tracker.basic_tracker import BaseContextTracker -from agentscope_tuner.task_judge.base_judge import BaseJudge -from agentscope_tuner.utils.async_utils import run_async_coroutine_with_timeout -from agentscope_tuner.utils.dynamic_import import dynamic_import +from ajet.context_tracker.basic_tracker import BaseContextTracker +from ajet.task_judge.base_judge import BaseJudge +from ajet.utils.async_utils import run_async_coroutine_with_timeout +from ajet.utils.dynamic_import import dynamic_import class BaseAgentRunner(object): @@ -15,18 +15,18 @@ def __init__(self, llm_inference_fn: Callable, tokenizer: Any, config, **kwargs) self.external_llm_fn: Union[Callable, None] = None self.llm_inference_fn: Callable = llm_inference_fn self.config = config - self.max_steps: int = self.config.astuner.rollout.multi_turn.max_steps - self.max_model_len: int = self.config.astuner.rollout.max_model_len - self.max_env_len: int = self.config.astuner.context_tracker.max_env_len + self.max_steps: int = self.config.ajet.rollout.multi_turn.max_steps + self.max_model_len: int = self.config.ajet.rollout.max_model_len + self.max_env_len: int = self.config.ajet.context_tracker.max_env_len def get_judge(self) -> BaseJudge: # type: ignore - if self.config.astuner.task_judge.judge_type == "customized_protocol": - judge_protocol = self.config.astuner.task_judge.judge_protocol + if self.config.ajet.task_judge.judge_type == "customized_protocol": + judge_protocol = self.config.ajet.task_judge.judge_protocol return dynamic_import(judge_protocol)(self.config) # type: ignore - elif self.config.astuner.task_judge.judge_type == "rubrics_auto_grader": - # astuner/task_judge/rm_auto_grader_judge.py - from agentscope_tuner.task_judge.rm_auto_grader_judge import AutoGraderJudge + elif self.config.ajet.task_judge.judge_type == "rubrics_auto_grader": + # ajet/task_judge/rm_auto_grader_judge.py + from ajet.task_judge.rm_auto_grader_judge import AutoGraderJudge judge = AutoGraderJudge(self.config) run_async_coroutine_with_timeout(judge.load_rubrics_from_cache()) diff --git a/agentscope_tuner/tuner.py b/ajet/tuner.py similarity index 96% rename from agentscope_tuner/tuner.py rename to ajet/tuner.py index 510ee87f..4b33c6bf 100644 --- a/agentscope_tuner/tuner.py +++ b/ajet/tuner.py @@ -5,13 +5,13 @@ from loguru import logger from pydantic import BaseModel -from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from agentscope_tuner.task_rollout.async_llm_bridge import AgentScopeLlmProxy +from ajet.task_rollout.async_llm_bridge import AgentScopeLlmProxy if TYPE_CHECKING: - from agentscope_tuner import Workflow + from ajet import Workflow class Agent2Proxy(DashScopeChatModel): @@ -26,7 +26,7 @@ def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase) self.tuner = tuner self.default_model = default_model super().__init__( - model_name="astuner", + model_name="ajet", api_key="dummy-api-key", stream=False, ) @@ -63,7 +63,7 @@ def __init__( context_tracker=context_tracker, config=config, **kwargs ) super().__init__( - model_name="astuner", + model_name="ajet", api_key="dummy-api-key", stream=False, ) diff --git a/ajet/tuner_lib/weight_tuner/__init__.py b/ajet/tuner_lib/weight_tuner/__init__.py new file mode 100644 index 00000000..317e8699 --- /dev/null +++ b/ajet/tuner_lib/weight_tuner/__init__.py @@ -0,0 +1,4 @@ + +from ajet.tuner_lib.weight_tuner.as_agentscope_model import AgentScopeModelTuner +from ajet.tuner_lib.weight_tuner.as_oai_sdk_model import OpenaiClientModelTuner + diff --git a/agentscope_tuner/tuner_lib/weight_tuner/as_agentscope_model.py b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py similarity index 94% rename from agentscope_tuner/tuner_lib/weight_tuner/as_agentscope_model.py rename to ajet/tuner_lib/weight_tuner/as_agentscope_model.py index f18b7494..cc36ebc4 100644 --- a/agentscope_tuner/tuner_lib/weight_tuner/as_agentscope_model.py +++ b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py @@ -5,13 +5,13 @@ from loguru import logger from pydantic import BaseModel -from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from agentscope_tuner.task_rollout.async_llm_bridge import AgentScopeLlmProxy +from ajet.task_rollout.async_llm_bridge import AgentScopeLlmProxy if TYPE_CHECKING: - from agentscope_tuner import Workflow + from ajet import Workflow class AgentScopeModelTuner(DashScopeChatModel): @@ -42,7 +42,7 @@ def __init__( context_tracker=context_tracker, config=config, **kwargs ) super().__init__( - model_name="astuner", + model_name="ajet", api_key="dummy-api-key", stream=False, ) diff --git a/agentscope_tuner/tuner_lib/weight_tuner/as_oai_sdk_model.py b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py similarity index 100% rename from agentscope_tuner/tuner_lib/weight_tuner/as_oai_sdk_model.py rename to ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py diff --git a/agentscope_tuner/tuner_lib/weight_tuner/middleware.py b/ajet/tuner_lib/weight_tuner/middleware.py similarity index 100% rename from agentscope_tuner/tuner_lib/weight_tuner/middleware.py rename to ajet/tuner_lib/weight_tuner/middleware.py diff --git a/agentscope_tuner/tuner_v2.md b/ajet/tuner_v2.md similarity index 100% rename from agentscope_tuner/tuner_v2.md rename to ajet/tuner_v2.md diff --git a/agentscope_tuner/tuner_v2.py b/ajet/tuner_v2.py similarity index 93% rename from agentscope_tuner/tuner_v2.py rename to ajet/tuner_v2.py index 6c31dd40..ce2bb73a 100644 --- a/agentscope_tuner/tuner_v2.py +++ b/ajet/tuner_v2.py @@ -5,17 +5,17 @@ from loguru import logger from pydantic import BaseModel -from agentscope_tuner.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from agentscope_tuner.task_rollout.async_llm_bridge import AgentScopeLlmProxy -from agentscope_tuner.tuner_lib.weight_tuner import as_agentscope_model, as_oai_sdk_model -from agentscope_tuner.utils.magic_mock import SpecialMagicMock +from ajet.task_rollout.async_llm_bridge import AgentScopeLlmProxy +from ajet.tuner_lib.weight_tuner import as_agentscope_model, as_oai_sdk_model +from ajet.utils.magic_mock import SpecialMagicMock if TYPE_CHECKING: - from agentscope_tuner import Workflow + from ajet import Workflow from openai.types.chat.chat_completion import ChatCompletion - from agentscope_tuner.tuner_lib.weight_tuner.agentscope_tuner import AgentScopeModelTuner + from ajet.tuner_lib.weight_tuner.ajet import AgentScopeModelTuner @@ -31,7 +31,7 @@ def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase) self.tuner = tuner self.default_model = default_model super().__init__( - model_name="astuner", + model_name="ajet", api_key="dummy-api-key", stream=False, ) diff --git a/agentscope_tuner/utils/__init__.py b/ajet/utils/__init__.py similarity index 100% rename from agentscope_tuner/utils/__init__.py rename to ajet/utils/__init__.py diff --git a/agentscope_tuner/utils/async_utils.py b/ajet/utils/async_utils.py similarity index 100% rename from agentscope_tuner/utils/async_utils.py rename to ajet/utils/async_utils.py diff --git a/agentscope_tuner/utils/cleaner.py b/ajet/utils/cleaner.py similarity index 100% rename from agentscope_tuner/utils/cleaner.py rename to ajet/utils/cleaner.py diff --git a/agentscope_tuner/utils/color_hsl.py b/ajet/utils/color_hsl.py similarity index 100% rename from agentscope_tuner/utils/color_hsl.py rename to ajet/utils/color_hsl.py diff --git a/agentscope_tuner/utils/compute_madness.py b/ajet/utils/compute_madness.py similarity index 100% rename from agentscope_tuner/utils/compute_madness.py rename to ajet/utils/compute_madness.py diff --git a/agentscope_tuner/utils/config_computer.py b/ajet/utils/config_computer.py similarity index 87% rename from agentscope_tuner/utils/config_computer.py rename to ajet/utils/config_computer.py index c2515a65..56c72dac 100644 --- a/agentscope_tuner/utils/config_computer.py +++ b/ajet/utils/config_computer.py @@ -60,7 +60,7 @@ def visit_Name(self, node): self.generic_visit(node) def visit_Attribute(self, node): - # Handle attribute access like "astuner.rollout.max_env_worker" + # Handle attribute access like "ajet.rollout.max_env_worker" # Reconstruct the full attribute path full_key = self._get_full_attribute_name(node) if full_key and not self._is_builtin_attribute(full_key): @@ -91,8 +91,8 @@ def split_keys_and_operators( """ Parse expression string using AST and extract keys and operators - Input example: (min(astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine, 64)) - Output example: (['astuner.rollout.max_env_worker', 'astuner.rollout.n_vllm_engine'], ) + Input example: (min(ajet.rollout.max_env_worker // ajet.rollout.n_vllm_engine, 64)) + Output example: (['ajet.rollout.max_env_worker', 'ajet.rollout.n_vllm_engine'], ) """ # Parse the expression @@ -163,7 +163,7 @@ def eval_func(values: Dict[str, Any]) -> Any: # Test examples if __name__ == "__main__": # Example 1 - operation_str1 = "(astuner.data.train_batch_size * astuner.rollout.num_repeat * astuner.rollout.multi_turn.expected_steps)" + operation_str1 = "(ajet.data.train_batch_size * ajet.rollout.num_repeat * ajet.rollout.multi_turn.expected_steps)" known_operators1 = [] keys1, func1 = split_keys_and_operators(operation_str1) @@ -171,23 +171,23 @@ def eval_func(values: Dict[str, Any]) -> Any: print(f"Extracted keys: {keys1}") values1 = { - "astuner.data.train_batch_size": 32, - "astuner.rollout.num_repeat": 4, - "astuner.rollout.multi_turn.expected_steps": 10, + "ajet.data.train_batch_size": 32, + "ajet.rollout.num_repeat": 4, + "ajet.rollout.multi_turn.expected_steps": 10, } result1 = func1(values1) print(f"Computed result: {result1}") # 32 * 4 * 10 = 1280 print() # Example 2 - operation_str2 = "(astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine)" + operation_str2 = "(ajet.rollout.max_env_worker // ajet.rollout.n_vllm_engine)" known_operators2 = [] keys2, func2 = split_keys_and_operators(operation_str2) print("Example 2:") print(f"Extracted keys: {keys2}") - values2 = {"astuner.rollout.max_env_worker": 100, "astuner.rollout.n_vllm_engine": 8} + values2 = {"ajet.rollout.max_env_worker": 100, "ajet.rollout.n_vllm_engine": 8} result2 = func2(values2) print(f"Computed result: {result2}") # 100 // 8 = 12 print() @@ -205,7 +205,7 @@ def eval_func(values: Dict[str, Any]) -> Any: print(f"Computed result: {result3}") # 100 * 5 / 10 + 20 - 5 = 65.0 # Example 4 - operation_str4 = "(min(astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine, 64))" + operation_str4 = "(min(ajet.rollout.max_env_worker // ajet.rollout.n_vllm_engine, 64))" known_operators4 = [] keys4, func4 = split_keys_and_operators(operation_str4) @@ -213,8 +213,8 @@ def eval_func(values: Dict[str, Any]) -> Any: print(f"Extracted keys: {keys4}") values4 = { - "astuner.rollout.max_env_worker": 512, - "astuner.rollout.n_vllm_engine": 4, + "ajet.rollout.max_env_worker": 512, + "ajet.rollout.n_vllm_engine": 4, } result4 = func4(values4) print(f"Computed result: {result4}") # 64 diff --git a/agentscope_tuner/utils/config_utils.py b/ajet/utils/config_utils.py similarity index 92% rename from agentscope_tuner/utils/config_utils.py rename to ajet/utils/config_utils.py index ea5fa118..31a0c341 100644 --- a/agentscope_tuner/utils/config_utils.py +++ b/ajet/utils/config_utils.py @@ -9,7 +9,7 @@ from loguru import logger from omegaconf import DictConfig -from agentscope_tuner.utils.config_computer import split_keys_and_operators +from ajet.utils.config_computer import split_keys_and_operators def read_astune_config(yaml_fp): @@ -172,12 +172,12 @@ def read_astune_hierarchical_config( ): if yaml_fp is None: config = { - "astuner": {}, + "ajet": {}, "hydra": { "searchpath": [ - "file://agentscope_tuner/default_config", - "file://agentscope_tuner/default_config/verl", - "file://agentscope_tuner/default_config/trinity", + "file://ajet/default_config", + "file://ajet/default_config/verl", + "file://ajet/default_config/trinity", ] }, "defaults": [ @@ -190,25 +190,25 @@ def read_astune_hierarchical_config( else: with open(yaml_fp, "r") as file: config = yaml.safe_load(file) - config["astuner"]["experiment_name"] = exp_name - config["astuner"]["experiment_dir"] = os.path.join(exp_dir, exp_name) - config["astuner"]["backbone"] = backbone + config["ajet"]["experiment_name"] = exp_name + config["ajet"]["experiment_dir"] = os.path.join(exp_dir, exp_name) + config["ajet"]["backbone"] = backbone # remove extra config of verl for trinity if backbone == "debug": if "trinity_default" in config["defaults"]: config["defaults"].remove("trinity_default") - config["hydra"]["searchpath"].remove("file://agentscope_tuner/default_config/trinity") + config["hydra"]["searchpath"].remove("file://ajet/default_config/trinity") # remove extra config of verl for trinity if backbone == "trinity": if "verl_default" in config["defaults"]: config["defaults"].remove("verl_default") - config["hydra"]["searchpath"].remove("file://agentscope_tuner/default_config/verl") + config["hydra"]["searchpath"].remove("file://ajet/default_config/verl") # remove extra config of trinity for verl if backbone == "verl": # or args.backbone == "debug" if "trinity_default" in config["defaults"]: config["defaults"].remove("trinity_default") - config["hydra"]["searchpath"].remove("file://agentscope_tuner/default_config/trinity") + config["hydra"]["searchpath"].remove("file://ajet/default_config/trinity") if write_to: with open(write_to, "w") as file: @@ -262,9 +262,9 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): with open(yaml_path, "r") as file: config = yaml.safe_load(file) try: - exp_name = config.get("astuner").get("experiment_name") + exp_name = config.get("ajet").get("experiment_name") except Exception: - raise ValueError(f"Please set astuner field in yaml file. Current yaml:\n{config}") + raise ValueError(f"Please set ajet field in yaml file. Current yaml:\n{config}") if exp_name is None or exp_name == "read_yaml_name": if exp_name is not None: exp_name = exp_name.replace("|", "-") diff --git a/agentscope_tuner/utils/core_env_vars.py b/ajet/utils/core_env_vars.py similarity index 95% rename from agentscope_tuner/utils/core_env_vars.py rename to ajet/utils/core_env_vars.py index aca4856b..01920824 100644 --- a/agentscope_tuner/utils/core_env_vars.py +++ b/ajet/utils/core_env_vars.py @@ -15,7 +15,7 @@ def get_runtime_env(is_trinity: bool = False) -> dict: "NCCL_DEBUG": "WARN", "VLLM_LOGGING_LEVEL": "WARN", "TOKENIZERS_PARALLELISM": "true", - # use agentscope_tuner.backbone as plugin directory + # use ajet.backbone as plugin directory "TRINITY_PLUGIN_DIRS": str((Path(__file__).parent.parent / "backbone").resolve()), # "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), diff --git a/agentscope_tuner/utils/dynamic_import.py b/ajet/utils/dynamic_import.py similarity index 100% rename from agentscope_tuner/utils/dynamic_import.py rename to ajet/utils/dynamic_import.py diff --git a/agentscope_tuner/utils/embedding_client.py b/ajet/utils/embedding_client.py similarity index 100% rename from agentscope_tuner/utils/embedding_client.py rename to ajet/utils/embedding_client.py diff --git a/agentscope_tuner/utils/env_service_client/__init__.py b/ajet/utils/env_service_client/__init__.py similarity index 100% rename from agentscope_tuner/utils/env_service_client/__init__.py rename to ajet/utils/env_service_client/__init__.py diff --git a/agentscope_tuner/utils/env_service_client/env_client_ng.py b/ajet/utils/env_service_client/env_client_ng.py similarity index 100% rename from agentscope_tuner/utils/env_service_client/env_client_ng.py rename to ajet/utils/env_service_client/env_client_ng.py diff --git a/agentscope_tuner/utils/launch_utils.py b/ajet/utils/launch_utils.py similarity index 93% rename from agentscope_tuner/utils/launch_utils.py rename to ajet/utils/launch_utils.py index c57bbae5..eddbabe9 100644 --- a/agentscope_tuner/utils/launch_utils.py +++ b/ajet/utils/launch_utils.py @@ -8,8 +8,8 @@ from beast_logger import print_dict from loguru import logger -from agentscope_tuner.utils.config_utils import align_parameters -from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent +from ajet.utils.config_utils import align_parameters +from ajet.utils.smart_daemon import LaunchCommandWhenAbsent def set_loguru_default_color(): @@ -115,10 +115,10 @@ def verify_python_env(args, exp_config): Args: args: Command line arguments containing the expected python_executable """ - if exp_config["astuner"]["trainer_common"]["logger"] == "swanlab": + if exp_config["ajet"]["trainer_common"]["logger"] == "swanlab": if os.environ.get("SWANLAB_API_KEY", "") == "": cause = "SWANLAB_API_KEY is not set in the environment." - solution = "To use the swanlab logger, please set `SWANLAB_API_KEY`. Otherwise, set `astuner.trainer_common.logger=tensorboard`" + solution = "To use the swanlab logger, please set `SWANLAB_API_KEY`. Otherwise, set `ajet.trainer_common.logger=tensorboard`" print_dict( { "Python Environment Check": "FAILED", @@ -180,12 +180,12 @@ def execute_training_process( """ # Fixed config asset locations - TRINITY_BOOT_YAML = "agentscope_tuner/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED + TRINITY_BOOT_YAML = "ajet/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED TRINITY_CONFIG_AUTO_CONVERSION = ( - "agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc" + "ajet/default_config/trinity/config_auto_convertion_trinity.jsonc" ) VERL_CONFIG_AUTO_CONVERSION = ( - "agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc" + "ajet/default_config/verl/config_auto_convertion_verl.jsonc" ) # let's begin the training process diff --git a/agentscope_tuner/utils/magic_mock.py b/ajet/utils/magic_mock.py similarity index 100% rename from agentscope_tuner/utils/magic_mock.py rename to ajet/utils/magic_mock.py diff --git a/agentscope_tuner/utils/message_utils.py b/ajet/utils/message_utils.py similarity index 100% rename from agentscope_tuner/utils/message_utils.py rename to ajet/utils/message_utils.py diff --git a/agentscope_tuner/utils/process_dataset.py b/ajet/utils/process_dataset.py similarity index 100% rename from agentscope_tuner/utils/process_dataset.py rename to ajet/utils/process_dataset.py diff --git a/agentscope_tuner/utils/pty.py b/ajet/utils/pty.py similarity index 98% rename from agentscope_tuner/utils/pty.py rename to ajet/utils/pty.py index a05c4743..a2124775 100644 --- a/agentscope_tuner/utils/pty.py +++ b/ajet/utils/pty.py @@ -96,7 +96,7 @@ def pty_wrapper_final(human_cmd, dir, env_dict): def pty_launch(service_name: str, success_std_string="Starting server on"): - from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent + from ajet.utils.smart_daemon import LaunchCommandWhenAbsent service_path = os.environ.get(f"{service_name.upper()}_PATH") service_script = os.environ.get(f"{service_name.upper()}_SCRIPT") diff --git a/agentscope_tuner/utils/retry.py b/ajet/utils/retry.py similarity index 95% rename from agentscope_tuner/utils/retry.py rename to ajet/utils/retry.py index e154818f..339eb7bb 100644 --- a/agentscope_tuner/utils/retry.py +++ b/ajet/utils/retry.py @@ -4,7 +4,7 @@ from loguru import logger -from agentscope_tuner.utils.testing_utils import TestFailException, TestSuccessException +from ajet.utils.testing_utils import TestFailException, TestSuccessException T = TypeVar("T") diff --git a/agentscope_tuner/utils/robust_dashscope.py b/ajet/utils/robust_dashscope.py similarity index 100% rename from agentscope_tuner/utils/robust_dashscope.py rename to ajet/utils/robust_dashscope.py diff --git a/agentscope_tuner/utils/sample.py b/ajet/utils/sample.py similarity index 50% rename from agentscope_tuner/utils/sample.py rename to ajet/utils/sample.py index ac6a2311..2c7fd9e8 100644 --- a/agentscope_tuner/utils/sample.py +++ b/ajet/utils/sample.py @@ -10,24 +10,24 @@ def get_sample_params(mode, config): response_length_eps = ( 16 # Reserve a few tokens for later handling of special tokens like lm_start. ) - if config.astuner.rollout.name == "vllm": + if config.ajet.rollout.name == "vllm": sampling_params = dict( n=1, - max_tokens=config.astuner.rollout.max_response_length_in_one_turn - response_length_eps, + max_tokens=config.ajet.rollout.max_response_length_in_one_turn - response_length_eps, min_tokens=1, # Must output at least 1 token. - temperature=config.astuner.rollout.temperature, - top_p=config.astuner.rollout.top_p, + temperature=config.ajet.rollout.temperature, + top_p=config.ajet.rollout.top_p, ) else: sampling_params = dict( n=1, - max_new_tokens=config.astuner.rollout.max_response_length_in_one_turn, - temperature=config.astuner.rollout.temperature, - top_p=config.astuner.rollout.top_p, + max_new_tokens=config.ajet.rollout.max_response_length_in_one_turn, + temperature=config.ajet.rollout.temperature, + top_p=config.ajet.rollout.top_p, ) if mode == "validate": - sampling_params["temperature"] = config.astuner.rollout.val_kwargs.temperature - sampling_params["top_k"] = config.astuner.rollout.val_kwargs.top_k - sampling_params["top_p"] = config.astuner.rollout.val_kwargs.top_p + sampling_params["temperature"] = config.ajet.rollout.val_kwargs.temperature + sampling_params["top_k"] = config.ajet.rollout.val_kwargs.top_k + sampling_params["top_p"] = config.ajet.rollout.val_kwargs.top_p return sampling_params diff --git a/agentscope_tuner/utils/smart_daemon.py b/ajet/utils/smart_daemon.py similarity index 99% rename from agentscope_tuner/utils/smart_daemon.py rename to ajet/utils/smart_daemon.py index 7b8205d9..d36ec9d8 100644 --- a/agentscope_tuner/utils/smart_daemon.py +++ b/ajet/utils/smart_daemon.py @@ -291,7 +291,7 @@ def launch( converted_cmd = [ sys.executable, "-m", - "agentscope_tuner.utils.pty", + "ajet.utils.pty", "--human-cmd", f"'{string_to_base64(self.cmd[0])}'", "--dir", diff --git a/agentscope_tuner/utils/testing_utils.py b/ajet/utils/testing_utils.py similarity index 93% rename from agentscope_tuner/utils/testing_utils.py rename to ajet/utils/testing_utils.py index b3147e70..bdf0757e 100644 --- a/agentscope_tuner/utils/testing_utils.py +++ b/ajet/utils/testing_utils.py @@ -10,7 +10,7 @@ from beast_logger import print_dict from loguru import logger -from agentscope_tuner.utils.dynamic_import import dynamic_import +from ajet.utils.dynamic_import import dynamic_import class TestSuccessException(Exception): @@ -50,25 +50,25 @@ def get_test_lambda(test_name) -> BaseProbe: def _test_if_test_mode(key, value, config): - from agentscope_tuner.backbone.warm_up import init_parallel_rollout_logger + from ajet.backbone.warm_up import init_parallel_rollout_logger - if not config.astuner.execute_test: + if not config.ajet.execute_test: return - if config.astuner.execute_test == "do_not_test": + if config.ajet.execute_test == "do_not_test": return - init_parallel_rollout_logger(config.astuner.experiment_name) - test_lambda = get_test_lambda(config.astuner.execute_testing_lambda) + init_parallel_rollout_logger(config.ajet.experiment_name) + test_lambda = get_test_lambda(config.ajet.execute_testing_lambda) if key not in test_lambda.probe_list: return return test_lambda(key, value) def _mock_if_test_mode(key, value, config): - if not config.astuner.execute_test: + if not config.ajet.execute_test: return value - if config.astuner.execute_test == "do_not_test": + if config.ajet.execute_test == "do_not_test": return value - test_lambda = get_test_lambda(config.astuner.execute_testing_lambda) + test_lambda = get_test_lambda(config.ajet.execute_testing_lambda) if key not in test_lambda.probe_list: return value return test_lambda.mock(key) @@ -145,7 +145,7 @@ def populate_test_env_metadata(workspace_dir: str) -> tuple[str, str]: def update_benchmark_status(status, status_detail, append_log="", data_dashboard_url=""): if "ASTUNER_GIT_HASH" not in os.environ: raise RuntimeError( - "ASTUNER_GIT_HASH not found in environment variables. Please set `astuner.execute_test=False`." + "ASTUNER_GIT_HASH not found in environment variables. Please set `ajet.execute_test=False`." ) git_hash = os.environ["ASTUNER_GIT_HASH"] diff --git a/agentscope_tuner/utils/tokenizer.py b/ajet/utils/tokenizer.py similarity index 100% rename from agentscope_tuner/utils/tokenizer.py rename to ajet/utils/tokenizer.py diff --git a/agentscope_tuner/workflow.py b/ajet/workflow.py similarity index 97% rename from agentscope_tuner/workflow.py rename to ajet/workflow.py index 2f27da0f..dc11016b 100644 --- a/agentscope_tuner/workflow.py +++ b/ajet/workflow.py @@ -2,8 +2,8 @@ from pydantic import BaseModel, Field -from agentscope_tuner import ModelTuner -from agentscope_tuner.schema.task import WorkflowOutput, WorkflowTask +from ajet import ModelTuner +from ajet.schema.task import WorkflowOutput, WorkflowTask class Workflow(BaseModel): diff --git a/docs/en/configuration.md b/docs/en/configuration.md index f6333618..76c7fee2 100644 --- a/docs/en/configuration.md +++ b/docs/en/configuration.md @@ -9,9 +9,9 @@ This page provides a detailed description of the configuration files for AgentSc AgentScope Tuner uses YAML-format configuration files to set up data, algorithms, rewards, logging, and other runtime behaviors. !!! info "Default Configuration" - The default config is located at `astuner/default_config/astune_default.yaml`. + The default config is located at `ajet/default_config/astune_default.yaml`. -At a high level, a typical config contains a single root section `astuner`, which is divided into several logical parts: +At a high level, a typical config contains a single root section `ajet`, which is divided into several logical parts:
    @@ -38,7 +38,7 @@ At a high level, a typical config contains a single root section `astuner`, whic ### Specifying the Model ```yaml title="config.yaml" -astuner: +ajet: model: path: path/to/model ``` @@ -69,7 +69,7 @@ export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' === "EnvService" ```yaml - astuner: + ajet: task_reader: type: env_service env_service: @@ -83,7 +83,7 @@ export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' === "JSONL File" ```yaml - astuner: + ajet: task_reader: type: jsonl_dataset_file jsonl_dataset_file: @@ -96,7 +96,7 @@ export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' === "HuggingFace" ```yaml - astuner: + ajet: task_reader: type: huggingface_dat_repo huggingface_dat_repo: @@ -110,10 +110,10 @@ export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' `task_judge` evaluates agent performance and calculates rewards. ```yaml title="config.yaml" -astuner: +ajet: task_judge: judge_type: customized_protocol # or 'rubrics_auto_grader' - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 ``` @@ -138,7 +138,7 @@ AgentScope Tuner supports three training backends: | **debug** | Allows breakpoint debugging in IDEs | ```yaml title="config.yaml" -astuner: +ajet: backbone: trinity # debug, trinity, or verl ``` @@ -147,7 +147,7 @@ astuner: Controls agent behavior during environment interaction: ```yaml title="config.yaml" -astuner: +ajet: rollout: agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow max_env_worker: 128 @@ -168,7 +168,7 @@ astuner: ### Common Training Parameters ```yaml title="config.yaml" -astuner: +ajet: trainer_common: total_epochs: 50 save_freq: 20 @@ -194,7 +194,7 @@ astuner: ### Optimization Algorithms ```yaml title="config.yaml" -astuner: +ajet: trainer_common: algorithm: adv_estimator: grpo @@ -220,7 +220,7 @@ astuner: When `backbone: debug`, additional settings are available: ```yaml title="config.yaml" -astuner: +ajet: debug: debug_max_parallel: 16 debug_first_n_tasks: 2 @@ -241,7 +241,7 @@ astuner: ### Logger Selection ```yaml title="config.yaml" -astuner: +ajet: trainer_common: logger: swanlab # console, wandb, or swanlab ``` @@ -268,7 +268,7 @@ All experiment outputs are saved in `./launcher_record/{experiment_name}`: ??? example "Complete Configuration Template" ```yaml title="config.yaml" - astuner: + ajet: project_name: "astuner_default_project" experiment_name: "read_yaml_name" experiment_dir: "auto" @@ -322,7 +322,7 @@ All experiment outputs are saved in `./launcher_record/{experiment_name}`: task_judge: judge_type: customized_protocol - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 diff --git a/docs/en/data_generation.md b/docs/en/data_generation.md index bf5e0cb3..ae23058e 100644 --- a/docs/en/data_generation.md +++ b/docs/en/data_generation.md @@ -74,10 +74,10 @@ cp your-document.pdf dataset/document/ ### Step 2: Generate Training Tasks #### Method 1: Integrate Data Generation into the Training Pipeline -Copy and modify the key configuration parameters in `astuner/default_config/astune_default.yaml`, and set `astuner.task_reader.type` to `data_generation` to enable this reader. +Copy and modify the key configuration parameters in `ajet/default_config/astune_default.yaml`, and set `ajet.task_reader.type` to `data_generation` to enable this reader. ```yaml -astuner: +ajet: task_reader: type: data_generation # when `type == data_generation` @@ -116,8 +116,8 @@ astuner: #### Method 2: Run the Generation Script ```python -from agentscope_tuner.data_generator.config import * -from agentscope_tuner.task_reader.data_generator_reader import DataGeneratorTaskReader +from ajet.data_generator.config import * +from ajet.task_reader.data_generator_reader import DataGeneratorTaskReader def run(): config = TaskReaderConfig( diff --git a/docs/en/data_pipeline.md b/docs/en/data_pipeline.md index 9dfed503..01e586ba 100644 --- a/docs/en/data_pipeline.md +++ b/docs/en/data_pipeline.md @@ -11,7 +11,7 @@ In agent training, all training data must be represented as **tasks** following !!! info "Key Concepts" - **Unified Schema**: All tasks conform to the `Task` structure regardless of source - **Multiple Sources**: Load from local files, HuggingFace datasets, interactive environments, or auto-generate new tasks - - **Automatic Routing**: The framework selects the appropriate reader based on `astuner.task_reader.type` + - **Automatic Routing**: The framework selects the appropriate reader based on `ajet.task_reader.type` ``` Data Source → Task Reader → Unified Task Schema → Training Pipeline @@ -71,7 +71,7 @@ class Task(BaseModel): ## Built-in Task Readers -AgentScope Tuner provides multiple built-in Task Readers for different scenarios. The framework automatically routes to the correct reader based on `astuner.task_reader.type`. +AgentScope Tuner provides multiple built-in Task Readers for different scenarios. The framework automatically routes to the correct reader based on `ajet.task_reader.type`. ### Quick Selection Guide @@ -90,7 +90,7 @@ AgentScope Tuner provides multiple built-in Task Readers for different scenarios === "Configuration" ```yaml title="config.yaml" - astuner: + ajet: task_reader: type: jsonl_dataset_file jsonl_dataset_file: @@ -121,7 +121,7 @@ AgentScope Tuner provides multiple built-in Task Readers for different scenarios **When to use:** Load tasks from HuggingFace Hub datasets (e.g., GSM8K, MATH). ```yaml title="config.yaml" -astuner: +ajet: task_reader: type: huggingface_dat_repo huggingface_dat_repo: @@ -143,7 +143,7 @@ astuner: **When to use:** Tasks are provided by an interactive environment service (e.g., AppWorld, RL gym environments). ```yaml title="config.yaml" -astuner: +ajet: task_reader: type: env_service env_service: diff --git a/docs/en/debugging_guide.md b/docs/en/debugging_guide.md index abaefb41..c8225a3b 100644 --- a/docs/en/debugging_guide.md +++ b/docs/en/debugging_guide.md @@ -25,7 +25,7 @@ For more details, please refer to VSCode official documents. "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -44,7 +44,7 @@ For more details, please refer to VSCode official documents. ```bash export DASHSCOPE_API_KEY="sk-abcdefg" -astuner --conf tutorial/example_appworld/appworld.yaml --with-appworld --backbone='verl' +ajet --conf tutorial/example_appworld/appworld.yaml --with-appworld --backbone='verl' ``` Then, the modified launch.json will be @@ -57,7 +57,7 @@ Then, the modified launch.json will be "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", // verl -> debug diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index cdb989c4..a3bda809 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -43,7 +43,7 @@ export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" Run the training script: ```bash -astuner --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray ```
    @@ -53,10 +53,10 @@ If you want to breakpoint-debug the workflow/judge locally: ```bash # (optional) recommended cleanup before debug -# astuner --kill="python|ray" +# ajet --kill="python|ray" clear && \ -astuner --conf tutorial/example_appworld/math_agent.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_appworld/math_agent.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: @@ -69,7 +69,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -105,7 +105,7 @@ agent = ReActAgent( env = workflow_task.gym_env -for step in range(model_tuner.config.astuner.rollout.multi_turn.max_steps): +for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol @@ -129,28 +129,28 @@ In the above code: ### 3.2 Reward -In `astuner/task_judge/env_service_as_judge.py`, we read the reward signal from the environment via `env.evaluate(...)`. +In `ajet/task_judge/env_service_as_judge.py`, we read the reward signal from the environment via `env.evaluate(...)`. You can also refer to this file to implement your own Judge for your specific task. ### 3.3 Configuration Details Copy and modify the key parameters in `tutorial/example_appworld/appworld.yaml`. The parts most relevant to this document are marked with in the yaml file: -1. **Read tasks** (corresponding config field: `astuner.task_reader`) -2. **Define the workflow** (corresponding config field: `astuner.rollout.agentscope_workflow`) +1. **Read tasks** (corresponding config field: `ajet.task_reader`) +2. **Define the workflow** (corresponding config field: `ajet.rollout.agentscope_workflow`) - Example: if the AgentScope workflow is defined in the `ExampleAgentScopeWorkflow` class in `tutorial/example_appworld/appworld.py` - - Then set `astuner.rollout.agentscope_workflow = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow"` -3. **Define the scoring function** (corresponding config field: `astuner.task_judge.judge_protocol`) - - Example: `astuner.task_judge.judge_protocol = "astuner.task_judge.env_service_as_judge->EnvServiceJudge"` -4. **Specify the model** (corresponding config field: `astuner.model.path`) + - Then set `ajet.rollout.agentscope_workflow = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow"` +3. **Define the scoring function** (corresponding config field: `ajet.task_judge.judge_protocol`) + - Example: `ajet.task_judge.judge_protocol = "ajet.task_judge.env_service_as_judge->EnvServiceJudge"` +4. **Specify the model** (corresponding config field: `ajet.model.path`) ```yaml -astuner: +ajet: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # [key] Implement and select the evaluation function - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge model: # [key] Set the model to be trained path: YOUR_MODEL_PATH diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index a81d41c6..a198c0ec 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -13,7 +13,7 @@ Download the `Jiayi-Pan/Countdown-Tasks-3to4` dataset and split it into training python tutorial/example_countdown/prepare_data.py --target=Jiayi-Pan/Countdown-Tasks-3to4 --path=/the/path/to/store/dataset ``` -The Countdown dataset contains the `target` and `nums` fields and requires custom data formatting logic. For example, when using the `huggingface_dat_repo` task reader method, you need to modify the `_load_dataset_split` method in `astuner/task_reader/hf_dataset_reader.py`: +The Countdown dataset contains the `target` and `nums` fields and requires custom data formatting logic. For example, when using the `huggingface_dat_repo` task reader method, you need to modify the `_load_dataset_split` method in `ajet/task_reader/hf_dataset_reader.py`: ```python task = Task( @@ -31,7 +31,7 @@ Simply run the following command: ```bash # It is recommended to kill all ray, vllm, and env_service processes before starting ( python launcher.py --kill="python|ray|vllm" ) -astuner --conf tutorial/example_countdown/countdown.yaml --backbone='verl' +ajet --conf tutorial/example_countdown/countdown.yaml --backbone='verl' ```
    @@ -41,10 +41,10 @@ If you want to breakpoint-debug the workflow/judge locally: ```bash # (optional) recommended cleanup before debug -# astuner --kill="python|ray" +# ajet --kill="python|ray" clear && \ -astuner --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: @@ -57,7 +57,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -109,17 +109,17 @@ WorkflowOutput( ### 3.2 Configuration Details Copy and modify key parameters in `tutorial/example_countdown/countdown.yaml`. The most relevant parts in the yaml file are marked with symbols. -1. Read task (corresponds to configuration field `astuner.task_reader`) -2. Define Workflow (corresponds to configuration field `astuner.rollout.agentscope_workflow`) +1. Read task (corresponds to configuration field `ajet.task_reader`) +2. Define Workflow (corresponds to configuration field `ajet.rollout.agentscope_workflow`) - Example: If agentscope workflow is defined in `ExampleCountdownLearn` class of `tutorial/example_countdown/countdown.py` - - Then set `astuner.rollout.agentscope_workflow`=`tutorial.example_countdown.countdown->ExampleCountdownLearn` -3. Define scoring function (corresponds to configuration field `astuner.task_judge.judge_protocol`) + - Then set `ajet.rollout.agentscope_workflow`=`tutorial.example_countdown.countdown->ExampleCountdownLearn` +3. Define scoring function (corresponds to configuration field `ajet.task_judge.judge_protocol`) - Example: If agentscope workflow is defined in `CountdownAnswerAsJudge` class of `tutorial/example_countdown/countdown_answer_as_judge.py` - - Then set `astuner.task_judge.judge_protocol`=`tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge` -4. Specify model (corresponds to configuration field `astuner.model.path`) + - Then set `ajet.task_judge.judge_protocol`=`tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge` +4. Specify model (corresponds to configuration field `ajet.model.path`) ```yaml -astuner: +ajet: task_reader: type: huggingface_dat_repo # [key] `env_service` or `dataset_file` or `huggingface_dat_repo` or `data_generation` rollout: diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index 0fcb05c4..8e0e601d 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -23,13 +23,13 @@ pip install gymnasium[toy_text] Use the provided configuration file to quickly start training: ```bash -astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='trinity' --with-ray ``` To try a harder setting: ```bash -astuner --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone=trinity --with-ray +ajet --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone=trinity --with-ray ```
    @@ -39,10 +39,10 @@ If you want to breakpoint-debug the workflow/judge locally: ```bash # (optional) recommended cleanup before debug -# astuner --kill="python|ray" +# ajet --kill="python|ray" clear && \ -astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: @@ -55,7 +55,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -83,8 +83,8 @@ This example packages a multi-step environment interaction loop into a trainable The key fields in `tutorial/example_frozenlake/frozenlake_easy.yaml` / `frozenlake_hard.yaml` are: -- `astuner.rollout.agentscope_workflow`: entry point of the workflow class, set to `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`. -- `astuner.rollout.multi_turn.max_steps`: maximum steps per episode (also used by the agent). +- `ajet.rollout.agentscope_workflow`: entry point of the workflow class, set to `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`. +- `ajet.rollout.multi_turn.max_steps`: maximum steps per episode (also used by the agent). - `frozen_lake.frozen_lake_size`: grid size (e.g. 4 for easy, 6 for hard). - `frozen_lake.is_slippery`: whether the action may slip to unintended directions. diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index 9eeab5ab..59a00aa0 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -15,8 +15,8 @@ Figure: Why "Learning to Ask" matters. Left: LLM gives a diagnosis with too litt -This tutorial is organized in two steps: -1) **Run it**: start training with the default YAML config. +This tutorial is organized in two steps: +1) **Run it**: start training with the default YAML config. 2) **Understand & customize**: dataset preprocessing, workflow (ExampleLearn2Ask), and reward (reward_fn + llm_reward). --- @@ -42,7 +42,7 @@ After preprocessing, you should have: `train.jsonl` and`test.jsonl`。 #### 2.2 Start Training ```bash -astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray ```
    @@ -51,7 +51,7 @@ astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' -- Run Ray locally without enabling it for faster iteration: ``` -bash astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview +bash ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview ``` @@ -72,7 +72,7 @@ This tutorial trains a model to **ask the next best question** from a short doct The whole example is “wired” in the YAML and implemented in one file. In the YAML, `task_reader` provides the dataset split, `rollout.agentscope_workflow` tells ASTuner which workflow to run for each sample, and `task_judge` provides the reward entry that wraps the LLM judge. The `model` section decides which pretrained backbone you start from. ```yaml -astune: +ajet: task_reader: type: dataset_file # train_path: data/realmedconv/train.jsonl @@ -105,15 +105,15 @@ At the code level, everything is implemented in `tutorial/example_learn2ask/lear - It **only evaluates the doctor’s last message** (doctor’s last message), and does not consider earlier doctor turns. - It outputs two scores: **Format Score** + **Content Score** (scored separately, then combined by `reward_fn` into the training reward). -**Format Score**: scored by the number of questions in the doctor’s last message +**Format Score**: scored by the number of questions in the doctor’s last message - 1.0: exactly **one question**, or correctly output `` when no question is needed -- 0.5: **two questions** +- 0.5: **two questions** - 0.0: **three or more questions** -**Content Score**: scored by whether the question targets the “missing information” in `Reference Information` (i.e., information the doctor does not yet know) +**Content Score**: scored by whether the question targets the “missing information” in `Reference Information` (i.e., information the doctor does not yet know) - 1.0: the question **directly asks about** an item in `Reference Information`, or correctly end the conversation when no more information is needed -- 0.1: the question is too generic (a general question that could apply to almost any symptom) -- 0.0: the question is **irrelevant** to the missing items in `Reference Information` +- 0.1: the question is too generic (a general question that could apply to almost any symptom) +- 0.0: the question is **irrelevant** to the missing items in `Reference Information` - Additionally: **ambiguous or uninformative questions are treated as low-quality** (e.g., unclear references), and will typically receive a score of 0 or close to 0 ### 4. Results @@ -124,7 +124,7 @@ At the code level, everything is implemented in `tutorial/example_learn2ask/lear > **Visualization:** Training curves are generated by SwanLab. See [Visualization Tools](./visualization.md) for setup and usage. -This training curve reflects the trend of the reward over time. The reward includes: **Format Score** (whether the model asks exactly one question) and **Content Score** (whether it directly asks about the missing key information in `Reference Information`). +This training curve reflects the trend of the reward over time. The reward includes: **Format Score** (whether the model asks exactly one question) and **Content Score** (whether it directly asks about the missing key information in `Reference Information`). Therefore, a rising curve indicates the model gradually learns to produce **one clear question** and to hit missing information more often, rather than asking generic questions or producing ambiguous/uninformative questions. diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index 2973daee..39e5d4ed 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -33,9 +33,9 @@ python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/sto ```bash # (optional) recommended cleanup before training -# astuner --kill="python|ray|vllm" +# ajet --kill="python|ray|vllm" -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` ??? tip "Quick Debugging (Optional)" @@ -43,10 +43,10 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ```bash # (optional) recommended cleanup before debug - # astuner --kill="python|ray" + # ajet --kill="python|ray" clear && \ - astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview + ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode launch config: @@ -59,7 +59,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -103,7 +103,7 @@ Compare `final_answer` with reference, compute `raw_reward` and `is_success`.`) - Behavior penalty (tool called but no `print`) - Keep answer correctness as the primary signal @@ -215,7 +215,7 @@ Before training, the agent may solve many problems but often fails at **tool-cal !!! note "Token-level Visualization" The colored blocks show token-level sequence visualization from [Beast-Logger](./beast_logger.md): - + - **Yellow tokens**: Excluded from loss computation - **Blue tokens**: Participate in loss computation (light to dark = high to low logprob) diff --git a/docs/en/example_tracing_feedback_loop.md b/docs/en/example_tracing_feedback_loop.md index 90c2cd29..73346703 100644 --- a/docs/en/example_tracing_feedback_loop.md +++ b/docs/en/example_tracing_feedback_loop.md @@ -37,12 +37,12 @@ We have prepared a demo agent in `tutorials/example_feedback_tracing/agent_deplo Once we have the log (`database.sqlite`), we can train a new Agent with Tracing-Feedback Training. -1. Set the `astuner.task_reader.type` parameter to `tracing` in the configuration file to enable tracing-feedback mode. -2. Configure the `astuner.task_reader.feedback_tracing` section with the database path and filtering options. +1. Set the `ajet.task_reader.type` parameter to `tracing` in the configuration file to enable tracing-feedback mode. +2. Configure the `ajet.task_reader.feedback_tracing` section with the database path and filtering options. 3. Configure other training parameters and Rewards as you would in a normal training workflow. ```yaml -astuner: +ajet: # ... task_reader: # use tracing log as tasks @@ -76,7 +76,7 @@ When everything is ready, start the training with `launcher.py`. ```bash # this launch the demo -astuner --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray ``` After training, we can now deploy the new Agent into production and collect new logs. This workflow enables continuous improvement through iterative tracing-feedback training. @@ -90,7 +90,7 @@ The module provides Filter to select high-quality samples from logs for training To write rubrics, edit the configuration file: ```yaml -astuner: +ajet: # ... task_reader: # ... diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index 878e95b6..5432a5d2 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -25,8 +25,8 @@ Scenario Overview Start training with the following command: ``` -# ( astuner --kill="python|ray|vllm" ) -astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray +# ( ajet --kill="python|ray|vllm" ) +ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray ```
    @@ -36,10 +36,10 @@ If you want to breakpoint-debug the workflow/judge locally: ```bash # (optional) recommended cleanup before debug -# astuner --kill="python|ray" +# ajet --kill="python|ray" clear && \ -astuner --conf tutorial/example_werewolves/math_agent.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_werewolves/math_agent.yaml --backbone='debug' --with-logview ``` When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.json` like below: @@ -52,7 +52,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -80,7 +80,7 @@ At a high level, each training iteration follows this flow: This section corresponds to `tutorial/example_werewolves/werewolves.yaml`. The key configuration items are as follows: ```yaml -astuner: +ajet: task_reader: # random seed to shuffle players type: random_dummy @@ -119,7 +119,7 @@ Then it uses a **turn-level sparse win/loss reward**: Exception / invalid-behavior penalty: - If an exception is thrown during the game (e.g., the game cannot proceed), all trainable targets are penalized uniformly: `raw_reward = -0.1` and `is_success = False`. -If you need a more fine-grained evaluation (e.g., giving partial credit for key intermediate decisions instead of only win/loss), implement a custom Judge and enable it via `astuner.task_judge.judge_protocol`. +If you need a more fine-grained evaluation (e.g., giving partial credit for key intermediate decisions instead of only win/loss), implement a custom Judge and enable it via `ajet.task_judge.judge_protocol`. ## 4. Results diff --git a/docs/en/installation.md b/docs/en/installation.md index 40948b89..0474c828 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -33,7 +33,7 @@ AgentScope-Tuner supports multiple backbones. Currently we have `verl` and `trin !!! info "Package Manager" We recommend using `uv` to manage your Python environment as it is incredibly fast. See also [`uv` installation document](https://docs.astral.sh/uv/getting-started/installation/). - + If you prefer `conda`, you can also install via conda and pip (simply change `uv pip` to `pip`). === "Trinity (Recommended)" @@ -98,8 +98,8 @@ docker run -it \ After installation, verify that everything is working correctly: ```python -import agentscope_tuner -print(agentscope_tuner.__version__) +import ajet +print(ajet.__version__) ``` --- @@ -108,7 +108,7 @@ print(agentscope_tuner.__version__) ??? note "Common Issues" **Issue**: `flash-attn` installation fails - + **Solution**: Make sure you have CUDA toolkit installed and `MAX_JOBS` environment variable set: ```bash export MAX_JOBS=4 @@ -117,7 +117,7 @@ print(agentscope_tuner.__version__) ??? note "GPU Not Detected" **Issue**: Docker container doesn't see GPU - + **Solution**: Ensure nvidia-docker is properly installed: ```bash nvidia-smi # Should show GPU info diff --git a/docs/en/intro.md b/docs/en/intro.md index be16b2c4..23197af1 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -60,7 +60,7 @@ We recommend using `uv` for dependency management. You can start training your first agent with a single command using a pre-configured YAML file: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` !!! example "Learn More" diff --git a/docs/en/introduction.md b/docs/en/introduction.md index a3d73f38..d0972335 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -51,7 +51,7 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](./example_math_agent.md) as an example: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` #### Example Library diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index 7b4117a4..c8fc4b47 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -3,7 +3,7 @@ AgentScope Tuner provides a complete feature set for tuning agents. You can try starting training an agent right away: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` --- @@ -33,7 +33,7 @@ Use the `AstunerJob` API to configure and start training. ### Code Example ```python title="train_math_agent.py" -from agentscope_tuner import AstunerJob +from ajet import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "YOUR_MODEL_PATH" @@ -54,7 +54,7 @@ tuned_model = job.tune() !!! tip "CLI Alternative" The code above is equivalent to running in terminal: ```bash - astuner --conf ./saved_experiments/math.yaml + ajet --conf ./saved_experiments/math.yaml ``` --- diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index 6d3ab99e..346cf724 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -23,8 +23,8 @@ A Task Judger evaluates the agent's execution results and returns two values: All Task Judgers inherit from `BaseJudge` and implement the `compute_reward` method: ```python title="base_judge.py" -from agentscope_tuner.task_judge.base_judge import BaseJudge -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.task_judge.base_judge import BaseJudge +from ajet.workflow import WorkflowOutput, WorkflowTask class BaseJudge: def __init__(self, config): @@ -64,7 +64,7 @@ Evaluates mathematical answers by exact string matching, designed for tasks wher === "Configuration" ```yaml title="config.yaml" - astuner: + ajet: task_judge: judge_type: customized_protocol judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge @@ -97,7 +97,7 @@ Evaluates mathematical equations with partial credit for proper formatting. === "Configuration" ```yaml title="config.yaml" - astuner: + ajet: task_judge: judge_type: customized_protocol judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge @@ -123,10 +123,10 @@ Delegates evaluation to an external environment service, useful for complex inte - Interactive environments with built-in evaluators ```yaml title="config.yaml" -astuner: +ajet: task_judge: judge_type: customized_protocol - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge ``` !!! note "How it works" @@ -162,8 +162,8 @@ Populate `workflow_output.metadata` with the data your judger needs. ### Step 1: Implement Your Judger ```python title="tutorial/my_task/my_judge.py" -from agentscope_tuner.task_judge.base_judge import BaseJudge -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.task_judge.base_judge import BaseJudge +from ajet.workflow import WorkflowOutput, WorkflowTask class MyCustomJudge(BaseJudge): def __init__(self, config): @@ -191,7 +191,7 @@ class MyCustomJudge(BaseJudge): ### Step 2: Configure Your Judger ```yaml title="config.yaml" -astuner: +ajet: task_judge: judge_type: customized_protocol judge_protocol: tutorial.my_task.my_judge->MyCustomJudge @@ -216,10 +216,10 @@ class MyWorkflow(Workflow): ## Configuration Summary ```yaml title="config.yaml" -astuner: +ajet: task_judge: judge_type: customized_protocol - judge_protocol: agentscope_tuner.task_judge.-> + judge_protocol: ajet.task_judge.-> ``` --- diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 597b7e17..9976a1da 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -31,7 +31,7 @@ Launch the training process and track progress. !!! success "What You'll Learn" After completing this guide, you will: - + - Obtain a Math Agent that can solve math problems using Python - Understand the core concepts in AgentScope Tuner - Learn how to design your own training pipeline @@ -64,15 +64,15 @@ After running the commands above, the directory should contain: Give the project a name in the config file: ```yaml title="math_agent.yaml" -astuner: +ajet: project_name: math_agent # ------------------ No need to modify ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ No need to modify ------------------ defaults: @@ -90,7 +90,7 @@ The agent needs to be trained in a specific task environment, driven by training !!! info "Data Sources" ASTuner provides multiple ways to read data: - + - Read from local files on disk - Read from a Hugging Face repo - Read from an EnvService @@ -100,7 +100,7 @@ All data will be converted into a unified ASTuner data format after loading. In this example, we will use the `openai/gsm8k` dataset from Hugging Face: ```yaml title="math_agent.yaml" -astuner: +ajet: project_name: math_agent task_reader: type: huggingface_dat_repo @@ -166,7 +166,7 @@ ReActAgent( !!! note "Agent Features" This agent: - + - Uses the ReAct paradigm to interact with tools - Has a custom system prompt - Registers `execute_python_code` as a tool @@ -177,7 +177,7 @@ ReActAgent( Next, wrap the agent into a trainable workflow: ```python title="workflow.py" -from agentscope_tuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from ajet import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from loguru import logger @@ -249,7 +249,7 @@ class MathAgentWorkflow(Workflow): Add the workflow configuration to `math_agent.yaml`: ```yaml title="math_agent.yaml" -astuner: +ajet: # ... rollout: agentscope_workflow: workflow.py->MathAgentWorkflow @@ -268,7 +268,7 @@ The judge reads `final_answer` from `metadata` and compares it with ground-truth Specify the LLM to train: ```yaml title="math_agent.yaml" -astuner: +ajet: model: path: Qwen/Qwen2.5-14B-Instruct ``` @@ -282,7 +282,7 @@ Configure important training hyperparameters: ??? example "Full Configuration Example" ```yaml title="math_agent.yaml" - astuner: + ajet: # ... rollout: agentscope_workflow: workflow.py->MathAgentWorkflow @@ -326,12 +326,12 @@ Configure important training hyperparameters: Before full training, test in debug mode: ```bash -astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview +ajet --conf math_agent/math_agent.yaml --backbone='debug' --with-logview ``` !!! tip "VS Code Debugging" You can configure `.vscode/launch.json` for breakpoint debugging: - + ```json { "version": "0.2.0", @@ -340,7 +340,7 @@ astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -359,7 +359,7 @@ astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview After debugging, launch the full training: ```bash -astuner --conf math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` !!! success "Output Location" diff --git a/docs/en/visualization.md b/docs/en/visualization.md index 14057113..71e8ac5f 100644 --- a/docs/en/visualization.md +++ b/docs/en/visualization.md @@ -21,7 +21,7 @@ Monitoring training progress through visualized metrics is essential for underst Simply set the logger backend to `swanlab` in your YAML configuration: ```yaml title="config.yaml" -astuner: +ajet: trainer_common: logger: swanlab ``` @@ -31,14 +31,14 @@ astuner: Launch your training as usual: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` ### Step 3: View Training Curves !!! success "Automatic Tracking" Once training starts, SwanLab will automatically: - + 1. Track key metrics (reward, success rate, loss, etc.) 2. Generate real-time training curves 3. Provide a web dashboard for visualization @@ -91,7 +91,7 @@ Compare different hyperparameter settings by running multiple experiments and co Balance between logging detail and training overhead: ```yaml title="config.yaml" -astuner: +ajet: trainer_common: log_freq: 1 # Log every N steps ``` @@ -101,7 +101,7 @@ astuner: Configure checkpoint saving to preserve models at peak performance: ```yaml title="config.yaml" -astuner: +ajet: trainer_common: save_freq: 100 # Save every 100 steps ``` diff --git a/docs/en/workflow.md b/docs/en/workflow.md index ec2599ca..10773ab0 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -4,7 +4,7 @@ This tutorial introduces how to define a trainable workflow with AgentScope. !!! info "Two Approaches" ASTuner provides two convenient and **mutually compatible** ways to wrap an AgentScope Workflow: - + - **Simple**: Emphasizes simplicity, ease of use, and readability - **Advanced**: Emphasizes flexibility, controllability, and extensibility @@ -41,7 +41,7 @@ Simply set ReActAgent's `model` argument to `model_tuner` when initializing your Then, wrap your workflow in a class that inherits `Workflow`: ```python -from agentscope_tuner import Workflow, WorkflowTask, WorkflowOutput, ModelTuner +from ajet import Workflow, WorkflowTask, WorkflowOutput, ModelTuner class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" @@ -121,7 +121,7 @@ When designing a **multi-agent collaborative** workflow where each agent plays a !!! success "Multi-Agent Benefits" With a multi-agent setup, you can: - + - **Precisely control** which agents are fine-tuned - Explicitly define the default model for agents **not being trained** - Switch trainable targets on the fly **without modifying** source code @@ -221,16 +221,16 @@ for i, role in enumerate(roles): # Define different default models for different roles default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) - + chosen_model = ( - default_model_for_good_guys - if role != "werewolf" + default_model_for_good_guys + if role != "werewolf" else default_model_for_bad_guys ) - + # Register role with its default model model_tuner.register_model(role, default_model=chosen_model) - + # Create agent bound to the role players += [ReActAgent( name=f"Player{i + 1}", @@ -242,7 +242,7 @@ for i, role in enumerate(roles): !!! tip "Configuration Flexibility" In this example: - + - `role` describes an agent's in-game identity (werewolf, villager, etc.) - `chosen_model` defines the default model when the role is not being trained - You can flexibly switch training targets by modifying `trainable_targets` diff --git a/docs/index.md b/docs/index.md index a4980d1a..885fc11f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -43,7 +43,7 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir You can start training your first agent with a single command using a pre-configured YAML file: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` --- diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md index 6809a4d2..e99a2ebe 100644 --- a/docs/zh/configuration.md +++ b/docs/zh/configuration.md @@ -9,9 +9,9 @@ AgentScope Tuner 使用 YAML 格式的配置文件来设置数据、训练算法、奖励、日志以及其他运行时行为。 !!! info "默认配置文件" - 默认配置文件位于 `astuner/default_config/astune_default.yaml`。 + 默认配置文件位于 `ajet/default_config/astune_default.yaml`。 -一个典型的配置文件包含一个根节点 `astuner`,进一步被划分为若干部分: +一个典型的配置文件包含一个根节点 `ajet`,进一步被划分为若干部分: | 类别 | 配置项 | 说明 | |------|--------|------| @@ -31,7 +31,7 @@ AgentScope Tuner 使用 YAML 格式的配置文件来设置数据、训练算法 要训练一个智能体,首先需要指定待训练的模型: ```yaml title="model 配置" -astuner: +ajet: model: path: path/to/model ``` @@ -39,9 +39,9 @@ astuner: === "本地文件" 指向包含 Transformers 格式模型的本地目录: - + ```yaml - astuner: + ajet: model: path: /mnt/data/models/Qwen2.5-14B-Instruct ``` @@ -49,16 +49,16 @@ astuner: === "HuggingFace 仓库" 指向 HuggingFace 仓库,模型会自动下载并加载: - + ```yaml - astuner: + ajet: model: path: Qwen/Qwen2.5-14B-Instruct ``` !!! warning "LLM-as-a-Judge 环境变量" 如果在训练中使用 LLM-as-a-Judge,需要配置必要的环境变量: - + ```bash export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' @@ -77,9 +77,9 @@ astuner: === "EnvService" 从 EnvService 中读取数据: - + ```yaml - astuner: + ajet: task_reader: type: env_service env_service: @@ -93,9 +93,9 @@ astuner: === "JSONL 文件" 从本地 JSONL 文件读取: - + ```yaml - astuner: + ajet: task_reader: type: jsonl_dataset_file jsonl_dataset_file: @@ -108,9 +108,9 @@ astuner: === "HuggingFace" 从 HuggingFace 仓库读取: - + ```yaml - astuner: + ajet: task_reader: type: huggingface_dat_repo huggingface_dat_repo: @@ -122,9 +122,9 @@ astuner: === "数据生成" 从文档自动生成任务: - + ```yaml - astuner: + ajet: task_reader: type: data_generation data_generation: @@ -147,10 +147,10 @@ astuner: `task_judge` 用于评估智能体的表现并计算奖励: ```yaml title="task_judge 配置" -astuner: +ajet: task_judge: judge_type: customized_protocol # 或 'rubrics_auto_grader' - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 ``` @@ -176,7 +176,7 @@ AgentScope Tuner 支持三种训练后端: | **debug** | 允许用户设置断点并调试代码 | ```yaml -astuner: +ajet: backbone: trinity # debug 或 trinity 或 verl ``` @@ -185,7 +185,7 @@ astuner: `rollout` 配置控制智能体在与环境进行交互采样过程中的行为: ```yaml title="rollout 配置" -astuner: +ajet: rollout: agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow max_env_worker: 128 @@ -208,7 +208,7 @@ astuner: `trainer_common` 包含训练流程控制的通用参数: ```yaml title="trainer_common 配置" -astuner: +ajet: trainer_common: total_epochs: 50 save_freq: 20 @@ -241,7 +241,7 @@ astuner: 优化算法及其超参数主要在 `algorithm`、`optim` 中设置: ```yaml title="优化算法配置" -astuner: +ajet: trainer_common: algorithm: adv_estimator: grpo @@ -265,7 +265,7 @@ astuner: 当 `backbone` 设置为 `debug` 时使用的配置: ```yaml title="debug 配置" -astuner: +ajet: debug: debug_max_parallel: 16 debug_first_n_tasks: 2 @@ -293,7 +293,7 @@ AgentScope Tuner 支持多种日志后端: | `swanlab` | 使用 SwanLab 进行日志记录 | ```yaml -astuner: +ajet: trainer_common: logger: swanlab ``` @@ -314,20 +314,20 @@ astuner: ??? example "完整配置文件" ```yaml - astuner: + ajet: project_name: "astuner_default_project" experiment_name: "read_yaml_name" experiment_dir: "auto" backbone: debug - + model: path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct - + data: max_prompt_length: 3000 max_response_length: 15000 train_batch_size: 32 - + rollout: agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: False @@ -356,7 +356,7 @@ astuner: top_p: 1.0 do_sample: False num_repeat: 1 - + task_reader: type: env_service jsonl_dataset_file: @@ -374,20 +374,20 @@ astuner: dataset_path: "gsm8k" training_split: "train" validation_split: "validation" - + task_judge: judge_type: customized_protocol - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - + debug: debug_max_parallel: 16 debug_first_n_tasks: 2 debug_vllm_port: 18000 debug_vllm_seed: 12345 debug_tensor_parallel_size: 4 - + trainer_common: val_before_train: False val_pass_n: 4 @@ -411,7 +411,7 @@ astuner: kl_loss_type: low_var_kl ulysses_sequence_parallel_size: 1 checkpoint_base_dir: ./saved_checkpoints - + context_tracker: context_tracker_type: "linear" alien_llm_model: qwen3-235b-a22b-instruct-2507 diff --git a/docs/zh/data_generation.md b/docs/zh/data_generation.md index b59ee2e2..dcb23130 100644 --- a/docs/zh/data_generation.md +++ b/docs/zh/data_generation.md @@ -20,9 +20,9 @@ === "输入:文档内容" ```plain - According to the Anti-Money Laundering and Counter-Terrorist - Financing Ordinance and related Guideline, banks are required - to identify and take reasonable measures to verify the identity + According to the Anti-Money Laundering and Counter-Terrorist + Financing Ordinance and related Guideline, banks are required + to identify and take reasonable measures to verify the identity of the beneficial owner of corporate customers so that the bank is ... ``` @@ -94,10 +94,10 @@ cp your-document.pdf dataset/document/ === "方式 1:接入训练流程" - 修改配置文件,将 `astuner.task_reader.type` 设置为 `data_generation`: + 修改配置文件,将 `ajet.task_reader.type` 设置为 `data_generation`: ```yaml title="config.yaml" - astuner: + ajet: task_reader: type: data_generation data_generation: @@ -136,8 +136,8 @@ cp your-document.pdf dataset/document/ === "方式 2:单独运行脚本" ```python title="generate_data.py" - from agentscope_tuner.data_generator.config import * - from agentscope_tuner.task_reader.data_generator_reader import DataGeneratorTaskReader + from ajet.data_generator.config import * + from ajet.task_reader.data_generator_reader import DataGeneratorTaskReader def run(): config = TaskReaderConfig( diff --git a/docs/zh/data_pipeline.md b/docs/zh/data_pipeline.md index 31cc8b6b..e6c09744 100644 --- a/docs/zh/data_pipeline.md +++ b/docs/zh/data_pipeline.md @@ -11,7 +11,7 @@ AgentScope Tuner 通过 Task Reader 从多种数据源加载训练任务。本 !!! info "Task Reader 核心特性" - **统一 Schema**:无论数据源是什么,所有任务都统一映射为 `Task` 结构 - **多种来源**:支持从本地文件、HuggingFace 数据集、交互式环境加载,或自动生成新任务 - - **自动路由**:框架会根据配置中的 `astuner.task_reader.type` 自动选择合适的 reader + - **自动路由**:框架会根据配置中的 `ajet.task_reader.type` 自动选择合适的 reader ``` Data Source → Task Reader → Unified Task Schema → Training Pipeline @@ -71,7 +71,7 @@ class Task(BaseModel): ## 内置 Task Readers -AgentScope Tuner 提供了 6 个内置 Task Reader,覆盖不同场景。框架会根据配置中的 `astuner.task_reader.type` 自动路由到正确的 reader。 +AgentScope Tuner 提供了 6 个内置 Task Reader,覆盖不同场景。框架会根据配置中的 `ajet.task_reader.type` 自动路由到正确的 reader。 ### 快速选择指南 @@ -89,7 +89,7 @@ AgentScope Tuner 提供了 6 个内置 Task Reader,覆盖不同场景。框架 **适用场景:** 您在本地以 JSONL 格式准备了训练任务。 ```yaml title="配置方式" -astuner: +ajet: task_reader: type: jsonl_dataset_file jsonl_dataset_file: @@ -118,7 +118,7 @@ astuner: **适用场景:** 从 HuggingFace Hub 的数据集中加载任务(例如 GSM8K、MATH)。 ```yaml title="配置方式" -astuner: +ajet: task_reader: type: huggingface_dat_repo huggingface_dat_repo: @@ -142,7 +142,7 @@ astuner: **适用场景:** 任务由交互式环境服务提供(例如 AppWorld、RL gym 环境)。 ```yaml title="配置方式" -astuner: +ajet: task_reader: type: env_service env_service: diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 477e8f07..966d41d3 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -40,7 +40,7 @@ tar -xzf ./appworld_pack_v2.tar.gz -C "${base_path}" !!! warning "环境变量设置" 每次开启新的 shell 窗口都需要运行以下环境变量设置: - + ```bash export BASE_PATH=/tmp export APPWORLD_PATH="${BASE_PATH}/pack_all_in_one" @@ -52,14 +52,14 @@ tar -xzf ./appworld_pack_v2.tar.gz -C "${base_path}" 运行训练脚本: ```bash -astuner --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray ``` ??? tip "快速调试(可选)" 不启用 Ray 在本地运行,便于更快迭代: ```bash - astuner --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview + ajet --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与您的代码位置一致。 @@ -84,7 +84,7 @@ agent = ReActAgent( ) env = workflow_task.gym_env -for step in range(model_tuner.config.astuner.rollout.multi_turn.max_steps): +for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): # agentscope 处理交互消息 reply_message = await agent(interaction_message) # env_service 协议 @@ -107,7 +107,7 @@ for step in range(model_tuner.config.astuner.rollout.multi_turn.max_steps): ### 奖励机制 -在 `astuner/task_judge/env_service_as_judge.py` 中,通过 `env.evaluate(...)` 从环境中读取奖励信号。 +在 `ajet/task_judge/env_service_as_judge.py` 中,通过 `env.evaluate(...)` 从环境中读取奖励信号。 !!! tip "自定义 Judge" 您可以参考该文件,为自己的任务实现专用的 Judge 模块。 @@ -117,12 +117,12 @@ for step in range(model_tuner.config.astuner.rollout.multi_turn.max_steps): `tutorial/example_appworld/appworld.yaml` 中的关键配置参数: ```yaml title="appworld.yaml" -astuner: +ajet: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # [关键] 编写并选择评估函数 - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge model: # [关键] 设置需要训练的模型 path: YOUR_MODEL_PATH @@ -165,29 +165,29 @@ astuner: === "调优前" **问题 1:频繁调用不存在的 API** - + ![调优前 - 幻觉 API](https://img.alicdn.com/imgextra/i1/O1CN015FgjqI20Ip3AJybr0_!!6000000006827-2-tps-1259-683.png) - + 智能体在不检查 API 是否存在的情况下产生幻觉,导致重复失败。 - + **问题 2:没有学会按照说明获取 access token** - + ![调优前 - Token 问题](https://img.alicdn.com/imgextra/i1/O1CN01bGZ1s01VyjCSrTJte_!!6000000002722-2-tps-1181-954.png) - + 智能体在未先获取所需的访问令牌的情况下尝试调用受保护的 API,导致认证错误。 === "调优后" **改进 1:会先查阅 API 文档,使用有效的 API** - + ![调优后 - 正确的 API](https://img.alicdn.com/imgextra/i4/O1CN01VRIDy922PoKD1bETl_!!6000000007113-2-tps-1180-944.png) - + 智能体现在会先检查可用的 API 再发起调用,从而避免臆造不存在的接口端点。 - + **改进 2:学会正确获取 access token** - + ![调优后 - Token 正确](https://img.alicdn.com/imgextra/i2/O1CN01xiF9UU20h62dyrZ4x_!!6000000006880-2-tps-1182-793.png) - + 智能体在访问受保护的 API 之前,会先正确完成认证步骤。 !!! note "Token 级可视化" diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index c9ebe221..976b55a1 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -13,7 +13,7 @@ Countdown 任务是一个数学益智游戏:给定一组数字和一个目标 python tutorial/example_countdown/prepare_data.py --target=Jiayi-Pan/Countdown-Tasks-3to4 --path=/the/path/to/store/dataset ``` -Countdown 数据集包含 `target` 和 `nums` 两个字段,需要自定义数据格式化逻辑。例如:使用 `huggingface_dat_repo` 的读取方式时,需要修改 `astuner/task_reader/hf_dataset_reader.py` 中的 `_load_dataset_split` 方法: +Countdown 数据集包含 `target` 和 `nums` 两个字段,需要自定义数据格式化逻辑。例如:使用 `huggingface_dat_repo` 的读取方式时,需要修改 `ajet/task_reader/hf_dataset_reader.py` 中的 `_load_dataset_split` 方法: ```python task = Task( @@ -31,7 +31,7 @@ task = Task( ```bash # 建议在启动前先杀掉所有 ray、vllm 和 env_service 相关进程( python launcher.py --kill="python|ray|vllm" ) -astuner --conf tutorial/example_countdown/countdown.yaml --backbone='verl' +ajet --conf tutorial/example_countdown/countdown.yaml --backbone='verl' ```
    @@ -40,7 +40,7 @@ astuner --conf tutorial/example_countdown/countdown.yaml --backbone='verl' 不启用 Ray 在本地运行,便于更快迭代: ```bash -astuner --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 @@ -85,17 +85,17 @@ WorkflowOutput( ### 3.2 配置说明 拷贝并修改 `tutorial/example_countdown/countdown.yaml` 中的关键配置参数。yaml 中与本示例最相关的部分已经用 标出。 -1. 读取任务(对应配置字段 `astuner.task_reader`) -2. 定义 Workflow(对应配置字段 `astuner.rollout.agentscope_workflow`) +1. 读取任务(对应配置字段 `ajet.task_reader`) +2. 定义 Workflow(对应配置字段 `ajet.rollout.agentscope_workflow`) - 示例:如果 AgentScope Workflow 定义在 `tutorial/example_countdown/countdown.py` 的 `ExampleCountdownLearn` 类中 - - 则配置 `astuner.rollout.agentscope_workflow` = `tutorial.example_countdown.countdown->ExampleCountdownLearn` -3. 定义评分函数(对应配置字段 `astuner.task_judge.judge_protocol`) + - 则配置 `ajet.rollout.agentscope_workflow` = `tutorial.example_countdown.countdown->ExampleCountdownLearn` +3. 定义评分函数(对应配置字段 `ajet.task_judge.judge_protocol`) - 示例:如果评分逻辑定义在 `tutorial/example_countdown/countdown_answer_as_judge.py` 的 `CountdownAnswerAsJudge` 类中 - 则配置 `tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge` -4. 指定模型(对应配置字段 `astuner.model.path`) +4. 指定模型(对应配置字段 `ajet.model.path`) ```yaml -astuner: +ajet: task_reader: type: huggingface_dat_repo # [关键] `env_service` 或 `dataset_file` 或 `huggingface_dat_repo` 或 `data_generation` rollout: diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md index 050e1549..7c523901 100644 --- a/docs/zh/example_frozenlake.md +++ b/docs/zh/example_frozenlake.md @@ -23,13 +23,13 @@ pip install gymnasium[toy_text] 使用提供的配置文件快速开始训练: ```bash -astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='trinity' --with-ray ``` 尝试更困难的设置: ```bash -astuner --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone='trinity' --with-ray ```
    @@ -38,7 +38,7 @@ astuner --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone='trin 不启用 Ray 在本地运行,便于更快迭代: ```bash -astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 @@ -60,8 +60,8 @@ astuner --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debu `tutorial/example_frozenlake/frozenlake_easy.yaml` / `frozenlake_hard.yaml` 中与本任务相关的关键字段包括: -- `astuner.rollout.agentscope_workflow`: Workflow 入口,示例中为 `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`。 -- `astuner.rollout.multi_turn.max_steps`:单次 episode 的最大步数(智能体与环境均使用)。 +- `ajet.rollout.agentscope_workflow`: Workflow 入口,示例中为 `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`。 +- `ajet.rollout.multi_turn.max_steps`:单次 episode 的最大步数(智能体与环境均使用)。 - `frozen_lake.frozen_lake_size`:地图大小(easy 为 4,hard 为 6)。 - `frozen_lake.is_slippery`:是否启用打滑。 diff --git a/docs/zh/example_learning_to_ask.md b/docs/zh/example_learning_to_ask.md index c1d59246..5937fd7d 100644 --- a/docs/zh/example_learning_to_ask.md +++ b/docs/zh/example_learning_to_ask.md @@ -38,7 +38,7 @@ cd tutorial/example_learn2ask/data_preprocess #### 2.2 启动训练 ```bash -astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray ```
    @@ -47,7 +47,7 @@ astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' -- 不启用 Ray 在本地运行,便于更快迭代: ```bash -astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 @@ -58,7 +58,7 @@ astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --wi ### 3. 理解实现 -#### 3.1 每个训练 step +#### 3.1 每个训练 step 本教程训练的目标是:基于一段简短的医生–患者对话历史,让模型学会**提出下一个最合适的问题**。具体来说,每个训练 step 会从 `train.jsonl` 中取出一条对话上下文,让智能体生成**恰好一个**追问(可选地带有答案选项),随后使用一个 LLM judge 来评估这个问题是否**有用**且**相关**。ASTuner 将该评分作为奖励信号更新策略,于是模型会逐渐学会提出更好的问题,而不是直接给出回答。 @@ -67,7 +67,7 @@ astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --wi 整个例子主要通过 YAML 完成配置信息,实现代码则集中在一个文件里。在 YAML 中,`task_reader` 提供数据集划分;`rollout.agentscope_workflow` 告诉 ASTuner 对每条样本需要运行哪个 workflow;`task_judge` 提供封装了 LLM judge 的奖励入口;`model` 部分决定训练从哪个预训练 backbone 开始。 ```yaml -astune: +ajet: task_reader: type: dataset_file # train_path: data/realmedconv/train.jsonl @@ -102,15 +102,15 @@ astune: - **只评估医生的最后一句话**(doctor’s last message),不看更早的医生回复。 - 输出两个分数:**Format Score** + **Content Score**(分别打分,后续由 `reward_fn` 组合成训练用 reward)。 -**Format Score(格式分)**:根据“最后一句话里问题的数量”计分 +**Format Score(格式分)**:根据“最后一句话里问题的数量”计分 - 1.0:恰好 **1 个问题**,或者在判断对话结束时正确输出了 `` -- 0.5:包含 **2 个问题** +- 0.5:包含 **2 个问题** - 0.0:包含 **3 个及以上问题** -**Content Score(内容分)**:根据问题是否命中 `Reference Information` 中“医生尚未知晓的缺失信息”计分 +**Content Score(内容分)**:根据问题是否命中 `Reference Information` 中“医生尚未知晓的缺失信息”计分 - 1.0:问题**直接询问** `Reference Information` 里的某个缺失项,或者在信息足够时及时结束对话 -- 0.1:问题过于泛化(对任何症状都适用的通用问题) -- 0.0:问题与 `Reference Information` 的缺失项**无关** +- 0.1:问题过于泛化(对任何症状都适用的通用问题) +- 0.0:问题与 `Reference Information` 的缺失项**无关** - 另外:**含糊/无信息量的问题按低质量处理**(例如指代不明的提问),通常会得到 0 或接近 0 的得分 --- diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index f179cf6c..cc0d10ce 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -33,9 +33,9 @@ python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/sto ```bash # (可选)训练前建议清理残留进程 -# astuner --kill="python|ray|vllm" +# ajet --kill="python|ray|vllm" -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` ??? tip "快速调试(可选)" @@ -43,10 +43,10 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ```bash # (可选)调试前建议清理残留进程 - # astuner --kill="python|ray" + # ajet --kill="python|ray" clear && \ - astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview + ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview ``` 当 `--backbone=debug` 时,Ray 会被禁用。您可以使用类似下面的 VSCode 配置: @@ -59,7 +59,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -103,7 +103,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 大部分"连线"都在 `tutorial/example_math_agent/math_agent.yaml` 中完成: ```yaml title="math_agent.yaml" -astuner: +ajet: task_reader: type: huggingface_dat_repo # 也支持: dataset_file / env_service @@ -163,7 +163,7 @@ return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) !!! tip "扩展 Judge" 如果您观察到模型"几乎做对了,但搞错了工具调用格式",可以扩展评审器来: - + - 增加格式惩罚(无效的 ``) - 增加行为惩罚(调用了工具但没 `print`) - 同时保持"答案正确性"作为主要信号 @@ -215,7 +215,7 @@ return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) !!! note "Token 级可视化" 图中彩色块是 [Beast-Logger](./beast_logger.md) 生成的 token 级别序列可视化: - + - **黄色 token**:排除在损失函数(loss)计算之外的 token - **蓝色 token**:参与损失计算的 token(从浅蓝到深蓝表示 logprob 从高到低) diff --git a/docs/zh/example_tracing_feedback_loop.md b/docs/zh/example_tracing_feedback_loop.md index c3aca240..3c731410 100644 --- a/docs/zh/example_tracing_feedback_loop.md +++ b/docs/zh/example_tracing_feedback_loop.md @@ -36,12 +36,12 @@ ASTune 允许你回收 智能体 在执行过程中产生的对话日志,并 当我们拿到日志文件(`database.sqlite`)后,就可以基于数据回流训练出一个新的 Agent。 -1. 在配置文件中将参数 `astuner.task_reader.type` 设置为 `tracing`,以开启数据回流模式; -2. 在 `astuner.task_reader.feedback_tracing` 字段中配置数据库路径和过滤相关选项; +1. 在配置文件中将参数 `ajet.task_reader.type` 设置为 `tracing`,以开启数据回流模式; +2. 在 `ajet.task_reader.feedback_tracing` 字段中配置数据库路径和过滤相关选项; 3. 像普通训练流程一样配置其他训练参数以及 Reward(奖励信号)。 ```yaml -astuner: +ajet: # ... task_reader: # 使用 tracing 日志作为任务来源 @@ -75,7 +75,7 @@ astuner: ```bash # 启动示例训练 -astuner --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray ``` 训练完成后,你可以将新的 智能体 部署回生产环境,并继续收集新的日志。通过这样的闭环,你可以持续进行迭代的数据回流训练,不断提升 智能体 的效果。 @@ -89,7 +89,7 @@ astuner --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml - 要编写规则,只需要修改配置文件中对应的字段: ```yaml -astuner: +ajet: # ... task_reader: # ... diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index 01527879..39de842e 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -39,15 +39,15 @@ 正式训练(启用 Ray): ```bash -# ( astuner --kill="python|ray|vllm" ) -astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray +# ( ajet --kill="python|ray|vllm" ) +ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray ``` ??? tip "快速调试(可选)" 不启用 Ray 在本地运行,便于更快迭代: ```bash - astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview + ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview ``` 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与您的代码位置一致。 @@ -87,7 +87,7 @@ astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' 关键配置在 `tutorial/example_werewolves/werewolves.yaml`: ```yaml title="werewolves.yaml" -astuner: +ajet: task_reader: type: random_dummy # random seed to shuffle players task_judge: @@ -115,7 +115,7 @@ astuner: !!! note "奖励计算规则" 采用**回合级别的稀疏胜负奖励**: - + | 条件 | 奖励 | 状态 | |------|------|------| | 好人阵营获胜 且 训练好人角色 | `raw_reward = 1` | `is_success = True` | @@ -124,7 +124,7 @@ astuner: | 游戏抛出异常 | `raw_reward = -0.1` | `is_success = False` | !!! tip "自定义 Judge" - 如果您希望更细粒度的评估(例如对关键决策给部分分),可以实现自定义 Judge,并在 `astuner.task_judge.judge_protocol` 中启用。 + 如果您希望更细粒度的评估(例如对关键决策给部分分),可以实现自定义 Judge,并在 `ajet.task_judge.judge_protocol` 中启用。 --- diff --git a/docs/zh/installation.md b/docs/zh/installation.md index f0bd85ee..eb98fd65 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -33,7 +33,7 @@ AgentScope-Tuner 支持多种训练后端(backbone),目前包括 `verl` !!! info "包管理器" 我们推荐使用 `uv` 来管理 Python 环境,因为它速度非常快。参考 [`uv` 安装文档](https://docs.astral.sh/uv/getting-started/installation/)。 - + 如果您更希望使用 `conda`,也可以通过 conda + pip 安装(只需将 `uv pip` 替换为 `pip` 即可)。 === "Trinity(推荐)" @@ -98,8 +98,8 @@ docker run -it \ 安装完成后,验证一切是否正常工作: ```python -import agentscope_tuner -print(agentscope_tuner.__version__) +import ajet +print(ajet.__version__) ``` --- @@ -108,7 +108,7 @@ print(agentscope_tuner.__version__) ??? note "flash-attn 安装失败" **问题**:`flash-attn` 安装失败 - + **解决方案**:确保已安装 CUDA 工具包,并设置 `MAX_JOBS` 环境变量: ```bash export MAX_JOBS=4 @@ -117,7 +117,7 @@ print(agentscope_tuner.__version__) ??? note "GPU 未检测到" **问题**:Docker 容器无法识别 GPU - + **解决方案**:确保 nvidia-docker 已正确安装: ```bash nvidia-smi # 应该显示 GPU 信息 diff --git a/docs/zh/intro.md b/docs/zh/intro.md index 8f8700e7..8b97a60c 100644 --- a/docs/zh/intro.md +++ b/docs/zh/intro.md @@ -66,7 +66,7 @@ ASTuner 还提供了高分辨率的日志记录和调试方案: 您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个智能体: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` !!! example "了解更多" diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index 9d94c808..6e0e5190 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -52,7 +52,7 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir 您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 智能体。以 [数学 智能体](./example_math_agent.md) 为例: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md index 2ea4c014..769023d7 100644 --- a/docs/zh/quickstart.md +++ b/docs/zh/quickstart.md @@ -3,7 +3,7 @@ AgentScope Tuner 提供了一套完整的智能体调优功能。您可以立刻尝试启动一个智能体的训练: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` --- @@ -33,7 +33,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ### 代码示例 ```python title="train_math_agent.py" -from agentscope_tuner import AstunerJob +from ajet import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "YOUR_MODEL_PATH" @@ -54,7 +54,7 @@ tuned_model = job.tune() !!! tip "命令行替代方案" 上述代码等价于在终端执行: ```bash - astuner --conf ./saved_experiments/math.yaml + ajet --conf ./saved_experiments/math.yaml ``` --- diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md index 5f04e954..8a2876d2 100644 --- a/docs/zh/task_judger.md +++ b/docs/zh/task_judger.md @@ -23,8 +23,8 @@ Task Judger 会评估智能体的执行结果,并返回两个值: 所有 Task Judger 都继承自 `BaseJudge`,并实现 `compute_reward` 方法: ```python title="base_judge.py" -from agentscope_tuner.task_judge.base_judge import BaseJudge -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.task_judge.base_judge import BaseJudge +from ajet.workflow import WorkflowOutput, WorkflowTask class BaseJudge: def __init__(self, config): @@ -71,7 +71,7 @@ AgentScope Tuner 提供了 4 个内置评测器,用于覆盖常见的评测场 - 答案格式为 `\boxed{result}` ```yaml title="配置方式" -astuner: +ajet: task_judge: judge_type: customized_protocol judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge @@ -100,7 +100,7 @@ astuner: - 希望即使答案不对,也能奖励良好格式的场景 ```yaml title="配置方式" -astuner: +ajet: task_judge: judge_type: customized_protocol judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge @@ -126,10 +126,10 @@ astuner: - 环境自身带有 evaluator 的交互式任务 ```yaml title="配置方式" -astuner: +ajet: task_judge: judge_type: customized_protocol - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge ``` **工作原理:** @@ -151,7 +151,7 @@ astuner: - 有标注训练样本,但需要更灵活的评测标准 ```yaml title="配置方式" -astuner: +ajet: task_judge: judge_type: rubrics_auto_grader rubrics_auto_grader: @@ -213,8 +213,8 @@ astuner: ```python title="my_judge.py" import re -from agentscope_tuner.task_judge.base_judge import BaseJudge -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.task_judge.base_judge import BaseJudge +from ajet.workflow import WorkflowOutput, WorkflowTask class MyCustomJudge(BaseJudge): def __init__(self, config): @@ -228,16 +228,16 @@ class MyCustomJudge(BaseJudge): ) -> tuple: # 从 workflow_output 中读取数据 agent_answer = workflow_output.metadata.get("final_answer", "") - + # 从 workflow_task 中读取参考答案 reference_answer = workflow_task.task.metadata.get("answer", "") - + # 自定义评测逻辑 similarity = self._compute_similarity(agent_answer, reference_answer) - + # 基于阈值判断是否成功 is_success = similarity >= self.threshold - + return similarity, is_success def _compute_similarity(self, text1: str, text2: str) -> float: @@ -250,7 +250,7 @@ class MyCustomJudge(BaseJudge): ### Step 2:配置评测器 ```yaml title="config.yaml" -astuner: +ajet: task_judge: judge_type: customized_protocol judge_protocol: tutorial.my_task.my_judge->MyCustomJudge @@ -283,16 +283,16 @@ class MyWorkflow(Workflow): === "使用内置 Judger" ```yaml - astuner: + ajet: task_judge: judge_type: customized_protocol - judge_protocol: agentscope_tuner.task_judge.-> + judge_protocol: ajet.task_judge.-> ``` === "使用 Auto Grader" ```yaml - astuner: + ajet: task_judge: judge_type: rubrics_auto_grader rubrics_auto_grader: diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index db929208..5e8b8f4e 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -60,15 +60,15 @@ touch workflow.py 我们在配置文件中为项目起一个名字: ```yaml title="math_agent.yaml" -astuner: +ajet: project_name: math_agent # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: @@ -86,11 +86,11 @@ defaults: !!! info "支持的数据源" ASTuner 提供了多种读取数据的方式: - + - 从本地硬盘中的文件读取 - 从 HuggingFace Repo 中读取 - 从 EnvService 中读取 - + 所有数据在读取后,都会被转换为 ASTuner 中统一的数据格式。 在本示例中,我们将直接从 HuggingFace Repo 获取 `openai/gsm8k` 作为训练数据。 @@ -101,7 +101,7 @@ defaults: 在 `math_agent.yaml` 中添加数据配置: ```yaml title="math_agent.yaml" -astuner: +ajet: project_name: math_agent task_reader: type: huggingface_dat_repo @@ -168,12 +168,12 @@ ReActAgent( !!! note "ReActAgent 说明" 通过这段代码,我们定义了一个完整的 ReAct 智能体: - + - 使用 ReAct 范式与环境/工具交互 - 设置了 system prompt - 注册了一个工具:执行 Python 代码 - 实现了 in-memory 的记忆机制 - + 更多具体的配置可参考 AgentScope 官方文档。 ### 封装为 Workflow @@ -181,7 +181,7 @@ ReActAgent( 接下来,将智能体封装进一个 Workflow 类中: ```python title="workflow.py" -from agentscope_tuner import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from ajet import ModelTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from loguru import logger @@ -252,7 +252,7 @@ class MathAgentWorkflow(Workflow): 在 `math_agent.yaml` 中添加 workflow 和奖励配置: ```yaml title="math_agent.yaml" -astuner: +ajet: # ... rollout: agentscope_workflow: workflow.py->MathAgentWorkflow @@ -273,7 +273,7 @@ astuner: 在 `math_agent.yaml` 中指定智能体使用的 LLM,也就是我们将要训练的模型: ```yaml title="math_agent.yaml" -astuner: +ajet: model: path: Qwen/Qwen2.5-14B-Instruct ``` @@ -286,7 +286,7 @@ astuner: 添加必要的训练参数配置: ```yaml title="math_agent.yaml" -astuner: +ajet: # ... rollout: agentscope_workflow: workflow.py->MathAgentWorkflow @@ -327,7 +327,7 @@ trinity: 使用 debug 模式启动训练: ```bash -astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview +ajet --conf math_agent/math_agent.yaml --backbone='debug' --with-logview ``` !!! info "Debug 模式特点" @@ -345,7 +345,7 @@ astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "agentscope_tuner.cli.launcher", + "module": "ajet.cli.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -364,7 +364,7 @@ astuner --conf math_agent/math_agent.yaml --backbone='debug' --with-logview 调试完成后,即可开始正式训练: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` !!! success "训练输出" diff --git a/docs/zh/visualization.md b/docs/zh/visualization.md index 0d725b7f..ce4d6ad1 100644 --- a/docs/zh/visualization.md +++ b/docs/zh/visualization.md @@ -22,7 +22,7 @@ 只需在 YAML 配置中将 logger 后端设置为 `swanlab`: ```yaml -astuner: +ajet: trainer_common: logger: swanlab ``` @@ -32,14 +32,14 @@ astuner: 像平时一样启动训练: ```bash -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` ### 查看训练曲线 !!! success "自动记录" 训练启动后,SwanLab 会自动: - + 1. 记录关键指标(reward、success rate、loss 等) 2. 生成实时训练曲线 3. 提供可视化的 Web Dashboard @@ -94,7 +94,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' 在日志细节与训练开销之间取得平衡: ```yaml -astuner: +ajet: trainer_common: log_freq: 1 # 每 N step 记录一次日志 ``` @@ -104,7 +104,7 @@ astuner: 配置 checkpoint 保存策略,以保留峰值表现阶段的模型: ```yaml -astuner: +ajet: trainer_common: save_freq: 100 # 每 100 step 保存一次 ``` diff --git a/docs/zh/workflow.md b/docs/zh/workflow.md index 6bc7ede8..b3876548 100644 --- a/docs/zh/workflow.md +++ b/docs/zh/workflow.md @@ -4,7 +4,7 @@ !!! info "两种封装方式" ASTuner 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封装方式: - + - **简单模式**:强调简单、易用、容易理解 - **进阶模式**:强调灵活、可控、易扩展 @@ -41,7 +41,7 @@ 然后,将您的 Workflow 封装到一个继承自 `Workflow` 的类中: ```python -from agentscope_tuner import Workflow, WorkflowTask, WorkflowOutput, ModelTuner +from ajet import Workflow, WorkflowTask, WorkflowOutput, ModelTuner class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" @@ -55,7 +55,7 @@ class ExampleMathLearn(Workflow): !!! tip "适用场景" 这种写法适合大多数用户,如果您满足下面的情况,可以优先采用: - + - 很清楚**哪些智能体需要被训练**,或者智能体的数量本身就不多 - 已经完成了 Workflow 的基础调试,确认在使用非微调模型时工作流正常可用 - 不需要在运行过程中**动态改变**要训练的智能体集合 @@ -123,7 +123,7 @@ class ExampleMathLearn(Workflow): !!! success "进阶模式的优势" 通过多智能体协作,您可以: - + - **精细地控制**哪些智能体会被微调 - 为「当前未被训练」的智能体明确定义其使用的默认模型 - 在**不修改 Workflow 源码**的前提下,动态切换不同的可训练目标 @@ -217,10 +217,10 @@ for i, role in enumerate(roles): default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys - + # 注册角色 model_tuner.register_model(role, default_model=chosen_model) - + # 创建智能体 players += [ReActAgent( name=f"Player{i + 1}", diff --git a/mini_test.py b/mini_test.py index aa533c19..b3b88c26 100644 --- a/mini_test.py +++ b/mini_test.py @@ -1,4 +1,4 @@ -from agentscope_tuner import AstunerJob +from ajet import AstunerJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-1___5B-Instruct" @@ -8,5 +8,5 @@ # [Optional] job.dump_job_as_yaml('./saved_experiments/math.yaml') # Save yaml file for manual adjustment # [Optional] job.load_job_from_yaml('./saved_experiments/math.yaml') # Load yaml file from manual adjustment -# Equivalent to `astuner --conf ./saved_experiments/math.yaml` in the terminal +# Equivalent to `ajet --conf ./saved_experiments/math.yaml` in the terminal tuned_model = job.tune() diff --git a/pyproject.toml b/pyproject.toml index ed9dcdf6..bb7d718b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,12 +66,12 @@ doc = [ ] [project.scripts] -astuner = "agentscope_tuner.cli.launcher:main" +ajet = "ajet.cli.launcher:main" [tool.setuptools.packages.find] where = ["."] -include = ["astuner*"] +include = ["ajet*"] exclude = ["tests*", "docs*", "scripts*"] [tool.setuptools.package-data] diff --git a/pyrightconfig.json b/pyrightconfig.json index 9e3b24e7..44266545 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -1,7 +1,7 @@ { "logLevel": "Debug", "include": [ - "agentscope_tuner/**/*.py", + "ajet/**/*.py", "external/trinity/**/*.py", "external/verl/**/*.py", ".venv/lib/python3.10/site-packages/**/*.py" diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py index c57edca0..b288eaa3 100644 --- a/scripts/deploy_model.py +++ b/scripts/deploy_model.py @@ -9,8 +9,8 @@ from loguru import logger # noqa: E402 -from agentscope_tuner.utils.cleaner import fast_kill_by_keyword_bash # noqa: E402 -from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent # noqa: E402 +from ajet.utils.cleaner import fast_kill_by_keyword_bash # noqa: E402 +from ajet.utils.smart_daemon import LaunchCommandWhenAbsent # noqa: E402 parser = argparse.ArgumentParser(description="deploy Hugging Face model") parser.add_argument( @@ -69,9 +69,9 @@ def companion_launch(): # gpu_memory_utilization = 0.95 # max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs - # max_model_len = config.astune.rollout.max_model_len - # seed = config.astune.debug.debug_vllm_seed - # vllm_port = config.astune.debug.debug_vllm_port + # max_model_len = config.ajet.rollout.max_model_len + # seed = config.ajet.debug.debug_vllm_seed + # vllm_port = config.ajet.debug.debug_vllm_port vllm_port = args.port companion = LaunchCommandWhenAbsent( full_argument_list=[ diff --git a/scripts/docker/dockerfile b/scripts/docker/dockerfile index 929718f1..6ea9678a 100644 --- a/scripts/docker/dockerfile +++ b/scripts/docker/dockerfile @@ -1,8 +1,8 @@ # Build and run the docker image with the following command: # # cd -# docker build -f scripts/docker/dockerfile -t astuner:latest . -# docker run -it --gpus all --shm-size="64g" --rm -v $PWD:/workspace -v :/data astuner:latest +# docker build -f scripts/docker/dockerfile -t ajet:latest . +# docker run -it --gpus all --shm-size="64g" --rm -v $PWD:/workspace -v :/data ajet:latest FROM nvcr.io/nvidia/cuda:12.8.1-cudnn-devel-ubuntu22.04 diff --git a/scripts/test_dashscope_api.py b/scripts/test_dashscope_api.py index 0b989df0..7c1e776d 100644 --- a/scripts/test_dashscope_api.py +++ b/scripts/test_dashscope_api.py @@ -1,7 +1,7 @@ import asyncio -from agentscope_tuner.utils.robust_dashscope import RobustDashScopeChatModel +from ajet.utils.robust_dashscope import RobustDashScopeChatModel async def test_dashscope_api(): diff --git a/setup.py b/setup.py index 2b7027e5..e6351118 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages, setup setup( - name="astuner", # Change this to your package name + name="ajet", # Change this to your package name version="0.1.0", packages=find_packages(), ) diff --git a/tests/bench/benchmark_appworld/benchmark_appworld.py b/tests/bench/benchmark_appworld/benchmark_appworld.py index 1d2eccc0..70b440bf 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/benchmark_appworld.py @@ -1,7 +1,7 @@ # flake8: noqa import time -from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton +from ajet.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_appworld/benchmark_appworld.yaml b/tests/bench/benchmark_appworld/benchmark_appworld.yaml index 2fb19979..d46b8551 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld.yaml @@ -1,10 +1,10 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -56,9 +56,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml index 39ffa69b..c8cf98f3 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml @@ -1,10 +1,10 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -57,9 +57,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py index 225f38d3..8dfc2449 100644 --- a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py @@ -54,7 +54,7 @@ def test_02_begin_trinity(self): def clear_system_processes(self): # kill all python + ray + vllm processes - from agentscope_tuner.utils.cleaner import fast_kill_by_keyword_bash + from ajet.utils.cleaner import fast_kill_by_keyword_bash total_seconds = 15 for i in range(total_seconds): diff --git a/tests/bench/benchmark_base.py b/tests/bench/benchmark_base.py index bcde7cf9..2c3a27f7 100644 --- a/tests/bench/benchmark_base.py +++ b/tests/bench/benchmark_base.py @@ -5,9 +5,9 @@ from beast_logger import print_dict -from agentscope_tuner.utils.dynamic_import import dynamic_import -from agentscope_tuner.utils.smart_daemon import LaunchCommandWhenAbsent -from agentscope_tuner.utils.testing_utils import ( +from ajet.utils.dynamic_import import dynamic_import +from ajet.utils.smart_daemon import LaunchCommandWhenAbsent +from ajet.utils.testing_utils import ( populate_test_env_metadata, send_test_result, ) @@ -54,7 +54,7 @@ def execute_benchmark( cmd = [ python_executable, "-m", - "agentscope_tuner.cli.launcher", + "ajet.cli.launcher", "--conf", test_target, "--backbone", diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.py b/tests/bench/benchmark_countdown/benchmark_countdown.py index ffa55091..fedb48f7 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.py +++ b/tests/bench/benchmark_countdown/benchmark_countdown.py @@ -1,7 +1,7 @@ # flake8: noqa import time -from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton +from ajet.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.yaml b/tests/bench/benchmark_countdown/benchmark_countdown.yaml index 6779b0df..4dbaf8cd 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.yaml +++ b/tests/bench/benchmark_countdown/benchmark_countdown.yaml @@ -1,5 +1,5 @@ # ------------------ main configuration ------------------ -astuner: +ajet: project_name: benchmarking model: @@ -127,9 +127,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py index ba5bd50c..7eadcf41 100644 --- a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.py @@ -1,7 +1,7 @@ # flake8: noqa import time -from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton +from ajet.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml index 73b71bea..0cb0f136 100644 --- a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml @@ -1,5 +1,5 @@ # ------------------ main config ------------------ -astuner: +ajet: project_name: benchmarking task_reader: @@ -84,9 +84,9 @@ frozen_lake: # ------------------ do not edit ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ do not edit ------------------ defaults: diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py index d4d19755..fc26b776 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py @@ -1,7 +1,7 @@ # flake8: noqa import time -from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton +from ajet.utils.testing_utils import BenchmarkProbe, singleton # trinity b.b. expectation # [TestProbe] Step 50: local average reward over last self.reward_expectation_avg_window steps: 2.6618, expected range: [0.0, 99999.0] diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml index e50895a8..94364f3f 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: example_learn2ask_enhancedreward task_reader: type: jsonl_dataset_file @@ -60,9 +60,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/bench/benchmark_math/benchmark_math.py b/tests/bench/benchmark_math/benchmark_math.py index 94d88f00..9d8397ca 100644 --- a/tests/bench/benchmark_math/benchmark_math.py +++ b/tests/bench/benchmark_math/benchmark_math.py @@ -2,7 +2,7 @@ import os import time -from agentscope_tuner.utils.testing_utils import BenchmarkProbe, singleton +from ajet.utils.testing_utils import BenchmarkProbe, singleton @singleton diff --git a/tests/bench/benchmark_math/benchmark_math.yaml b/tests/bench/benchmark_math/benchmark_math.yaml index dfb9974a..3d9e534b 100644 --- a/tests/bench/benchmark_math/benchmark_math.yaml +++ b/tests/bench/benchmark_math/benchmark_math.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: benchmarking task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` @@ -62,9 +62,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tests/config_test.py b/tests/config_test.py index c636e589..69611841 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -3,7 +3,7 @@ import yaml -from agentscope_tuner.utils.config_utils import ( +from ajet.utils.config_utils import ( align_parameters, expand_astune_hierarchical_config, prepare_experiment_config, @@ -20,19 +20,19 @@ def test_load_config(self): self.assertEqual(exp_name, "sample") self.assertEqual(exp_base, "tests/temp/sample") self.assertEqual(yaml_backup_dst, "tests/temp/sample/yaml_backup.yaml") - self.assertIn("astuner", config) - self.assertIn("project_name", config["astuner"]) - self.assertEqual(config["astuner"]["project_name"], "unittest") - self.assertIn("experiment_name", config["astuner"]) - self.assertEqual(config["astuner"]["experiment_name"], "sample") - self.assertIn("task_reader", config["astuner"]) + self.assertIn("ajet", config) + self.assertIn("project_name", config["ajet"]) + self.assertEqual(config["ajet"]["project_name"], "unittest") + self.assertIn("experiment_name", config["ajet"]) + self.assertEqual(config["ajet"]["experiment_name"], "sample") + self.assertIn("task_reader", config["ajet"]) def test_config_alignment_trinity(self): """Test configuration alignment based on conversion JSON.""" from_config_fp = "tests/data/config.yaml" # Fixed config asset locations TRINITY_CONFIG_AUTO_CONVERSION = ( - "agentscope_tuner/default_config/trinity/config_auto_convertion_trinity.jsonc" + "ajet/default_config/trinity/config_auto_convertion_trinity.jsonc" ) with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: @@ -66,7 +66,7 @@ def test_config_alignment_trinity(self): self.assertEqual(to_config["explorer"]["rollout_model"]["tensor_parallel_size"], 4) # Test computed values self.assertEqual(to_config["buffer"]["batch_size"], 120) - # (astuner.rollout.max_env_worker // astuner.rollout.n_vllm_engine) = 256 // 2 = 128 + # (ajet.rollout.max_env_worker // ajet.rollout.n_vllm_engine) = 256 // 2 = 128 self.assertEqual(to_config["explorer"]["runner_per_model"], 128) def test_config_alignment_verl(self): @@ -74,7 +74,7 @@ def test_config_alignment_verl(self): from_config_fp = "tests/data/config.yaml" # Fixed config asset locations TRINITY_CONFIG_AUTO_CONVERSION = ( - "agentscope_tuner/default_config/verl/config_auto_convertion_verl.jsonc" + "ajet/default_config/verl/config_auto_convertion_verl.jsonc" ) with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: diff --git a/tests/data_gen.py b/tests/data_gen.py index 5f9f3eb9..f088f245 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -4,11 +4,11 @@ import dotenv from loguru import logger -from agentscope_tuner.data_generator.knowledge_augmentation import KnowledgeAugmentor -from agentscope_tuner.data_generator.task_augmentation import TaskAugmentor -from agentscope_tuner.task_reader import RouterTaskReader -from agentscope_tuner.task_reader.document_reader.doc_reader import DocReader -from agentscope_tuner.utils.config_utils import read_astune_config +from ajet.data_generator.knowledge_augmentation import KnowledgeAugmentor +from ajet.data_generator.task_augmentation import TaskAugmentor +from ajet.task_reader import RouterTaskReader +from ajet.task_reader.document_reader.doc_reader import DocReader +from ajet.utils.config_utils import read_astune_config dotenv.load_dotenv() diff --git a/tests/data_gen.yaml b/tests/data_gen.yaml index b8aad21b..b39bf580 100644 --- a/tests/data_gen.yaml +++ b/tests/data_gen.yaml @@ -1,4 +1,4 @@ -astuner: +ajet: task_reader: data_generation: document_reader: diff --git a/tests/test_benchmark_report.py b/tests/test_benchmark_report.py index 6f005af4..27fd5b67 100644 --- a/tests/test_benchmark_report.py +++ b/tests/test_benchmark_report.py @@ -1,7 +1,7 @@ import json import unittest -from agentscope_tuner.utils.dynamic_import import dynamic_import +from ajet.utils.dynamic_import import dynamic_import class TestDynamicImport(unittest.TestCase): diff --git a/tests/test_compute_madness.py b/tests/test_compute_madness.py index 061e904b..f92028f2 100644 --- a/tests/test_compute_madness.py +++ b/tests/test_compute_madness.py @@ -1,6 +1,6 @@ # flake8: noqa -from agentscope_tuner.utils.compute_madness import ( +from ajet.utils.compute_madness import ( compute_string_madness, compute_string_madness_format, ) diff --git a/tests/test_dynamic_import.py b/tests/test_dynamic_import.py index 52b88ff0..42de2144 100644 --- a/tests/test_dynamic_import.py +++ b/tests/test_dynamic_import.py @@ -1,7 +1,7 @@ import json import unittest -from agentscope_tuner.utils.dynamic_import import dynamic_import +from ajet.utils.dynamic_import import dynamic_import class TestDynamicImport(unittest.TestCase): diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index 984130f7..db03591e 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -4,9 +4,9 @@ import pytest -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_reader.tracing_reader import TracingReader -from agentscope_tuner.task_reader.tracing_reader.filters.base import Filter +from ajet.schema.task import Task +from ajet.task_reader.tracing_reader import TracingReader +from ajet.task_reader.tracing_reader.filters.base import Filter class DummyConnector: diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 712a39fc..80af0e7f 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -23,7 +23,7 @@ agent = ReActAgent( print_hint_msg=False, ) -for _ in range(config.astuner.rollout.multi_turn.max_steps): +for _ in range(config.ajet.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol @@ -42,7 +42,7 @@ for _ in range(config.astuner.rollout.multi_turn.max_steps): ### 3. 准备Judge (奖励模块) -在 `astuner/task_judge/env_service_as_judge.py` 中,我们直接向 env_service 发送http请求,读取奖励。 +在 `ajet/task_judge/env_service_as_judge.py` 中,我们直接向 env_service 发送http请求,读取奖励。 Judge的返回值: raw_reward, is_success @@ -52,21 +52,21 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_appworld/appworld.yaml](../tutorial/example_appworld/appworld.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 -1. 读取task(对应配置字段 astuner.task_reader) -2. 定义 Workflow(对应配置字段 astuner.rollout.agentscope_workflow ) +1. 读取task(对应配置字段 ajet.task_reader) +2. 定义 Workflow(对应配置字段 ajet.rollout.agentscope_workflow ) - 举例如果 agentscope workflow 定义在 `tutorial/appworld.py` 的`ExampleAgentScopeWorkflow` 类 - - 则填写 astuner.rollout.agentscope_workflow=`tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow` -3. 定义评分函数(对应配置字段 astuner.task_judge.judge_protocol ) - - 填写 astuner.task_judge.judge_protocol=`astuner.task_judge.env_service_as_judge->EnvServiceJudge` -4. 指定模型(对应配置字段 astuner.model.path ) + - 则填写 ajet.rollout.agentscope_workflow=`tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow` +3. 定义评分函数(对应配置字段 ajet.task_judge.judge_protocol ) + - 填写 ajet.task_judge.judge_protocol=`ajet.task_judge.env_service_as_judge->EnvServiceJudge` +4. 指定模型(对应配置字段 ajet.model.path ) ```yaml -astuner +ajet project_name: appworld_astune experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 path: YOUR_MODEL_PATH @@ -82,8 +82,8 @@ astuner 4.2 全链路调试(脱离ray快速调试:--backbone='debug') ```bash -# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( astuner --kill="python|ray" ) -clear && astuner --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview +# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( ajet --kill="python|ray" ) +clear && ajet --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: @@ -96,7 +96,7 @@ clear && astuner --conf tutorial/example_appworld/appworld.yaml --backbone='debu "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "agentscope_tuner/cli/launcher.py", + "program": "ajet/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -113,8 +113,8 @@ clear && astuner --conf tutorial/example_appworld/appworld.yaml --backbone='debu 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash -# 建议开始前杀死所有ray、vllm、env_service进程 ( astuner --kill="python|ray|vllm" ) -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' +# 建议开始前杀死所有ray、vllm、env_service进程 ( ajet --kill="python|ray|vllm" ) +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' ``` @@ -134,9 +134,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /astuner/astuner/saved_experiments - - /astuner/astuner/saved_experiments/exp_yaml_file_name - - /astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout + - /ajet/ajet/saved_experiments + - /ajet/ajet/saved_experiments/exp_yaml_file_name + - /ajet/ajet/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py index a63f4c34..a084644a 100644 --- a/tutorial/example_appworld/appworld.py +++ b/tutorial/example_appworld/appworld.py @@ -1,11 +1,11 @@ from agentscope.message import Msg from pydantic import Field -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask class ExampleAgentScopeWorkflow(Workflow): - trainer: str = Field(default="astuner-trinity") + trainer: str = Field(default="ajet-trinity") async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent @@ -39,7 +39,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> agent.set_console_output_enabled(False) env = workflow_task.gym_env step = 0 - for step in range(model_tuner.config.astuner.rollout.multi_turn.max_steps): + for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index ee84bbbd..33ccf19f 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -1,10 +1,10 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: example_appworld experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: agentscope_tuner.task_judge.env_service_as_judge->EnvServiceJudge + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge model: # ✨✨✨✨ 设置待训练的模型 @@ -48,9 +48,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_countdown/countdown.py b/tutorial/example_countdown/countdown.py index e851abbe..5eafbeeb 100644 --- a/tutorial/example_countdown/countdown.py +++ b/tutorial/example_countdown/countdown.py @@ -1,7 +1,7 @@ from agentscope.message import Msg from loguru import logger -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: diff --git a/tutorial/example_countdown/countdown.yaml b/tutorial/example_countdown/countdown.yaml index 0f6de6e4..a4accb6b 100644 --- a/tutorial/example_countdown/countdown.yaml +++ b/tutorial/example_countdown/countdown.yaml @@ -1,5 +1,5 @@ # ------------------ main configuration ------------------ -astuner: +ajet: project_name: "example_countdown" model: @@ -138,9 +138,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_countdown/countdown_answer_as_judge.py b/tutorial/example_countdown/countdown_answer_as_judge.py index f766a900..6f421b2a 100644 --- a/tutorial/example_countdown/countdown_answer_as_judge.py +++ b/tutorial/example_countdown/countdown_answer_as_judge.py @@ -1,7 +1,7 @@ import re -from agentscope_tuner.task_judge.base_judge import BaseJudge -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.task_judge.base_judge import BaseJudge +from ajet.workflow import WorkflowOutput, WorkflowTask class CountdownAnswerAsJudge(BaseJudge): diff --git a/tutorial/example_feedback_tracing/README.md b/tutorial/example_feedback_tracing/README.md index 203970a0..04b532a4 100644 --- a/tutorial/example_feedback_tracing/README.md +++ b/tutorial/example_feedback_tracing/README.md @@ -38,7 +38,7 @@ An example database and configuration file are provided under When everything is ready, start the training with: ```bash -astuner --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray ``` ## 3. Deploying the New Agent diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index 84ba6173..01bbf68a 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: example_feedback_training task_reader: type: tracing @@ -65,9 +65,9 @@ trainer: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_feedback_tracing/train.py b/tutorial/example_feedback_tracing/train.py index 6df76a46..4cb9a082 100644 --- a/tutorial/example_feedback_tracing/train.py +++ b/tutorial/example_feedback_tracing/train.py @@ -6,7 +6,7 @@ from loguru import logger from pydantic import BaseModel, Field -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask SYSTEM_PROMPT = """ You are an agent specialized in solving math problems with tools. diff --git a/tutorial/example_frozenlake/frozenlake.py b/tutorial/example_frozenlake/frozenlake.py index ca4dfd2f..b8736812 100644 --- a/tutorial/example_frozenlake/frozenlake.py +++ b/tutorial/example_frozenlake/frozenlake.py @@ -18,7 +18,7 @@ from gymnasium.envs.toy_text.frozen_lake import FrozenLakeEnv as GymFrozenLakeEnv from loguru import logger -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask SYSTEM_PROMPT = """You are a helpful assistant. You are walking on a frozen lake. @@ -53,8 +53,8 @@ class FrozenLakeWorkflow(Workflow): async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: config = model_tuner.config - self.env_max_steps = config.astuner.rollout.multi_turn.max_steps - self.agent_max_steps = config.astuner.rollout.multi_turn.max_steps + self.env_max_steps = config.ajet.rollout.multi_turn.max_steps + self.agent_max_steps = config.ajet.rollout.multi_turn.max_steps # Extract task-specific arguments self.raw_task = workflow_task.task.metadata diff --git a/tutorial/example_frozenlake/frozenlake_easy.yaml b/tutorial/example_frozenlake/frozenlake_easy.yaml index 4334f793..976247a4 100644 --- a/tutorial/example_frozenlake/frozenlake_easy.yaml +++ b/tutorial/example_frozenlake/frozenlake_easy.yaml @@ -1,5 +1,5 @@ # ------------------ main config ------------------ -astuner: +ajet: project_name: example_frozenlake task_reader: type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` @@ -79,9 +79,9 @@ frozen_lake: # ------------------ do not edit ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ do not edit ------------------ defaults: diff --git a/tutorial/example_frozenlake/frozenlake_hard.yaml b/tutorial/example_frozenlake/frozenlake_hard.yaml index d051972a..9a49de93 100644 --- a/tutorial/example_frozenlake/frozenlake_hard.yaml +++ b/tutorial/example_frozenlake/frozenlake_hard.yaml @@ -1,5 +1,5 @@ # ------------------ main config ------------------ -astuner: +ajet: project_name: example_frozenlake_7b task_reader: type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` @@ -77,9 +77,9 @@ frozen_lake: # ------------------ do not edit ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ do not edit ------------------ defaults: diff --git a/tutorial/example_learn2ask/learn2ask.md b/tutorial/example_learn2ask/learn2ask.md index ddd8ad51..a642c3ae 100644 --- a/tutorial/example_learn2ask/learn2ask.md +++ b/tutorial/example_learn2ask/learn2ask.md @@ -56,7 +56,7 @@ You can use this exisiting configuration file straigtly and fill the dataset pat Start the training with ```bash -astuner --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray ``` ## 4. Results diff --git a/tutorial/example_learn2ask/learn2ask.py b/tutorial/example_learn2ask/learn2ask.py index 40d10f8f..b1b7b1c1 100644 --- a/tutorial/example_learn2ask/learn2ask.py +++ b/tutorial/example_learn2ask/learn2ask.py @@ -7,8 +7,8 @@ from agentscope.message import Msg from loguru import logger -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask -from agentscope_tuner.utils.robust_dashscope import RobustDashScopeChatModel +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet.utils.robust_dashscope import RobustDashScopeChatModel system_prompt = """# Task You are a medical assistant. Your task is to understand the ongoing conversation and continue the medical inquiry in English. diff --git a/tutorial/example_learn2ask/learn2ask.yaml b/tutorial/example_learn2ask/learn2ask.yaml index 9dfe36e6..5f8233b1 100644 --- a/tutorial/example_learn2ask/learn2ask.yaml +++ b/tutorial/example_learn2ask/learn2ask.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: example_learn2ask_enhancedreward task_reader: type: dataset_file @@ -56,9 +56,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index cb43ca23..3fcc6a6f 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -82,17 +82,17 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_math_agent/math_agent.yaml](../tutorial/example_math_agent/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 -1. 读取task(对应配置字段 astuner.task_reader) -2. 定义 Workflow(对应配置字段 astuner.rollout.agentscope_workflow ) +1. 读取task(对应配置字段 ajet.task_reader) +2. 定义 Workflow(对应配置字段 ajet.rollout.agentscope_workflow ) - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - - 则填写 astuner.rollout.agentscope_workflow=`tutorial.math_agent->ExampleMathLearn` -3. 定义评分函数(对应配置字段 astuner.task_judge.judge_protocol ) + - 则填写 ajet.rollout.agentscope_workflow=`tutorial.math_agent->ExampleMathLearn` +3. 定义评分函数(对应配置字段 ajet.task_judge.judge_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/example_math_agent/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - - 则填写 astuner.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` -4. 指定模型(对应配置字段 astuner.model.path ) + - 则填写 ajet.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` +4. 指定模型(对应配置字段 ajet.model.path ) ```yaml -astuner +ajet task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` rollout: @@ -108,9 +108,9 @@ astuner 4.2 全链路调试(脱离ray快速调试:--backbone='debug') ```bash -# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( astuner --kill="python|ray" ) +# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( ajet --kill="python|ray" ) clear && \ -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: ```json @@ -122,7 +122,7 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' -- "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "agentscope_tuner/cli/launcher.py", + "program": "ajet/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -138,8 +138,8 @@ astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' -- 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash -# 建议开始前杀死所有ray、vllm、env_service进程 ( astuner --kill="python|ray|vllm" ) -astuner --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +# 建议开始前杀死所有ray、vllm、env_service进程 ( ajet --kill="python|ray|vllm" ) +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray ``` @@ -159,9 +159,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /astuner/astuner/saved_experiments - - /astuner/astuner/saved_experiments/exp_yaml_file_name - - /astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout + - /ajet/ajet/saved_experiments + - /ajet/ajet/saved_experiments/exp_yaml_file_name + - /ajet/ajet/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index 2c7df366..a64a955a 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -1,7 +1,7 @@ from agentscope.message import Msg from loguru import logger -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 4c6f3892..3bacfb20 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: example_math_agent task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` @@ -59,9 +59,9 @@ trinity: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_math_agent/math_agent_simplify.py b/tutorial/example_math_agent/math_agent_simplify.py index 59933261..e2d2746e 100644 --- a/tutorial/example_math_agent/math_agent_simplify.py +++ b/tutorial/example_math_agent/math_agent_simplify.py @@ -3,7 +3,7 @@ from agentscope.message import Msg from loguru import logger -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: diff --git a/tutorial/example_math_agent/math_answer_as_judge.py b/tutorial/example_math_agent/math_answer_as_judge.py index 606b1f2a..5edc52eb 100644 --- a/tutorial/example_math_agent/math_answer_as_judge.py +++ b/tutorial/example_math_agent/math_answer_as_judge.py @@ -1,8 +1,8 @@ import re -from agentscope_tuner.task_judge.base_judge import BaseJudge -from agentscope_tuner.task_rollout.dashscope_llm_bridge import create_external_llm_fn -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.task_judge.base_judge import BaseJudge +from ajet.task_rollout.dashscope_llm_bridge import create_external_llm_fn +from ajet.workflow import WorkflowOutput, WorkflowTask class MathAnswerAsJudge(BaseJudge): @@ -42,8 +42,8 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO reference_answer = reference_answer.split("####")[-1].strip() external_llm_fn = create_external_llm_fn( - alien_llm_model=self.config.astuner.task_judge.alien_llm_model, - alien_llm_response_length=self.config.astuner.task_judge.alien_llm_response_length, + alien_llm_model=self.config.ajet.task_judge.alien_llm_model, + alien_llm_response_length=self.config.ajet.task_judge.alien_llm_response_length, ) messages = [ { diff --git a/tutorial/example_rm_auto_grader/auto_grader.md b/tutorial/example_rm_auto_grader/auto_grader.md index 50e41d57..4ea912fb 100644 --- a/tutorial/example_rm_auto_grader/auto_grader.md +++ b/tutorial/example_rm_auto_grader/auto_grader.md @@ -11,7 +11,7 @@ Auto Grader Judge is an intelligent evaluation system that **learns how to grade - Support for both pointwise (scoring) and listwise (ranking) evaluation - MCR²-based smart sampling for large datasets - Optional LLM-based categorization -- Seamless integration with astuner's workflow system +- Seamless integration with ajet's workflow system ### When to Use Auto Grader Judge? @@ -32,7 +32,7 @@ Auto Grader Judge is an intelligent evaluation system that **learns how to grade Add to your `astune_default.yaml`: ```yaml -astuner: +ajet: task_judge: judge_type: rubrics_auto_grader @@ -102,7 +102,7 @@ Each sample contains a query with multiple ranked candidates: ### 3. Basic Usage ```python -from agentscope_tuner.task_judge.rm_auto_grader_judge import AutoGraderJudge +from ajet.task_judge.rm_auto_grader_judge import AutoGraderJudge # Initialize judge judge = AutoGraderJudge(config) diff --git a/tutorial/example_rm_auto_grader/auto_grader_example.py b/tutorial/example_rm_auto_grader/auto_grader_example.py index 4af8323b..c89ef1ed 100644 --- a/tutorial/example_rm_auto_grader/auto_grader_example.py +++ b/tutorial/example_rm_auto_grader/auto_grader_example.py @@ -1,5 +1,5 @@ """ -Example: Using RM Iterative Rubric Judge with astuner +Example: Using RM Iterative Rubric Judge with ajet This example demonstrates how to use the RM Gallery IterativeRubricsGenerator integration for data-driven evaluation of workflow outputs. @@ -20,9 +20,9 @@ POINTWISE_EVALUATION_TEMPLATE, ) -from agentscope_tuner.schema.task import Task -from agentscope_tuner.task_judge.rm_auto_grader_judge import AutoGraderJudge -from agentscope_tuner.workflow import WorkflowOutput, WorkflowTask +from ajet.schema.task import Task +from ajet.task_judge.rm_auto_grader_judge import AutoGraderJudge +from ajet.workflow import WorkflowOutput, WorkflowTask # ============================================ # Example 1: Pre-generated Rubrics Approach @@ -40,7 +40,7 @@ async def example_pregerated_rubrics(): # Mock config object class MockConfig: - class Astuner: + class Ajet: class TaskJudge: class RubricsAutoGrader: # Model configuration @@ -73,7 +73,7 @@ class RubricsAutoGrader: task_judge = TaskJudge() experiment_dir = "/tmp/rm_grader_example" - astuner = Astuner() + ajet = Ajet() config = MockConfig() @@ -121,7 +121,7 @@ async def example_listwise_mode(): # Mock config object class MockConfig: - class Astuner: + class Ajet: class TaskJudge: class RubricsAutoGrader: # Model configuration @@ -153,7 +153,7 @@ class RubricsAutoGrader: task_judge = TaskJudge() experiment_dir = "/tmp/rm_grader_example_listwise" - astuner = Astuner() + ajet = Ajet() config = MockConfig() diff --git a/tutorial/example_rm_auto_grader/config.md b/tutorial/example_rm_auto_grader/config.md index fc5f5be9..9a93b8c4 100644 --- a/tutorial/example_rm_auto_grader/config.md +++ b/tutorial/example_rm_auto_grader/config.md @@ -1,7 +1,7 @@ # Example configuration for RM Auto Grader Judge -# This configuration integrates RM Gallery's AutoGrader capabilities into astuner +# This configuration integrates RM Gallery's AutoGrader capabilities into ajet -astuner +ajet # Task judge configuration using RM Auto Grader task_judge: # Use AutoGraderJudge for pre-generated rubrics @@ -76,7 +76,7 @@ astuner # ============================================ # Uncomment and use these settings when using RMAutoGraderBatchJudge -# astuner +# ajet # task_judge: # class_name: RMAutoGraderBatchJudge # @@ -92,7 +92,7 @@ astuner # ============================================ # Example for Math Problem Evaluation # ============================================ -# astuner +# ajet # task_judge: # class_name: AutoGraderJudge # model_name: "qwen-plus" @@ -114,7 +114,7 @@ astuner # ============================================ # Example for Agent Task Evaluation # ============================================ -# astuner +# ajet # task_judge: # class_name: AutoGraderJudge # model_name: "gpt-4" diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index 1ef3fef2..77524f4a 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -82,17 +82,17 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_rubrics_judge/math_agent.yaml](../tutorial/example_rubrics_judge/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 -1. 读取task(对应配置字段 astuner.task_reader) -2. 定义 Workflow(对应配置字段 astuner.rollout.agentscope_workflow ) +1. 读取task(对应配置字段 ajet.task_reader) +2. 定义 Workflow(对应配置字段 ajet.rollout.agentscope_workflow ) - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - - 则填写 astuner.rollout.agentscope_workflow=`tutorial.math_agent->ExampleMathLearn` -3. 定义评分函数(对应配置字段 astuner.task_judge.judge_protocol ) + - 则填写 ajet.rollout.agentscope_workflow=`tutorial.math_agent->ExampleMathLearn` +3. 定义评分函数(对应配置字段 ajet.task_judge.judge_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/example_math_agent/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - - 则填写 astuner.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` -4. 指定模型(对应配置字段 astuner.model.path ) + - 则填写 ajet.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` +4. 指定模型(对应配置字段 ajet.model.path ) ```yaml -astuner +ajet task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` rollout: @@ -108,9 +108,9 @@ astuner 4.2 全链路调试(脱离ray快速调试:--backbone='debug') ```bash -# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( astuner --kill="python|ray" ) +# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( ajet --kill="python|ray" ) clear && \ -astuner --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='debug' --with-logview +ajet --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: ```json @@ -122,7 +122,7 @@ astuner --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='debug' "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "agentscope_tuner/cli/launcher.py", + "program": "ajet/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -138,8 +138,8 @@ astuner --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='debug' 4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash -# 建议开始前杀死所有ray、vllm、env_service进程 ( astuner --kill="python|ray|vllm" ) -astuner --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='trinity' --with-ray +# 建议开始前杀死所有ray、vllm、env_service进程 ( ajet --kill="python|ray|vllm" ) +ajet --conf tutorial/example_rubrics_judge/math_agent.yaml --backbone='trinity' --with-ray ``` @@ -159,9 +159,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /astuner/astuner/saved_experiments - - /astuner/astuner/saved_experiments/exp_yaml_file_name - - /astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout + - /ajet/ajet/saved_experiments + - /ajet/ajet/saved_experiments/exp_yaml_file_name + - /ajet/ajet/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_rubrics_judge/math_agent.py b/tutorial/example_rubrics_judge/math_agent.py index d3ade27c..1cfd604c 100644 --- a/tutorial/example_rubrics_judge/math_agent.py +++ b/tutorial/example_rubrics_judge/math_agent.py @@ -2,7 +2,7 @@ from loguru import logger from pydantic import BaseModel, Field -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml index 24920128..dd046414 100644 --- a/tutorial/example_rubrics_judge/r_judge.yaml +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -1,5 +1,5 @@ # ------------------ 主要配置 ------------------ -astuner: +ajet: project_name: example_rubrics_judge task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` @@ -60,9 +60,9 @@ astuner: # ------------------ 不需要修改 ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ 不需要修改 ------------------ defaults: diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index f787471e..d8582db2 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -17,7 +17,7 @@ from loguru import logger from pydantic import BaseModel, Field -from agentscope_tuner import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask from tutorial.example_werewolves.game import BadGuyException, werewolves_game @@ -81,7 +81,7 @@ def get_official_agent_prompt(name) -> str: class ExampleWerewolves(Workflow): - trainer: str = Field(default="astuner-trinity") + trainer: str = Field(default="ajet-trinity") trainable_targets: list = Field( default=["werewolf"], description="List of agents to be fine-tuned." ) diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index 9aca0f8b..fce9f4a1 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -8,7 +8,7 @@ - 定义 AgentScope 的工作流 (把agent的model修改为`astune_proxy`) ```python class ExampleWerewolves(Workflow): - trainer: str = Field(default="astuner-trinity") + trainer: str = Field(default="ajet-trinity") async def execute(self, init_messages, astune_proxy: ModelTuner, config) -> WorkflowOutput: train_which_role = "witch" @@ -37,7 +37,7 @@ - 复制并修改 [tutorial/example_werewolves/werewolves.yaml](../tutorial/example_werewolves/werewolves.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 ```yaml - astuner + ajet task_reader: type: random_dummy # `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` task_judge: @@ -53,8 +53,8 @@ - 全链路调试(脱离ray快速调试:--backbone='debug') ```bash - # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( astuner --kill="python|ray" ) - astuner --kill="python|ray|vllm|VLLM" && ray stop && clear && astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview + # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( ajet --kill="python|ray" ) + ajet --kill="python|ray|vllm|VLLM" && ray stop && clear && ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview ``` 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: @@ -67,7 +67,7 @@ "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "program": "agentscope_tuner/cli/launcher.py", + "program": "ajet/cli/launcher.py", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -83,9 +83,9 @@ - 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') ```bash - # 建议开始前杀死所有ray、vllm、env_service进程 ( astuner --kill="python|ray|vllm" ) - astuner --kill="python|ray|vllm|VLLM" && ray stop && clear && \ - astuner --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray + # 建议开始前杀死所有ray、vllm、env_service进程 ( ajet --kill="python|ray|vllm" ) + ajet --kill="python|ray|vllm|VLLM" && ray stop && clear && \ + ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray ``` @@ -105,9 +105,9 @@ INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` - 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /astuner/astuner/saved_experiments - - /astuner/astuner/saved_experiments/exp_yaml_file_name - - /astuner/astuner/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout + - /ajet/ajet/saved_experiments + - /ajet/ajet/saved_experiments/exp_yaml_file_name + - /ajet/ajet/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index aaec31e4..5acbb139 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -1,5 +1,5 @@ # ------------------ main config ------------------ -astuner: +ajet: project_name: example_werewolves task_reader: type: random_dummy # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` @@ -64,9 +64,9 @@ astuner: # ------------------ do not edit ------------------ hydra: searchpath: - - file://agentscope_tuner/default_config - - file://agentscope_tuner/default_config/verl # verl only - - file://agentscope_tuner/default_config/trinity # trinity only + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only # ------------------ do not edit ------------------ defaults: From 8ba0d6216d6aa6289c8a1eef8b623af8865a537b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 6 Jan 2026 14:48:57 +0800 Subject: [PATCH 378/462] rename project name --- .github/workflows/docker/docker-compose.yaml | 2 +- README.md | 6 +++--- ajet/cli/launcher.py | 2 +- ajet/utils/launch_utils.py | 4 ++-- docs/_config.yml | 4 ++-- docs/en/beast_logger.md | 6 +++--- docs/en/example.md | 2 +- docs/en/hardware_related_solution.md | 2 +- docs/en/installation.md | 16 ++++++++-------- docs/en/intro.md | 4 ++-- docs/en/introduction.md | 4 ++-- docs/index.md | 4 ++-- docs/zh/beast_logger.md | 6 +++--- docs/zh/installation.md | 10 +++++----- docs/zh/intro.md | 4 ++-- docs/zh/introduction.md | 4 ++-- mkdocs.yml | 8 ++++---- pyproject.toml | 12 ++++++------ 18 files changed, 50 insertions(+), 50 deletions(-) diff --git a/.github/workflows/docker/docker-compose.yaml b/.github/workflows/docker/docker-compose.yaml index 8faf5d1d..8b08b505 100644 --- a/.github/workflows/docker/docker-compose.yaml +++ b/.github/workflows/docker/docker-compose.yaml @@ -1,7 +1,7 @@ services: ajet-node-1: - image: agentscope-tuner-unittest:latest + image: agentjet-unittest:latest pull_policy: never command: bash -c "uv pip install -e .[trinity] && ray start --head --dashboard-host 0.0.0.0 --include-dashboard true --block" environment: diff --git a/README.md b/README.md index 87a1c332..e0d3578e 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Let's begin with the simplest example: a math agent with a tool call. We aim to build a easy-to-learn Agent tuner that unlock more possibilities for agent developers: - **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. -- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/agentscope-ai/agentscope-tuner/tree/main/tutorial) as tutorials. +- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=verl`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](docs/en/installation.md) backbone. **把verl换成默认BB** - **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). @@ -48,8 +48,8 @@ We recommend using `uv` for dependency management. 1. **Clone the Repository**: ```bash -git clone https://github.com/agentscope-ai/agentscope-tuner.git -cd agentscope-tuner +git clone https://github.com/modelscope/AgentJet.git +cd AgentJet ``` diff --git a/ajet/cli/launcher.py b/ajet/cli/launcher.py index fc1da5f3..856ffe8f 100644 --- a/ajet/cli/launcher.py +++ b/ajet/cli/launcher.py @@ -20,7 +20,7 @@ def parse_args(): - parser = argparse.ArgumentParser(description="AgentScope-Tuner Launcher") + parser = argparse.ArgumentParser(description="AgentJet Launcher") parser.add_argument( "--backbone", type=str, diff --git a/ajet/utils/launch_utils.py b/ajet/utils/launch_utils.py index eddbabe9..892ef726 100644 --- a/ajet/utils/launch_utils.py +++ b/ajet/utils/launch_utils.py @@ -133,7 +133,7 @@ def verify_python_env(args, exp_config): if args.backbone == "trinity": if any([v in verl.__version__ for v in ["0.5.0.post", "0.7.0.post"]]): cause = "Python environment does not match current backbone 'trinity'." - solution = "Please `cd /path/to/project/agentscope-tuner` and run `(uv) pip install -e .[trinity]` to install the correct environment." + solution = "Please `cd /path/to/project/AgentJet` and run `(uv) pip install -e .[trinity]` to install the correct environment." print_dict( { "Python Environment Check": "FAILED", @@ -146,7 +146,7 @@ def verify_python_env(args, exp_config): elif args.backbone == "verl": if not any([v in verl.__version__ for v in ["0.5.0.post", "0.7.0.post"]]): # you must install via `pip install -e .[verl]` to get every dependency right cause = "Python environment does not match current backbone 'verl'." - solution = "Please `cd /path/to/project/agentscope-tuner` and run `(uv) pip install -e .[verl]` to install the correct environment." + solution = "Please `cd /path/to/project/AgentJet` and run `(uv) pip install -e .[verl]` to install the correct environment." print_dict( { "Python Environment Check": "FAILED", diff --git a/docs/_config.yml b/docs/_config.yml index ecdccdd9..cf084dae 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -94,12 +94,12 @@ sphinx: html_theme_options: top_of_page_buttons: ["view"] sidebar_hide_name: false - source_repository: "https://github.com/agentscope-ai/agentscope-tuner" + source_repository: "https://github.com/modelscope/AgentJet" source_branch: "main" source_directory: "docs/" footer_icons: - name: GitHub - url: "https://github.com/agentscope-ai/agentscope-tuner" + url: "https://github.com/modelscope/AgentJet" html: | diff --git a/docs/en/beast_logger.md b/docs/en/beast_logger.md index ca6ac5a8..d4d6fdef 100644 --- a/docs/en/beast_logger.md +++ b/docs/en/beast_logger.md @@ -4,11 +4,11 @@ Beast-logger is a logging kit built for LLM systems, providing reliable high-resolution token-level LLM activity that is unprecedented in any other projects. -Here is how to use beast-logger in agentscope-tuner. +Here is how to use beast-logger in AgentJet. -## Usage in agentscope-tuner +## Usage in AgentJet -1. Start training or debugging with agentscope-tuner launcher. +1. Start training or debugging with AgentJet launcher. 2. Wait until the first batch is completed. diff --git a/docs/en/example.md b/docs/en/example.md index 7eb79c87..5eebabbb 100644 --- a/docs/en/example.md +++ b/docs/en/example.md @@ -1,3 +1,3 @@ # Examples -This section provides practical examples of how to use AgentScope-Tuner in various scenarios. +This section provides practical examples of how to use AgentJet in various scenarios. diff --git a/docs/en/hardware_related_solution.md b/docs/en/hardware_related_solution.md index d19f5942..c2cad4a3 100644 --- a/docs/en/hardware_related_solution.md +++ b/docs/en/hardware_related_solution.md @@ -5,7 +5,7 @@ This document records a list of **Hardware Related** issues for future reference - Problem: ```python - File "/root/agentscope-tuner/.venv/lib/python3.10/site-packages/torch/distributed/utils.py", line 322, in _sync_params_and_buffers + File "/root/AgentJet/.venv/lib/python3.10/site-packages/torch/distributed/utils.py", line 322, in _sync_params_and_buffers dist._broadcast_coalesced( torch.distributed.DistBackendError: NCCL error in: /pytorch/torch/csrc/distributed/c10d/NCCLUtils.cpp:77, unhandled cuda error (run with NCCL_DEBUG=INFO for details), NCCL version 2.26.2 ncclUnhandledCudaError: Call to CUDA function failed. diff --git a/docs/en/installation.md b/docs/en/installation.md index 0474c828..45bb7071 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -1,9 +1,9 @@ # Installation Guide -This document provides a step-by-step guide to installing AgentScope-Tuner. +This document provides a step-by-step guide to installing AgentJet. !!! tip "Latest Version Recommended" - AgentScope Tuner is under active development and iteration. We recommend installing from source to get the latest features and bug fixes. + AgentJet is under active development and iteration. We recommend installing from source to get the latest features and bug fixes. --- @@ -20,16 +20,16 @@ This document provides a step-by-step guide to installing AgentScope-Tuner. ### Step 1: Clone the Repository -Clone the AgentScope Tuner repository from GitHub and navigate into the project directory: +Clone the AgentJet repository from GitHub and navigate into the project directory: ```bash -git clone https://github.com/agentscope-ai/agentscope-tuner.git -cd agentscope-tuner +git clone https://github.com/modelscope/AgentJet.git +cd AgentJet ``` ### Step 2: Install Dependencies -AgentScope-Tuner supports multiple backbones. Currently we have `verl` and `trinity` (recommended). +AgentJet supports multiple backbones. Currently we have `verl` and `trinity` (recommended). !!! info "Package Manager" We recommend using `uv` to manage your Python environment as it is incredibly fast. See also [`uv` installation document](https://docs.astral.sh/uv/getting-started/installation/). @@ -79,7 +79,7 @@ Please install nvidia docker runtime on the host Ubuntu system. For details, ref ### Run Docker Container -This command mounts your current working directory (the root directory of agentscope-tuner) to `/workspace` and your data directory to `/data` inside the container. +This command mounts your current working directory (the root directory of agentjet) to `/workspace` and your data directory to `/data` inside the container. ```bash docker run -it \ @@ -88,7 +88,7 @@ docker run -it \ --rm \ -v $PWD:/workspace \ -v /path/to/your/checkpoint/and/data:/data \ - agentscope-tuner:latest + agentjet:latest ``` --- diff --git a/docs/en/intro.md b/docs/en/intro.md index 23197af1..e0cc5693 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -42,8 +42,8 @@ We recommend using `uv` for dependency management. === "Step 1: Clone Repository" ```bash - git clone https://github.com/agentscope-ai/agentscope-tuner.git - cd agentscope-tuner + git clone https://github.com/modelscope/AgentJet.git + cd AgentJet ``` === "Step 2: Setup Environment" diff --git a/docs/en/introduction.md b/docs/en/introduction.md index d0972335..231cf2fc 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -32,8 +32,8 @@ We recommend using `uv` for dependency management. 1. **Clone the Repository**: ```bash -git clone https://github.com/agentscope-ai/agentscope-tuner.git -cd agentscope-tuner +git clone https://github.com/modelscope/AgentJet.git +cd AgentJet ``` diff --git a/docs/index.md b/docs/index.md index 885fc11f..548d3394 100644 --- a/docs/index.md +++ b/docs/index.md @@ -25,8 +25,8 @@ We recommend using `uv` for dependency management. **1. Clone the Repository:** ```bash -git clone https://github.com/agentscope-ai/agentscope-tuner.git -cd agentscope-tuner +git clone https://github.com/modelscope/AgentJet.git +cd AgentJet ``` **2. Set up Environment:** diff --git a/docs/zh/beast_logger.md b/docs/zh/beast_logger.md index 5788290e..8249e811 100644 --- a/docs/zh/beast_logger.md +++ b/docs/zh/beast_logger.md @@ -7,7 +7,7 @@ Beast-logger 是一个面向 LLM 系统构建的日志工具包,能够提供 --- -## 在 agentscope-tuner 中使用 +## 在 AgentJet 中使用
    使用流程
    @@ -16,7 +16,7 @@ Beast-logger 是一个面向 LLM 系统构建的日志工具包,能够提供
    1. 启动训练 -使用 agentscope-tuner 的 launcher 启动训练或调试。
    2. +使用 AgentJet 的 launcher 启动训练或调试。
    3. 等待数据生成 等待第一个 batch 完成,日志文件会自动生成。
    4. @@ -36,7 +36,7 @@ Beast-logger 是一个面向 LLM 系统构建的日志工具包,能够提供 ### Step 1:启动训练 -使用 agentscope-tuner 的 launcher 启动训练或调试。 +使用 AgentJet 的 launcher 启动训练或调试。 ### Step 2:找到日志文件 diff --git a/docs/zh/installation.md b/docs/zh/installation.md index eb98fd65..10d993cc 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -23,13 +23,13 @@ 从 GitHub 克隆 AgentScope Tuner 仓库,并进入项目目录: ```bash -git clone https://github.com/agentscope-ai/agentscope-tuner.git -cd agentscope-tuner +git clone https://github.com/modelscope/AgentJet.git +cd AgentJet ``` ### Step 2:安装依赖 -AgentScope-Tuner 支持多种训练后端(backbone),目前包括 `verl` 和 `trinity`(推荐)。 +AgentJet 支持多种训练后端(backbone),目前包括 `verl` 和 `trinity`(推荐)。 !!! info "包管理器" 我们推荐使用 `uv` 来管理 Python 环境,因为它速度非常快。参考 [`uv` 安装文档](https://docs.astral.sh/uv/getting-started/installation/)。 @@ -79,7 +79,7 @@ AgentScope-Tuner 支持多种训练后端(backbone),目前包括 `verl` ### 运行 Docker 容器 -以下命令会将您当前工作目录(agentscope-tuner 的根目录)挂载到容器内的 `/workspace`,并将您的数据目录挂载到容器内的 `/data`: +以下命令会将您当前工作目录(agentjet 的根目录)挂载到容器内的 `/workspace`,并将您的数据目录挂载到容器内的 `/data`: ```bash docker run -it \ @@ -88,7 +88,7 @@ docker run -it \ --rm \ -v $PWD:/workspace \ -v /path/to/your/checkpoint/and/data:/data \ - agentscope-tuner:latest + agentjet:latest ``` --- diff --git a/docs/zh/intro.md b/docs/zh/intro.md index 8b97a60c..4c9f2a1f 100644 --- a/docs/zh/intro.md +++ b/docs/zh/intro.md @@ -48,8 +48,8 @@ ASTuner 还提供了高分辨率的日志记录和调试方案: === "步骤 1:克隆仓库" ```bash - git clone https://github.com/agentscope-ai/agentscope-tuner.git - cd agentscope-tuner + git clone https://github.com/modelscope/AgentJet.git + cd AgentJet ``` === "步骤 2:设置环境" diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index 6e0e5190..d8408bae 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -32,8 +32,8 @@ 1. **克隆仓库**: ```bash -git clone https://github.com/agentscope-ai/agentscope-tuner.git -cd agentscope-tuner +git clone https://github.com/modelscope/AgentJet.git +cd AgentJet ``` diff --git a/mkdocs.yml b/mkdocs.yml index f69cace4..f08bbfb4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,9 +1,9 @@ -site_name: AgentScope Tuner -site_url: https://agentscope-ai.github.io/agentscope-tuner/ +site_name: AgentJet +site_url: https://agentscope-ai.github.io/AgentJet/ site_description: "A cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes." site_author: "Alibaba Tongyi Lab" -repo_url: https://github.com/agentscope-ai/agentscope-tuner -repo_name: agentscope-ai/agentscope-tuner +repo_url: https://github.com/modelscope/AgentJet +repo_name: modelscope/AgentJet copyright: "Copyright © 2025 Alibaba Tongyi Lab" theme: name: shadcn diff --git a/pyproject.toml b/pyproject.toml index bb7d718b..d299a2ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=65", "wheel"] build-backend = "setuptools.build_meta" [project] -name = "AgentScope-Tuner" +name = "AgentJet" version = "0.1.0" readme = "README.md" classifiers = [ @@ -33,14 +33,14 @@ dependencies = [ [project.optional-dependencies] -trinity = [ - "trinity-rft @ git+https://github.com/modelscope/Trinity-RFT.git" -] - verl = [ "verl-bundle[vllm]==0.5.0.post2", ] +trinity = [ + "trinity-rft @ git+https://github.com/modelscope/Trinity-RFT.git" +] + dev = [ "pre-commit>=2.17.0", "black>=23.7.0", @@ -102,4 +102,4 @@ known_third_party = ["wandb"] [project.urls] -"Homepage" = "https://github.com/agentscope-ai/AgentScope-Tuner" +"Homepage" = "https://github.com/modelscope/AgentJet" From 2975931ee1bd34ae47a2f7941885ef2a131adfb7 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 6 Jan 2026 14:56:45 +0800 Subject: [PATCH 379/462] rename project to agent-jet --- README.md | 22 +++++++++++----------- ajet/backbone/__init__.py | 8 ++++---- ajet/backbone/main_verl.py | 4 ++-- ajet/backbone/trainer_trinity.py | 4 ++-- ajet/backbone/trainer_verl.py | 2 +- ajet/cli/job.py | 6 +++--- ajet/default_config/trinity/README.md | 6 +++--- ajet/default_config/trinity/README_ZH.md | 4 ++-- docs/en/example_learning_to_ask.md | 4 ++-- docs/en/intro.md | 16 ++++++++-------- docs/en/introduction.md | 22 +++++++++++----------- docs/en/tune_your_first_agent.md | 6 +++--- docs/en/workflow.md | 8 ++++---- docs/index.md | 14 +++++++------- docs/zh/example_learning_to_ask.md | 4 ++-- docs/zh/intro.md | 18 +++++++++--------- docs/zh/introduction.md | 20 ++++++++++---------- docs/zh/tune_your_first_agent.md | 10 +++++----- docs/zh/workflow.md | 8 ++++---- tutorial/example_learn2ask/learn2ask.md | 2 +- 20 files changed, 94 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index e0d3578e..74853860 100644 --- a/README.md +++ b/README.md @@ -26,17 +26,17 @@ Let's begin with the simplest example: a math agent with a tool call. We aim to build a easy-to-learn Agent tuner that unlock more possibilities for agent developers: -- **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. -- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. -- **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=verl`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](docs/en/installation.md) backbone. **把verl换成默认BB** -- **Flexible and Fast**. ASTuner supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. +- **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. +- **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). -For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: - +For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: + -- **High-Resolution Logging**: ASTuner allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. -- **Fast Debugging**: ASTuner also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. +- **High-Resolution Logging**: AgentJet allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. +- **Fast Debugging**: AgentJet also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. --- @@ -79,14 +79,14 @@ Explore our rich library of examples to kickstart your journey: - 🐺 [**Developing Werewolves RPG agents and training them**](docs/en/example_werewolves.md). - 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](docs/en/example_learning_to_ask.md). - 🎴 [**Writing a countdown game using AgentScope and solving it**](docs/en/example_countdown.md). -- 🚶 [**Solving a frozen lake walking puzzle using ASTuner**](docs/en/example_frozenlake.md). +- 🚶 [**Solving a frozen lake walking puzzle using AgentJet**](docs/en/example_frozenlake.md). --- ### 🧩 Core Concepts -ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. +AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic.
      image @@ -124,7 +124,7 @@ The internal system orchestrates several specialized modules to handle the compl ## 🗺️ Roadmap -ASTuner is a constantly evolving project. We are planning to add the following features in the near future. +AgentJet is a constantly evolving project. We are planning to add the following features in the near future. - [ ] Advanced LLM-based multi-agent reinforcement learning. - [ ] Training dataset generation from few-shot samples. diff --git a/ajet/backbone/__init__.py b/ajet/backbone/__init__.py index 7364d0ff..4233c9dd 100644 --- a/ajet/backbone/__init__.py +++ b/ajet/backbone/__init__.py @@ -2,15 +2,15 @@ try: from ajet.backbone.trainer_trinity import ( - ASTunerTaskReader, - ASTunerWorkflowWrap, + AjetTaskReader, + AjetWorkflowWrap, TrinityRolloutManager, ) __all__ = [ "TrinityRolloutManager", - "ASTunerWorkflowWrap", - "ASTunerTaskReader", + "AjetWorkflowWrap", + "AjetTaskReader", ] except ImportError: logger.warning("trinity is not available.") diff --git a/ajet/backbone/main_verl.py b/ajet/backbone/main_verl.py index fc1af4e4..8a2146c1 100644 --- a/ajet/backbone/main_verl.py +++ b/ajet/backbone/main_verl.py @@ -245,10 +245,10 @@ def run(self, config): train_dataset = task_to_standard_dataset(task_reader.get_training_tasks()) train_sampler = create_rl_sampler(config.data, train_dataset) - from ajet.backbone.trainer_verl import ASTunerRayPPOTrainer + from ajet.backbone.trainer_verl import AjetRayPPOTrainer # Initialize the PPO trainer. - trainer = ASTunerRayPPOTrainer( + trainer = AjetRayPPOTrainer( config=config, tokenizer=tokenizer, processor=processor, diff --git a/ajet/backbone/trainer_trinity.py b/ajet/backbone/trainer_trinity.py index 01ab8f5b..4ed3a6d0 100644 --- a/ajet/backbone/trainer_trinity.py +++ b/ajet/backbone/trainer_trinity.py @@ -93,7 +93,7 @@ async def run_in_new_thread(self) -> MultiAgentContextTracker: @WORKFLOWS.register_module("astuner_workflow") -class ASTunerWorkflowWrap(Workflow): +class AjetWorkflowWrap(Workflow): is_async: bool = True def __init__( @@ -189,7 +189,7 @@ async def run_async(self): try: @READER.register_module("ajet") - class ASTunerTaskReader(TaskFileReader): + class AjetTaskReader(TaskFileReader): def __init__(self, config): self.config = config self.read_batch_size = config.batch_size diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index 35337795..bd8662af 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -196,7 +196,7 @@ def compute_advantage( return data -class ASTunerRayPPOTrainer(RayPPOTrainer): +class AjetRayPPOTrainer(RayPPOTrainer): """Distributed PPO trainer using Ray for scalable reinforcement learning. Slightly modified from RayPPOTrainer in verl. """ diff --git a/ajet/cli/job.py b/ajet/cli/job.py index 67d7ba4b..9605d3e3 100644 --- a/ajet/cli/job.py +++ b/ajet/cli/job.py @@ -1,4 +1,4 @@ -"""Programmatic training entry point for ASTuner. +"""Programmatic training entry point for AgentJet. This class mirrors the CLI launcher by materializing a YAML config and spawning a subprocess to run the existing training pipeline. The goal is to @@ -33,7 +33,7 @@ class AstunerJob: - """Lightweight builder that launches ASTuner training as a subprocess.""" + """Lightweight builder that launches AgentJet training as a subprocess.""" def __init__( self, @@ -73,7 +73,7 @@ def build_job_from_yaml(self, yaml_path: str | None) -> dict: exp_dir=self.exp_dir_final, ) self.config_as_dict = expand_astune_hierarchical_config(self.config_as_dict, write_to=None) - logger.info(f"Built ASTuner job config: {yaml_path}") + logger.info(f"Built AgentJet job config: {yaml_path}") return self.config_as_dict def dump_job_as_yaml(self, yaml_path: str) -> str: diff --git a/ajet/default_config/trinity/README.md b/ajet/default_config/trinity/README.md index 1f4d662c..40c6a019 100644 --- a/ajet/default_config/trinity/README.md +++ b/ajet/default_config/trinity/README.md @@ -1,10 +1,10 @@ # Trinity Configuration Guide 🛠️ -## How to Modify Trinity Configuration in ASTuner +## How to Modify Trinity Configuration in AgentJet -1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `ajet/default_config/astune_default.yaml` configuration file, and ASTuner will **automatically** handle parameter mapping for you. +1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `ajet/default_config/astune_default.yaml` configuration file, and AgentJet will **automatically** handle parameter mapping for you. -2. ⚙️ **Special Cases**: Some Trinity tuning parameters are not yet mapped in ASTuner. You can refer to Trinity’s documentation and modify them in the following format: +2. ⚙️ **Special Cases**: Some Trinity tuning parameters are not yet mapped in AgentJet. You can refer to Trinity’s documentation and modify them in the following format: ```yaml trinity: diff --git a/ajet/default_config/trinity/README_ZH.md b/ajet/default_config/trinity/README_ZH.md index 7f343e44..4b97d2d3 100644 --- a/ajet/default_config/trinity/README_ZH.md +++ b/ajet/default_config/trinity/README_ZH.md @@ -3,9 +3,9 @@ ## 如何修改 Trinity 配置 1. 🎯 **推荐方式**:在大多数情况下,您无需直接调整 Trinity 参数,只需参考并修改上层的 `ajet/default_config/astune_default.yaml` 配置文件即可, - ASTuner 会**自动**帮您完成参数映射。 + AgentJet 会**自动**帮您完成参数映射。 -2. ⚙️ **特殊情况**:部分 Trinity 调优参数目前尚未在 ASTuner 中建立映射,您可以参考 Trinity 的文档,然后通过以下形式进行修改: +2. ⚙️ **特殊情况**:部分 Trinity 调优参数目前尚未在 AgentJet 中建立映射,您可以参考 Trinity 的文档,然后通过以下形式进行修改: ```yaml trinity: diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index 59a00aa0..c815014e 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -65,11 +65,11 @@ If the results are incorrect, the quickest troubleshooting points include: wheth #### 3.1 What happens each step -This tutorial trains a model to **ask the next best question** from a short doctor–patient chat history. Concretely, each training step takes one conversation context from `train.jsonl`, asks the agent to generate **exactly one follow-up question** (optionally with answer options), and then uses an LLM judge to score whether that question is useful and relevant. ASTuner uses this score as the reward signal to update the policy, so the model gradually learns to ask better questions instead of answering directly. +This tutorial trains a model to **ask the next best question** from a short doctor–patient chat history. Concretely, each training step takes one conversation context from `train.jsonl`, asks the agent to generate **exactly one follow-up question** (optionally with answer options), and then uses an LLM judge to score whether that question is useful and relevant. AgentJet uses this score as the reward signal to update the policy, so the model gradually learns to ask better questions instead of answering directly. #### 3.2 YAML Configuration -The whole example is “wired” in the YAML and implemented in one file. In the YAML, `task_reader` provides the dataset split, `rollout.agentscope_workflow` tells ASTuner which workflow to run for each sample, and `task_judge` provides the reward entry that wraps the LLM judge. The `model` section decides which pretrained backbone you start from. +The whole example is “wired” in the YAML and implemented in one file. In the YAML, `task_reader` provides the dataset split, `rollout.agentscope_workflow` tells AgentJet which workflow to run for each sample, and `task_judge` provides the reward entry that wraps the LLM judge. The `model` section decides which pretrained backbone you start from. ```yaml ajet: diff --git a/docs/en/intro.md b/docs/en/intro.md index e0cc5693..59b3aff1 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -1,6 +1,6 @@ # Introduction -**AgentScope Tuner (ASTuner)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentScope Tuner (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! @@ -11,20 +11,20 @@ Simply provide your AgentScope workflow, training data, and reward function, and We aim to build an easy-to-learn AgentScope tuner that unlocks more possibilities for agent developers: !!! tip "Multi-Agent Support" - ASTuner supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by **1.5x to 20x** when the workflow involves multi-turn (or multi-agent) conversations. + AgentJet supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by **1.5x to 20x** when the workflow involves multi-turn (or multi-agent) conversations. !!! info "Reliability & Reproducibility" Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/). ### For Advanced Researchers -ASTuner also provides high-resolution logging and debugging solutions: +AgentJet also provides high-resolution logging and debugging solutions: | Feature | Description | |---------|-------------| @@ -78,17 +78,17 @@ Explore our rich library of examples to kickstart your journey:

      Werewolves Game

      Developing Werewolves RPG agents and training them for strategic gameplay.

      Learning to Ask

      Learning to ask questions like a doctor for medical consultation scenarios.

      Countdown Game

      Writing a countdown game using AgentScope and solving it with RL.

      -

      Frozen Lake

      Solving a frozen lake walking puzzle using ASTuner's reinforcement learning.

      +

      Frozen Lake

      Solving a frozen lake walking puzzle using AgentJet's reinforcement learning.

      --- ## Core Concepts -ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. +AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic.
      -ASTuner Architecture +AgentJet Architecture
      ### 1. The User-Centric Interface @@ -119,6 +119,6 @@ The internal system orchestrates several specialized modules to handle the compl ## Next Steps diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 231cf2fc..573a1943 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -1,6 +1,6 @@ # Introduction -**AgentScope Tuner (ASTuner)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentScope Tuner (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! @@ -10,17 +10,17 @@ Simply provide your AgentScope workflow, training data, and reward function, and We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: -- **Easy and Friendly**. ASTuner helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. -- **Rich Tutorial Library**. ASTuner provides a rich library of [examples](#example-library) as tutorials. -- **Efficient and Scalable**. ASTuner uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. -- **Flexible and Fast**. ASTuner supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. +- **Rich Tutorial Library**. AgentJet provides a rich library of [examples](#example-library) as tutorials. +- **Efficient and Scalable**. AgentJet uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). -For advanced researchers, ASTuner also provides high-resolution logging and debugging solutions: - +For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: + -- **High-Resolution Logging**: ASTuner allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. -- **Fast Debugging**: ASTuner also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. +- **High-Resolution Logging**: AgentJet allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. +- **Fast Debugging**: AgentJet also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. --- @@ -63,14 +63,14 @@ Explore our rich library of examples to kickstart your journey: - [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). - [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). - [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). -- [**Solving a frozen lake walking puzzle using ASTuner**](./example_frozenlake.md). +- [**Solving a frozen lake walking puzzle using AgentJet**](./example_frozenlake.md). --- ### Core Concepts -ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. +AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic.
      image diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 9976a1da..e2649db1 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -89,13 +89,13 @@ defaults: The agent needs to be trained in a specific task environment, driven by training data. !!! info "Data Sources" - ASTuner provides multiple ways to read data: + AgentJet provides multiple ways to read data: - Read from local files on disk - Read from a Hugging Face repo - Read from an EnvService -All data will be converted into a unified ASTuner data format after loading. +All data will be converted into a unified AgentJet data format after loading. In this example, we will use the `openai/gsm8k` dataset from Hugging Face: @@ -126,7 +126,7 @@ ajet: ## Step 4: Prepare the Workflow -In ASTuner, a workflow is the basic unit for training. It defines: +In AgentJet, a workflow is the basic unit for training. It defines: - Agent's behavior and tools - Interaction procedure with the environment diff --git a/docs/en/workflow.md b/docs/en/workflow.md index 10773ab0..a2bcbffa 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -3,7 +3,7 @@ This tutorial introduces how to define a trainable workflow with AgentScope. !!! info "Two Approaches" - ASTuner provides two convenient and **mutually compatible** ways to wrap an AgentScope Workflow: + AgentJet provides two convenient and **mutually compatible** ways to wrap an AgentScope Workflow: - **Simple**: Emphasizes simplicity, ease of use, and readability - **Advanced**: Emphasizes flexibility, controllability, and extensibility @@ -12,7 +12,7 @@ This tutorial introduces how to define a trainable workflow with AgentScope. ## Simple Agent Scenario -### 1. Convert Your AgentScope Workflow in ASTuner +### 1. Convert Your AgentScope Workflow in AgentJet Simply set ReActAgent's `model` argument to `model_tuner` when initializing your agent. @@ -117,7 +117,7 @@ class ExampleMathLearn(Workflow): ## Advanced Agent Scenario -When designing a **multi-agent collaborative** workflow where each agent plays a different **role**, ASTuner provides enhanced training and debugging capabilities. +When designing a **multi-agent collaborative** workflow where each agent plays a different **role**, AgentJet provides enhanced training and debugging capabilities. !!! success "Multi-Agent Benefits" With a multi-agent setup, you can: @@ -157,7 +157,7 @@ class ExampleMathLearn(Workflow): !!! note "Shared Parameters" Regardless of role differences, all agents share a single model instance (one set of parameters playing different roles). -### 2. Promote to An Advanced ASTuner Workflow +### 2. Promote to An Advanced AgentJet Workflow
      Conversion Steps
      diff --git a/docs/index.md b/docs/index.md index 548d3394..5fbc616c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # AgentScope Tuner -**AgentScope Tuner (ASTuner)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentScope Tuner (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! @@ -9,7 +9,7 @@ Simply provide your AgentScope workflow, training data, and reward function, and ## Key Features @@ -58,17 +58,17 @@ Explore our rich library of examples to kickstart your journey:

      Werewolves Game

      Developing Werewolves RPG agents and training them for strategic gameplay.

      Learning to Ask

      Learning to ask questions like a doctor for medical consultation scenarios.

      Countdown Game

      Writing a countdown game using AgentScope and solving it with RL.

      -

      Frozen Lake

      Solving a frozen lake walking puzzle using ASTuner's reinforcement learning.

      +

      Frozen Lake

      Solving a frozen lake walking puzzle using AgentJet's reinforcement learning.

      --- ## Core Concepts -ASTuner makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. +AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic.
      -ASTuner Architecture +AgentJet Architecture
      ### The User-Centric Interface @@ -97,7 +97,7 @@ The internal system orchestrates several specialized modules: ## For Advanced Researchers -ASTuner provides high-resolution logging and debugging solutions: +AgentJet provides high-resolution logging and debugging solutions: !!! tip "High-Resolution Logging" Save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. @@ -110,7 +110,7 @@ ASTuner provides high-resolution logging and debugging solutions: ## Next Steps
      -

      Installation

      Set up ASTuner environment and dependencies.

      +

      Installation

      Set up AgentJet environment and dependencies.

      Quick Start

      Run your first training in minutes.

      First Agent

      Build and train your own agent from scratch.

      Examples

      Explore detailed training examples.

      diff --git a/docs/zh/example_learning_to_ask.md b/docs/zh/example_learning_to_ask.md index 5937fd7d..35d4fde4 100644 --- a/docs/zh/example_learning_to_ask.md +++ b/docs/zh/example_learning_to_ask.md @@ -60,11 +60,11 @@ ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with- #### 3.1 每个训练 step -本教程训练的目标是:基于一段简短的医生–患者对话历史,让模型学会**提出下一个最合适的问题**。具体来说,每个训练 step 会从 `train.jsonl` 中取出一条对话上下文,让智能体生成**恰好一个**追问(可选地带有答案选项),随后使用一个 LLM judge 来评估这个问题是否**有用**且**相关**。ASTuner 将该评分作为奖励信号更新策略,于是模型会逐渐学会提出更好的问题,而不是直接给出回答。 +本教程训练的目标是:基于一段简短的医生–患者对话历史,让模型学会**提出下一个最合适的问题**。具体来说,每个训练 step 会从 `train.jsonl` 中取出一条对话上下文,让智能体生成**恰好一个**追问(可选地带有答案选项),随后使用一个 LLM judge 来评估这个问题是否**有用**且**相关**。AgentJet 将该评分作为奖励信号更新策略,于是模型会逐渐学会提出更好的问题,而不是直接给出回答。 #### 3.2 YAML 配置说明 -整个例子主要通过 YAML 完成配置信息,实现代码则集中在一个文件里。在 YAML 中,`task_reader` 提供数据集划分;`rollout.agentscope_workflow` 告诉 ASTuner 对每条样本需要运行哪个 workflow;`task_judge` 提供封装了 LLM judge 的奖励入口;`model` 部分决定训练从哪个预训练 backbone 开始。 +整个例子主要通过 YAML 完成配置信息,实现代码则集中在一个文件里。在 YAML 中,`task_reader` 提供数据集划分;`rollout.agentscope_workflow` 告诉 AgentJet 对每条样本需要运行哪个 workflow;`task_judge` 提供封装了 LLM judge 的奖励入口;`model` 部分决定训练从哪个预训练 backbone 开始。 ```yaml ajet: diff --git a/docs/zh/intro.md b/docs/zh/intro.md index 4c9f2a1f..a89b6f98 100644 --- a/docs/zh/intro.md +++ b/docs/zh/intro.md @@ -1,6 +1,6 @@ # 项目简介 -**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +**AgentScope Tuner (AgentJet)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的智能体达到最佳性能! @@ -12,9 +12,9 @@
      --  **简单友好** — ASTuner 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 +-  **简单友好** — AgentJet 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 --  **丰富的教程库** — ASTuner 提供了丰富的[示例库](#example-library)作为学习教程。 +-  **丰富的教程库** — AgentJet 提供了丰富的[示例库](#example-library)作为学习教程。 - 数学智能体、狼人杀游戏、AppWorld 等 查看示例 -  **高效且可扩展** — 默认使用 [Trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。 @@ -23,14 +23,14 @@
      !!! tip "多智能体支持" - ASTuner 支持 [多智能体工作流](./workflow.md),并采用上下文合并技术,当工作流涉及多轮(或多智能体)对话时,可将训练速度提升 **1.5 倍至 20 倍**。 + AgentJet 支持 [多智能体工作流](./workflow.md),并采用上下文合并技术,当工作流涉及多轮(或多智能体)对话时,可将训练速度提升 **1.5 倍至 20 倍**。 !!! info "可靠性与可复现性" 我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现。 ### 面向进阶研究者 -ASTuner 还提供了高分辨率的日志记录和调试方案: +AgentJet 还提供了高分辨率的日志记录和调试方案: | 功能 | 说明 | |------|------| @@ -84,17 +84,17 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --w

      狼人杀游戏

      开发狼人杀 RPG 智能体并训练它们进行策略博弈。

      学会提问

      学习像医生一样在医疗咨询场景中进行提问。

      倒计时游戏

      使用 AgentScope 编写倒计时游戏并用 RL 求解。

      -

      冰湖问题

      使用 ASTuner 的强化学习解决冰湖行走谜题。

      +

      冰湖问题

      使用 AgentJet 的强化学习解决冰湖行走谜题。

      --- ## 核心概念 -ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。 +AgentJet 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。
      -ASTuner 架构图 +AgentJet 架构图
      ### 1. 以用户为中心的接口 @@ -125,6 +125,6 @@ ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调 ## 下一步 diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index d8408bae..5bf5fa0d 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -1,6 +1,6 @@ # 项目简介 -**AgentScope Tuner (ASTuner)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +**AgentScope Tuner (AgentJet)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的智能体达到最佳性能! @@ -10,16 +10,16 @@ 我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: -* **简单友好**:ASTuner 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 -* **丰富的教程库**:ASTuner 提供了丰富的 [示例库](#id6) 作为学习教程。 -* **高效且可扩展**:ASTuner 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 -* **灵活且快速**:ASTuner 支持 [多智能体工作流](./workflow.md),并采用了上下文合并技术。当工作流涉及多轮(或多 智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 +* **简单友好**:AgentJet 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 +* **丰富的教程库**:AgentJet 提供了丰富的 [示例库](#id6) 作为学习教程。 +* **高效且可扩展**:AgentJet 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 +* **灵活且快速**:AgentJet 支持 [多智能体工作流](./workflow.md),并采用了上下文合并技术。当工作流涉及多轮(或多 智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 * **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 -针对进阶研究者,ASTuner 还提供了高分辨率的日志记录和调试方案: +针对进阶研究者,AgentJet 还提供了高分辨率的日志记录和调试方案: -* **高分辨率日志**:ASTuner 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和 智能体 诊断。 -* **快速调试**:ASTuner 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 +* **高分辨率日志**:AgentJet 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和 智能体 诊断。 +* **快速调试**:AgentJet 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 --- @@ -65,13 +65,13 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --w * **[开发并训练"狼人杀"RPG智能体](./example_werewolves.md)**。 * **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 * **[使用 AgentScope 编写并解决"倒计时"游戏](./example_countdown.md)**。 -* **[使用 ASTuner 解决"冰湖"行走谜题](./example_frozenlake.md)**。 +* **[使用 AgentJet 解决"冰湖"行走谜题](./example_frozenlake.md)**。 --- ### 核心概念 -ASTuner 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。 +AgentJet 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。
      image diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index 5e8b8f4e..8164cdf7 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -85,13 +85,13 @@ defaults: 智能体需要在指定的任务环境下,使用训练数据驱动进行训练。 !!! info "支持的数据源" - ASTuner 提供了多种读取数据的方式: + AgentJet 提供了多种读取数据的方式: - 从本地硬盘中的文件读取 - 从 HuggingFace Repo 中读取 - 从 EnvService 中读取 - 所有数据在读取后,都会被转换为 ASTuner 中统一的数据格式。 + 所有数据在读取后,都会被转换为 AgentJet 中统一的数据格式。 在本示例中,我们将直接从 HuggingFace Repo 获取 `openai/gsm8k` 作为训练数据。 @@ -125,13 +125,13 @@ ajet: | `max_prompt_length` | 输入的最大 token 长度 | | `max_response_length` | 回复的最大 token 长度 | -至此,我们就完成了数据相关的全部配置,剩余的工作将由 ASTuner 自动完成。 +至此,我们就完成了数据相关的全部配置,剩余的工作将由 AgentJet 自动完成。 --- ## 准备 Workflow -在 ASTuner 中,workflow 是进行训练的基本单元。它定义了智能体的行为、工具、上下文等,智能体与环境交互的具体流程,以及 Reward 的计算方法。 +在 AgentJet 中,workflow 是进行训练的基本单元。它定义了智能体的行为、工具、上下文等,智能体与环境交互的具体流程,以及 Reward 的计算方法。 我们将在 `workflow.py` 中实现我们的 workflow。 @@ -262,7 +262,7 @@ ajet: ``` !!! info "关于 Judge" - 这里我们使用 ASTuner 内部提供的 math judge。Judge 会读取 metadata 中的 `final_answer`,并与数据集中的 ground_truth 对比来得到评分。 + 这里我们使用 AgentJet 内部提供的 math judge。Judge 会读取 metadata 中的 `final_answer`,并与数据集中的 ground_truth 对比来得到评分。 --- diff --git a/docs/zh/workflow.md b/docs/zh/workflow.md index b3876548..8c664ed2 100644 --- a/docs/zh/workflow.md +++ b/docs/zh/workflow.md @@ -3,7 +3,7 @@ 本教程介绍如何在 AgentScope 中定义一个可训练的工作流(Workflow)。 !!! info "两种封装方式" - ASTuner 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封装方式: + AgentJet 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封装方式: - **简单模式**:强调简单、易用、容易理解 - **进阶模式**:强调灵活、可控、易扩展 @@ -12,7 +12,7 @@ ## 简单智能体场景 -### 1. 在 ASTuner 中转换你的 AgentScope Workflow +### 1. 在 AgentJet 中转换你的 AgentScope Workflow **只需要在初始化 ReActAgent 时,把 `model` 参数替换为 `model_tuner` 即可。** @@ -119,7 +119,7 @@ class ExampleMathLearn(Workflow): ## 进阶智能体场景 -当设计的是一个**多智能体协作**的复杂 Workflow,并且每个智能体扮演不同**角色**时,如果 ASTuner 能够「知道」每个智能体的身份,那么在训练和调试时就能提供更好的能力和更高的可控性。 +当设计的是一个**多智能体协作**的复杂 Workflow,并且每个智能体扮演不同**角色**时,如果 AgentJet 能够「知道」每个智能体的身份,那么在训练和调试时就能提供更好的能力和更高的可控性。 !!! success "进阶模式的优势" 通过多智能体协作,您可以: @@ -159,7 +159,7 @@ class ExampleMathLearn(Workflow): !!! info "模型共享" 无论角色异同,所有智能体(角色)共享一个模型实例。也就是说,具有相同参数的模型将分别扮演不同的角色。 -### 2. 升级为进阶 ASTuner Workflow +### 2. 升级为进阶 AgentJet Workflow 本节通过一个简单的例子展示使用 `ModelTuner.register_model` 为不同角色注册「可训练模型」。 diff --git a/tutorial/example_learn2ask/learn2ask.md b/tutorial/example_learn2ask/learn2ask.md index a642c3ae..f67a01b4 100644 --- a/tutorial/example_learn2ask/learn2ask.md +++ b/tutorial/example_learn2ask/learn2ask.md @@ -40,7 +40,7 @@ In this workflow, we implement: The agent reads the messages between a doctor and a patient, and tries predicting the next question to collect information and diagnose the patient. The question is judged by a LLM to check if it is valuable and relevant. ## 3. Prepare Training Configuration -Next, we need a YAML configuration file to tell ASTuner what data, workflow, reward to use. +Next, we need a YAML configuration file to tell AgentJet what data, workflow, reward to use. In `tutorial/example_learn2ask/learn2ask.yaml`, we set them respectively: - Set experiment name. From 32470f5b3afbf9d616e89fc5e435f3643ec8cbbf Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 6 Jan 2026 15:02:19 +0800 Subject: [PATCH 380/462] rename project name --- ajet/backbone/trainer_trinity.py | 4 ++-- ajet/cli/launcher.py | 4 ++-- ajet/task_rollout/native_parallel_worker.py | 2 +- ajet/utils/core_env_vars.py | 10 +++++----- ajet/utils/testing_utils.py | 10 +++++----- pyproject.toml | 1 + tests/bench/benchmark_base.py | 6 +++--- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/ajet/backbone/trainer_trinity.py b/ajet/backbone/trainer_trinity.py index 4ed3a6d0..9b9b750a 100644 --- a/ajet/backbone/trainer_trinity.py +++ b/ajet/backbone/trainer_trinity.py @@ -30,9 +30,9 @@ def get_astune_config_from_trinity_side(): - yaml_path = os.environ.get("ASTUNER_CONFIG_REDIRECT", None) + yaml_path = os.environ.get("AJET_CONFIG_REDIRECT", None) if yaml_path is None: - raise ValueError("ASTUNER_CONFIG_REDIRECT is not set in environment variables") + raise ValueError("AJET_CONFIG_REDIRECT is not set in environment variables") astune_config = read_astune_config_with_cache(yaml_path) return astune_config diff --git a/ajet/cli/launcher.py b/ajet/cli/launcher.py index 856ffe8f..099de6b1 100644 --- a/ajet/cli/launcher.py +++ b/ajet/cli/launcher.py @@ -223,9 +223,9 @@ def setup_environment_vars(args, exp_config, main_yaml_fp): if args.conf: assert exp_config["ajet"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": - env["ASTUNER_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore + env["AJET_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore if args.backbone == "debug": - env["ASTUNER_DEBUG"] = "1" # type: ignore + env["AJET_DEBUG"] = "1" # type: ignore return env diff --git a/ajet/task_rollout/native_parallel_worker.py b/ajet/task_rollout/native_parallel_worker.py index 35f76ba5..578f4ac6 100644 --- a/ajet/task_rollout/native_parallel_worker.py +++ b/ajet/task_rollout/native_parallel_worker.py @@ -480,7 +480,7 @@ def trajectories_to_samples(self, tracker_array: List[BaseContextTracker]) -> Li finally: tracker.generate_log(global_step=self.current_global_steps) if os.environ.get("BEST_LOGGER_PATH", None) and os.environ.get( - "ASTUNER_DEBUG", None + "AJET_DEBUG", None ): logger.success( f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]" diff --git a/ajet/utils/core_env_vars.py b/ajet/utils/core_env_vars.py index 01920824..9cd9c809 100644 --- a/ajet/utils/core_env_vars.py +++ b/ajet/utils/core_env_vars.py @@ -19,16 +19,16 @@ def get_runtime_env(is_trinity: bool = False) -> dict: "TRINITY_PLUGIN_DIRS": str((Path(__file__).parent.parent / "backbone").resolve()), # "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), - "ASTUNER_CONFIG_REDIRECT": os.getenv("ASTUNER_CONFIG_REDIRECT", ""), + "AJET_CONFIG_REDIRECT": os.getenv("AJET_CONFIG_REDIRECT", ""), } } optional_env_vars = [ "RAY_record_task_actor_creation_sites", "BEST_LOGGER_WEB_SERVICE_URL", - "ASTUNER_GIT_HASH", - "ASTUNER_REQ_TXT", - "ASTUNER_BENCHMARK_NAME", + "AJET_GIT_HASH", + "AJET_REQ_TXT", + "AJET_BENCHMARK_NAME", ] for var in optional_env_vars: @@ -36,7 +36,7 @@ def get_runtime_env(is_trinity: bool = False) -> dict: runtime_env["env_vars"].update({var: os.getenv(var, "")}) if is_trinity: - assert "ASTUNER_CONFIG_REDIRECT" in runtime_env["env_vars"] + assert "AJET_CONFIG_REDIRECT" in runtime_env["env_vars"] print_dict(runtime_env["env_vars"], "runtime_env") return runtime_env diff --git a/ajet/utils/testing_utils.py b/ajet/utils/testing_utils.py index bdf0757e..2f61ddde 100644 --- a/ajet/utils/testing_utils.py +++ b/ajet/utils/testing_utils.py @@ -143,14 +143,14 @@ def populate_test_env_metadata(workspace_dir: str) -> tuple[str, str]: def update_benchmark_status(status, status_detail, append_log="", data_dashboard_url=""): - if "ASTUNER_GIT_HASH" not in os.environ: + if "AJET_GIT_HASH" not in os.environ: raise RuntimeError( - "ASTUNER_GIT_HASH not found in environment variables. Please set `ajet.execute_test=False`." + "AJET_GIT_HASH not found in environment variables. Please set `ajet.execute_test=False`." ) - git_hash = os.environ["ASTUNER_GIT_HASH"] - req_txt = os.environ["ASTUNER_REQ_TXT"] - target_name = os.environ["ASTUNER_BENCHMARK_NAME"] + git_hash = os.environ["AJET_GIT_HASH"] + req_txt = os.environ["AJET_REQ_TXT"] + target_name = os.environ["AJET_BENCHMARK_NAME"] if not append_log: append_log = status_detail diff --git a/pyproject.toml b/pyproject.toml index d299a2ad..f3a1db21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ dependencies = [ "pydantic", "beast-logger>=0.1.3", "pytest>=8.0.0", + "pip", ] diff --git a/tests/bench/benchmark_base.py b/tests/bench/benchmark_base.py index 2c3a27f7..df478a34 100644 --- a/tests/bench/benchmark_base.py +++ b/tests/bench/benchmark_base.py @@ -31,9 +31,9 @@ def execute_benchmark( workspace_dir = Path(__file__).resolve().parents[2] git_hash, req_txt = populate_test_env_metadata(str(workspace_dir)) - os.environ["ASTUNER_GIT_HASH"] = git_hash - os.environ["ASTUNER_REQ_TXT"] = req_txt - os.environ["ASTUNER_BENCHMARK_NAME"] = target_name + os.environ["AJET_GIT_HASH"] = git_hash + os.environ["AJET_REQ_TXT"] = req_txt + os.environ["AJET_BENCHMARK_NAME"] = target_name if pre_launch: pre_launch() From c3fb51ae74d9ba6ed176fcf1c6f78aa110d10e01 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 6 Jan 2026 15:29:25 +0800 Subject: [PATCH 381/462] rename project --- .gitignore | 1 - ajet/__init__.py | 4 +- ajet/backbone/main_vllm.py | 2 +- ajet/backbone/trainer_trinity.py | 44 +++++++++---------- ajet/backbone/trainer_verl.py | 4 +- ajet/cli/job.py | 20 ++++----- .../agentscope_tracker/multiagent_tracking.py | 6 +-- ajet/context_tracker/basic_tracker.py | 10 ++--- .../{astune_default.py => ajet_default.py} | 30 ++++++------- ...{astune_default.yaml => ajet_default.yaml} | 2 +- ajet/default_config/trinity/README.md | 4 +- ajet/default_config/trinity/README_ZH.md | 4 +- .../trinity/trinity_default.yaml | 10 ++--- .../trinity/trinity_launch.yaml | 6 +-- ajet/default_config/verl/verl_default.yaml | 6 +-- ajet/schema/extended_msg.py | 12 ++--- ajet/task_reader/__init__.py | 2 +- ajet/task_rollout/async_llm_bridge.py | 8 ++-- ajet/task_runner/agentscope_runner.py | 4 +- ajet/utils/config_utils.py | 18 ++++---- ajet/utils/tokenizer.py | 2 +- docs/_config.yml | 2 +- docs/en/configuration.md | 10 ++--- docs/en/data_generation.md | 2 +- docs/en/data_pipeline.md | 4 +- docs/en/example_tracing_feedback_loop.md | 2 +- docs/en/intro.md | 4 +- docs/en/introduction.md | 4 +- docs/en/quickstart.md | 8 ++-- docs/en/task_judger.md | 2 +- docs/en/tune_your_first_agent.md | 4 +- docs/index.md | 4 +- docs/zh/configuration.md | 12 ++--- docs/zh/data_pipeline.md | 4 +- docs/zh/example.md | 2 +- docs/zh/example_tracing_feedback_loop.md | 2 +- docs/zh/example_werewolves.md | 2 +- docs/zh/installation.md | 4 +- docs/zh/intro.md | 2 +- docs/zh/introduction.md | 2 +- docs/zh/quickstart.md | 8 ++-- docs/zh/task_judger.md | 2 +- docs/zh/tune_your_first_agent.md | 4 +- docs/zh/visualization.md | 2 +- mini_test.py | 4 +- .../benchmark_appworld.yaml | 2 +- .../benchmark_appworld_2nodes.yaml | 2 +- .../benchmark_countdown.yaml | 2 +- .../benchmark_frozenlake.yaml | 2 +- .../benchmark_learn2ask.yaml | 2 +- .../bench/benchmark_math/benchmark_math.yaml | 2 +- tests/config_test.py | 16 +++---- tests/data_gen.py | 4 +- tutorial/example_appworld/appworld.md | 16 +++---- tutorial/example_appworld/appworld.yaml | 2 +- tutorial/example_countdown/countdown.yaml | 2 +- tutorial/example_feedback_tracing/README.md | 2 +- .../example_feedback_tracing.yaml | 2 +- .../example_frozenlake/frozenlake_easy.yaml | 2 +- .../example_frozenlake/frozenlake_hard.yaml | 2 +- tutorial/example_learn2ask/learn2ask.yaml | 2 +- tutorial/example_math_agent/math_agent.md | 6 +-- tutorial/example_math_agent/math_agent.yaml | 2 +- .../math_answer_as_judge.py | 4 +- .../example_rm_auto_grader/auto_grader.md | 2 +- tutorial/example_rubrics_judge/math_agent.md | 6 +-- tutorial/example_rubrics_judge/r_judge.yaml | 2 +- tutorial/example_werewolves/werewolves.md | 14 +++--- tutorial/example_werewolves/werewolves.yaml | 2 +- 69 files changed, 197 insertions(+), 198 deletions(-) rename ajet/default_config/{astune_default.py => ajet_default.py} (78%) rename ajet/default_config/{astune_default.yaml => ajet_default.yaml} (99%) diff --git a/.gitignore b/.gitignore index 59bb052c..3c4ba3d1 100644 --- a/.gitignore +++ b/.gitignore @@ -138,7 +138,6 @@ launcher_record .trash trinity_checkpoints -astune_test good_trinity_checkpoints _resources auto/auto_grader.json diff --git a/ajet/__init__.py b/ajet/__init__.py index 74030ac9..feb7cf0e 100644 --- a/ajet/__init__.py +++ b/ajet/__init__.py @@ -1,4 +1,4 @@ -from ajet.cli.job import AstunerJob +from ajet.cli.job import AgentJetJob from ajet.schema.task import WorkflowOutput, WorkflowTask from ajet.tuner import ModelTuner from ajet.workflow import Workflow @@ -8,7 +8,7 @@ "WorkflowTask", "WorkflowOutput", "ModelTuner", - "AstunerJob", + "AgentJetJob", ] __version__ = "0.1.0" diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index ba681593..64219228 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -119,7 +119,7 @@ def run(config): @hydra.main( config_path="ajet/default_config", - config_name="astune_default", + config_name="ajet_default", version_base=None, ) def main(config): diff --git a/ajet/backbone/trainer_trinity.py b/ajet/backbone/trainer_trinity.py index 9b9b750a..d4c0c517 100644 --- a/ajet/backbone/trainer_trinity.py +++ b/ajet/backbone/trainer_trinity.py @@ -23,18 +23,18 @@ MultiAgentContextTracker, ) from ajet.schema.trajectory import Sample -from ajet.task_reader import dict_to_astuner_task +from ajet.task_reader import dict_to_ajet_task from ajet.task_rollout.native_parallel_worker import DynamicRolloutManager -from ajet.utils.config_utils import read_astune_config_with_cache +from ajet.utils.config_utils import read_ajet_config_with_cache from ajet.utils.testing_utils import _test_if_test_mode -def get_astune_config_from_trinity_side(): +def get_ajet_config_from_trinity_side(): yaml_path = os.environ.get("AJET_CONFIG_REDIRECT", None) if yaml_path is None: raise ValueError("AJET_CONFIG_REDIRECT is not set in environment variables") - astune_config = read_astune_config_with_cache(yaml_path) - return astune_config + ajet_config = read_ajet_config_with_cache(yaml_path) + return ajet_config class TrinityRolloutManager(DynamicRolloutManager): @@ -67,7 +67,7 @@ def __init__( def convert_task(self, task: TrinityTask): from ajet.schema.task import Task assert isinstance(task.raw_task, dict) - return dict_to_astuner_task(task.raw_task) + return dict_to_ajet_task(task.raw_task) def thread_worker(self): observation_window = { @@ -75,11 +75,11 @@ def thread_worker(self): "step": [0], "token": [0], } - astune_task = self.convert_task(self.task) + ajet_task = self.convert_task(self.task) return self.rollout_env_worker( - task=astune_task, + task=ajet_task, task_batch_index=0, - task_tag=f"T{astune_task.task_id}#R", + task_tag=f"T{ajet_task.task_id}#R", mode="sample" if not self.is_eval else "validate", task_thread_index=0, observation_window=observation_window, @@ -92,7 +92,7 @@ async def run_in_new_thread(self) -> MultiAgentContextTracker: ) -@WORKFLOWS.register_module("astuner_workflow") +@WORKFLOWS.register_module("ajet_workflow") class AjetWorkflowWrap(Workflow): is_async: bool = True @@ -115,14 +115,14 @@ def __init__( self.answer = task.raw_task.get(task.format_args.response_key) # type: ignore [index] async def run_async(self): - astune_config = get_astune_config_from_trinity_side() - warm_up_process(astune_config) + ajet_config = get_ajet_config_from_trinity_side() + warm_up_process(ajet_config) tracker = await TrinityRolloutManager( is_eval=self.is_eval, task=self.task, llm_handle=self.model_client, tokenizer=AutoTokenizer.from_pretrained(self.model_client.model_path), - config=astune_config, + config=ajet_config, ).run_in_new_thread() sample_final = [] @@ -195,7 +195,7 @@ def __init__(self, config): self.read_batch_size = config.batch_size self.split = config.split - astune_config = get_astune_config_from_trinity_side() + ajet_config = get_ajet_config_from_trinity_side() from ajet.task_reader import ( RouterTaskReader, @@ -203,8 +203,8 @@ def __init__(self, config): ) task_reader = RouterTaskReader( - astune_config.ajet.task_reader.type, - astune_config.ajet.task_reader, + ajet_config.ajet.task_reader.type, + ajet_config.ajet.task_reader, ) dataset_segments = [] @@ -304,7 +304,7 @@ def __init__(self, project: str, group: str, name: str, role: str, config) -> No # Determine experiment name exp_name = monitor_args.get("experiment_name") or f"{name}_{role}" self.exp_name = exp_name - astune_config = get_astune_config_from_trinity_side() + ajet_config = get_ajet_config_from_trinity_side() # Prepare init kwargs, passing only non-None values to respect library defaults init_kwargs = { @@ -317,7 +317,7 @@ def __init__(self, project: str, group: str, name: str, role: str, config) -> No "mode": monitor_args.get("mode") or "cloud", "settings": monitor_args.get("settings"), "id": monitor_args.get("id"), - "config": astune_config, + "config": ajet_config, "resume": monitor_args.get("resume"), "reinit": monitor_args.get("reinit"), } @@ -357,14 +357,14 @@ def log(self, data: dict, step: int, commit: bool = False) -> None: swanlab.log(data, step=step) self.console_logger.info(f"Step {step}: {data}") - astune_config = get_astune_config_from_trinity_side() - experiment_dir = astune_config.ajet.experiment_dir + ajet_config = get_ajet_config_from_trinity_side() + experiment_dir = ajet_config.ajet.experiment_dir trinity_log = f"{experiment_dir}/{self.exp_name}.log" with open(trinity_log, "a") as f: f.write(f"Step {step}: {data}\n") - if astune_config.ajet.execute_test: # apply a test probe + if ajet_config.ajet.execute_test: # apply a test probe if "critic/score/mean" in data: return if "experience_pipeline/group_advantages/reward_mean/mean" not in data: @@ -375,7 +375,7 @@ def log(self, data: dict, step: int, commit: bool = False) -> None: test_robot_data["reward_for_test_robot"] = data[ "experience_pipeline/group_advantages/reward_mean/mean" ] - _test_if_test_mode(key="reward_probe", value=test_robot_data, config=astune_config) + _test_if_test_mode(key="reward_probe", value=test_robot_data, config=ajet_config) def close(self) -> None: try: diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index bd8662af..fcc532de 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -52,7 +52,7 @@ from ajet.backbone.warm_up import warm_up_process from ajet.context_tracker.basic_tracker import BaseContextTracker from ajet.schema.task import Task -from ajet.task_reader import dict_to_astuner_task +from ajet.task_reader import dict_to_ajet_task from ajet.task_rollout.native_parallel_worker import VerlRolloutManager @@ -554,7 +554,7 @@ def fit(self): # noqa: C901 self.async_rollout_manager.wake_up() logger.info("=== wake up end ===") tasks: List[Task] = [ - dict_to_astuner_task(dict( + dict_to_ajet_task(dict( task_id=gen_batch.non_tensor_batch["task_id"][i], main_query=gen_batch.non_tensor_batch["main_query"][i], env_type=gen_batch.non_tensor_batch["env_type"][i], diff --git a/ajet/cli/job.py b/ajet/cli/job.py index 9605d3e3..7d6c470e 100644 --- a/ajet/cli/job.py +++ b/ajet/cli/job.py @@ -22,17 +22,17 @@ get_backbone_target, setup_environment_vars, ) -from ajet.default_config.astune_default import Config +from ajet.default_config.ajet_default import Config from ajet.utils.config_utils import ( - expand_astune_hierarchical_config, + expand_ajet_hierarchical_config, prepare_experiment_config, - read_astune_hierarchical_config, + read_ajet_hierarchical_config, ) from ajet.utils.dynamic_import import cls_to_path from ajet.utils.launch_utils import execute_training_process -class AstunerJob: +class AgentJetJob: """Lightweight builder that launches AgentJet training as a subprocess.""" def __init__( @@ -63,16 +63,16 @@ def __init__( self.config.ajet.rollout.tensor_model_parallel_size = 1 def build_job_from_yaml(self, yaml_path: str | None) -> dict: - self.exp_name = datetime.now().strftime("astuner_job_%Y%m%d_%H%M%S") + self.exp_name = datetime.now().strftime("ajet_job_%Y%m%d_%H%M%S") self.exp_dir_final = "saved_experiments" - self.config_as_dict = read_astune_hierarchical_config( + self.config_as_dict = read_ajet_hierarchical_config( yaml_path, exp_name=self.exp_name, backbone=self.backbone, write_to=None, exp_dir=self.exp_dir_final, ) - self.config_as_dict = expand_astune_hierarchical_config(self.config_as_dict, write_to=None) + self.config_as_dict = expand_ajet_hierarchical_config(self.config_as_dict, write_to=None) logger.info(f"Built AgentJet job config: {yaml_path}") return self.config_as_dict @@ -86,7 +86,7 @@ def dump_job_as_yaml(self, yaml_path: str) -> str: def set_workflow( self, workflow: Union[str, Callable[..., Any]], ensure_reward_in_workflow: bool = False - ) -> "AstunerJob": + ) -> "AgentJetJob": self.config.ajet.rollout.agentscope_workflow = cls_to_path(workflow) # TODO: validate workflow outputs contain reward # ensure_reward_in_workflow @@ -98,7 +98,7 @@ def set_data( dataset_path: str, training_split: str = "train", validation_split: str = "test", - ) -> "AstunerJob": + ) -> "AgentJetJob": """Configure the task reader. Defaults to HuggingFace datasets.""" # available types: @@ -118,7 +118,7 @@ def set_data( return self - def tune(self, *args, **kwargs) -> "AstunerJob": + def tune(self, *args, **kwargs) -> "AgentJetJob": ast_cfg = self.config.ajet if not ast_cfg.rollout or not ast_cfg.rollout.agentscope_workflow: raise ValueError("Workflow must be set via set_workflow before tuning.") diff --git a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py index 5b1b3067..b21bc69b 100644 --- a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -18,7 +18,7 @@ from ajet.schema.trajectory import Reward from ajet.utils.color_hsl import adjust_color_hsl from ajet.utils.compute_madness import compute_string_madness -from ajet.utils.tokenizer import astune_apply_chat_template +from ajet.utils.tokenizer import ajet_apply_chat_template class MultiAgentContextTracker(BaseContextTracker): @@ -426,7 +426,7 @@ def group_tokenize(self): def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore dict_messages = self.to_role_content(ext_messages) - prompt_text = astune_apply_chat_template( + prompt_text = ajet_apply_chat_template( tokenizer=self.tokenizer, conversation=dict_messages, tools=tools, @@ -446,7 +446,7 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], def check_context_token_num_safe( self, messages: List, tools: List = [] ) -> Tuple[bool, bool, str]: - prompt_text = astune_apply_chat_template( + prompt_text = ajet_apply_chat_template( tokenizer=self.tokenizer, conversation=messages, tools=tools, diff --git a/ajet/context_tracker/basic_tracker.py b/ajet/context_tracker/basic_tracker.py index 7336139d..f7169628 100644 --- a/ajet/context_tracker/basic_tracker.py +++ b/ajet/context_tracker/basic_tracker.py @@ -10,7 +10,7 @@ replace_token_ids, ) from ajet.schema.trajectory import Reward, Sample -from ajet.utils.tokenizer import astune_apply_chat_template +from ajet.utils.tokenizer import ajet_apply_chat_template class BaseContextTracker(BaseTracker): @@ -73,14 +73,14 @@ def get_token_inc_from_llm_response( # completion_token_arr will contain generation_prompt header completion_token_arr, _ = self.get_inc( - astune_apply_chat_template( + ajet_apply_chat_template( tokenizer=self.tokenizer, conversation=input_msg_ref, tokenize=False, tools=tools, add_generation_prompt=False, ), - astune_apply_chat_template( + ajet_apply_chat_template( tokenizer=self.tokenizer, conversation=input_msg_ref + [llm_output_role_content], tokenize=False, @@ -418,14 +418,14 @@ def compute_reference_advantage(tracker_array: List): def get_generation_prompt_token(self): dummy_msg = [{"role": "assistant", "content": "dummy text"}] self.generation_prompt_token, _ = self.get_inc( - astune_apply_chat_template( + ajet_apply_chat_template( tokenizer=self.tokenizer, conversation=dummy_msg, tools=[], add_generation_prompt=False, tokenize=False, ), - astune_apply_chat_template( + ajet_apply_chat_template( tokenizer=self.tokenizer, conversation=dummy_msg, tools=[], diff --git a/ajet/default_config/astune_default.py b/ajet/default_config/ajet_default.py similarity index 78% rename from ajet/default_config/astune_default.py rename to ajet/default_config/ajet_default.py index 5f1637b0..4bc1ff59 100644 --- a/ajet/default_config/astune_default.py +++ b/ajet/default_config/ajet_default.py @@ -3,30 +3,30 @@ @dataclass -class AstunerAlgorithm: +class AjetAlgorithm: adv_estimator: str = "grpo" @dataclass -class AstunerTrainerCommon: +class AjetTrainerCommon: n_gpus_per_node: int = 8 - algorithm: AstunerAlgorithm = field(default_factory=AstunerAlgorithm) + algorithm: AjetAlgorithm = field(default_factory=AjetAlgorithm) @dataclass -class AstunerModel: +class AjetModel: path: str = "/path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct" @dataclass -class AstunerData: +class AjetData: max_prompt_length: int = 3000 max_response_length: int = 15000 train_batch_size: int = 32 @dataclass -class AstunerRollout: +class AjetRollout: agentscope_workflow: str = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow" n_vllm_engine: int = 1 tensor_model_parallel_size: int = 1 @@ -40,28 +40,28 @@ class HuggingfaceDatRepo: @dataclass -class AstunerTaskReader: +class AjetTaskReader: type: str = "huggingface_dat_repo" huggingface_dat_repo: HuggingfaceDatRepo = field(default_factory=HuggingfaceDatRepo) @dataclass -class AstunerDefaultConfig: - project_name: str = "astune_default_project" +class AjetDefaultConfig: + project_name: str = "ajet_default_project" experiment_name: str = "read_yaml_name" experiment_dir: str = "auto" backbone: str = "debug" - model: AstunerModel = field(default_factory=AstunerModel) - data: AstunerData = field(default_factory=AstunerData) - rollout: AstunerRollout = field(default_factory=AstunerRollout) - trainer_common: AstunerTrainerCommon = field(default_factory=AstunerTrainerCommon) - task_reader: AstunerTaskReader = field(default_factory=AstunerTaskReader) + model: AjetModel = field(default_factory=AjetModel) + data: AjetData = field(default_factory=AjetData) + rollout: AjetRollout = field(default_factory=AjetRollout) + trainer_common: AjetTrainerCommon = field(default_factory=AjetTrainerCommon) + task_reader: AjetTaskReader = field(default_factory=AjetTaskReader) @dataclass class Config: - ajet: AstunerDefaultConfig = field(default_factory=AstunerDefaultConfig) + ajet: AjetDefaultConfig = field(default_factory=AjetDefaultConfig) @staticmethod def _to_dict(obj: Any) -> Any: diff --git a/ajet/default_config/astune_default.yaml b/ajet/default_config/ajet_default.yaml similarity index 99% rename from ajet/default_config/astune_default.yaml rename to ajet/default_config/ajet_default.yaml index 8cdf7c7c..309b51ce 100644 --- a/ajet/default_config/astune_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -1,6 +1,6 @@ # ------------------ main configuration ------------------ ajet: - project_name: "astune_default_project" + project_name: "ajet_default_project" experiment_name: "read_yaml_name" experiment_dir: "auto" # {exp-dir}/{experiment_name} backbone: debug # `debug` or `trinity` or `verl` diff --git a/ajet/default_config/trinity/README.md b/ajet/default_config/trinity/README.md index 40c6a019..0fb7dec2 100644 --- a/ajet/default_config/trinity/README.md +++ b/ajet/default_config/trinity/README.md @@ -2,7 +2,7 @@ ## How to Modify Trinity Configuration in AgentJet -1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `ajet/default_config/astune_default.yaml` configuration file, and AgentJet will **automatically** handle parameter mapping for you. +1. 🎯 **Recommended Method**: In most cases, you do not need to directly adjust Trinity parameters. Simply refer to and modify the upper-level `ajet/default_config/ajet_default.yaml` configuration file, and AgentJet will **automatically** handle parameter mapping for you. 2. ⚙️ **Special Cases**: Some Trinity tuning parameters are not yet mapped in AgentJet. You can refer to Trinity’s documentation and modify them in the following format: @@ -18,7 +18,7 @@ trinity: ## Configuration Mapping Modification 🔄 -Some ASTune configurations overlap with Trinity. +Some AgentJet configurations overlap with Trinity. You can configure mappings via the `ajet/default_config/trinity/config_auto_convertion_trinity.jsonc` file. ## Trinity Hyperparameter Quick Guide 📊 diff --git a/ajet/default_config/trinity/README_ZH.md b/ajet/default_config/trinity/README_ZH.md index 4b97d2d3..1f3a02f0 100644 --- a/ajet/default_config/trinity/README_ZH.md +++ b/ajet/default_config/trinity/README_ZH.md @@ -2,7 +2,7 @@ ## 如何修改 Trinity 配置 -1. 🎯 **推荐方式**:在大多数情况下,您无需直接调整 Trinity 参数,只需参考并修改上层的 `ajet/default_config/astune_default.yaml` 配置文件即可, +1. 🎯 **推荐方式**:在大多数情况下,您无需直接调整 Trinity 参数,只需参考并修改上层的 `ajet/default_config/ajet_default.yaml` 配置文件即可, AgentJet 会**自动**帮您完成参数映射。 2. ⚙️ **特殊情况**:部分 Trinity 调优参数目前尚未在 AgentJet 中建立映射,您可以参考 Trinity 的文档,然后通过以下形式进行修改: @@ -19,7 +19,7 @@ trinity: ## 配置映射修改 🔄 -某些 ASTune 配置与 Trinity 存在重叠, +某些 AgentJet 配置与 Trinity 存在重叠, 可通过 `ajet/default_config/trinity/config_auto_convertion_trinity.jsonc` 文件进行映射配置 ## Trinity 超参数简明指南 📊 diff --git a/ajet/default_config/trinity/trinity_default.yaml b/ajet/default_config/trinity/trinity_default.yaml index c3e6c458..53be9a2a 100644 --- a/ajet/default_config/trinity/trinity_default.yaml +++ b/ajet/default_config/trinity/trinity_default.yaml @@ -1,6 +1,6 @@ -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD trinity: algorithm: @@ -19,7 +19,7 @@ trinity: explorer_input: eval_tasksets: [] taskset: - default_workflow_type: astuner_workflow + default_workflow_type: ajet_workflow format: prompt_key: question response_key: answer @@ -36,7 +36,7 @@ trinity: trainer_input: experience_buffer: max_read_timeout: 18000 - name: "astuner_experience_buffer" + name: "ajet_experience_buffer" storage_type: queue replay_buffer: enable: false diff --git a/ajet/default_config/trinity/trinity_launch.yaml b/ajet/default_config/trinity/trinity_launch.yaml index 4a5d333a..8b6f679d 100644 --- a/ajet/default_config/trinity/trinity_launch.yaml +++ b/ajet/default_config/trinity/trinity_launch.yaml @@ -1,6 +1,6 @@ -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD algorithm: algorithm_type: multi_step_grpo diff --git a/ajet/default_config/verl/verl_default.yaml b/ajet/default_config/verl/verl_default.yaml index 6cae84d0..cb10884d 100644 --- a/ajet/default_config/verl/verl_default.yaml +++ b/ajet/default_config/verl/verl_default.yaml @@ -1,6 +1,6 @@ -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD -# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/astune_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD +# DO NOT EDIT: THIS FILE IS READ ONLY and ALWAYS FIXED, EDIT `ajet/default_config/ajet_default.yaml` INSTEAD ajet: rollout: diff --git a/ajet/schema/extended_msg.py b/ajet/schema/extended_msg.py index 840325a9..7ed77bf8 100644 --- a/ajet/schema/extended_msg.py +++ b/ajet/schema/extended_msg.py @@ -4,7 +4,7 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from ajet.utils.tokenizer import astune_apply_chat_template +from ajet.utils.tokenizer import ajet_apply_chat_template # import numpy as np # INVALID_LOG_PROB_VALUE = np.inf # when debuging, set to np.inf, if anything goes wrong, we can sense that immediately @@ -126,7 +126,7 @@ def auto_tokenize(self, tokenizer, tools): } if self.tool_calls: auto_tokenize_target.update({"tool_calls": self.tool_calls}) - self.token_arr = astune_apply_chat_template( + self.token_arr = ajet_apply_chat_template( tokenizer=tokenizer, conversation=[auto_tokenize_target], tokenize=True, @@ -143,7 +143,7 @@ def auto_tokenize_non_first_message(self, tokenizer, tools): } if self.tool_calls: auto_tokenize_target.update({"tool_calls": self.tool_calls}) - text_frag_to = astune_apply_chat_template( + text_frag_to = ajet_apply_chat_template( tokenizer=tokenizer, conversation=DUMMY_MSG + [auto_tokenize_target], tokenize=False, @@ -154,7 +154,7 @@ def auto_tokenize_non_first_message(self, tokenizer, tools): f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}" ) self.token_arr, _ = self.get_inc_simple( - text_frag_from=astune_apply_chat_template( + text_frag_from=ajet_apply_chat_template( tokenizer=tokenizer, conversation=DUMMY_MSG, tokenize=False, @@ -307,14 +307,14 @@ def merge_tool_group(group, tokenizer): {"role": msg.role, "content": msg.content_for_future} for msg in group ] merged.token_arr, _ = merged.get_inc_simple( - text_frag_from=astune_apply_chat_template( + text_frag_from=ajet_apply_chat_template( tokenizer=tokenizer, conversation=DUMMY_MSG, tokenize=False, tools=merged.tools, add_generation_prompt=False, ), - text_frag_to=astune_apply_chat_template( + text_frag_to=ajet_apply_chat_template( tokenizer, conversation=DUMMY_MSG + auto_tokenize_targets, tokenize=False, diff --git a/ajet/task_reader/__init__.py b/ajet/task_reader/__init__.py index 9d72a30d..19a1a8e3 100644 --- a/ajet/task_reader/__init__.py +++ b/ajet/task_reader/__init__.py @@ -103,7 +103,7 @@ def task_to_standard_dataset(tasks: List[Task]) -> datasets.Dataset: return datasets.Dataset.from_dict(data) -def dict_to_astuner_task(task_dict: dict) -> Task: +def dict_to_ajet_task(task_dict: dict) -> Task: """ Convert a dictionary to a Task object. diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index 37169171..0d199919 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -20,7 +20,7 @@ from ajet.schema.logprob import TokenAndProb from ajet.utils.async_utils import run_async_coroutine_with_timeout from ajet.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode -from ajet.utils.tokenizer import astune_apply_chat_template +from ajet.utils.tokenizer import ajet_apply_chat_template class AsyncLlmBridge(object): @@ -54,7 +54,7 @@ def llm_chat( updated_sampling_params.update(custom_sampling_params) input_messages = copy.deepcopy(messages) - prompt_text = astune_apply_chat_template( + prompt_text = ajet_apply_chat_template( tokenizer=self.tokenizer, conversation=input_messages, tools=tools, @@ -275,11 +275,11 @@ async def __call__( logger.warning(f"[{info}] detected.") self.context_tracker.context_overflow = True if token_overflow: - # astune_action_when_overflow = self.config.ajet.rollout.astune_action_when_overflow + # ajet_action_when_overflow = self.config.ajet.rollout.ajet_action_when_overflow # cannot proceed due to context overflow return ChatResponse( content=[ - {"type": "text", "text": "astune_proxy: Exceeded max model context length."} + {"type": "text", "text": "ajet_proxy: Exceeded max model context length."} ], ) # else: # otherwise, for abnormal output, can still proceed, but we do not track output anymore diff --git a/ajet/task_runner/agentscope_runner.py b/ajet/task_runner/agentscope_runner.py index 2c28bc5f..e6bfca88 100644 --- a/ajet/task_runner/agentscope_runner.py +++ b/ajet/task_runner/agentscope_runner.py @@ -59,13 +59,13 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: assert not isinstance( raw_reward, list - ), "ASTune will support step reward in future versions." + ), "AgentJet will support step reward in future versions." # register reward # TODO: support multi-step reward reward = Reward( raw_reward=raw_reward, - raw_step_reward=None, # "ASTune will support step reward in future versions." + raw_step_reward=None, # "AgentJet will support step reward in future versions." success_rate=1.0 if is_success else 0.0, madness=0, description="", diff --git a/ajet/utils/config_utils.py b/ajet/utils/config_utils.py index 31a0c341..4408555f 100644 --- a/ajet/utils/config_utils.py +++ b/ajet/utils/config_utils.py @@ -12,7 +12,7 @@ from ajet.utils.config_computer import split_keys_and_operators -def read_astune_config(yaml_fp): +def read_ajet_config(yaml_fp): """Load a Hydra configuration relative to this module.""" yaml_fp = os.path.relpath( yaml_fp, os.path.dirname(__file__) @@ -29,9 +29,9 @@ def load_hydra_config(config_path: str, config_name: str) -> DictConfig: @cache -def read_astune_config_with_cache(yaml_fp): +def read_ajet_config_with_cache(yaml_fp): """Load a Hydra configuration relative to this module with caching.""" - return read_astune_config(yaml_fp) + return read_ajet_config(yaml_fp) def dump_yaml_config(cfg: DictConfig, yaml_fp: str): @@ -167,7 +167,7 @@ def config_safe_guard(config: dict, backbone: str) -> dict: return config -def read_astune_hierarchical_config( +def read_ajet_hierarchical_config( yaml_fp, exp_name, backbone, write_to=None, exp_dir="saved_experiments" ): if yaml_fp is None: @@ -183,7 +183,7 @@ def read_astune_hierarchical_config( "defaults": [ "verl_default", "trinity_default", - "astune_default", + "ajet_default", "_self_", ], } @@ -216,7 +216,7 @@ def read_astune_hierarchical_config( return config -def expand_astune_hierarchical_config(config, write_to=None): +def expand_ajet_hierarchical_config(config, write_to=None): # create temp yaml file import tempfile @@ -224,7 +224,7 @@ def expand_astune_hierarchical_config(config, write_to=None): yaml_path = temp_yaml.name with open(yaml_path, "w") as file: yaml.dump(config, file) - full_config = read_astune_config(yaml_path) + full_config = read_ajet_config(yaml_path) yaml_path = dump_yaml_config(full_config, yaml_fp=yaml_path) # put inherit info back with open(yaml_path, "r") as file: @@ -316,9 +316,9 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): shutil.copyfile(yaml_backup_src, yaml_backup_dst) ## 4. edit new yaml - config = read_astune_hierarchical_config( + config = read_ajet_hierarchical_config( yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst, exp_dir=exp_dir ) - config_final = expand_astune_hierarchical_config(config, write_to=yaml_backup_dst) + config_final = expand_ajet_hierarchical_config(config, write_to=yaml_backup_dst) return yaml_backup_dst, exe_exp_base, exp_name, config_final diff --git a/ajet/utils/tokenizer.py b/ajet/utils/tokenizer.py index f02e311b..94ab8007 100644 --- a/ajet/utils/tokenizer.py +++ b/ajet/utils/tokenizer.py @@ -20,7 +20,7 @@ def cleanup_messages(messages: List[Dict]) -> List[Dict]: return messages_copied -def astune_apply_chat_template( +def ajet_apply_chat_template( tokenizer, conversation, tools, diff --git a/docs/_config.yml b/docs/_config.yml index cf084dae..fe7ad2ea 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,7 +1,7 @@ # Book settings # Learn more at https://jupyterbook.org/customize/config.html -project: "AgentScope Tuner" +project: "AgentJet" title: "AgentScope
      Tuner" author: Alibaba Tongyi Lab logo: logo.png diff --git a/docs/en/configuration.md b/docs/en/configuration.md index 76c7fee2..9830fca2 100644 --- a/docs/en/configuration.md +++ b/docs/en/configuration.md @@ -1,15 +1,15 @@ # Configuration -This page provides a detailed description of the configuration files for AgentScope Tuner. +This page provides a detailed description of the configuration files for AgentJet. --- ## Overview -AgentScope Tuner uses YAML-format configuration files to set up data, algorithms, rewards, logging, and other runtime behaviors. +AgentJet uses YAML-format configuration files to set up data, algorithms, rewards, logging, and other runtime behaviors. !!! info "Default Configuration" - The default config is located at `ajet/default_config/astune_default.yaml`. + The default config is located at `ajet/default_config/ajet_default.yaml`. At a high level, a typical config contains a single root section `ajet`, which is divided into several logical parts: @@ -129,7 +129,7 @@ ajet: ### Backend Selection -AgentScope Tuner supports three training backends: +AgentJet supports three training backends: | Backend | Description | |---------|-------------| @@ -269,7 +269,7 @@ All experiment outputs are saved in `./launcher_record/{experiment_name}`: ??? example "Complete Configuration Template" ```yaml title="config.yaml" ajet: - project_name: "astuner_default_project" + project_name: "ajet_default_project" experiment_name: "read_yaml_name" experiment_dir: "auto" backbone: debug diff --git a/docs/en/data_generation.md b/docs/en/data_generation.md index ae23058e..23bca456 100644 --- a/docs/en/data_generation.md +++ b/docs/en/data_generation.md @@ -74,7 +74,7 @@ cp your-document.pdf dataset/document/ ### Step 2: Generate Training Tasks #### Method 1: Integrate Data Generation into the Training Pipeline -Copy and modify the key configuration parameters in `ajet/default_config/astune_default.yaml`, and set `ajet.task_reader.type` to `data_generation` to enable this reader. +Copy and modify the key configuration parameters in `ajet/default_config/ajet_default.yaml`, and set `ajet.task_reader.type` to `data_generation` to enable this reader. ```yaml ajet: diff --git a/docs/en/data_pipeline.md b/docs/en/data_pipeline.md index 01e586ba..e128209e 100644 --- a/docs/en/data_pipeline.md +++ b/docs/en/data_pipeline.md @@ -1,6 +1,6 @@ # Task Reader -AgentScope Tuner loads training tasks from various data sources through Task Reader. This page covers the Task schema definition and different built-in Task Readers for common scenarios. +AgentJet loads training tasks from various data sources through Task Reader. This page covers the Task schema definition and different built-in Task Readers for common scenarios. --- @@ -71,7 +71,7 @@ class Task(BaseModel): ## Built-in Task Readers -AgentScope Tuner provides multiple built-in Task Readers for different scenarios. The framework automatically routes to the correct reader based on `ajet.task_reader.type`. +AgentJet provides multiple built-in Task Readers for different scenarios. The framework automatically routes to the correct reader based on `ajet.task_reader.type`. ### Quick Selection Guide diff --git a/docs/en/example_tracing_feedback_loop.md b/docs/en/example_tracing_feedback_loop.md index 73346703..eaddc6a6 100644 --- a/docs/en/example_tracing_feedback_loop.md +++ b/docs/en/example_tracing_feedback_loop.md @@ -1,6 +1,6 @@ # Tracing-Feedback Loop -ASTune allows you to recycle the chat logs generated during an Agent's execution and continuously improve the Agent through iterative training, which we call **Tracing-Feedback Training**. It provides features +AgentJet allows you to recycle the chat logs generated during an Agent's execution and continuously improve the Agent through iterative training, which we call **Tracing-Feedback Training**. It provides features + Loading tracing log from agentscope studio database + Converting log into formatted data diff --git a/docs/en/intro.md b/docs/en/intro.md index 59b3aff1..249d5e06 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -1,6 +1,6 @@ # Introduction -**AgentScope Tuner (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentJet (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! @@ -8,7 +8,7 @@ Simply provide your AgentScope workflow, training data, and reward function, and ## Features -We aim to build an easy-to-learn AgentScope tuner that unlocks more possibilities for agent developers: +We aim to build an easy-to-learn AgentJet that unlocks more possibilities for agent developers:

      Easy and Friendly

      AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort.

      diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 573a1943..db40a922 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -1,6 +1,6 @@ # Introduction -**AgentScope Tuner (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentJet (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! @@ -8,7 +8,7 @@ Simply provide your AgentScope workflow, training data, and reward function, and ### Features -We aim to build a easy-to-learn AgentScope tuner that unlock more possibilities for agent developers: +We aim to build a easy-to-learn AgentJet that unlock more possibilities for agent developers: - **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](#example-library) as tutorials. diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index c8fc4b47..e08d7bda 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -1,6 +1,6 @@ # Quick Start -AgentScope Tuner provides a complete feature set for tuning agents. You can try starting training an agent right away: +AgentJet provides a complete feature set for tuning agents. You can try starting training an agent right away: ```bash ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray @@ -25,7 +25,7 @@ Check out the [installation guide](./installation.md) to set up the training env Write an Agent class (e.g., `MathToolWorkflow`) that inherits from the base Workflow class.
    5. Configure and Run -Use the `AstunerJob` API to configure and start training.
    6. +Use the `AgentJetJob` API to configure and start training.
    @@ -33,11 +33,11 @@ Use the `AstunerJob` API to configure and start training. ### Code Example ```python title="train_math_agent.py" -from ajet import AstunerJob +from ajet import AgentJetJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "YOUR_MODEL_PATH" -job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) +job = AgentJetJob(n_gpu=8, algorithm='grpo', model=model_path) job.set_workflow(MathToolWorkflow) job.set_data(type="hf", dataset_path='openai/gsm8k') diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index 346cf724..671c9d60 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -50,7 +50,7 @@ class BaseJudge: ## Built-in Task Judgers -AgentScope Tuner provides three built-in judgers for common evaluation scenarios: +AgentJet provides three built-in judgers for common evaluation scenarios: ### 1. MathAnswerAsJudge diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index e2649db1..321cc2c7 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -33,7 +33,7 @@ Launch the training process and track progress. After completing this guide, you will: - Obtain a Math Agent that can solve math problems using Python - - Understand the core concepts in AgentScope Tuner + - Understand the core concepts in AgentJet - Learn how to design your own training pipeline --- @@ -78,7 +78,7 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astuner_default + - ajet_default - _self_ ``` diff --git a/docs/index.md b/docs/index.md index 5fbc616c..6740fa5e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ -# AgentScope Tuner +# AgentJet -**AgentScope Tuner (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentJet (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md index e99a2ebe..7cdb693c 100644 --- a/docs/zh/configuration.md +++ b/docs/zh/configuration.md @@ -1,15 +1,15 @@ # 配置指南 -本页对 AgentScope Tuner 的配置文件进行详细说明。 +本页对 AgentJet 的配置文件进行详细说明。 --- ## 总览 -AgentScope Tuner 使用 YAML 格式的配置文件来设置数据、训练算法、奖励、日志以及其他运行时行为。 +AgentJet 使用 YAML 格式的配置文件来设置数据、训练算法、奖励、日志以及其他运行时行为。 !!! info "默认配置文件" - 默认配置文件位于 `ajet/default_config/astune_default.yaml`。 + 默认配置文件位于 `ajet/default_config/ajet_default.yaml`。 一个典型的配置文件包含一个根节点 `ajet`,进一步被划分为若干部分: @@ -167,7 +167,7 @@ ajet: ### 后端选择 -AgentScope Tuner 支持三种训练后端: +AgentJet 支持三种训练后端: | 后端 | 说明 | |------|------| @@ -284,7 +284,7 @@ ajet: ### 配置 Logger -AgentScope Tuner 支持多种日志后端: +AgentJet 支持多种日志后端: | 后端 | 说明 | |------|------| @@ -315,7 +315,7 @@ ajet: ??? example "完整配置文件" ```yaml ajet: - project_name: "astuner_default_project" + project_name: "ajet_default_project" experiment_name: "read_yaml_name" experiment_dir: "auto" backbone: debug diff --git a/docs/zh/data_pipeline.md b/docs/zh/data_pipeline.md index e6c09744..6af4a24c 100644 --- a/docs/zh/data_pipeline.md +++ b/docs/zh/data_pipeline.md @@ -1,6 +1,6 @@ # 任务加载器 -AgentScope Tuner 通过 Task Reader 从多种数据源加载训练任务。本页面介绍 Task 的统一 Schema 定义,以及面向常见场景的内置 Task Reader。 +AgentJet 通过 Task Reader 从多种数据源加载训练任务。本页面介绍 Task 的统一 Schema 定义,以及面向常见场景的内置 Task Reader。 --- @@ -71,7 +71,7 @@ class Task(BaseModel): ## 内置 Task Readers -AgentScope Tuner 提供了 6 个内置 Task Reader,覆盖不同场景。框架会根据配置中的 `ajet.task_reader.type` 自动路由到正确的 reader。 +AgentJet 提供了 6 个内置 Task Reader,覆盖不同场景。框架会根据配置中的 `ajet.task_reader.type` 自动路由到正确的 reader。 ### 快速选择指南 diff --git a/docs/zh/example.md b/docs/zh/example.md index 8b67aadb..39ce31c8 100644 --- a/docs/zh/example.md +++ b/docs/zh/example.md @@ -1,3 +1,3 @@ # 示例 -本页提供了一些使用 AgentScope Tuner 的实际示例。 +本页提供了一些使用 AgentJet 的实际示例。 diff --git a/docs/zh/example_tracing_feedback_loop.md b/docs/zh/example_tracing_feedback_loop.md index 3c731410..988842da 100644 --- a/docs/zh/example_tracing_feedback_loop.md +++ b/docs/zh/example_tracing_feedback_loop.md @@ -1,6 +1,6 @@ # 数据回流训练 -ASTune 允许你回收 智能体 在执行过程中产生的对话日志,并通过迭代训练持续优化该 Agent,我们将这一过程称为 **数据回流训练**。它主要提供以下能力: +AgentJet 允许你回收 智能体 在执行过程中产生的对话日志,并通过迭代训练持续优化该 Agent,我们将这一过程称为 **数据回流训练**。它主要提供以下能力: + 从 agentscope studio 数据库中加载追踪日志 + 将日志转换为结构化的训练数据 diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index 39de842e..1b74812e 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -1,6 +1,6 @@ # 狼人杀游戏 -本教程展示了如何使用 AgentScope Tuner 来处理多智能体训练,令多个智能体在狼人杀游戏中决策、对抗和协作。 +本教程展示了如何使用 AgentJet 来处理多智能体训练,令多个智能体在狼人杀游戏中决策、对抗和协作。 --- diff --git a/docs/zh/installation.md b/docs/zh/installation.md index 10d993cc..19ea3ef3 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -3,7 +3,7 @@ 本文档提供 AgentScope-Tuner 的逐步安装说明。 !!! tip "推荐从源码安装" - AgentScope Tuner 正处于快速开发与迭代阶段。我们建议从源码安装,以获得最新功能与 Bug 修复。 + AgentJet 正处于快速开发与迭代阶段。我们建议从源码安装,以获得最新功能与 Bug 修复。 --- @@ -20,7 +20,7 @@ ### Step 1:克隆仓库 -从 GitHub 克隆 AgentScope Tuner 仓库,并进入项目目录: +从 GitHub 克隆 AgentJet 仓库,并进入项目目录: ```bash git clone https://github.com/modelscope/AgentJet.git diff --git a/docs/zh/intro.md b/docs/zh/intro.md index a89b6f98..d92d61aa 100644 --- a/docs/zh/intro.md +++ b/docs/zh/intro.md @@ -1,6 +1,6 @@ # 项目简介 -**AgentScope Tuner (AgentJet)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +**AgentJet (AgentJet)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的智能体达到最佳性能! diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index 5bf5fa0d..84ec7c0a 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -1,6 +1,6 @@ # 项目简介 -**AgentScope Tuner (AgentJet)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 +**AgentJet (AgentJet)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的智能体达到最佳性能! diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md index 769023d7..7197ac7f 100644 --- a/docs/zh/quickstart.md +++ b/docs/zh/quickstart.md @@ -1,6 +1,6 @@ # 快速开始 -AgentScope Tuner 提供了一套完整的智能体调优功能。您可以立刻尝试启动一个智能体的训练: +AgentJet 提供了一套完整的智能体调优功能。您可以立刻尝试启动一个智能体的训练: ```bash ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray @@ -25,7 +25,7 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --w 编写一个继承自 Workflow 基类的 Agent 类(例如 `MathToolWorkflow`)。
  • 配置并运行 -使用 `AstunerJob` API 配置并启动训练。
  • +使用 `AgentJetJob` API 配置并启动训练。
    @@ -33,11 +33,11 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --w ### 代码示例 ```python title="train_math_agent.py" -from ajet import AstunerJob +from ajet import AgentJetJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "YOUR_MODEL_PATH" -job = AstunerJob(n_gpu=8, algorithm='grpo', model=model_path) +job = AgentJetJob(n_gpu=8, algorithm='grpo', model=model_path) job.set_workflow(MathToolWorkflow) job.set_data(type="hf", dataset_path='openai/gsm8k') diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md index 8a2876d2..36aab46d 100644 --- a/docs/zh/task_judger.md +++ b/docs/zh/task_judger.md @@ -50,7 +50,7 @@ class BaseJudge: ## 内置 Task Judger -AgentScope Tuner 提供了 4 个内置评测器,用于覆盖常见的评测场景: +AgentJet 提供了 4 个内置评测器,用于覆盖常见的评测场景:

    MathAnswerAsJudge

    精确字符串匹配,适用于数学答案评测。

    diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index 8164cdf7..300d4d4a 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -30,7 +30,7 @@
    -完成整个过程后,您将得到一个可在数学任务环境中使用的 Math 智能体,理解 AgentScope Tuner 中的核心概念,并学会如何设计您自己的训练流程。 +完成整个过程后,您将得到一个可在数学任务环境中使用的 Math 智能体,理解 AgentJet 中的核心概念,并学会如何设计您自己的训练流程。 --- @@ -74,7 +74,7 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astuner_default + - ajet_default - _self_ ``` diff --git a/docs/zh/visualization.md b/docs/zh/visualization.md index ce4d6ad1..a6b38602 100644 --- a/docs/zh/visualization.md +++ b/docs/zh/visualization.md @@ -1,6 +1,6 @@ # 训练可视化 -通过可视化指标监控训练进度,对于理解模型行为、以及更高效地调参至关重要。AgentScope Tuner 支持多种可视化后端,可用于实时跟踪训练曲线、奖励趋势以及其他关键指标。 +通过可视化指标监控训练进度,对于理解模型行为、以及更高效地调参至关重要。AgentJet 支持多种可视化后端,可用于实时跟踪训练曲线、奖励趋势以及其他关键指标。 --- diff --git a/mini_test.py b/mini_test.py index b3b88c26..d6c70073 100644 --- a/mini_test.py +++ b/mini_test.py @@ -1,8 +1,8 @@ -from ajet import AstunerJob +from ajet import AgentJetJob from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-1___5B-Instruct" -job = AstunerJob(backbone="trinity", n_gpu=2, n_gpu_for_infer=1, algorithm="grpo", model=model_path) +job = AgentJetJob(backbone="trinity", n_gpu=2, n_gpu_for_infer=1, algorithm="grpo", model=model_path) job.set_workflow(MathToolWorkflow, ensure_reward_in_workflow=True) job.set_data(type="hf", dataset_path="openai/gsm8k") # [Optional] job.dump_job_as_yaml('./saved_experiments/math.yaml') # Save yaml file for manual adjustment diff --git a/tests/bench/benchmark_appworld/benchmark_appworld.yaml b/tests/bench/benchmark_appworld/benchmark_appworld.yaml index d46b8551..80e8b2e1 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld.yaml @@ -64,5 +64,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml index c8cf98f3..821bdc67 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml @@ -65,5 +65,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.yaml b/tests/bench/benchmark_countdown/benchmark_countdown.yaml index 4dbaf8cd..12eb075a 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.yaml +++ b/tests/bench/benchmark_countdown/benchmark_countdown.yaml @@ -135,5 +135,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml index 0cb0f136..b73ab418 100644 --- a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml @@ -92,5 +92,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml index 94364f3f..414eca39 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml @@ -68,5 +68,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tests/bench/benchmark_math/benchmark_math.yaml b/tests/bench/benchmark_math/benchmark_math.yaml index 3d9e534b..ba783304 100644 --- a/tests/bench/benchmark_math/benchmark_math.yaml +++ b/tests/bench/benchmark_math/benchmark_math.yaml @@ -70,5 +70,5 @@ hydra: defaults: - verl_default # verl inherit - trinity_default # trinity inherit - - astune_default + - ajet_default - _self_ diff --git a/tests/config_test.py b/tests/config_test.py index 69611841..7fe2e4b7 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -5,9 +5,9 @@ from ajet.utils.config_utils import ( align_parameters, - expand_astune_hierarchical_config, + expand_ajet_hierarchical_config, prepare_experiment_config, - read_astune_hierarchical_config, + read_ajet_hierarchical_config, ) @@ -36,20 +36,20 @@ def test_config_alignment_trinity(self): ) with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: - config = read_astune_hierarchical_config( + config = read_ajet_hierarchical_config( from_config_fp, "dummy_exp_name", backbone="trinity", write_to=temp_yaml1.name, exp_dir="tests/temp", ) - expand_astune_hierarchical_config(config, write_to=temp_yaml1.name) + expand_ajet_hierarchical_config(config, write_to=temp_yaml1.name) align_parameters( temp_yaml1.name, temp_yaml1.name, TRINITY_CONFIG_AUTO_CONVERSION, "trinity" ) with open(temp_yaml1.name, "r") as file: to_config = yaml.safe_load(file) - self.assertEqual(to_config["checkpoint_root_dir"], "/wow/astuner_checkpoints") + self.assertEqual(to_config["checkpoint_root_dir"], "/wow/ajet_checkpoints") self.assertEqual(to_config["buffer"]["batch_size"], 120) self.assertEqual(to_config["buffer"]["train_batch_size"], 1920) # Test simple field mappings @@ -78,21 +78,21 @@ def test_config_alignment_verl(self): ) with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: - config = read_astune_hierarchical_config( + config = read_ajet_hierarchical_config( from_config_fp, "dummy_exp_name", backbone="verl", write_to=temp_yaml1.name, exp_dir="tests/temp", ) - expand_astune_hierarchical_config(config, write_to=temp_yaml1.name) + expand_ajet_hierarchical_config(config, write_to=temp_yaml1.name) align_parameters( temp_yaml1.name, temp_yaml1.name, TRINITY_CONFIG_AUTO_CONVERSION, "trinity" ) with open(temp_yaml1.name, "r") as file: to_config = yaml.safe_load(file) self.assertEqual( - to_config["trainer"]["checkpoint_base_dir"], "/wow/astuner_checkpoints" + to_config["trainer"]["checkpoint_base_dir"], "/wow/ajet_checkpoints" ) self.assertEqual( to_config["trainer"]["default_local_dir"], diff --git a/tests/data_gen.py b/tests/data_gen.py index f088f245..0109e984 100644 --- a/tests/data_gen.py +++ b/tests/data_gen.py @@ -8,7 +8,7 @@ from ajet.data_generator.task_augmentation import TaskAugmentor from ajet.task_reader import RouterTaskReader from ajet.task_reader.document_reader.doc_reader import DocReader -from ajet.utils.config_utils import read_astune_config +from ajet.utils.config_utils import read_ajet_config dotenv.load_dotenv() @@ -16,7 +16,7 @@ class TestConfigUtils(unittest.TestCase): def test_data_gen_main(self): try: - config = read_astune_config("tests/data_gen.yaml") + config = read_ajet_config("tests/data_gen.yaml") task_reader = RouterTaskReader( reader_type=config.task_reader.data_generation.query_reader.type, diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 80af0e7f..a7dd7bc9 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -9,14 +9,14 @@ 详细请见 `tutorial/math_agent.py`。可以在项目任意地方新建新的 AgentScope Workflow 代码 -- 定义 AgentScope 的工作流 (把agent的model修改为`astune_proxy`) +- 定义 AgentScope 的工作流 (把agent的model修改为`ajet_proxy`) ```python agent = ReActAgent( name="Qwen", sys_prompt=first_msg['content'], - model=astune_proxy, # type: ignore + model=ajet_proxy, # type: ignore formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), toolkit=None, @@ -27,18 +27,18 @@ for _ in range(config.ajet.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol - obs, _, terminate, _ = astune_proxy.gym_step(action={"content": reply_message.content, "role": "assistant"}) + obs, _, terminate, _ = ajet_proxy.gym_step(action={"content": reply_message.content, "role": "assistant"}) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? if terminate: break - if astune_proxy.context_overflow: break + if ajet_proxy.context_overflow: break ``` -- 其中,使用了 astune_proxy 与 agentscope runtime 环境交互的一些接口如下: - - `astune_proxy.gym_step` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 - - `astune_proxy.context_overflow` 查询当前的context窗口是否token溢出 +- 其中,使用了 ajet_proxy 与 agentscope runtime 环境交互的一些接口如下: + - `ajet_proxy.gym_step` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 + - `ajet_proxy.context_overflow` 查询当前的context窗口是否token溢出 ### 3. 准备Judge (奖励模块) @@ -62,7 +62,7 @@ Judge的返回值: raw_reward, is_success ```yaml ajet - project_name: appworld_astune + project_name: appworld_ajet experiment_name: "read_yaml_name" task_judge: # ✨✨✨✨ 编写并选择评价函数 diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 33ccf19f..b5373b37 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -56,5 +56,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tutorial/example_countdown/countdown.yaml b/tutorial/example_countdown/countdown.yaml index a4accb6b..0761ab54 100644 --- a/tutorial/example_countdown/countdown.yaml +++ b/tutorial/example_countdown/countdown.yaml @@ -146,5 +146,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tutorial/example_feedback_tracing/README.md b/tutorial/example_feedback_tracing/README.md index 04b532a4..8ed775c7 100644 --- a/tutorial/example_feedback_tracing/README.md +++ b/tutorial/example_feedback_tracing/README.md @@ -1,6 +1,6 @@ # Training a New Agent from Tracing Logs -ASTune allows you to recycle the chat logs generated during an Agent’s execution and continuously improve the Agent through iterative training. +AgentJet allows you to recycle the chat logs generated during an Agent’s execution and continuously improve the Agent through iterative training. This document demonstrates how to train an Agent using tracing log feedback. ## 1. Preparing the Data diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index 01bbf68a..8d0ea333 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -73,5 +73,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tutorial/example_frozenlake/frozenlake_easy.yaml b/tutorial/example_frozenlake/frozenlake_easy.yaml index 976247a4..8dd9bcdd 100644 --- a/tutorial/example_frozenlake/frozenlake_easy.yaml +++ b/tutorial/example_frozenlake/frozenlake_easy.yaml @@ -87,5 +87,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tutorial/example_frozenlake/frozenlake_hard.yaml b/tutorial/example_frozenlake/frozenlake_hard.yaml index 9a49de93..5258d01f 100644 --- a/tutorial/example_frozenlake/frozenlake_hard.yaml +++ b/tutorial/example_frozenlake/frozenlake_hard.yaml @@ -85,5 +85,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tutorial/example_learn2ask/learn2ask.yaml b/tutorial/example_learn2ask/learn2ask.yaml index 5f8233b1..28a2771f 100644 --- a/tutorial/example_learn2ask/learn2ask.yaml +++ b/tutorial/example_learn2ask/learn2ask.yaml @@ -64,5 +64,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index 3fcc6a6f..fb7b825a 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -45,7 +45,7 @@ self.toolkit.register_tool_function(execute_python_code) self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=astune_proxy, # type: ignore + model=ajet_proxy, # type: ignore formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -57,7 +57,7 @@ result = await self.agent.reply(msg, structured_model=FinalResult) - 在 AgentScope Workflow 中,注册评价函数需要的任意关键数据 ```python -astune_proxy.update_judge_input_dictionary(final_answer=final_answer) +ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) ``` @@ -71,7 +71,7 @@ Judge的输入参数包含: judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) judge_input_dictionary['workflow_task']: 任务信息(如果里面包含了参考答案,可以从中取出) judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) -judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 +judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 ``` Judge的返回值: raw_reward, is_success diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 3bacfb20..67dbc62e 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -67,5 +67,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tutorial/example_math_agent/math_answer_as_judge.py b/tutorial/example_math_agent/math_answer_as_judge.py index 5edc52eb..a9dbc6da 100644 --- a/tutorial/example_math_agent/math_answer_as_judge.py +++ b/tutorial/example_math_agent/math_answer_as_judge.py @@ -13,7 +13,7 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO raw_reward = 0 final_answer = workflow_output.metadata[ "final_answer" - ] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + ] # By default there's no final_answer; register it by calling ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow reference_answer = workflow_task.task.metadata["answer"] reference_answer = reference_answer.split("####")[-1].strip() @@ -37,7 +37,7 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO raw_reward = 0 final_answer = workflow_output.metadata[ "final_answer" - ] # By default there's no final_answer; register it by calling astune_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + ] # By default there's no final_answer; register it by calling ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow reference_answer = workflow_task.task.metadata["answer"] reference_answer = reference_answer.split("####")[-1].strip() diff --git a/tutorial/example_rm_auto_grader/auto_grader.md b/tutorial/example_rm_auto_grader/auto_grader.md index 4ea912fb..897f9510 100644 --- a/tutorial/example_rm_auto_grader/auto_grader.md +++ b/tutorial/example_rm_auto_grader/auto_grader.md @@ -29,7 +29,7 @@ Auto Grader Judge is an intelligent evaluation system that **learns how to grade ### 1. Configuration -Add to your `astune_default.yaml`: +Add to your `ajet_default.yaml`: ```yaml ajet: diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index 77524f4a..ca068cd2 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -45,7 +45,7 @@ self.toolkit.register_tool_function(execute_python_code) self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=astune_proxy, # type: ignore + model=ajet_proxy, # type: ignore formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -57,7 +57,7 @@ result = await self.agent.reply(msg, structured_model=FinalResult) - 在 AgentScope Workflow 中,注册评价函数需要的任意关键数据 ```python -astune_proxy.update_judge_input_dictionary(final_answer=final_answer) +ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) ``` @@ -71,7 +71,7 @@ Judge的输入参数包含: judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) judge_input_dictionary['workflow_task']: 任务信息(如果里面包含了参考答案,可以从中取出) judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) -judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 astune_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 +judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 ``` Judge的返回值: raw_reward, is_success diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml index dd046414..50f91808 100644 --- a/tutorial/example_rubrics_judge/r_judge.yaml +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -68,5 +68,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index fce9f4a1..64f693cd 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -5,29 +5,29 @@ 详细请见 `tutorial/werewolves/start.py`。可以在项目任意地方新建新的 AgentScope Workflow 代码 -- 定义 AgentScope 的工作流 (把agent的model修改为`astune_proxy`) +- 定义 AgentScope 的工作流 (把agent的model修改为`ajet_proxy`) ```python class ExampleWerewolves(Workflow): trainer: str = Field(default="ajet-trinity") - async def execute(self, init_messages, astune_proxy: ModelTuner, config) -> WorkflowOutput: + async def execute(self, init_messages, ajet_proxy: ModelTuner, config) -> WorkflowOutput: train_which_role = "witch" roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] # Set random seed for reproducibility - workflow_task = astune_proxy.get_agentscope_input_dictionary()[workflow_task] + workflow_task = ajet_proxy.get_agentscope_input_dictionary()[workflow_task] task_id = workflow_task.task.task_id np.random.seed(int(task_id)) np.random.shuffle(roles) - players = [get_official_agents(f"Player{x + 1}", roles[x], train_which_role, astune_proxy) for x in range(9)] + players = [get_official_agents(f"Player{x + 1}", roles[x], train_which_role, ajet_proxy) for x in range(9)] good_guy_win = await werewolves_game(players, roles) raw_reward = 1 if (good_guy_win and train_which_role != "werewolf") or (not good_guy_win and train_which_role == "werewolf") else 0 - astune_proxy.update_judge_input_dictionary(raw_reward = raw_reward) - astune_proxy.update_judge_input_dictionary(is_success = (raw_reward == 1)) - return astune_proxy + ajet_proxy.update_judge_input_dictionary(raw_reward = raw_reward) + ajet_proxy.update_judge_input_dictionary(is_success = (raw_reward == 1)) + return ajet_proxy ``` diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index 5acbb139..f160e9f9 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -72,5 +72,5 @@ hydra: defaults: - verl_default # verl inherit 1/1 - trinity_default # trinity inherit 1/1 - - astune_default + - ajet_default - _self_ From fd962517615cd5681dd75aaaf8caa6c240226f5a Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 6 Jan 2026 15:46:39 +0800 Subject: [PATCH 382/462] add missing test case for benchmark_appworld in README --- tests/bench/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/bench/README.md b/tests/bench/README.md index 660a5499..76333f65 100644 --- a/tests/bench/README.md +++ b/tests/bench/README.md @@ -22,6 +22,8 @@ python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_01_begin_verl python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_02_begin_trinity +python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py::TestBenchmarkAppworld::test_01_begin_verl + python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py::TestBenchmarkLearnToAsk::test_02_begin_verl python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py::TestBenchmarkLearnToAsk::test_01_begin_trinity ``` From f6956ac2d859b3951bbadeca7f6303828a67b86b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 6 Jan 2026 16:11:30 +0800 Subject: [PATCH 383/462] fix appworld train yaml --- ajet/default_config/ajet_default.yaml | 4 ++++ .../benchmark_appworld/benchmark_appworld.yaml | 13 +++++++++---- .../benchmark_appworld_2nodes.yaml | 9 +++++++++ .../execute_benchmark_appworld.py | 2 +- tutorial/example_appworld/appworld.yaml | 9 +++++++++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 309b51ce..9672c216 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -86,12 +86,14 @@ ajet: task_reader: type: huggingface_dat_repo # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` + # when `type == jsonl_dataset_file` jsonl_dataset_file: training: file_path: "/path/to/training/data.jsonl" validation: file_path: "/path/to/validation/data.jsonl" + # when `type == env_service` env_service: env_type: "appworld" @@ -99,11 +101,13 @@ ajet: env_action_preference: code # code, text, box training_split: train validation_split: dev + # when `type == huggingface_dat_repo` huggingface_dat_repo: dataset_path: "gsm8k" training_split: "train" validation_split: "validation" + # when `type == data_generation` data_generation: document_reader: diff --git a/tests/bench/benchmark_appworld/benchmark_appworld.yaml b/tests/bench/benchmark_appworld/benchmark_appworld.yaml index 80e8b2e1..022b0981 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld.yaml @@ -6,6 +6,15 @@ ajet: # ✨✨✨✨ 编写并选择评价函数 judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge + task_reader: + type: env_service # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code # code, text, box + training_split: train + validation_split: dev + model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct @@ -48,10 +57,6 @@ ajet: execute_test: True # DO NOT EDIT, THIS IS FOR TEST ROBOT execute_testing_lambda: "tests/bench/benchmark_appworld/benchmark_appworld.py->TestProbe" # -trinity: - synchronizer: - sync_offset: 1 - sync_method: nccl # ------------------ 不需要修改 ------------------ hydra: diff --git a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml index 821bdc67..9cc54a0a 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml @@ -6,6 +6,15 @@ ajet: # ✨✨✨✨ 编写并选择评价函数 judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge + task_reader: + type: env_service # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code # code, text, box + training_split: train + validation_split: dev + model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct diff --git a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py index 8dfc2449..5d824b48 100644 --- a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py @@ -17,7 +17,7 @@ def test_01_begin_verl(self): # tests/bench/benchmark_appworld/benchmark_appworld.yaml TARGET_NAME = f"benchmark_appworld_{BACKBONE}" PYTHON_EXECUTABLE = ".verl/bin/python" - multi_nodes = True + multi_nodes = False self.execute_benchmark( backbone=BACKBONE, diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index b5373b37..c1f424ad 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -6,6 +6,15 @@ ajet: # ✨✨✨✨ 编写并选择评价函数 judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge + task_reader: + type: env_service # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code # code, text, box + training_split: train + validation_split: dev + model: # ✨✨✨✨ 设置待训练的模型 path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct From f7b13789b6ad54f4c7fd6440382b7af8b3689030 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 7 Jan 2026 16:36:12 +0800 Subject: [PATCH 384/462] rename docs and add tuner v2 --- ajet/__init__.py | 4 +- ajet/backbone/warm_up.py | 3 + .../agentscope_tracker/multiagent_tracking.py | 3 +- .../agentscope_tracker/timeline_merging.py | 76 ++++---- ajet/{cli => copilot}/__init__.py | 0 ajet/{cli => copilot}/job.py | 6 +- ajet/default_config/ajet_default.py | 2 +- ajet/default_config/ajet_default.yaml | 11 +- ajet/{cli => }/launcher.py | 17 +- ajet/schema/convertion.py | 129 ++++++++++++++ ajet/task_rollout/async_llm_bridge.py | 98 +++++++++-- ajet/task_rollout/single_worker.py | 4 +- ajet/task_runner/__init__.py | 4 +- ...agentscope_runner.py => general_runner.py} | 13 +- ajet/tuner.py | 16 +- .../weight_tuner/as_agentscope_model.py | 12 +- .../weight_tuner/as_oai_sdk_model.py | 80 +++++++++ ajet/tuner_v2.py | 141 ++++----------- ajet/utils/testing_utils.py | 4 +- docs/en/configuration.md | 6 +- docs/en/example_app_world.md | 6 +- docs/en/example_countdown.md | 6 +- docs/en/example_frozenlake.md | 2 +- docs/en/example_learning_to_ask.md | 6 +- docs/en/example_math_agent.md | 4 +- docs/en/example_werewolves.md | 2 +- docs/en/tune_your_first_agent.md | 4 +- docs/zh/configuration.md | 6 +- docs/zh/example_app_world.md | 6 +- docs/zh/example_countdown.md | 8 +- docs/zh/example_frozenlake.md | 4 +- docs/zh/example_learning_to_ask.md | 6 +- docs/zh/example_math_agent.md | 4 +- docs/zh/example_werewolves.md | 4 +- docs/zh/tune_your_first_agent.md | 4 +- .../benchmark_appworld.yaml | 2 +- .../benchmark_appworld_2nodes.yaml | 2 +- .../benchmark_appworld_oai_sdk.yaml | 71 ++++++++ .../execute_benchmark_appworld.py | 2 +- .../benchmark_countdown.yaml | 2 +- .../benchmark_frozenlake.yaml | 2 +- .../benchmark_learn2ask.yaml | 2 +- .../bench/benchmark_math/benchmark_math.yaml | 2 +- .../benchmark_math_oai_sdk.yaml | 74 ++++++++ tutorial/example_appworld/appworld.md | 6 +- tutorial/example_appworld/appworld.yaml | 2 +- tutorial/example_appworld/appworld_oai_sdk.py | 50 ++++++ .../example_appworld/appworld_oai_sdk.yaml | 68 ++++++++ tutorial/example_countdown/countdown.yaml | 2 +- .../example_feedback_tracing.yaml | 2 +- .../example_frozenlake/frozenlake_easy.yaml | 2 +- .../example_frozenlake/frozenlake_hard.yaml | 2 +- tutorial/example_learn2ask/learn2ask.yaml | 2 +- tutorial/example_math_agent/math_agent.md | 6 +- tutorial/example_math_agent/math_agent.py | 2 +- tutorial/example_math_agent/math_agent.yaml | 2 +- .../example_math_agent/math_agent_oai_sdk.py | 165 ++++++++++++++++++ tutorial/example_rubrics_judge/math_agent.md | 6 +- tutorial/example_rubrics_judge/r_judge.yaml | 2 +- tutorial/example_werewolves/werewolves.md | 2 +- tutorial/example_werewolves/werewolves.yaml | 2 +- 61 files changed, 922 insertions(+), 261 deletions(-) rename ajet/{cli => copilot}/__init__.py (100%) rename ajet/{cli => copilot}/job.py (97%) rename ajet/{cli => }/launcher.py (94%) create mode 100644 ajet/schema/convertion.py rename ajet/task_runner/{agentscope_runner.py => general_runner.py} (88%) create mode 100644 tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml create mode 100644 tests/bench/benchmark_math/benchmark_math_oai_sdk.yaml create mode 100644 tutorial/example_appworld/appworld_oai_sdk.py create mode 100644 tutorial/example_appworld/appworld_oai_sdk.yaml create mode 100644 tutorial/example_math_agent/math_agent_oai_sdk.py diff --git a/ajet/__init__.py b/ajet/__init__.py index feb7cf0e..42801c47 100644 --- a/ajet/__init__.py +++ b/ajet/__init__.py @@ -1,7 +1,8 @@ -from ajet.cli.job import AgentJetJob +from ajet.copilot.job import AgentJetJob from ajet.schema.task import WorkflowOutput, WorkflowTask from ajet.tuner import ModelTuner from ajet.workflow import Workflow +from ajet.utils.vsdb import vscode_conditional_breakpoint as bp __all__ = [ "Workflow", @@ -9,6 +10,7 @@ "WorkflowOutput", "ModelTuner", "AgentJetJob", + "bp", ] __version__ = "0.1.0" diff --git a/ajet/backbone/warm_up.py b/ajet/backbone/warm_up.py index fb42e309..cbe7f350 100644 --- a/ajet/backbone/warm_up.py +++ b/ajet/backbone/warm_up.py @@ -1,4 +1,5 @@ import asyncio +import logging import os @@ -29,6 +30,8 @@ def init_parallel_rollout_logger(experiment_name): debug=False, ) + target_logger = logging.getLogger("vllm.entrypoints.openai.tool_parsers.hermes_tool_parser") + target_logger.setLevel(logging.CRITICAL) def warm_up_process(config): """ diff --git a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py index b21bc69b..1093b8ba 100644 --- a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -418,7 +418,8 @@ def generate_log(self, task_id=None, global_step="NA"): ) def group_merge(self) -> List[List[ExtendedMessage]]: - self.grouped_steps = merge_tracker_timelines(self.grouped_steps) + timeline_merge_policy = self.config.ajet.timeline_merge_policy + self.grouped_steps = merge_tracker_timelines(self.grouped_steps, timeline_merge_policy) return self.grouped_steps def group_tokenize(self): diff --git a/ajet/context_tracker/agentscope_tracker/timeline_merging.py b/ajet/context_tracker/agentscope_tracker/timeline_merging.py index daff09e7..72d0ed34 100644 --- a/ajet/context_tracker/agentscope_tracker/timeline_merging.py +++ b/ajet/context_tracker/agentscope_tracker/timeline_merging.py @@ -8,57 +8,68 @@ def is_timeline_mergeable( source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage], + timeline_merge_policy, debug=False, - compare_level="text", # "text" or "token" ) -> bool: - # compare_level = "text" # relaxed compare with text, more easier to match, at very little cost - # compare_level = "token" # strict compare with token, cause less aggressive merging + # timeline_compare_level = "text" # relaxed compare with text, more easier to match, at very little cost + # timeline_compare_level = "token" # strict compare with token, cause less aggressive merging + timeline_compare_level = timeline_merge_policy.get("timeline_compare_level", "text") + ignore_tools = timeline_merge_policy.get("ignore_tools", True) can_merge = False if len(source_timeline) >= len(target_timeline): all_msg_match = True for i in range(len(target_timeline)): - if compare_level == "text": + if timeline_compare_level == "text": same = ( - # TODO: currently does not consider tools, may aggressively merge responses with different tool calls - # TODO: maybe we should give option for user to choose merging behavior source_timeline[i].content_for_future == target_timeline[i].content_for_future ) - elif compare_level == "token": + elif timeline_compare_level == "token": same = source_timeline[i].token_arr == target_timeline[i].token_arr else: raise NotImplementedError + if not same: all_msg_match = False break + + # compare whether avail tool list is identical when (not ignore_tools) + if (all_msg_match) and (not ignore_tools): + source_0 = source_timeline[0] + target_0 = target_timeline[0] + if source_0.tools != target_0.tools: + all_msg_match = False + if all_msg_match: can_merge = True - # developer only: code below is only for debugging (print a nice comparison table) - if debug: - debug_listofdict = [] - if len(source_timeline) >= len(target_timeline): - all_msg_match = False - for i in range(len(target_timeline)): - d = {} - d["source"] = source_timeline[i].content_for_future - d["target"] = target_timeline[i].content_for_future - if compare_level == "text": - same = ( - source_timeline[i].content_for_future - == target_timeline[i].content_for_future - ) - elif compare_level == "token": - same = source_timeline[i].token_arr == target_timeline[i].token_arr - else: - raise NotImplementedError - if not same: - d["match"] = "NO" - else: - d["match"] = "YES" - debug_listofdict.append(d) - print_listofdict(debug_listofdict, header=f"is_timeline_mergeable debug: {can_merge}") + + + # # developer only: code below is only for debugging (print a nice comparison table) + # if debug: + # debug_listofdict = [] + # if len(source_timeline) >= len(target_timeline): + # all_msg_match = False + # for i in range(len(target_timeline)): + # d = {} + # d["source"] = source_timeline[i].content_for_future + # d["target"] = target_timeline[i].content_for_future + # if timeline_compare_level == "text": + # same = ( + # source_timeline[i].content_for_future + # == target_timeline[i].content_for_future + # ) + # elif timeline_compare_level == "token": + # same = source_timeline[i].token_arr == target_timeline[i].token_arr + # else: + # raise NotImplementedError + # if not same: + # d["match"] = "NO" + # else: + # d["match"] = "YES" + # debug_listofdict.append(d) + # print_listofdict(debug_listofdict, header=f"is_timeline_mergeable debug: {can_merge}") return can_merge @@ -82,6 +93,7 @@ def toggle_author_and_mask( def merge_tracker_timelines( timelines: List[List[ExtendedMessage]], + timeline_merge_policy ) -> List[List[ExtendedMessage]]: """Merge multiple timelines by absorbing those that can be merged. > Input: a list of timelines. (a timeline means: List[ExtendedMessage]) @@ -98,7 +110,7 @@ def merge_tracker_timelines( continue source_timeline = reversed_timelines[i] target_timeline = reversed_timelines[j] - if is_timeline_mergeable(source_timeline, target_timeline): + if is_timeline_mergeable(source_timeline, target_timeline, timeline_merge_policy): source_timeline = toggle_author_and_mask(source_timeline, target_timeline) reversed_timelines[i] = source_timeline absorbed_step_indices += [j] diff --git a/ajet/cli/__init__.py b/ajet/copilot/__init__.py similarity index 100% rename from ajet/cli/__init__.py rename to ajet/copilot/__init__.py diff --git a/ajet/cli/job.py b/ajet/copilot/job.py similarity index 97% rename from ajet/cli/job.py rename to ajet/copilot/job.py index 7d6c470e..373af631 100644 --- a/ajet/cli/job.py +++ b/ajet/copilot/job.py @@ -17,7 +17,7 @@ import yaml from loguru import logger -from ajet.cli.launcher import ( +from ajet.launcher import ( check_avail_gpu, get_backbone_target, setup_environment_vars, @@ -87,7 +87,7 @@ def dump_job_as_yaml(self, yaml_path: str) -> str: def set_workflow( self, workflow: Union[str, Callable[..., Any]], ensure_reward_in_workflow: bool = False ) -> "AgentJetJob": - self.config.ajet.rollout.agentscope_workflow = cls_to_path(workflow) + self.config.ajet.rollout.user_workflow = cls_to_path(workflow) # TODO: validate workflow outputs contain reward # ensure_reward_in_workflow return self @@ -120,7 +120,7 @@ def set_data( def tune(self, *args, **kwargs) -> "AgentJetJob": ast_cfg = self.config.ajet - if not ast_cfg.rollout or not ast_cfg.rollout.agentscope_workflow: + if not ast_cfg.rollout or not ast_cfg.rollout.user_workflow: raise ValueError("Workflow must be set via set_workflow before tuning.") if not ast_cfg.task_reader: raise ValueError("Data source must be set via set_data before tuning.") diff --git a/ajet/default_config/ajet_default.py b/ajet/default_config/ajet_default.py index 4bc1ff59..9d0732e9 100644 --- a/ajet/default_config/ajet_default.py +++ b/ajet/default_config/ajet_default.py @@ -27,7 +27,7 @@ class AjetData: @dataclass class AjetRollout: - agentscope_workflow: str = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow" + user_workflow: str = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow" n_vllm_engine: int = 1 tensor_model_parallel_size: int = 1 diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 9672c216..89ca75a5 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -23,7 +23,7 @@ ajet: rollout: # the path to the workflow class - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow # whether or not to disable all tool calls agentscope_disable_toolcalls: False @@ -214,6 +214,15 @@ ajet: alien_llm_response_length: 512 max_env_len: 4096 + # timeline merging policy used in Context Tracker + timeline_merge_policy: + + # compare_level = "text": relaxed compare with text, more easier to match, at very little cost + # compare_level = "token": strict compare with token, cause less aggressive merging + timeline_compare_level: "text" # options: "text", "token" + ignore_tools: True # whether or not to ignore tool calls when comparing steps + + # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. execute_test: False # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. diff --git a/ajet/cli/launcher.py b/ajet/launcher.py similarity index 94% rename from ajet/cli/launcher.py rename to ajet/launcher.py index 099de6b1..0b7ea94b 100644 --- a/ajet/cli/launcher.py +++ b/ajet/launcher.py @@ -24,7 +24,7 @@ def parse_args(): parser.add_argument( "--backbone", type=str, - default="trinity", + default="verl", required=False, help="verl or trinity or debug", ) @@ -189,7 +189,7 @@ def get_backbone_target(backbone): Returns: str: The full module path for the specified backbone """ - backbone_target = "ajet.backbone.main_trinity" # Default to trinity + backbone_target = "ajet.backbone.main_verl" # Default to trinity if backbone == "verl": backbone_target = "ajet.backbone.main_verl" if backbone == "debug": @@ -217,16 +217,21 @@ def setup_environment_vars(args, exp_config, main_yaml_fp): env["DEBUG_TAGS"] = args.debug env["RAY_record_task_actor_creation_sites"] = "true" # assert exp_config["ajet"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore + if exp_config["ajet"]["rollout"]["max_env_worker"] > 1: # type: ignore + exp_config["ajet"]["rollout"]["max_env_worker"] = 1 + logger.warning( + "For debugging mode, max_env_worker is set to 1 to facilitate debugging." + ) logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") - if args.conf: - assert exp_config["ajet"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore + # if args.conf: + # assert exp_config["ajet"]["rollout"]["max_env_worker"] > 4, "parallel worker too few" # type: ignore if args.backbone == "trinity": env["AJET_CONFIG_REDIRECT"] = main_yaml_fp # type: ignore if args.backbone == "debug": env["AJET_DEBUG"] = "1" # type: ignore - return env + return env, exp_config def check_model_file_exists(exp_config): @@ -280,7 +285,7 @@ def main(): exp_config, ) = prepare_experiment_config(yaml_path, exp_dir, args.backbone) - env = setup_environment_vars(args, exp_config, main_yaml_fp) + env, exp_config = setup_environment_vars(args, exp_config, main_yaml_fp) if args.with_ray: assert ( not args.with_ray_cluster diff --git a/ajet/schema/convertion.py b/ajet/schema/convertion.py new file mode 100644 index 00000000..d9cda761 --- /dev/null +++ b/ajet/schema/convertion.py @@ -0,0 +1,129 @@ + +from openai.types.chat.chat_completion import ChatCompletion, Choice +from openai.types.chat.chat_completion_message import ChatCompletionMessage +from openai.types.completion_usage import CompletionUsage +import time + + +def convert_llm_proxy_response_to_oai_response(llm_proxy_response): + + # Create the chat completion message + message = ChatCompletionMessage( + role=llm_proxy_response.get("role", "assistant"), + content=llm_proxy_response.get("content", ""), + tool_calls=llm_proxy_response.get("tool_calls", []), + ) + + # Create a choice object + choice = Choice( + index=0, + message=message, + finish_reason="stop", + ) + + # Calculate token usage if tokens are available + usage = None + if "tokens" in llm_proxy_response and llm_proxy_response["tokens"]: + completion_tokens = len(llm_proxy_response["tokens"]) + usage = CompletionUsage( + prompt_tokens=0, # Not available in llm_proxy_response + completion_tokens=completion_tokens, + total_tokens=completion_tokens, + ) + + return ChatCompletion( + id=llm_proxy_response.get("request_id", "chatcmpl-default"), + choices=[choice], + created=int(time.time()), + model="unknown", # Model name not provided in llm_proxy_response + object="chat.completion", + usage=usage, + ) + + +def test_convert_llm_proxy_response_to_oai_response(): + """Test the conversion from llm_proxy_response to OpenAI ChatCompletion format.""" + + from ajet.schema.logprob import TokenAndProb + # Test case 1: Basic response with content only + llm_proxy_response_basic = { + "role": "assistant", + "request_id": "req-123456", + "content": "Hello, how can I help you today?", + "tool_calls": None, + "tokens": [ + TokenAndProb( + token_id=123, + logprob=-0.5, + decoded_string="Hello", + ), + TokenAndProb( + token_id=456, + logprob=-0.3, + decoded_string=",", + ), + ], + } + + result = convert_llm_proxy_response_to_oai_response(llm_proxy_response_basic) + + assert result.id == "req-123456" + assert result.object == "chat.completion" + assert len(result.choices) == 1 + assert result.choices[0].message.role == "assistant" + assert result.choices[0].message.content == "Hello, how can I help you today?" + assert result.choices[0].message.tool_calls is None + assert result.choices[0].finish_reason == "stop" + assert result.usage is not None + assert result.usage.completion_tokens == 2 + assert result.usage.total_tokens == 2 + + print("✓ Test case 1 passed: Basic response with content") + + # Test case 2: Response with tool calls + llm_proxy_response_with_tools = { + "role": "assistant", + "request_id": "req-789012", + "content": "", + "tool_calls": [ + { + "id": "call_abc123", + "type": "function", + "function": { + "name": "get_weather", + "arguments": '{"location": "San Francisco"}' + } + } + ], + "tokens": [], + } + + result2 = convert_llm_proxy_response_to_oai_response(llm_proxy_response_with_tools) + + assert result2.id == "req-789012" + assert result2.choices[0].message.content == "" + assert result2.choices[0].message.tool_calls is not None + assert len(result2.choices[0].message.tool_calls) == 1 + assert result2.usage is None # No tokens provided + + print("✓ Test case 2 passed: Response with tool calls") + + # Test case 3: Minimal response with defaults + llm_proxy_response_minimal = { + "content": "Test response" + } + + result3 = convert_llm_proxy_response_to_oai_response(llm_proxy_response_minimal) + + assert result3.id == "chatcmpl-default" + assert result3.choices[0].message.role == "assistant" + assert result3.choices[0].message.content == "Test response" + assert result3.model == "unknown" + + print("✓ Test case 3 passed: Minimal response with defaults") + + print("\n✅ All tests passed!") + + +if __name__ == "__main__": + test_convert_llm_proxy_response_to_oai_response() diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index 0d199919..1e83e371 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -3,20 +3,25 @@ import json import time import uuid -from typing import Any, Callable, Dict, List, Literal, Type +from typing import Any, Callable, Dict, List, Literal, Type, Union from agentscope._utils._common import _json_loads_with_repair from agentscope.message import TextBlock, ToolUseBlock -from agentscope.model import ChatResponse from loguru import logger from omegaconf import DictConfig from pydantic import BaseModel from transformers.tokenization_utils import PreTrainedTokenizer from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser +from agentscope.model import ChatResponse as AgentScopeChatResponse +from openai.types.chat.chat_completion import ChatCompletion as OpenAIChatCompletion + +ChatResponse = Union[OpenAIChatCompletion, AgentScopeChatResponse] + from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) +from ajet.schema.convertion import convert_llm_proxy_response_to_oai_response from ajet.schema.logprob import TokenAndProb from ajet.utils.async_utils import run_async_coroutine_with_timeout from ajet.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode @@ -235,11 +240,16 @@ async def main(): return llm_chat -class AgentScopeLlmProxy(object): + + + + + +class OpenaiLlmProxyWithTracker(object): """ An essential wrapper to connect AsyncLlmBridge with AgentScope - User_Agentscope_Workflow <-> AsyncLlmBridge <-> Context Tracker. + User_user_workflow <-> AsyncLlmBridge <-> Context Tracker. """ def __init__( @@ -254,14 +264,26 @@ def __init__( self.tokenizer = tokenizer self.config = config - async def __call__( + def construct_overflow_response(self) -> ChatResponse: + from ajet.schema.convertion import convert_llm_proxy_response_to_oai_response + return convert_llm_proxy_response_to_oai_response( + { + "role": "assistant", + "request_id": "overflow_response", + "content": "ajet_proxy: Exceeded max model context length.", + "tool_calls": None, + "tokens": [], + } + ) + + async def run_infer( self, messages: List[dict], tools: List = [], tool_choice: str = "auto", structured_model=None, **kwargs, - ) -> ChatResponse: + ): # prepare context tracker, check context safety ( context_safe, @@ -271,17 +293,15 @@ async def __call__( custom_sampling_params, tools, ) = self.context_tracker.step_prepare(messages, tools) + + # if context not safe to infer further if not context_safe: logger.warning(f"[{info}] detected.") self.context_tracker.context_overflow = True if token_overflow: # ajet_action_when_overflow = self.config.ajet.rollout.ajet_action_when_overflow # cannot proceed due to context overflow - return ChatResponse( - content=[ - {"type": "text", "text": "ajet_proxy: Exceeded max model context length."} - ], - ) + return self.construct_overflow_response() # else: # otherwise, for abnormal output, can still proceed, but we do not track output anymore # run llm inference ✨ @@ -294,6 +314,49 @@ async def __call__( # begin context tracking self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) + return llm_output + + async def __call__( + self, + messages: List[dict], + tools: List = [], + tool_choice: str = "auto", + structured_model=None, + **kwargs, + ) -> ChatResponse: + llm_output = await self.run_infer( + messages, tools, tool_choice, structured_model, **kwargs + ) + + return convert_llm_proxy_response_to_oai_response(llm_output) + + + + + + + + +class AgentScopeLlmProxyWithTracker(OpenaiLlmProxyWithTracker): + """ + An essential wrapper to connect AsyncLlmBridge with AgentScope + + User_user_workflow <-> AsyncLlmBridge <-> Context Tracker. + """ + + + async def __call__( + self, + messages: List[dict], + tools: List = [], + tool_choice: str = "auto", + structured_model=None, + **kwargs, + ) -> AgentScopeChatResponse: # type: ignore + + llm_output = await self.run_infer( + messages, tools, tool_choice, structured_model, **kwargs + ) # parse response response = await self._parse_dashscope_generation_response( @@ -302,12 +365,21 @@ async def __call__( return response + + def construct_overflow_response(self): # type: ignore + return AgentScopeChatResponse( + content=[ + {"type": "text", "text": "ajet_proxy: Exceeded max model context length."} + ], + ) + + # copied from AgentScope's DashScopeChatModule async def _parse_dashscope_generation_response( self, message, structured_model: Type[BaseModel] | None = None, - ) -> ChatResponse: + ) -> AgentScopeChatResponse: # type: ignore content_blocks: List[TextBlock | ToolUseBlock] = [] content = message.get("content") metadata: dict | None = None @@ -355,7 +427,7 @@ async def _parse_dashscope_generation_response( if structured_model: metadata = input_ # type: ignore - parsed_response = ChatResponse( + parsed_response = AgentScopeChatResponse( content=content_blocks, metadata=metadata, ) diff --git a/ajet/task_rollout/single_worker.py b/ajet/task_rollout/single_worker.py index 666771d1..9d187797 100644 --- a/ajet/task_rollout/single_worker.py +++ b/ajet/task_rollout/single_worker.py @@ -11,7 +11,7 @@ from ajet.schema.task import Task, WorkflowTask from ajet.task_rollout.async_llm_bridge import AsyncLlmBridge from ajet.task_rollout.resource_keeper import ResourceKeeper -from ajet.task_runner.agentscope_runner import AgentScopeRunner +from ajet.task_runner.general_runner import GeneralRunner from ajet.utils.retry import retry_with_backoff from ajet.utils.sample import get_sample_params from ajet.utils.testing_utils import TestFailException, TestSuccessException @@ -104,7 +104,7 @@ def rollout_env_worker( with ResourceKeeper(workflow_task, config=self.config) as resource_keeper: try: workflow_task = resource_keeper.prepare() - agent_runner = AgentScopeRunner( + agent_runner = GeneralRunner( llm_inference_fn=llm_inference_fn, tokenizer=self.tokenizer, config=self.config ) tracker = agent_runner.execute( diff --git a/ajet/task_runner/__init__.py b/ajet/task_runner/__init__.py index 98d73e6c..861652de 100644 --- a/ajet/task_runner/__init__.py +++ b/ajet/task_runner/__init__.py @@ -1,4 +1,4 @@ -from .agentscope_runner import AgentScopeRunner +from .general_runner import GeneralRunner from .base_runner import BaseAgentRunner -__all__ = ["BaseAgentRunner", "AgentScopeRunner"] +__all__ = ["BaseAgentRunner", "GeneralRunner"] diff --git a/ajet/task_runner/agentscope_runner.py b/ajet/task_runner/general_runner.py similarity index 88% rename from ajet/task_runner/agentscope_runner.py rename to ajet/task_runner/general_runner.py index e6bfca88..b2bdfe35 100644 --- a/ajet/task_runner/agentscope_runner.py +++ b/ajet/task_runner/general_runner.py @@ -1,6 +1,7 @@ import asyncio -from ajet import ModelTuner, Workflow, WorkflowOutput +from ajet.tuner_v2 import TunerV2 as ModelTuner +from ajet import Workflow, WorkflowOutput from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) @@ -11,7 +12,7 @@ from ajet.utils.dynamic_import import dynamic_import -class AgentScopeRunner(BaseAgentRunner): +class GeneralRunner(BaseAgentRunner): def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: observation_window = workflow_task.observation_window task_thread_index = workflow_task.task_thread_index @@ -19,9 +20,9 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: task_tag = workflow_task.task_tag task_id = workflow_task.task_id - workflow_import = self.config.ajet.rollout.agentscope_workflow + workflow_import = self.config.ajet.rollout.user_workflow workflow_cls = dynamic_import(workflow_import) - agentscope_workflow: Workflow = workflow_cls(name="ajet-trinity") + user_workflow: Workflow = workflow_cls(name="ajet-trinity") hooks = self.runner_hooks( observation_window=observation_window, @@ -41,12 +42,12 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: context_tracker=context_tracker, llm_inference_fn=self.llm_inference_fn, tokenizer=self.tokenizer, - agentscope_workflow=agentscope_workflow, + user_workflow=user_workflow, config=self.config, ) workflow_output: WorkflowOutput = asyncio.run( - agentscope_workflow.execute(workflow_task, m_tuner) + user_workflow.execute(workflow_task, m_tuner) ) if workflow_output.reward is not None: raw_reward, is_success = ( diff --git a/ajet/tuner.py b/ajet/tuner.py index 4b33c6bf..5880ae60 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -8,7 +8,7 @@ from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from ajet.task_rollout.async_llm_bridge import AgentScopeLlmProxy +from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker if TYPE_CHECKING: from ajet import Workflow @@ -52,14 +52,14 @@ def __init__( self, config, context_tracker: MultiAgentContextTracker, - agentscope_workflow: "Workflow", + user_workflow: "Workflow", **kwargs, ) -> None: self.config = config self.context_tracker = context_tracker - self.agentscope_workflow = agentscope_workflow + self.user_workflow = user_workflow self.target2proxy_registry: dict[str, Agent2Proxy] = {} - self.llm_proxy = AgentScopeLlmProxy( + self.llm_proxy = OpenaiLlmProxyWithTracker( context_tracker=context_tracker, config=config, **kwargs ) super().__init__( @@ -166,18 +166,18 @@ async def __call__( return response_gen def is_trainable(self, target_name) -> bool: - if self.agentscope_workflow.trainable_targets is None: + if self.user_workflow.trainable_targets is None: # always assume trainable when user has never changed trainable_targets return True - if not self.agentscope_workflow.trainable_targets: + if not self.user_workflow.trainable_targets: # always assume trainable when trainable_targets is [] return True - if target_name in self.agentscope_workflow.trainable_targets: + if target_name in self.user_workflow.trainable_targets: return True else: return False - def get_llm_proxy(self) -> AgentScopeLlmProxy: + def get_llm_proxy(self) -> OpenaiLlmProxyWithTracker: """Get the LlmProxyForAgentScope instance. Returns: LlmProxyForAgentScope: diff --git a/ajet/tuner_lib/weight_tuner/as_agentscope_model.py b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py index cc36ebc4..79a5f10d 100644 --- a/ajet/tuner_lib/weight_tuner/as_agentscope_model.py +++ b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py @@ -8,7 +8,7 @@ from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from ajet.task_rollout.async_llm_bridge import AgentScopeLlmProxy +from ajet.task_rollout.async_llm_bridge import AgentScopeLlmProxyWithTracker if TYPE_CHECKING: from ajet import Workflow @@ -25,20 +25,20 @@ def __init__( self, config, context_tracker: MultiAgentContextTracker, - agentscope_workflow: "Workflow", + user_workflow: "Workflow", agent_name: str, - debug_model: DashScopeChatModel, + debug_model: DashScopeChatModel | None, use_debug_model: bool = False, **kwargs, ) -> None: self.config = config self.context_tracker = context_tracker - self.agentscope_workflow = agentscope_workflow + self.user_workflow = user_workflow self.agent_name = agent_name self.debug_model = debug_model self.use_debug_model = use_debug_model - self.llm_proxy = AgentScopeLlmProxy( + self.llm_proxy = AgentScopeLlmProxyWithTracker( context_tracker=context_tracker, config=config, **kwargs ) super().__init__( @@ -58,7 +58,7 @@ async def __call__( ) -> ChatResponse: # route first - if self.use_debug_model: + if self.use_debug_model and self.debug_model is not None: chatresponse = await self.debug_model(messages, tools, tool_choice, structured_model, **kwargs) assert isinstance(chatresponse, ChatResponse) return chatresponse diff --git a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py index e69de29b..0e016b74 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py @@ -0,0 +1,80 @@ +import asyncio +from typing import TYPE_CHECKING, Any, List, Callable, Literal, Type, Union +from loguru import logger +from pydantic import BaseModel +from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracker, +) +from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker +from ajet.utils.magic_mock import SpecialMagicMock +from openai.types.chat.chat_completion import ChatCompletion +from openai.resources.chat.chat import Chat, AsyncChat +from openai.resources.completions import AsyncCompletions +from openai import OpenAI, AsyncOpenAI + +if TYPE_CHECKING: + from ajet import Workflow + +# import openai +# client = openai.OpenAI() + +# response = client.chat.completions.create( +# model="gpt-3.5-turbo", # You can replace this with "gpt-4" if available +# messages=[ +# {"role": "system", "content": "You are a helpful assistant."}, +# {"role": "user", "content": "Hello! Tell me a joke about programming."} +# ], +# max_tokens=100, # Limit the response length +# temperature=0.7 # Control the randomness of the output +# ) + +class MockAsyncCompletions(AsyncCompletions): + async def create(self, *args, **kwargs) -> Any: # type: ignore + return await self._client.create(*args, **kwargs) # type: ignore + +class MockAsyncChat(AsyncChat): + @property + def completions(self) -> MockAsyncCompletions: # type: ignore + return MockAsyncCompletions(self._client) + +class OpenaiClientModelTuner(AsyncOpenAI): + + def __init__( + self, + config, + context_tracker: MultiAgentContextTracker, + workflow: "Workflow", + agent_name: str, + debug_model: str, + use_debug_model: bool = False, + **kwargs, + ): + self.llm_proxy = OpenaiLlmProxyWithTracker( + context_tracker=context_tracker, + config=config, + **kwargs + ) + + @property + def chat(self) -> MockAsyncChat: # type: ignore + return MockAsyncChat(self) + + async def create( + self, + messages: List[dict], + tools: List = [], + tool_choice: str = "auto", + *args, + **kwargs + ) -> ChatCompletion: + + # call llm model ✨ + response_gen = await self.llm_proxy( + messages = messages, + tools = tools, + tool_choice = tool_choice, + ) + assert isinstance(response_gen, ChatCompletion) + return response_gen + + diff --git a/ajet/tuner_v2.py b/ajet/tuner_v2.py index ce2bb73a..0edd1c09 100644 --- a/ajet/tuner_v2.py +++ b/ajet/tuner_v2.py @@ -1,122 +1,33 @@ from typing import TYPE_CHECKING, Any, Literal, Type, Union -from agentscope._utils._common import _create_tool_from_base_model -from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel from loguru import logger -from pydantic import BaseModel from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from ajet.task_rollout.async_llm_bridge import AgentScopeLlmProxy -from ajet.tuner_lib.weight_tuner import as_agentscope_model, as_oai_sdk_model -from ajet.utils.magic_mock import SpecialMagicMock +from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker +from ajet.tuner_lib.weight_tuner import AgentScopeModelTuner +from ajet.tuner_lib.weight_tuner import OpenaiClientModelTuner if TYPE_CHECKING: from ajet import Workflow - from openai.types.chat.chat_completion import ChatCompletion - from ajet.tuner_lib.weight_tuner.ajet import AgentScopeModelTuner - - - -class Agent2Proxy(DashScopeChatModel): - """ - Handler for **NAMED** agent trainning targets. - It stores the target name, and a reference to the ModelTuner. - When request comes, it switches between default model (dashscope or openai models) and ModelTuner - """ - - def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase): - self.name = name - self.tuner = tuner - self.default_model = default_model - super().__init__( - model_name="ajet", - api_key="dummy-api-key", - stream=False, - ) - - def __call__(self, *args, **kwargs): - if not self.tuner.is_target_trainable(self.name): - # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, - # and self.name is not in it, use default model - return self.default_model(*args, **kwargs) - else: - # [TRAIN] - return self.tuner(*args, **kwargs) - - - -class OpenaiClientModelTuner: +TunerTypeUnion = Union[AgentScopeModelTuner, OpenaiClientModelTuner] - def __init__(self): - # Create a custom callable object for chat.completions.create - self.chat = SpecialMagicMock(allowed_attributes="completions") # Empty object for `chat` - self.chat.completions = SpecialMagicMock(allowed_attributes="create") # Empty object for `completions` - self.chat.completions.create = self.create # Redirect to create - - def create( - self, - *, - messages, - model, - audio, - frequency_penalty, - function_call, - functions, - logit_bias, - logprobs, - max_completion_tokens, - max_tokens, - metadata, - modalities, - n, - parallel_tool_calls, - prediction, - presence_penalty, - reasoning_effort, - response_format, - seed, - service_tier, - stop, - store, - stream, - stream_options, - temperature, - tool_choice, - tools, - top_logprobs, - top_p, - user, - web_search_options, - extra_headers, - extra_query, - extra_body, - timeout, - ) -> ChatCompletion: - # call llm model ✨ - response_gen = await self.llm_proxy( - api_key=self.api_key, - structured_model=structured_model, - **kwargs, - ) - -TunerTypeUnion = Union[Type["TunerV2"], Type["AgentScopeModelTuner"], Type["OpenaiClientModelTuner"]] - -class TunerV2(BaseModel): +class TunerV2(object): def __init__( self, config, context_tracker: MultiAgentContextTracker, - workflow: "Workflow", + user_workflow: "Workflow", **kwargs, ) -> None: self.config = config - self.workflow = workflow + self.workflow = user_workflow self.context_tracker = context_tracker self.target2proxy_registry: dict[str, TunerTypeUnion] = {} + self.kwargs = kwargs def as_agentscope_model( @@ -133,10 +44,11 @@ def as_agentscope_model( explicit_tuner_as_modelscope_model = AgentScopeModelTuner( config=self.config, context_tracker=self.context_tracker, - workflow=self.workflow, + user_workflow=self.workflow, agent_name=agent_name, debug_model=debug_model, use_debug_model=(not self.is_target_trainable(target_tag)), + **self.kwargs, ) self.register_model(target_tag, explicit_tuner_as_modelscope_model) return explicit_tuner_as_modelscope_model @@ -146,29 +58,38 @@ def as_raw_openai_sdk_client( self, agent_name="default_agent_name", target_tag="default_target_tag", - debug_model=None - ) -> Any: + debug_model='gpt-4o', + ) -> OpenaiClientModelTuner: """Convert to raw OpenAI SDK client for advanced usage. Returns: Any: The raw OpenAI SDK client. """ - return OpenaiClientModelTuner( - + explicit_tuner_as_oai_client = OpenaiClientModelTuner( + config=self.config, + context_tracker=self.context_tracker, + workflow=self.workflow, + agent_name=agent_name, + debug_model=debug_model, + use_debug_model=(not self.is_target_trainable(target_tag)), + **self.kwargs, ) + self.register_model(target_tag, explicit_tuner_as_oai_client) + return explicit_tuner_as_oai_client def __call__(self, **kwargs): """This method is **deprecated**. The current behavior of this method is pretend as a agentscope model """ - explicit_tuner = AgentScopeModelTuner( - config=self.config, - context_tracker=self.context_tracker, - workflow=self.workflow, - )(**kwargs) - self.register_model("default_target_tag", explicit_tuner) - return explicit_tuner + # explicit_tuner = AgentScopeModelTuner( + # config=self.config, + # context_tracker=self.context_tracker, + # workflow=self.workflow, + # )(**kwargs) + # self.register_model("default_target_tag", explicit_tuner) + # return explicit_tuner + raise RuntimeError("This method is deprecated. Please use `as_agentscope_model` instead.") @@ -204,7 +125,7 @@ def is_target_trainable(self, target_name) -> bool: else: return False - def get_llm_proxy(self) -> AgentScopeLlmProxy: + def get_llm_proxy(self) -> OpenaiLlmProxyWithTracker: """Get the LlmProxyForAgentScope instance. Returns: LlmProxyForAgentScope: diff --git a/ajet/utils/testing_utils.py b/ajet/utils/testing_utils.py index 2f61ddde..e64a1c60 100644 --- a/ajet/utils/testing_utils.py +++ b/ajet/utils/testing_utils.py @@ -144,9 +144,7 @@ def populate_test_env_metadata(workspace_dir: str) -> tuple[str, str]: def update_benchmark_status(status, status_detail, append_log="", data_dashboard_url=""): if "AJET_GIT_HASH" not in os.environ: - raise RuntimeError( - "AJET_GIT_HASH not found in environment variables. Please set `ajet.execute_test=False`." - ) + return git_hash = os.environ["AJET_GIT_HASH"] req_txt = os.environ["AJET_REQ_TXT"] diff --git a/docs/en/configuration.md b/docs/en/configuration.md index 9830fca2..de2a373a 100644 --- a/docs/en/configuration.md +++ b/docs/en/configuration.md @@ -149,7 +149,7 @@ Controls agent behavior during environment interaction: ```yaml title="config.yaml" ajet: rollout: - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow max_env_worker: 128 temperature: 0.9 top_p: 1.0 @@ -160,7 +160,7 @@ ajet: | Parameter | Description | |-----------|-------------| -| `agentscope_workflow` | Path to workflow implementation class | +| `user_workflow` | Path to workflow implementation class | | `temperature` / `top_p` | Sampling parameters | | `name` | Inference engine (e.g., `vllm`) | | `n_vllm_engine` | Number of vLLM engines (Trinity only) | @@ -283,7 +283,7 @@ All experiment outputs are saved in `./launcher_record/{experiment_name}`: train_batch_size: 32 rollout: - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: False max_env_worker: 128 gamma: 1.0 diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index a3bda809..a5b6e45d 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -137,9 +137,9 @@ You can also refer to this file to implement your own Judge for your specific ta Copy and modify the key parameters in `tutorial/example_appworld/appworld.yaml`. The parts most relevant to this document are marked with in the yaml file: 1. **Read tasks** (corresponding config field: `ajet.task_reader`) -2. **Define the workflow** (corresponding config field: `ajet.rollout.agentscope_workflow`) +2. **Define the workflow** (corresponding config field: `ajet.rollout.user_workflow`) - Example: if the AgentScope workflow is defined in the `ExampleAgentScopeWorkflow` class in `tutorial/example_appworld/appworld.py` - - Then set `ajet.rollout.agentscope_workflow = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow"` + - Then set `ajet.rollout.user_workflow = "tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow"` 3. **Define the scoring function** (corresponding config field: `ajet.task_judge.judge_protocol`) - Example: `ajet.task_judge.judge_protocol = "ajet.task_judge.env_service_as_judge->EnvServiceJudge"` 4. **Specify the model** (corresponding config field: `ajet.model.path`) @@ -156,7 +156,7 @@ ajet: path: YOUR_MODEL_PATH rollout: # [key] Implement and select the Agent - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: True debug: debug_max_parallel: 1 diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index a198c0ec..e284e905 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -110,9 +110,9 @@ WorkflowOutput( Copy and modify key parameters in `tutorial/example_countdown/countdown.yaml`. The most relevant parts in the yaml file are marked with symbols. 1. Read task (corresponds to configuration field `ajet.task_reader`) -2. Define Workflow (corresponds to configuration field `ajet.rollout.agentscope_workflow`) +2. Define Workflow (corresponds to configuration field `ajet.rollout.user_workflow`) - Example: If agentscope workflow is defined in `ExampleCountdownLearn` class of `tutorial/example_countdown/countdown.py` - - Then set `ajet.rollout.agentscope_workflow`=`tutorial.example_countdown.countdown->ExampleCountdownLearn` + - Then set `ajet.rollout.user_workflow`=`tutorial.example_countdown.countdown->ExampleCountdownLearn` 3. Define scoring function (corresponds to configuration field `ajet.task_judge.judge_protocol`) - Example: If agentscope workflow is defined in `CountdownAnswerAsJudge` class of `tutorial/example_countdown/countdown_answer_as_judge.py` - Then set `ajet.task_judge.judge_protocol`=`tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge` @@ -123,7 +123,7 @@ ajet: task_reader: type: huggingface_dat_repo # [key] `env_service` or `dataset_file` or `huggingface_dat_repo` or `data_generation` rollout: - agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # [key] Write and select Agent + user_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # [key] Write and select Agent task_judge: # [key] Write and select evaluation function judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index 8e0e601d..7b0b2968 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -83,7 +83,7 @@ This example packages a multi-step environment interaction loop into a trainable The key fields in `tutorial/example_frozenlake/frozenlake_easy.yaml` / `frozenlake_hard.yaml` are: -- `ajet.rollout.agentscope_workflow`: entry point of the workflow class, set to `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`. +- `ajet.rollout.user_workflow`: entry point of the workflow class, set to `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`. - `ajet.rollout.multi_turn.max_steps`: maximum steps per episode (also used by the agent). - `frozen_lake.frozen_lake_size`: grid size (e.g. 4 for easy, 6 for hard). - `frozen_lake.is_slippery`: whether the action may slip to unintended directions. diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index c815014e..3f1b9e51 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -55,7 +55,7 @@ bash ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' -- ``` -If the results are incorrect, the quickest troubleshooting points include: whether the data path exists, whether an API key has been set if judge requires it, and whether the workflow classpath in `agentscope_workflow` matches the location of your code. +If the results are incorrect, the quickest troubleshooting points include: whether the data path exists, whether an API key has been set if judge requires it, and whether the workflow classpath in `user_workflow` matches the location of your code.
    @@ -69,7 +69,7 @@ This tutorial trains a model to **ask the next best question** from a short doct #### 3.2 YAML Configuration -The whole example is “wired” in the YAML and implemented in one file. In the YAML, `task_reader` provides the dataset split, `rollout.agentscope_workflow` tells AgentJet which workflow to run for each sample, and `task_judge` provides the reward entry that wraps the LLM judge. The `model` section decides which pretrained backbone you start from. +The whole example is “wired” in the YAML and implemented in one file. In the YAML, `task_reader` provides the dataset split, `rollout.user_workflow` tells AgentJet which workflow to run for each sample, and `task_judge` provides the reward entry that wraps the LLM judge. The `model` section decides which pretrained backbone you start from. ```yaml ajet: @@ -80,7 +80,7 @@ ajet: rollout: # For each sample: conversation context -> one next question - agentscope_workflow: tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask + user_workflow: tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask task_judge: # Reward function used by the trainer (internally calls the LLM judge) diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index 39e5d4ed..fd15d5da 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -108,7 +108,7 @@ ajet: type: huggingface_dat_repo # also supports: dataset_file / env_service rollout: - agentscope_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn + user_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn task_judge: judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge @@ -120,7 +120,7 @@ ajet: | Field | Description | |-------|-------------| | `task_reader` | Where tasks come from | -| `agentscope_workflow` | Which workflow runs per sample | +| `user_workflow` | Which workflow runs per sample | | `judge_protocol` | Which judge computes rewards | | `model.path` | Pretrained model to fine-tune | diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index 5432a5d2..cb841acd 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -93,7 +93,7 @@ ajet: path: YOUR_MODEL_PATH rollout: # Select the AgentScope Workflow entry - agentscope_workflow: tutorial.example_werewolves.start->ExampleWerewolves + user_workflow: tutorial.example_werewolves.start->ExampleWerewolves ``` ### 3.3 Code Map diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 321cc2c7..636cf6a8 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -252,7 +252,7 @@ Add the workflow configuration to `math_agent.yaml`: ajet: # ... rollout: - agentscope_workflow: workflow.py->MathAgentWorkflow + user_workflow: workflow.py->MathAgentWorkflow task_judge: judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge ``` @@ -285,7 +285,7 @@ Configure important training hyperparameters: ajet: # ... rollout: - agentscope_workflow: workflow.py->MathAgentWorkflow + user_workflow: workflow.py->MathAgentWorkflow temperature: 0.7 max_env_worker: 64 num_repeat: 4 diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md index 7cdb693c..cbcbf444 100644 --- a/docs/zh/configuration.md +++ b/docs/zh/configuration.md @@ -187,7 +187,7 @@ ajet: ```yaml title="rollout 配置" ajet: rollout: - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow max_env_worker: 128 temperature: 0.9 top_p: 1.0 @@ -198,7 +198,7 @@ ajet: | 配置项 | 说明 | |--------|------| -| `agentscope_workflow` | 具体的交互协议实现类 | +| `user_workflow` | 具体的交互协议实现类 | | `temperature` / `top_p` | 采样参数 | | `name` | 推理引擎名称(例如 `vllm`) | | `n_vllm_engine` | vLLM 引擎数量(仅 trinity 后端有效) | @@ -329,7 +329,7 @@ ajet: train_batch_size: 32 rollout: - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: False max_env_worker: 128 gamma: 1.0 diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index 966d41d3..c4ea55b9 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -62,7 +62,7 @@ ajet --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with- ajet --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` - 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与您的代码位置一致。 + 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与您的代码位置一致。 --- @@ -128,7 +128,7 @@ ajet: path: YOUR_MODEL_PATH rollout: # [关键] 编写并选择智能体 - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: True debug: debug_max_parallel: 1 @@ -138,7 +138,7 @@ ajet: | 配置项 | 说明 | |--------|------| | `task_reader` | 读取任务 | -| `agentscope_workflow` | 定义 Workflow | +| `user_workflow` | 定义 Workflow | | `judge_protocol` | 定义评分函数 | | `model.path` | 指定模型 | diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md index 976b55a1..82b6eca2 100644 --- a/docs/zh/example_countdown.md +++ b/docs/zh/example_countdown.md @@ -43,7 +43,7 @@ ajet --conf tutorial/example_countdown/countdown.yaml --backbone='verl' ajet --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview ``` -如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 +如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与你的代码位置一致。 @@ -86,9 +86,9 @@ WorkflowOutput( 拷贝并修改 `tutorial/example_countdown/countdown.yaml` 中的关键配置参数。yaml 中与本示例最相关的部分已经用 标出。 1. 读取任务(对应配置字段 `ajet.task_reader`) -2. 定义 Workflow(对应配置字段 `ajet.rollout.agentscope_workflow`) +2. 定义 Workflow(对应配置字段 `ajet.rollout.user_workflow`) - 示例:如果 AgentScope Workflow 定义在 `tutorial/example_countdown/countdown.py` 的 `ExampleCountdownLearn` 类中 - - 则配置 `ajet.rollout.agentscope_workflow` = `tutorial.example_countdown.countdown->ExampleCountdownLearn` + - 则配置 `ajet.rollout.user_workflow` = `tutorial.example_countdown.countdown->ExampleCountdownLearn` 3. 定义评分函数(对应配置字段 `ajet.task_judge.judge_protocol`) - 示例:如果评分逻辑定义在 `tutorial/example_countdown/countdown_answer_as_judge.py` 的 `CountdownAnswerAsJudge` 类中 - 则配置 `tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge` @@ -99,7 +99,7 @@ ajet: task_reader: type: huggingface_dat_repo # [关键] `env_service` 或 `dataset_file` 或 `huggingface_dat_repo` 或 `data_generation` rollout: - agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # [关键] 编写并选择智能体 + user_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # [关键] 编写并选择智能体 task_judge: # [关键] 编写并选择评估函数 judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md index 7c523901..d3c7d08f 100644 --- a/docs/zh/example_frozenlake.md +++ b/docs/zh/example_frozenlake.md @@ -41,7 +41,7 @@ ajet --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone='trinity ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview ``` -如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 +如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与你的代码位置一致。 @@ -60,7 +60,7 @@ ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' `tutorial/example_frozenlake/frozenlake_easy.yaml` / `frozenlake_hard.yaml` 中与本任务相关的关键字段包括: -- `ajet.rollout.agentscope_workflow`: Workflow 入口,示例中为 `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`。 +- `ajet.rollout.user_workflow`: Workflow 入口,示例中为 `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`。 - `ajet.rollout.multi_turn.max_steps`:单次 episode 的最大步数(智能体与环境均使用)。 - `frozen_lake.frozen_lake_size`:地图大小(easy 为 4,hard 为 6)。 - `frozen_lake.is_slippery`:是否启用打滑。 diff --git a/docs/zh/example_learning_to_ask.md b/docs/zh/example_learning_to_ask.md index 35d4fde4..50383ec3 100644 --- a/docs/zh/example_learning_to_ask.md +++ b/docs/zh/example_learning_to_ask.md @@ -50,7 +50,7 @@ ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --wit ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview ``` -如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与你的代码位置一致。 +如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与你的代码位置一致。 @@ -64,7 +64,7 @@ ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with- #### 3.2 YAML 配置说明 -整个例子主要通过 YAML 完成配置信息,实现代码则集中在一个文件里。在 YAML 中,`task_reader` 提供数据集划分;`rollout.agentscope_workflow` 告诉 AgentJet 对每条样本需要运行哪个 workflow;`task_judge` 提供封装了 LLM judge 的奖励入口;`model` 部分决定训练从哪个预训练 backbone 开始。 +整个例子主要通过 YAML 完成配置信息,实现代码则集中在一个文件里。在 YAML 中,`task_reader` 提供数据集划分;`rollout.user_workflow` 告诉 AgentJet 对每条样本需要运行哪个 workflow;`task_judge` 提供封装了 LLM judge 的奖励入口;`model` 部分决定训练从哪个预训练 backbone 开始。 ```yaml ajet: @@ -75,7 +75,7 @@ ajet: rollout: # For each sample: conversation context -> one next question - agentscope_workflow: tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask + user_workflow: tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask task_judge: # Reward function used by the trainer (internally calls the LLM judge) diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index cc0d10ce..d394ecd0 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -108,7 +108,7 @@ ajet: type: huggingface_dat_repo # 也支持: dataset_file / env_service rollout: - agentscope_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn + user_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn task_judge: judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge @@ -120,7 +120,7 @@ ajet: | 字段 | 说明 | |------|------| | `task_reader` | 任务来源 | -| `agentscope_workflow` | 每条样本运行哪个 workflow | +| `user_workflow` | 每条样本运行哪个 workflow | | `judge_protocol` | 由哪个 judge 计算 reward | | `model.path` | 要微调的预训练模型路径 | diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md index 1b74812e..cdbdbe5a 100644 --- a/docs/zh/example_werewolves.md +++ b/docs/zh/example_werewolves.md @@ -50,7 +50,7 @@ ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --w ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview ``` - 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `agentscope_workflow` 中的 workflow 类路径是否与您的代码位置一致。 + 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与您的代码位置一致。 --- @@ -95,7 +95,7 @@ ajet: model: path: YOUR_MODEL_PATH rollout: - agentscope_workflow: tutorial.example_werewolves.start->ExampleWerewolves + user_workflow: tutorial.example_werewolves.start->ExampleWerewolves ``` ### 代码结构 diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index 300d4d4a..9164823f 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -255,7 +255,7 @@ class MathAgentWorkflow(Workflow): ajet: # ... rollout: - agentscope_workflow: workflow.py->MathAgentWorkflow + user_workflow: workflow.py->MathAgentWorkflow task_judge: judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge @@ -289,7 +289,7 @@ ajet: ajet: # ... rollout: - agentscope_workflow: workflow.py->MathAgentWorkflow + user_workflow: workflow.py->MathAgentWorkflow temperature: 0.7 # 模型温度 max_env_worker: 64 # 最大的 rollout 多线程数量 num_repeat: 4 # 每个任务重复次数 diff --git a/tests/bench/benchmark_appworld/benchmark_appworld.yaml b/tests/bench/benchmark_appworld/benchmark_appworld.yaml index 022b0981..1640556d 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld.yaml @@ -22,7 +22,7 @@ ajet: rollout: # ✨✨✨✨ 编写并选择Agent agentscope_disable_toolcalls: True - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow temperature: 0.9 max_env_worker: 64 num_repeat: 6 diff --git a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml index 9cc54a0a..00c2402f 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml @@ -22,7 +22,7 @@ ajet: rollout: # ✨✨✨✨ 编写并选择Agent agentscope_disable_toolcalls: True - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow temperature: 0.9 max_env_worker: 64 num_repeat: 6 diff --git a/tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml b/tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml new file mode 100644 index 00000000..adf50744 --- /dev/null +++ b/tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml @@ -0,0 +1,71 @@ +# ------------------ 主要配置 ------------------ +ajet: + project_name: example_appworld + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge + + task_reader: + type: env_service # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code # code, text, box + training_split: train + validation_split: dev + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + # ✨✨✨✨ 编写并选择Agent + agentscope_disable_toolcalls: True + user_workflow: tutorial.example_appworld.appworld_oai_sdk->ExampleAgentScopeWorkflow + temperature: 0.9 + max_env_worker: 64 + num_repeat: 6 + agent_madness_reward: -1.0 + tensor_model_parallel_size: 1 + max_num_seqs: 40 + compute_madness_checklist: + - "nonsense" + max_response_length_in_one_turn: 4096 + max_model_len: 18000 + multi_turn: + max_sample_per_task: 25 + max_steps: 25 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + data: + train_batch_size: 64 + max_prompt_length: 3000 + max_response_length: 15000 + + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + nnodes: 1 + n_gpus_per_node: 8 + + execute_test: True # DO NOT EDIT, THIS IS FOR TEST ROBOT + execute_testing_lambda: "tests/bench/benchmark_appworld/benchmark_appworld.py->TestProbe" # + + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - verl_default # verl inherit 1/1 + - trinity_default # trinity inherit 1/1 + - ajet_default + - _self_ diff --git a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py index 5d824b48..df28a7be 100644 --- a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py @@ -11,7 +11,7 @@ class TestBenchmarkAppworld(BenchmarkTestCase): def test_01_begin_verl(self): # get probe target, so as to get timeout settings BACKBONE = "verl" - TEST_TARGET = "tests/bench/benchmark_appworld/benchmark_appworld.yaml" + TEST_TARGET = "tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml" PROBE_TARGET = "tests/bench/benchmark_appworld/benchmark_appworld.py->TestProbe" # tests/bench/benchmark_appworld/benchmark_appworld.py # tests/bench/benchmark_appworld/benchmark_appworld.yaml diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.yaml b/tests/bench/benchmark_countdown/benchmark_countdown.yaml index 12eb075a..98faf756 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.yaml +++ b/tests/bench/benchmark_countdown/benchmark_countdown.yaml @@ -19,7 +19,7 @@ ajet: rollout: # ✨✨✨✨ the path to the workflow class - agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn + user_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # whether or not to disable all tool calls agentscope_disable_toolcalls: True diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml index b73ab418..06ae3112 100644 --- a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml @@ -16,7 +16,7 @@ ajet: rollout: # the path to the workflow class - agentscope_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow + user_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow agentscope_disable_toolcalls: True temperature: 0.9 diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml index 414eca39..64e4199b 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml @@ -13,7 +13,7 @@ ajet: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct rollout: - agentscope_workflow: "tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask" + user_workflow: "tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask" agentscope_disable_toolcalls: True temperature: 1.0 max_env_worker: 64 diff --git a/tests/bench/benchmark_math/benchmark_math.yaml b/tests/bench/benchmark_math/benchmark_math.yaml index ba783304..0f24a0de 100644 --- a/tests/bench/benchmark_math/benchmark_math.yaml +++ b/tests/bench/benchmark_math/benchmark_math.yaml @@ -17,7 +17,7 @@ ajet: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct rollout: - agentscope_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 1.0 max_env_worker: 64 max_num_seqs: 256 diff --git a/tests/bench/benchmark_math/benchmark_math_oai_sdk.yaml b/tests/bench/benchmark_math/benchmark_math_oai_sdk.yaml new file mode 100644 index 00000000..52795ba5 --- /dev/null +++ b/tests/bench/benchmark_math/benchmark_math_oai_sdk.yaml @@ -0,0 +1,74 @@ +# ------------------ 主要配置 ------------------ +ajet: + project_name: benchmarking + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + huggingface_dat_repo: + dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' + training_split: "train" + validation_split: "test" + + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + + rollout: + user_workflow: "tutorial.example_math_agent.math_agent_oai_sdk->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 1.0 + max_env_worker: 64 + max_num_seqs: 256 + num_repeat: 6 + agent_madness_reward: 0.0 + tensor_model_parallel_size: 1 + multi_turn: + max_sample_per_task: 2 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" + max_response_length_in_one_turn: 1024 + max_model_len: 10000 + n_vllm_engine: 2 + + data: + train_batch_size: 100 + max_prompt_length: 3000 + max_response_length: 7000 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + trainer_common: + save_freq: 100 + test_freq: 999999 + total_epochs: 100 + logger: swanlab + + + execute_test: True # DO NOT EDIT, THIS IS FOR TEST ROBOT + execute_testing_lambda: "tests/bench/benchmark_math/benchmark_math.py->TestProbe" # + + +trinity: + synchronizer: + sync_offset: 1 + sync_method: nccl + + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - verl_default # verl inherit + - trinity_default # trinity inherit + - ajet_default + - _self_ diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index a7dd7bc9..116dc240 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -53,9 +53,9 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_appworld/appworld.yaml](../tutorial/example_appworld/appworld.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 ajet.task_reader) -2. 定义 Workflow(对应配置字段 ajet.rollout.agentscope_workflow ) +2. 定义 Workflow(对应配置字段 ajet.rollout.user_workflow ) - 举例如果 agentscope workflow 定义在 `tutorial/appworld.py` 的`ExampleAgentScopeWorkflow` 类 - - 则填写 ajet.rollout.agentscope_workflow=`tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow` + - 则填写 ajet.rollout.user_workflow=`tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow` 3. 定义评分函数(对应配置字段 ajet.task_judge.judge_protocol ) - 填写 ajet.task_judge.judge_protocol=`ajet.task_judge.env_service_as_judge->EnvServiceJudge` 4. 指定模型(对应配置字段 ajet.model.path ) @@ -72,7 +72,7 @@ ajet path: YOUR_MODEL_PATH rollout: # ✨✨✨✨ 编写并选择Agent - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow agentscope_disable_toolcalls: True debug: debug_max_parallel: 1 diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index c1f424ad..9a4b6818 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -22,7 +22,7 @@ ajet: rollout: # ✨✨✨✨ 编写并选择Agent agentscope_disable_toolcalls: True - agentscope_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow + user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow temperature: 0.9 max_env_worker: 64 num_repeat: 6 diff --git a/tutorial/example_appworld/appworld_oai_sdk.py b/tutorial/example_appworld/appworld_oai_sdk.py new file mode 100644 index 00000000..92f1f59b --- /dev/null +++ b/tutorial/example_appworld/appworld_oai_sdk.py @@ -0,0 +1,50 @@ +from agentscope.message import Msg +from pydantic import Field + +from ajet import Workflow, WorkflowOutput, WorkflowTask +from ajet.tuner_v2 import TunerV2 as ModelTuner +from openai.types.chat.chat_completion import ChatCompletion + + +class ExampleAgentScopeWorkflow(Workflow): + trainer: str = Field(default="ajet-trinity") + + async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + + init_messages = workflow_task.task.init_messages + if len(init_messages) >= 2: + first_msg, init_messages = init_messages[0], init_messages[1:] + else: + first_msg = {"content": "You're a helpful assistant."} + interaction_message = [] + for msg in init_messages: + interaction_message.append( + Msg( + name=msg.get("name", "user"), + content=msg.get("content", ""), + role=msg.get("role", "user"), + ) + ) + + client = model_tuner.as_raw_openai_sdk_client() + env = workflow_task.gym_env + step = 0 + for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): + # agentscope deal with interaction message + reply_message: ChatCompletion = await client.chat.completion.create(interaction_message) + # env service protocol + obs, _, terminate, _ = env.step( + action={"content": reply_message.choices[0].message.content, "role": "assistant"} + ) + # generate new message from env output + interaction_message = Msg(name="env", content=obs, role="user") + # is terminated? + if terminate: + break + if model_tuner.get_context_tracker().context_overflow: + break + + return WorkflowOutput(reward=None, metadata={"total_step": step}) diff --git a/tutorial/example_appworld/appworld_oai_sdk.yaml b/tutorial/example_appworld/appworld_oai_sdk.yaml new file mode 100644 index 00000000..6d7e44ad --- /dev/null +++ b/tutorial/example_appworld/appworld_oai_sdk.yaml @@ -0,0 +1,68 @@ +# ------------------ 主要配置 ------------------ +ajet: + project_name: example_appworld + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge + + task_reader: + type: env_service # `env_service` or `jsonl_dataset_file` or `huggingface_dat_repo` or `data_generation` or `random_dummy` + env_service: + env_type: "appworld" + env_url: "http://127.0.0.1:8080" + env_action_preference: code # code, text, box + training_split: train + validation_split: dev + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct + + rollout: + # ✨✨✨✨ 编写并选择Agent + agentscope_disable_toolcalls: True + user_workflow: tutorial.example_appworld.appworld_oai_sdk->ExampleAgentScopeWorkflow + temperature: 0.9 + max_env_worker: 64 + num_repeat: 6 + agent_madness_reward: -1.0 + tensor_model_parallel_size: 1 + max_num_seqs: 40 + compute_madness_checklist: + - "nonsense" + max_response_length_in_one_turn: 4096 + max_model_len: 18000 + multi_turn: + max_sample_per_task: 25 + max_steps: 25 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + data: + train_batch_size: 64 + max_prompt_length: 3000 + max_response_length: 15000 + + trainer_common: + save_freq: 99999 + test_freq: 99999 + total_epochs: 99999 + nnodes: 1 + n_gpus_per_node: 8 + + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - verl_default # verl inherit 1/1 + - trinity_default # trinity inherit 1/1 + - ajet_default + - _self_ diff --git a/tutorial/example_countdown/countdown.yaml b/tutorial/example_countdown/countdown.yaml index 0761ab54..53914081 100644 --- a/tutorial/example_countdown/countdown.yaml +++ b/tutorial/example_countdown/countdown.yaml @@ -19,7 +19,7 @@ ajet: rollout: # ✨✨✨✨ the path to the workflow class - agentscope_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn + user_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # whether or not to disable all tool calls agentscope_disable_toolcalls: True diff --git a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml index 8d0ea333..1cb01333 100644 --- a/tutorial/example_feedback_tracing/example_feedback_tracing.yaml +++ b/tutorial/example_feedback_tracing/example_feedback_tracing.yaml @@ -36,7 +36,7 @@ ajet: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_workflow: tutorial.example_feedback_tracing.train->ExampleTracingFeedbackTrain + user_workflow: tutorial.example_feedback_tracing.train->ExampleTracingFeedbackTrain temperature: 0.7 max_env_worker: 256 num_repeat: 8 diff --git a/tutorial/example_frozenlake/frozenlake_easy.yaml b/tutorial/example_frozenlake/frozenlake_easy.yaml index 8dd9bcdd..2662c43c 100644 --- a/tutorial/example_frozenlake/frozenlake_easy.yaml +++ b/tutorial/example_frozenlake/frozenlake_easy.yaml @@ -15,7 +15,7 @@ ajet: rollout: # the path to the workflow class - agentscope_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow # ✨✨✨✨ select agent + user_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow # ✨✨✨✨ select agent agentscope_disable_toolcalls: True temperature: 0.9 diff --git a/tutorial/example_frozenlake/frozenlake_hard.yaml b/tutorial/example_frozenlake/frozenlake_hard.yaml index 5258d01f..b7f6a56a 100644 --- a/tutorial/example_frozenlake/frozenlake_hard.yaml +++ b/tutorial/example_frozenlake/frozenlake_hard.yaml @@ -15,7 +15,7 @@ ajet: rollout: # the path to the workflow class - agentscope_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow # ✨✨✨✨ select agent + user_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow # ✨✨✨✨ select agent agentscope_disable_toolcalls: True temperature: 0.9 diff --git a/tutorial/example_learn2ask/learn2ask.yaml b/tutorial/example_learn2ask/learn2ask.yaml index 28a2771f..b50ea35f 100644 --- a/tutorial/example_learn2ask/learn2ask.yaml +++ b/tutorial/example_learn2ask/learn2ask.yaml @@ -13,7 +13,7 @@ ajet: path: Qwen/Qwen2.5-7B-Instruct rollout: - agentscope_workflow: "tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask" + user_workflow: "tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask" agentscope_disable_toolcalls: True temperature: 1.0 max_env_worker: 64 diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index fb7b825a..39e645f5 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -83,9 +83,9 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_math_agent/math_agent.yaml](../tutorial/example_math_agent/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 ajet.task_reader) -2. 定义 Workflow(对应配置字段 ajet.rollout.agentscope_workflow ) +2. 定义 Workflow(对应配置字段 ajet.rollout.user_workflow ) - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - - 则填写 ajet.rollout.agentscope_workflow=`tutorial.math_agent->ExampleMathLearn` + - 则填写 ajet.rollout.user_workflow=`tutorial.math_agent->ExampleMathLearn` 3. 定义评分函数(对应配置字段 ajet.task_judge.judge_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/example_math_agent/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - 则填写 ajet.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` @@ -96,7 +96,7 @@ ajet task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` rollout: - agentscope_workflow: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent + user_workflow: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent task_judge: # ✨✨✨✨ 编写并选择评价函数 judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index a64a955a..caf10ef3 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -46,7 +46,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, + model=model_tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 67dbc62e..fccb8430 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -18,7 +18,7 @@ ajet: path: Qwen/Qwen2.5-7B rollout: - agentscope_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 1.0 max_env_worker: 64 num_repeat: 6 diff --git a/tutorial/example_math_agent/math_agent_oai_sdk.py b/tutorial/example_math_agent/math_agent_oai_sdk.py new file mode 100644 index 00000000..bf7e0cf5 --- /dev/null +++ b/tutorial/example_math_agent/math_agent_oai_sdk.py @@ -0,0 +1,165 @@ +from agentscope.message import Msg +from loguru import logger + +from ajet import Workflow, WorkflowOutput, WorkflowTask +from openai.types.chat.chat_completion import ChatCompletion +from openai.types.chat import ChatCompletionMessageToolCall +from agentscope.tool import execute_python_code +from ajet.tuner_v2 import TunerV2 +from textwrap import dedent + +import json +import asyncio + +# def extract_final_answer(result) -> str: +# """Extract the final answer from the agent's response.""" +# try: +# if ( +# hasattr(result, "metadata") +# and isinstance(result.metadata, dict) +# and "result" in result.metadata +# ): +# return result.metadata["result"] +# if hasattr(result, "content"): +# if isinstance(result.content, dict) and "result" in result.content: +# return result.content["result"] +# return str(result.content) +# return str(result) +# except Exception as e: +# logger.warning(f"Extract final answer error: {e}. Raw: {result}") +# return str(result) + + + +# ------------------------------------------------------ +# Simple version - no tool call +# ------------------------------------------------------ + + +class ExampleMathLearn_Simple_NoToolCall(Workflow): + name: str = "math_agent_workflow" + system_prompt: str = dedent(""" + You are an agent specialized in solving math problems. + Please solve the math problem given to you. + You can write and execute Python code to perform calculation or verify your answer. + You should return your final answer within \\boxed{{}}. + """) + + async def execute(self, workflow_task: WorkflowTask, model_tuner: TunerV2) -> WorkflowOutput: # type: ignore + from ajet import bp; bp('MATHX') + query = workflow_task.task.main_query + client = model_tuner.as_raw_openai_sdk_client() + + messages = [ + { + "role": "system", + "content": self.system_prompt + }, + { + "role": "user", + "content": query + } + ] + reply_message: ChatCompletion = await client.chat.completions.create(messages=messages) + final_answer = reply_message.choices[0].message.content + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + + + + + + + + + + +# ------------------------------------------------------ +# Tool use version +# ------------------------------------------------------ + +class ExampleMathLearn(Workflow): + + name: str = "math_agent_workflow" + system_prompt: str = dedent(""" + You are an agent specialized in solving math problems with tools. + Please solve the math problem given to you. + You can write and execute Python code to perform calculation or verify your answer. + You should return your final answer within \\boxed{{}}. + """) + available_functions: list = [ + { + "type": "function", + "function": { + "name": "execute_python_code", + "description": "Execute the given Python code in a temp file and capture the return code, standard output, and error.", + "parameters": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "The Python code to be executed." + }, + "timeout": { + "type": "number", + "description": "The maximum time (in seconds) allowed for the code to run.", + "default": 300 + } + }, + "required": ["code"] + } + } + }, + ] + + async def execute(self, workflow_task: WorkflowTask, model_tuner: TunerV2) -> WorkflowOutput: # type: ignore + + + query = workflow_task.task.main_query + client = model_tuner.as_raw_openai_sdk_client() + + # call 1: get response with tool call + messages = [ + { "role": "system", "content": self.system_prompt }, + { "role": "user", "content": query } + ] + reply_message: ChatCompletion = await client.chat.completions.create(messages=messages, tools=self.available_functions) + # If the model called a tool + if (reply_message.choices[0].message) and (reply_message.choices[0].message.tool_calls): + tool_calls: list[ChatCompletionMessageToolCall] = reply_message.choices[0].message.tool_calls + for tool_call in tool_calls: + if tool_call.function.name == "execute_python_code": + arguments = json.loads(tool_call.function.arguments) + + def sync_wrapper(): + # since execute_python_code will create subprocess, we need to run it in a separate thread + return asyncio.run(execute_python_code(arguments["code"], arguments.get("timeout", 300))) + result = await asyncio.to_thread(sync_wrapper) + + tool_result_message = { + "role": "tool", + "tool_call_id": tool_call.id, + "name": tool_call.function.name, + "content": json.dumps({ + "return_code": str(result), + }) + } + + if (reply_message.choices[0].message.content): + messages.append({ + "role": "assistant", + "content": reply_message.choices[0].message.content + }) + + from ajet import bp; bp('MATHX') + messages.append(tool_result_message) + + # Step 3: Make a follow-up API call with the tool result + final_response: ChatCompletion = await client.chat.completions.create( + messages=messages, + ) + final_stage_response = final_response.choices[0].message.content + else: + final_stage_response = reply_message.choices[0].message.content + + + return WorkflowOutput(reward=None, metadata={"final_answer": final_stage_response}) diff --git a/tutorial/example_rubrics_judge/math_agent.md b/tutorial/example_rubrics_judge/math_agent.md index ca068cd2..0d1c74b4 100644 --- a/tutorial/example_rubrics_judge/math_agent.md +++ b/tutorial/example_rubrics_judge/math_agent.md @@ -83,9 +83,9 @@ Judge的返回值: raw_reward, is_success 4.1 复制并修改 [tutorial/example_rubrics_judge/math_agent.yaml](../tutorial/example_rubrics_judge/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 1. 读取task(对应配置字段 ajet.task_reader) -2. 定义 Workflow(对应配置字段 ajet.rollout.agentscope_workflow ) +2. 定义 Workflow(对应配置字段 ajet.rollout.user_workflow ) - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - - 则填写 ajet.rollout.agentscope_workflow=`tutorial.math_agent->ExampleMathLearn` + - 则填写 ajet.rollout.user_workflow=`tutorial.math_agent->ExampleMathLearn` 3. 定义评分函数(对应配置字段 ajet.task_judge.judge_protocol ) - 举例如果 agentscope workflow 定义在 `tutorial/example_math_agent/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - 则填写 ajet.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` @@ -96,7 +96,7 @@ ajet task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` rollout: - agentscope_workflow: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent + user_workflow: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent task_judge: # ✨✨✨✨ 编写并选择评价函数 judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge diff --git a/tutorial/example_rubrics_judge/r_judge.yaml b/tutorial/example_rubrics_judge/r_judge.yaml index 50f91808..f7a171ec 100644 --- a/tutorial/example_rubrics_judge/r_judge.yaml +++ b/tutorial/example_rubrics_judge/r_judge.yaml @@ -41,7 +41,7 @@ ajet: path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-14B-Instruct rollout: - agentscope_workflow: "tutorial.example_rubrics_judge.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + user_workflow: "tutorial.example_rubrics_judge.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 0.7 max_env_worker: 80 num_repeat: 4 diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index 64f693cd..90c0a8db 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -47,7 +47,7 @@ # ✨✨✨✨ 设置待训练的模型 path: YOUR_MODEL_PATH rollout: - agentscope_workflow: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent + user_workflow: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent ``` diff --git a/tutorial/example_werewolves/werewolves.yaml b/tutorial/example_werewolves/werewolves.yaml index f160e9f9..ac6d9e72 100644 --- a/tutorial/example_werewolves/werewolves.yaml +++ b/tutorial/example_werewolves/werewolves.yaml @@ -15,7 +15,7 @@ ajet: rollout: # the path to the workflow class - agentscope_workflow: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ select agent + user_workflow: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ select agent temperature: 0.7 From c8e0bd8eeac4ae6f2994e240c4c46f4d743b77c6 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 7 Jan 2026 16:54:31 +0800 Subject: [PATCH 385/462] adjust var names --- .../agentscope_tracker/multiagent_tracking.py | 72 +++++++++++-------- .../agentscope_tracker/timeline_merging.py | 10 +-- ajet/context_tracker/base_tracker.py | 1 - ajet/context_tracker/basic_tracker.py | 1 - ajet/default_config/ajet_default.yaml | 42 ++++++----- ajet/default_config/verl/verl_default.yaml | 1 - ajet/task_rollout/async_llm_bridge.py | 2 +- ajet/task_runner/base_runner.py | 1 - docs/en/configuration.md | 3 +- docs/en/example_app_world.md | 2 +- docs/zh/configuration.md | 3 +- docs/zh/example_app_world.md | 2 +- .../benchmark_appworld.yaml | 2 +- .../benchmark_appworld_2nodes.yaml | 2 +- .../benchmark_appworld_oai_sdk.yaml | 2 +- .../benchmark_countdown.yaml | 2 +- .../benchmark_frozenlake.yaml | 2 +- .../benchmark_learn2ask.yaml | 2 +- tutorial/example_appworld/appworld.md | 2 +- tutorial/example_appworld/appworld.yaml | 2 +- .../example_appworld/appworld_oai_sdk.yaml | 2 +- tutorial/example_countdown/countdown.yaml | 2 +- .../example_frozenlake/frozenlake_easy.yaml | 2 +- .../example_frozenlake/frozenlake_hard.yaml | 2 +- tutorial/example_learn2ask/learn2ask.yaml | 2 +- .../example_math_agent/math_agent_oai_sdk.py | 15 ++-- 26 files changed, 100 insertions(+), 81 deletions(-) diff --git a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py index 1093b8ba..8d83b1b6 100644 --- a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -43,7 +43,7 @@ def __init__( def step_prepare(self, messages: List[dict], tools: List = []): self.full_context = [] consider_roles = ["user", "assistant", "system", "tool"] - disable_toolcalls = self.config.ajet.rollout.agentscope_disable_toolcalls + disable_toolcalls = self.config.ajet.rollout.force_disable_toolcalls if disable_toolcalls: consider_roles.remove("tool") tools = [] @@ -86,8 +86,10 @@ def step_prepare(self, messages: List[dict], tools: List = []): if ignore: continue msg["content"] = str(msg["content"]) # TODO: better handling mm data + if msg["role"] == "system": author = "initialization" + if msg["role"] == "tool": author = "env" else: @@ -216,12 +218,15 @@ def step_track( if context_safe: if ( "prompt_text" in llm_output and "prompt_token_ids" in llm_output - ): # currently we make this patch to better compat with Trinity training backend + ): + # currently we make this patch to better compat with Trinity training backend + # fix Retokenization Drift self.full_context = self.patch_prompt_tokens( prompt_text=llm_output["prompt_text"], prompt_token_ids=llm_output["prompt_token_ids"], previous_ext_context=self.full_context, ) + self.full_context += [llm_ext_msg] is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) if length > self.config.ajet.rollout.max_model_len: @@ -244,12 +249,14 @@ def step_track( # print(f"General Warning: merge failure discovered.") return None + def patch_prompt_tokens( self, prompt_text: str, prompt_token_ids: List[int], previous_ext_context: List[ExtendedMessage], ) -> List[ExtendedMessage]: + # remove tailing if prompt_text.endswith(self.generation_prompt): prompt_text = prompt_text[: -len(self.generation_prompt)] @@ -267,6 +274,7 @@ def patch_prompt_tokens( tmp = [prompt_token_ids[i]] if len(tmp) > 0: split_prompt_token_ids += [tmp] + # split prompt text into message level prompt_text_split = prompt_text.split("<|im_start|>") assert prompt_text_split[0] == "", "Prompt text should start with <|im_start|>" @@ -284,38 +292,40 @@ def patch_prompt_tokens( ) # try to recover tokens - for j in range(len(previous_ext_context)): - if prompt_text_split[j] != current_prompt_text[j]: - # if prompt text mismatch, we can replace the tokens - print_dict( - { - "expected_prompt_text": prompt_text_split[j], - "current_prompt_text": current_prompt_text[j], - }, - mod="exception", - header="Prompt text mismatch, Please report a github issue", - ) - previous_ext_context[j].token_arr = self.tokenizer( - prompt_text_split[j], return_tensors="pt", padding=False - ) - else: - # if prompt text match - # we further check whether all token ids matches - vllm_token_array = split_prompt_token_ids[j] - tracker_token_array = previous_ext_context[j].token_arr - if vllm_token_array == tracker_token_array: - # good, everything is perfect - continue - else: - # otherwise, we throw a warning (do not worry, this causes almost no influence in the training) + if self.config.ajet.context_tracker.fix_retokenization_drift: + for j in range(len(previous_ext_context)): + if prompt_text_split[j] != current_prompt_text[j]: + # if prompt text mismatch, we can replace the tokens print_dict( { - "expected_token_ids": split_prompt_token_ids[j], - "current_token_ids": previous_ext_context[j].token_arr, + "expected_prompt_text": prompt_text_split[j], + "current_prompt_text": current_prompt_text[j], }, mod="exception", - header="Prompt token ids mismatch, Please report a github issue", + header="Prompt text mismatch, Please report a github issue", ) + previous_ext_context[j].token_arr = self.tokenizer( + prompt_text_split[j], return_tensors="pt", padding=False + ) + else: + # if prompt text match + # we further check whether all token ids matches + vllm_token_array = split_prompt_token_ids[j] + tracker_token_array = previous_ext_context[j].token_arr + if vllm_token_array == tracker_token_array: + # good, everything is perfect + continue + else: + # otherwise, we throw a warning (do not worry, this causes almost no influence in the training) + print_dict( + { + "expected_token_ids": split_prompt_token_ids[j], + "current_token_ids": previous_ext_context[j].token_arr, + }, + mod="exception", + header="Prompt token ids mismatch, Please report a github issue", + ) + # remove extra messages if len(previous_ext_context) != len(prompt_text_split): previous_ext_context = previous_ext_context[: len(prompt_text_split)] @@ -418,8 +428,8 @@ def generate_log(self, task_id=None, global_step="NA"): ) def group_merge(self) -> List[List[ExtendedMessage]]: - timeline_merge_policy = self.config.ajet.timeline_merge_policy - self.grouped_steps = merge_tracker_timelines(self.grouped_steps, timeline_merge_policy) + timeline_merging_policy = self.config.ajet.context_tracker.timeline_merging_policy + self.grouped_steps = merge_tracker_timelines(self.grouped_steps, timeline_merging_policy) return self.grouped_steps def group_tokenize(self): diff --git a/ajet/context_tracker/agentscope_tracker/timeline_merging.py b/ajet/context_tracker/agentscope_tracker/timeline_merging.py index 72d0ed34..e81475dd 100644 --- a/ajet/context_tracker/agentscope_tracker/timeline_merging.py +++ b/ajet/context_tracker/agentscope_tracker/timeline_merging.py @@ -8,13 +8,13 @@ def is_timeline_mergeable( source_timeline: List[ExtendedMessage], target_timeline: List[ExtendedMessage], - timeline_merge_policy, + timeline_merging_policy, debug=False, ) -> bool: # timeline_compare_level = "text" # relaxed compare with text, more easier to match, at very little cost # timeline_compare_level = "token" # strict compare with token, cause less aggressive merging - timeline_compare_level = timeline_merge_policy.get("timeline_compare_level", "text") - ignore_tools = timeline_merge_policy.get("ignore_tools", True) + timeline_compare_level = timeline_merging_policy.get("timeline_compare_level", "text") + ignore_tools = timeline_merging_policy.get("ignore_tools", True) can_merge = False if len(source_timeline) >= len(target_timeline): @@ -93,7 +93,7 @@ def toggle_author_and_mask( def merge_tracker_timelines( timelines: List[List[ExtendedMessage]], - timeline_merge_policy + timeline_merging_policy ) -> List[List[ExtendedMessage]]: """Merge multiple timelines by absorbing those that can be merged. > Input: a list of timelines. (a timeline means: List[ExtendedMessage]) @@ -110,7 +110,7 @@ def merge_tracker_timelines( continue source_timeline = reversed_timelines[i] target_timeline = reversed_timelines[j] - if is_timeline_mergeable(source_timeline, target_timeline, timeline_merge_policy): + if is_timeline_mergeable(source_timeline, target_timeline, timeline_merging_policy): source_timeline = toggle_author_and_mask(source_timeline, target_timeline) reversed_timelines[i] = source_timeline absorbed_step_indices += [j] diff --git a/ajet/context_tracker/base_tracker.py b/ajet/context_tracker/base_tracker.py index 68d13a7d..429df4d7 100644 --- a/ajet/context_tracker/base_tracker.py +++ b/ajet/context_tracker/base_tracker.py @@ -122,7 +122,6 @@ def __init__(self, config, tokenizer, **kwargs): max_response_length = self.config.ajet.rollout.max_response_length_in_one_turn max_model_len: int = self.config.ajet.rollout.max_model_len self.max_seq_length: int = max_model_len - max_response_length - self.max_env_output_length: int = self.config.ajet.context_tracker.max_env_len self.blackout_token_combo = tokenizer.encode("<|im_start|>assistant\n") self._im_start_token_id = tokenizer.encode("<|im_start|>")[0] self.generated_token_cnt = 0 diff --git a/ajet/context_tracker/basic_tracker.py b/ajet/context_tracker/basic_tracker.py index f7169628..a8fbbad6 100644 --- a/ajet/context_tracker/basic_tracker.py +++ b/ajet/context_tracker/basic_tracker.py @@ -24,7 +24,6 @@ class BaseContextTracker(BaseTracker): full_context (List[ExtendedMessage]): List of all messages in the conversation current_context_status (str): Current status of the context max_seq_length (int): Maximum sequence length for the context window - max_env_output_length (int): Maximum length for environment outputs terminal_rewards_dict (dict): Dictionary storing terminal rewards """ diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 89ca75a5..61956327 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -26,7 +26,7 @@ ajet: user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow # whether or not to disable all tool calls - agentscope_disable_toolcalls: False + force_disable_toolcalls: False # maximum number of parallel environments / simulate workers max_env_worker: 128 @@ -172,6 +172,31 @@ ajet: max_score: 1 + + # context tracker protocol is valid ONLY when `use_agentscope_protocol=False` + context_tracker: + + # Retokenization Drift: inconsistencies between training and inference token array + fix_retokenization_drift: True + + # timeline merging policy used in Context Tracker + timeline_merging_policy: + + # compare_level = "text": relaxed compare with text, more easier to match, at very little cost + # compare_level = "token": strict compare with token, cause less aggressive merging + timeline_compare_level: "text" # options: "text", "token" + + # whether or not to ignore tool calls when comparing steps + ignore_tools: True + + + # deprecated + alien_llm_model: qwen3-235b-a22b-instruct-2507 + + # deprecated + alien_llm_response_length: 512 + + # when backbone is `debug`, debug related configurations debug: debug_max_parallel: 16 @@ -207,21 +232,6 @@ ajet: checkpoint_base_dir: ./saved_checkpoints - # context tracker protocol is valid ONLY when `use_agentscope_protocol=False` - context_tracker: - context_tracker_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - max_env_len: 4096 - - # timeline merging policy used in Context Tracker - timeline_merge_policy: - - # compare_level = "text": relaxed compare with text, more easier to match, at very little cost - # compare_level = "token": strict compare with token, cause less aggressive merging - timeline_compare_level: "text" # options: "text", "token" - ignore_tools: True # whether or not to ignore tool calls when comparing steps - # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. diff --git a/ajet/default_config/verl/verl_default.yaml b/ajet/default_config/verl/verl_default.yaml index cb10884d..51406396 100644 --- a/ajet/default_config/verl/verl_default.yaml +++ b/ajet/default_config/verl/verl_default.yaml @@ -152,7 +152,6 @@ actor_rollout_ref: log_prob_micro_batch_size: null log_prob_micro_batch_size_per_gpu: 4 log_prob_use_dynamic_bsz: true - max_env_len: 3000 max_env_worker: 64 max_model_len: 13000 max_num_batched_tokens: 8192 diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index 1e83e371..1b6e4f47 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -97,7 +97,7 @@ def llm_chat( if ( ("" in decoded_text) and ("" in decoded_text) - and (not self.config.ajet.rollout.agentscope_disable_toolcalls) + and (not self.config.ajet.rollout.force_disable_toolcalls) ): tool_parser = Hermes2ProToolParser(self.tokenizer) parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore diff --git a/ajet/task_runner/base_runner.py b/ajet/task_runner/base_runner.py index abbb654d..5671bc82 100644 --- a/ajet/task_runner/base_runner.py +++ b/ajet/task_runner/base_runner.py @@ -17,7 +17,6 @@ def __init__(self, llm_inference_fn: Callable, tokenizer: Any, config, **kwargs) self.config = config self.max_steps: int = self.config.ajet.rollout.multi_turn.max_steps self.max_model_len: int = self.config.ajet.rollout.max_model_len - self.max_env_len: int = self.config.ajet.context_tracker.max_env_len def get_judge(self) -> BaseJudge: # type: ignore if self.config.ajet.task_judge.judge_type == "customized_protocol": diff --git a/docs/en/configuration.md b/docs/en/configuration.md index de2a373a..1a963004 100644 --- a/docs/en/configuration.md +++ b/docs/en/configuration.md @@ -284,7 +284,7 @@ All experiment outputs are saved in `./launcher_record/{experiment_name}`: rollout: user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - agentscope_disable_toolcalls: False + force_disable_toolcalls: False max_env_worker: 128 gamma: 1.0 compute_madness_checklist: @@ -361,7 +361,6 @@ All experiment outputs are saved in `./launcher_record/{experiment_name}`: context_tracker_type: "linear" alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - max_env_len: 4096 ``` --- diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index a5b6e45d..ab6d1f8e 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -157,7 +157,7 @@ ajet: rollout: # [key] Implement and select the Agent user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - agentscope_disable_toolcalls: True + force_disable_toolcalls: True debug: debug_max_parallel: 1 debug_first_n_tasks: 1 diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md index cbcbf444..185dc984 100644 --- a/docs/zh/configuration.md +++ b/docs/zh/configuration.md @@ -330,7 +330,7 @@ ajet: rollout: user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - agentscope_disable_toolcalls: False + force_disable_toolcalls: False max_env_worker: 128 gamma: 1.0 compute_madness_checklist: @@ -416,5 +416,4 @@ ajet: context_tracker_type: "linear" alien_llm_model: qwen3-235b-a22b-instruct-2507 alien_llm_response_length: 512 - max_env_len: 4096 ``` diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md index c4ea55b9..fe6e3322 100644 --- a/docs/zh/example_app_world.md +++ b/docs/zh/example_app_world.md @@ -129,7 +129,7 @@ ajet: rollout: # [关键] 编写并选择智能体 user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - agentscope_disable_toolcalls: True + force_disable_toolcalls: True debug: debug_max_parallel: 1 debug_first_n_tasks: 1 diff --git a/tests/bench/benchmark_appworld/benchmark_appworld.yaml b/tests/bench/benchmark_appworld/benchmark_appworld.yaml index 1640556d..f83e91f0 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld.yaml @@ -21,7 +21,7 @@ ajet: rollout: # ✨✨✨✨ 编写并选择Agent - agentscope_disable_toolcalls: True + force_disable_toolcalls: True user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow temperature: 0.9 max_env_worker: 64 diff --git a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml index 00c2402f..4ae12f17 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml @@ -21,7 +21,7 @@ ajet: rollout: # ✨✨✨✨ 编写并选择Agent - agentscope_disable_toolcalls: True + force_disable_toolcalls: True user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow temperature: 0.9 max_env_worker: 64 diff --git a/tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml b/tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml index adf50744..e3175d19 100644 --- a/tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml +++ b/tests/bench/benchmark_appworld/benchmark_appworld_oai_sdk.yaml @@ -20,7 +20,7 @@ ajet: rollout: # ✨✨✨✨ 编写并选择Agent - agentscope_disable_toolcalls: True + force_disable_toolcalls: True user_workflow: tutorial.example_appworld.appworld_oai_sdk->ExampleAgentScopeWorkflow temperature: 0.9 max_env_worker: 64 diff --git a/tests/bench/benchmark_countdown/benchmark_countdown.yaml b/tests/bench/benchmark_countdown/benchmark_countdown.yaml index 98faf756..fcd07f35 100644 --- a/tests/bench/benchmark_countdown/benchmark_countdown.yaml +++ b/tests/bench/benchmark_countdown/benchmark_countdown.yaml @@ -22,7 +22,7 @@ ajet: user_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # whether or not to disable all tool calls - agentscope_disable_toolcalls: True + force_disable_toolcalls: True # maximum number of parallel environments / simulate workers max_env_worker: 128 diff --git a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml index 06ae3112..1e08d03c 100644 --- a/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml +++ b/tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml @@ -17,7 +17,7 @@ ajet: rollout: # the path to the workflow class user_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow - agentscope_disable_toolcalls: True + force_disable_toolcalls: True temperature: 0.9 diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml index 64e4199b..dd3b6a18 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml @@ -14,7 +14,7 @@ ajet: rollout: user_workflow: "tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask" - agentscope_disable_toolcalls: True + force_disable_toolcalls: True temperature: 1.0 max_env_worker: 64 num_repeat: 6 diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 116dc240..91c66373 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -73,7 +73,7 @@ ajet rollout: # ✨✨✨✨ 编写并选择Agent user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - agentscope_disable_toolcalls: True + force_disable_toolcalls: True debug: debug_max_parallel: 1 debug_first_n_tasks: 1 diff --git a/tutorial/example_appworld/appworld.yaml b/tutorial/example_appworld/appworld.yaml index 9a4b6818..316c605b 100644 --- a/tutorial/example_appworld/appworld.yaml +++ b/tutorial/example_appworld/appworld.yaml @@ -21,7 +21,7 @@ ajet: rollout: # ✨✨✨✨ 编写并选择Agent - agentscope_disable_toolcalls: True + force_disable_toolcalls: True user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow temperature: 0.9 max_env_worker: 64 diff --git a/tutorial/example_appworld/appworld_oai_sdk.yaml b/tutorial/example_appworld/appworld_oai_sdk.yaml index 6d7e44ad..056aac91 100644 --- a/tutorial/example_appworld/appworld_oai_sdk.yaml +++ b/tutorial/example_appworld/appworld_oai_sdk.yaml @@ -20,7 +20,7 @@ ajet: rollout: # ✨✨✨✨ 编写并选择Agent - agentscope_disable_toolcalls: True + force_disable_toolcalls: True user_workflow: tutorial.example_appworld.appworld_oai_sdk->ExampleAgentScopeWorkflow temperature: 0.9 max_env_worker: 64 diff --git a/tutorial/example_countdown/countdown.yaml b/tutorial/example_countdown/countdown.yaml index 53914081..d5b161bf 100644 --- a/tutorial/example_countdown/countdown.yaml +++ b/tutorial/example_countdown/countdown.yaml @@ -22,7 +22,7 @@ ajet: user_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # whether or not to disable all tool calls - agentscope_disable_toolcalls: True + force_disable_toolcalls: True # maximum number of parallel environments / simulate workers max_env_worker: 128 diff --git a/tutorial/example_frozenlake/frozenlake_easy.yaml b/tutorial/example_frozenlake/frozenlake_easy.yaml index 2662c43c..d6ba032a 100644 --- a/tutorial/example_frozenlake/frozenlake_easy.yaml +++ b/tutorial/example_frozenlake/frozenlake_easy.yaml @@ -16,7 +16,7 @@ ajet: rollout: # the path to the workflow class user_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow # ✨✨✨✨ select agent - agentscope_disable_toolcalls: True + force_disable_toolcalls: True temperature: 0.9 diff --git a/tutorial/example_frozenlake/frozenlake_hard.yaml b/tutorial/example_frozenlake/frozenlake_hard.yaml index b7f6a56a..beb23df1 100644 --- a/tutorial/example_frozenlake/frozenlake_hard.yaml +++ b/tutorial/example_frozenlake/frozenlake_hard.yaml @@ -16,7 +16,7 @@ ajet: rollout: # the path to the workflow class user_workflow: tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow # ✨✨✨✨ select agent - agentscope_disable_toolcalls: True + force_disable_toolcalls: True temperature: 0.9 diff --git a/tutorial/example_learn2ask/learn2ask.yaml b/tutorial/example_learn2ask/learn2ask.yaml index b50ea35f..acacbce2 100644 --- a/tutorial/example_learn2ask/learn2ask.yaml +++ b/tutorial/example_learn2ask/learn2ask.yaml @@ -14,7 +14,7 @@ ajet: rollout: user_workflow: "tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask" - agentscope_disable_toolcalls: True + force_disable_toolcalls: True temperature: 1.0 max_env_worker: 64 num_repeat: 6 diff --git a/tutorial/example_math_agent/math_agent_oai_sdk.py b/tutorial/example_math_agent/math_agent_oai_sdk.py index bf7e0cf5..b97d75c9 100644 --- a/tutorial/example_math_agent/math_agent_oai_sdk.py +++ b/tutorial/example_math_agent/math_agent_oai_sdk.py @@ -1,10 +1,7 @@ -from agentscope.message import Msg from loguru import logger - from ajet import Workflow, WorkflowOutput, WorkflowTask from openai.types.chat.chat_completion import ChatCompletion from openai.types.chat import ChatCompletionMessageToolCall -from agentscope.tool import execute_python_code from ajet.tuner_v2 import TunerV2 from textwrap import dedent @@ -131,8 +128,16 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: TunerV2) -> Wo arguments = json.loads(tool_call.function.arguments) def sync_wrapper(): - # since execute_python_code will create subprocess, we need to run it in a separate thread - return asyncio.run(execute_python_code(arguments["code"], arguments.get("timeout", 300))) + import subprocess + import sys + process = subprocess.run( + [sys.executable, "-c", arguments["code"]], + timeout=arguments.get("timeout", 300), + capture_output=True, + text=True + ) + return process.stdout + result = await asyncio.to_thread(sync_wrapper) tool_result_message = { From 26035a5c2df3b3d79670ff762e2f77f496d84b31 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 7 Jan 2026 18:14:47 +0800 Subject: [PATCH 386/462] Add configuration options for timeline merging and retokenization drift; refactor OpenAI client model tuner --- .../agentscope_tracker/multiagent_tracking.py | 294 +++++++++++------- ajet/default_config/ajet_default.yaml | 30 +- .../weight_tuner/as_oai_sdk_model.py | 31 +- .../example_math_agent/math_agent_oai_sdk.py | 22 +- 4 files changed, 221 insertions(+), 156 deletions(-) diff --git a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py index 8d83b1b6..37511360 100644 --- a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -1,6 +1,7 @@ # flake8: noqa: F541, F841 import copy import json +from dataclasses import dataclass, field from typing import List, Tuple from beast_logger import NestedJsonItem, SeqItem, print_dict, print_nested @@ -8,7 +9,7 @@ from transformers.tokenization_utils import PreTrainedTokenizer from ajet.context_tracker.agentscope_tracker.timeline_merging import ( - merge_tracker_timelines, + merge_tracker_timelines, is_timeline_mergeable ) from ajet.context_tracker.basic_tracker import ( BaseContextTracker, @@ -20,8 +21,23 @@ from ajet.utils.compute_madness import compute_string_madness from ajet.utils.tokenizer import ajet_apply_chat_template +@dataclass +class TimelineMergingPolicyConfig: + timeline_compare_level: str = "text" + ignore_tools: bool = True + + +@dataclass +class ContextTrackerConfig: + timeline_merging_policy: TimelineMergingPolicyConfig = field( + default_factory=TimelineMergingPolicyConfig + ) + fix_retokenization_drift: bool = True + detect_timeline_snap: bool = False + class MultiAgentContextTracker(BaseContextTracker): + def __init__( self, llm_inference_fn, @@ -40,6 +56,7 @@ def __init__( self.output_kwargs = {} self.input_kwargs = {} + def step_prepare(self, messages: List[dict], tools: List = []): self.full_context = [] consider_roles = ["user", "assistant", "system", "tool"] @@ -122,6 +139,8 @@ def step_prepare(self, messages: List[dict], tools: List = []): return context_safe, token_overflow, info, converted_message, custom_sampling_params, tools + + def step_track( self, llm_output, @@ -139,12 +158,101 @@ def step_track( ): self.already_mad_flag = True - # dummy response for now - # err_type = "" - if llm_output.get("tool_calls", []): # llm_output["tool_calls"] is not None, and is not [] + tool_calls = self.detect_tool_call_madness(llm_output) + + llm_ext_msg = ExtendedMessage( + author="llm", + role="assistant", + content=llm_output["content"], + token_generator="manual", + tool_calls=tool_calls, + tokenizer=self.tokenizer, + ) + input_msg_ref = copy.deepcopy(converted_message) + ( + precise_manual_token, + token_logprob_arr, + loss_mask, + lack_normal_eos, + ) = self.get_token_inc_from_llm_response(input_msg_ref, llm_output, tools=tools) + llm_ext_msg.token_arr = precise_manual_token + llm_ext_msg.token_logprob_arr = token_logprob_arr + llm_ext_msg.lack_normal_eos = lack_normal_eos + llm_ext_msg.manual_loss_mask_override = loss_mask + + assert ( + len(precise_manual_token) + <= self.config.ajet.rollout.max_response_length_in_one_turn + ), f"Generated token length {len(precise_manual_token)} exceeds max_response_length_in_one_turn {self.config.ajet.rollout.max_response_length_in_one_turn}" + + # run generated token callback, usually to monitor token output rate ( e.g. 164 tokens/sec ) + self.generated_token_callback_fn(llm_ext_msg.token_arr) + + # take snapshot of current timeline + if context_safe: + if ( + "prompt_text" in llm_output and "prompt_token_ids" in llm_output + ): + # currently we make this patch to better compat with Trinity training backend + # fix Retokenization Drift + self.full_context = self.patch_prompt_tokens( + prompt_text=llm_output["prompt_text"], + prompt_token_ids=llm_output["prompt_token_ids"], + previous_ext_context=self.full_context, + ) + + self.save_llm_interaction_timeline(tools, llm_ext_msg) + return None + + + + def save_llm_interaction_timeline(self, tools, llm_ext_msg): + """Save the LLM interaction timeline by adding the LLM response to `grouped_steps` + """ + self.full_context += [llm_ext_msg] + _, length = self.get_context_token_num_and_safety(self.full_context, tools) + if length > self.config.ajet.rollout.max_model_len: + raise RuntimeError( + f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" + ) + + assert self.full_context[0].first_message, "First message should be marked as first_message" + + # assert all other message is not first_message + for i in range(1, len(self.full_context)): + assert not self.full_context[i].first_message + + # save to self.grouped_steps + self.grouped_steps += [copy.deepcopy(self.full_context)] + + # DEBUG = True # warn when merge fails + timeline_merging_policy: TimelineMergingPolicyConfig = self.config.ajet.context_tracker.timeline_merging_policy + if ( + self.config.ajet.context_tracker.detect_timeline_snap + and len(self.grouped_steps) >= 2 + and ( + not is_timeline_mergeable( + self.grouped_steps[-1], + self.grouped_steps[-2], + timeline_merging_policy + ) + ) + ): + logger.bind(exception=True).info(f"General Warning: merge failure discovered.\n") + return + + + def detect_tool_call_madness(self, llm_output): + """Detect whether the tool call format from LLM output is correct or not. + """ + log_tool = self.config.ajet.context_tracker.log_tool_format_check + detailed_log = self.config.ajet.context_tracker.log_tool_format_error_detail + + err_type = "" + if llm_output.get("tool_calls", []): + # llm_output["tool_calls"] is not None, and is not [] tool_calls = llm_output["tool_calls"] if "wrong_toolcall" in self.config.ajet.rollout.compute_madness_checklist: - # check tool call formating copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False for i in range(len(copy_tool_calls)): @@ -155,99 +263,43 @@ def step_track( expect_dict = json.loads(copy_tool_calls[i]["function"]["arguments"]) if not isinstance(expect_dict, dict): wrong_toolcall = True - # err_type = "cannot parse arguments" + err_type = "cannot parse arguments" except Exception: wrong_toolcall = True - # err_type = "arguments not json" + err_type = "arguments not json" else: wrong_toolcall = True - # err_type = "no function or no arguments" + err_type = "no function or no arguments" if wrong_toolcall: - # logger.bind(exception=True).warning( - # f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n" - # ) - logger.bind(exception=True).warning( - f"Detected wrong toolcall format from LLM content" - ) + if detailed_log: + logger.bind(exception=True).warning( + f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n" + ) + if log_tool: + logger.bind(exception=True).warning( + f"Detected wrong toolcall format from LLM content" + ) self.already_mad_flag = True else: - logger.success("Toolcall format check passed.") + if log_tool: + logger.success("Toolcall format check passed.") + elif "" in llm_output["content"]: - # logger.bind(exception=True).warning( - # f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n" - # ) - if "wrong_toolcall" in self.config.ajet.rollout.compute_madness_checklist: + if detailed_log: logger.bind(exception=True).warning( - f"Detected wrong toolcall format from LLM content" + f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n" ) + if "wrong_toolcall" in self.config.ajet.rollout.compute_madness_checklist: + if log_tool: + logger.bind(exception=True).warning( + f"Detected wrong toolcall format from LLM content" + ) self.already_mad_flag = True tool_calls = [] else: tool_calls = [] + return tool_calls - token_generator = "manual" - llm_ext_msg = ExtendedMessage( - author="llm", - role="assistant", - content=llm_output["content"], - token_generator=token_generator, - tool_calls=tool_calls, - tokenizer=self.tokenizer, - ) - if token_generator == "manual": - input_msg_ref = copy.deepcopy(converted_message) - - ( - precise_manual_token, - token_logprob_arr, - loss_mask, - lack_normal_eos, - ) = self.get_token_inc_from_llm_response(input_msg_ref, llm_output, tools=tools) - llm_ext_msg.token_arr = precise_manual_token - llm_ext_msg.token_logprob_arr = token_logprob_arr - llm_ext_msg.lack_normal_eos = lack_normal_eos - llm_ext_msg.manual_loss_mask_override = loss_mask - - assert ( - len(precise_manual_token) - <= self.config.ajet.rollout.max_response_length_in_one_turn - ), f"Generated token length {len(precise_manual_token)} exceeds max_response_length_in_one_turn {self.config.ajet.rollout.max_response_length_in_one_turn}" - self.generated_token_callback_fn(llm_ext_msg.token_arr) - - # take snapshot of current timeline - if context_safe: - if ( - "prompt_text" in llm_output and "prompt_token_ids" in llm_output - ): - # currently we make this patch to better compat with Trinity training backend - # fix Retokenization Drift - self.full_context = self.patch_prompt_tokens( - prompt_text=llm_output["prompt_text"], - prompt_token_ids=llm_output["prompt_token_ids"], - previous_ext_context=self.full_context, - ) - - self.full_context += [llm_ext_msg] - is_safe, length = self.get_context_token_num_and_safety(self.full_context, tools) - if length > self.config.ajet.rollout.max_model_len: - raise RuntimeError( - f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" - ) - - assert self.full_context[0].first_message - # assert all other message is not first_message - for i in range(1, len(self.full_context)): - assert not self.full_context[i].first_message - self.grouped_steps += [copy.deepcopy(self.full_context)] - - # DEBUG = True # warn when merge fails - # if ( - # DEBUG - # and len(self.grouped_steps) >= 2 - # and (not is_timeline_mergeable(self.grouped_steps[-1], self.grouped_steps[-2])) - # ): - # print(f"General Warning: merge failure discovered.") - return None def patch_prompt_tokens( @@ -293,38 +345,7 @@ def patch_prompt_tokens( # try to recover tokens if self.config.ajet.context_tracker.fix_retokenization_drift: - for j in range(len(previous_ext_context)): - if prompt_text_split[j] != current_prompt_text[j]: - # if prompt text mismatch, we can replace the tokens - print_dict( - { - "expected_prompt_text": prompt_text_split[j], - "current_prompt_text": current_prompt_text[j], - }, - mod="exception", - header="Prompt text mismatch, Please report a github issue", - ) - previous_ext_context[j].token_arr = self.tokenizer( - prompt_text_split[j], return_tensors="pt", padding=False - ) - else: - # if prompt text match - # we further check whether all token ids matches - vllm_token_array = split_prompt_token_ids[j] - tracker_token_array = previous_ext_context[j].token_arr - if vllm_token_array == tracker_token_array: - # good, everything is perfect - continue - else: - # otherwise, we throw a warning (do not worry, this causes almost no influence in the training) - print_dict( - { - "expected_token_ids": split_prompt_token_ids[j], - "current_token_ids": previous_ext_context[j].token_arr, - }, - mod="exception", - header="Prompt token ids mismatch, Please report a github issue", - ) + self.ensure_retokenization_perfect_match(previous_ext_context, split_prompt_token_ids, prompt_text_split, current_prompt_text) # remove extra messages if len(previous_ext_context) != len(prompt_text_split): @@ -332,6 +353,42 @@ def patch_prompt_tokens( return previous_ext_context + + def ensure_retokenization_perfect_match(self, previous_ext_context, split_prompt_token_ids, prompt_text_split, current_prompt_text): + for j in range(len(previous_ext_context)): + if prompt_text_split[j] != current_prompt_text[j]: + # if prompt text mismatch, we can replace the tokens + print_dict( + { + "expected_prompt_text": prompt_text_split[j], + "current_prompt_text": current_prompt_text[j], + }, + mod="exception", + header="Prompt text mismatch, Please report a github issue", + ) + previous_ext_context[j].token_arr = self.tokenizer( + prompt_text_split[j], return_tensors="pt", padding=False + ) + else: + # if prompt text match + # we further check whether all token ids matches + vllm_token_array = split_prompt_token_ids[j] + tracker_token_array = previous_ext_context[j].token_arr + if vllm_token_array == tracker_token_array: + # good, everything is perfect + continue + else: + # otherwise, we throw a warning (do not worry, this causes almost no influence in the training) + print_dict( + { + "expected_token_ids": split_prompt_token_ids[j], + "current_token_ids": previous_ext_context[j].token_arr, + }, + mod="exception", + header="Prompt token ids mismatch, Please report a github issue", + ) + + def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure ext_steps = self.full_context @@ -347,6 +404,7 @@ def process_reward(self, reward_structure: Reward): for i in range(len(self.grouped_steps)) ] + def generate_log(self, task_id=None, global_step="NA"): task_id = self.task_id nested_items_print_buffer = {} @@ -427,14 +485,17 @@ def generate_log(self, task_id=None, global_step="NA"): attach="copy this", # type: ignore ) + def group_merge(self) -> List[List[ExtendedMessage]]: - timeline_merging_policy = self.config.ajet.context_tracker.timeline_merging_policy + timeline_merging_policy: TimelineMergingPolicyConfig = self.config.ajet.context_tracker.timeline_merging_policy self.grouped_steps = merge_tracker_timelines(self.grouped_steps, timeline_merging_policy) return self.grouped_steps + def group_tokenize(self): return self.group_tokenize_multi_group() + def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore dict_messages = self.to_role_content(ext_messages) prompt_text = ajet_apply_chat_template( @@ -454,6 +515,7 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], else: return False, length + def check_context_token_num_safe( self, messages: List, tools: List = [] ) -> Tuple[bool, bool, str]: diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 61956327..9751b312 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -77,6 +77,7 @@ ajet: # validation kwargs val_kwargs: + # when doing validation, the sample setting when generating response temperature: 0.0 top_k: -1 top_p: 1.0 @@ -176,9 +177,6 @@ ajet: # context tracker protocol is valid ONLY when `use_agentscope_protocol=False` context_tracker: - # Retokenization Drift: inconsistencies between training and inference token array - fix_retokenization_drift: True - # timeline merging policy used in Context Tracker timeline_merging_policy: @@ -186,9 +184,21 @@ ajet: # compare_level = "token": strict compare with token, cause less aggressive merging timeline_compare_level: "text" # options: "text", "token" - # whether or not to ignore tool calls when comparing steps + # whether or not to ignore tool calls when comparing steps, default to `True` to make merging more aggressive ignore_tools: True + # Fix Retokenization Drift: inconsistencies between training and inference token array + # Related reading: https://github.com/vllm-project/vllm/pull/22587 (note that the implementation is very different) + fix_retokenization_drift: True + + # log tool format check results + log_tool_format_check: True + + # log tool format check results + log_tool_format_error_detail: False + + # detect at which point timeline stop growing linearly and cause a snap during a episode: this will cause additional computation. + detect_timeline_snap: False # deprecated alien_llm_model: qwen3-235b-a22b-instruct-2507 @@ -199,10 +209,20 @@ ajet: # when backbone is `debug`, debug related configurations debug: - debug_max_parallel: 16 + + # max parallel runners in debug mode + debug_max_parallel: 4 + + # how many task to sample from training set debug_first_n_tasks: 2 + + # what is the vllm engine port in the background debug_vllm_port: 18000 + + # what is the seed of the vllm engine in the background debug_vllm_seed: 12345 + + # what is the TP size in debug mode debug_tensor_parallel_size: 4 diff --git a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py index 0e016b74..78c4ceae 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py @@ -15,18 +15,6 @@ if TYPE_CHECKING: from ajet import Workflow -# import openai -# client = openai.OpenAI() - -# response = client.chat.completions.create( -# model="gpt-3.5-turbo", # You can replace this with "gpt-4" if available -# messages=[ -# {"role": "system", "content": "You are a helpful assistant."}, -# {"role": "user", "content": "Hello! Tell me a joke about programming."} -# ], -# max_tokens=100, # Limit the response length -# temperature=0.7 # Control the randomness of the output -# ) class MockAsyncCompletions(AsyncCompletions): async def create(self, *args, **kwargs) -> Any: # type: ignore @@ -38,17 +26,22 @@ def completions(self) -> MockAsyncCompletions: # type: ignore return MockAsyncCompletions(self._client) class OpenaiClientModelTuner(AsyncOpenAI): - + """ At this layer, we will determine which model to use: + - training model + - debug model assigned by user, used when this target is not being trained + """ def __init__( self, config, context_tracker: MultiAgentContextTracker, workflow: "Workflow", agent_name: str, - debug_model: str, + debug_model: str | None = None, use_debug_model: bool = False, **kwargs, ): + self.debug_model = debug_model + self.use_debug_model = use_debug_model self.llm_proxy = OpenaiLlmProxyWithTracker( context_tracker=context_tracker, config=config, @@ -68,6 +61,16 @@ async def create( **kwargs ) -> ChatCompletion: + # route first + if self.use_debug_model and (self.debug_model is not None): + client = AsyncOpenAI() + return await client.chat.completions.create( + model = self.debug_model, + messages = messages, # type: ignore + tools = tools, + tool_choice = tool_choice, # type: ignore + ) + # call llm model ✨ response_gen = await self.llm_proxy( messages = messages, diff --git a/tutorial/example_math_agent/math_agent_oai_sdk.py b/tutorial/example_math_agent/math_agent_oai_sdk.py index b97d75c9..e6833bbd 100644 --- a/tutorial/example_math_agent/math_agent_oai_sdk.py +++ b/tutorial/example_math_agent/math_agent_oai_sdk.py @@ -8,25 +8,6 @@ import json import asyncio -# def extract_final_answer(result) -> str: -# """Extract the final answer from the agent's response.""" -# try: -# if ( -# hasattr(result, "metadata") -# and isinstance(result.metadata, dict) -# and "result" in result.metadata -# ): -# return result.metadata["result"] -# if hasattr(result, "content"): -# if isinstance(result.content, dict) and "result" in result.content: -# return result.content["result"] -# return str(result.content) -# return str(result) -# except Exception as e: -# logger.warning(f"Extract final answer error: {e}. Raw: {result}") -# return str(result) - - # ------------------------------------------------------ # Simple version - no tool call @@ -88,7 +69,7 @@ class ExampleMathLearn(Workflow): "type": "function", "function": { "name": "execute_python_code", - "description": "Execute the given Python code in a temp file and capture the return code, standard output, and error.", + "description": "Execute the given Python code in a temp file and capture the return code, standard output, and error. Note that you should print something or you will get empty return.", "parameters": { "type": "object", "properties": { @@ -155,7 +136,6 @@ def sync_wrapper(): "content": reply_message.choices[0].message.content }) - from ajet import bp; bp('MATHX') messages.append(tool_result_message) # Step 3: Make a follow-up API call with the tool result From 995f694f63a19694d6b8c85275d3d787b40ece47 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 8 Jan 2026 11:53:58 +0800 Subject: [PATCH 387/462] consider parallel lm call in a single episode --- ajet/backbone/main_vllm.py | 8 ++- .../agentscope_tracker/multiagent_tracking.py | 65 ++++++++++--------- ajet/context_tracker/base_tracker.py | 6 +- ajet/context_tracker/basic_tracker.py | 22 +++---- ajet/task_rollout/async_llm_bridge.py | 25 ++++--- .../weight_tuner/as_oai_model_server.py | 23 +++++++ ajet/utils/sample.py | 2 + .../example_math_agent/math_agent_oai_sdk.py | 15 ++--- 8 files changed, 104 insertions(+), 62 deletions(-) create mode 100644 ajet/tuner_lib/weight_tuner/as_oai_model_server.py diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index 64219228..2a290b20 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -8,11 +8,12 @@ from ajet.backbone.warm_up import warm_up_process from ajet.task_rollout.native_parallel_worker import VerlRolloutManager from ajet.utils.launch_utils import set_loguru_default_color +from ajet.schema.logprob import TokenAndProb set_loguru_default_color() -class TokenAndProb: +class TokenAndProbVllmDebug(TokenAndProb): def __init__(self, t): # ChatCompletionTokenLogprob(token='token_id:73594', bytes=[96, 96, 96], logprob=-1.9073468138230965e-06, top_logprobs=[]) self.token_id = int(t.token.split("token_id:")[-1]) @@ -67,6 +68,7 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ message = completion.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) + # sometimes tool use message has no content field if "content" not in message: message["content"] = "" @@ -76,7 +78,9 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ "request_id": completion.id, "content": message["content"], "tool_calls": message.get("tool_calls", None), - "tokens": [TokenAndProb(t) for t in completion.choices[0].logprobs.content], # type: ignore + "tokens": [ + TokenAndProbVllmDebug(t) for t in completion.choices[0].logprobs.content # type: ignore + ], } ) return messages diff --git a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py index 37511360..6102f7e1 100644 --- a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py @@ -37,6 +37,10 @@ class ContextTrackerConfig: class MultiAgentContextTracker(BaseContextTracker): + """ + Context tracker is responsible to monitor and process LLM IO. + Each context tracker is responsible for ONE episode run only. + """ def __init__( self, @@ -55,10 +59,11 @@ def __init__( self.context_overflow = False self.output_kwargs = {} self.input_kwargs = {} + self.timeline_cache = {} - def step_prepare(self, messages: List[dict], tools: List = []): - self.full_context = [] + def step_prepare(self, messages: List[dict], tools: List = [], timeline_uuid: str = ""): + timeline = [] consider_roles = ["user", "assistant", "system", "tool"] disable_toolcalls = self.config.ajet.rollout.force_disable_toolcalls if disable_toolcalls: @@ -112,7 +117,7 @@ def step_prepare(self, messages: List[dict], tools: List = []): else: author = "env" - self.full_context += [ + timeline += [ ExtendedMessage( author=author, role=msg["role"], @@ -126,9 +131,9 @@ def step_prepare(self, messages: List[dict], tools: List = []): ] # check token overflow - converted_message = self.to_role_content(self.full_context) - self.full_context = ExtendedMessage.check_and_merge_chained_tool_response( - self.full_context, self.tokenizer + converted_message = self.to_role_content(timeline) + timeline = ExtendedMessage.check_and_merge_chained_tool_response( + timeline, self.tokenizer ) context_safe, token_overflow, info = self.check_context_token_num_safe( converted_message, tools @@ -137,6 +142,7 @@ def step_prepare(self, messages: List[dict], tools: List = []): if not context_safe: self.context_overflow = True + self.timeline_cache[timeline_uuid] = timeline return context_safe, token_overflow, info, converted_message, custom_sampling_params, tools @@ -147,7 +153,10 @@ def step_track( context_safe, converted_message: List[dict], tools: List = [], + timeline_uuid: str = "", ): + assert timeline_uuid in self.timeline_cache, "Timeline UUID not found in cache. Please ensure `step_prepare` is called before `step_track`." + timeline = self.timeline_cache.get(timeline_uuid, []) if not self.already_mad_flag: if ( compute_string_madness( @@ -195,45 +204,45 @@ def step_track( ): # currently we make this patch to better compat with Trinity training backend # fix Retokenization Drift - self.full_context = self.patch_prompt_tokens( + timeline = self.patch_prompt_tokens( prompt_text=llm_output["prompt_text"], prompt_token_ids=llm_output["prompt_token_ids"], - previous_ext_context=self.full_context, + previous_ext_context=timeline, ) - self.save_llm_interaction_timeline(tools, llm_ext_msg) + self.save_llm_interaction_timeline(tools, llm_ext_msg, timeline) return None - def save_llm_interaction_timeline(self, tools, llm_ext_msg): - """Save the LLM interaction timeline by adding the LLM response to `grouped_steps` + def save_llm_interaction_timeline(self, tools, llm_ext_msg, timeline): + """Save the LLM interaction timeline by adding the LLM response to `self.saved_timelines` """ - self.full_context += [llm_ext_msg] - _, length = self.get_context_token_num_and_safety(self.full_context, tools) + timeline += [llm_ext_msg] + _, length = self.get_context_token_num_and_safety(timeline, tools) if length > self.config.ajet.rollout.max_model_len: raise RuntimeError( f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" ) - assert self.full_context[0].first_message, "First message should be marked as first_message" + assert timeline[0].first_message, "First message should be marked as first_message" # assert all other message is not first_message - for i in range(1, len(self.full_context)): - assert not self.full_context[i].first_message + for i in range(1, len(timeline)): + assert not timeline[i].first_message - # save to self.grouped_steps - self.grouped_steps += [copy.deepcopy(self.full_context)] + # save to self.saved_timelines + self.saved_timelines += [copy.deepcopy(timeline)] # DEBUG = True # warn when merge fails timeline_merging_policy: TimelineMergingPolicyConfig = self.config.ajet.context_tracker.timeline_merging_policy if ( self.config.ajet.context_tracker.detect_timeline_snap - and len(self.grouped_steps) >= 2 + and len(self.saved_timelines) >= 2 and ( not is_timeline_mergeable( - self.grouped_steps[-1], - self.grouped_steps[-2], + self.saved_timelines[-1], + self.saved_timelines[-2], timeline_merging_policy ) ) @@ -391,17 +400,15 @@ def ensure_retokenization_perfect_match(self, previous_ext_context, split_prompt def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure - ext_steps = self.full_context # TODO: support multi-step reward # in current implementation, all reward in all step equals # we'll implement fine-grained step reward in future versions self.reward_structure.step_reward_arr = [ self.compute_step_level_reward( - ext_steps=ext_steps, index=i, - total_steps=len(self.grouped_steps), + total_steps=len(self.saved_timelines), ) - for i in range(len(self.grouped_steps)) + for i in range(len(self.saved_timelines)) ] @@ -410,11 +417,11 @@ def generate_log(self, task_id=None, global_step="NA"): nested_items_print_buffer = {} step_reward = 0.0 - for index, ext_steps in enumerate(self.grouped_steps): + for index, ext_steps in enumerate(self.saved_timelines): tracker_tokenized = self.tokenize_steps( ext_steps=ext_steps, index=index, - total_steps=len(self.grouped_steps), + total_steps=len(self.saved_timelines), ) text_arr = [self.tokenizer.decode(t) for t in tracker_tokenized["input_ids"]] input_id_arr = [str(t) for t in tracker_tokenized["input_ids"]] @@ -488,8 +495,8 @@ def generate_log(self, task_id=None, global_step="NA"): def group_merge(self) -> List[List[ExtendedMessage]]: timeline_merging_policy: TimelineMergingPolicyConfig = self.config.ajet.context_tracker.timeline_merging_policy - self.grouped_steps = merge_tracker_timelines(self.grouped_steps, timeline_merging_policy) - return self.grouped_steps + self.saved_timelines = merge_tracker_timelines(self.saved_timelines, timeline_merging_policy) + return self.saved_timelines def group_tokenize(self): diff --git a/ajet/context_tracker/base_tracker.py b/ajet/context_tracker/base_tracker.py index 429df4d7..c9244d7b 100644 --- a/ajet/context_tracker/base_tracker.py +++ b/ajet/context_tracker/base_tracker.py @@ -116,8 +116,7 @@ def __init__(self, config, tokenizer, **kwargs): self.task_id = kwargs.get("task_id", "undefined") self.config = config self.tokenizer = tokenizer - self.full_context: List[ExtendedMessage] = [] - self.grouped_steps: List[List[ExtendedMessage]] = [] + self.saved_timelines: List[List[ExtendedMessage]] = [] self.current_context_status = "" max_response_length = self.config.ajet.rollout.max_response_length_in_one_turn max_model_len: int = self.config.ajet.rollout.max_model_len @@ -149,6 +148,9 @@ def group_tokenize(self): def group_tokenize_multi_group(self): raise NotImplementedError + def group_tokenize_single_group(self, timeline): + raise NotImplementedError + def tokenize_steps( self, ext_steps: List[ExtendedMessage], index: int, total_steps: int ) -> dict: diff --git a/ajet/context_tracker/basic_tracker.py b/ajet/context_tracker/basic_tracker.py index a8fbbad6..9ccf2c62 100644 --- a/ajet/context_tracker/basic_tracker.py +++ b/ajet/context_tracker/basic_tracker.py @@ -101,14 +101,14 @@ def get_token_inc_from_llm_response( ) return final_token_arr, token_logprob_arr, loss_mask, lack_normal_eos - def filter_context_via_author(self, author: str) -> List[ExtendedMessage]: - return copy.deepcopy([c for c in self.full_context if c.author == author]) + def filter_context_via_author(self, timeline, author: str) -> List[ExtendedMessage]: + return copy.deepcopy([c for c in timeline if c.author == author]) - def filter_context_via_authors(self, authors: List[str]) -> List[ExtendedMessage]: - return copy.deepcopy([c for c in self.full_context if c.author in authors]) + def filter_context_via_authors(self, timeline, authors: List[str]) -> List[ExtendedMessage]: + return copy.deepcopy([c for c in timeline if c.author in authors]) def filter_context_via_authors_with_limit( - self, authors: List[str], limit: dict + self, timeline, authors: List[str], limit: dict ) -> List[ExtendedMessage]: """ limit = { @@ -116,7 +116,7 @@ def filter_context_via_authors_with_limit( "env": "keep_first@2" } """ - filtered_via_authors = copy.deepcopy([c for c in self.full_context if c.author in authors]) + filtered_via_authors = copy.deepcopy([c for c in timeline if c.author in authors]) for limit_author, limit_item in limit.items(): limit_item_command, limit_item_value = limit_item.split("@") if limit_item_command == "keep_last": @@ -162,7 +162,7 @@ def filter_context_via_authors_with_limit( return filtered_via_authors def compute_step_level_reward( - self, ext_steps: List[ExtendedMessage], index: int, total_steps: int + self, index: int, total_steps: int ) -> float: # TODO: support multi-step reward assert self.reward_structure is not None @@ -195,9 +195,9 @@ def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: result.append(d) return result - def group_tokenize(self): + def group_tokenize_single_group(self, timeline): sample_arr = [] - ext_steps = self.full_context + ext_steps = timeline tracker_tokenized = self.tokenize_steps(ext_steps=ext_steps, index=0, total_steps=1) sample = Sample( tracker_tokenized=tracker_tokenized, @@ -214,11 +214,11 @@ def group_tokenize(self): def group_tokenize_multi_group(self): sample_arr = [] max_num_group = self.config.ajet.rollout.multi_turn.max_sample_per_task - for index, ext_steps in enumerate(self.grouped_steps): + for index, ext_steps in enumerate(self.saved_timelines): tracker_tokenized = self.tokenize_steps( ext_steps=ext_steps, index=index, - total_steps=len(self.grouped_steps), + total_steps=len(self.saved_timelines), ) sample = Sample( tracker_tokenized=tracker_tokenized, diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index 1b6e4f47..bd509fb7 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -12,6 +12,7 @@ from pydantic import BaseModel from transformers.tokenization_utils import PreTrainedTokenizer from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser +from vllm.outputs import RequestOutput as VerlVllmRequestOutput from agentscope.model import ChatResponse as AgentScopeChatResponse from openai.types.chat.chat_completion import ChatCompletion as OpenAIChatCompletion @@ -44,7 +45,7 @@ def __init__( self.max_llm_retries = max_llm_retries def get_llm_inference_fn(self, sampling_params: dict = {}) -> Callable: # noqa: C901 - def llm_chat( + def llm_chat_verl( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, tools=[], @@ -81,7 +82,9 @@ def llm_chat( ) if self.config.ajet.rollout.name == "vllm": + final_res: VerlVllmRequestOutput token_array = final_res.outputs[0].token_ids + logprob_array = final_res.outputs[0].logprobs elif self.config.ajet.rollout.name == "sglang": token_array = final_res @@ -130,14 +133,15 @@ def llm_chat( "tool_calls": tool_calls, "tokens": [ TokenAndProb( - token_id=token, - logprob=-1, - decoded_string=self.tokenizer.decode(token), + token_id=token_id, + logprob=logprob[token_id].logprob, # Warning: vllm logprob does not participant training (not reliable enough), for log only. + decoded_string=logprob[token_id].decoded_token, ) - for token in token_array # type: ignore + for token_id, logprob in zip(token_array, logprob_array) # type: ignore ], } + def llm_chat_remote( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -166,6 +170,7 @@ def llm_chat_remote( time.sleep(i + 1) return output_message[-1] # type: ignore + def llm_chat_trinity( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -222,7 +227,7 @@ async def main(): "tokens": [ TokenAndProb( token_id=token, - logprob=tokenlogprob.logprob, + logprob=tokenlogprob.logprob, # Warning: vllm logprob does not participant training, for log only. decoded_string=tokenlogprob.token, ) for tokenlogprob, token in zip( @@ -237,7 +242,7 @@ async def main(): if self.llm_mode == "trinity": return llm_chat_trinity else: - return llm_chat + return llm_chat_verl @@ -284,6 +289,8 @@ async def run_infer( structured_model=None, **kwargs, ): + timeline_uuid = uuid.uuid4().hex + # prepare context tracker, check context safety ( context_safe, @@ -292,7 +299,7 @@ async def run_infer( converted_message, custom_sampling_params, tools, - ) = self.context_tracker.step_prepare(messages, tools) + ) = self.context_tracker.step_prepare(messages, tools, timeline_uuid=timeline_uuid) # if context not safe to infer further if not context_safe: @@ -313,7 +320,7 @@ async def run_infer( ) # begin context tracking - self.context_tracker.step_track(llm_output, context_safe, converted_message, tools) + self.context_tracker.step_track(llm_output, context_safe, converted_message, tools, timeline_uuid=timeline_uuid) return llm_output async def __call__( diff --git a/ajet/tuner_lib/weight_tuner/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/as_oai_model_server.py new file mode 100644 index 00000000..4db0ed36 --- /dev/null +++ b/ajet/tuner_lib/weight_tuner/as_oai_model_server.py @@ -0,0 +1,23 @@ +# write a class to serve as interchange endpoint (using fastapi). + +# 1. find free port +# 2. start fastapi server on that 0.0.0.0 + port (new thread) +# 3. return port number + +# endpoint list + +# /health: health check +# - input: none +# - output: {"status": "ok"} + +# /hook/context_tracker: + + + + +# write a wrapped client + +# 1. init with +# argument 1: host + port +# 2. method: +# \ No newline at end of file diff --git a/ajet/utils/sample.py b/ajet/utils/sample.py index 2c7fd9e8..d82f6b22 100644 --- a/ajet/utils/sample.py +++ b/ajet/utils/sample.py @@ -11,12 +11,14 @@ def get_sample_params(mode, config): 16 # Reserve a few tokens for later handling of special tokens like lm_start. ) if config.ajet.rollout.name == "vllm": + # VLLM uses max_tokens instead of max_new_tokens sampling_params = dict( n=1, max_tokens=config.ajet.rollout.max_response_length_in_one_turn - response_length_eps, min_tokens=1, # Must output at least 1 token. temperature=config.ajet.rollout.temperature, top_p=config.ajet.rollout.top_p, + logprobs=1, ) else: sampling_params = dict( diff --git a/tutorial/example_math_agent/math_agent_oai_sdk.py b/tutorial/example_math_agent/math_agent_oai_sdk.py index e6833bbd..8b80a53b 100644 --- a/tutorial/example_math_agent/math_agent_oai_sdk.py +++ b/tutorial/example_math_agent/math_agent_oai_sdk.py @@ -24,7 +24,6 @@ class ExampleMathLearn_Simple_NoToolCall(Workflow): """) async def execute(self, workflow_task: WorkflowTask, model_tuner: TunerV2) -> WorkflowOutput: # type: ignore - from ajet import bp; bp('MATHX') query = workflow_task.task.main_query client = model_tuner.as_raw_openai_sdk_client() @@ -101,6 +100,12 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: TunerV2) -> Wo { "role": "user", "content": query } ] reply_message: ChatCompletion = await client.chat.completions.create(messages=messages, tools=self.available_functions) + if (reply_message.choices[0].message.content): + messages.append({ + "role": "assistant", + "content": reply_message.choices[0].message.content + }) + # If the model called a tool if (reply_message.choices[0].message) and (reply_message.choices[0].message.tool_calls): tool_calls: list[ChatCompletionMessageToolCall] = reply_message.choices[0].message.tool_calls @@ -120,7 +125,6 @@ def sync_wrapper(): return process.stdout result = await asyncio.to_thread(sync_wrapper) - tool_result_message = { "role": "tool", "tool_call_id": tool_call.id, @@ -129,13 +133,6 @@ def sync_wrapper(): "return_code": str(result), }) } - - if (reply_message.choices[0].message.content): - messages.append({ - "role": "assistant", - "content": reply_message.choices[0].message.content - }) - messages.append(tool_result_message) # Step 3: Make a follow-up API call with the tool result From aac14633f4e98dcd18c93946369e69e1805371c6 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 8 Jan 2026 12:37:48 +0800 Subject: [PATCH 388/462] doc patch --- docs/en/debugging_guide.md | 4 ++-- docs/en/example_app_world.md | 2 +- docs/en/example_countdown.md | 2 +- docs/en/example_frozenlake.md | 2 +- docs/en/example_math_agent.md | 2 +- docs/en/example_werewolves.md | 2 +- docs/en/tune_your_first_agent.md | 2 +- docs/zh/example_math_agent.md | 2 +- docs/zh/tune_your_first_agent.md | 2 +- pyproject.toml | 2 +- tests/bench/benchmark_base.py | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/en/debugging_guide.md b/docs/en/debugging_guide.md index c8225a3b..649f744e 100644 --- a/docs/en/debugging_guide.md +++ b/docs/en/debugging_guide.md @@ -25,7 +25,7 @@ For more details, please refer to VSCode official documents. "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", @@ -57,7 +57,7 @@ Then, the modified launch.json will be "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", // verl -> debug diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index ab6d1f8e..687bbfbc 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -69,7 +69,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index e284e905..df7f8b4f 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -57,7 +57,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index 7b0b2968..ebb92350 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -55,7 +55,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index fd15d5da..d4b6a152 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -59,7 +59,7 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --w "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index cb841acd..b12eb4aa 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -52,7 +52,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 636cf6a8..b6a38b13 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -340,7 +340,7 @@ ajet --conf math_agent/math_agent.yaml --backbone='debug' --with-logview "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md index d394ecd0..1be2e7e7 100644 --- a/docs/zh/example_math_agent.md +++ b/docs/zh/example_math_agent.md @@ -59,7 +59,7 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --w "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index 9164823f..268844fb 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -345,7 +345,7 @@ ajet --conf math_agent/math_agent.yaml --backbone='debug' --with-logview "name": "Python Debugger: Launch rollout", "type": "debugpy", "request": "launch", - "module": "ajet.cli.launcher", + "module": "ajet.launcher", "console": "integratedTerminal", "args": [ "--backbone", "debug", diff --git a/pyproject.toml b/pyproject.toml index f3a1db21..67940718 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,7 +67,7 @@ doc = [ ] [project.scripts] -ajet = "ajet.cli.launcher:main" +ajet = "ajet.launcher:main" [tool.setuptools.packages.find] diff --git a/tests/bench/benchmark_base.py b/tests/bench/benchmark_base.py index df478a34..7b6815f3 100644 --- a/tests/bench/benchmark_base.py +++ b/tests/bench/benchmark_base.py @@ -54,7 +54,7 @@ def execute_benchmark( cmd = [ python_executable, "-m", - "ajet.cli.launcher", + "ajet.launcher", "--conf", test_target, "--backbone", From 311fea5a9db3f640333b030b0d6972b0b26a8500 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 8 Jan 2026 13:21:09 +0800 Subject: [PATCH 389/462] discard old tuner and embrace new tuner --- ajet/__init__.py | 4 +- ajet/task_runner/general_runner.py | 4 +- ajet/tuner.py | 223 ++++++------------ ajet/tuner_deprecated.py | 194 +++++++++++++++ ajet/tuner_v2.md | 2 +- ajet/tuner_v2.py | 142 ----------- ajet/workflow.py | 7 +- docs/en/example_frozenlake.md | 2 +- docs/en/task_judger.md | 2 +- docs/en/tune_your_first_agent.md | 2 +- docs/en/workflow.md | 8 +- docs/zh/example_frozenlake.md | 2 +- docs/zh/task_judger.md | 2 +- docs/zh/tune_your_first_agent.md | 2 +- docs/zh/workflow.md | 6 +- tutorial/example_appworld/appworld.py | 7 +- tutorial/example_appworld/appworld_oai_sdk.py | 15 +- tutorial/example_countdown/countdown.py | 6 +- tutorial/example_feedback_tracing/train.py | 6 +- tutorial/example_frozenlake/frozenlake.py | 11 +- tutorial/example_learn2ask/learn2ask.py | 6 +- tutorial/example_math_agent/math_agent.py | 6 +- .../example_math_agent/math_agent_oai_sdk.py | 7 +- .../example_math_agent/math_agent_simplify.py | 6 +- tutorial/example_rubrics_judge/math_agent.py | 6 +- tutorial/example_werewolves/start.py | 33 ++- 26 files changed, 351 insertions(+), 360 deletions(-) create mode 100644 ajet/tuner_deprecated.py delete mode 100644 ajet/tuner_v2.py diff --git a/ajet/__init__.py b/ajet/__init__.py index 42801c47..98c360dc 100644 --- a/ajet/__init__.py +++ b/ajet/__init__.py @@ -1,6 +1,6 @@ from ajet.copilot.job import AgentJetJob from ajet.schema.task import WorkflowOutput, WorkflowTask -from ajet.tuner import ModelTuner +from ajet.tuner import AjetTuner from ajet.workflow import Workflow from ajet.utils.vsdb import vscode_conditional_breakpoint as bp @@ -8,7 +8,7 @@ "Workflow", "WorkflowTask", "WorkflowOutput", - "ModelTuner", + "AjetTuner", "AgentJetJob", "bp", ] diff --git a/ajet/task_runner/general_runner.py b/ajet/task_runner/general_runner.py index b2bdfe35..12a9e523 100644 --- a/ajet/task_runner/general_runner.py +++ b/ajet/task_runner/general_runner.py @@ -1,6 +1,6 @@ import asyncio -from ajet.tuner_v2 import TunerV2 as ModelTuner +from ajet import AjetTuner from ajet import Workflow, WorkflowOutput from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, @@ -38,7 +38,7 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: task_id=task_id, **hooks, ) - m_tuner = ModelTuner( + m_tuner = AjetTuner( context_tracker=context_tracker, llm_inference_fn=self.llm_inference_fn, tokenizer=self.tokenizer, diff --git a/ajet/tuner.py b/ajet/tuner.py index 5880ae60..c006c34e 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -1,52 +1,17 @@ -from typing import TYPE_CHECKING, Any, Literal, Type - -from agentscope._utils._common import _create_tool_from_base_model -from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel -from loguru import logger -from pydantic import BaseModel +from typing import TYPE_CHECKING, Any, Literal, Type, Union from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) -from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker +from ajet.tuner_lib.weight_tuner import AgentScopeModelTuner +from ajet.tuner_lib.weight_tuner import OpenaiClientModelTuner if TYPE_CHECKING: from ajet import Workflow +TunerTypeUnion = Union[AgentScopeModelTuner, OpenaiClientModelTuner] -class Agent2Proxy(DashScopeChatModel): - """ - Handler for **NAMED** agent trainning targets. - It stores the target name, and a reference to the ModelTuner. - When request comes, it switches between default model (dashscope or openai models) and ModelTuner - """ - - def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase): - self.name = name - self.tuner = tuner - self.default_model = default_model - super().__init__( - model_name="ajet", - api_key="dummy-api-key", - stream=False, - ) - - def __call__(self, *args, **kwargs): - if not self.tuner.is_trainable(self.name): - # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, - # and self.name is not in it, use default model - return self.default_model(*args, **kwargs) - else: - # [TRAIN] - return self.tuner(*args, **kwargs) - - -class ModelTuner(DashScopeChatModel): - """ - ModelTuner for Agentscope workflow. - It keeps record of all registered agent types (by their target names), - And when request comes, it calls `self.llm_proxy` to handle the request. - """ +class AjetTuner(object): def __init__( self, @@ -56,19 +21,72 @@ def __init__( **kwargs, ) -> None: self.config = config + self.workflow = user_workflow self.context_tracker = context_tracker - self.user_workflow = user_workflow - self.target2proxy_registry: dict[str, Agent2Proxy] = {} - self.llm_proxy = OpenaiLlmProxyWithTracker( - context_tracker=context_tracker, config=config, **kwargs + self.target2proxy_registry: dict[str, dict[str,TunerTypeUnion]] = {} + self.kwargs = kwargs + + + def as_agentscope_model( + self, + agent_name="default_agent_name", + target_tag="default_target_tag", + debug_model=None + ) -> "AgentScopeModelTuner": + """Convert to ModelTuner instance for Agentscope workflow. + Returns: + ModelTuner: + The ModelTuner instance for Agentscope workflow. + """ + explicit_tuner_as_modelscope_model = AgentScopeModelTuner( + config=self.config, + context_tracker=self.context_tracker, + user_workflow=self.workflow, + agent_name=agent_name, + debug_model=debug_model, + use_debug_model=(not self._is_target_trainable(target_tag)), + **self.kwargs, ) - super().__init__( - model_name="ajet", - api_key="dummy-api-key", - stream=False, + self._register(target_tag, agent_name, explicit_tuner_as_modelscope_model) + return explicit_tuner_as_modelscope_model + + + def as_raw_openai_sdk_client( + self, + agent_name="default_agent_name", + target_tag="default_target_tag", + debug_model='gpt-4o', + ) -> OpenaiClientModelTuner: + """Convert to raw OpenAI SDK client for advanced usage. + Returns: + Any: + The raw OpenAI SDK client. + """ + explicit_tuner_as_oai_client = OpenaiClientModelTuner( + config=self.config, + context_tracker=self.context_tracker, + workflow=self.workflow, + agent_name=agent_name, + debug_model=debug_model, + use_debug_model=(not self._is_target_trainable(target_tag)), + **self.kwargs, ) + self._register(target_tag, agent_name, explicit_tuner_as_oai_client) + return explicit_tuner_as_oai_client + + + def __call__(self, **kwargs): + """This method is **deprecated**. + The current behavior of this method is pretend as a agentscope model + """ + raise RuntimeError("This method is deprecated. Please use `as_agentscope_model` / `as_raw_openai_sdk_client` first.") + + + # ------------------------------------------------------------------------ + # other helper methods + # ------------------------------------------------------------------------ - def register_model(self, target_name: str, default_model: ChatModelBase) -> Agent2Proxy: + def _register(self, target_name: str, agent_name: str, explicit_tuner: TunerTypeUnion) -> TunerTypeUnion: """Register an agent type. Args: target_name (`str`): @@ -79,116 +97,29 @@ def register_model(self, target_name: str, default_model: ChatModelBase) -> Agen Agent2Proxy: The agent type instance corresponding to the provided name. """ - if target_name in self.target2proxy_registry: - if ( - default_model.model_name - != self.target2proxy_registry[target_name].default_model.model_name - ): - raise ValueError( - f"Agent proxy `{target_name}` is already registered with a different model_name.\nWAS [{self.target2proxy_registry[target_name].default_model.model_name}]\nNOW [{default_model.model_name}]." - ) - self.target2proxy_registry[target_name] = Agent2Proxy(target_name, self, default_model) - return self.get_model(target_name) - - def get_model(self, target_name: str) -> Agent2Proxy: - """Get the proxy instance by target_name. - Args: - target_name (`str`): - The name of the agent proxy to retrieve. - Returns: - Agent2Proxy: - The agent proxy corresponding to the provided target_name. - """ if target_name not in self.target2proxy_registry: - raise ValueError(f"Agent proxy '{target_name}' is not registered.") - else: - return self.target2proxy_registry[target_name] + self.target2proxy_registry[target_name] = {} + self.target2proxy_registry[target_name][agent_name] = explicit_tuner + return explicit_tuner - async def __call__( - self, - messages: list[dict[str, Any]], - tools: list[dict] | None = None, - tool_choice: Literal["auto", "none", "any", "required"] | str | None = None, - structured_model: Type[BaseModel] | None = None, - **kwargs: Any, - ) -> ChatResponse: - # For qvq and qwen-vl models, the content field cannot be `None` or - # `[{"text": None}]`, so we need to convert it to an empty list. - if self.model_name.startswith("qvq") or "-vl" in self.model_name: - raise NotImplementedError("Not implemented for qvq and qwen-vl models yet.") - - kwargs = { - "messages": messages, - "model": self.model_name, - "stream": self.stream, - **self.generate_kwargs, - **kwargs, - "result_format": "message", - # In agentscope, the `incremental_output` must be `True` when - # `self.stream` is True - "incremental_output": self.stream, - } - - if tools: - kwargs["tools"] = self._format_tools_json_schemas(tools) - - if tool_choice: - self._validate_tool_choice(tool_choice, tools) - kwargs["tool_choice"] = self._format_tool_choice(tool_choice) - - if self.enable_thinking is not None and "enable_thinking" not in kwargs: - kwargs["enable_thinking"] = self.enable_thinking - - if structured_model: - if tools or tool_choice: - logger.warning( - "structured_model is provided. Both 'tools' and " - "'tool_choice' parameters will be overridden and " - "ignored. The model will only perform structured output " - "generation without calling any other tools.", - ) - format_tool = _create_tool_from_base_model(structured_model) - kwargs["tools"] = self._format_tools_json_schemas( - [format_tool], - ) - kwargs["tool_choice"] = self._format_tool_choice( - format_tool["function"]["name"], - ) - - # call llm model ✨ - response_gen = await self.llm_proxy( - api_key=self.api_key, - structured_model=structured_model, - **kwargs, - ) - - # Return the AsyncGenerator directly - return response_gen - - def is_trainable(self, target_name) -> bool: - if self.user_workflow.trainable_targets is None: + def _is_target_trainable(self, target_name) -> bool: + """Determine whether user have used `trainable_targets` to explicitly control training targets. + """ + if self.workflow.trainable_targets is None: # always assume trainable when user has never changed trainable_targets return True - if not self.user_workflow.trainable_targets: + if not self.workflow.trainable_targets: # always assume trainable when trainable_targets is [] return True - if target_name in self.user_workflow.trainable_targets: + if target_name in self.workflow.trainable_targets: return True else: return False - def get_llm_proxy(self) -> OpenaiLlmProxyWithTracker: - """Get the LlmProxyForAgentScope instance. - Returns: - LlmProxyForAgentScope: - The LlmProxyForAgentScope instance used by the ModelTuner. - """ - return self.llm_proxy - def get_context_tracker(self) -> MultiAgentContextTracker: """Get the context tracker instance. Returns: LlmProxyForAgentScope: The context tracker instance used by the ModelTuner. """ - return self.context_tracker + return self.context_tracker \ No newline at end of file diff --git a/ajet/tuner_deprecated.py b/ajet/tuner_deprecated.py new file mode 100644 index 00000000..5880ae60 --- /dev/null +++ b/ajet/tuner_deprecated.py @@ -0,0 +1,194 @@ +from typing import TYPE_CHECKING, Any, Literal, Type + +from agentscope._utils._common import _create_tool_from_base_model +from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel +from loguru import logger +from pydantic import BaseModel + +from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( + MultiAgentContextTracker, +) +from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker + +if TYPE_CHECKING: + from ajet import Workflow + + +class Agent2Proxy(DashScopeChatModel): + """ + Handler for **NAMED** agent trainning targets. + It stores the target name, and a reference to the ModelTuner. + When request comes, it switches between default model (dashscope or openai models) and ModelTuner + """ + + def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase): + self.name = name + self.tuner = tuner + self.default_model = default_model + super().__init__( + model_name="ajet", + api_key="dummy-api-key", + stream=False, + ) + + def __call__(self, *args, **kwargs): + if not self.tuner.is_trainable(self.name): + # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, + # and self.name is not in it, use default model + return self.default_model(*args, **kwargs) + else: + # [TRAIN] + return self.tuner(*args, **kwargs) + + +class ModelTuner(DashScopeChatModel): + """ + ModelTuner for Agentscope workflow. + It keeps record of all registered agent types (by their target names), + And when request comes, it calls `self.llm_proxy` to handle the request. + """ + + def __init__( + self, + config, + context_tracker: MultiAgentContextTracker, + user_workflow: "Workflow", + **kwargs, + ) -> None: + self.config = config + self.context_tracker = context_tracker + self.user_workflow = user_workflow + self.target2proxy_registry: dict[str, Agent2Proxy] = {} + self.llm_proxy = OpenaiLlmProxyWithTracker( + context_tracker=context_tracker, config=config, **kwargs + ) + super().__init__( + model_name="ajet", + api_key="dummy-api-key", + stream=False, + ) + + def register_model(self, target_name: str, default_model: ChatModelBase) -> Agent2Proxy: + """Register an agent type. + Args: + target_name (`str`): + The name to register the agent type under. + default_model (`ChatModelBase`): + The model to use when you are NOT training this agent type. + Returns: + Agent2Proxy: + The agent type instance corresponding to the provided name. + """ + if target_name in self.target2proxy_registry: + if ( + default_model.model_name + != self.target2proxy_registry[target_name].default_model.model_name + ): + raise ValueError( + f"Agent proxy `{target_name}` is already registered with a different model_name.\nWAS [{self.target2proxy_registry[target_name].default_model.model_name}]\nNOW [{default_model.model_name}]." + ) + self.target2proxy_registry[target_name] = Agent2Proxy(target_name, self, default_model) + return self.get_model(target_name) + + def get_model(self, target_name: str) -> Agent2Proxy: + """Get the proxy instance by target_name. + Args: + target_name (`str`): + The name of the agent proxy to retrieve. + Returns: + Agent2Proxy: + The agent proxy corresponding to the provided target_name. + """ + if target_name not in self.target2proxy_registry: + raise ValueError(f"Agent proxy '{target_name}' is not registered.") + else: + return self.target2proxy_registry[target_name] + + async def __call__( + self, + messages: list[dict[str, Any]], + tools: list[dict] | None = None, + tool_choice: Literal["auto", "none", "any", "required"] | str | None = None, + structured_model: Type[BaseModel] | None = None, + **kwargs: Any, + ) -> ChatResponse: + # For qvq and qwen-vl models, the content field cannot be `None` or + # `[{"text": None}]`, so we need to convert it to an empty list. + if self.model_name.startswith("qvq") or "-vl" in self.model_name: + raise NotImplementedError("Not implemented for qvq and qwen-vl models yet.") + + kwargs = { + "messages": messages, + "model": self.model_name, + "stream": self.stream, + **self.generate_kwargs, + **kwargs, + "result_format": "message", + # In agentscope, the `incremental_output` must be `True` when + # `self.stream` is True + "incremental_output": self.stream, + } + + if tools: + kwargs["tools"] = self._format_tools_json_schemas(tools) + + if tool_choice: + self._validate_tool_choice(tool_choice, tools) + kwargs["tool_choice"] = self._format_tool_choice(tool_choice) + + if self.enable_thinking is not None and "enable_thinking" not in kwargs: + kwargs["enable_thinking"] = self.enable_thinking + + if structured_model: + if tools or tool_choice: + logger.warning( + "structured_model is provided. Both 'tools' and " + "'tool_choice' parameters will be overridden and " + "ignored. The model will only perform structured output " + "generation without calling any other tools.", + ) + format_tool = _create_tool_from_base_model(structured_model) + kwargs["tools"] = self._format_tools_json_schemas( + [format_tool], + ) + kwargs["tool_choice"] = self._format_tool_choice( + format_tool["function"]["name"], + ) + + # call llm model ✨ + response_gen = await self.llm_proxy( + api_key=self.api_key, + structured_model=structured_model, + **kwargs, + ) + + # Return the AsyncGenerator directly + return response_gen + + def is_trainable(self, target_name) -> bool: + if self.user_workflow.trainable_targets is None: + # always assume trainable when user has never changed trainable_targets + return True + if not self.user_workflow.trainable_targets: + # always assume trainable when trainable_targets is [] + return True + if target_name in self.user_workflow.trainable_targets: + return True + else: + return False + + def get_llm_proxy(self) -> OpenaiLlmProxyWithTracker: + """Get the LlmProxyForAgentScope instance. + Returns: + LlmProxyForAgentScope: + The LlmProxyForAgentScope instance used by the ModelTuner. + """ + return self.llm_proxy + + def get_context_tracker(self) -> MultiAgentContextTracker: + """Get the context tracker instance. + Returns: + LlmProxyForAgentScope: + The context tracker instance used by the ModelTuner. + """ + return self.context_tracker diff --git a/ajet/tuner_v2.md b/ajet/tuner_v2.md index fb3c2da7..1b7a1258 100644 --- a/ajet/tuner_v2.md +++ b/ajet/tuner_v2.md @@ -6,7 +6,7 @@ ```python class ExampleMathLearn(Workflow): - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory diff --git a/ajet/tuner_v2.py b/ajet/tuner_v2.py deleted file mode 100644 index 0edd1c09..00000000 --- a/ajet/tuner_v2.py +++ /dev/null @@ -1,142 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal, Type, Union - -from loguru import logger - -from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( - MultiAgentContextTracker, -) -from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker - -from ajet.tuner_lib.weight_tuner import AgentScopeModelTuner -from ajet.tuner_lib.weight_tuner import OpenaiClientModelTuner -if TYPE_CHECKING: - from ajet import Workflow - -TunerTypeUnion = Union[AgentScopeModelTuner, OpenaiClientModelTuner] - -class TunerV2(object): - - def __init__( - self, - config, - context_tracker: MultiAgentContextTracker, - user_workflow: "Workflow", - **kwargs, - ) -> None: - self.config = config - self.workflow = user_workflow - self.context_tracker = context_tracker - self.target2proxy_registry: dict[str, TunerTypeUnion] = {} - self.kwargs = kwargs - - - def as_agentscope_model( - self, - agent_name="default_agent_name", - target_tag="default_target_tag", - debug_model=None - ) -> "AgentScopeModelTuner": - """Convert to ModelTuner instance for Agentscope workflow. - Returns: - ModelTuner: - The ModelTuner instance for Agentscope workflow. - """ - explicit_tuner_as_modelscope_model = AgentScopeModelTuner( - config=self.config, - context_tracker=self.context_tracker, - user_workflow=self.workflow, - agent_name=agent_name, - debug_model=debug_model, - use_debug_model=(not self.is_target_trainable(target_tag)), - **self.kwargs, - ) - self.register_model(target_tag, explicit_tuner_as_modelscope_model) - return explicit_tuner_as_modelscope_model - - - def as_raw_openai_sdk_client( - self, - agent_name="default_agent_name", - target_tag="default_target_tag", - debug_model='gpt-4o', - ) -> OpenaiClientModelTuner: - """Convert to raw OpenAI SDK client for advanced usage. - Returns: - Any: - The raw OpenAI SDK client. - """ - explicit_tuner_as_oai_client = OpenaiClientModelTuner( - config=self.config, - context_tracker=self.context_tracker, - workflow=self.workflow, - agent_name=agent_name, - debug_model=debug_model, - use_debug_model=(not self.is_target_trainable(target_tag)), - **self.kwargs, - ) - self.register_model(target_tag, explicit_tuner_as_oai_client) - return explicit_tuner_as_oai_client - - - def __call__(self, **kwargs): - """This method is **deprecated**. - The current behavior of this method is pretend as a agentscope model - """ - # explicit_tuner = AgentScopeModelTuner( - # config=self.config, - # context_tracker=self.context_tracker, - # workflow=self.workflow, - # )(**kwargs) - # self.register_model("default_target_tag", explicit_tuner) - # return explicit_tuner - raise RuntimeError("This method is deprecated. Please use `as_agentscope_model` instead.") - - - - # ------------------------------------------------------------------------ - # other helper methods - # ------------------------------------------------------------------------ - - def register_model(self, target_name: str, explicit_tuner: TunerTypeUnion) -> TunerTypeUnion: - """Register an agent type. - Args: - target_name (`str`): - The name to register the agent type under. - default_model (`ChatModelBase`): - The model to use when you are NOT training this agent type. - Returns: - Agent2Proxy: - The agent type instance corresponding to the provided name. - """ - self.target2proxy_registry[target_name] = explicit_tuner - return explicit_tuner - - def is_target_trainable(self, target_name) -> bool: - """Determine whether user have used `trainable_targets` to explicitly control training targets. - """ - if self.workflow.trainable_targets is None: - # always assume trainable when user has never changed trainable_targets - return True - if not self.workflow.trainable_targets: - # always assume trainable when trainable_targets is [] - return True - if target_name in self.workflow.trainable_targets: - return True - else: - return False - - def get_llm_proxy(self) -> OpenaiLlmProxyWithTracker: - """Get the LlmProxyForAgentScope instance. - Returns: - LlmProxyForAgentScope: - The LlmProxyForAgentScope instance used by the ModelTuner. - """ - return self.llm_proxy - - def get_context_tracker(self) -> MultiAgentContextTracker: - """Get the context tracker instance. - Returns: - LlmProxyForAgentScope: - The context tracker instance used by the ModelTuner. - """ - return self.context_tracker \ No newline at end of file diff --git a/ajet/workflow.py b/ajet/workflow.py index dc11016b..7d3027f0 100644 --- a/ajet/workflow.py +++ b/ajet/workflow.py @@ -2,7 +2,7 @@ from pydantic import BaseModel, Field -from ajet import ModelTuner +from ajet import AjetTuner from ajet.schema.task import WorkflowOutput, WorkflowTask @@ -14,7 +14,7 @@ class Workflow(BaseModel): description="List of agents to be fine-tuned. When None, all agents are trainable.", ) - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: """Run the workflow on a given task.""" raise NotImplementedError @@ -57,13 +57,14 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> [+] class ExampleMathLearn(Workflow): [+] name: str = "math_agent_workflow" - [+] async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + [+] async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: [ ] from agentscope.agent import ReActAgent [ ] from agentscope.formatter import DashScopeChatFormatter [ ] from agentscope.memory import InMemoryMemory [ ] from agentscope.tool import Toolkit, execute_python_code [ ] self.toolkit = Toolkit() [ ] self.toolkit.register_tool_function(execute_python_code) + [ ] model_tuner = tuner.as_agentscope_model() [ ] self.agent = ReActAgent( [ ] name="math_react_agent", [ ] sys_prompt=system_prompt, diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index ebb92350..bca8e0ba 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -131,7 +131,7 @@ The `FrozenLakeWorkflow` class in `tutorial/example_frozenlake/frozenlake.py` in ```python class FrozenLakeWorkflow(Workflow): - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # init agent and env # reset environment and get initial `observation_str` rewards = [] diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index 671c9d60..b54e7edd 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -201,7 +201,7 @@ ajet: ```python title="workflow.py" class MyWorkflow(Workflow): - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: final_answer = await self.agent.reply(msg) return WorkflowOutput( reward=None, # Will be filled by the judger diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index b6a38b13..3b0b1ca5 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -177,7 +177,7 @@ ReActAgent( Next, wrap the agent into a trainable workflow: ```python title="workflow.py" -from ajet import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from ajet import AjetTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from loguru import logger diff --git a/docs/en/workflow.md b/docs/en/workflow.md index a2bcbffa..4a3d8a48 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -46,7 +46,7 @@ from ajet import Workflow, WorkflowTask, WorkflowOutput, ModelTuner class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # ... your ReActAgent workflow here ... return WorkflowOutput(reward=workflow_reward) ``` @@ -89,7 +89,7 @@ Wrap it in a workflow class: class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -100,7 +100,7 @@ class ExampleMathLearn(Workflow): self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, # ← Key change! + model=tuner.as_agentscope_model(), # ← Key change! formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -201,7 +201,7 @@ class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" trainable_targets: list = ["TYPE-ZERO", ...] - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # ... agents and workflow here ... ``` diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md index d3c7d08f..4995b3c6 100644 --- a/docs/zh/example_frozenlake.md +++ b/docs/zh/example_frozenlake.md @@ -110,7 +110,7 @@ class FrozenLakeAgent: ```python class FrozenLakeWorkflow(Workflow): - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # init agent and env # reset environment and get initial `observation_str` rewards = [] diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md index 36aab46d..c6978dbd 100644 --- a/docs/zh/task_judger.md +++ b/docs/zh/task_judger.md @@ -262,7 +262,7 @@ ajet: ```python title="workflow.py" class MyWorkflow(Workflow): - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # 智能体逻辑 final_answer = await self.agent.reply(msg) diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md index 268844fb..933f0195 100644 --- a/docs/zh/tune_your_first_agent.md +++ b/docs/zh/tune_your_first_agent.md @@ -181,7 +181,7 @@ ReActAgent( 接下来,将智能体封装进一个 Workflow 类中: ```python title="workflow.py" -from ajet import ModelTuner, Workflow, WorkflowTask, WorkflowOutput +from ajet import AjetTuner, Workflow, WorkflowTask, WorkflowOutput from agentscope.message import Msg from loguru import logger diff --git a/docs/zh/workflow.md b/docs/zh/workflow.md index 8c664ed2..4a98b445 100644 --- a/docs/zh/workflow.md +++ b/docs/zh/workflow.md @@ -46,7 +46,7 @@ from ajet import Workflow, WorkflowTask, WorkflowOutput, ModelTuner class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # ... your ReActAgent workflow here ... return WorkflowOutput(reward=workflow_reward) ``` @@ -91,7 +91,7 @@ final_answer = extract_final_answer(result) class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -200,7 +200,7 @@ class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" trainable_targets: list = ["TYPE-ZERO", ...] - async def execute(self, task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # ... your agents and workflow here ... ``` diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py index a084644a..a75b2fd9 100644 --- a/tutorial/example_appworld/appworld.py +++ b/tutorial/example_appworld/appworld.py @@ -1,13 +1,13 @@ from agentscope.message import Msg from pydantic import Field -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask class ExampleAgentScopeWorkflow(Workflow): trainer: str = Field(default="ajet-trinity") - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -27,6 +27,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> ) ) + model_tuner = tuner.as_agentscope_model() agent = ReActAgent( name="Qwen", sys_prompt=first_msg["content"], @@ -51,7 +52,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> # is terminated? if terminate: break - if model_tuner.get_context_tracker().context_overflow: + if tuner.get_context_tracker().context_overflow: break return WorkflowOutput(reward=None, metadata={"total_step": step}) diff --git a/tutorial/example_appworld/appworld_oai_sdk.py b/tutorial/example_appworld/appworld_oai_sdk.py index 92f1f59b..25442d48 100644 --- a/tutorial/example_appworld/appworld_oai_sdk.py +++ b/tutorial/example_appworld/appworld_oai_sdk.py @@ -2,17 +2,14 @@ from pydantic import Field from ajet import Workflow, WorkflowOutput, WorkflowTask -from ajet.tuner_v2 import TunerV2 as ModelTuner +from ajet import AjetTuner from openai.types.chat.chat_completion import ChatCompletion class ExampleAgentScopeWorkflow(Workflow): trainer: str = Field(default="ajet-trinity") - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: - from agentscope.agent import ReActAgent - from agentscope.formatter import DashScopeChatFormatter - from agentscope.memory import InMemoryMemory + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: init_messages = workflow_task.task.init_messages if len(init_messages) >= 2: @@ -29,12 +26,12 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> ) ) - client = model_tuner.as_raw_openai_sdk_client() + client = tuner.as_raw_openai_sdk_client() env = workflow_task.gym_env step = 0 - for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): + for step in range(tuner.config.ajet.rollout.multi_turn.max_steps): # agentscope deal with interaction message - reply_message: ChatCompletion = await client.chat.completion.create(interaction_message) + reply_message: ChatCompletion = await client.chat.completions.create(interaction_message) # env service protocol obs, _, terminate, _ = env.step( action={"content": reply_message.choices[0].message.content, "role": "assistant"} @@ -44,7 +41,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> # is terminated? if terminate: break - if model_tuner.get_context_tracker().context_overflow: + if tuner.get_context_tracker().context_overflow: break return WorkflowOutput(reward=None, metadata={"total_step": step}) diff --git a/tutorial/example_countdown/countdown.py b/tutorial/example_countdown/countdown.py index 5eafbeeb..0b846a43 100644 --- a/tutorial/example_countdown/countdown.py +++ b/tutorial/example_countdown/countdown.py @@ -1,7 +1,7 @@ from agentscope.message import Msg from loguru import logger -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -35,7 +35,7 @@ def extract_final_answer(result) -> str: class ExampleCountdownLearn(Workflow): name: str = "countdown_agent_workflow" - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -53,7 +53,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> self.agent = ReActAgent( name="countdown_react_agent", sys_prompt=system_prompt, - model=model_tuner, + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), max_iters=2, diff --git a/tutorial/example_feedback_tracing/train.py b/tutorial/example_feedback_tracing/train.py index 4cb9a082..62f92903 100644 --- a/tutorial/example_feedback_tracing/train.py +++ b/tutorial/example_feedback_tracing/train.py @@ -6,7 +6,7 @@ from loguru import logger from pydantic import BaseModel, Field -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask SYSTEM_PROMPT = """ You are an agent specialized in solving math problems with tools. @@ -44,7 +44,7 @@ class FinalResult(BaseModel): class ExampleTracingFeedbackTrain(Workflow): name: str = "tracing_feedback_train" - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: query = workflow_task.task.main_query tool_kit = Toolkit() @@ -53,7 +53,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> agent = ReActAgent( name="Qwen", sys_prompt=SYSTEM_PROMPT, - model=model_tuner, + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), toolkit=tool_kit, diff --git a/tutorial/example_frozenlake/frozenlake.py b/tutorial/example_frozenlake/frozenlake.py index b8736812..c2d9f4ce 100644 --- a/tutorial/example_frozenlake/frozenlake.py +++ b/tutorial/example_frozenlake/frozenlake.py @@ -14,11 +14,12 @@ import numpy as np from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter +from agentscope.model import DashScopeChatModel from agentscope.message import Msg from gymnasium.envs.toy_text.frozen_lake import FrozenLakeEnv as GymFrozenLakeEnv from loguru import logger -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask SYSTEM_PROMPT = """You are a helpful assistant. You are walking on a frozen lake. @@ -50,8 +51,8 @@ class FrozenLakeWorkflow(Workflow): - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: - config = model_tuner.config + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + config = tuner.config self.env_max_steps = config.ajet.rollout.multi_turn.max_steps self.agent_max_steps = config.ajet.rollout.multi_turn.max_steps @@ -68,7 +69,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> # init agent and environment self.agent = FrozenLakeAgent( - model=model_tuner, + model=tuner.as_agentscope_model(), max_steps=self.agent_max_steps, ) self.env = FrozenLakeEnv( @@ -121,7 +122,7 @@ async def run_frozenlake(self): class FrozenLakeAgent: INVALID_ACTION = "still" - def __init__(self, model: ModelTuner, max_steps: int = 20): + def __init__(self, model: DashScopeChatModel, max_steps: int = 20): self.agent = ReActAgent( name="frozenlake_agent", sys_prompt=SYSTEM_PROMPT, diff --git a/tutorial/example_learn2ask/learn2ask.py b/tutorial/example_learn2ask/learn2ask.py index b1b7b1c1..f1001a50 100644 --- a/tutorial/example_learn2ask/learn2ask.py +++ b/tutorial/example_learn2ask/learn2ask.py @@ -7,7 +7,7 @@ from agentscope.message import Msg from loguru import logger -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask from ajet.utils.robust_dashscope import RobustDashScopeChatModel system_prompt = """# Task @@ -166,11 +166,13 @@ async def reward_fn_with_semaphore(*args, **kwargs): class ExampleLearn2Ask(Workflow): name: str = "math_agent_workflow" - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory + model_tuner = tuner.as_agentscope_model() + messages = workflow_task.task.init_messages assert isinstance(messages, list) truth_action = workflow_task.task.metadata["decision_truth"] or "continue" diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index caf10ef3..b26b7aa0 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -1,7 +1,7 @@ from agentscope.message import Msg from loguru import logger -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -34,7 +34,7 @@ def extract_final_answer(result) -> str: class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -46,7 +46,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner.as_agentscope_model(), + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), diff --git a/tutorial/example_math_agent/math_agent_oai_sdk.py b/tutorial/example_math_agent/math_agent_oai_sdk.py index 8b80a53b..5b9b69c2 100644 --- a/tutorial/example_math_agent/math_agent_oai_sdk.py +++ b/tutorial/example_math_agent/math_agent_oai_sdk.py @@ -1,8 +1,7 @@ from loguru import logger -from ajet import Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask from openai.types.chat.chat_completion import ChatCompletion from openai.types.chat import ChatCompletionMessageToolCall -from ajet.tuner_v2 import TunerV2 from textwrap import dedent import json @@ -23,7 +22,7 @@ class ExampleMathLearn_Simple_NoToolCall(Workflow): You should return your final answer within \\boxed{{}}. """) - async def execute(self, workflow_task: WorkflowTask, model_tuner: TunerV2) -> WorkflowOutput: # type: ignore + async def execute(self, workflow_task: WorkflowTask, model_tuner: AjetTuner) -> WorkflowOutput: # type: ignore query = workflow_task.task.main_query client = model_tuner.as_raw_openai_sdk_client() @@ -88,7 +87,7 @@ class ExampleMathLearn(Workflow): }, ] - async def execute(self, workflow_task: WorkflowTask, model_tuner: TunerV2) -> WorkflowOutput: # type: ignore + async def execute(self, workflow_task: WorkflowTask, model_tuner: AjetTuner) -> WorkflowOutput: # type: ignore query = workflow_task.task.main_query diff --git a/tutorial/example_math_agent/math_agent_simplify.py b/tutorial/example_math_agent/math_agent_simplify.py index e2d2746e..c1249db5 100644 --- a/tutorial/example_math_agent/math_agent_simplify.py +++ b/tutorial/example_math_agent/math_agent_simplify.py @@ -3,7 +3,7 @@ from agentscope.message import Msg from loguru import logger -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -36,7 +36,7 @@ def extract_final_answer(result) -> str: class MathToolWorkflow(Workflow): name: str = "math_agent_workflow" - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -48,7 +48,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), diff --git a/tutorial/example_rubrics_judge/math_agent.py b/tutorial/example_rubrics_judge/math_agent.py index 1cfd604c..7b2a4aa8 100644 --- a/tutorial/example_rubrics_judge/math_agent.py +++ b/tutorial/example_rubrics_judge/math_agent.py @@ -2,7 +2,7 @@ from loguru import logger from pydantic import BaseModel, Field -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask def extract_final_answer(result) -> str: @@ -41,7 +41,7 @@ class FinalResult(BaseModel): class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory @@ -53,7 +53,7 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index d8582db2..22f9004b 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -3,21 +3,20 @@ """The main entry point for the werewolf game.""" -import os - -import dotenv +from typing import List import numpy as np - +import dotenv dotenv.load_dotenv() + from textwrap import dedent from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeMultiAgentFormatter, OpenAIMultiAgentFormatter from agentscope.model import DashScopeChatModel, OpenAIChatModel from loguru import logger -from pydantic import BaseModel, Field +from pydantic import Field -from ajet import ModelTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask from tutorial.example_werewolves.game import BadGuyException, werewolves_game @@ -82,12 +81,15 @@ def get_official_agent_prompt(name) -> str: class ExampleWerewolves(Workflow): trainer: str = Field(default="ajet-trinity") - trainable_targets: list = Field( - default=["werewolf"], description="List of agents to be fine-tuned." - ) + trainable_targets: List[str] | None = Field(default=["werewolf"], description="List of agents to be fine-tuned.") + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> WorkflowOutput: # ensure trainable targets is legal + assert self.trainable_targets is not None, "trainable_targets cannot be None in ExampleWerewolves (because we want to demonstrate a explicit multi-agent case)." + + # bad guys and good guys cannot be trained simultaneously + # (because mix-cooperation-competition MARL needs too many advanced techniques to be displayed here) if "werewolf" in self.trainable_targets: assert len(self.trainable_targets) == 1, "Cannot train hostile roles simultaneously." else: @@ -109,13 +111,18 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: ModelTuner) -> api_key="no_api_key", generate_kwargs={"temperature": 0.01}, ) + model_for_this_agent = tuner.as_agentscope_model( + agent_name=f"Player{i + 1}", # the name of this agent + target_tag=role, # `target_tag in self.trainable_targets` means we train this agent, otherwise we do not train this agent. + debug_model=default_model, # the model used when this agent is not in `self.trainable_targets` + ) agent = ReActAgent( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), - model=model_tuner.register_model(role, default_model=default_model), + model=model_for_this_agent, formatter=DashScopeMultiAgentFormatter() - if role in self.trainable_targets - else OpenAIMultiAgentFormatter(), + if role in self.trainable_targets + else OpenAIMultiAgentFormatter(), max_iters=3 if role in self.trainable_targets else 5, ) # agent.set_console_output_enabled(False) From ca1cf82235c3c7be97dc6b2ff389d2ed190ad852 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 8 Jan 2026 20:27:59 +0800 Subject: [PATCH 390/462] add interchange api --- ajet/backbone/main_trinity.py | 2 + ajet/backbone/main_verl.py | 4 + ajet/backbone/trainer_trinity.py | 6 +- .../multiagent_tracking.py | 8 +- .../timeline_merging.py | 0 ajet/default_config/ajet_default.yaml | 3 + ajet/schema/convertion.py | 68 +++- ajet/schema/task.py | 2 +- ajet/task_judge/env_service_as_judge.py | 2 +- ajet/task_rollout/async_llm_bridge.py | 172 +++------- ajet/task_rollout/resource_keeper.py | 22 +- ajet/task_rollout/single_worker.py | 2 +- ajet/task_runner/general_runner.py | 9 +- ajet/tuner.py | 69 +++- ajet/tuner_deprecated.py | 2 +- .../weight_tuner/as_agentscope_model.py | 6 +- .../weight_tuner/as_oai_baseurl_apikey.py | 54 +++ .../weight_tuner/as_oai_model_server.py | 23 -- .../weight_tuner/as_oai_sdk_model.py | 7 +- .../experimental/as_oai_model_client.py | 152 +++++++++ .../experimental/as_oai_model_server.py | 318 ++++++++++++++++++ ajet/utils/core_env_vars.py | 11 + ajet/workflow.py | 4 +- tests/bench/README.md | 5 +- tutorial/example_appworld/appworld.py | 5 +- tutorial/example_learn2ask/learn2ask.py | 4 +- .../example_math_agent/math_agent_oai_sdk.py | 14 +- .../example_math_agent/math_agent_raw_http.py | 64 ++++ 28 files changed, 838 insertions(+), 200 deletions(-) rename ajet/context_tracker/{agentscope_tracker => }/multiagent_tracking.py (99%) rename ajet/context_tracker/{agentscope_tracker => timeline_merging}/timeline_merging.py (100%) create mode 100644 ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py delete mode 100644 ajet/tuner_lib/weight_tuner/as_oai_model_server.py create mode 100644 ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py create mode 100644 ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py create mode 100644 tutorial/example_math_agent/math_agent_raw_http.py diff --git a/ajet/backbone/main_trinity.py b/ajet/backbone/main_trinity.py index fe510399..dd93a6db 100644 --- a/ajet/backbone/main_trinity.py +++ b/ajet/backbone/main_trinity.py @@ -40,6 +40,8 @@ def patched_trainer_get_actor(cls, config: Config): Trainer.get_actor = classmethod(patched_trainer_get_actor) + + if __name__ == "__main__": patch_runtime_env_to_get_actor() main() diff --git a/ajet/backbone/main_verl.py b/ajet/backbone/main_verl.py index 8a2146c1..f7a84739 100644 --- a/ajet/backbone/main_verl.py +++ b/ajet/backbone/main_verl.py @@ -247,6 +247,10 @@ def run(self, config): from ajet.backbone.trainer_verl import AjetRayPPOTrainer + if config.ajet.enable_experimental_reverse_proxy: + from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server + start_interchange_server() + # Initialize the PPO trainer. trainer = AjetRayPPOTrainer( config=config, diff --git a/ajet/backbone/trainer_trinity.py b/ajet/backbone/trainer_trinity.py index d4c0c517..9a2c7326 100644 --- a/ajet/backbone/trainer_trinity.py +++ b/ajet/backbone/trainer_trinity.py @@ -19,7 +19,7 @@ from trinity.utils.monitor import MONITOR, Monitor from ajet.backbone.warm_up import warm_up_process -from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) from ajet.schema.trajectory import Sample @@ -116,6 +116,10 @@ def __init__( async def run_async(self): ajet_config = get_ajet_config_from_trinity_side() + if ajet_config.ajet.enable_experimental_reverse_proxy: + raise NotImplementedError( + "The experimental reverse proxy is not supported in Trinity backbone yet." + ) warm_up_process(ajet_config) tracker = await TrinityRolloutManager( is_eval=self.is_eval, diff --git a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py b/ajet/context_tracker/multiagent_tracking.py similarity index 99% rename from ajet/context_tracker/agentscope_tracker/multiagent_tracking.py rename to ajet/context_tracker/multiagent_tracking.py index 6102f7e1..2b73e151 100644 --- a/ajet/context_tracker/agentscope_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/multiagent_tracking.py @@ -8,7 +8,7 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from ajet.context_tracker.agentscope_tracker.timeline_merging import ( +from ajet.context_tracker.timeline_merging.timeline_merging import ( merge_tracker_timelines, is_timeline_mergeable ) from ajet.context_tracker.basic_tracker import ( @@ -36,6 +36,8 @@ class ContextTrackerConfig: detect_timeline_snap: bool = False + + class MultiAgentContextTracker(BaseContextTracker): """ Context tracker is responsible to monitor and process LLM IO. @@ -44,15 +46,14 @@ class MultiAgentContextTracker(BaseContextTracker): def __init__( self, - llm_inference_fn, tokenizer: PreTrainedTokenizer, config, should_interrupt_fn, generated_token_callback_fn, + episode_uuid: str, **kwargs, ): super().__init__(config, tokenizer, **kwargs) - self.llm_inference_fn = llm_inference_fn self.tokenizer = tokenizer self.should_interrupt_fn = should_interrupt_fn self.generated_token_callback_fn = generated_token_callback_fn @@ -60,6 +61,7 @@ def __init__( self.output_kwargs = {} self.input_kwargs = {} self.timeline_cache = {} + self.episode_uuid = episode_uuid def step_prepare(self, messages: List[dict], tools: List = [], timeline_uuid: str = ""): diff --git a/ajet/context_tracker/agentscope_tracker/timeline_merging.py b/ajet/context_tracker/timeline_merging/timeline_merging.py similarity index 100% rename from ajet/context_tracker/agentscope_tracker/timeline_merging.py rename to ajet/context_tracker/timeline_merging/timeline_merging.py diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 9751b312..6cf4c3f3 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -6,6 +6,9 @@ ajet: backbone: debug # `debug` or `trinity` or `verl` + # the experimental reverse proxy feature that allows `tuner.as_oai_baseurl_apikey` feature + enable_experimental_reverse_proxy: True + model: # which model should be trained path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct diff --git a/ajet/schema/convertion.py b/ajet/schema/convertion.py index d9cda761..54f0d4df 100644 --- a/ajet/schema/convertion.py +++ b/ajet/schema/convertion.py @@ -1,8 +1,14 @@ +import time from openai.types.chat.chat_completion import ChatCompletion, Choice from openai.types.chat.chat_completion_message import ChatCompletionMessage +from agentscope.model import ChatResponse as AgentScopeChatResponse from openai.types.completion_usage import CompletionUsage -import time +from typing import Any, Callable, Dict, List, Literal, Type, Union +from agentscope.message import TextBlock, ToolUseBlock +from agentscope._utils._common import _json_loads_with_repair +from pydantic import BaseModel +from agentscope.model import ChatResponse def convert_llm_proxy_response_to_oai_response(llm_proxy_response): @@ -40,6 +46,66 @@ def convert_llm_proxy_response_to_oai_response(llm_proxy_response): usage=usage, ) +# copied from AgentScope's DashScopeChatModule +def convert_llm_proxy_response_to_agentscope_response( + message, + structured_model: Type[BaseModel] | None = None, +) -> AgentScopeChatResponse: # type: ignore + content_blocks: List[TextBlock | ToolUseBlock] = [] + content = message.get("content") + metadata: dict | None = None + + if content not in [ + None, + "", + [], + ]: + if isinstance(content, list): + for item in content: + if isinstance(item, dict) and "text" in item: + content_blocks.append( + TextBlock( + type="text", + text=item["text"], + ), + ) + else: + content_blocks.append( + TextBlock( + type="text", + text=content, + ), + ) + + if message.get("tool_calls"): + for tool_call in message["tool_calls"]: + input_ = _json_loads_with_repair( + tool_call["function"].get( + "arguments", + "{}", + ) + or "{}", + ) + content_blocks.append( + ToolUseBlock( + type="tool_use", + name=tool_call["function"]["name"], + input=input_, # type: ignore + id=tool_call["id"], + ), + ) + + if structured_model: + metadata = input_ # type: ignore + + parsed_response = AgentScopeChatResponse( + content=content_blocks, + metadata=metadata, + ) + + return parsed_response + + def test_convert_llm_proxy_response_to_oai_response(): """Test the conversion from llm_proxy_response to OpenAI ChatCompletion format.""" diff --git a/ajet/schema/task.py b/ajet/schema/task.py index ab9aa59d..f93cff97 100644 --- a/ajet/schema/task.py +++ b/ajet/schema/task.py @@ -26,7 +26,7 @@ class WorkflowTask(BaseModel): task_thread_index: int = Field(default=0) task_batch_index: int = Field(default=0) task_tag: str = Field(default="") - task_env_uuid: str = Field(default="") + episode_uuid: str = Field(default="") observation_window: dict = Field(default={}) llm_inference_fn: Any = Field(default=None) tokenizer: Any = Field(default=None) diff --git a/ajet/task_judge/env_service_as_judge.py b/ajet/task_judge/env_service_as_judge.py index 3703a7ca..503ace82 100644 --- a/ajet/task_judge/env_service_as_judge.py +++ b/ajet/task_judge/env_service_as_judge.py @@ -10,7 +10,7 @@ def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowO raw_reward = 0 env = workflow_task.gym_env - raw_reward = env.evaluate(workflow_task.task_env_uuid, params={"sparse": False}) + raw_reward = env.evaluate(workflow_task.episode_uuid, params={"sparse": False}) if raw_reward >= 1: is_success = True else: diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index bd509fb7..ad942fa4 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -19,16 +19,35 @@ ChatResponse = Union[OpenAIChatCompletion, AgentScopeChatResponse] -from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) from ajet.schema.convertion import convert_llm_proxy_response_to_oai_response +from ajet.schema.convertion import convert_llm_proxy_response_to_agentscope_response from ajet.schema.logprob import TokenAndProb from ajet.utils.async_utils import run_async_coroutine_with_timeout from ajet.utils.testing_utils import _mock_if_test_mode, _test_if_test_mode from ajet.utils.tokenizer import ajet_apply_chat_template +class AjetStandardLlmBridgeRequest(BaseModel): + messages: List[Dict[str, str]] + custom_sampling_params: dict = {} + tools=[] + request_id: str = "" + +class AjetStandardLlmBridgeResponse(BaseModel): + role: str = "assistant" + request_id: str = "" + content: str = "" + tool_calls: List[Dict] = [] + tokens: List[TokenAndProb] + + +# ------------------------------------------------------------------------------------- +# ------------------------ Unify LLM for Verl + Trinity + Vllm ------------------------ +# ------------------------------------------------------------------------------------- + class AsyncLlmBridge(object): def __init__( self, @@ -45,6 +64,7 @@ def __init__( self.max_llm_retries = max_llm_retries def get_llm_inference_fn(self, sampling_params: dict = {}) -> Callable: # noqa: C901 + def llm_chat_verl( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -247,8 +267,9 @@ async def main(): - - +# ---------------------------------------------------------------------------------------------- +# ------------------------ call async llm with context tracker (OpenAI) ------------------------ +# ---------------------------------------------------------------------------------------------- class OpenaiLlmProxyWithTracker(object): """ @@ -259,36 +280,36 @@ class OpenaiLlmProxyWithTracker(object): def __init__( self, - llm_inference_fn, - tokenizer: PreTrainedTokenizer, + llm_inference_fn: Callable, # Callable[AjetStandardLlmBridgeRequest, AjetStandardLlmBridgeResponse] context_tracker: MultiAgentContextTracker, config, ) -> None: self.context_tracker = context_tracker self.llm_inference_fn = llm_inference_fn - self.tokenizer = tokenizer self.config = config - def construct_overflow_response(self) -> ChatResponse: - from ajet.schema.convertion import convert_llm_proxy_response_to_oai_response - return convert_llm_proxy_response_to_oai_response( - { - "role": "assistant", - "request_id": "overflow_response", - "content": "ajet_proxy: Exceeded max model context length.", - "tool_calls": None, - "tokens": [], - } - ) - async def run_infer( + async def __call__( self, messages: List[dict], tools: List = [], tool_choice: str = "auto", structured_model=None, **kwargs, + ) -> ChatResponse: + llm_output = await self.run_infer(messages, tools, tool_choice, structured_model, **kwargs) + return convert_llm_proxy_response_to_oai_response(llm_output) + + + async def run_infer( + self, + messages: List[dict], + tools: List = [], + tool_choice: str = "auto", # always auto + structured_model=None, # this is for AgentScope only + **kwargs, ): + # generate timeline uuid timeline_uuid = uuid.uuid4().hex # prepare context tracker, check context safety @@ -309,7 +330,8 @@ async def run_infer( # ajet_action_when_overflow = self.config.ajet.rollout.ajet_action_when_overflow # cannot proceed due to context overflow return self.construct_overflow_response() - # else: # otherwise, for abnormal output, can still proceed, but we do not track output anymore + # else: + # otherwise, for abnormal output, can still proceed, but we do not track output anymore # run llm inference ✨ llm_output = await asyncio.wait_for( @@ -323,34 +345,26 @@ async def run_infer( self.context_tracker.step_track(llm_output, context_safe, converted_message, tools, timeline_uuid=timeline_uuid) return llm_output - async def __call__( - self, - messages: List[dict], - tools: List = [], - tool_choice: str = "auto", - structured_model=None, - **kwargs, - ) -> ChatResponse: - llm_output = await self.run_infer( - messages, tools, tool_choice, structured_model, **kwargs - ) - - return convert_llm_proxy_response_to_oai_response(llm_output) + def construct_overflow_response(self): + return { + "role": "assistant", + "request_id": "overflow_response", + "content": "ajet_proxy: Exceeded max model context length.", + "tool_calls": None, + "tokens": [], + } +# ---------------------------------------------------------------------------------------------- +# ------------------------ call async llm with context tracker (AgentScope) -------------------- +# ---------------------------------------------------------------------------------------------- class AgentScopeLlmProxyWithTracker(OpenaiLlmProxyWithTracker): - """ - An essential wrapper to connect AsyncLlmBridge with AgentScope - - User_user_workflow <-> AsyncLlmBridge <-> Context Tracker. - """ - async def __call__( self, @@ -359,84 +373,8 @@ async def __call__( tool_choice: str = "auto", structured_model=None, **kwargs, - ) -> AgentScopeChatResponse: # type: ignore - - llm_output = await self.run_infer( - messages, tools, tool_choice, structured_model, **kwargs - ) - - # parse response - response = await self._parse_dashscope_generation_response( - llm_output, structured_model=structured_model - ) + ) -> AgentScopeChatResponse: + llm_output = await self.run_infer(messages, tools, tool_choice, structured_model) + response = convert_llm_proxy_response_to_agentscope_response(llm_output, structured_model=structured_model) return response - - - def construct_overflow_response(self): # type: ignore - return AgentScopeChatResponse( - content=[ - {"type": "text", "text": "ajet_proxy: Exceeded max model context length."} - ], - ) - - - # copied from AgentScope's DashScopeChatModule - async def _parse_dashscope_generation_response( - self, - message, - structured_model: Type[BaseModel] | None = None, - ) -> AgentScopeChatResponse: # type: ignore - content_blocks: List[TextBlock | ToolUseBlock] = [] - content = message.get("content") - metadata: dict | None = None - - if content not in [ - None, - "", - [], - ]: - if isinstance(content, list): - for item in content: - if isinstance(item, dict) and "text" in item: - content_blocks.append( - TextBlock( - type="text", - text=item["text"], - ), - ) - else: - content_blocks.append( - TextBlock( - type="text", - text=content, - ), - ) - - if message.get("tool_calls"): - for tool_call in message["tool_calls"]: - input_ = _json_loads_with_repair( - tool_call["function"].get( - "arguments", - "{}", - ) - or "{}", - ) - content_blocks.append( - ToolUseBlock( - type="tool_use", - name=tool_call["function"]["name"], - input=input_, # type: ignore - id=tool_call["id"], - ), - ) - - if structured_model: - metadata = input_ # type: ignore - - parsed_response = AgentScopeChatResponse( - content=content_blocks, - metadata=metadata, - ) - - return parsed_response diff --git a/ajet/task_rollout/resource_keeper.py b/ajet/task_rollout/resource_keeper.py index 76feeb7e..ba33e0c0 100644 --- a/ajet/task_rollout/resource_keeper.py +++ b/ajet/task_rollout/resource_keeper.py @@ -38,7 +38,7 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): try: if self.env: - self.env.release_instance(self.workflow_task.task_env_uuid) + self.env.release_instance(self.workflow_task.episode_uuid) except Exception as e: logger.bind(exception=True).exception( f"encounter exception in env_worker.release_instance~ error={e.args}" @@ -56,7 +56,7 @@ def prepare(self): self.workflow_task.task.init_messages = init_messages self.workflow_task.gym_env = self.generate_gym_env( self.env, - self.workflow_task.task_env_uuid, + self.workflow_task.episode_uuid, self.workflow_task.task_thread_index, self.workflow_task.observation_window, ) @@ -81,7 +81,7 @@ def _initialize_environment_and_messages(self) -> List[dict]: init_response = self.env.create_instance( env_type=self.env_type, task_id=self.task_id, - instance_id=self.workflow_task.task_env_uuid, + instance_id=self.workflow_task.episode_uuid, params=self.env_params, ) state_message: dict = init_response["state"] @@ -91,7 +91,7 @@ def _initialize_environment_and_messages(self) -> List[dict]: f"encounter exception in env_worker.create_instance~ error={e.args}" ) if self.env is not None: - self.env.release_instance(self.workflow_task.task_env_uuid) + self.env.release_instance(self.workflow_task.episode_uuid) raise e else: task = self.workflow_task.task @@ -129,9 +129,9 @@ def _get_init_messages(self, state_message) -> tuple: return query, init_messages def generate_gym_env( - self, env_client: Any, task_env_uuid: str, task_thread_index: int, observation_window: Dict + self, env_client: Any, episode_uuid: str, task_thread_index: int, observation_window: Dict ) -> "BaseGymEnv": - return BaseGymEnv(env_client, task_env_uuid, task_thread_index, observation_window) + return BaseGymEnv(env_client, episode_uuid, task_thread_index, observation_window) class BaseGymEnv(object): @@ -142,14 +142,14 @@ class BaseGymEnv(object): def __init__( self, env_client: EnvClientNg, - task_env_uuid: str, + episode_uuid: str, task_thread_index: int, observation_window: Dict, ): self.env_client = env_client self.task_thread_index = task_thread_index self.observation_window = observation_window - self.task_env_uuid = task_env_uuid + self.episode_uuid = episode_uuid def step(self, action: dict) -> Tuple[str, float, bool, dict]: """Take a step in the gym environment.""" @@ -169,7 +169,7 @@ def step(self, action: dict) -> Tuple[str, float, bool, dict]: self.observation_window["step"][self.task_thread_index] += 1 env_output = self.env_client.step( - instance_id=self.task_env_uuid, + instance_id=self.episode_uuid, action=action, ) obs = "" @@ -189,6 +189,6 @@ def reset(self) -> str: """Reset gym environment.""" raise RuntimeError("Reset is not supported") - def evaluate(self, task_env_uuid, params): + def evaluate(self, episode_uuid, params): """Evaluate and get reward.""" - return self.env_client.evaluate(task_env_uuid, params) + return self.env_client.evaluate(episode_uuid, params) diff --git a/ajet/task_rollout/single_worker.py b/ajet/task_rollout/single_worker.py index 9d187797..b837b60b 100644 --- a/ajet/task_rollout/single_worker.py +++ b/ajet/task_rollout/single_worker.py @@ -93,7 +93,7 @@ def rollout_env_worker( task_id=task.task_id, task_thread_index=task_thread_index, task_batch_index=task_batch_index, - task_env_uuid=uuid.uuid4().hex, + episode_uuid=uuid.uuid4().hex, task_tag=task_tag, observation_window=observation_window, llm_inference_fn=llm_inference_fn, diff --git a/ajet/task_runner/general_runner.py b/ajet/task_runner/general_runner.py index 12a9e523..e88ec323 100644 --- a/ajet/task_runner/general_runner.py +++ b/ajet/task_runner/general_runner.py @@ -2,7 +2,7 @@ from ajet import AjetTuner from ajet import Workflow, WorkflowOutput -from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) from ajet.context_tracker.basic_tracker import BaseContextTracker @@ -36,18 +36,18 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: task_batch_index=task_batch_index, task_tag=task_tag, task_id=task_id, + episode_uuid=workflow_task.episode_uuid, **hooks, ) - m_tuner = AjetTuner( + tuner = AjetTuner( context_tracker=context_tracker, llm_inference_fn=self.llm_inference_fn, - tokenizer=self.tokenizer, user_workflow=user_workflow, config=self.config, ) workflow_output: WorkflowOutput = asyncio.run( - user_workflow.execute(workflow_task, m_tuner) + user_workflow.execute(workflow_task, tuner) ) if workflow_output.reward is not None: raw_reward, is_success = ( @@ -80,4 +80,5 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: context_tracker.process_reward(reward) # mark the thread as ended observation_window["step"][task_thread_index] = -1 + tuner.terminate_episode() return context_tracker diff --git a/ajet/tuner.py b/ajet/tuner.py index c006c34e..9c228af8 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -1,11 +1,12 @@ -from typing import TYPE_CHECKING, Any, Literal, Type, Union +from typing import TYPE_CHECKING, Any, Literal, Callable, Union -from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) from ajet.tuner_lib.weight_tuner import AgentScopeModelTuner from ajet.tuner_lib.weight_tuner import OpenaiClientModelTuner +from ajet.tuner_lib.weight_tuner.as_oai_baseurl_apikey import OpenaiClientBaseUrlTuner if TYPE_CHECKING: from ajet import Workflow @@ -18,13 +19,15 @@ def __init__( config, context_tracker: MultiAgentContextTracker, user_workflow: "Workflow", - **kwargs, + llm_inference_fn: Callable, ) -> None: self.config = config self.workflow = user_workflow self.context_tracker = context_tracker + self.llm_inference_fn = llm_inference_fn self.target2proxy_registry: dict[str, dict[str,TunerTypeUnion]] = {} - self.kwargs = kwargs + if config.ajet.enable_experimental_reverse_proxy: + self._enable_experimental_interchange_server(llm_inference_fn) def as_agentscope_model( @@ -45,7 +48,7 @@ def as_agentscope_model( agent_name=agent_name, debug_model=debug_model, use_debug_model=(not self._is_target_trainable(target_tag)), - **self.kwargs, + llm_inference_fn=self.llm_inference_fn, ) self._register(target_tag, agent_name, explicit_tuner_as_modelscope_model) return explicit_tuner_as_modelscope_model @@ -69,12 +72,45 @@ def as_raw_openai_sdk_client( agent_name=agent_name, debug_model=debug_model, use_debug_model=(not self._is_target_trainable(target_tag)), - **self.kwargs, + llm_inference_fn=self.llm_inference_fn, ) self._register(target_tag, agent_name, explicit_tuner_as_oai_client) return explicit_tuner_as_oai_client + def as_oai_baseurl_apikey( + self, + agent_name="default_agent_name", + target_tag="default_target_tag", + ): + """ + Usage: + ```python + result = tuner.as_oai_baseurl_apikey() + + # take base_url, api_key, model_name + base_url = result.base_url + api_key = result.api_key + + # use base_url, api_key, model_name + client = AsyncOpenAI(base_url=base_url, api_key=api_key) + response = await client.chat.completions.create( + model='whatever_model_name_you_like', + messages=messages, + ) + ``` + """ + + baseurl_apikey_model = OpenaiClientBaseUrlTuner( + config=self.config, + context_tracker=self.context_tracker, + workflow=self.workflow, + agent_name=agent_name, + target_tag=target_tag, + episode_uuid=self.context_tracker.episode_uuid, + ) + return baseurl_apikey_model + def __call__(self, **kwargs): """This method is **deprecated**. The current behavior of this method is pretend as a agentscope model @@ -116,10 +152,29 @@ def _is_target_trainable(self, target_name) -> bool: else: return False + def get_context_tracker(self) -> MultiAgentContextTracker: """Get the context tracker instance. Returns: LlmProxyForAgentScope: The context tracker instance used by the ModelTuner. """ - return self.context_tracker \ No newline at end of file + return self.context_tracker + + + def _enable_experimental_interchange_server(self, llm_inference_fn): + # experimental reverse proxy start + if self.config.ajet.enable_experimental_reverse_proxy: + from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_client import InterchangeClient + self.interchange_client = InterchangeClient( + episode_uuid=self.context_tracker.episode_uuid, + context_tracker=self.context_tracker, + config=self.config, + llm_inference_fn=llm_inference_fn, + ) + + + def terminate_episode(self): + # experimental reverse proxy cleanup + if self.config.ajet.enable_experimental_reverse_proxy: + self.interchange_client._should_terminate = True diff --git a/ajet/tuner_deprecated.py b/ajet/tuner_deprecated.py index 5880ae60..46343088 100644 --- a/ajet/tuner_deprecated.py +++ b/ajet/tuner_deprecated.py @@ -5,7 +5,7 @@ from loguru import logger from pydantic import BaseModel -from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker diff --git a/ajet/tuner_lib/weight_tuner/as_agentscope_model.py b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py index 79a5f10d..92a98457 100644 --- a/ajet/tuner_lib/weight_tuner/as_agentscope_model.py +++ b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py @@ -5,7 +5,7 @@ from loguru import logger from pydantic import BaseModel -from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) from ajet.task_rollout.async_llm_bridge import AgentScopeLlmProxyWithTracker @@ -29,7 +29,7 @@ def __init__( agent_name: str, debug_model: DashScopeChatModel | None, use_debug_model: bool = False, - **kwargs, + llm_inference_fn=None, ) -> None: self.config = config self.context_tracker = context_tracker @@ -39,7 +39,7 @@ def __init__( self.debug_model = debug_model self.use_debug_model = use_debug_model self.llm_proxy = AgentScopeLlmProxyWithTracker( - context_tracker=context_tracker, config=config, **kwargs + context_tracker=context_tracker, config=config, llm_inference_fn=llm_inference_fn ) super().__init__( model_name="ajet", diff --git a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py new file mode 100644 index 00000000..ad18102b --- /dev/null +++ b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py @@ -0,0 +1,54 @@ +import asyncio +from typing import TYPE_CHECKING, Any, List, Callable, Literal, Type, Union +from loguru import logger +from pydantic import BaseModel, Field +from ajet.context_tracker.multiagent_tracking import ( + MultiAgentContextTracker, +) +from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker +from ajet.utils.magic_mock import SpecialMagicMock +from openai.types.chat.chat_completion import ChatCompletion +from openai.resources.chat.chat import Chat, AsyncChat +from openai.resources.completions import AsyncCompletions +from openai import OpenAI, AsyncOpenAI +from .experimental.as_oai_model_client import generate_auth_token + +if TYPE_CHECKING: + from ajet import Workflow + +class MockAsyncCompletions(AsyncCompletions): + async def create(self, *args, **kwargs) -> Any: # type: ignore + return await self._client.create(*args, **kwargs) # type: ignore + +class MockAsyncChat(AsyncChat): + @property + def completions(self) -> MockAsyncCompletions: # type: ignore + return MockAsyncCompletions(self._client) + +class OpenaiClientBaseUrlTuner(BaseModel): + """ At this layer, we will determine which model to use: + - training model + - debug model assigned by user, used when this target is not being trained + """ + + base_url: str = Field(default="http://localhost:27788/v1", description="The base URL for the Ajet's fake OpenAI API") + api_key: str = Field(default="invalid_apikey", description="The Ajet's fake key, which is not a real key, it is a encoded string contain episode_uuid and other stuff.") + model: str = Field(default="reserved_field", description="reserved field.") + + def __init__( + self, + config, + context_tracker: MultiAgentContextTracker, + workflow: "Workflow", + target_tag: str, + agent_name: str, + episode_uuid: str, + **kwargs, + ): + self.base_url = "http://localhost:27788/v1" + self.api_key = generate_auth_token( + agent_name=agent_name, + target_tag=target_tag, + episode_uuid=episode_uuid, + ) + self.model = "reserved_field" diff --git a/ajet/tuner_lib/weight_tuner/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/as_oai_model_server.py deleted file mode 100644 index 4db0ed36..00000000 --- a/ajet/tuner_lib/weight_tuner/as_oai_model_server.py +++ /dev/null @@ -1,23 +0,0 @@ -# write a class to serve as interchange endpoint (using fastapi). - -# 1. find free port -# 2. start fastapi server on that 0.0.0.0 + port (new thread) -# 3. return port number - -# endpoint list - -# /health: health check -# - input: none -# - output: {"status": "ok"} - -# /hook/context_tracker: - - - - -# write a wrapped client - -# 1. init with -# argument 1: host + port -# 2. method: -# \ No newline at end of file diff --git a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py index 78c4ceae..803bb765 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, List, Callable, Literal, Type, Union from loguru import logger from pydantic import BaseModel -from ajet.context_tracker.agentscope_tracker.multiagent_tracking import ( +from ajet.context_tracker.multiagent_tracking import ( MultiAgentContextTracker, ) from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker @@ -38,14 +38,15 @@ def __init__( agent_name: str, debug_model: str | None = None, use_debug_model: bool = False, - **kwargs, + llm_inference_fn: Callable | None = None, ): self.debug_model = debug_model self.use_debug_model = use_debug_model + assert llm_inference_fn is not None, "llm_inference_fn must be provided" self.llm_proxy = OpenaiLlmProxyWithTracker( context_tracker=context_tracker, config=config, - **kwargs + llm_inference_fn=llm_inference_fn, ) @property diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py new file mode 100644 index 00000000..bdd5d5b1 --- /dev/null +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -0,0 +1,152 @@ + +import asyncio +import json +import threading +import os +import time +from typing import Optional, List, Dict, Any, Union, TYPE_CHECKING +from vllm.entrypoints.openai.protocol import ChatCompletionRequest, ChatCompletionResponse +from openai.types.chat.chat_completion import ChatCompletion + +import pickle +import websockets +import base64 +import json + +if TYPE_CHECKING: + from ajet.context_tracker.multiagent_tracking import MultiAgentContextTracker + +def generate_auth_token(agent_name, target_tag, episode_uuid): + """ + Generate a Base64-encoded auth_token from the given agent_name, target_tag, and episode_uuid. + + Args: + agent_name (str): The name of the agent. + target_tag (str): The target tag. + episode_uuid (str): The UUID of the episode. + + Returns: + str: The generated auth_token in the format "Bearer ". + """ + # Step 1: Construct the auth_data dictionary + auth_data = { + "agent_name": agent_name, + "target_tag": target_tag, + "episode_uuid": episode_uuid + } + + # Step 2: Convert the dictionary to a JSON string + json_string = json.dumps(auth_data) + + # Step 3: Encode the JSON string into Base64 + base64_encoded = base64.b64encode(json_string.encode('utf-8')).decode('utf-8') + + # Step 4: Prepend "Bearer " to the Base64-encoded string + auth_token = f"Bearer {base64_encoded}" + + return auth_token + + +class InterchangeClient: + + def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker", llm_inference_fn, config): + self.episode_uuid = episode_uuid + self.context_tracker = context_tracker + self.llm_inference_fn = llm_inference_fn + self.config = config + self._should_terminate = False + self.begin_service() + + + async def llm_infer( + self, + req: ChatCompletionRequest, + timeline_uuid: str, + agent_name: str, + target_tag: str, + episode_uuid: str, + ) -> ChatCompletion: + from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker + + req_as_dict = req.model_dump() + + self.llm_proxy_with_tracker = OpenaiLlmProxyWithTracker( + context_tracker=self.context_tracker, + config=self.config, + llm_inference_fn=self.llm_inference_fn, + ) + + # infer + process with context tracker + response = await self.llm_proxy_with_tracker( + messages=req_as_dict["messages"], + tools=req_as_dict["tools"], + tool_choice="auto", + ) + + assert isinstance(response, ChatCompletion) + return response + + + @property + def should_terminate(self) -> bool: + return self._should_terminate + + def begin_service(self): + """ + Starts the websocket service loop. + """ + t = threading.Thread(target=lambda: asyncio.run(self._service_loop())) + t.start() + + async def _service_loop(self): + """ + In fact this is not a service, + it is a client that pretends to be a service, by interacting with a local websocket interchange server. + + This design is for efficiency + """ + + from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import TypeCompletionRequest + + port = os.getenv("AJET_DAT_INTERCHANGE_PORT") + assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" + uri = f"ws://127.0.0.1:{port}/hook/context_tracker_client_listen" + + async with websockets.connect(uri) as websocket: + try: + # Send initialization parameters + # Sending as a list [agent_name, target_tag, episode_uuid] to match "input (a,b,c)" structure + await websocket.send(f"episode_uuid:{self.episode_uuid}") + + while not self.should_terminate: + + try: + # wait message from ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py + parsed_msg: TypeCompletionRequest = pickle.loads( + await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) + ) + + response = await self.llm_infer( + req=parsed_msg.completion_request, + timeline_uuid=parsed_msg.timeline_uuid, + agent_name=parsed_msg.agent_name, + target_tag=parsed_msg.target_tag, + episode_uuid=parsed_msg.episode_uuid, + ) + await websocket.send(pickle.dumps(response)) + + except asyncio.TimeoutError: + # 0.25s timeout, loop back to check should_terminate + continue + except websockets.exceptions.ConnectionClosed: + print("Websocket connection closed by server") + return # Exit inner loop to reconnect or finish + + await websocket.send(pickle.dumps("terminate")) + + except (OSError, IOError) as e: + print(f"Websocket connection error: {e}") + pass + + + diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py new file mode 100644 index 00000000..a9bca388 --- /dev/null +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -0,0 +1,318 @@ +""" +A shadow FastAPI server for serving as interchange endpoint between agents and model handlers. + +- This functionality is experimental. +""" + +import asyncio +import threading +import uuid +from collections import defaultdict +from typing import Dict, List +import base64 +import json +import os +import pickle + +from pydantic import BaseModel +from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Header, HTTPException, Request +import uvicorn + +from vllm.entrypoints.openai.protocol import ChatCompletionRequest +from openai.types.chat.chat_completion import ChatCompletion + + +# Global variables for tracking requests and responses +class TypeCompletionRequest(BaseModel): + completion_request: ChatCompletionRequest + agent_name: str + target_tag: str + episode_uuid: str + timeline_uuid: str = "" # to be filled when sending to client + + +ajet_remote_handler_received: Dict[str, Dict[str, TypeCompletionRequest]] = defaultdict(dict) +ajet_remote_handler_in_progress: Dict[str, Dict[str, TypeCompletionRequest]] = defaultdict(dict) +ajet_remote_handler_completed: Dict[str, Dict[str, ChatCompletion]] = defaultdict(dict) +ajet_remote_handler_discarded: Dict[str, Dict[str, bool]] = defaultdict(dict) +active_websockets = {} + +# Create FastAPI app +app = FastAPI(title="AJet Interchange Endpoint") + + +@app.get("/health") +async def health_check(): + """Health check endpoint.""" + return {"status": "ok"} + + +@app.websocket("/hook/context_tracker_client_listen") +async def context_tracker_client_listen(websocket: WebSocket): + """ + WebSocket endpoint for clients to listen for completion requests. + Clients send (agent_name, target_tag, episode_uuid) and receive requests to process. + """ + await websocket.accept() + + key = "" + try: + # Receive initial connection data ( + # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py + # await websocket.send(f"episode_uuid:{self.episode_uuid}")) + episode_uuid_str = pickle.loads(await websocket.receive_bytes()) + assert episode_uuid_str.startswith("episode_uuid:") + episode_uuid = episode_uuid_str.split("episode_uuid:")[-1] + + if not all([episode_uuid]): + await websocket.send_json({"error": "Missing required fields"}) + await websocket.close() + return + + key = f"episode_uuid:{episode_uuid}" + active_websockets[key] = websocket + + # Send acknowledgment (still JSON for compatibility or Pickle?) + # Let's use pickle for consistency on this socket + await websocket.send_bytes(pickle.dumps({"status": "connected", "key": key})) + + # Monitor for new requests + while True: + try: + # Check for new requests in ajet_remote_handler_received + if (key in ajet_remote_handler_received) and len(ajet_remote_handler_received[key]) > 0: + + timeline_uuid = list(ajet_remote_handler_received[key].keys())[0] + + # Get the next request + new_req: TypeCompletionRequest = ajet_remote_handler_received[key].pop(timeline_uuid) + + assert timeline_uuid == new_req.timeline_uuid + + # Move to in_progress + ajet_remote_handler_in_progress[key][timeline_uuid] = new_req + + # Send request to client + episode_uuid = new_req.episode_uuid + + # will be received by: + # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py + # await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) + await websocket.send_bytes(pickle.dumps(new_req)) + + # Wait for client response: + # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py + # await websocket.send(pickle.dumps(response)) + response_data = pickle.loads(await websocket.receive_bytes()) + + if not isinstance(response_data, ChatCompletion): + assert response_data == "terminate", "Invalid terminate signal from client" + break + + # Process the response + openai_response: ChatCompletion = response_data + + # Remove from in_progress + if timeline_uuid in ajet_remote_handler_in_progress[key]: + ajet_remote_handler_in_progress[key].pop(timeline_uuid) + + # Add to completed if not discarded + if (key not in ajet_remote_handler_discarded) or (timeline_uuid not in ajet_remote_handler_discarded[key]): + # openai_response should already be a ChatCompletion object if client sent pickle + ajet_remote_handler_completed[key][timeline_uuid] = openai_response + + else: + # nothing to do yet, sleep a bit + await asyncio.sleep(0.25) + + # try: + # # let's see if the client is still there + # response_data = pickle.loads(await websocket.receive_bytes()) + + # # Check if it's a terminate signal + # if not isinstance(response_data, ChatCompletion): + # assert response_data == "terminate", "Invalid terminate signal from client" + # break + + # except asyncio.TimeoutError: + # pass # No message, continue monitoring + + except WebSocketDisconnect: + break + except Exception as e: + print(f"Error in websocket handler: {e}") + break + + finally: + + if key: + # Clean up any in-progress requests for this key + for container in [ + ajet_remote_handler_received, + ajet_remote_handler_in_progress, + ajet_remote_handler_completed, + ]: + if key in container: + container.pop(key) + + if key in ajet_remote_handler_discarded: + ajet_remote_handler_discarded.pop(key) + + if key in active_websockets: + websocket = active_websockets.pop(key) + try: + websocket.close() + except: + pass + + +@app.post("/v1/chat/completions") +async def chat_completions(request: Request, authorization: str = Header(None)): + """ + OpenAI-compatible chat completions endpoint. + Receives ChatCompletionRequest and returns ChatCompletion. + """ + # Parse authorization header (base64 encoded JSON) + if not authorization: + raise HTTPException(status_code=401, detail="Missing authorization header") + + try: + # Remove "Bearer " prefix if present + auth_token = authorization.replace("Bearer ", "").replace("bearer ", "") + decoded = base64.b64decode(auth_token).decode('utf-8') + auth_data = json.loads(decoded) + + agent_name = auth_data.get("agent_name") + target_tag = auth_data.get("target_tag") + episode_uuid = auth_data.get("episode_uuid") + + if not all([agent_name, target_tag, episode_uuid]): + raise HTTPException(status_code=401, detail="Invalid authorization data") + except Exception as e: + raise HTTPException(status_code=401, detail=f"Invalid authorization header: {str(e)}") + + # Build key + key = f"episode_uuid:{episode_uuid}" + + # Parse request body + body = await request.json() + new_req = ChatCompletionRequest(**body) + # Create timeline UUID + timeline_uuid = uuid.uuid4().hex + # Add to received queue + ajet_remote_handler_received[key][timeline_uuid] = TypeCompletionRequest( + completion_request = new_req, + agent_name = agent_name, + target_tag = target_tag, + episode_uuid = episode_uuid, + timeline_uuid = timeline_uuid, + ) + + # Wait for response (with periodic checks for client disconnect) + max_wait_time = 1800 # 30 minutes timeout + check_interval = 0.25 # Check every 250ms + elapsed_time = 0 + + try: + while elapsed_time < max_wait_time: + # Check if response is available + if (key in ajet_remote_handler_completed) \ + and timeline_uuid in ajet_remote_handler_completed[key]: + openai_response = ajet_remote_handler_completed[key][timeline_uuid] + return openai_response + await asyncio.sleep(check_interval) + elapsed_time += check_interval + + # Timeout reached + raise HTTPException(status_code=504, detail="Request timeout") + except asyncio.CancelledError: + # Client disconnected + if key not in ajet_remote_handler_discarded: + ajet_remote_handler_discarded[key] = {} + ajet_remote_handler_discarded[key][timeline_uuid] = True + raise HTTPException(status_code=499, detail="Client disconnected") + + +@app.post("/reset") +async def reset(): + """ + Reset endpoint to clear all state and disconnect all websockets. + """ + # Disconnect all websockets + for key, ws in list(active_websockets.items()): + try: + await ws.close() + except: + pass + + active_websockets.clear() + + # Clear all global state + ajet_remote_handler_received.clear() + ajet_remote_handler_in_progress.clear() + ajet_remote_handler_completed.clear() + ajet_remote_handler_discarded.clear() + + return {"status": "reset_complete"} + + +class InterchangeEndpointServer: + """ + Class to manage the FastAPI interchange endpoint server. + """ + + def __init__(self): + self.server_thread = None + self.server = None + + def start(self) -> int: + """ + Start the FastAPI server on a free port. + + Returns: + int: The port number the server is running on. + """ + # Find a free port + self.port = int(os.environ.get("AJET_DAT_INTERCHANGE_PORT", -1)) + + # Create server thread + def run_server(): + config = uvicorn.Config( + app=app, + host="0.0.0.0", + port=self.port, + log_level="info" + ) + server = uvicorn.Server(config) + asyncio.run(server.serve()) + + # Start server in a new thread + self.server_thread = threading.Thread(target=run_server, daemon=True) + self.server_thread.start() + + # Give the server a moment to start + import time + time.sleep(1) + + return self.port + + def stop(self): + """ + Stop the server (note: due to uvicorn limitations, this may not fully stop the thread). + """ + # This is a simple implementation - in production you'd want more robust shutdown + pass + + +# Convenience function for quick server startup +def start_interchange_server() -> int: + """ + Start the interchange endpoint server and return the port number. + + Returns: + int: The port number the server is running on. + """ + server = InterchangeEndpointServer() + port = server.start() + return port + diff --git a/ajet/utils/core_env_vars.py b/ajet/utils/core_env_vars.py index 9cd9c809..6c96358e 100644 --- a/ajet/utils/core_env_vars.py +++ b/ajet/utils/core_env_vars.py @@ -3,6 +3,16 @@ from beast_logger import print_dict from dotenv import load_dotenv +import socket + + +def find_free_port() -> int: + """Find a free port on the system.""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(('', 0)) + s.listen(1) + port = s.getsockname()[1] + return port def get_runtime_env(is_trinity: bool = False) -> dict: @@ -20,6 +30,7 @@ def get_runtime_env(is_trinity: bool = False) -> dict: # "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), "AJET_CONFIG_REDIRECT": os.getenv("AJET_CONFIG_REDIRECT", ""), + "AJET_DAT_INTERCHANGE_PORT": str(find_free_port()) } } diff --git a/ajet/workflow.py b/ajet/workflow.py index 7d3027f0..1f8ca4bf 100644 --- a/ajet/workflow.py +++ b/ajet/workflow.py @@ -64,12 +64,10 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl [ ] from agentscope.tool import Toolkit, execute_python_code [ ] self.toolkit = Toolkit() [ ] self.toolkit.register_tool_function(execute_python_code) - [ ] model_tuner = tuner.as_agentscope_model() [ ] self.agent = ReActAgent( [ ] name="math_react_agent", [ ] sys_prompt=system_prompt, - [-] model=DashScopeChatModel(model='qwen-max'), - [+] model=model_tuner, + [+-] model=tuner.as_agentscope_model(), [ ] formatter=DashScopeChatFormatter(), [ ] toolkit=self.toolkit, [ ] memory=InMemoryMemory(), diff --git a/tests/bench/README.md b/tests/bench/README.md index 76333f65..b8f0a096 100644 --- a/tests/bench/README.md +++ b/tests/bench/README.md @@ -19,11 +19,8 @@ python -m pytest -s tests/bench/benchmark_frozenlake/execute_benchmark_frozenlak python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py +python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py::TestBenchmarkCountdown::test_01_begin_verl python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_01_begin_verl -python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_02_begin_trinity - python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py::TestBenchmarkAppworld::test_01_begin_verl - python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py::TestBenchmarkLearnToAsk::test_02_begin_verl -python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py::TestBenchmarkLearnToAsk::test_01_begin_trinity ``` diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py index a75b2fd9..2c800829 100644 --- a/tutorial/example_appworld/appworld.py +++ b/tutorial/example_appworld/appworld.py @@ -27,11 +27,10 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl ) ) - model_tuner = tuner.as_agentscope_model() agent = ReActAgent( name="Qwen", sys_prompt=first_msg["content"], - model=model_tuner, + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), toolkit=None, @@ -40,7 +39,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl agent.set_console_output_enabled(False) env = workflow_task.gym_env step = 0 - for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): + for step in range(tuner.config.ajet.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol diff --git a/tutorial/example_learn2ask/learn2ask.py b/tutorial/example_learn2ask/learn2ask.py index f1001a50..e8e66bd1 100644 --- a/tutorial/example_learn2ask/learn2ask.py +++ b/tutorial/example_learn2ask/learn2ask.py @@ -171,8 +171,6 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl from agentscope.formatter import DashScopeChatFormatter from agentscope.memory import InMemoryMemory - model_tuner = tuner.as_agentscope_model() - messages = workflow_task.task.init_messages assert isinstance(messages, list) truth_action = workflow_task.task.metadata["decision_truth"] or "continue" @@ -181,7 +179,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), toolkit=None, memory=InMemoryMemory(), diff --git a/tutorial/example_math_agent/math_agent_oai_sdk.py b/tutorial/example_math_agent/math_agent_oai_sdk.py index 5b9b69c2..8304f14d 100644 --- a/tutorial/example_math_agent/math_agent_oai_sdk.py +++ b/tutorial/example_math_agent/math_agent_oai_sdk.py @@ -22,9 +22,9 @@ class ExampleMathLearn_Simple_NoToolCall(Workflow): You should return your final answer within \\boxed{{}}. """) - async def execute(self, workflow_task: WorkflowTask, model_tuner: AjetTuner) -> WorkflowOutput: # type: ignore + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore query = workflow_task.task.main_query - client = model_tuner.as_raw_openai_sdk_client() + client = tuner.as_raw_openai_sdk_client() messages = [ { @@ -43,12 +43,6 @@ async def execute(self, workflow_task: WorkflowTask, model_tuner: AjetTuner) -> - - - - - - # ------------------------------------------------------ # Tool use version # ------------------------------------------------------ @@ -87,11 +81,11 @@ class ExampleMathLearn(Workflow): }, ] - async def execute(self, workflow_task: WorkflowTask, model_tuner: AjetTuner) -> WorkflowOutput: # type: ignore + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore query = workflow_task.task.main_query - client = model_tuner.as_raw_openai_sdk_client() + client = tuner.as_raw_openai_sdk_client() # call 1: get response with tool call messages = [ diff --git a/tutorial/example_math_agent/math_agent_raw_http.py b/tutorial/example_math_agent/math_agent_raw_http.py new file mode 100644 index 00000000..88c54d48 --- /dev/null +++ b/tutorial/example_math_agent/math_agent_raw_http.py @@ -0,0 +1,64 @@ +from loguru import logger +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask +from openai.types.chat.chat_completion import ChatCompletion +from openai.types.chat import ChatCompletionMessageToolCall +from textwrap import dedent + +import json +import asyncio +import requests + + +# ------------------------------------------------------ +# Simple version - no tool call +# ------------------------------------------------------ + + +class ExampleMathLearn_Simple(Workflow): + + name: str = "math_agent_workflow" + system_prompt: str = dedent(""" + You are an agent specialized in solving math problems. + Please solve the math problem given to you. + You can write and execute Python code to perform calculation or verify your answer. + You should return your final answer within \\boxed{{}}. + """) + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore + # tuner to api key + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key + + # take out query + query = workflow_task.task.main_query + + messages = [ + { + "role": "system", + "content": self.system_prompt + }, + { + "role": "user", + "content": query + } + ] + + # use raw http requests (non-streaming) to get response + response = requests.post( + f"{base_url}/chat/completions", + json={ + "model": "fill_whatever_model", # Of course, this `model` field will be ignored. + "messages": messages, + }, + headers={ + "Authorization": f"Bearer {api_key}" + } + ) + final_answer = response.json()['choices'][0]['message']['content'] + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + + + + + From f74d1ddccc1fe211937cc9c0607416dc205dfd62 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 8 Jan 2026 20:40:54 +0800 Subject: [PATCH 391/462] to fully async --- .../experimental/as_oai_model_client.py | 2 + .../experimental/as_oai_model_server.py | 151 +++++++++--------- 2 files changed, 78 insertions(+), 75 deletions(-) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index bdd5d5b1..7054dd4d 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -83,6 +83,8 @@ async def llm_infer( tool_choice="auto", ) + # this is an important id assignment + response.id = timeline_uuid assert isinstance(response, ChatCompletion) return response diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index a9bca388..c88e0a48 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -47,6 +47,79 @@ async def health_check(): return {"status": "ok"} + +async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, stop_event: asyncio.Event): + # Monitor for new requests + try: + while not stop_event.is_set(): + # Check for new requests in ajet_remote_handler_received + if (key in ajet_remote_handler_received) and len(ajet_remote_handler_received[key]) > 0: + + timeline_uuid = list(ajet_remote_handler_received[key].keys())[0] + + # Get the next request + new_req: TypeCompletionRequest = ajet_remote_handler_received[key].pop(timeline_uuid) + + assert timeline_uuid == new_req.timeline_uuid + + # Move to in_progress + ajet_remote_handler_in_progress[key][timeline_uuid] = new_req + + # will be received by: + # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py + # await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) + await websocket.send_bytes(pickle.dumps(new_req)) + + except WebSocketDisconnect: + stop_event.set() + return + + except Exception as e: + stop_event.set() + print(f"Error in websocket handler: {e}") + return + + +async def coro_task_2_lookup_dict_received__receive_loop(key, websocket: WebSocket, stop_event: asyncio.Event): + try: + while not stop_event.is_set(): + # Wait for client response: + # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py + # await websocket.send(pickle.dumps(response)) + response_data = pickle.loads(await websocket.receive_bytes()) + + if not isinstance(response_data, ChatCompletion): + stop_event.set() + assert response_data == "terminate", "Invalid terminate signal from client" + await websocket.close() + return + + # Process the response + openai_response: ChatCompletion = response_data + + # see `ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py::response.id = timeline_uuid` + timeline_uuid = openai_response.id + + # Remove from in_progress + if timeline_uuid in ajet_remote_handler_in_progress[key]: + ajet_remote_handler_in_progress[key].pop(timeline_uuid) + + # Add to completed if not discarded + if (key not in ajet_remote_handler_discarded) or (timeline_uuid not in ajet_remote_handler_discarded[key]): + # openai_response should already be a ChatCompletion object if client sent pickle + ajet_remote_handler_completed[key][timeline_uuid] = openai_response + + except WebSocketDisconnect: + stop_event.set() + return + + except Exception as e: + stop_event.set() + print(f"Error in websocket handler: {e}") + return + + + @app.websocket("/hook/context_tracker_client_listen") async def context_tracker_client_listen(websocket: WebSocket): """ @@ -72,76 +145,9 @@ async def context_tracker_client_listen(websocket: WebSocket): key = f"episode_uuid:{episode_uuid}" active_websockets[key] = websocket - # Send acknowledgment (still JSON for compatibility or Pickle?) - # Let's use pickle for consistency on this socket - await websocket.send_bytes(pickle.dumps({"status": "connected", "key": key})) - - # Monitor for new requests - while True: - try: - # Check for new requests in ajet_remote_handler_received - if (key in ajet_remote_handler_received) and len(ajet_remote_handler_received[key]) > 0: - - timeline_uuid = list(ajet_remote_handler_received[key].keys())[0] - - # Get the next request - new_req: TypeCompletionRequest = ajet_remote_handler_received[key].pop(timeline_uuid) - - assert timeline_uuid == new_req.timeline_uuid - - # Move to in_progress - ajet_remote_handler_in_progress[key][timeline_uuid] = new_req - - # Send request to client - episode_uuid = new_req.episode_uuid - - # will be received by: - # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py - # await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) - await websocket.send_bytes(pickle.dumps(new_req)) - - # Wait for client response: - # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py - # await websocket.send(pickle.dumps(response)) - response_data = pickle.loads(await websocket.receive_bytes()) - - if not isinstance(response_data, ChatCompletion): - assert response_data == "terminate", "Invalid terminate signal from client" - break - - # Process the response - openai_response: ChatCompletion = response_data - - # Remove from in_progress - if timeline_uuid in ajet_remote_handler_in_progress[key]: - ajet_remote_handler_in_progress[key].pop(timeline_uuid) - - # Add to completed if not discarded - if (key not in ajet_remote_handler_discarded) or (timeline_uuid not in ajet_remote_handler_discarded[key]): - # openai_response should already be a ChatCompletion object if client sent pickle - ajet_remote_handler_completed[key][timeline_uuid] = openai_response - - else: - # nothing to do yet, sleep a bit - await asyncio.sleep(0.25) - - # try: - # # let's see if the client is still there - # response_data = pickle.loads(await websocket.receive_bytes()) - - # # Check if it's a terminate signal - # if not isinstance(response_data, ChatCompletion): - # assert response_data == "terminate", "Invalid terminate signal from client" - # break - - # except asyncio.TimeoutError: - # pass # No message, continue monitoring - - except WebSocketDisconnect: - break - except Exception as e: - print(f"Error in websocket handler: {e}") - break + stop_event = asyncio.Event() + asyncio.create_task(coro_task_1_lookup_dict_received__send_loop(key, websocket, stop_event)) + asyncio.create_task(coro_task_2_lookup_dict_received__receive_loop(key, websocket, stop_event)) finally: @@ -289,11 +295,6 @@ def run_server(): # Start server in a new thread self.server_thread = threading.Thread(target=run_server, daemon=True) self.server_thread.start() - - # Give the server a moment to start - import time - time.sleep(1) - return self.port def stop(self): From 686610936e44a85af28f2ce3acc73393b8c859dc Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 9 Jan 2026 11:53:39 +0800 Subject: [PATCH 392/462] imp raw http training --- ajet/backbone/main_vllm.py | 19 ++- ajet/backbone/trainer_verl.py | 5 + ajet/context_tracker/multiagent_tracking.py | 38 ++++-- ajet/schema/logprob.py | 12 +- ajet/task_rollout/async_llm_bridge.py | 8 +- .../weight_tuner/as_oai_baseurl_apikey.py | 16 ++- .../experimental/as_oai_model_client.py | 6 +- .../experimental/as_oai_model_server.py | 118 ++++++++++++++---- ajet/utils/config_utils.py | 2 +- ajet/utils/launch_utils.py | 3 +- .../benchmark_math_raw_http.yaml | 74 +++++++++++ .../example_math_agent/math_agent_raw_http.py | 2 +- 12 files changed, 248 insertions(+), 55 deletions(-) create mode 100644 tests/bench/benchmark_math/benchmark_math_raw_http.yaml diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index 2a290b20..c37f5384 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -9,6 +9,7 @@ from ajet.task_rollout.native_parallel_worker import VerlRolloutManager from ajet.utils.launch_utils import set_loguru_default_color from ajet.schema.logprob import TokenAndProb +from ajet.utils.core_env_vars import get_runtime_env set_loguru_default_color() @@ -16,12 +17,13 @@ class TokenAndProbVllmDebug(TokenAndProb): def __init__(self, t): # ChatCompletionTokenLogprob(token='token_id:73594', bytes=[96, 96, 96], logprob=-1.9073468138230965e-06, top_logprobs=[]) - self.token_id = int(t.token.split("token_id:")[-1]) - self.logprob = t.logprob + token_id = int(t.token.split("token_id:")[-1]) + logprob = t.logprob try: - self.decoded_string = bytes(t.bytes).decode("utf-8") + decoded_string = bytes(t.bytes).decode("utf-8") except Exception: - self.decoded_string = "" + str(t.bytes) + decoded_string = "" + str(t.bytes) + super().__init__(token_id=token_id, logprob=logprob, decoded_string=decoded_string) class ChatCompletionScheduler: @@ -87,6 +89,8 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ def run(config): + from ajet.task_reader import RouterTaskReader + # --------- fast adjustment for debugging --------- warm_up_process(config) max_parallel = config.ajet.debug.debug_max_parallel @@ -106,7 +110,6 @@ def run(config): tokenizer=async_rollout_manager.tokenizer, ) - from ajet.task_reader import RouterTaskReader task_reader = RouterTaskReader( config.ajet.task_reader.type, @@ -132,6 +135,12 @@ def main(config): OmegaConf.resolve(config) print("*" * 20) + runtime_env = get_runtime_env() + os.environ.update(runtime_env["env_vars"]) + if config.ajet.enable_experimental_reverse_proxy: + from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server + start_interchange_server() + def companion_launch(): import torch diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index fcc532de..4978a57d 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -832,6 +832,11 @@ def fit(self): # noqa: C901 progress_bar.update(1) self.global_steps += 1 + # when enabled oai request interchange, we need to clear the cache from time to time + if self.config.ajet.enable_experimental_reverse_proxy: + from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import ensure_dat_interchange_server_cache_clear + ensure_dat_interchange_server_cache_clear() + if is_last_step: pprint(f"Final validation metrics: {last_val_metrics}") progress_bar.close() diff --git a/ajet/context_tracker/multiagent_tracking.py b/ajet/context_tracker/multiagent_tracking.py index 2b73e151..fce83a91 100644 --- a/ajet/context_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/multiagent_tracking.py @@ -64,17 +64,33 @@ def __init__( self.episode_uuid = episode_uuid - def step_prepare(self, messages: List[dict], tools: List = [], timeline_uuid: str = ""): + def preprocess_tools_field(self, tools: List[dict] = [], disable_toolcalls: bool = False): + if disable_toolcalls: + tools = [] + else: + if tools is not None: + # rerank tool parameters to improve compatibility + for i in range(len(tools)): + tools[i]["function"]["parameters"] = tools[i]["function"].pop("parameters") + return tools + + + def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_toolcalls: bool = False) -> List[ExtendedMessage]: + """Spawn a timeline from messages. + + Args: + messages: List of message dictionaries + tools: List of tool dictionaries + disable_toolcalls: Whether to disable tool calls + + Returns: + List of ExtendedMessage objects representing the timeline + """ timeline = [] + consider_roles = ["user", "assistant", "system", "tool"] - disable_toolcalls = self.config.ajet.rollout.force_disable_toolcalls if disable_toolcalls: consider_roles.remove("tool") - tools = [] - else: - # rerank tool parameters to improve compatibility - for i in range(len(tools)): - tools[i]["function"]["parameters"] = tools[i]["function"].pop("parameters") for i, msg in enumerate(messages): if (disable_toolcalls) and (not isinstance(msg["content"], str)): @@ -132,6 +148,14 @@ def step_prepare(self, messages: List[dict], tools: List = [], timeline_uuid: st ) ] + return timeline + + + def step_prepare(self, messages: List[dict], tools: List = [], timeline_uuid: str = ""): + disable_toolcalls = self.config.ajet.rollout.force_disable_toolcalls + tools = self.preprocess_tools_field(tools, disable_toolcalls=disable_toolcalls) + timeline = self.step_spawn_timeline(messages, tools, disable_toolcalls) + # check token overflow converted_message = self.to_role_content(timeline) timeline = ExtendedMessage.check_and_merge_chained_tool_response( diff --git a/ajet/schema/logprob.py b/ajet/schema/logprob.py index 4552df23..42d2c572 100644 --- a/ajet/schema/logprob.py +++ b/ajet/schema/logprob.py @@ -5,8 +5,10 @@ # from verl import DataProto -class TokenAndProb: - def __init__(self, token_id, logprob, decoded_string): - self.token_id = token_id - self.logprob = logprob - self.decoded_string = decoded_string +from pydantic import BaseModel + + +class TokenAndProb(BaseModel): + token_id: int + logprob: float + decoded_string: str \ No newline at end of file diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index ad942fa4..44019aa1 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -5,8 +5,8 @@ import uuid from typing import Any, Callable, Dict, List, Literal, Type, Union -from agentscope._utils._common import _json_loads_with_repair -from agentscope.message import TextBlock, ToolUseBlock + + from loguru import logger from omegaconf import DictConfig from pydantic import BaseModel @@ -33,7 +33,7 @@ class AjetStandardLlmBridgeRequest(BaseModel): messages: List[Dict[str, str]] custom_sampling_params: dict = {} - tools=[] + tools: List = [] request_id: str = "" class AjetStandardLlmBridgeResponse(BaseModel): @@ -41,7 +41,7 @@ class AjetStandardLlmBridgeResponse(BaseModel): request_id: str = "" content: str = "" tool_calls: List[Dict] = [] - tokens: List[TokenAndProb] + tokens: List[TokenAndProb] = [] # ------------------------------------------------------------------------------------- diff --git a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py index ad18102b..6da909dd 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py @@ -1,3 +1,4 @@ +import os import asyncio from typing import TYPE_CHECKING, Any, List, Callable, Literal, Type, Union from loguru import logger @@ -45,10 +46,19 @@ def __init__( episode_uuid: str, **kwargs, ): - self.base_url = "http://localhost:27788/v1" - self.api_key = generate_auth_token( + port = os.getenv("AJET_DAT_INTERCHANGE_PORT") + assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" + base_url = f"http://localhost:{port}/v1" + api_key = generate_auth_token( agent_name=agent_name, target_tag=target_tag, episode_uuid=episode_uuid, ) - self.model = "reserved_field" + model = "reserved_field" + + # Properly initialize the Pydantic BaseModel + super().__init__( + base_url=base_url, + api_key=api_key, + model=model, + ) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index 7054dd4d..b7d41533 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -108,7 +108,7 @@ async def _service_loop(self): This design is for efficiency """ - from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import TypeCompletionRequest + from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import InterchangeCompletionRequest port = os.getenv("AJET_DAT_INTERCHANGE_PORT") assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" @@ -118,13 +118,13 @@ async def _service_loop(self): try: # Send initialization parameters # Sending as a list [agent_name, target_tag, episode_uuid] to match "input (a,b,c)" structure - await websocket.send(f"episode_uuid:{self.episode_uuid}") + await websocket.send(pickle.dumps(f"episode_uuid:{self.episode_uuid}")) while not self.should_terminate: try: # wait message from ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py - parsed_msg: TypeCompletionRequest = pickle.loads( + parsed_msg: InterchangeCompletionRequest = pickle.loads( await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) ) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index c88e0a48..ce372a89 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -13,6 +13,8 @@ import json import os import pickle +from pprint import pformat +from loguru import logger from pydantic import BaseModel from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Header, HTTPException, Request @@ -23,16 +25,16 @@ # Global variables for tracking requests and responses -class TypeCompletionRequest(BaseModel): +class InterchangeCompletionRequest(BaseModel): completion_request: ChatCompletionRequest agent_name: str target_tag: str episode_uuid: str - timeline_uuid: str = "" # to be filled when sending to client + timeline_uuid: str -ajet_remote_handler_received: Dict[str, Dict[str, TypeCompletionRequest]] = defaultdict(dict) -ajet_remote_handler_in_progress: Dict[str, Dict[str, TypeCompletionRequest]] = defaultdict(dict) +ajet_remote_handler_received: Dict[str, Dict[str, InterchangeCompletionRequest]] = defaultdict(dict) +ajet_remote_handler_in_progress: Dict[str, Dict[str, InterchangeCompletionRequest]] = defaultdict(dict) ajet_remote_handler_completed: Dict[str, Dict[str, ChatCompletion]] = defaultdict(dict) ajet_remote_handler_discarded: Dict[str, Dict[str, bool]] = defaultdict(dict) active_websockets = {} @@ -54,11 +56,12 @@ async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, while not stop_event.is_set(): # Check for new requests in ajet_remote_handler_received if (key in ajet_remote_handler_received) and len(ajet_remote_handler_received[key]) > 0: + logger.warning(f"Sending new request to client for key: {key}") timeline_uuid = list(ajet_remote_handler_received[key].keys())[0] # Get the next request - new_req: TypeCompletionRequest = ajet_remote_handler_received[key].pop(timeline_uuid) + new_req: InterchangeCompletionRequest = ajet_remote_handler_received[key].pop(timeline_uuid) assert timeline_uuid == new_req.timeline_uuid @@ -69,14 +72,20 @@ async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py # await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) await websocket.send_bytes(pickle.dumps(new_req)) + else: + await asyncio.sleep(0.25) except WebSocketDisconnect: stop_event.set() + try: await websocket.close() + except: pass return except Exception as e: stop_event.set() - print(f"Error in websocket handler: {e}") + try: await websocket.close() + except: pass + logger.exception(f"Error in websocket handler: {e}") return @@ -86,7 +95,9 @@ async def coro_task_2_lookup_dict_received__receive_loop(key, websocket: WebSock # Wait for client response: # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py # await websocket.send(pickle.dumps(response)) + logger.warning(f"Waiting for response from client for key: {key}") response_data = pickle.loads(await websocket.receive_bytes()) + logger.warning(f"Received response from client for key: {key}") if not isinstance(response_data, ChatCompletion): stop_event.set() @@ -111,11 +122,15 @@ async def coro_task_2_lookup_dict_received__receive_loop(key, websocket: WebSock except WebSocketDisconnect: stop_event.set() + try: await websocket.close() + except: pass return except Exception as e: stop_event.set() - print(f"Error in websocket handler: {e}") + try: await websocket.close() + except: pass + logger.exception(f"Error in websocket handler: {e}") return @@ -137,10 +152,7 @@ async def context_tracker_client_listen(websocket: WebSocket): assert episode_uuid_str.startswith("episode_uuid:") episode_uuid = episode_uuid_str.split("episode_uuid:")[-1] - if not all([episode_uuid]): - await websocket.send_json({"error": "Missing required fields"}) - await websocket.close() - return + logger.warning(f"WebSocket client connected for episode_uuid: {episode_uuid}") key = f"episode_uuid:{episode_uuid}" active_websockets[key] = websocket @@ -148,9 +160,13 @@ async def context_tracker_client_listen(websocket: WebSocket): stop_event = asyncio.Event() asyncio.create_task(coro_task_1_lookup_dict_received__send_loop(key, websocket, stop_event)) asyncio.create_task(coro_task_2_lookup_dict_received__receive_loop(key, websocket, stop_event)) + await stop_event.wait() - finally: + except Exception as e: + logger.exception(f"Error in websocket connection setup: {e}") + finally: + logger.warning(f"WebSocket client disconnected for key: {key}") if key: # Clean up any in-progress requests for this key for container in [ @@ -166,10 +182,8 @@ async def context_tracker_client_listen(websocket: WebSocket): if key in active_websockets: websocket = active_websockets.pop(key) - try: - websocket.close() - except: - pass + try: await websocket.close() + except: pass @app.post("/v1/chat/completions") @@ -206,7 +220,8 @@ async def chat_completions(request: Request, authorization: str = Header(None)): # Create timeline UUID timeline_uuid = uuid.uuid4().hex # Add to received queue - ajet_remote_handler_received[key][timeline_uuid] = TypeCompletionRequest( + logger.warning(f"Received new chat completion request for agent: {agent_name}, target_tag: {target_tag}, episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid}") + ajet_remote_handler_received[key][timeline_uuid] = InterchangeCompletionRequest( completion_request = new_req, agent_name = agent_name, target_tag = target_tag, @@ -244,6 +259,7 @@ async def reset(): """ Reset endpoint to clear all state and disconnect all websockets. """ + logger.warning("Resetting interchange endpoint server state.") # Disconnect all websockets for key, ws in list(active_websockets.items()): try: @@ -262,6 +278,51 @@ async def reset(): return {"status": "reset_complete"} +async def monitor_debug_state(): + """ + Background task to write debug state to ./interchange_debug.txt every 1 second. + """ + while True: + try: + debug_info = { + 'ajet_remote_handler_received': dict(ajet_remote_handler_received), + 'ajet_remote_handler_in_progress': dict(ajet_remote_handler_in_progress), + 'ajet_remote_handler_completed': dict(ajet_remote_handler_completed), + 'ajet_remote_handler_discarded': dict(ajet_remote_handler_discarded), + 'active_websockets': list(active_websockets.keys()) + } + + with open('./interchange_debug.txt', 'w') as f: + f.write(pformat(debug_info, width=120, indent=2)) + f.write('\n') + + await asyncio.sleep(1) + except Exception as e: + logger.error(f"Error in monitor_debug_state: {e}") + await asyncio.sleep(1) + + +def ensure_dat_interchange_server_cache_clear(): + """ + send http request to clear the interchange server state. + """ + import httpx + + port = os.getenv("AJET_DAT_INTERCHANGE_PORT") + assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" + url = f"http://localhost:{port}/reset" + try: + response = httpx.post(url) + response.raise_for_status() + return response.json() + except httpx.RequestError as e: + pass + except httpx.HTTPStatusError as e: + pass + + return + + class InterchangeEndpointServer: """ Class to manage the FastAPI interchange endpoint server. @@ -283,14 +344,21 @@ def start(self) -> int: # Create server thread def run_server(): - config = uvicorn.Config( - app=app, - host="0.0.0.0", - port=self.port, - log_level="info" - ) - server = uvicorn.Server(config) - asyncio.run(server.serve()) + async def serve_with_monitor(): + # Start the monitor task + monitor_task = asyncio.create_task(monitor_debug_state()) + + # Start the server + config = uvicorn.Config( + app=app, + host="0.0.0.0", + port=self.port, + log_level="info" + ) + server = uvicorn.Server(config) + await server.serve() + + asyncio.run(serve_with_monitor()) # Start server in a new thread self.server_thread = threading.Thread(target=run_server, daemon=True) diff --git a/ajet/utils/config_utils.py b/ajet/utils/config_utils.py index 4408555f..e9dd5d3b 100644 --- a/ajet/utils/config_utils.py +++ b/ajet/utils/config_utils.py @@ -136,7 +136,7 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): yaml.dump(to_config, file) # logger.success(f"Saved aligned configuration to {to_config_fp}") - print_dict({"Note": f"Saved aligned configuration to {to_config_fp}"}) + print_dict({"Note": f"Saved aligned configuration to {to_config_fp}"}, header="Final Configuration") def config_safe_guard(config: dict, backbone: str) -> dict: diff --git a/ajet/utils/launch_utils.py b/ajet/utils/launch_utils.py index 892ef726..7cd1a465 100644 --- a/ajet/utils/launch_utils.py +++ b/ajet/utils/launch_utils.py @@ -240,7 +240,8 @@ def execute_training_process( "Running Command": " ".join(cmd), "Experiment Base": exe_exp_base, "YAML Config": exe_yaml_path, - } + }, + header="Final Training Command & Directory", ) verify_python_env(args, exp_config) subprocess.run(cmd, check=True, cwd=os.path.abspath("./"), env=env) diff --git a/tests/bench/benchmark_math/benchmark_math_raw_http.yaml b/tests/bench/benchmark_math/benchmark_math_raw_http.yaml new file mode 100644 index 00000000..8d01ef21 --- /dev/null +++ b/tests/bench/benchmark_math/benchmark_math_raw_http.yaml @@ -0,0 +1,74 @@ +# ------------------ 主要配置 ------------------ +ajet: + project_name: benchmarking + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + huggingface_dat_repo: + dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' + training_split: "train" + validation_split: "test" + + task_judge: + # ✨✨✨✨ 编写并选择评价函数 + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge + + model: + # ✨✨✨✨ 设置待训练的模型 + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct + + rollout: + user_workflow: "tutorial.example_math_agent.math_agent_raw_http->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + temperature: 1.0 + max_env_worker: 64 + max_num_seqs: 256 + num_repeat: 6 + agent_madness_reward: 0.0 + tensor_model_parallel_size: 1 + multi_turn: + max_sample_per_task: 2 + compute_madness_checklist: + - "nonsense" + - "wrong_toolcall" + max_response_length_in_one_turn: 1024 + max_model_len: 10000 + n_vllm_engine: 2 + + data: + train_batch_size: 100 + max_prompt_length: 3000 + max_response_length: 7000 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + trainer_common: + save_freq: 100 + test_freq: 999999 + total_epochs: 100 + logger: swanlab + + + execute_test: True # DO NOT EDIT, THIS IS FOR TEST ROBOT + execute_testing_lambda: "tests/bench/benchmark_math/benchmark_math.py->TestProbe" # + + +trinity: + synchronizer: + sync_offset: 1 + sync_method: nccl + + +# ------------------ 不需要修改 ------------------ +hydra: + searchpath: + - file://ajet/default_config + - file://ajet/default_config/verl # verl only + - file://ajet/default_config/trinity # trinity only + +# ------------------ 不需要修改 ------------------ +defaults: + - verl_default # verl inherit + - trinity_default # trinity inherit + - ajet_default + - _self_ diff --git a/tutorial/example_math_agent/math_agent_raw_http.py b/tutorial/example_math_agent/math_agent_raw_http.py index 88c54d48..e0ed999e 100644 --- a/tutorial/example_math_agent/math_agent_raw_http.py +++ b/tutorial/example_math_agent/math_agent_raw_http.py @@ -14,7 +14,7 @@ # ------------------------------------------------------ -class ExampleMathLearn_Simple(Workflow): +class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" system_prompt: str = dedent(""" From 4a151c49658c3ac3845ddb0440eb1581bc286ce5 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 9 Jan 2026 12:04:11 +0800 Subject: [PATCH 393/462] Enhance interchange server functionality with experiment directory support --- ajet/backbone/main_trinity.py | 16 +++++++++- ajet/backbone/main_verl.py | 2 +- ajet/backbone/main_vllm.py | 3 +- .../experimental/as_oai_model_server.py | 32 +++++++++---------- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/ajet/backbone/main_trinity.py b/ajet/backbone/main_trinity.py index dd93a6db..c0b297d4 100644 --- a/ajet/backbone/main_trinity.py +++ b/ajet/backbone/main_trinity.py @@ -1,15 +1,26 @@ import ray +import os from trinity.cli.launcher import main from trinity.common.config import Config from trinity.explorer.explorer import Explorer from trinity.trainer.trainer import Trainer +from ajet.utils.config_utils import read_ajet_config_with_cache from ajet.utils.core_env_vars import get_runtime_env from ajet.utils.launch_utils import set_loguru_default_color + set_loguru_default_color() +def get_ajet_config_from_trinity_side(): + yaml_path = os.environ.get("AJET_CONFIG_REDIRECT", None) + if yaml_path is None: + raise ValueError("AJET_CONFIG_REDIRECT is not set in environment variables") + ajet_config = read_ajet_config_with_cache(yaml_path) + return ajet_config + + def patch_runtime_env_to_get_actor(): """Patch the classmethod of Explorer and Trainer to pass in the runtime env.""" runtime_env = get_runtime_env(is_trinity=True) @@ -39,7 +50,10 @@ def patched_trainer_get_actor(cls, config: Config): Explorer.get_actor = classmethod(patched_explorer_get_actor) Trainer.get_actor = classmethod(patched_trainer_get_actor) - + ajet_config = get_ajet_config_from_trinity_side() + if ajet_config.ajet.enable_experimental_reverse_proxy: + from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server + start_interchange_server(ajet_config.ajet.experiment_dir) if __name__ == "__main__": diff --git a/ajet/backbone/main_verl.py b/ajet/backbone/main_verl.py index f7a84739..3ac98221 100644 --- a/ajet/backbone/main_verl.py +++ b/ajet/backbone/main_verl.py @@ -249,7 +249,7 @@ def run(self, config): if config.ajet.enable_experimental_reverse_proxy: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server - start_interchange_server() + start_interchange_server(config.ajet.experiment_dir) # Initialize the PPO trainer. trainer = AjetRayPPOTrainer( diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index c37f5384..cbd62150 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -137,9 +137,10 @@ def main(config): runtime_env = get_runtime_env() os.environ.update(runtime_env["env_vars"]) + if config.ajet.enable_experimental_reverse_proxy: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server - start_interchange_server() + start_interchange_server(config.ajet.experiment_dir) def companion_launch(): import torch diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index ce372a89..f268cb18 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -56,7 +56,7 @@ async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, while not stop_event.is_set(): # Check for new requests in ajet_remote_handler_received if (key in ajet_remote_handler_received) and len(ajet_remote_handler_received[key]) > 0: - logger.warning(f"Sending new request to client for key: {key}") + # logger.warning(f"Sending new request to client for key: {key}") timeline_uuid = list(ajet_remote_handler_received[key].keys())[0] @@ -95,9 +95,9 @@ async def coro_task_2_lookup_dict_received__receive_loop(key, websocket: WebSock # Wait for client response: # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py # await websocket.send(pickle.dumps(response)) - logger.warning(f"Waiting for response from client for key: {key}") + # logger.warning(f"Waiting for response from client for key: {key}") response_data = pickle.loads(await websocket.receive_bytes()) - logger.warning(f"Received response from client for key: {key}") + # logger.warning(f"Received response from client for key: {key}") if not isinstance(response_data, ChatCompletion): stop_event.set() @@ -152,7 +152,7 @@ async def context_tracker_client_listen(websocket: WebSocket): assert episode_uuid_str.startswith("episode_uuid:") episode_uuid = episode_uuid_str.split("episode_uuid:")[-1] - logger.warning(f"WebSocket client connected for episode_uuid: {episode_uuid}") + # logger.warning(f"WebSocket client connected for episode_uuid: {episode_uuid}") key = f"episode_uuid:{episode_uuid}" active_websockets[key] = websocket @@ -166,7 +166,7 @@ async def context_tracker_client_listen(websocket: WebSocket): logger.exception(f"Error in websocket connection setup: {e}") finally: - logger.warning(f"WebSocket client disconnected for key: {key}") + # logger.warning(f"WebSocket client disconnected for key: {key}") if key: # Clean up any in-progress requests for this key for container in [ @@ -220,7 +220,7 @@ async def chat_completions(request: Request, authorization: str = Header(None)): # Create timeline UUID timeline_uuid = uuid.uuid4().hex # Add to received queue - logger.warning(f"Received new chat completion request for agent: {agent_name}, target_tag: {target_tag}, episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid}") + # logger.warning(f"Received new chat completion request for agent: {agent_name}, target_tag: {target_tag}, episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid}") ajet_remote_handler_received[key][timeline_uuid] = InterchangeCompletionRequest( completion_request = new_req, agent_name = agent_name, @@ -259,7 +259,7 @@ async def reset(): """ Reset endpoint to clear all state and disconnect all websockets. """ - logger.warning("Resetting interchange endpoint server state.") + # logger.warning("Resetting interchange endpoint server state.") # Disconnect all websockets for key, ws in list(active_websockets.items()): try: @@ -278,7 +278,7 @@ async def reset(): return {"status": "reset_complete"} -async def monitor_debug_state(): +async def monitor_debug_state(experiment_dir): """ Background task to write debug state to ./interchange_debug.txt every 1 second. """ @@ -292,14 +292,14 @@ async def monitor_debug_state(): 'active_websockets': list(active_websockets.keys()) } - with open('./interchange_debug.txt', 'w') as f: + with open(f'{experiment_dir}/interchange_debug.txt', 'w') as f: f.write(pformat(debug_info, width=120, indent=2)) f.write('\n') - await asyncio.sleep(1) + await asyncio.sleep(2) except Exception as e: logger.error(f"Error in monitor_debug_state: {e}") - await asyncio.sleep(1) + await asyncio.sleep(2) def ensure_dat_interchange_server_cache_clear(): @@ -332,7 +332,7 @@ def __init__(self): self.server_thread = None self.server = None - def start(self) -> int: + def start(self, experiment_dir) -> int: """ Start the FastAPI server on a free port. @@ -346,14 +346,14 @@ def start(self) -> int: def run_server(): async def serve_with_monitor(): # Start the monitor task - monitor_task = asyncio.create_task(monitor_debug_state()) + monitor_task = asyncio.create_task(monitor_debug_state(experiment_dir)) # Start the server config = uvicorn.Config( app=app, host="0.0.0.0", port=self.port, - log_level="info" + log_level="error" ) server = uvicorn.Server(config) await server.serve() @@ -374,7 +374,7 @@ def stop(self): # Convenience function for quick server startup -def start_interchange_server() -> int: +def start_interchange_server(experiment_dir) -> int: """ Start the interchange endpoint server and return the port number. @@ -382,6 +382,6 @@ def start_interchange_server() -> int: int: The port number the server is running on. """ server = InterchangeEndpointServer() - port = server.start() + port = server.start(experiment_dir) return port From f6c5453717d28731e5b6b3cc203b827c47a19dc0 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 9 Jan 2026 14:23:48 +0800 Subject: [PATCH 394/462] add comment --- .../weight_tuner/experimental/as_oai_model_server.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index f268cb18..474aaa0e 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -1,7 +1,12 @@ """ -A shadow FastAPI server for serving as interchange endpoint between agents and model handlers. +A shadow FastAPI server for serving as interchange endpoint between Tuner and Workflow. - This functionality is experimental. +- The code is very async, considering extreme efficiency for handling many concurrent requests, + therefore, it may be hard to read. + +--------------------------------------------------------------------------------------------- + """ import asyncio From a66a182891578fb712e01bd225804e4ac1d6e2c3 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 9 Jan 2026 14:53:44 +0800 Subject: [PATCH 395/462] Add service URL attribute to BaseGymEnv and implement DeepResearch workflow example --- ajet/task_rollout/resource_keeper.py | 1 + .../ma_deepresearch.py | 74 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 tutorial/example_ma_deepresearch/ma_deepresearch.py diff --git a/ajet/task_rollout/resource_keeper.py b/ajet/task_rollout/resource_keeper.py index ba33e0c0..d7eb3667 100644 --- a/ajet/task_rollout/resource_keeper.py +++ b/ajet/task_rollout/resource_keeper.py @@ -150,6 +150,7 @@ def __init__( self.task_thread_index = task_thread_index self.observation_window = observation_window self.episode_uuid = episode_uuid + self.service_url = self.env_client.base_url def step(self, action: dict) -> Tuple[str, float, bool, dict]: """Take a step in the gym environment.""" diff --git a/tutorial/example_ma_deepresearch/ma_deepresearch.py b/tutorial/example_ma_deepresearch/ma_deepresearch.py new file mode 100644 index 00000000..9eaba34c --- /dev/null +++ b/tutorial/example_ma_deepresearch/ma_deepresearch.py @@ -0,0 +1,74 @@ +from typing import List +from loguru import logger +from pydantic import BaseModel, Field +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask +from openai.types.chat.chat_completion import ChatCompletion +from openai.types.chat import ChatCompletionMessageToolCall +from textwrap import dedent + +import json +import os +import asyncio +import requests + + +# ------------------------------------------------------ +# Simple version - no tool call +# ------------------------------------------------------ + + +class DeepResearchInputSchema(BaseModel): + base_url: str = Field(default="", description="The base URL of the OpenAI-compatible API.") + api_key: str = Field(default="", description="The API key for authentication.") + init_messages: List[dict] = Field(default=[], description="The initial messages for the deep research task.") + task_id: str = Field(default="", description="The unique identifier for the research task.") + main_query: str = Field(default="", description="The main query for the research task.") + max_steps: int = Field(default=20, description="The maximum number of steps for the research task.") + env_service_url: str = Field(default="", description="The URL of the environment service.") + + +class ExampleMaDeepResearch(Workflow): + name: str = "multiagent_deep_research_workflow" + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore + # Extract base URL and API key from the tuner + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key + init_messages = workflow_task.task.init_messages + + # Get the AGENT_SERVER_URL from environment variables or use a default value + agent_server_url = os.getenv("AGENT_SERVER_URL", "http://localhost:8000") + + # Prepare the payload using DeepResearchInputSchema + payload = DeepResearchInputSchema( + base_url=base_url, + api_key=api_key, + init_messages=init_messages, + task_id=workflow_task.task.task_id, + main_query=workflow_task.task.main_query, + max_steps=tuner.config.astune.rollout.multi_turn.max_steps, + env_service_url=workflow_task.gym_env.service_url, + ) + + try: + # Send the HTTP POST request to the AGENT_SERVER_URL + headers = { + "Content-Type": "application/json", + } + + response = requests.post( + agent_server_url, + headers=headers, + data=payload.model_dump(), + ) + + # Check if the request was successful + if response.status_code == 200: + result_data = response.json() + logger.info(f"Successfully received response: {result_data}") + result = WorkflowOutput(**result_data) + return result + + except Exception as e: + logger.error(f"An error occurred while sending the request: {e}") From 62b40709900221e72fef275c838fcc2920c161ea Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 9 Jan 2026 16:46:31 +0800 Subject: [PATCH 396/462] Add VSCode extension instructions for Ray Distributed Debugger and utility functions --- ajet/utils/vsdb.py | 113 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 ajet/utils/vsdb.py diff --git a/ajet/utils/vsdb.py b/ajet/utils/vsdb.py new file mode 100644 index 00000000..665b99fa --- /dev/null +++ b/ajet/utils/vsdb.py @@ -0,0 +1,113 @@ +import os +import pickle + +""" +Ray Distributed Debugger VSCode Extension (Recommended) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Starting with Ray 2.39, Anyscale has introduced the `Ray Distributed Debugger `_ VSCode extension. Follow the extension’s installation instructions, then add your cluster using the dashboard URL you obtained earlier. + + .. image:: https://github.com/eric-haibin-lin/verl-community/blob/main/docs/ray/debugger.png?raw=true + :alt: Ray Distributed Debugger VSCode extension screenshot + +2. Prerequisites. + + Ensure the following are installed (see the extension README for more detail): + + - Visual Studio Code + - `ray[default]` >= 2.9.1 + - `debugpy` >= 1.8.0 + + .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/c7098b755ff689859837773a916c857.png?raw=true + :alt: VSCode with Ray prerequisites + +3. Environment Variables. + + To enable post‑mortem debugging, set: + + .. code-block:: bash + + export RAY_DEBUG_POST_MORTEM=1 + + .. admonition:: Note + :class: important + + Be sure to remove any legacy flags before starting Ray: + + - `RAY_DEBUG=legacy` + - `--ray-debugger-external` + +4. Configuring BreakpointsSet up breakpoint() in your code, and submit job to cluster. Then the extension will show the breakpoint information. + + + 1. Insert `breakpoint()` calls into your remote functions. + 2. Submit your job to the cluster. + + The extension will detect active breakpoints and display them in VSCode. + + .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/4ddad74395c79a1402331c0ce73316f.png?raw=true + :alt: Detected breakpoint in VSCode + + **Note:** Breakpoints are only supported inside functions decorated with `@ray.remote`. + +5. Launching the Debugger. + + Run your job directly from the command line (do not use a `launch.json`): + + .. code-block:: bash + + python job.py + +6. Attaching to a Breakpoint. + + Once the process hits the first `breakpoint()`, click the Ray Distributed Debugger icon in the VSCode sidebar to attach the debugger. + + .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/4ddad74395c79a1402331c0ce73316f.png?raw=true + :alt: Attaching VSCode debugger to Ray process + +7. Debugging With Multiple breakpoint(). + + For each subsequent task, first disconnect the current debugger session, then click the extension icon again to attach to the next breakpoint. + + .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/6e83c910a62c82fecb89c6619e001cd.png?raw=true + :alt: Disconnecting and reconnecting the debugger +""" + +def vscode_conditional_breakpoint(tag=None, once=True): + + env_tag = f'HIT_BREAKPOINT_REC_{tag}' + if not os.getenv('RAY_DEBUG_POST_MORTEM'): return + if tag is None: + if once: + if os.getenv(env_tag, "") != "1": + os.environ[env_tag] = "1" + breakpoint() + return + else: + breakpoint() + return + else: + debug_tags = os.getenv('DEBUG_TAGS', '').split('|') + if tag in debug_tags: + if once: + if os.getenv(env_tag, "") != "1": + os.environ[env_tag] = "1" + breakpoint() + return + else: + breakpoint() + return + + +def objdump(obj, file="objdump.tmp"): + with open(file, "wb+") as f: + pickle.dump(obj, f) + return + + +def objload(file="objdump.tmp"): + import os + if not os.path.exists(file): + return + with open(file, "rb") as f: + return pickle.load(f) From 664098ea2dde1c759d9884f8bc681d20dee317c3 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 9 Jan 2026 16:51:02 +0800 Subject: [PATCH 397/462] update docs --- ajet/utils/vsdb.py | 70 ++++++---------------------------------------- 1 file changed, 9 insertions(+), 61 deletions(-) diff --git a/ajet/utils/vsdb.py b/ajet/utils/vsdb.py index 665b99fa..eb54b4a7 100644 --- a/ajet/utils/vsdb.py +++ b/ajet/utils/vsdb.py @@ -3,74 +3,22 @@ """ Ray Distributed Debugger VSCode Extension (Recommended) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -1. Starting with Ray 2.39, Anyscale has introduced the `Ray Distributed Debugger `_ VSCode extension. Follow the extension’s installation instructions, then add your cluster using the dashboard URL you obtained earlier. +Starting with Ray 2.39, Anyscale has introduced the +`Ray Distributed Debugger `_ VSCode extension. - .. image:: https://github.com/eric-haibin-lin/verl-community/blob/main/docs/ray/debugger.png?raw=true - :alt: Ray Distributed Debugger VSCode extension screenshot +1. Install the Ray Distributed Debugger extension in VSCode. -2. Prerequisites. +2. In AgentJet project: - Ensure the following are installed (see the extension README for more detail): + 2-1. In the place your want to set a conditional breakpoint, write + `from ajet import bp; bp("TAG_1")` - - Visual Studio Code - - `ray[default]` >= 2.9.1 - - `debugpy` >= 1.8.0 + 2-2. When launching the training process, add `--debug` argument + `ajet --conf your_config.yaml --debug="TAG_1"` - .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/c7098b755ff689859837773a916c857.png?raw=true - :alt: VSCode with Ray prerequisites + 2-3. Open Tab "Ray Distributed Debugger" in VSCode, and just wait until the breakpoint is hit. -3. Environment Variables. - - To enable post‑mortem debugging, set: - - .. code-block:: bash - - export RAY_DEBUG_POST_MORTEM=1 - - .. admonition:: Note - :class: important - - Be sure to remove any legacy flags before starting Ray: - - - `RAY_DEBUG=legacy` - - `--ray-debugger-external` - -4. Configuring BreakpointsSet up breakpoint() in your code, and submit job to cluster. Then the extension will show the breakpoint information. - - - 1. Insert `breakpoint()` calls into your remote functions. - 2. Submit your job to the cluster. - - The extension will detect active breakpoints and display them in VSCode. - - .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/4ddad74395c79a1402331c0ce73316f.png?raw=true - :alt: Detected breakpoint in VSCode - - **Note:** Breakpoints are only supported inside functions decorated with `@ray.remote`. - -5. Launching the Debugger. - - Run your job directly from the command line (do not use a `launch.json`): - - .. code-block:: bash - - python job.py - -6. Attaching to a Breakpoint. - - Once the process hits the first `breakpoint()`, click the Ray Distributed Debugger icon in the VSCode sidebar to attach the debugger. - - .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/4ddad74395c79a1402331c0ce73316f.png?raw=true - :alt: Attaching VSCode debugger to Ray process - -7. Debugging With Multiple breakpoint(). - - For each subsequent task, first disconnect the current debugger session, then click the extension icon again to attach to the next breakpoint. - - .. image:: https://github.com/aoshen524/verl/blob/main/docs/start/6e83c910a62c82fecb89c6619e001cd.png?raw=true - :alt: Disconnecting and reconnecting the debugger """ def vscode_conditional_breakpoint(tag=None, once=True): From a9c3c890c36c3bed1c13b1af17091f0f9efbaafa Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Fri, 9 Jan 2026 17:11:38 +0800 Subject: [PATCH 398/462] improve docs --- ajet/task_rollout/resource_keeper.py | 3 +- docs/en/installation.md | 19 +- docs/en/introduction.md | 2 +- docs/zh/installation.md | 19 +- docs/zh/introduction.md | 7 +- install.sh | 2080 ++++++++++++++++++++++++++ pyproject.toml | 15 +- 7 files changed, 2119 insertions(+), 26 deletions(-) create mode 100755 install.sh diff --git a/ajet/task_rollout/resource_keeper.py b/ajet/task_rollout/resource_keeper.py index d7eb3667..e2ec4c14 100644 --- a/ajet/task_rollout/resource_keeper.py +++ b/ajet/task_rollout/resource_keeper.py @@ -150,7 +150,8 @@ def __init__( self.task_thread_index = task_thread_index self.observation_window = observation_window self.episode_uuid = episode_uuid - self.service_url = self.env_client.base_url + if self.env_client: + self.service_url = self.env_client.base_url def step(self, action: dict) -> Tuple[str, float, bool, dict]: """Take a step in the gym environment.""" diff --git a/docs/en/installation.md b/docs/en/installation.md index 45bb7071..05e130f0 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -36,31 +36,32 @@ AgentJet supports multiple backbones. Currently we have `verl` and `trinity` (re If you prefer `conda`, you can also install via conda and pip (simply change `uv pip` to `pip`). -=== "Trinity (Recommended)" +=== "Verl (Recommended)" - Install with `trinity` training backbone for fully asynchronous RFT: + Install with `verl` training backbone: ```bash uv venv --python=3.10 source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` -=== "Verl" + !!! warning "flash-attn Installation" + `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. - Install with `verl` training backbone: + +=== "Trinity" + + Install with `trinity` training backbone for fully asynchronous RFT: ```bash uv venv --python=3.10 source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` - !!! warning "flash-attn Installation" - `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. - --- ## Install via Docker diff --git a/docs/en/introduction.md b/docs/en/introduction.md index db40a922..8bee1a2f 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -101,7 +101,7 @@ The internal system orchestrates several specialized modules to handle the compl ### Navigation -* **Tutorials**: From [Installation](./installation.md) to [Tuning your first agent](./tutorial.md) — the essential path for beginners. +* **Tutorials**: From [Installation](./installation.md) to [Tuning your first agent](./tune_your_first_agent.md) — the essential path for beginners. * **Core Components**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). * **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). * **Deep Dive**: Master advanced [Configuration](./configuration.md). diff --git a/docs/zh/installation.md b/docs/zh/installation.md index 19ea3ef3..b53cd020 100644 --- a/docs/zh/installation.md +++ b/docs/zh/installation.md @@ -36,30 +36,31 @@ AgentJet 支持多种训练后端(backbone),目前包括 `verl` 和 `trini 如果您更希望使用 `conda`,也可以通过 conda + pip 安装(只需将 `uv pip` 替换为 `pip` 即可)。 -=== "Trinity(推荐)" +=== "Verl" - 使用 `trinity` 训练后端安装,支持全异步 RFT: + 使用 `verl` 训练后端安装: ```bash uv venv --python=3.10 source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` -=== "Verl" + !!! warning "flash-attn 安装说明" + `flash-attn` 必须在其他依赖安装完成后再安装。为加快编译速度,可通过 `export MAX_JOBS=${N_CPU}` 设置并行编译数,或确保 GitHub 访问畅通以直接安装预编译轮子。 - 使用 `verl` 训练后端安装: +=== "Trinity(推荐)" + + 使用 `trinity` 训练后端安装,支持全异步 RFT: ```bash uv venv --python=3.10 source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` - !!! warning "flash-attn 安装说明" - `flash-attn` 必须在其他依赖安装完成后再安装。为加快编译速度,可通过 `export MAX_JOBS=${N_CPU}` 设置并行编译数,或确保 GitHub 访问畅通以直接安装预编译轮子。 --- @@ -75,7 +76,7 @@ AgentJet 支持多种训练后端(backbone),目前包括 `verl` 和 `trini 请在宿主机的 Ubuntu 系统上安装 nvidia docker runtime。详细步骤请参考: - [Nvidia 官方文档](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian) -- [Ubuntu 环境设置指南](./setup_ubuntu.md)(我们的详细安装说明) +- [Ubuntu 环境设置指南](../en/setup_ubuntu.md)(我们的详细安装说明) ### 运行 Docker 容器 diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index 84ec7c0a..bd956672 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -11,7 +11,7 @@ 我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: * **简单友好**:AgentJet 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 -* **丰富的教程库**:AgentJet 提供了丰富的 [示例库](#id6) 作为学习教程。 +* **丰富的教程库**:AgentJet 提供了丰富的 [示例库](#example-library) 作为学习教程。 * **高效且可扩展**:AgentJet 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 * **灵活且快速**:AgentJet 支持 [多智能体工作流](./workflow.md),并采用了上下文合并技术。当工作流涉及多轮(或多 智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 * **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 @@ -56,6 +56,7 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --w ``` + #### 示例库 探索我们丰富的示例库,开启您的探索之旅: @@ -101,7 +102,7 @@ AgentJet 通过将开发者接口与内部执行逻辑分离,使智能体微 ### 导航 -* **教程**:从 [安装](./installation.md) 到 [微调您的第一个智能体](./tutorial.md) —— 初学者的必经之路。 +* **教程**:从 [安装](./installation.md) 到 [微调您的第一个智能体](./tune_your_first_agent.md) —— 初学者的必经之路。 * **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 -* **示例**:查看上方的 [示例库](#example-librar),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 +* **示例**:查看上方的 [示例库](#example-library),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 * **深入了解**:掌握高级 [配置方案](./configuration.md)。 diff --git a/install.sh b/install.sh new file mode 100755 index 00000000..bf0400b6 --- /dev/null +++ b/install.sh @@ -0,0 +1,2080 @@ +#!/bin/sh +# shellcheck shell=dash +# shellcheck disable=SC2039 # local is non-POSIX +# +# Licensed under the MIT license +# , at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +# This runs on Unix shells like bash/dash/ksh/zsh. It uses the common `local` +# extension. Note: Most shells limit `local` to 1 var per line, contra bash. + +# Some versions of ksh have no `local` keyword. Alias it to `typeset`, but +# beware this makes variables global with f()-style function syntax in ksh93. +# mksh has this alias by default. +has_local() { + # shellcheck disable=SC2034 # deliberately unused + local _has_local +} + +has_local 2>/dev/null || alias local=typeset + +set -u + +APP_NAME="uv" +APP_VERSION="0.9.22" +# Look for GitHub Enterprise-style base URL first +if [ -n "${UV_INSTALLER_GHE_BASE_URL:-}" ]; then + INSTALLER_BASE_URL="$UV_INSTALLER_GHE_BASE_URL" +else + INSTALLER_BASE_URL="${UV_INSTALLER_GITHUB_BASE_URL:-https://github.com}" +fi +if [ -n "${UV_DOWNLOAD_URL:-}" ]; then + ARTIFACT_DOWNLOAD_URL="$UV_DOWNLOAD_URL" +elif [ -n "${INSTALLER_DOWNLOAD_URL:-}" ]; then + ARTIFACT_DOWNLOAD_URL="$INSTALLER_DOWNLOAD_URL" +else + ARTIFACT_DOWNLOAD_URL="${INSTALLER_BASE_URL}/astral-sh/uv/releases/download/0.9.22" +fi +if [ -n "${UV_PRINT_VERBOSE:-}" ]; then + PRINT_VERBOSE="$UV_PRINT_VERBOSE" +else + PRINT_VERBOSE=${INSTALLER_PRINT_VERBOSE:-0} +fi +if [ -n "${UV_PRINT_QUIET:-}" ]; then + PRINT_QUIET="$UV_PRINT_QUIET" +else + PRINT_QUIET=${INSTALLER_PRINT_QUIET:-0} +fi +if [ -n "${UV_NO_MODIFY_PATH:-}" ]; then + NO_MODIFY_PATH="$UV_NO_MODIFY_PATH" +else + NO_MODIFY_PATH=${INSTALLER_NO_MODIFY_PATH:-0} +fi +if [ "${UV_DISABLE_UPDATE:-0}" = "1" ]; then + INSTALL_UPDATER=0 +else + INSTALL_UPDATER=1 +fi +UNMANAGED_INSTALL="${UV_UNMANAGED_INSTALL:-}" +if [ -n "${UNMANAGED_INSTALL}" ]; then + NO_MODIFY_PATH=1 + INSTALL_UPDATER=0 +fi +AUTH_TOKEN="${UV_GITHUB_TOKEN:-}" + +read -r RECEIPT <&2 + say_verbose " from $_url" 1>&2 + say_verbose " to $_file" 1>&2 + + ensure mkdir -p "$_dir" + + if ! downloader "$_url" "$_file"; then + say "failed to download $_url" + say "this may be a standard network error, but it may also indicate" + say "that $APP_NAME's release process is not working. When in doubt" + say "please feel free to open an issue!" + exit 1 + fi + + if [ -n "${_checksum_style:-}" ]; then + verify_checksum "$_file" "$_checksum_style" "$_checksum_value" + else + say "no checksums to verify" + fi + + # ...and then the updater, if it exists + if [ -n "$_updater_name" ] && [ "$INSTALL_UPDATER" = "1" ]; then + local _updater_url="$ARTIFACT_DOWNLOAD_URL/$_updater_name" + # This renames the artifact while doing the download, removing the + # target triple and leaving just the appname-update format + local _updater_file="$_dir/$APP_NAME-update" + + if ! downloader "$_updater_url" "$_updater_file"; then + say "failed to download $_updater_url" + say "this may be a standard network error, but it may also indicate" + say "that $APP_NAME's release process is not working. When in doubt" + say "please feel free to open an issue!" + exit 1 + fi + + # Add the updater to the list of binaries to install + _bins="$_bins $APP_NAME-update" + fi + + # unpack the archive + case "$_zip_ext" in + ".zip") + ensure unzip -q "$_file" -d "$_dir" + ;; + + ".tar."*) + ensure tar xf "$_file" --strip-components 1 -C "$_dir" + ;; + *) + err "unknown archive format: $_zip_ext" + ;; + esac + + install "$_dir" "$_bins" "$_libs" "$_staticlibs" "$_arch" "$@" + local _retval=$? + if [ "$_retval" != 0 ]; then + return "$_retval" + fi + + ignore rm -rf "$_dir" + + # Install the install receipt + if [ "$INSTALL_UPDATER" = "1" ]; then + if ! mkdir -p "$RECEIPT_HOME"; then + err "unable to create receipt directory at $RECEIPT_HOME" + else + echo "$RECEIPT" > "$RECEIPT_HOME/$APP_NAME-receipt.json" + # shellcheck disable=SC2320 + local _retval=$? + fi + else + local _retval=0 + fi + + return "$_retval" +} + +# Replaces $HOME with the variable name for display to the user, +# only if $HOME is defined. +replace_home() { + local _str="$1" + + if [ -n "${HOME:-}" ]; then + echo "$_str" | sed "s,$HOME,\$HOME," + else + echo "$_str" + fi +} + +json_binary_aliases() { + local _arch="$1" + + case "$_arch" in + "aarch64-apple-darwin") + echo '{}' + ;; + "aarch64-pc-windows-gnu") + echo '{}' + ;; + "aarch64-unknown-linux-gnu") + echo '{}' + ;; + "aarch64-unknown-linux-musl-dynamic") + echo '{}' + ;; + "aarch64-unknown-linux-musl-static") + echo '{}' + ;; + "arm-unknown-linux-gnueabihf") + echo '{}' + ;; + "arm-unknown-linux-musl-dynamiceabihf") + echo '{}' + ;; + "arm-unknown-linux-musl-staticeabihf") + echo '{}' + ;; + "armv7-unknown-linux-gnueabihf") + echo '{}' + ;; + "armv7-unknown-linux-musl-dynamiceabihf") + echo '{}' + ;; + "armv7-unknown-linux-musl-staticeabihf") + echo '{}' + ;; + "i686-pc-windows-gnu") + echo '{}' + ;; + "i686-unknown-linux-gnu") + echo '{}' + ;; + "i686-unknown-linux-musl-dynamic") + echo '{}' + ;; + "i686-unknown-linux-musl-static") + echo '{}' + ;; + "powerpc64-unknown-linux-gnu") + echo '{}' + ;; + "powerpc64le-unknown-linux-gnu") + echo '{}' + ;; + "riscv64gc-unknown-linux-gnu") + echo '{}' + ;; + "s390x-unknown-linux-gnu") + echo '{}' + ;; + "x86_64-apple-darwin") + echo '{}' + ;; + "x86_64-pc-windows-gnu") + echo '{}' + ;; + "x86_64-unknown-linux-gnu") + echo '{}' + ;; + "x86_64-unknown-linux-musl-dynamic") + echo '{}' + ;; + "x86_64-unknown-linux-musl-static") + echo '{}' + ;; + *) + echo '{}' + ;; + esac +} + +aliases_for_binary() { + local _bin="$1" + local _arch="$2" + + case "$_arch" in + "aarch64-apple-darwin") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "aarch64-pc-windows-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "aarch64-unknown-linux-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "aarch64-unknown-linux-musl-dynamic") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "aarch64-unknown-linux-musl-static") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "arm-unknown-linux-gnueabihf") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "arm-unknown-linux-musl-dynamiceabihf") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "arm-unknown-linux-musl-staticeabihf") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "armv7-unknown-linux-gnueabihf") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "armv7-unknown-linux-musl-dynamiceabihf") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "armv7-unknown-linux-musl-staticeabihf") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "i686-pc-windows-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "i686-unknown-linux-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "i686-unknown-linux-musl-dynamic") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "i686-unknown-linux-musl-static") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "powerpc64-unknown-linux-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "powerpc64le-unknown-linux-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "riscv64gc-unknown-linux-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "s390x-unknown-linux-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "x86_64-apple-darwin") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "x86_64-pc-windows-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "x86_64-unknown-linux-gnu") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "x86_64-unknown-linux-musl-dynamic") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + "x86_64-unknown-linux-musl-static") + case "$_bin" in + *) + echo "" + ;; + esac + ;; + *) + echo "" + ;; + esac +} + +select_archive_for_arch() { + local _true_arch="$1" + local _archive + + # try each archive, checking runtime conditions like libc versions + # accepting the first one that matches, as it's the best match + case "$_true_arch" in + "aarch64-apple-darwin") + _archive="uv-aarch64-apple-darwin.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + _archive="uv-x86_64-apple-darwin.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "aarch64-pc-windows-gnu") + _archive="uv-aarch64-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "aarch64-pc-windows-msvc") + _archive="uv-aarch64-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + _archive="uv-x86_64-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + _archive="uv-i686-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "aarch64-unknown-linux-gnu") + _archive="uv-aarch64-unknown-linux-gnu.tar.gz" + if ! check_glibc "2" "28"; then + _archive="" + fi + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + _archive="uv-aarch64-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "aarch64-unknown-linux-musl-dynamic") + _archive="uv-aarch64-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "aarch64-unknown-linux-musl-static") + _archive="uv-aarch64-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "arm-unknown-linux-gnueabihf") + _archive="uv-arm-unknown-linux-musleabihf.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "arm-unknown-linux-musl-dynamiceabihf") + _archive="uv-arm-unknown-linux-musleabihf.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "arm-unknown-linux-musl-staticeabihf") + _archive="uv-arm-unknown-linux-musleabihf.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "armv7-unknown-linux-gnueabihf") + _archive="uv-armv7-unknown-linux-gnueabihf.tar.gz" + if ! check_glibc "2" "17"; then + _archive="" + fi + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + _archive="uv-armv7-unknown-linux-musleabihf.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "armv7-unknown-linux-musl-dynamiceabihf") + _archive="uv-armv7-unknown-linux-musleabihf.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "armv7-unknown-linux-musl-staticeabihf") + _archive="uv-armv7-unknown-linux-musleabihf.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "i686-pc-windows-gnu") + _archive="uv-i686-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "i686-pc-windows-msvc") + _archive="uv-i686-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "i686-unknown-linux-gnu") + _archive="uv-i686-unknown-linux-gnu.tar.gz" + if ! check_glibc "2" "17"; then + _archive="" + fi + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + _archive="uv-i686-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "i686-unknown-linux-musl-dynamic") + _archive="uv-i686-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "i686-unknown-linux-musl-static") + _archive="uv-i686-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "powerpc64-unknown-linux-gnu") + _archive="uv-powerpc64-unknown-linux-gnu.tar.gz" + if ! check_glibc "2" "17"; then + _archive="" + fi + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "powerpc64le-unknown-linux-gnu") + _archive="uv-powerpc64le-unknown-linux-gnu.tar.gz" + if ! check_glibc "2" "17"; then + _archive="" + fi + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "riscv64gc-unknown-linux-gnu") + _archive="uv-riscv64gc-unknown-linux-gnu.tar.gz" + if ! check_glibc "2" "31"; then + _archive="" + fi + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "s390x-unknown-linux-gnu") + _archive="uv-s390x-unknown-linux-gnu.tar.gz" + if ! check_glibc "2" "17"; then + _archive="" + fi + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "x86_64-apple-darwin") + _archive="uv-x86_64-apple-darwin.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "x86_64-pc-windows-gnu") + _archive="uv-x86_64-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "x86_64-pc-windows-msvc") + _archive="uv-x86_64-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + _archive="uv-i686-pc-windows-msvc.zip" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "x86_64-unknown-linux-gnu") + _archive="uv-x86_64-unknown-linux-gnu.tar.gz" + if ! check_glibc "2" "17"; then + _archive="" + fi + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + _archive="uv-x86_64-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "x86_64-unknown-linux-musl-dynamic") + _archive="uv-x86_64-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + "x86_64-unknown-linux-musl-static") + _archive="uv-x86_64-unknown-linux-musl.tar.gz" + if [ -n "$_archive" ]; then + echo "$_archive" + return 0 + fi + ;; + *) + err "there isn't a download for your platform $_true_arch" + ;; + esac + err "no compatible downloads were found for your platform $_true_arch" +} + +check_glibc() { + local _min_glibc_major="$1" + local _min_glibc_series="$2" + + # Parsing version out from line 1 like: + # ldd (Ubuntu GLIBC 2.35-0ubuntu3.1) 2.35 + _local_glibc="$(ldd --version | awk -F' ' '{ if (FNR<=1) print $NF }')" + + if [ "$(echo "${_local_glibc}" | awk -F. '{ print $1 }')" = "$_min_glibc_major" ] && [ "$(echo "${_local_glibc}" | awk -F. '{ print $2 }')" -ge "$_min_glibc_series" ]; then + return 0 + else + say "System glibc version (\`${_local_glibc}') is too old; checking alternatives" >&2 + return 1 + fi +} + +# See discussion of late-bound vs early-bound for why we use single-quotes with env vars +# shellcheck disable=SC2016 +install() { + # This code needs to both compute certain paths for itself to write to, and + # also write them to shell/rc files so that they can look them up to e.g. + # add them to PATH. This requires an active distinction between paths + # and expressions that can compute them. + # + # The distinction lies in when we want env-vars to be evaluated. For instance + # if we determine that we want to install to $HOME/.myapp, which do we add + # to e.g. $HOME/.profile: + # + # * early-bound: export PATH="/home/myuser/.myapp:$PATH" + # * late-bound: export PATH="$HOME/.myapp:$PATH" + # + # In this case most people would prefer the late-bound version, but in other + # cases the early-bound version might be a better idea. In particular when using + # other env-vars than $HOME, they are more likely to be only set temporarily + # for the duration of this install script, so it's more advisable to erase their + # existence with early-bounding. + # + # This distinction is handled by "double-quotes" (early) vs 'single-quotes' (late). + # + # However if we detect that "$SOME_VAR/..." is a subdir of $HOME, we try to rewrite + # it to be '$HOME/...' to get the best of both worlds. + # + # This script has a few different variants, the most complex one being the + # CARGO_HOME version which attempts to install things to Cargo's bin dir, + # potentially setting up a minimal version if the user hasn't ever installed Cargo. + # + # In this case we need to: + # + # * Install to $HOME/.cargo/bin/ + # * Create a shell script at $HOME/.cargo/env that: + # * Checks if $HOME/.cargo/bin/ is on PATH + # * and if not prepends it to PATH + # * Edits $INFERRED_HOME/.profile to run $HOME/.cargo/env (if the line doesn't exist) + # + # To do this we need these 4 values: + + # The actual path we're going to install to + local _install_dir + # The directory C dynamic/static libraries install to + local _lib_install_dir + # The install prefix we write to the receipt. + # For organized install methods like CargoHome, which have + # subdirectories, this is the root without `/bin`. For other + # methods, this is the same as `_install_dir`. + local _receipt_install_dir + # Path to the an shell script that adds install_dir to PATH + local _env_script_path + # Potentially-late-bound version of install_dir to write env_script + local _install_dir_expr + # Potentially-late-bound version of env_script_path to write to rcfiles like $HOME/.profile + local _env_script_path_expr + # Forces the install to occur at this path, not the default + local _force_install_dir + # Which install layout to use - "flat" or "hierarchical" + local _install_layout="unspecified" + # A list of binaries which are shadowed in the PATH + local _shadowed_bins="" + + # Check the newer app-specific variable before falling back + # to the older generic one + if [ -n "${UV_INSTALL_DIR:-}" ]; then + _force_install_dir="$UV_INSTALL_DIR" + _install_layout="flat" + elif [ -n "${CARGO_DIST_FORCE_INSTALL_DIR:-}" ]; then + _force_install_dir="$CARGO_DIST_FORCE_INSTALL_DIR" + _install_layout="flat" + elif [ -n "$UNMANAGED_INSTALL" ]; then + _force_install_dir="$UNMANAGED_INSTALL" + _install_layout="flat" + fi + + # Check if the install layout should be changed from `flat` to `cargo-home` + # for backwards compatible updates of applications that switched layouts. + if [ -n "${_force_install_dir:-}" ]; then + if [ "$_install_layout" = "flat" ]; then + # If the install directory is targeting the Cargo home directory, then + # we assume this application was previously installed that layout + if [ "$_force_install_dir" = "${CARGO_HOME:-${INFERRED_HOME:-}/.cargo}" ]; then + _install_layout="cargo-home" + fi + fi + fi + + # Before actually consulting the configured install strategy, see + # if we're overriding it. + if [ -n "${_force_install_dir:-}" ]; then + case "$_install_layout" in + "hierarchical") + _install_dir="$_force_install_dir/bin" + _lib_install_dir="$_force_install_dir/lib" + _receipt_install_dir="$_force_install_dir" + _env_script_path="$_force_install_dir/env" + _install_dir_expr="$(replace_home "$_force_install_dir/bin")" + _env_script_path_expr="$(replace_home "$_force_install_dir/env")" + ;; + "cargo-home") + _install_dir="$_force_install_dir/bin" + _lib_install_dir="$_force_install_dir/bin" + _receipt_install_dir="$_force_install_dir" + _env_script_path="$_force_install_dir/env" + _install_dir_expr="$(replace_home "$_force_install_dir/bin")" + _env_script_path_expr="$(replace_home "$_force_install_dir/env")" + ;; + "flat") + _install_dir="$_force_install_dir" + _lib_install_dir="$_force_install_dir" + _receipt_install_dir="$_install_dir" + _env_script_path="$_force_install_dir/env" + _install_dir_expr="$(replace_home "$_force_install_dir")" + _env_script_path_expr="$(replace_home "$_force_install_dir/env")" + ;; + *) + err "Unrecognized install layout: $_install_layout" + ;; + esac + fi + if [ -z "${_install_dir:-}" ]; then + _install_layout="flat" + # Install to $XDG_BIN_HOME + if [ -n "${XDG_BIN_HOME:-}" ]; then + _install_dir="$XDG_BIN_HOME" + _lib_install_dir="$_install_dir" + _receipt_install_dir="$_install_dir" + _env_script_path="$XDG_BIN_HOME/env" + _install_dir_expr="$(replace_home "$_install_dir")" + _env_script_path_expr="$(replace_home "$_env_script_path")" + fi + fi + if [ -z "${_install_dir:-}" ]; then + _install_layout="flat" + # Install to $XDG_DATA_HOME/../bin + if [ -n "${XDG_DATA_HOME:-}" ]; then + _install_dir="$XDG_DATA_HOME/../bin" + _lib_install_dir="$_install_dir" + _receipt_install_dir="$_install_dir" + _env_script_path="$XDG_DATA_HOME/../bin/env" + _install_dir_expr="$(replace_home "$_install_dir")" + _env_script_path_expr="$(replace_home "$_env_script_path")" + fi + fi + if [ -z "${_install_dir:-}" ]; then + _install_layout="flat" + # Install to $HOME/.local/bin + if [ -n "${INFERRED_HOME:-}" ]; then + _install_dir="$INFERRED_HOME/.local/bin" + _lib_install_dir="$INFERRED_HOME/.local/bin" + _receipt_install_dir="$_install_dir" + _env_script_path="$INFERRED_HOME/.local/bin/env" + _install_dir_expr="$INFERRED_HOME_EXPRESSION/.local/bin" + _env_script_path_expr="$INFERRED_HOME_EXPRESSION/.local/bin/env" + fi + fi + + if [ -z "$_install_dir_expr" ]; then + err "could not find a valid path to install to!" + fi + + # Identical to the sh version, just with a .fish file extension + # We place it down here to wait until it's been assigned in every + # path. + _fish_env_script_path="${_env_script_path}.fish" + _fish_env_script_path_expr="${_env_script_path_expr}.fish" + + # Replace the temporary cargo home with the calculated one + RECEIPT=$(echo "$RECEIPT" | sed "s,AXO_INSTALL_PREFIX,$_receipt_install_dir,") + # Also replace the aliases with the arch-specific one + RECEIPT=$(echo "$RECEIPT" | sed "s'\"binary_aliases\":{}'\"binary_aliases\":$(json_binary_aliases "$_arch")'") + # And replace the install layout + RECEIPT=$(echo "$RECEIPT" | sed "s'\"install_layout\":\"unspecified\"'\"install_layout\":\"$_install_layout\"'") + if [ "$NO_MODIFY_PATH" = "1" ]; then + RECEIPT=$(echo "$RECEIPT" | sed "s'\"modify_path\":true'\"modify_path\":false'") + fi + + say "installing to $_install_dir" + ensure mkdir -p "$_install_dir" + ensure mkdir -p "$_lib_install_dir" + + # copy all the binaries to the install dir + local _src_dir="$1" + local _bins="$2" + local _libs="$3" + local _staticlibs="$4" + local _arch="$5" + for _bin_name in $_bins; do + local _bin="$_src_dir/$_bin_name" + ensure mv "$_bin" "$_install_dir" + # unzip seems to need this chmod + ensure chmod +x "$_install_dir/$_bin_name" + for _dest in $(aliases_for_binary "$_bin_name" "$_arch"); do + ln -sf "$_install_dir/$_bin_name" "$_install_dir/$_dest" + done + say " $_bin_name" + done + # Like the above, but no aliases + for _lib_name in $_libs; do + local _lib="$_src_dir/$_lib_name" + ensure mv "$_lib" "$_lib_install_dir" + # unzip seems to need this chmod + ensure chmod +x "$_lib_install_dir/$_lib_name" + say " $_lib_name" + done + for _lib_name in $_staticlibs; do + local _lib="$_src_dir/$_lib_name" + ensure mv "$_lib" "$_lib_install_dir" + # unzip seems to need this chmod + ensure chmod +x "$_lib_install_dir/$_lib_name" + say " $_lib_name" + done + + say "everything's installed!" + + # Avoid modifying the users PATH if they are managing their PATH manually + case :$PATH: + in *:$_install_dir:*) NO_MODIFY_PATH=1 ;; + *) ;; + esac + + if [ "0" = "$NO_MODIFY_PATH" ]; then + add_install_dir_to_ci_path "$_install_dir" + add_install_dir_to_path "$_install_dir_expr" "$_env_script_path" "$_env_script_path_expr" ".profile" "sh" + exit1=$? + shotgun_install_dir_to_path "$_install_dir_expr" "$_env_script_path" "$_env_script_path_expr" ".profile .bashrc .bash_profile .bash_login" "sh" + exit2=$? + add_install_dir_to_path "$_install_dir_expr" "$_env_script_path" "$_env_script_path_expr" ".zshrc .zshenv" "sh" + exit3=$? + # This path may not exist by default + ensure mkdir -p "$INFERRED_HOME/.config/fish/conf.d" + exit4=$? + add_install_dir_to_path "$_install_dir_expr" "$_fish_env_script_path" "$_fish_env_script_path_expr" ".config/fish/conf.d/$APP_NAME.env.fish" "fish" + exit5=$? + + if [ "${exit1:-0}" = 1 ] || [ "${exit2:-0}" = 1 ] || [ "${exit3:-0}" = 1 ] || [ "${exit4:-0}" = 1 ] || [ "${exit5:-0}" = 1 ]; then + say "" + say "To add $_install_dir_expr to your PATH, either restart your shell or run:" + say "" + say " source $_env_script_path_expr (sh, bash, zsh)" + say " source $_fish_env_script_path_expr (fish)" + fi + fi + + _shadowed_bins="$(check_for_shadowed_bins "$_install_dir" "$_bins")" + if [ -n "$_shadowed_bins" ]; then + warn "The following commands are shadowed by other commands in your PATH:$_shadowed_bins" + fi +} + +check_for_shadowed_bins() { + local _install_dir="$1" + local _bins="$2" + local _shadow + + for _bin_name in $_bins; do + _shadow="$(command -v "$_bin_name")" + if [ -n "$_shadow" ] && [ "$_shadow" != "$_install_dir/$_bin_name" ]; then + _shadowed_bins="$_shadowed_bins $_bin_name" + fi + done + + echo "$_shadowed_bins" +} + +print_home_for_script() { + local script="$1" + + local _home + case "$script" in + # zsh has a special ZDOTDIR directory, which if set + # should be considered instead of $HOME + .zsh*) + if [ -n "${ZDOTDIR:-}" ]; then + _home="$ZDOTDIR" + else + _home="$INFERRED_HOME" + fi + ;; + *) + _home="$INFERRED_HOME" + ;; + esac + + echo "$_home" +} + +add_install_dir_to_ci_path() { + # Attempt to do CI-specific rituals to get the install-dir on PATH faster + local _install_dir="$1" + + # If GITHUB_PATH is present, then write install_dir to the file it refs. + # After each GitHub Action, the contents will be added to PATH. + # So if you put a curl | sh for this script in its own "run" step, + # the next step will have this dir on PATH. + # + # Note that GITHUB_PATH will not resolve any variables, so we in fact + # want to write install_dir and not install_dir_expr + if [ -n "${GITHUB_PATH:-}" ]; then + ensure echo "$_install_dir" >> "$GITHUB_PATH" + fi +} + +add_install_dir_to_path() { + # Edit rcfiles ($HOME/.profile) to add install_dir to $PATH + # + # We do this slightly indirectly by creating an "env" shell script which checks if install_dir + # is on $PATH already, and prepends it if not. The actual line we then add to rcfiles + # is to just source that script. This allows us to blast it into lots of different rcfiles and + # have it run multiple times without causing problems. It's also specifically compatible + # with the system rustup uses, so that we don't conflict with it. + local _install_dir_expr="$1" + local _env_script_path="$2" + local _env_script_path_expr="$3" + local _rcfiles="$4" + local _shell="$5" + + if [ -n "${INFERRED_HOME:-}" ]; then + local _target + local _home + + # Find the first file in the array that exists and choose + # that as our target to write to + for _rcfile_relative in $_rcfiles; do + _home="$(print_home_for_script "$_rcfile_relative")" + local _rcfile="$_home/$_rcfile_relative" + + if [ -f "$_rcfile" ]; then + _target="$_rcfile" + break + fi + done + + # If we didn't find anything, pick the first entry in the + # list as the default to create and write to + if [ -z "${_target:-}" ]; then + local _rcfile_relative + _rcfile_relative="$(echo "$_rcfiles" | awk '{ print $1 }')" + _home="$(print_home_for_script "$_rcfile_relative")" + _target="$_home/$_rcfile_relative" + fi + + # `source x` is an alias for `. x`, and the latter is more portable/actually-posix. + # This apparently comes up a lot on freebsd. It's easy enough to always add + # the more robust line to rcfiles, but when telling the user to apply the change + # to their current shell ". x" is pretty easy to misread/miscopy, so we use the + # prettier "source x" line there. Hopefully people with Weird Shells are aware + # this is a thing and know to tweak it (or just restart their shell). + local _robust_line=". \"$_env_script_path_expr\"" + local _pretty_line="source \"$_env_script_path_expr\"" + + # Add the env script if it doesn't already exist + if [ ! -f "$_env_script_path" ]; then + say_verbose "creating $_env_script_path" + if [ "$_shell" = "sh" ]; then + write_env_script_sh "$_install_dir_expr" "$_env_script_path" + else + write_env_script_fish "$_install_dir_expr" "$_env_script_path" + fi + else + say_verbose "$_env_script_path already exists" + fi + + # Check if the line is already in the rcfile + # grep: 0 if matched, 1 if no match, and 2 if an error occurred + # + # Ideally we could use quiet grep (-q), but that makes "match" and "error" + # have the same behaviour, when we want "no match" and "error" to be the same + # (on error we want to create the file, which >> conveniently does) + # + # We search for both kinds of line here just to do the right thing in more cases. + if ! grep -F "$_robust_line" "$_target" > /dev/null 2>/dev/null && \ + ! grep -F "$_pretty_line" "$_target" > /dev/null 2>/dev/null + then + # If the script now exists, add the line to source it to the rcfile + # (This will also create the rcfile if it doesn't exist) + if [ -f "$_env_script_path" ]; then + local _line + # Fish has deprecated `.` as an alias for `source` and + # it will be removed in a later version. + # https://fishshell.com/docs/current/cmds/source.html + # By contrast, `.` is the traditional syntax in sh and + # `source` isn't always supported in all circumstances. + if [ "$_shell" = "fish" ]; then + _line="$_pretty_line" + else + _line="$_robust_line" + fi + say_verbose "adding $_line to $_target" + # prepend an extra newline in case the user's file is missing a trailing one + ensure echo "" >> "$_target" + ensure echo "$_line" >> "$_target" + return 1 + fi + else + say_verbose "$_install_dir already on PATH" + fi + fi +} + +shotgun_install_dir_to_path() { + # Edit rcfiles ($HOME/.profile) to add install_dir to $PATH + # (Shotgun edition - write to all provided files that exist rather than just the first) + local _install_dir_expr="$1" + local _env_script_path="$2" + local _env_script_path_expr="$3" + local _rcfiles="$4" + local _shell="$5" + + if [ -n "${INFERRED_HOME:-}" ]; then + local _found=false + local _home + + for _rcfile_relative in $_rcfiles; do + _home="$(print_home_for_script "$_rcfile_relative")" + local _rcfile_abs="$_home/$_rcfile_relative" + + if [ -f "$_rcfile_abs" ]; then + _found=true + add_install_dir_to_path "$_install_dir_expr" "$_env_script_path" "$_env_script_path_expr" "$_rcfile_relative" "$_shell" + fi + done + + # Fall through to previous "create + write to first file in list" behavior + if [ "$_found" = false ]; then + add_install_dir_to_path "$_install_dir_expr" "$_env_script_path" "$_env_script_path_expr" "$_rcfiles" "$_shell" + fi + fi +} + +write_env_script_sh() { + # write this env script to the given path (this cat/EOF stuff is a "heredoc" string) + local _install_dir_expr="$1" + local _env_script_path="$2" + ensure cat < "$_env_script_path" +#!/bin/sh +# add binaries to PATH if they aren't added yet +# affix colons on either side of \$PATH to simplify matching +case ":\${PATH}:" in + *:"$_install_dir_expr":*) + ;; + *) + # Prepending path in case a system-installed binary needs to be overridden + export PATH="$_install_dir_expr:\$PATH" + ;; +esac +EOF +} + +write_env_script_fish() { + # write this env script to the given path (this cat/EOF stuff is a "heredoc" string) + local _install_dir_expr="$1" + local _env_script_path="$2" + ensure cat < "$_env_script_path" +if not contains "$_install_dir_expr" \$PATH + # Prepending path in case a system-installed binary needs to be overridden + set -x PATH "$_install_dir_expr" \$PATH +end +EOF +} + +get_current_exe() { + # Returns the executable used for system architecture detection + # This is only run on Linux + local _current_exe + if test -L /proc/self/exe ; then + _current_exe=/proc/self/exe + else + warn "Unable to find /proc/self/exe. System architecture detection might be inaccurate." + if test -n "$SHELL" ; then + _current_exe=$SHELL + else + need_cmd /bin/sh + _current_exe=/bin/sh + fi + warn "Falling back to $_current_exe." + fi + echo "$_current_exe" +} + +get_bitness() { + need_cmd head + # Architecture detection without dependencies beyond coreutils. + # ELF files start out "\x7fELF", and the following byte is + # 0x01 for 32-bit and + # 0x02 for 64-bit. + # The printf builtin on some shells like dash only supports octal + # escape sequences, so we use those. + local _current_exe=$1 + local _current_exe_head + _current_exe_head=$(head -c 5 "$_current_exe") + if [ "$_current_exe_head" = "$(printf '\177ELF\001')" ]; then + echo 32 + elif [ "$_current_exe_head" = "$(printf '\177ELF\002')" ]; then + echo 64 + else + err "unknown platform bitness" + fi +} + +is_host_amd64_elf() { + local _current_exe=$1 + + need_cmd head + need_cmd tail + # ELF e_machine detection without dependencies beyond coreutils. + # Two-byte field at offset 0x12 indicates the CPU, + # but we're interested in it being 0x3E to indicate amd64, or not that. + local _current_exe_machine + _current_exe_machine=$(head -c 19 "$_current_exe" | tail -c 1) + [ "$_current_exe_machine" = "$(printf '\076')" ] +} + +get_endianness() { + local _current_exe=$1 + local cputype=$2 + local suffix_eb=$3 + local suffix_el=$4 + + # detect endianness without od/hexdump, like get_bitness() does. + need_cmd head + need_cmd tail + + local _current_exe_endianness + _current_exe_endianness="$(head -c 6 "$_current_exe" | tail -c 1)" + if [ "$_current_exe_endianness" = "$(printf '\001')" ]; then + echo "${cputype}${suffix_el}" + elif [ "$_current_exe_endianness" = "$(printf '\002')" ]; then + echo "${cputype}${suffix_eb}" + else + err "unknown platform endianness" + fi +} + +# Detect the Linux/LoongArch UAPI flavor, with all errors being non-fatal. +# Returns 0 or 234 in case of successful detection, 1 otherwise (/tmp being +# noexec, or other causes). +check_loongarch_uapi() { + need_cmd base64 + + local _tmp + if ! _tmp="$(ensure mktemp)"; then + return 1 + fi + + # Minimal Linux/LoongArch UAPI detection, exiting with 0 in case of + # upstream ("new world") UAPI, and 234 (-EINVAL truncated) in case of + # old-world (as deployed on several early commercial Linux distributions + # for LoongArch). + # + # See https://gist.github.com/xen0n/5ee04aaa6cecc5c7794b9a0c3b65fc7f for + # source to this helper binary. + ignore base64 -d > "$_tmp" <&1 | grep -q 'musl'; then + _clibtype="musl-dynamic" + else + # Assume all other linuxes are glibc (even if wrong, static libc fallback will apply) + _clibtype="gnu" + fi + fi + + if [ "$_ostype" = Darwin ]; then + # Darwin `uname -m` can lie due to Rosetta shenanigans. If you manage to + # invoke a native shell binary and then a native uname binary, you can + # get the real answer, but that's hard to ensure, so instead we use + # `sysctl` (which doesn't lie) to check for the actual architecture. + if [ "$_cputype" = i386 ]; then + # Handling i386 compatibility mode in older macOS versions (<10.15) + # running on x86_64-based Macs. + # Starting from 10.15, macOS explicitly bans all i386 binaries from running. + # See: + + # Avoid `sysctl: unknown oid` stderr output and/or non-zero exit code. + if sysctl hw.optional.x86_64 2> /dev/null || true | grep -q ': 1'; then + _cputype=x86_64 + fi + elif [ "$_cputype" = x86_64 ]; then + # Handling x86-64 compatibility mode (a.k.a. Rosetta 2) + # in newer macOS versions (>=11) running on arm64-based Macs. + # Rosetta 2 is built exclusively for x86-64 and cannot run i386 binaries. + + # Avoid `sysctl: unknown oid` stderr output and/or non-zero exit code. + if sysctl hw.optional.arm64 2> /dev/null || true | grep -q ': 1'; then + _cputype=arm64 + fi + fi + fi + + if [ "$_ostype" = SunOS ]; then + # Both Solaris and illumos presently announce as "SunOS" in "uname -s" + # so use "uname -o" to disambiguate. We use the full path to the + # system uname in case the user has coreutils uname first in PATH, + # which has historically sometimes printed the wrong value here. + if [ "$(/usr/bin/uname -o)" = illumos ]; then + _ostype=illumos + fi + + # illumos systems have multi-arch userlands, and "uname -m" reports the + # machine hardware name; e.g., "i86pc" on both 32- and 64-bit x86 + # systems. Check for the native (widest) instruction set on the + # running kernel: + if [ "$_cputype" = i86pc ]; then + _cputype="$(isainfo -n)" + fi + fi + + local _current_exe + case "$_ostype" in + + Android) + _ostype=linux-android + ;; + + Linux) + _current_exe=$(get_current_exe) + _ostype=unknown-linux-$_clibtype + _bitness=$(get_bitness "$_current_exe") + ;; + + FreeBSD) + _ostype=unknown-freebsd + ;; + + NetBSD) + _ostype=unknown-netbsd + ;; + + DragonFly) + _ostype=unknown-dragonfly + ;; + + Darwin) + _ostype=apple-darwin + ;; + + illumos) + _ostype=unknown-illumos + ;; + + MINGW* | MSYS* | CYGWIN* | Windows_NT) + _ostype=pc-windows-gnu + ;; + + *) + err "unrecognized OS type: $_ostype" + ;; + + esac + + case "$_cputype" in + + i386 | i486 | i686 | i786 | x86) + _cputype=i686 + ;; + + xscale | arm) + _cputype=arm + if [ "$_ostype" = "linux-android" ]; then + _ostype=linux-androideabi + fi + ;; + + armv6l) + _cputype=arm + if [ "$_ostype" = "linux-android" ]; then + _ostype=linux-androideabi + else + _ostype="${_ostype}eabihf" + fi + ;; + + armv7l | armv8l) + _cputype=armv7 + if [ "$_ostype" = "linux-android" ]; then + _ostype=linux-androideabi + else + _ostype="${_ostype}eabihf" + fi + ;; + + aarch64 | arm64) + _cputype=aarch64 + ;; + + x86_64 | x86-64 | x64 | amd64) + _cputype=x86_64 + ;; + + mips) + _cputype=$(get_endianness "$_current_exe" mips '' el) + ;; + + mips64) + if [ "$_bitness" -eq 64 ]; then + # only n64 ABI is supported for now + _ostype="${_ostype}abi64" + _cputype=$(get_endianness "$_current_exe" mips64 '' el) + fi + ;; + + ppc) + _cputype=powerpc + ;; + + ppc64) + _cputype=powerpc64 + ;; + + ppc64le) + _cputype=powerpc64le + ;; + + s390x) + _cputype=s390x + ;; + riscv64) + _cputype=riscv64gc + ;; + loongarch64) + _cputype=loongarch64 + ensure_loongarch_uapi + ;; + *) + err "unknown CPU type: $_cputype" + + esac + + # Detect 64-bit linux with 32-bit userland + if [ "${_ostype}" = unknown-linux-gnu ] && [ "${_bitness}" -eq 32 ]; then + case $_cputype in + x86_64) + # 32-bit executable for amd64 = x32 + if is_host_amd64_elf "$_current_exe"; then { + err "x32 linux unsupported" + }; else + _cputype=i686 + fi + ;; + mips64) + _cputype=$(get_endianness "$_current_exe" mips '' el) + ;; + powerpc64) + _cputype=powerpc + ;; + aarch64) + _cputype=armv7 + if [ "$_ostype" = "linux-android" ]; then + _ostype=linux-androideabi + else + _ostype="${_ostype}eabihf" + fi + ;; + riscv64gc) + err "riscv64 with 32-bit userland unsupported" + ;; + esac + fi + + # Detect armv7 but without the CPU features Rust needs in that build, + # and fall back to arm. + if [ "$_ostype" = "unknown-linux-gnueabihf" ] && [ "$_cputype" = armv7 ]; then + if ! (ensure grep '^Features' /proc/cpuinfo | grep -E -q 'neon|simd') ; then + # Either `/proc/cpuinfo` is malformed or unavailable, or + # at least one processor does not have NEON (which is asimd on armv8+). + _cputype=arm + fi + fi + + _arch="${_cputype}-${_ostype}" + + RETVAL="$_arch" +} + +say() { + if [ "0" = "$PRINT_QUIET" ]; then + echo "$1" + fi +} + +say_verbose() { + if [ "1" = "$PRINT_VERBOSE" ]; then + echo "$1" + fi +} + +warn() { + if [ "0" = "$PRINT_QUIET" ]; then + local red + local reset + red=$(tput setaf 1 2>/dev/null || echo '') + reset=$(tput sgr0 2>/dev/null || echo '') + say "${red}WARN${reset}: $1" >&2 + fi +} + +err() { + if [ "0" = "$PRINT_QUIET" ]; then + local red + local reset + red=$(tput setaf 1 2>/dev/null || echo '') + reset=$(tput sgr0 2>/dev/null || echo '') + say "${red}ERROR${reset}: $1" >&2 + fi + exit 1 +} + +need_cmd() { + if ! check_cmd "$1" + then err "need '$1' (command not found)" + fi +} + +check_cmd() { + command -v "$1" > /dev/null 2>&1 + return $? +} + +assert_nz() { + if [ -z "$1" ]; then err "assert_nz $2"; fi +} + +# Run a command that should never fail. If the command fails execution +# will immediately terminate with an error showing the failing +# command. +ensure() { + if ! "$@"; then err "command failed: $*"; fi +} + +# This is just for indicating that commands' results are being +# intentionally ignored. Usually, because it's being executed +# as part of error handling. +ignore() { + "$@" +} + +# This wraps curl or wget. Try curl first, if not installed, +# use wget instead. +downloader() { + # Check if we have a broken snap curl + # https://github.com/boukendesho/curl-snap/issues/1 + _snap_curl=0 + if command -v curl > /dev/null 2>&1; then + _curl_path=$(command -v curl) + if echo "$_curl_path" | grep "/snap/" > /dev/null 2>&1; then + _snap_curl=1 + fi + fi + + # Check if we have a working (non-snap) curl + if check_cmd curl && [ "$_snap_curl" = "0" ] + then _dld=curl + # Try wget for both no curl and the broken snap curl + elif check_cmd wget + then _dld=wget + # If we can't fall back from broken snap curl to wget, report the broken snap curl + elif [ "$_snap_curl" = "1" ] + then + say "curl installed with snap cannot be used to install $APP_NAME" + say "due to missing permissions. Please uninstall it and" + say "reinstall curl with a different package manager (e.g., apt)." + say "See https://github.com/boukendesho/curl-snap/issues/1" + exit 1 + else _dld='curl or wget' # to be used in error message of need_cmd + fi + + if [ "$1" = --check ] + then need_cmd "$_dld" + elif [ "$_dld" = curl ]; then + if [ -n "${AUTH_TOKEN:-}" ]; then + curl -sSfL --header "Authorization: Bearer ${AUTH_TOKEN}" "$1" -o "$2" + else + curl -sSfL "$1" -o "$2" + fi + elif [ "$_dld" = wget ]; then + if [ -n "${AUTH_TOKEN:-}" ]; then + wget --header "Authorization: Bearer ${AUTH_TOKEN}" "$1" -O "$2" + else + wget "$1" -O "$2" + fi + else err "Unknown downloader" # should not reach here + fi +} + +verify_checksum() { + local _file="$1" + local _checksum_style="$2" + local _checksum_value="$3" + local _calculated_checksum + + if [ -z "$_checksum_value" ]; then + return 0 + fi + case "$_checksum_style" in + sha256) + if ! check_cmd sha256sum; then + say "skipping sha256 checksum verification (it requires the 'sha256sum' command)" + return 0 + fi + _calculated_checksum="$(sha256sum -b "$_file" | awk '{printf $1}')" + ;; + sha512) + if ! check_cmd sha512sum; then + say "skipping sha512 checksum verification (it requires the 'sha512sum' command)" + return 0 + fi + _calculated_checksum="$(sha512sum -b "$_file" | awk '{printf $1}')" + ;; + sha3-256) + if ! check_cmd openssl; then + say "skipping sha3-256 checksum verification (it requires the 'openssl' command)" + return 0 + fi + _calculated_checksum="$(openssl dgst -sha3-256 "$_file" | awk '{printf $NF}')" + ;; + sha3-512) + if ! check_cmd openssl; then + say "skipping sha3-512 checksum verification (it requires the 'openssl' command)" + return 0 + fi + _calculated_checksum="$(openssl dgst -sha3-512 "$_file" | awk '{printf $NF}')" + ;; + blake2s) + if ! check_cmd b2sum; then + say "skipping blake2s checksum verification (it requires the 'b2sum' command)" + return 0 + fi + # Test if we have official b2sum with blake2s support + local _well_known_blake2s_checksum="93314a61f470985a40f8da62df10ba0546dc5216e1d45847bf1dbaa42a0e97af" + local _test_blake2s + _test_blake2s="$(printf "can do blake2s" | b2sum -a blake2s | awk '{printf $1}')" || _test_blake2s="" + + if [ "X$_test_blake2s" = "X$_well_known_blake2s_checksum" ]; then + _calculated_checksum="$(b2sum -a blake2s "$_file" | awk '{printf $1}')" || _calculated_checksum="" + else + say "skipping blake2s checksum verification (installed b2sum doesn't support blake2s)" + return 0 + fi + ;; + blake2b) + if ! check_cmd b2sum; then + say "skipping blake2b checksum verification (it requires the 'b2sum' command)" + return 0 + fi + _calculated_checksum="$(b2sum "$_file" | awk '{printf $1}')" + ;; + false) + ;; + *) + say "skipping unknown checksum style: $_checksum_style" + return 0 + ;; + esac + + if [ "$_calculated_checksum" != "$_checksum_value" ]; then + err "checksum mismatch + want: $_checksum_value + got: $_calculated_checksum" + fi +} + +download_binary_and_run_installer "$@" || exit 1 diff --git a/pyproject.toml b/pyproject.toml index 67940718..8e20c8c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,11 +61,20 @@ flash_attn = [ "flash-attn==2.8.1" ] -doc = [ - "jupyter-book>=1.0.4.post1,<2.0.0", - "furo>=2025.7.19", +docs = [ + "mkdocs", + "mkdocs-autorefs", + "mkdocs-get-deps", + "mkdocstrings-python", + "mkdocs-shadcn", + "mkdocstrings", ] +# To build and serve docs, run: +# uv pip install -e .[docs] +# mkdocs serve -a 127.0.0.1:8080 + + [project.scripts] ajet = "ajet.launcher:main" From 0a9a21373326ddc4f44888c9dc9c93a436bfd76e Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Fri, 9 Jan 2026 17:44:08 +0800 Subject: [PATCH 399/462] feat: add finworld support and improve environment configuration - Add --with-finworld launch option for FinWorld service - Add --skip-check-avail-gpu flag to optionally bypass GPU checks - Update load_dotenv to not override existing environment variables - Add finance and API-related environment variables to runtime env - Improve PTY UTF-8 decoding error handling with 'replace' mode - Increase PTY launch wait time from 1800s to 3600s for stability - Add type hints for env_dict parameter in pty_wrapper --- ajet/launcher.py | 17 ++++++++++++++--- ajet/utils/core_env_vars.py | 7 +++++++ ajet/utils/pty.py | 7 ++++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/ajet/launcher.py b/ajet/launcher.py index 0b7ea94b..023b520f 100644 --- a/ajet/launcher.py +++ b/ajet/launcher.py @@ -16,7 +16,8 @@ from ajet.utils.pty import pty_launch set_loguru_default_color() -load_dotenv() +# load_dotenv() +load_dotenv(override=False) def parse_args(): @@ -59,6 +60,12 @@ def parse_args(): default=False, help="Launch appworld", ) + parser.add_argument( + "--with-finworld", + action="store_true", + default=False, + help="Launch finworld", + ) parser.add_argument( "--with-webshop", action="store_true", @@ -247,8 +254,9 @@ def main(): args = parse_args() # Enforce GPU availability and free memory threshold before proceeding - if (args.backbone != "debug") and (not args.kill) and (not args.autokill): - check_avail_gpu(min_free_ratio=0.95) + if not args.skip_check_avail_gpu: + if (args.backbone != "debug") and (not args.kill) and (not args.autokill): + check_avail_gpu(min_free_ratio=0.95) if args.autokill: args.kill = "ray|vllm|VLLM|python" @@ -295,6 +303,9 @@ def main(): if args.with_appworld: pty_launch("appworld") + if args.with_finworld: + pty_launch("finworld") + if args.with_crafters: pty_launch("crafters") diff --git a/ajet/utils/core_env_vars.py b/ajet/utils/core_env_vars.py index 6c96358e..d134b568 100644 --- a/ajet/utils/core_env_vars.py +++ b/ajet/utils/core_env_vars.py @@ -40,6 +40,13 @@ def get_runtime_env(is_trinity: bool = False) -> dict: "AJET_GIT_HASH", "AJET_REQ_TXT", "AJET_BENCHMARK_NAME", + "FINANCE_MCP_URL", + # API Keys for RM Gallery and other services + "DASHSCOPE_API_KEY", + "OPENAI_API_KEY", + "OPENAI_BASE_URL", + "API_KEY", + "BASE_URL", ] for var in optional_env_vars: diff --git a/ajet/utils/pty.py b/ajet/utils/pty.py index a2124775..6d859ae1 100644 --- a/ajet/utils/pty.py +++ b/ajet/utils/pty.py @@ -40,7 +40,8 @@ def master_read(fd): # log_f.write(data.decode()) # log_f.flush() # Also print to stdout (optional) - print(data.decode(), end="") + # Use errors='replace' to handle incomplete UTF-8 sequences + print(data.decode(errors='replace'), end="") return data # Define stdin read callback @@ -85,7 +86,7 @@ def base64_to_string(b): def pty_wrapper( cmd: list[str], dir: str, - env_dict: dict = {}, + env_dict: dict[str, str] = {}, ): run_command_with_pty(cmd, working_dir=dir, env_dict=env_dict) @@ -109,7 +110,7 @@ def pty_launch(service_name: str, success_std_string="Starting server on"): use_pty=True, ) companion.launch( - launch_wait_time=1800, + launch_wait_time=3600, success_std_string=success_std_string, ) From 96b5071fa66bc74125b9295f5cc75f827c3821ef Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Fri, 9 Jan 2026 17:49:04 +0800 Subject: [PATCH 400/462] chore(finworld): Updated the main query in ResourceKeeper to synchronize with the actual environment query. --- ajet/task_rollout/resource_keeper.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/ajet/task_rollout/resource_keeper.py b/ajet/task_rollout/resource_keeper.py index d7eb3667..86c1b985 100644 --- a/ajet/task_rollout/resource_keeper.py +++ b/ajet/task_rollout/resource_keeper.py @@ -85,7 +85,9 @@ def _initialize_environment_and_messages(self) -> List[dict]: params=self.env_params, ) state_message: dict = init_response["state"] - _, init_messages = self._get_init_messages(state_message) + query, init_messages = self._get_init_messages(state_message) + # Update main_query with actual query from environment + self.workflow_task.task.main_query = query except Exception as e: logger.bind(exception=True).exception( f"encounter exception in env_worker.create_instance~ error={e.args}" @@ -175,12 +177,18 @@ def step(self, action: dict) -> Tuple[str, float, bool, dict]: ) obs = "" assert isinstance(env_output, dict) - if ("content" not in env_output["state"]) and ("error" in env_output["state"]): - obs = f"[Error from environment: {env_output['error']}]" - elif env_output["state"]["content"] == "": - obs = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." + # === Support list-type state passthrough === + # 1. If state is a list (new standard format), pass through directly + if isinstance(env_output["state"], list): + obs = env_output["state"] + # 2. If state is a dict (old format or error) else: - obs = env_output["state"]["content"] + if ("content" not in env_output["state"]) and ("error" in env_output["state"]): + obs = f"[Error from environment: {env_output['error']}]" + elif env_output["state"].get("content", "") == "": + obs = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." + else: + obs = env_output["state"]["content"] reward = 0 info = {} terminate = env_output["is_terminated"] From 697bc5b83f9aa1c8d1183b5388a6a57da321a15e Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Fri, 9 Jan 2026 17:54:55 +0800 Subject: [PATCH 401/462] feat(context_tracker): Initialize workflow_metadata to store tool statistics --- ajet/context_tracker/base_tracker.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ajet/context_tracker/base_tracker.py b/ajet/context_tracker/base_tracker.py index c9244d7b..fd5aa0d1 100644 --- a/ajet/context_tracker/base_tracker.py +++ b/ajet/context_tracker/base_tracker.py @@ -1,4 +1,5 @@ from typing import List, Tuple, Union +from typing import List, Union, Tuple, Dict, Optional, Any from ajet.schema.extended_msg import ( INVALID_LOG_PROB_VALUE, @@ -135,6 +136,7 @@ def __init__(self, config, tokenizer, **kwargs): self.already_mad_flag: bool = False self.round_cnt = 0 self.generation_prompt_token = None + self.workflow_metadata: Optional[Dict[str, Any]] = None # 初始化 workflow_metadata 以存储工具统计信息 assert ( self.config.ajet.data.max_prompt_length From d05496a693560bb373f6b3574d84da1fa8161ed1 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 9 Jan 2026 17:16:55 +0800 Subject: [PATCH 402/462] fix: bugs --- ajet/__init__.py | 2 -- ajet/launcher.py | 6 ------ ajet/utils/launch_utils.py | 2 +- pyproject.toml | 3 ++- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/ajet/__init__.py b/ajet/__init__.py index 98c360dc..1342fd76 100644 --- a/ajet/__init__.py +++ b/ajet/__init__.py @@ -2,7 +2,6 @@ from ajet.schema.task import WorkflowOutput, WorkflowTask from ajet.tuner import AjetTuner from ajet.workflow import Workflow -from ajet.utils.vsdb import vscode_conditional_breakpoint as bp __all__ = [ "Workflow", @@ -10,7 +9,6 @@ "WorkflowOutput", "AjetTuner", "AgentJetJob", - "bp", ] __version__ = "0.1.0" diff --git a/ajet/launcher.py b/ajet/launcher.py index 0b7ea94b..a642c793 100644 --- a/ajet/launcher.py +++ b/ajet/launcher.py @@ -5,7 +5,6 @@ from dotenv import load_dotenv from loguru import logger -from ajet.utils.cleaner import fast_kill_by_keyword_bash from ajet.utils.config_utils import prepare_experiment_config from ajet.utils.launch_utils import ( execute_training_process, @@ -258,11 +257,6 @@ def main(): logger.info(f"Killing processes matching keywords: {args.kill}") for keyword in args.kill.split("|"): logger.info(f"Killing processes matching keyword: {keyword}") - killed_pids = fast_kill_by_keyword_bash(keyword) - if killed_pids: - logger.success(f"Successfully killed processes with PIDs: {killed_pids}") - else: - logger.warning(f"No processes found matching keyword: {keyword}") if not args.conf: return diff --git a/ajet/utils/launch_utils.py b/ajet/utils/launch_utils.py index 7cd1a465..972324e7 100644 --- a/ajet/utils/launch_utils.py +++ b/ajet/utils/launch_utils.py @@ -144,7 +144,7 @@ def verify_python_env(args, exp_config): time.sleep(5) raise ImportError(cause + " " + solution) elif args.backbone == "verl": - if not any([v in verl.__version__ for v in ["0.5.0.post", "0.7.0.post"]]): # you must install via `pip install -e .[verl]` to get every dependency right + if not any([v in verl.__version__ for v in ["0.5.0.post", "0.5.0.dev", "0.7.0.post"]]): # you must install via `pip install -e .[verl]` to get every dependency right cause = "Python environment does not match current backbone 'verl'." solution = "Please `cd /path/to/project/AgentJet` and run `(uv) pip install -e .[verl]` to install the correct environment." print_dict( diff --git a/pyproject.toml b/pyproject.toml index 8e20c8c4..a5360c2c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,6 +51,7 @@ dev = [ "mypy>=1.7.0", "pytest>=8.0.0", "pytest-json-ctrf", + "langchain>=1.2.3", ] reward = [ @@ -112,4 +113,4 @@ known_third_party = ["wandb"] [project.urls] -"Homepage" = "https://github.com/modelscope/AgentJet" +"Homepage" = "https://github.com/modelscope/AgentJet" \ No newline at end of file From 35025aa5ce199f631ccf4ac4bac3c65f59460fc5 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 9 Jan 2026 17:17:31 +0800 Subject: [PATCH 403/462] feat: introduce naive langchain examples --- .../example_learn2ask/learn2ask_langchain.py | 201 ++++++++++++++++++ tutorial/example_math_agent/math_agent.yaml | 4 +- .../math_agent_langchain.py | 61 ++++++ 3 files changed, 264 insertions(+), 2 deletions(-) create mode 100644 tutorial/example_learn2ask/learn2ask_langchain.py create mode 100644 tutorial/example_math_agent/math_agent_langchain.py diff --git a/tutorial/example_learn2ask/learn2ask_langchain.py b/tutorial/example_learn2ask/learn2ask_langchain.py new file mode 100644 index 00000000..e8e66bd1 --- /dev/null +++ b/tutorial/example_learn2ask/learn2ask_langchain.py @@ -0,0 +1,201 @@ + +import re +import time +import asyncio +import threading + +from agentscope.message import Msg +from loguru import logger + +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask +from ajet.utils.robust_dashscope import RobustDashScopeChatModel + +system_prompt = """# Task +You are a medical assistant. Your task is to understand the ongoing conversation and continue the medical inquiry in English. + +## Guidelines +- Each response must contain exactly one clear and concise medical question with 2 to 3 answer choices. +- Do not repeat any previous question. +- Your response must be a single sentence. +- If enough information has been gathered to make a medication suggestion, output only: +""" + +reward_prompt = """# Task +You are an evaluation assistant. The user will provide a dialogue history between a doctor and a patient. You must analyze the dialogue and evaluate the doctor's last message. + +# Grading Policy +## Format Score +- 1.0: The doctor's last message contains exactly **one question**. +- 0.5: The doctor's last message contains **two questions**. +- 0.0: The doctor's last message contains **three or more questions**. + +## Content Score +Reference Information contains the information that the doctor has not known. + +- 1.0: The question(s) **directly ask about** item in the Reference Information. +- 0.1: The question(s) are a general type of question that could be asked for any symptoms. +- 0.0: The question(s) are **irrelevant** to all items in the Reference Information. + +### You should + +- ONLY if the doctor asks a question that helps to collect information and diagnose the patient, it is a good question. +- A ambiguous question should get 0. + - For example, the doctor asks "How long have you been feeling this way?", but "this way" is not clear in the previous messages. + - For example, the doctor asks "Do you feel bad?". This is a meaningless question that does not provide any useful information. + +# Reference Information + +{} + +# Output Format +Explain your reasoning for the format and content scores clearly and concisely. +Insert only the format score as a float (e.g., 1.0, 0.5, 0.0) +Insert only the content score as a float (e.g., 1.0, 0.5, 0.0) + +> ✅ Important: +> - Output **exactly** the three tags shown above. +> - Do **not** include any additional text, explanation, or formatting outside the tags. +> - Scores must be based **only** on the doctor's **last message** and the provided Reference Information. +> - Ensure clarity and precision in your evaluation reasoning within the `` tag. +""" + + +llm = RobustDashScopeChatModel("qwen-plus", stream=False) + + +async def llm_reward(init_messages: list[Msg], response: str, truth_info: str): + def format_messages(messages: list[Msg]) -> str: + result_str = "" + for msg in messages: + if msg.role == "user": + result_str += f"patient: {msg.content}\n" + if msg.role == "assistant": + result_str += f"doctor: {msg.content}\n" + return result_str + + def parse_tag_string(text: str): + pattern = r"<(\w+)>(.*?)" + matches = re.findall(pattern, text) + result = {} + for tag, value in matches: + result[tag] = value + return result + + history = format_messages([] + init_messages + [Msg("assistant", response, role="assistant")]) + messages = [ + {"role": "system", "content": reward_prompt.format(truth_info)}, + {"role": "user", "content": history}, + ] + + try_count, max_retries = 0, 5 + while try_count <= max_retries: + try: + + async def get_content(): + from agentscope.model import ChatResponse + + response = await llm(messages) + + if isinstance(response, ChatResponse): + res = "".join([x["text"] for x in response.content if "text" in x]) + else: + res = "" + async for chunk in response: + res += "".join([x["text"] for x in chunk.content if "text" in x]) + return res + + content = await get_content() + score_dict = parse_tag_string(content) + return score_dict + except Exception as e: + if try_count > max_retries: + logger.warning("retried too many times, abort task.") + return None + else: + logger.warning(f"error: {e}, response:{response}, retrying...") + time.sleep(2**try_count) + + +async def reward_fn(init_messages: list[Msg], response: str, truth_action: str, truth_info: str): + """ + content_score: R_a, the reward for response quality + action_score: R_s, the reward for decision correctness + format_score: P, the reward for response format + """ + + action_response = "stop" if "" in response else "continue" + if truth_action == action_response: + action_score = 1.0 + if truth_action == "continue": + score_dict = await llm_reward(init_messages, response, truth_info) + if score_dict is not None: + format_score = float(score_dict.get("format_score", 0.0)) + content_score = float(score_dict.get("content_score", 0.0)) + else: + format_score, content_score = 0.0, 0.0 + else: + content_score = 1.0 + format_score = 1.0 if response == "" else 0.0 + else: + action_score, format_score, content_score = 0.0, 0.0, 0.0 + + # treat as self.train_mode == "Ra+Rs", the default setting + final_reward = action_score * (1 + 2 * content_score) + format_score + + return final_reward + + +_reward_semaphore = threading.Semaphore(16) + +async def reward_fn_with_semaphore(*args, **kwargs): + + get_sem_ok = False + while not get_sem_ok: + get_sem_ok = _reward_semaphore.acquire(blocking=False) + if not get_sem_ok: + await asyncio.sleep(1) + + try: + fn_result = await reward_fn(*args, **kwargs) + finally: + _reward_semaphore.release() + + return fn_result + + +class ExampleLearn2Ask(Workflow): + name: str = "math_agent_workflow" + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + + messages = workflow_task.task.init_messages + assert isinstance(messages, list) + truth_action = workflow_task.task.metadata["decision_truth"] or "continue" + truth_info = workflow_task.task.metadata["info_truth"] + + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=tuner.as_agentscope_model(), + formatter=DashScopeChatFormatter(), + toolkit=None, + memory=InMemoryMemory(), + max_iters=1, + ) + self.agent.set_console_output_enabled(False) + msg = [ + # Msg("system", system_prompt, role="system"), + *[Msg(name=x["role"], content=x["content"], role=x["role"]) for x in messages] + ] + result = await self.agent.reply(msg) + if isinstance(result.content, str): + response = result.content + elif isinstance(result.content, list): + response = result.content[0]["text"] # type: ignore + else: + raise NotImplementedError(f"do not know how to handle {type(result.content)}") + reward = await reward_fn_with_semaphore(msg, response, truth_action, truth_info) + return WorkflowOutput(reward=reward) diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index fccb8430..0c683e3c 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,10 +15,10 @@ ajet: model: # ✨✨✨✨ 设置待训练的模型 - path: Qwen/Qwen2.5-7B + path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct rollout: - user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + user_workflow: "tutorial.example_math_agent.math_agent_langchain->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 1.0 max_env_worker: 64 num_repeat: 6 diff --git a/tutorial/example_math_agent/math_agent_langchain.py b/tutorial/example_math_agent/math_agent_langchain.py new file mode 100644 index 00000000..92c51625 --- /dev/null +++ b/tutorial/example_math_agent/math_agent_langchain.py @@ -0,0 +1,61 @@ +from loguru import logger +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask +from openai.types.chat.chat_completion import ChatCompletion +from openai.types.chat import ChatCompletionMessageToolCall +from textwrap import dedent + +import json +import asyncio +import requests +from langchain.agents import create_agent + + +# ------------------------------------------------------ +# Simple version - no tool call +# ------------------------------------------------------ + + +class ExampleMathLearn(Workflow): + + name: str = "math_agent_workflow" + system_prompt: str = dedent(""" + You are an agent specialized in solving math problems. + Please solve the math problem given to you. + You can write and execute Python code to perform calculation or verify your answer. + You should return your final answer within \\boxed{{}}. + """) + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore + # tuner to api key + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key + + from langchain_openai import ChatOpenAI + llm=ChatOpenAI( + base_url=base_url, + api_key=lambda:api_key, + ) + agent=create_agent( + model=llm, + system_prompt=self.system_prompt, + ) + + # take out query + query = workflow_task.task.main_query + + response = agent.invoke({ + "messages": [ + { + "role": "system", + "content": self.system_prompt + }, + { + "role": "user", + "content": query + } + ], + }) + + final_answer = response['choices'][0]['message']['content'] + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) \ No newline at end of file From 8b5f090d82c5b0740baf649eae73b39c556a3454 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 9 Jan 2026 18:25:09 +0800 Subject: [PATCH 404/462] fix: message format in agent langchain implementation --- tutorial/example_math_agent/math_agent_langchain.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tutorial/example_math_agent/math_agent_langchain.py b/tutorial/example_math_agent/math_agent_langchain.py index 92c51625..c47fc355 100644 --- a/tutorial/example_math_agent/math_agent_langchain.py +++ b/tutorial/example_math_agent/math_agent_langchain.py @@ -46,10 +46,6 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl response = agent.invoke({ "messages": [ - { - "role": "system", - "content": self.system_prompt - }, { "role": "user", "content": query @@ -57,5 +53,5 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl ], }) - final_answer = response['choices'][0]['message']['content'] + final_answer = response['messages'][-1].content return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) \ No newline at end of file From bb8edfe967d2ca7e0c0c83b2ad3c221138ed19c3 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 9 Jan 2026 18:25:44 +0800 Subject: [PATCH 405/462] feat: new implementation migrating learn2ask example from AgentScope to LangChain --- .../example_learn2ask/learn2ask_langchain.py | 60 +++++++++---------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/tutorial/example_learn2ask/learn2ask_langchain.py b/tutorial/example_learn2ask/learn2ask_langchain.py index e8e66bd1..d728ac64 100644 --- a/tutorial/example_learn2ask/learn2ask_langchain.py +++ b/tutorial/example_learn2ask/learn2ask_langchain.py @@ -63,14 +63,14 @@ llm = RobustDashScopeChatModel("qwen-plus", stream=False) -async def llm_reward(init_messages: list[Msg], response: str, truth_info: str): - def format_messages(messages: list[Msg]) -> str: +async def llm_reward(init_messages: list[dict], response: str, truth_info: str): + def format_messages(messages: list[dict]) -> str: result_str = "" for msg in messages: - if msg.role == "user": - result_str += f"patient: {msg.content}\n" - if msg.role == "assistant": - result_str += f"doctor: {msg.content}\n" + if msg["role"] == "user": + result_str += f"patient: {msg['content']}\n" + if msg["role"] == "assistant": + result_str += f"doctor: {msg['content']}\n" return result_str def parse_tag_string(text: str): @@ -81,7 +81,7 @@ def parse_tag_string(text: str): result[tag] = value return result - history = format_messages([] + init_messages + [Msg("assistant", response, role="assistant")]) + history = format_messages([] + init_messages + [{"role": "assistant", "content": response}]) messages = [ {"role": "system", "content": reward_prompt.format(truth_info)}, {"role": "user", "content": history}, @@ -116,7 +116,7 @@ async def get_content(): time.sleep(2**try_count) -async def reward_fn(init_messages: list[Msg], response: str, truth_action: str, truth_info: str): +async def reward_fn(init_messages: list[dict], response: str, truth_action: str, truth_info: str): """ content_score: R_a, the reward for response quality action_score: R_s, the reward for decision correctness @@ -167,35 +167,33 @@ class ExampleLearn2Ask(Workflow): name: str = "math_agent_workflow" async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - from agentscope.agent import ReActAgent - from agentscope.formatter import DashScopeChatFormatter - from agentscope.memory import InMemoryMemory + from langchain_openai import ChatOpenAI + from langchain.agents import create_agent messages = workflow_task.task.init_messages assert isinstance(messages, list) truth_action = workflow_task.task.metadata["decision_truth"] or "continue" truth_info = workflow_task.task.metadata["info_truth"] - - self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=tuner.as_agentscope_model(), - formatter=DashScopeChatFormatter(), - toolkit=None, - memory=InMemoryMemory(), - max_iters=1, + + llm_info=tuner.as_oai_baseurl_apikey() + + llm=ChatOpenAI( + base_url=llm_info.base_url, + api_key=lambda:llm_info.api_key, + ) + + agent=create_agent( + model=llm, + system_prompt=system_prompt, ) - self.agent.set_console_output_enabled(False) - msg = [ - # Msg("system", system_prompt, role="system"), - *[Msg(name=x["role"], content=x["content"], role=x["role"]) for x in messages] + + msg=[ + {"role": x["role"], "content": x["content"]} for x in messages ] - result = await self.agent.reply(msg) - if isinstance(result.content, str): - response = result.content - elif isinstance(result.content, list): - response = result.content[0]["text"] # type: ignore - else: - raise NotImplementedError(f"do not know how to handle {type(result.content)}") + result = agent.invoke({ + "messages": msg, # type: ignore + }) + + response = result["messages"][-1].content reward = await reward_fn_with_semaphore(msg, response, truth_action, truth_info) return WorkflowOutput(reward=reward) From 0347c8087d13d80998744770fe8ec242a75e683f Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 9 Jan 2026 18:33:41 +0800 Subject: [PATCH 406/462] fix: restore original code --- ajet/__init__.py | 2 ++ ajet/launcher.py | 6 ++++++ tutorial/example_math_agent/math_agent.yaml | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ajet/__init__.py b/ajet/__init__.py index 1342fd76..b0731e74 100644 --- a/ajet/__init__.py +++ b/ajet/__init__.py @@ -2,6 +2,7 @@ from ajet.schema.task import WorkflowOutput, WorkflowTask from ajet.tuner import AjetTuner from ajet.workflow import Workflow +from ajet.utils.vsdb import vscode_conditional_breakpoint as bp __all__ = [ "Workflow", @@ -9,6 +10,7 @@ "WorkflowOutput", "AjetTuner", "AgentJetJob", + "bp" ] __version__ = "0.1.0" diff --git a/ajet/launcher.py b/ajet/launcher.py index a642c793..0b7ea94b 100644 --- a/ajet/launcher.py +++ b/ajet/launcher.py @@ -5,6 +5,7 @@ from dotenv import load_dotenv from loguru import logger +from ajet.utils.cleaner import fast_kill_by_keyword_bash from ajet.utils.config_utils import prepare_experiment_config from ajet.utils.launch_utils import ( execute_training_process, @@ -257,6 +258,11 @@ def main(): logger.info(f"Killing processes matching keywords: {args.kill}") for keyword in args.kill.split("|"): logger.info(f"Killing processes matching keyword: {keyword}") + killed_pids = fast_kill_by_keyword_bash(keyword) + if killed_pids: + logger.success(f"Successfully killed processes with PIDs: {killed_pids}") + else: + logger.warning(f"No processes found matching keyword: {keyword}") if not args.conf: return diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index 0c683e3c..fccb8430 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -15,10 +15,10 @@ ajet: model: # ✨✨✨✨ 设置待训练的模型 - path: /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2.5-7B-Instruct + path: Qwen/Qwen2.5-7B rollout: - user_workflow: "tutorial.example_math_agent.math_agent_langchain->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent temperature: 1.0 max_env_worker: 64 num_repeat: 6 From cccc13f2f05e2083449278cfd4a68b36756a84cb Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Fri, 9 Jan 2026 19:47:41 +0800 Subject: [PATCH 407/462] feat: add message format converter and improve tool call handling - Add msg_converter.py for bidirectional OpenAI<->AgentScope format conversion - Support tool_call_id in basic_tracker context serialization - Update multiagent_tracking to use msg_converter utilities - Update schema comments to English - Improve workflow_metadata documentation in base_tracker --- ajet/context_tracker/base_tracker.py | 2 +- ajet/context_tracker/basic_tracker.py | 2 + ajet/context_tracker/multiagent_tracking.py | 83 +++-- ajet/schema/extended_msg.py | 4 + ajet/utils/msg_converter.py | 330 ++++++++++++++++++++ 5 files changed, 402 insertions(+), 19 deletions(-) create mode 100644 ajet/utils/msg_converter.py diff --git a/ajet/context_tracker/base_tracker.py b/ajet/context_tracker/base_tracker.py index fd5aa0d1..4e14f595 100644 --- a/ajet/context_tracker/base_tracker.py +++ b/ajet/context_tracker/base_tracker.py @@ -136,7 +136,7 @@ def __init__(self, config, tokenizer, **kwargs): self.already_mad_flag: bool = False self.round_cnt = 0 self.generation_prompt_token = None - self.workflow_metadata: Optional[Dict[str, Any]] = None # 初始化 workflow_metadata 以存储工具统计信息 + self.workflow_metadata: Optional[Dict[str, Any]] = None # Initialize workflow_metadata to store tool statistics assert ( self.config.ajet.data.max_prompt_length diff --git a/ajet/context_tracker/basic_tracker.py b/ajet/context_tracker/basic_tracker.py index 9ccf2c62..0ffe2ceb 100644 --- a/ajet/context_tracker/basic_tracker.py +++ b/ajet/context_tracker/basic_tracker.py @@ -192,6 +192,8 @@ def to_role_content(self, ext_msg_array: List[ExtendedMessage]) -> List: } if ext_msg.tool_calls: d.update({"tool_calls": ext_msg.tool_calls}) + if ext_msg.tool_call_id: + d.update({"tool_call_id": ext_msg.tool_call_id}) result.append(d) return result diff --git a/ajet/context_tracker/multiagent_tracking.py b/ajet/context_tracker/multiagent_tracking.py index fce83a91..355a7726 100644 --- a/ajet/context_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/multiagent_tracking.py @@ -20,7 +20,15 @@ from ajet.utils.color_hsl import adjust_color_hsl from ajet.utils.compute_madness import compute_string_madness from ajet.utils.tokenizer import ajet_apply_chat_template - +# +from ajet.utils.msg_converter import ( + convert_grouped_steps_to_openai_format, + convert_ext_msg_to_openai_format, + agentscope_to_openai, + openai_to_agentscope, + agentscope_to_openai_grouped, + openai_to_agentscope_grouped, +) @dataclass class TimelineMergingPolicyConfig: timeline_compare_level: str = "text" @@ -101,27 +109,43 @@ def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_to author = "env" ignore = False str_content = "" - - # fix msg content - if msg["content"] is None: - msg["content"] = "" - elif isinstance(msg["content"], list): - for item in msg["content"]: - if "text" not in item: - logger.warning( - f"Non-text content in message content detected: {item}. Ignoring." - ) - ignore = True - break + extracted_tool_call_id = "" + for item_idx, item in enumerate(msg["content"]): + if isinstance(item, dict) and item.get("type") == "tool_result": + is_tool_result_msg = True # 标记为 tool_result 消息 + # Extract tool_call_id from the tool_result block + if item.get("id"): + extracted_tool_call_id = item.get("id", "") + output = item.get("output", "") + if isinstance(output, str): + str_content += output + elif isinstance(output, list): + # output can be List[TextBlock | ImageBlock | AudioBlock] + for out_item in output: + if isinstance(out_item, str): + str_content += out_item + elif isinstance(out_item, dict) and "text" in out_item: + str_content += str(out_item["text"]) + else: + str_content += str(output) + elif isinstance(item, dict) and "text" in item: if isinstance(item["text"], str): str_content += str(item["text"]) else: str_content = "" - msg["content"] = str_content - else: - raise ValueError( - f"Unsupported non-str message content type: {type(msg['content'])}, Message:\n {msg}" - ) + else: + logger.warning( + f"Non-text content in message content detected: {item}. Ignoring." + ) + ignore = True + break + msg["content"] = str_content + msg["tool_call_id"] = extracted_tool_call_id # Store extracted tool_call_id + + # ★ 关键修复:如果是 tool_result 消息,将 role 恢复为 "tool"(OpenAI 格式) + if is_tool_result_msg and extracted_tool_call_id: + msg["role"] = "tool" + if ignore: continue @@ -143,6 +167,7 @@ def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_to tokenizer=self.tokenizer, tools=tools, tool_calls=(msg["tool_calls"] if "tool_calls" in msg else []), + tool_call_id=(msg["tool_call_id"] if "tool_call_id" in msg else ""), token_generator="auto", first_message=(i == 0), ) @@ -580,3 +605,25 @@ def check_context_token_num_safe( else: ret = (False, token_overflow, "token_overflow") return ret + + def get_grouped_steps_openai_format(self) -> List[List[Dict[str, Any]]]: + """ + 将 grouped_steps 转换为 OpenAI 格式并返回。 + + Returns: + OpenAI 格式的轨迹数据 (List of List of dict) + 每条消息格式如: + - {"role": "assistant", "content": "...", "tool_calls": [...]} + - {"role": "tool", "content": "...", "tool_call_id": "call_xxx"} + - {"role": "user/system", "content": "..."} + """ + return convert_grouped_steps_to_openai_format(self.grouped_steps) + + def get_full_context_openai_format(self) -> List[Dict[str, Any]]: + """ + 将当前 full_context 转换为 OpenAI 格式并返回。 + + Returns: + OpenAI 格式的消息列表 (List of dict) + """ + return [convert_ext_msg_to_openai_format(msg) for msg in self.full_context] diff --git a/ajet/schema/extended_msg.py b/ajet/schema/extended_msg.py index 7ed77bf8..b360f87c 100644 --- a/ajet/schema/extended_msg.py +++ b/ajet/schema/extended_msg.py @@ -72,6 +72,7 @@ def __init__( build_from_uuid="", tools=[], tool_calls=[], + tool_call_id="", token_logprob_arr=[], first_message=False, ): @@ -88,6 +89,7 @@ def __init__( self.clip = clip self.tools = tools self.tool_calls = tool_calls + self.tool_call_id = tool_call_id self.uuid = uuid.uuid4().hex self.build_from_uuid = build_from_uuid self.first_message = first_message @@ -143,6 +145,8 @@ def auto_tokenize_non_first_message(self, tokenizer, tools): } if self.tool_calls: auto_tokenize_target.update({"tool_calls": self.tool_calls}) + if self.tool_call_id: + auto_tokenize_target.update({"tool_call_id": self.tool_call_id}) text_frag_to = ajet_apply_chat_template( tokenizer=tokenizer, conversation=DUMMY_MSG + [auto_tokenize_target], diff --git a/ajet/utils/msg_converter.py b/ajet/utils/msg_converter.py new file mode 100644 index 00000000..d6a03d15 --- /dev/null +++ b/ajet/utils/msg_converter.py @@ -0,0 +1,330 @@ +""" +Message format conversion utilities + +Provides bidirectional conversion between OpenAI format and AgentScope format. +Unified for both train and val phases. + +## OpenAI format examples: +- Assistant with tool_calls: + {"role": "assistant", "content": "...", "tool_calls": [{"id": "call_xxx", "type": "function", "function": {"name": "...", "arguments": "..."}}]} +- Tool result: + {"role": "tool", "content": "...", "tool_call_id": "call_xxx"} +- Normal message: + {"role": "user/assistant/system", "content": "..."} + +## AgentScope format examples: +- Assistant with tool_calls: + {"role": "assistant", "content": [{"type": "text", "text": "..."}, {"type": "tool_use", "id": "call_xxx", "name": "...", "input": {...}}]} +- Tool result: + {"role": "user", "content": [{"type": "tool_result", "id": "call_xxx", "output": "..."}]} +- Normal message: + {"role": "user/assistant/system", "content": "..."} +""" + +import json +from typing import List, Dict, Any, Union + + +# ============================================================================= +# OpenAI -> AgentScope conversion +# ============================================================================= + +def openai_to_agentscope_single(msg: Dict[str, Any]) -> Dict[str, Any]: + """ + Convert a single OpenAI format message to AgentScope format. + + Args: + msg: Message dict in OpenAI format + + Returns: + Message dict in AgentScope format + """ + role = msg.get("role", "user") + content = msg.get("content", "") + tool_calls = msg.get("tool_calls", []) + tool_call_id = msg.get("tool_call_id", "") + + if tool_calls: + # Assistant message contains tool_calls -> convert to ToolUseBlock format + content_blocks = [] + # If there's text content, add TextBlock first + if content: + content_blocks.append({"type": "text", "text": content}) + # Convert each tool_call to ToolUseBlock + for tc in tool_calls: + func_info = tc.get("function", {}) if isinstance(tc.get("function"), dict) else {} + tool_use_block = { + "type": "tool_use", + "id": tc.get("id", ""), + "name": func_info.get("name", ""), + "input": func_info.get("arguments", "{}") + } + # Try to parse arguments as dict + if isinstance(tool_use_block["input"], str): + try: + tool_use_block["input"] = json.loads(tool_use_block["input"]) + except: + pass + content_blocks.append(tool_use_block) + return { + "name": "assistant", + "role": "assistant", + "content": content_blocks + } + + elif role == "tool" and tool_call_id: + # Tool return result -> convert to ToolResultBlock format + tool_result_block = { + "type": "tool_result", + "id": tool_call_id, + "output": content + } + return { + "name": "tool", + "role": "user", # tool_result in AgentScope is treated as user message + "content": [tool_result_block] + } + + else: + # Normal message, keep original format + return { + "name": role, + "role": role, + "content": content + } + + +def openai_to_agentscope(messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: + """ + Convert OpenAI format message list to AgentScope format. + + Args: + messages: Message list in OpenAI format + + Returns: + Message list in AgentScope format + """ + return [openai_to_agentscope_single(msg) for msg in messages] + + +def openai_to_agentscope_grouped(grouped_steps: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]: + """ + Convert grouped_steps (multi-turn conversation steps) from OpenAI format to AgentScope format. + + Args: + grouped_steps: List of List of dict in OpenAI format + + Returns: + Trajectory data in AgentScope format + """ + return [[openai_to_agentscope_single(msg) for msg in step] for step in grouped_steps] + + +# ============================================================================= +# AgentScope -> OpenAI conversion +# ============================================================================= + +def agentscope_to_openai_single(msg: Dict[str, Any]) -> Dict[str, Any]: + """ + Convert a single AgentScope format message to OpenAI format. + + Args: + msg: Message dict in AgentScope format + + Returns: + Message dict in OpenAI format + """ + role = msg.get("role", "user") + content = msg.get("content", "") + + # If content is string, return directly + if isinstance(content, str): + return { + "role": role, + "content": content + } + + # If content is list (AgentScope block format) + if isinstance(content, list): + text_parts = [] + tool_calls = [] + tool_call_id = "" + tool_output = "" + is_tool_result = False + + for item in content: + if not isinstance(item, dict): + continue + + item_type = item.get("type", "") + + if item_type == "text": + # TextBlock + text_parts.append(item.get("text", "")) + + elif item_type == "tool_use": + # ToolUseBlock -> tool_calls + arguments = item.get("input", {}) + if isinstance(arguments, dict): + arguments = json.dumps(arguments, ensure_ascii=False) + tool_calls.append({ + "id": item.get("id", ""), + "type": "function", + "function": { + "name": item.get("name", ""), + "arguments": arguments + } + }) + + elif item_type == "tool_result": + # ToolResultBlock -> tool response + is_tool_result = True + tool_call_id = item.get("id", "") + output = item.get("output", "") + if isinstance(output, str): + tool_output += output + else: + tool_output += str(output) + + # Build OpenAI format based on parsing result + if is_tool_result and tool_call_id: + return { + "role": "tool", + "content": tool_output, + "tool_call_id": tool_call_id + } + elif tool_calls: + result = { + "role": "assistant", + "content": "".join(text_parts) if text_parts else "", + "tool_calls": tool_calls + } + return result + else: + return { + "role": role, + "content": "".join(text_parts) if text_parts else "" + } + + # Otherwise, return as is + return { + "role": role, + "content": str(content) if content else "" + } + + +def agentscope_to_openai(messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: + """ + Convert AgentScope format message list to OpenAI format. + + Args: + messages: Message list in AgentScope format + + Returns: + Message list in OpenAI format + """ + return [agentscope_to_openai_single(msg) for msg in messages] + + +def agentscope_to_openai_grouped(grouped_steps: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]: + """ + Convert grouped_steps (multi-turn conversation steps) from AgentScope format to OpenAI format. + + Args: + grouped_steps: List of List of dict in AgentScope format + + Returns: + Trajectory data in OpenAI format + """ + return [[agentscope_to_openai_single(msg) for msg in step] for step in grouped_steps] + + +# ============================================================================= +# ExtendedMessage -> OpenAI conversion (backward compatible functions) +# ============================================================================= + +def convert_ext_msg_to_openai_format(ext_msg: Any) -> Dict[str, Any]: + """ + Convert a single ExtendedMessage or dict to OpenAI format message. + + Args: + ext_msg: ExtendedMessage object or dict + + Returns: + Message dict in OpenAI format + """ + # Helper function: get attribute value + def get_attr(obj, attr_name, default=None): + if hasattr(obj, attr_name): + return getattr(obj, attr_name) + elif isinstance(obj, dict): + return obj.get(attr_name, default) + return default + + # Check if there are tool_calls (assistant initiates tool call) + tool_calls = get_attr(ext_msg, 'tool_calls') + has_tool_calls = bool(tool_calls) + + # Check if there's tool_call_id (tool return result) + tool_call_id = get_attr(ext_msg, 'tool_call_id') + has_tool_call_id = bool(tool_call_id) + + # Get basic attributes + role = get_attr(ext_msg, 'role', 'user') + content = get_attr(ext_msg, 'content', '') + + if has_tool_calls: + # Assistant message contains tool_calls -> keep OpenAI format + msg_dict = { + "role": "assistant", + "content": content if content else "", + "tool_calls": tool_calls + } + elif has_tool_call_id: + # Tool return result -> use OpenAI format (role: "tool") + msg_dict = { + "role": "tool", + "content": content if content else "", + "tool_call_id": tool_call_id + } + else: + # Normal message, keep original format + msg_dict = { + "role": role, + "content": content if content else "" + } + + return msg_dict + + +def convert_grouped_steps_to_openai_format(grouped_steps: List[List[Any]]) -> List[List[Dict[str, Any]]]: + """ + Convert grouped_steps (multi-turn conversation steps) to OpenAI format. + + Args: + grouped_steps: List of List of ExtendedMessage or dict + + Returns: + Trajectory data in OpenAI format (List of List of dict) + """ + formatted_traj = [] + for context in grouped_steps: + step_msgs = [] + for ext_msg in context: + msg_dict = convert_ext_msg_to_openai_format(ext_msg) + step_msgs.append(msg_dict) + formatted_traj.append(step_msgs) + return formatted_traj + + +def convert_flat_messages_to_openai_format(messages: List[Any]) -> List[Dict[str, Any]]: + """ + Convert flat message list to OpenAI format. + + Args: + messages: List of ExtendedMessage or dict + + Returns: + Message list in OpenAI format (List of dict) + """ + return [convert_ext_msg_to_openai_format(msg) for msg in messages] From f52d83e5ab6bfa1e54baf944fe073733b59ddd21 Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Fri, 9 Jan 2026 20:48:41 +0800 Subject: [PATCH 408/462] feat: add trajectory saving feature with config control - Add save_trajectory.py module with save_train_trajectory and save_eval_trajectory functions - Add save_trajectory config flag in ajet_default.yaml (default: False) - Integrate trajectory saving in trainer_verl.py for both training and evaluation - Extract and save reward_structure, workflow_metadata, and OpenAI-formatted trajectories --- ajet/backbone/trainer_verl.py | 8 +++ ajet/default_config/ajet_default.yaml | 1 + ajet/utils/save_trajectory.py | 80 +++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 ajet/utils/save_trajectory.py diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index 4978a57d..a12b8bbc 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -54,6 +54,7 @@ from ajet.schema.task import Task from ajet.task_reader import dict_to_ajet_task from ajet.task_rollout.native_parallel_worker import VerlRolloutManager +from ajet.utils.save_trajectory import save_train_trajectory, save_eval_trajectory def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | torch.Tensor: @@ -577,6 +578,9 @@ def fit(self): # noqa: C901 tasks, mode="sample", epoch=f"train.{epoch}" ) logger.info("=" * 10 + "end fit rollout" + "=" * 10) + + if self.config.ajet.trainer_common.save_trajectory: + save_train_trajectory(context_tracker_arr, self.global_steps) logger.info("begin to convert context_tracker_arr to dataproto") gen_batch_output = self.parallel_env.to_dataproto(context_tracker_arr) logger.info("end convertion") @@ -1029,6 +1033,10 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): for ctx_tracker in ctx_trackers: ctx_tracker.generate_log() + # save eval trajectories + if self.config.ajet.trainer_common.save_trajectory: + save_eval_trajectory(ctx_trackers, self.global_steps) + rewards = [ctx_tracker.reward_structure.raw_reward for ctx_tracker in ctx_trackers] num_tasks = len(task_results) assert num_tasks == len(ctx_trackers) // pass_n diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 6cf4c3f3..3b3c948a 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -235,6 +235,7 @@ ajet: val_pass_n: 4 save_freq: 20 test_freq: 20 + save_trajectory: False # whether to save train/eval trajectories to JSON files total_epochs: 50 nnodes: 1 n_gpus_per_node: 8 diff --git a/ajet/utils/save_trajectory.py b/ajet/utils/save_trajectory.py new file mode 100644 index 00000000..4dcc3172 --- /dev/null +++ b/ajet/utils/save_trajectory.py @@ -0,0 +1,80 @@ +import os +import json +from ajet.utils.msg_converter import convert_grouped_steps_to_openai_format + + +def save_train_trajectory(ctx_trackers, global_steps): + """Save training ctx_trackers to JSON files.""" + for ctx_tracker in ctx_trackers: + reward = ctx_tracker.reward_structure.raw_reward + if reward >= 1: + ctx_tracker.tag = "success" + elif reward == 0: + ctx_tracker.tag = "failure" + else: + ctx_tracker.tag = "half_success" + + # Use unified conversion function to convert grouped_steps to OpenAI format + if hasattr(ctx_tracker, 'get_grouped_steps_openai_format'): + formatted_traj = ctx_tracker.get_grouped_steps_openai_format() + else: + formatted_traj = convert_grouped_steps_to_openai_format(ctx_tracker.grouped_steps) + + traj_data = { + "task_id": ctx_tracker.task_id, + "task_tag": ctx_tracker.tag, + "reward_structure": ctx_tracker.reward_structure.model_dump(), + "traj": formatted_traj + } + # Extract reward_stats from workflow_metadata + if hasattr(ctx_tracker, 'workflow_metadata') and ctx_tracker.workflow_metadata: + if 'reward_stats' in ctx_tracker.workflow_metadata: + traj_data['reward_structure']['reward_stats'] = ctx_tracker.workflow_metadata['reward_stats'] + + traj_save_dir = os.path.join( + os.environ.get("BEST_LOGGER_PATH", "launcher_record"), + "ctx_trackers", + "train", + f"step_{global_steps}" + ) + os.makedirs(traj_save_dir, exist_ok=True) + traj_file_path = os.path.join(traj_save_dir, f"{ctx_tracker.task_id}.json") + + with open(traj_file_path, "w", encoding="utf-8") as f: + json.dump(traj_data, f, ensure_ascii=False, indent=2) + + +def save_eval_trajectory(ctx_trackers, global_steps): + """Save evaluation ctx_trackers to JSON files.""" + for ctx_tracker in ctx_trackers: + # Use unified conversion function to convert grouped_steps to OpenAI format + if hasattr(ctx_tracker, 'get_grouped_steps_openai_format'): + formatted_traj = ctx_tracker.get_grouped_steps_openai_format() + else: + formatted_traj = convert_grouped_steps_to_openai_format(ctx_tracker.grouped_steps) + + traj_data = { + "task_id": ctx_tracker.task_id, + "task_tag": ctx_tracker.tag, + "reward_structure": ctx_tracker.reward_structure.model_dump(), + "traj": formatted_traj + } + + # Extract reward_stats from workflow_metadata + if hasattr(ctx_tracker, 'workflow_metadata') and ctx_tracker.workflow_metadata: + if 'reward_stats' in ctx_tracker.workflow_metadata: + traj_data['reward_structure']['reward_stats'] = ctx_tracker.workflow_metadata['reward_stats'] + + traj_save_dir = os.path.join( + os.environ.get("BEST_LOGGER_PATH", "launcher_record"), + "ctx_trackers", + "val", + f"step_{global_steps}" + ) + os.makedirs(traj_save_dir, exist_ok=True) + traj_file_path = os.path.join(traj_save_dir, f"{ctx_tracker.task_id}.json") + + with open(traj_file_path, "w", encoding="utf-8") as f: + json.dump(traj_data, f, ensure_ascii=False, indent=2) + + print(f"Saved trajectory to {traj_file_path}") \ No newline at end of file From d930ffb2925255d490ac95b48dd37e2a9a3f1e2a Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Fri, 9 Jan 2026 22:56:17 +0800 Subject: [PATCH 409/462] feat: add metric helpers for tool and reward statistics tracking - Add tool_metric_helper.py to compute tool usage metrics (success rate, cache hit rate, error rate, execution time) - Add reward_metric_helper.py to compute reward distribution metrics - Integrate metric helpers into trainer_verl.py for both training and validation phases - Update general_runner.py to collect tool statistics from context tracker - Support SwanLab metric reporting with detailed per-tool breakdown --- ajet/backbone/trainer_verl.py | 24 +- ajet/task_runner/general_runner.py | 22 ++ .../metric_helper/reward_metric_helper.py | 231 ++++++++++++++++++ .../utils/metric_helper/tool_metric_helper.py | 167 +++++++++++++ 4 files changed, 443 insertions(+), 1 deletion(-) create mode 100644 ajet/utils/metric_helper/reward_metric_helper.py create mode 100644 ajet/utils/metric_helper/tool_metric_helper.py diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index a12b8bbc..85971c66 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -17,6 +17,8 @@ from collections import defaultdict from pprint import pprint from typing import List, Optional +from ajet.utils.metric_helper.reward_metric_helper import compute_reward_metrics_from_cmts +from loguru import logger as loguru_logger import hydra import numpy as np @@ -55,7 +57,13 @@ from ajet.task_reader import dict_to_ajet_task from ajet.task_rollout.native_parallel_worker import VerlRolloutManager from ajet.utils.save_trajectory import save_train_trajectory, save_eval_trajectory - +from ajet.utils.msg_converter import ( + convert_grouped_steps_to_openai_format, + convert_ext_msg_to_openai_format, + agentscope_to_openai, + openai_to_agentscope, +) +from ajet.utils.metric_helper.tool_metric_helper import compute_tool_metrics_from_cmts def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | torch.Tensor: """ @@ -606,6 +614,14 @@ def fit(self): # noqa: C901 ), } ) + from ajet.utils.metric_helper.tool_metric_helper import compute_tool_metrics_from_trajectories + from ajet.utils.metric_helper.reward_metric_helper import compute_reward_metrics_from_trajectories + tool_metrics = compute_tool_metrics_from_trajectories(context_tracker_arr) + reward_metrics = compute_reward_metrics_from_trajectories(context_tracker_arr) + if tool_metrics: + metrics.update(tool_metrics) + if reward_metrics: + metrics.update(reward_metrics) if self.config.ajet.execute_test: # apply a test probe from swanlab.data.run.main import get_run @@ -1052,6 +1068,12 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): f"TGC@{pass_n}-all-pass": num_all_success_tasks / num_tasks, "mean_reward": sum(rewards) / len(rewards) if rewards else 0, } + reward_metrics = compute_reward_metrics_from_cmts(ctx_trackers, print_debug=True) + tool_metrics = compute_tool_metrics_from_cmts(ctx_trackers) + if tool_metrics: + val_metrics.update(reward_metrics) + if reward_metrics: + val_metrics.update(tool_metrics) print_dict( val_metrics, narrow=True, diff --git a/ajet/task_runner/general_runner.py b/ajet/task_runner/general_runner.py index e88ec323..7e0998bd 100644 --- a/ajet/task_runner/general_runner.py +++ b/ajet/task_runner/general_runner.py @@ -1,4 +1,5 @@ import asyncio +from venv import logger from ajet import AjetTuner from ajet import Workflow, WorkflowOutput @@ -49,6 +50,8 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: workflow_output: WorkflowOutput = asyncio.run( user_workflow.execute(workflow_task, tuner) ) + # set workflow metadata to context tracker metadata + context_tracker.workflow_metadata = workflow_output.metadata if workflow_output.reward is not None: raw_reward, is_success = ( workflow_output.reward, @@ -56,6 +59,25 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: ) else: raw_reward, is_success = self.get_judge().compute_reward(workflow_task, workflow_output) + + # ✅ Critical Fix: After calling `judge`, write the updated `reward_stats` back to `workflow_metadata` + # # Ensure that `native_compat_trainer` reads the actual value calculated by `judge`, not the 0 value returned by `env`. + if workflow_output.metadata and 'reward_stats' in workflow_output.metadata: + context_tracker.workflow_metadata['reward_stats'] = workflow_output.metadata['reward_stats'] + else: + # fallback: If the judge does not update reward_stats, use the default value. + logger.warning(f"[WARN] reward_stats not found in metadata after judge call, creating default values") + default_reward_stats = { + 'original_reward': raw_reward, + 'penalty': 0.0, + 'step_reward': raw_reward, + } + if workflow_output.metadata: + workflow_output.metadata['reward_stats'] = default_reward_stats + context_tracker.workflow_metadata['reward_stats'] = default_reward_stats + else: + context_tracker.workflow_metadata = {'reward_stats': default_reward_stats} + workflow_task.gym_env = None # clear gym env client reference to avoid serialization issue assert not isinstance( diff --git a/ajet/utils/metric_helper/reward_metric_helper.py b/ajet/utils/metric_helper/reward_metric_helper.py new file mode 100644 index 00000000..b6cf5918 --- /dev/null +++ b/ajet/utils/metric_helper/reward_metric_helper.py @@ -0,0 +1,231 @@ +""" +FinWorld Reward Metrics Helper + +Provides standalone utility functions for reward_stats extraction and SwanLab metrics formatting. +Decouples finworld-specific logic from core code, reducing intrusion into native_compat_trainer. + +SwanLab metrics directory structure: +- rewards/ Top-level aggregated scores +- rewards/dimensions/ Raw scores (unweighted) +- rewards/contribution/ Weighted contributions +- judge_time/ Judge time consumption statistics +""" + +from typing import List, Dict, Any, Optional +import numpy as np + + +def extract_reward_stats_from_trajectories(trajectories: List[Any]) -> List[Dict[str, Any]]: + """ + Extract reward_stats from trajectories list. + + Args: + trajectories: List of trajectory objects containing workflow_metadata + + Returns: + List of reward_stats dictionaries + """ + reward_stats_list = [] + for traj in trajectories: + if hasattr(traj, 'workflow_metadata') and traj.workflow_metadata: + if 'reward_stats' in traj.workflow_metadata: + reward_stats_list.append(traj.workflow_metadata['reward_stats']) + return reward_stats_list + + +def extract_reward_stats_from_cmts(cmts: List[Any]) -> tuple[List[Dict[str, Any]], Dict[str, int]]: + """ + Extract reward_stats from cmts list and return debug statistics. + + Args: + cmts: List of cmt objects containing workflow_metadata + + Returns: + Tuple of (reward_stats_list, debug_stats) + """ + reward_stats_list = [] + debug_stats = { + 'total_cmts': len(cmts), + 'has_workflow_metadata': 0, + 'has_reward_stats': 0, + } + + for _cmt in cmts: + if hasattr(_cmt, 'workflow_metadata') and _cmt.workflow_metadata: + debug_stats['has_workflow_metadata'] += 1 + if 'reward_stats' in _cmt.workflow_metadata: + debug_stats['has_reward_stats'] += 1 + reward_stats_list.append(_cmt.workflow_metadata['reward_stats']) + + return reward_stats_list, debug_stats + + +def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str = "") -> Dict[str, float]: + """ + Compute SwanLab metrics from reward_stats list. + + Supports two data sources: + 1. RM Gallery RewardStats fields (rm_raw, etc.) + 2. OpenJudge fields (openjudge_xxx_raw, openjudge_xxx_contribution, etc.) + + Args: + reward_stats_list: List of reward_stats dictionaries + prefix: Metric name prefix (e.g., "val/" for validation phase) + + Returns: + Formatted metrics dictionary ready for SwanLab reporting + """ + if not reward_stats_list: + return {} + + n = len(reward_stats_list) + metrics = {} + + # ========== Top-level Scores (General) ========== + final_reward_list = [rs.get('final_reward', 0.0) for rs in reward_stats_list] + fused_reward_list = [rs.get('fused_reward', 0.0) for rs in reward_stats_list] + penalty_list = [rs.get('penalty', 0.0) for rs in reward_stats_list] + step_reward_list = [rs.get('step_reward', 0.0) for rs in reward_stats_list] + + # Penalty statistics + non_zero_penalties = [p for p in penalty_list if p != 0.0] + + # Top-level metrics + metrics[f"{prefix}rewards/final_reward_mean"] = float(np.mean(final_reward_list)) + metrics[f"{prefix}rewards/fused_reward_mean"] = float(np.mean(fused_reward_list)) + metrics[f"{prefix}rewards/penalty_mean"] = float(np.mean(penalty_list)) + metrics[f"{prefix}rewards/step_reward_mean"] = float(np.mean(step_reward_list)) + metrics[f"{prefix}rewards/penalty_count"] = len(non_zero_penalties) + metrics[f"{prefix}rewards/penalty_rate"] = len(non_zero_penalties) / n * 100 if n > 0 else 0.0 + + # ========== Detect OpenJudge Usage ========== + openjudge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('openjudge_enabled', False)) + + if openjudge_enabled_count > 0: + # ========== OpenJudge Metrics ========== + metrics[f"{prefix}rewards/openjudge_enabled_rate"] = openjudge_enabled_count / n * 100 + + # Dynamically extract OpenJudge grader fields + # Currently supported graders: report_resolution, trajectory_faithfulness, + # rubrics_performance, trajectory_comprehensive, information_gain, action_loop + openjudge_graders = [ + "report_resolution", + "trajectory_faithfulness", + "rubrics_performance", + "trajectory_comprehensive", + "information_gain", + "action_loop", + ] + + for grader_name in openjudge_graders: + raw_key = f"openjudge_{grader_name}_raw" + contrib_key = f"openjudge_{grader_name}_contribution" + + raw_list = [rs.get(raw_key, 0.0) for rs in reward_stats_list] + contrib_list = [rs.get(contrib_key, 0.0) for rs in reward_stats_list] + + # Only report when non-zero values exist + if any(v != 0.0 for v in raw_list): + metrics[f"{prefix}rewards/openjudge/{grader_name}_raw_mean"] = float(np.mean(raw_list)) + if any(v != 0.0 for v in contrib_list): + metrics[f"{prefix}rewards/openjudge/{grader_name}_contribution_mean"] = float(np.mean(contrib_list)) + + # OpenJudge time consumption statistics + grading_time_list = [rs.get('grading_time', 0.0) for rs in reward_stats_list] + if any(v != 0.0 for v in grading_time_list): + metrics[f"{prefix}judge_time/openjudge_grading_time_mean"] = float(np.mean(grading_time_list)) + metrics[f"{prefix}judge_time/openjudge_grading_time_max"] = float(np.max(grading_time_list)) + + # ========== RM Gallery Metrics ========== + + # RM Gallery + rm_raw_list = [rs.get('rm_raw', 0.0) for rs in reward_stats_list] + rm_contribution_list = [rs.get('rm_contribution', 0.0) for rs in reward_stats_list] + + # RefJudge + ref_final_raw_list = [rs.get('ref_final_raw', 0.0) for rs in reward_stats_list] + ref_citation_raw_list = [rs.get('ref_citation_raw', 0.0) for rs in reward_stats_list] + ref_grounding_raw_list = [rs.get('ref_grounding_raw', 0.0) for rs in reward_stats_list] + ref_contribution_list = [rs.get('ref_contribution', 0.0) for rs in reward_stats_list] + + # StructureJudge + structure_raw_list = [rs.get('structure_raw', 0.0) for rs in reward_stats_list] + structure_contribution_list = [rs.get('structure_contribution', 0.0) for rs in reward_stats_list] + + # dimensions/ raw scores + metrics[f"{prefix}rewards/dimensions/rm_raw_mean"] = float(np.mean(rm_raw_list)) + metrics[f"{prefix}rewards/dimensions/ref_final_raw_mean"] = float(np.mean(ref_final_raw_list)) + metrics[f"{prefix}rewards/dimensions/ref_citation_raw_mean"] = float(np.mean(ref_citation_raw_list)) + metrics[f"{prefix}rewards/dimensions/ref_grounding_raw_mean"] = float(np.mean(ref_grounding_raw_list)) + metrics[f"{prefix}rewards/dimensions/structure_raw_mean"] = float(np.mean(structure_raw_list)) + + # contribution/ weighted contributions + metrics[f"{prefix}rewards/contribution/rm_contribution_mean"] = float(np.mean(rm_contribution_list)) + metrics[f"{prefix}rewards/contribution/ref_contribution_mean"] = float(np.mean(ref_contribution_list)) + metrics[f"{prefix}rewards/contribution/structure_contribution_mean"] = float(np.mean(structure_contribution_list)) + + # Enabled state statistics + ref_judge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('ref_judge_enabled', False)) + if ref_judge_enabled_count > 0: + metrics[f"{prefix}rewards/ref_judge_enabled_rate"] = ref_judge_enabled_count / n * 100 + + structure_judge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('structure_judge_enabled', False)) + if structure_judge_enabled_count > 0: + metrics[f"{prefix}rewards/structure_judge_enabled_rate"] = structure_judge_enabled_count / n * 100 + + # Time consumption statistics + rm_time_list = [rs.get('rm_time', 0.0) for rs in reward_stats_list] + refstruc_time_list = [rs.get('refstruc_time', 0.0) for rs in reward_stats_list] + + metrics[f"{prefix}judge_time/rm_time_mean"] = float(np.mean(rm_time_list)) + metrics[f"{prefix}judge_time/refstruc_time_mean"] = float(np.mean(refstruc_time_list)) + + if rm_time_list: + metrics[f"{prefix}judge_time/rm_time_max"] = float(np.max(rm_time_list)) + if refstruc_time_list: + metrics[f"{prefix}judge_time/refstruc_time_max"] = float(np.max(refstruc_time_list)) + + # ========== General Time Consumption Statistics ========== + judge_total_time_list = [rs.get('judge_total_time', 0.0) for rs in reward_stats_list] + if any(v != 0.0 for v in judge_total_time_list): + metrics[f"{prefix}judge_time/judge_total_time_mean"] = float(np.mean(judge_total_time_list)) + metrics[f"{prefix}judge_time/judge_total_time_max"] = float(np.max(judge_total_time_list)) + + return metrics + + +def compute_reward_metrics_from_trajectories(trajectories: List[Any]) -> Dict[str, float]: + """ + Training phase: Extract reward_stats from trajectories and compute metrics. + + Args: + trajectories: List of trajectory objects + + Returns: + Formatted metrics dictionary + """ + reward_stats_list = extract_reward_stats_from_trajectories(trajectories) + return compute_reward_metrics(reward_stats_list, prefix="train_") + + +def compute_reward_metrics_from_cmts(cmts: List[Any], print_debug: bool = True) -> Dict[str, float]: + """ + Validation phase: Extract reward_stats from cmts and compute metrics. + + Args: + cmts: List of cmt objects + print_debug: Whether to print debug information + + Returns: + Formatted metrics dictionary (with "val_reward/" prefix) + """ + reward_stats_list, debug_stats = extract_reward_stats_from_cmts(cmts) + + if print_debug: + print(f"\n[DEBUG eval_dataset()] reward_stats statistics:") + print(f" - Total cmts count: {debug_stats['total_cmts']}") + print(f" - Has workflow_metadata: {debug_stats['has_workflow_metadata']}") + print(f" - Has reward_stats: {debug_stats['has_reward_stats']}") + print(f" - Extracted samples count: {len(reward_stats_list)}") + + return compute_reward_metrics(reward_stats_list, prefix="val_") diff --git a/ajet/utils/metric_helper/tool_metric_helper.py b/ajet/utils/metric_helper/tool_metric_helper.py new file mode 100644 index 00000000..0e75d9e3 --- /dev/null +++ b/ajet/utils/metric_helper/tool_metric_helper.py @@ -0,0 +1,167 @@ +""" +FinWorld Tool Metrics Helper + +Specialized module for extracting tool-related statistics and formatting SwanLab reports. +Extracts data from workflow_metadata['tool_stats']. + +SwanLab metrics directory structure: +- tool_stats/ Overall statistics (success rate, cache hit rate, etc.) +- tool_time/ Time consumption statistics by tool +- tool_cache/ Cache hit rate by tool +- tool_error/ Error rate by tool +""" + +from typing import List, Dict, Any +import numpy as np + + +def extract_tool_stats_from_trajectories(trajectories: List[Any]) -> List[Dict[str, Any]]: + """ + Extract tool_stats from trajectories list. + + Args: + trajectories: List of trajectory objects containing workflow_metadata + + Returns: + List of tool_stats dictionaries + """ + tool_stats_list = [] + for traj in trajectories: + if hasattr(traj, 'workflow_metadata') and traj.workflow_metadata: + if 'tool_stats' in traj.workflow_metadata: + tool_stats_list.append(traj.workflow_metadata['tool_stats']) + return tool_stats_list + + +def extract_tool_stats_from_cmts(cmts: List[Any]) -> List[Dict[str, Any]]: + """ + Extract tool_stats from cmts list. + + Args: + cmts: List of cmt objects containing workflow_metadata + + Returns: + List of tool_stats dictionaries + """ + tool_stats_list = [] + for cmt in cmts: + if hasattr(cmt, 'workflow_metadata') and cmt.workflow_metadata: + if 'tool_stats' in cmt.workflow_metadata: + tool_stats_list.append(cmt.workflow_metadata['tool_stats']) + return tool_stats_list + + +def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "") -> Dict[str, float]: + """ + Compute SwanLab metrics from tool_stats list. + + Args: + tool_stats_list: List of tool_stats dictionaries + prefix: Metric name prefix (e.g., "val/" for validation phase) + + Returns: + Formatted metrics dictionary ready for SwanLab reporting + """ + if not tool_stats_list: + return {} + + metrics = {} + + # ========== 1. Overall Statistics ========== + total_calls_list = [stats.get('total_calls', 0) for stats in tool_stats_list] + success_calls_list = [stats.get('success_calls', 0) for stats in tool_stats_list] + error_calls_list = [stats.get('total_errors', 0) for stats in tool_stats_list] + cache_hits_list = [stats.get('cache_hits', 0) for stats in tool_stats_list] + cache_misses_list = [stats.get('cache_misses', 0) for stats in tool_stats_list] + + # Calculate overall success rate + total_calls_sum = sum(total_calls_list) + success_calls_sum = sum(success_calls_list) + tool_success_rate = (success_calls_sum / total_calls_sum * 100) if total_calls_sum > 0 else 0.0 + + # Calculate overall cache hit rate + cache_total = sum(cache_hits_list) + sum(cache_misses_list) + cache_hit_rate = (sum(cache_hits_list) / cache_total * 100) if cache_total > 0 else 0.0 + + metrics.update({ + f"{prefix}tool_stats/tool_success_rate": tool_success_rate, + f"{prefix}tool_stats/tool_total_calls": float(np.mean(total_calls_list)), + f"{prefix}tool_stats/tool_success_calls": float(np.mean(success_calls_list)), + f"{prefix}tool_stats/tool_error_calls": float(np.mean(error_calls_list)), + f"{prefix}tool_stats/tool_cache_hit_rate": cache_hit_rate, + f"{prefix}tool_stats/tool_cache_hits": float(np.mean(cache_hits_list)), + f"{prefix}tool_stats/tool_cache_misses": float(np.mean(cache_misses_list)), + }) + + # ========== 2. Time Consumption Statistics by Tool ========== + tool_time_by_name = {} + for stats in tool_stats_list: + tool_time_dict = stats.get('tool_time', {}) + for tool_name, time_list in tool_time_dict.items(): + if tool_name not in tool_time_by_name: + tool_time_by_name[tool_name] = [] + if isinstance(time_list, list): + tool_time_by_name[tool_name].extend(time_list) + + for tool_name, time_list in tool_time_by_name.items(): + if time_list: + metrics[f"{prefix}tool_time/{tool_name}/mean"] = float(np.mean(time_list)) + metrics[f"{prefix}tool_time/{tool_name}/max"] = float(np.max(time_list)) + metrics[f"{prefix}tool_time/{tool_name}/count"] = len(time_list) + + # ========== 3. Cache Hit Rate by Tool ========== + tool_cache_by_name = {} + for stats in tool_stats_list: + tool_cache_stats = stats.get('tool_cache_stats', {}) + for tool_name, cache_info in tool_cache_stats.items(): + if tool_name not in tool_cache_by_name: + tool_cache_by_name[tool_name] = {'hits': 0, 'misses': 0} + tool_cache_by_name[tool_name]['hits'] += cache_info.get('hits', 0) + tool_cache_by_name[tool_name]['misses'] += cache_info.get('misses', 0) + + for tool_name, cache_info in tool_cache_by_name.items(): + hits = cache_info['hits'] + misses = cache_info['misses'] + total = hits + misses + if total > 0: + hit_rate = hits / total * 100 + metrics[f"{prefix}tool_cache/{tool_name}/hit_rate"] = round(hit_rate, 2) + metrics[f"{prefix}tool_cache/{tool_name}/hits"] = hits + metrics[f"{prefix}tool_cache/{tool_name}/misses"] = misses + + # ========== 4. Error Rate by Tool ========== + tool_error_by_name = {} + for stats in tool_stats_list: + tool_error_stats = stats.get('tool_error_stats', {}) + for tool_name, error_info in tool_error_stats.items(): + if tool_name not in tool_error_by_name: + tool_error_by_name[tool_name] = {'calls': 0, 'errors': 0} + tool_error_by_name[tool_name]['calls'] += error_info.get('calls', 0) + tool_error_by_name[tool_name]['errors'] += error_info.get('errors', 0) + + for tool_name, error_info in tool_error_by_name.items(): + calls = error_info['calls'] + errors = error_info['errors'] + if calls > 0: + error_rate = errors / calls * 100 + metrics[f"{prefix}tool_error/{tool_name}/error_rate"] = round(error_rate, 2) + metrics[f"{prefix}tool_error/{tool_name}/calls"] = calls + metrics[f"{prefix}tool_error/{tool_name}/errors"] = errors + + return metrics + + +def compute_tool_metrics_from_trajectories(trajectories: List[Any]) -> Dict[str, float]: + """ + Training phase: Extract tool_stats from trajectories and compute metrics. + """ + tool_stats_list = extract_tool_stats_from_trajectories(trajectories) + return compute_tool_metrics(tool_stats_list, prefix="train_") + + +def compute_tool_metrics_from_cmts(cmts: List[Any]) -> Dict[str, float]: + """ + Validation phase: Extract tool_stats from cmts and compute metrics. + """ + tool_stats_list = extract_tool_stats_from_cmts(cmts) + return compute_tool_metrics(tool_stats_list, prefix="val_") From 5003207ef26b3813b757547808fa96c57e1a82f7 Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 01:38:42 +0800 Subject: [PATCH 410/462] revise docs --- README.md | 4 +- ajet/workflow.py | 28 +- docs/en/agent_framework_support.md | 17 + docs/en/installation.md | 109 ++--- docs/en/intro.md | 40 +- docs/en/introduction.md | 4 +- docs/en/task_judger.md | 15 +- docs/en/tune_your_first_agent.md | 425 +++++++----------- docs/en/workflow.md | 352 +++++++-------- docs/index.md | 155 ++++--- docs/stylesheets/responsive.css | 58 +++ {ajet => docs/stylesheets}/tuner_v2.md | 4 +- docs/zh/beast_logger.md | 105 ----- docs/zh/component.md | 1 - docs/zh/configuration.md | 419 ----------------- docs/zh/data_generation.md | 239 ---------- docs/zh/data_pipeline.md | 172 ------- docs/zh/example.md | 3 - docs/zh/example_app_world.md | 203 --------- docs/zh/example_countdown.md | 177 -------- docs/zh/example_frozenlake.md | 148 ------ docs/zh/example_learning_to_ask.md | 163 ------- docs/zh/example_math_agent.md | 230 ---------- docs/zh/example_tracing_feedback_loop.md | 109 ----- docs/zh/example_werewolves.md | 195 -------- docs/zh/installation.md | 135 ------ docs/zh/intro.md | 130 ------ docs/zh/introduction.md | 108 ----- docs/zh/quickstart.md | 82 ---- docs/zh/task_judger.md | 302 ------------- docs/zh/tune_your_first_agent.md | 382 ---------------- docs/zh/visualization.md | 120 ----- docs/zh/workflow.md | 246 ---------- mkdocs.yml | 55 ++- pyproject.toml | 2 +- tutorial/example_math_agent/math_agent.md | 176 +------- tutorial/example_math_agent/math_agent.yaml | 22 +- .../example_math_agent/math_agent_simplify.py | 7 +- 38 files changed, 641 insertions(+), 4501 deletions(-) create mode 100644 docs/en/agent_framework_support.md rename {ajet => docs/stylesheets}/tuner_v2.md (95%) delete mode 100644 docs/zh/beast_logger.md delete mode 100644 docs/zh/component.md delete mode 100644 docs/zh/configuration.md delete mode 100644 docs/zh/data_generation.md delete mode 100644 docs/zh/data_pipeline.md delete mode 100644 docs/zh/example.md delete mode 100644 docs/zh/example_app_world.md delete mode 100644 docs/zh/example_countdown.md delete mode 100644 docs/zh/example_frozenlake.md delete mode 100644 docs/zh/example_learning_to_ask.md delete mode 100644 docs/zh/example_math_agent.md delete mode 100644 docs/zh/example_tracing_feedback_loop.md delete mode 100644 docs/zh/example_werewolves.md delete mode 100644 docs/zh/installation.md delete mode 100644 docs/zh/intro.md delete mode 100644 docs/zh/introduction.md delete mode 100644 docs/zh/quickstart.md delete mode 100644 docs/zh/task_judger.md delete mode 100644 docs/zh/tune_your_first_agent.md delete mode 100644 docs/zh/visualization.md delete mode 100644 docs/zh/workflow.md diff --git a/README.md b/README.md index 74853860..9dda0620 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ We aim to build a easy-to-learn Agent tuner that unlock more possibilities for a - **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. -- **Flexible and Fast**. AgentJet supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: @@ -110,7 +110,7 @@ The internal system orchestrates several specialized modules to handle the compl * **Task Rollout**: Bridges LLM engines and manages the Gym environment lifecycle. * **Task Runner**: Executes the Agent workflow and calculates rewards. * **Model Tuner**: Forwards inference requests from the workflow to the LLM engine. -* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **3x to 10x**. +* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **1.5x to 10x**. --- diff --git a/ajet/workflow.py b/ajet/workflow.py index 1f8ca4bf..58c8757d 100644 --- a/ajet/workflow.py +++ b/ajet/workflow.py @@ -24,7 +24,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl 1. Single agent scenario 🤖: - Simply set `model` argument to `model_tuner` when initializing your agent. + Simply set `model` argument to `tuner.as_agentscope_model()` when initializing your agent. This is a helpful example when you: - 🌟 Know exactly which agents should be trained, or the number of agents are small; - ✨ Already finished basic debugging of your workflow using a fixed model such as qwen-max; @@ -92,17 +92,35 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl [ ] roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] [ ] players = [] [ ] for i, role in enumerate(roles): - [ ] default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) - [ ] default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) - [ ] chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys # 🌟 + [ ] debug_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) + [ ] debug_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) + [ ] chosen_model = debug_model_for_good_guys if role != "werewolf" else debug_model_for_bad_guys # 🌟 [ ] players += [ReActAgent( [ ] name=f"Player{i + 1}", [ ] sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), [-] model=chosen_model, - [+] model=model_tuner.register_model(role, default_model=chosen_model), + [+] model=tuner.as_agentscope_model(f"Player{i + 1}", role, debug_model=chosen_model), [ ] formatter=OpenAIMultiAgentFormatter(), [ ] )] +[ ] roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] +[ ] players = [] +[ ] for i, agent_role in enumerate(roles): +[ ] if agent_role != "werewolf": +[ ] chosen_model_for_current_agent = OpenAIChatModel(model_name="qwen-max", stream=False) +[ ] else: +[ ] chosen_model_for_current_agent = OpenAIChatModel(model_name="qwen-plus", stream=False) +[ ] players += [ReActAgent( +[ ] name=f"Player{i + 1}", +[ ] sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), +[ ] model=agentscope_model, +[ ] model=tuner.as_agentscope_model( +[ ] agent_name=f"Player{i + 1}", +[ ] target_tag=agent_role, # 🌟 tag agents with their role +[ ] debug_model=chosen_model_for_current_agent # 🌟 assign a debug model, ONLY used when we are NOT training this agent +[ ] ) +[ ] formatter=OpenAIMultiAgentFormatter(), +[ ] )] """ diff --git a/docs/en/agent_framework_support.md b/docs/en/agent_framework_support.md new file mode 100644 index 00000000..9d8c7465 --- /dev/null +++ b/docs/en/agent_framework_support.md @@ -0,0 +1,17 @@ +# Supported Agent Frameworks + + + + +## + + + +## AgentScope + + + + + + + diff --git a/docs/en/installation.md b/docs/en/installation.md index 05e130f0..a5f16c52 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -2,19 +2,17 @@ This document provides a step-by-step guide to installing AgentJet. -!!! tip "Latest Version Recommended" +!!! tip "Latest Version Recommended:" + AgentJet is under active development and iteration. We recommend installing from source to get the latest features and bug fixes. ---- ## Prerequisites | Requirement | Version | |-------------|---------| | **Python** | 3.10 | -| **CUDA** | 12.8 or higher | ---- ## Install from Source @@ -34,98 +32,83 @@ AgentJet supports multiple backbones. Currently we have `verl` and `trinity` (re !!! info "Package Manager" We recommend using `uv` to manage your Python environment as it is incredibly fast. See also [`uv` installation document](https://docs.astral.sh/uv/getting-started/installation/). - If you prefer `conda`, you can also install via conda and pip (simply change `uv pip` to `pip`). - -=== "Verl (Recommended)" + And of course, if you prefer `conda`, you can also install via conda and pip (simply change `uv pip` to `pip`). - Install with `verl` training backbone: +=== "VERL (uv)" ```bash + # Install with `verl` training backbone: + uv venv --python=3.10 source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + uv pip install -e .[verl] + + #`flash-attn` must be installed after other dependencies + uv pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` !!! warning "flash-attn Installation" `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. - -=== "Trinity" - - Install with `trinity` training backbone for fully asynchronous RFT: +=== "VERL (conda)" ```bash - uv venv --python=3.10 - source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache - ``` + # Install with `verl` training backbone: ---- + conda create -n ajet-verl python=3.10 + conda activate ajet-verl + pip install -e .[verl] -## Install via Docker - -If you prefer one-click dependency installation, we provide a Docker image to jump start! + #`flash-attn` must be installed after other dependencies + pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache + ``` -!!! warning "Prerequisites" - Before proceeding, ensure you have **nvidia docker** installed on your system. CUDA is needed inside our docker container, which requires toolkits from Nvidia for GPU support. + !!! warning "flash-attn Installation" + `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. -### Setup Nvidia Docker Runtime -Please install nvidia docker runtime on the host Ubuntu system. For details, refer to: +=== "VERL (aliyun)" -- [Nvidia Official Document](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian) -- [Setup Ubuntu Guide](./setup_ubuntu.md) (our step-by-step manual) -### Run Docker Container + ```bash + # Install with `verl` training backbone: -This command mounts your current working directory (the root directory of agentjet) to `/workspace` and your data directory to `/data` inside the container. + uv venv --python=3.10 + source .venv/bin/activate + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] -```bash -docker run -it \ - --gpus all \ - --shm-size="64g" \ - --rm \ - -v $PWD:/workspace \ - -v /path/to/your/checkpoint/and/data:/data \ - agentjet:latest -``` + #`flash-attn` must be installed after other dependencies + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache + ``` ---- + !!! warning "flash-attn Installation" + `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. -## Verify Installation -After installation, verify that everything is working correctly: +=== "Trinity" -```python -import ajet -print(ajet.__version__) -``` + ```bash + # Install with `trinity` training backbone for fully asynchronous RFT: ---- + uv venv --python=3.10 + source .venv/bin/activate + uv pip install -e .[trinity] + uv pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache + ``` -## Troubleshooting -??? note "Common Issues" - **Issue**: `flash-attn` installation fails +=== "Trinity (aliyun)" - **Solution**: Make sure you have CUDA toolkit installed and `MAX_JOBS` environment variable set: ```bash - export MAX_JOBS=4 - uv pip install flash-attn --no-build-isolation - ``` + # Install with `trinity` training backbone for fully asynchronous RFT: -??? note "GPU Not Detected" - **Issue**: Docker container doesn't see GPU - - **Solution**: Ensure nvidia-docker is properly installed: - ```bash - nvidia-smi # Should show GPU info - docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi + uv venv --python=3.10 + source .venv/bin/activate + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] + uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` ---- + ## Next Steps diff --git a/docs/en/intro.md b/docs/en/intro.md index 249d5e06..b85c257a 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -1,37 +1,28 @@ # Introduction -**AgentJet (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentJet (AgentJet)** is a cutting-edge, user-friendly agent tunning framework designed to optimize LLM models and agent workflows. -Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! +Simply provide your workflow (built from AgentScope, OpenAI SDK, Langchain, raw HTTP requests, or hybrid of all of them), training data, and reward function, and we will be ready to enhance your agents to their optimal performance! ---- ## Features -We aim to build an easy-to-learn AgentJet that unlocks more possibilities for agent developers: - - +AgentJet aims to build a state-of-the-art agent tuning platform for both developers and researchers -!!! tip "Multi-Agent Support" - AgentJet supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by **1.5x to 20x** when the workflow involves multi-turn (or multi-agent) conversations. +- **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. +- **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. +- **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. +- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). -!!! info "Reliability & Reproducibility" - Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/). +For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: + -### For Advanced Researchers +- **High-Resolution Logging**: AgentJet allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. +- **Fast Debugging**: AgentJet also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. -AgentJet also provides high-resolution logging and debugging solutions: -| Feature | Description | -|---------|-------------| -| **High-Resolution Logging** | Save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs | -| **Fast Debugging** | Use `--backbone=debug` option, shortening wait time from minutes to seconds after code changes | ---- ## Quick Start @@ -52,10 +43,10 @@ We recommend using `uv` for dependency management. uv venv --python=3.10.16 && source .venv/bin/activate uv pip install -e .[trinity] # Note: flash-attn must be installed after other dependencies - uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir + uv pip install flash_attn==2.8.3 --no-build-isolation --no-cache-dir ``` -### Run Training +- Train the first agent You can start training your first agent with a single command using a pre-configured YAML file: @@ -66,7 +57,6 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --w !!! example "Learn More" See the [Math Agent](./example_math_agent.md) example for detailed explanation. ---- ## Example Library {#example-library} @@ -112,7 +102,7 @@ The internal system orchestrates several specialized modules to handle the compl | **Task Rollout** | Bridges LLM engines and manages the Gym environment lifecycle | | **Task Runner** | Executes the AgentScope workflow and calculates rewards | | **Model Tuner** | Forwards inference requests from the workflow to the LLM engine | -| **Context Tracker** | Monitors LLM calls and automatically merges shared-history timelines (**3x-10x** efficiency boost) | +| **Context Tracker** | Monitors LLM calls and automatically merges shared-history timelines (**1.5x-10x** efficiency boost) | --- diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 8bee1a2f..7ca41633 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -13,7 +13,7 @@ We aim to build a easy-to-learn AgentJet that unlock more possibilities for agen - **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](#example-library) as tutorials. - **Efficient and Scalable**. AgentJet uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. -- **Flexible and Fast**. AgentJet supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 20x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: @@ -94,7 +94,7 @@ The internal system orchestrates several specialized modules to handle the compl * **Task Rollout**: Bridges LLM engines and manages the Gym environment lifecycle. * **Task Runner**: Executes the AgentScope workflow and calculates rewards. * **Model Tuner**: Forwards inference requests from the workflow to the LLM engine. -* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **3x to 10x**. +* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **1.5x to 10x**. --- diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index b54e7edd..bdca6af1 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -1,8 +1,11 @@ # Task Judger +!!! warning "" + Task judger will be **disabled** automatically when the user-defined workflow returned an effective `WorkflowOutput.reward` and `WorkflowOutput.reward != None` + + Task Judger evaluates agent outputs and assigns rewards during training. This page covers built-in judgers for common scenarios and how to create custom judgers for specific evaluation needs. ---- ## Overview @@ -13,10 +16,8 @@ A Task Judger evaluates the agent's execution results and returns two values: | `raw_reward` | `float` | Numerical score representing output quality (often 0.0 to 1.0) | | `is_success` | `bool` | Whether the task was successfully completed | -!!! info "Training Guidance" - These values guide the RL training process, helping agents learn which behaviors produce better outcomes. +These values guide the RL training process, helping agents learn which behaviors produce better outcomes. ---- ## Base Interface @@ -46,7 +47,6 @@ class BaseJudge: raise NotImplementedError ``` ---- ## Built-in Task Judgers @@ -83,7 +83,6 @@ Evaluates mathematical answers by exact string matching, designed for tasks wher | `final_answer` | `workflow_output.metadata` | Agent's answer with `\boxed{}` format | | `answer` | `workflow_task.task.metadata` | Reference answer | ---- ### 2. CountdownAnswerAsJudge @@ -111,7 +110,6 @@ Evaluates mathematical equations with partial credit for proper formatting. | `0.1` | Properly formatted equation but wrong result | | `1.0` | Correct equation and result | ---- ### 3. EnvServiceJudge @@ -135,7 +133,6 @@ ajet: - Success (score ≥ 1): `1.0 + score * 0.5` - Failure (score < 1): `0.0 + score * 0.5` ---- ## Creating Custom Task Judgers @@ -211,7 +208,6 @@ class MyWorkflow(Workflow): ) ``` ---- ## Configuration Summary @@ -222,7 +218,6 @@ ajet: judge_protocol: ajet.task_judge.-> ``` ---- ## Next Steps diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 3b0b1ca5..7a419296 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -1,92 +1,121 @@ # Tune Your First Agent -In this document, we demonstrate how to implement and train, from scratch, an agent that can use Python to perform calculations and solve complex math problems. +In this document, we demonstrate how to implement and train, from scratch, an agent that can use Python to perform calculations and solve 'gsm8k' math problems. + +
    Training Pipeline Overview
      -
    1. Prepare training data and environment -Set up the dataset and configure the task reader.
    2. -
    3. Define the agent and trainable workflow +
    4. Define agent workflow -Create your agent using AgentScope and wrap it in a Workflow class.
    5. -
    6. Define reward function +Create your agent using AgentScope/Langchain/OpenaiSDK or only http requests, wrap it in a Workflow class.
    7. + +
    8. Define reward Configure how the agent's outputs are evaluated and scored.
    9. -
    10. Configure training hyperparameters -Set model path, batch size, and other training parameters.
    11. -
    12. Debug +
    13. Prepare dataset + +Set up the dataset and configure the task reader.
    14. + + +
    15. Debug (Optional) Test your workflow in debug mode before full training.
    16. -
    17. Start training & monitor metrics +
    18. Start training Launch the training process and track progress.
    -!!! success "What You'll Learn" - After completing this guide, you will: - - Obtain a Math Agent that can solve math problems using Python - - Understand the core concepts in AgentJet - - Learn how to design your own training pipeline ---- +## Step 1: ✨Define agent Workflow + Reward -## Step 1: Prepare the Working Directory -First, create a directory for this training project: +First of all, create a directory for this training project: ```bash -mkdir math_agent -cd math_agent -touch math_agent.yaml -touch workflow.py -``` - -After running the commands above, the directory should contain: - -``` -/math_agent - /math_agent.yaml # Configuration file - /workflow.py # Training workflow definition +tutorial/example_math_agent +├── math_agent.py +└── math_agent.yaml ``` ---- - -## Step 2: Configure Project Name +Next, define your workflow (or convert an existing workflow). Here we use AgentScope to implement this agent. You can toggle two code before and after convertion to see the difference. If you prefer langchain or openai sdk, [please refer to this article](../agent_framework_support). + +=== "`math_agent.py` - AgentJet Workflow (After Convertion)" + + ```python title="math_agent.py" + class MathToolWorkflow(Workflow): # ✨✨ inherit `Workflow` class + name: str = "math_agent_workflow" + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + # run agentscope + query = workflow_task.task.main_query + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", sys_prompt=system_prompt, + model=tuner.as_agentscope_model(), # ✨✨ compared with a normal agentscope agent, here is the difference! + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), max_iters=2, + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg) + final_answer = extract_final_answer(result) + + # compute reward + reference_answer = workflow_task.task.metadata["answer"].split("####")[-1].strip() + match = re.search(r"\\boxed\{([^}]*)\}", final_answer) + if match: is_success = (match.group(1) == reference_answer) + else: is_success = False + return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) -Give the project a name in the config file: + ``` -```yaml title="math_agent.yaml" -ajet: - project_name: math_agent -# ------------------ No need to modify ------------------ -hydra: - searchpath: - - file://ajet/default_config - - file://ajet/default_config/verl # verl only - - file://ajet/default_config/trinity # trinity only +=== "Original Workflow (Before Convertion)" + + ```python title="math_agent.py" + class MathToolWorkflow(object): + name: str = "math_agent_workflow" + + async def execute(self, workflow_task: WorkflowTask) -> WorkflowOutput: + # run agentscope + query = workflow_task.task.main_query + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", sys_prompt=system_prompt, + model=DashScopeChatModel(model='qwen-max'), + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), max_iters=2, + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg) + final_answer = extract_final_answer(result) + + # compute reward + reference_answer = workflow_task.task.metadata["answer"].split("####")[-1].strip() + match = re.search(r"\\boxed\{([^}]*)\}", final_answer) + if match: is_success = (match.group(1) == reference_answer) + else: is_success = False + return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) -# ------------------ No need to modify ------------------ -defaults: - - verl_default # verl inherit 1/1 - - trinity_default # trinity inherit 1/1 - - ajet_default - - _self_ -``` + ``` ---- -## Step 3: Prepare Training Data -The agent needs to be trained in a specific task environment, driven by training data. +## Step 2: ✨Prepare dataset !!! info "Data Sources" AgentJet provides multiple ways to read data: @@ -95,242 +124,86 @@ The agent needs to be trained in a specific task environment, driven by training - Read from a Hugging Face repo - Read from an EnvService -All data will be converted into a unified AgentJet data format after loading. - -In this example, we will use the `openai/gsm8k` dataset from Hugging Face: - -```yaml title="math_agent.yaml" -ajet: - project_name: math_agent - task_reader: - type: huggingface_dat_repo - huggingface_dat_repo: - dataset_path: 'gsm8k/main' - training_split: "train" - validation_split: "test" - data: - train_batch_size: 264 - max_prompt_length: 3000 - max_response_length: 10000 -``` -| Configuration | Description | -|--------------|-------------| -| `type` | Use the `huggingface_dat_repo` reader | -| `dataset_path` | Path to the HuggingFace dataset | -| `train_batch_size` | Training batch size (hyperparameter) | -| `max_prompt_length` | Maximum input length | -| `max_response_length` | Maximum response/answer length | - ---- - -## Step 4: Prepare the Workflow - -In AgentJet, a workflow is the basic unit for training. It defines: - -- Agent's behavior and tools -- Interaction procedure with the environment -- How to calculate rewards - -### Define the Agent - -First, import dependencies and design an agent in `workflow.py`: - -```python title="workflow.py" -from agentscope.agent import ReActAgent -from agentscope.formatter import DashScopeChatFormatter -from agentscope.memory import InMemoryMemory -from agentscope.tool import Toolkit, execute_python_code - -system_prompt = """ -You are an agent specialized in solving math problems with tools. -Please solve the math problem given to you. -You can write and execute Python code to perform calculation or verify your answer. -You should return your final answer within \\boxed{}. -""" - -toolkit = Toolkit() -toolkit.register_tool_function(execute_python_code) - -# Agent definition (model will be set later) -ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=None, # leave empty for now - formatter=DashScopeChatFormatter(), - toolkit=toolkit, - memory=InMemoryMemory(), - max_iters=2, -) -``` - -!!! note "Agent Features" - This agent: - - - Uses the ReAct paradigm to interact with tools - - Has a custom system prompt - - Registers `execute_python_code` as a tool - - Implements in-memory memory - -### Wrap in Workflow Class - -Next, wrap the agent into a trainable workflow: - -```python title="workflow.py" -from ajet import AjetTuner, Workflow, WorkflowTask, WorkflowOutput -from agentscope.message import Msg -from loguru import logger - -system_prompt = """ -You are an agent specialized in solving math problems with tools. -Please solve the math problem given to you. -You can write and execute Python code to perform calculation or verify your answer. -You should return your final answer within \\boxed{}. -""" - -def extract_final_answer(result) -> str: - """Extract the final answer from the agent's response.""" - try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): - return result.metadata["result"] - if hasattr(result, "content"): - if isinstance(result.content, dict) and "result" in result.content: - return result.content["result"] - return str(result.content) - return str(result) - except Exception as e: - logger.warning(f"Extract final answer error: {e}. Raw: {result}") - return str(result) - - -class MathAgentWorkflow(Workflow): - name: str = "math_agent_workflow" - - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: - from agentscope.agent import ReActAgent - from agentscope.formatter import DashScopeChatFormatter - from agentscope.memory import InMemoryMemory - from agentscope.tool import Toolkit, execute_python_code - - query = workflow_task.task.main_query - self.toolkit = Toolkit() - self.toolkit.register_tool_function(execute_python_code) - self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=model_tuner, # use model_tuner as the model - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), - max_iters=2, - ) - # disable console output - self.agent.set_console_output_enabled(False) - msg = Msg("user", query, role="user") - # call agent to do the task - result = await self.agent.reply(msg) - # extract the final answer - final_answer = extract_final_answer(result) - # pass the final answer to the output - return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) -``` +Download the `openai/gsm8k` dataset: -!!! warning "Key Change" - The critical step is setting `model=model_tuner` — this is what makes the agent trainable! - -### Configure Workflow in YAML - -Add the workflow configuration to `math_agent.yaml`: - -```yaml title="math_agent.yaml" -ajet: - # ... - rollout: - user_workflow: workflow.py->MathAgentWorkflow - task_judge: - judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge -``` - -The judge reads `final_answer` from `metadata` and compares it with ground-truth answers to produce a score. - ---- - -## Step 5: Configure Required Parameters - -### Pretrained Model - -Specify the LLM to train: - -```yaml title="math_agent.yaml" -ajet: - model: - path: Qwen/Qwen2.5-14B-Instruct +```bash +python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/store/dataset ``` -!!! tip "Model Path" - The `path` can be a remote Hugging Face repo, or a local directory path. +Now, we have obtained all materials required to train the agent. -### Training Hyperparameters -Configure important training hyperparameters: +=== "`math_agent.yaml` - Configuration Yaml" -??? example "Full Configuration Example" - ```yaml title="math_agent.yaml" + ```yaml + # ------------------ main configuration ------------------ ajet: - # ... + project_name: example_math_agent + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + # effective when `type: huggingface_dat_repo` + huggingface_dat_repo: + dataset_path: 'openai/gsm8k' + training_split: "train" + validation_split: "test" + + task_judge: + # ✨✨✨✨ null, because in this certain case, we write reward function together with workflow + judge_protocol: null + + model: + # ✨✨✨✨ set the model to be trained + path: Qwen/Qwen2.5-7B + rollout: - user_workflow: workflow.py->MathAgentWorkflow - temperature: 0.7 - max_env_worker: 64 - num_repeat: 4 - agent_madness_reward: 0.0 - tensor_model_parallel_size: 1 - max_num_seqs: 40 - multi_turn: - max_sample_per_task: 4 - compute_madness_checklist: - - "nonsense" - - "wrong_toolcall" + user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ write and select workflow + num_repeat: 6 # grpo `n` + tensor_model_parallel_size: 1 # vllm tp max_response_length_in_one_turn: 1024 - max_model_len: 13000 + max_model_len: 10000 + + data: + train_batch_size: 100 + max_prompt_length: 3000 + max_response_length: 7000 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 trainer_common: - save_freq: 99999 - test_freq: 99999 - total_epochs: 99999 - trinity_only__n_vllm_engine: 2 - - trinity: - trainer: - max_token_len_per_gpu: 13000 + save_freq: 100 + test_freq: 100 + total_epochs: 100 + logger: swanlab + + # ------------------ do not modify ------------------ + hydra: + searchpath: + - file://ajet/default_config + - file://ajet/default_config/verl + - file://ajet/default_config/trinity + + # ------------------ do not modify ------------------ + defaults: + - verl_default + - trinity_default + - ajet_default + - _self_ + ``` -| Parameter | Description | -|-----------|-------------| -| `temperature` | Model sampling temperature | -| `max_env_worker` | Maximum parallel rollout workers | -| `num_repeat` | Number of repetitions per sample | -| `save_freq` | Checkpoint save interval | -| `test_freq` | Evaluation interval | ---- -## Step 6: Debug +## Step 6: Debug (Optional) -Before full training, test in debug mode: +Before full training, you can run some test in debug mode, using raw base model to test whether bug exists. +We choose VSCode to debug because it is open-source and fast. -```bash -ajet --conf math_agent/math_agent.yaml --backbone='debug' --with-logview -``` !!! tip "VS Code Debugging" - You can configure `.vscode/launch.json` for breakpoint debugging: + - You can create `.vscode/launch.json` for breakpoint debugging: ```json { @@ -344,7 +217,7 @@ ajet --conf math_agent/math_agent.yaml --backbone='debug' --with-logview "console": "integratedTerminal", "args": [ "--backbone", "debug", - "--conf", "math_agent/math_agent.yaml" + "--conf", "tutorial/example_math_agent/math_agent.yaml" ], "env": {} } @@ -352,23 +225,25 @@ ajet --conf math_agent/math_agent.yaml --backbone='debug' --with-logview } ``` ---- +After `.vscode/launch.json` is created, press `F5` to start debugging. (Do not forget to configure python venv path in VSCode.) + +For more debugging techniques, please refer to [debugging guidelines](../debugging_guide). + ## Step 7: Start Training After debugging, launch the full training: ```bash -ajet --conf math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml ``` !!! success "Output Location" - Training logs and checkpoints will be saved to: + Training logs and checkpoints will be saved default to: ``` - ./launcher_record/{exp_yaml_file_name}/ + ./saved_experiments/{exp_yaml_file_name}/ ``` ---- ## Next Steps diff --git a/docs/en/workflow.md b/docs/en/workflow.md index 4a3d8a48..a5164dae 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -1,28 +1,55 @@ # Trainable Workflow -This tutorial introduces how to define a trainable workflow with AgentScope. +This tutorial introduces how to define a trainable workflow. -!!! info "Two Approaches" - AgentJet provides two convenient and **mutually compatible** ways to wrap an AgentScope Workflow: +!!! info "" + AgentJet provides two **convenient** and **mutually compatible** ways to wrap your Workflow: - **Simple**: Emphasizes simplicity, ease of use, and readability - **Advanced**: Emphasizes flexibility, controllability, and extensibility ---- +In this article we use AgentScope framework for demonstration. -## Simple Agent Scenario +## Simple Practice -### 1. Convert Your AgentScope Workflow in AgentJet +!!! Example "Simple Practice Abstract" + - Simply set `model` argument in AgentScope ReActAgent argument to `tuner.as_agentscope_model()` when initializing your agent. + - Wrap your code with `class MyWorkflow(Workflow)` and you agent is ready to be tuned. -Simply set ReActAgent's `model` argument to `model_tuner` when initializing your agent. +### 1. When to Use This Simple Practice + +!!! warning "Choose Simple Practice If You..." + - Know exactly which agents should be trained, or the number of agents is small + - Already finished basic debugging of your workflow + - Do not need to change which agents are trained on the fly + + +### 2. Convert Your Workflow to AgentJet Trainable Workflow + +The very first step is to create a class as a container to wrap your code: + +=== "`converted_workflow.py` - AgentJet Workflow" + + ```python + from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask + class MyWorkflow(Workflow): + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + # ... your ReActAgent workflow here 🛩️ ... + return WorkflowOutput(reward=..., metadata={...}) + + ``` + + +Next, use the `tuner` argument, call its `tuner.as_agentscope_model()` method: === "Before" ```python + model = DashScopeChatModel(model_name="qwen-max", stream=False) # 🛩️ change here agent_instance = ReActAgent( name=f"Friday", sys_prompt="You are a helpful assistant", - model=DashScopeChatModel(model_name="qwen-max", stream=False), + model=model, formatter=DashScopeChatFormatter(), ) ``` @@ -30,215 +57,178 @@ Simply set ReActAgent's `model` argument to `model_tuner` when initializing your === "After" ```python + model = tuner.as_agentscope_model() # 🛩️ change here agent_instance = ReActAgent( name=f"Friday", sys_prompt="You are a helpful assistant", - model=model_tuner, # ← change here + model=model, formatter=DashScopeChatFormatter(), ) ``` -Then, wrap your workflow in a class that inherits `Workflow`: +!!! warning "AjetTuner" + `AjetTuner` also has `.as_raw_openai_sdk_client()` and `.as_oai_baseurl_apikey()` method. But `.as_agentscope_model()` is more convenient for AgentScope agent workflow. -```python -from ajet import Workflow, WorkflowTask, WorkflowOutput, ModelTuner -class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - # ... your ReActAgent workflow here ... - return WorkflowOutput(reward=workflow_reward) -``` +### 3. Code Example -### 2. When to Use This Simple Practice + -!!! tip "Choose Simple Practice If You..." - - Know exactly which agents should be trained, or the number of agents is small - - Already finished basic debugging of your workflow - - Do not need to change which agents are trained on the fly -### 3. Code Example -Suppose you have built a ReAct agent: - -```python title="Original AgentScope Code" -from agentscope.agent import ReActAgent -from agentscope.formatter import DashScopeChatFormatter -from agentscope.memory import InMemoryMemory -from agentscope.tool import Toolkit, execute_python_code - -self.toolkit = Toolkit() -self.toolkit.register_tool_function(execute_python_code) -self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=DashScopeChatModel(model='qwen-max'), - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), -) -msg = Msg("user", query, role="user") -result = await self.agent.reply(msg, structured_model=FinalResult) -final_answer = extract_final_answer(result) -``` - -Wrap it in a workflow class: - -```python title="Trainable Workflow" -class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - - async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - from agentscope.agent import ReActAgent - from agentscope.formatter import DashScopeChatFormatter - from agentscope.memory import InMemoryMemory - from agentscope.tool import Toolkit, execute_python_code - - self.toolkit = Toolkit() - self.toolkit.register_tool_function(execute_python_code) - self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=tuner.as_agentscope_model(), # ← Key change! - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), - ) - - query = task.task.main_query - msg = Msg("user", query, role="user") - result = await self.agent.reply(msg, structured_model=FinalResult) - final_answer = extract_final_answer(result) - return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) -``` - ---- - -## Advanced Agent Scenario + + +## Advanced Practice + +!!! Example "Advanced Practice Abstract" + - The `tuner.as_agentscope_model()` function has hidden paramters, please further complete them to tell AgentJet the identity of agents. + - The `ajet.Workflow` class has hidden attribute `trainable_targets`, please assign it manually to narrow down agents to be tuned. + +### 1. When to Use Advanced Practice When designing a **multi-agent collaborative** workflow where each agent plays a different **role**, AgentJet provides enhanced training and debugging capabilities. -!!! success "Multi-Agent Benefits" +!!! warning "Multi-Agent Benefits" With a multi-agent setup, you can: - **Precisely control** which agents are fine-tuned - Explicitly define the default model for agents **not being trained** - Switch trainable targets on the fly **without modifying** source code -### 1. Trainability Switch and Model Lifecycle +### 1. How to promote to advanced agent scenario: -#### Multi-role Model Registration +Simple, there are only two more issues that should be take care of in addition: -In a multi-agent workflow, each agent is associated with a role. +i. **`.as_agentscope_model` has three hidden (optional) parameters, complete them for each agent.** -| Method | Description | -|--------|-------------| -| `model_tuner.register_model(role, default_model=...)` | Register an agent role and provide the default model for non-training scenarios | -| `model_tuner.get_model(role)` | Return the model object bound to the given role | +| parameter | explaination | +|----------|------------| +| `agent_name` | The name of this agent | +| `target_tag` | A tag that mark the agent category | +| `debug_model` | The model used when this agent is not being tuned | -#### Trainable vs. Non-trainable Models +=== "`as_agentscope_model()` parameters" -Trainability is controlled at the role level via **`trainable_targets`**: + ```python + model_for_an_agent = tuner.as_agentscope_model( + agent_name="AgentFriday", # the name of this agent + target_tag="Agent_Type_1", # `target_tag in self.trainable_targets` means we train this agent, otherwise we do not train this agent. + debug_model=OpenAIChatModel( + model_name="Qwen/Qwen3-235B-A22B-Instruct-2507", + stream=False, + api_key="api_key", + ), # the model used when this agent is not in `self.trainable_targets` + ) + ``` -```python -class ExampleMathLearn(Workflow): - name: str = "a_workflow" - trainable_targets: list = ["TYPE-ZERO", ...] # ← Roles to train +ii. **`Workflow` has a hidden (optional) attribute called `trainable_targets`, config it.** + +| `trainable_targets` value | explaination | +|----------|------------| +| `trainable_targets = None` | All agents using `as_agentscope_model` will be trained | +| `trainable_targets = ["Agent_Type_1", "Agent_Type_2"]` | Agents with `target_tag=Agent_Type_1`, `target_tag=Agent_Type_2`, ... will be trained | +| `trainable_targets = []` | Illegal, no agents are trained | - # ... -``` | Scenario | Model Used | |----------|------------| -| Role in `trainable_targets` | Trainable model | -| Role NOT in `trainable_targets` | Registered default model | - -!!! note "Shared Parameters" - Regardless of role differences, all agents share a single model instance (one set of parameters playing different roles). - -### 2. Promote to An Advanced AgentJet Workflow - -
    -
    Conversion Steps
    - -
    -
      -
    1. Start with a basic AgentScope ReActAgent - -```python -agent_instance = ReActAgent( - name=f"Player-X", - sys_prompt="You are a helpful assistant", - model=DashScopeChatModel(model_name="qwen-max", stream=False), - formatter=DashScopeChatFormatter(), -) -``` -
    2. -
    3. Register the agent role with model_tuner - -```python -agent_role = "TYPE-ZERO" -default_model = DashScopeChatModel(model_name="qwen-max", stream=False) -model_tuner.register_model(agent_role, default_model=default_model) -``` -
    4. -
    5. Create ReActAgent linked to the role - -```python -agent_instance = ReActAgent( - name=f"Player-X", - sys_prompt="You are a helpful assistant", - model=model_tuner.get_model(agent_role), # ← Bind to role - formatter=DashScopeChatFormatter(), -) -``` -
    6. -
    7. Wrap in workflow class with trainable_targets - -```python -class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - trainable_targets: list = ["TYPE-ZERO", ...] - - async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - # ... agents and workflow here ... -``` -
    8. -
    -
    -
    +| `target_tag` in `trainable_targets` | Trainable model | +| `target_tag` NOT in `trainable_targets` | Registered `debug_model` | -### 3. Multi-Agent Example -Here's a complete example with multiple agent roles (Werewolves game): -```python title="Multi-Agent Workflow" -roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] -players = [] +!!! warning + Regardless of `target_tag` differences, all agents share a single model instance (one model weight to play different roles, the model receives different preceptions when playing different roles). -for i, role in enumerate(roles): - # Define different default models for different roles - default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) - default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) - chosen_model = ( - default_model_for_good_guys - if role != "werewolf" - else default_model_for_bad_guys - ) +### 2. Multi-Agent Example - # Register role with its default model - model_tuner.register_model(role, default_model=chosen_model) +Here's a complete example with multiple agent roles (Werewolves game): - # Create agent bound to the role - players += [ReActAgent( - name=f"Player{i + 1}", - sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), - model=model_tuner.get_model(role), - formatter=OpenAIMultiAgentFormatter(), - )] -``` +=== "`tutorial/example_werewolves/start.py`" + ```python + class ExampleWerewolves(Workflow): + trainer: str = Field(default="ajet-trinity") + trainable_targets: List[str] | None = Field(default=["werewolf"], description="List of agents to be fine-tuned.") + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + + # ensure trainable targets is legal + assert self.trainable_targets is not None, "trainable_targets cannot be None in ExampleWerewolves (because we want to demonstrate a explicit multi-agent case)." + + # bad guys and good guys cannot be trained simultaneously + # (because mix-cooperation-competition MARL needs too many advanced techniques to be displayed here) + if "werewolf" in self.trainable_targets: + assert len(self.trainable_targets) == 1, "Cannot train hostile roles simultaneously." + else: + assert len(self.trainable_targets) != 0, "No trainable targets specified." + + # make and shuffle roles (fix random seed for reproducibility) + roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] + task_id = workflow_task.task.metadata["random_number"] + np.random.seed(int(task_id)) + np.random.shuffle(roles) + + # initialize agents + players = [] + for i, role in enumerate(roles): + default_model = OpenAIChatModel( + model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-235B-A22B-Instruct-2507/", + stream=False, + client_args={"base_url": "http://22.17.52.4:2888/v1"}, + api_key="no_api_key", + generate_kwargs={"temperature": 0.01}, + ) + model_for_this_agent = tuner.as_agentscope_model( + agent_name=f"Player{i + 1}", # the name of this agent + target_tag=role, # `target_tag in self.trainable_targets` means we train this agent, otherwise we do not train this agent. + debug_model=default_model, # the model used when this agent is not in `self.trainable_targets` + ) + agent = ReActAgent( + name=f"Player{i + 1}", + sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), + model=model_for_this_agent, + formatter=DashScopeMultiAgentFormatter() + if role in self.trainable_targets + else OpenAIMultiAgentFormatter(), + max_iters=3 if role in self.trainable_targets else 5, + ) + # agent.set_console_output_enabled(False) + players += [agent] + + # reward condition + try: + good_guy_win = await werewolves_game(players, roles) + raw_reward = 0 + is_success = False + if (good_guy_win and self.trainable_targets[0] != "werewolf") or ( + not good_guy_win and self.trainable_targets[0] == "werewolf" + ): + raw_reward = 1 + is_success = True + logger.warning(f"Raw reward: {raw_reward}") + logger.warning(f"Is success: {is_success}") + except BadGuyException as e: + logger.bind(exception=True).exception( + f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent)." + ) + raw_reward = -0.1 + is_success = False + except Exception as e: + logger.bind(exception=True).exception( + f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent)." + ) + raw_reward = -0.1 + is_success = False + + return WorkflowOutput(reward=raw_reward, is_success=is_success) + ``` !!! tip "Configuration Flexibility" In this example: @@ -247,7 +237,13 @@ for i, role in enumerate(roles): - `chosen_model` defines the default model when the role is not being trained - You can flexibly switch training targets by modifying `trainable_targets` ---- + +## TinkerJet + +Wrapping and training your agent on a machine without GPU. + +Working in progress and comming soon. + ## Next Steps diff --git a/docs/index.md b/docs/index.md index 6740fa5e..320b801f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,54 +1,110 @@ # AgentJet -**AgentJet (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentJet (AgentJet)** is a cutting-edge, user-friendly agent tunning framework designed to optimize LLM models and agent workflows. -Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! ---- - -## Key Features +## 🛩️ Key Features
    -

    Easy and Friendly

    AgentJet helps you tune models behind your agent workflows easily. Zero-config defaults and intuitive YAML-based configuration.

    -

    Rich Tutorial Library

    Rich library of examples as tutorials: Math Agent, Werewolves Game, AppWorld and more with step-by-step guides.

    -

    Efficient and Scalable

    Uses Trinity as the default backbone with fully asynchronous RFT. Context merging technique for 1.5x to 20x training acceleration.

    + +
    +

    Get Started with Ease

    +
    +

    + AgentJet simplifies the process of tuning the models that power your agent workflows. It supports nearly all major agent frameworks (e.g. agentscope, langchain), as well as framwork-less agents built from HTTP requests. +

    +
    + +
    +

    Rich Tutorial Library

    +
    +

    + Rich examples as beginner's tutorial: math agent, werewolves rpg, appworld ... All with step-by-step + guides. Covering various agentic frameworks.

    +
    + +
    +

    Reliable and Reproducible

    +
    +

    + Checkout AgentJet's community-powered, robot-assisted open-benchmarking system. + Share progress, compare training backbones, discover bugs and iterate faster than ever! + Click here to see AgentJet performance across tasks/versions/backbones. +

    +
    + +
    +

    Multi-agent and Multi-turn

    +
    +

    + Built to support advanced multi-agent and multi-turn LLM workflows, + AgentJet intergrates timeline-merging algorithms that + automatically analyze and consolidate each agent's LLM timeline, + accelerating training speed 1.5x ~ 10x. +

    +
    + +
    +

    High Resolution Logging

    +
    +

    + Log token-level rollout details, capturing token IDs, token loss masks, and token log probabilities with web UI display. This Support workflow development, agent diagnostics, and facilitate research on advanced LLM algorithm studies. +

    +
    + +
    +

    Any Training Engine

    +
    +

    + Support multiple training engines as backbone (VeRL and Trinity-RFT). Tinker backbone support will be released soon. + Choose from vLLM and SGLang as you wish. Say goodbye to training engine gaps. +

    +
    ---- -## Quick Start -### Installation +## 🛩️ Quick Start + + -We recommend using `uv` for dependency management. -**1. Clone the Repository:** +We recommend using `uv` for dependency management. [Click here](./installation/) for details and other training backbone (e.g. Trinity-RFT) options. -```bash -git clone https://github.com/modelscope/AgentJet.git -cd AgentJet -``` +- Clone the Repository: + ```bash + git clone https://github.com/modelscope/AgentJet.git + cd AgentJet + ``` -**2. Set up Environment:** +- Set up Environment: + ```bash + uv venv --python=3.10.16 && source .venv/bin/activate + uv pip install -e .[verl] -```bash -uv venv --python=3.10.16 && source .venv/bin/activate -uv pip install -e .[trinity] -# Note: flash-attn must be installed after other dependencies -uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir -``` + # Note: flash-attn must be installed after other dependencies + uv pip install flash_attn==2.8.3 --no-build-isolation --no-cache-dir + ``` -### Run Training +- Train the First Agent: + ```bash + # You can start training your first agent with a single command using a pre-configured YAML file -You can start training your first agent with a single command using a pre-configured YAML file: + ajet --conf tutorial/example_math_agent/math_agent.yaml + ``` -```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray -``` ---- -## Example Library {#example-library} + +## 🛩️ Example Library {#example-library} Explore our rich library of examples to kickstart your journey: @@ -61,17 +117,12 @@ Explore our rich library of examples to kickstart your journey:

    Frozen Lake

    Solving a frozen lake walking puzzle using AgentJet's reinforcement learning.

    ---- -## Core Concepts +## 🛩️ Core Concepts AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. -
    -AgentJet Architecture -
    - -### The User-Centric Interface +**🛩️ The User-Centric Interface** To optimize an agent, you provide three core inputs: @@ -81,9 +132,13 @@ To optimize an agent, you provide three core inputs:

    Task Judger

    Evaluates agent outputs and assigns rewards to guide the training process.

    -### Internal System Architecture +
    +AgentJet Architecture +
    + +**🛩️ Internal System Architecture** -The internal system orchestrates several specialized modules: +The internal system orchestrates several specialized modules to handle the complexities of RL training and agent interactions. | Module | Description | |--------|-------------| @@ -91,23 +146,12 @@ The internal system orchestrates several specialized modules: | **Task Rollout** | Bridges LLM engines and manages the Gym environment lifecycle | | **Task Runner** | Executes the AgentScope workflow and calculates rewards | | **Model Tuner** | Forwards inference requests from the workflow to the LLM engine | -| **Context Tracker** | Monitors LLM calls and automatically merges shared-history timelines (3x-10x efficiency boost) | - ---- - -## For Advanced Researchers - -AgentJet provides high-resolution logging and debugging solutions: +| **Context Tracker** | Monitors LLM calls and automatically merges shared-history timelines (1.5x-10x efficiency boost) | -!!! tip "High-Resolution Logging" - Save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. -!!! info "Fast Debugging" - Use the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes. ---- -## Next Steps +## 🛩️ Next Steps

    Installation

    Set up AgentJet environment and dependencies.

    @@ -116,10 +160,9 @@ AgentJet provides high-resolution logging and debugging solutions:

    Examples

    Explore detailed training examples.

    ---- -## 中文文档 + diff --git a/docs/stylesheets/responsive.css b/docs/stylesheets/responsive.css index 5b03d369..2d4a3465 100644 --- a/docs/stylesheets/responsive.css +++ b/docs/stylesheets/responsive.css @@ -1,3 +1,61 @@ + +article p { + font-size: 19px; +} + +article ul>li { + font-size: 19px; + margin-top: calc(var(--spacing) * 2); +} + +.card-desc { + margin: 0; + font-size: 15px; + opacity: 0.8; + line-height: 1.6; + pointer-events: none; +} +.card-header { + display: inline-flex !important; + align-items: center !important; + flex-wrap: nowrap !important; + font-size: 19px; + margin-bottom: 12px; + white-space: nowrap; + pointer-events: none; +} + + +/* 修改链接样式 */ +a[data-sidebar="menu-button"] { + font-size: 17px; + font-weight: 300; + margin-bottom: 12px; +} + +.pr-2 { + font-size: 20px; +} + +.text-muted-foreground { + font-size: 15px; + color: var(--color-muted-foreground); +} + +article .typography h2 { + font-size: 50px; + font-weight: 500; + margin-top: calc(var(--spacing) * 20); +} + + +article .typography h2 { + font-size: 30px; + font-weight: 1000; + margin-top: calc(var(--spacing) * 20); +} + + /* * Responsive Enhancements for OpenJudge Documentation * Phase 5: 响应式完善 diff --git a/ajet/tuner_v2.md b/docs/stylesheets/tuner_v2.md similarity index 95% rename from ajet/tuner_v2.md rename to docs/stylesheets/tuner_v2.md index 1b7a1258..c8766e31 100644 --- a/ajet/tuner_v2.md +++ b/docs/stylesheets/tuner_v2.md @@ -18,7 +18,7 @@ class ExampleMathLearn(Workflow): self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, # 🌟 this will do the trick + model=tuner.as_agentscope_model(), # 🌟 this will do the trick formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), @@ -49,7 +49,7 @@ for i, agent_role in enumerate(roles): name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), model=agentscope_model, - model=model_tuner.as_agentscope_model( + model=tuner.as_agentscope_model( agent_name=f"Player{i + 1}", target_tag=agent_role, # 🌟 tag agents with their role debug_model=chosen_model_for_current_agent # 🌟 assign a debug model, ONLY used when we are NOT training this agent diff --git a/docs/zh/beast_logger.md b/docs/zh/beast_logger.md deleted file mode 100644 index 8249e811..00000000 --- a/docs/zh/beast_logger.md +++ /dev/null @@ -1,105 +0,0 @@ -# Beast-Logger 使用指南 - -Beast-logger 是一个面向 LLM 系统构建的日志工具包,能够提供可靠的、细粒度到 **token-level** 的高分辨率 LLM 活动日志,这种粒度与完整性在其他项目中几乎前所未有。 - -!!! success "核心优势" - Beast-logger 可以记录每一个 token 的详细信息,包括 Token ID、Loss Mask 和 Logprobs,非常适合工作流开发和智能体诊断。 - ---- - -## 在 AgentJet 中使用 - -
    -
    使用流程
    - -
    -
      -
    1. 启动训练 - -使用 AgentJet 的 launcher 启动训练或调试。
    2. -
    3. 等待数据生成 - -等待第一个 batch 完成,日志文件会自动生成。
    4. -
    5. 启动 Web 查看器 - -运行 `beast_logger_go` 命令打开可视化界面。
    6. -
    7. 浏览日志 - -选择日志目录并查看 token 级别的详细信息。
    8. -
    -
    -
    - ---- - -## 详细步骤 - -### Step 1:启动训练 - -使用 AgentJet 的 launcher 启动训练或调试。 - -### Step 2:找到日志文件 - -等待第一个 batch 完成后,日志文件会保存在 `saved_experiments/${experiment_name}` 目录下。 - -!!! example "日志目录示例" - ``` - saved_experiments/benchmark_frozenlake_20251223_2305 - ``` - -### Step 3:启动 Web 查看器 - -在 VSCode 终端(或任何支持端口转发的软件)中运行: - -```bash -beast_logger_go -``` - -然后点击 `http://127.0.0.1:8181` 打开页面。 - -!!! tip "端口转发" - VSCode 会自动将该端口从服务器转发到您的本地电脑。 - -
    -Beast Logger 启动界面 -
    - -### Step 4:选择日志目录 - -填入日志文件所在目录的**绝对路径(ABSOLUTE path)**,然后点击 `submit`。 - -!!! warning "重要提示" - Beast-logger 会递归扫描该路径,并在可能的情况下自动选择包含文件数量最少的最深层目录。 - -
    -选择日志目录 -
    - -### Step 5:浏览日志 - -选择要展示的条目(entry),查看 token 级别的详细信息: - -
    -Token 级日志展示 -
    - ---- - -## Token 颜色说明 - -| 颜色 | 含义 | -|------|------| -| **黄色** | 被排除在 loss 计算之外的 tokens | -| **蓝色** | 参与 loss 计算的 tokens | - -!!! tip "查看 Logprob" - 将鼠标悬停在某个 token 上,会显示该 token 的 logprob 值。 - ---- - -## 下一步 - - diff --git a/docs/zh/component.md b/docs/zh/component.md deleted file mode 100644 index ff9cc559..00000000 --- a/docs/zh/component.md +++ /dev/null @@ -1 +0,0 @@ -# 组件 diff --git a/docs/zh/configuration.md b/docs/zh/configuration.md deleted file mode 100644 index 185dc984..00000000 --- a/docs/zh/configuration.md +++ /dev/null @@ -1,419 +0,0 @@ -# 配置指南 - -本页对 AgentJet 的配置文件进行详细说明。 - ---- - -## 总览 - -AgentJet 使用 YAML 格式的配置文件来设置数据、训练算法、奖励、日志以及其他运行时行为。 - -!!! info "默认配置文件" - 默认配置文件位于 `ajet/default_config/ajet_default.yaml`。 - -一个典型的配置文件包含一个根节点 `ajet`,进一步被划分为若干部分: - -| 类别 | 配置项 | 说明 | -|------|--------|------| -| **基础信息** | `project_name`, `experiment_name`, `experiment_dir`, `backbone` | 标识实验及其保存位置,选择训练后端 | -| **数据与奖励** | `task_reader`, `task_judge`, `data` | 数据加载、评估和 batch 配置 | -| **模型** | `model` | 要训练的基础模型路径 | -| **Rollout** | `rollout`, `context_tracker` | 智能体交互配置和历史管理 | -| **训练** | `trainer_common`, `debug` | 训练超参数和调试配置 | - -!!! tip "配置建议" - 您可以从默认 YAML 开始,只修改与您的使用场景相关的部分。文末*附录*提供了一个**完整配置示例**供参考。 - ---- - -## 模型配置 - -要训练一个智能体,首先需要指定待训练的模型: - -```yaml title="model 配置" -ajet: - model: - path: path/to/model -``` - -=== "本地文件" - - 指向包含 Transformers 格式模型的本地目录: - - ```yaml - ajet: - model: - path: /mnt/data/models/Qwen2.5-14B-Instruct - ``` - -=== "HuggingFace 仓库" - - 指向 HuggingFace 仓库,模型会自动下载并加载: - - ```yaml - ajet: - model: - path: Qwen/Qwen2.5-14B-Instruct - ``` - -!!! warning "LLM-as-a-Judge 环境变量" - 如果在训练中使用 LLM-as-a-Judge,需要配置必要的环境变量: - - ```bash - export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' - export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' - ``` - ---- - -## 数据配置 - -数据相关的配置主要包括两部分:`task_reader` 和 `task_judge`。 - -### Task Reader - -`task_reader` 用于定义如何读取训练集和验证集。支持多种 reader 类型: - -=== "EnvService" - - 从 EnvService 中读取数据: - - ```yaml - ajet: - task_reader: - type: env_service - env_service: - env_type: "appworld" - env_url: "http://127.0.0.1:8080" - env_action_preference: code - training_split: train - validation_split: dev - ``` - -=== "JSONL 文件" - - 从本地 JSONL 文件读取: - - ```yaml - ajet: - task_reader: - type: jsonl_dataset_file - jsonl_dataset_file: - training: - file_path: "xxxx.jsonl" - validation: - file_path: "xxxx.jsonl" - ``` - -=== "HuggingFace" - - 从 HuggingFace 仓库读取: - - ```yaml - ajet: - task_reader: - type: huggingface_dat_repo - huggingface_dat_repo: - dataset_path: "gsm8k" - training_split: "train" - validation_split: "validation" - ``` - -=== "数据生成" - - 从文档自动生成任务: - - ```yaml - ajet: - task_reader: - type: data_generation - data_generation: - document_reader: - document_path: - - 'dataset/document/your-document.pdf' - languages: - - eng - query_reader: - type: dataset_file - dataset_file: - training: - file_path: 'dataset/jsonl/your-queries.jsonl' - task_num: 10 - llm_model: qwen-long - ``` - -### Task Judge - -`task_judge` 用于评估智能体的表现并计算奖励: - -```yaml title="task_judge 配置" -ajet: - task_judge: - judge_type: customized_protocol # 或 'rubrics_auto_grader' - judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 -``` - -| 配置项 | 说明 | -|--------|------| -| `judge_type` | 评测方式:`customized_protocol` 或 `rubrics_auto_grader` | -| `judge_protocol` | 自定义评测器的类路径(格式:`package.module->ClassName`) | -| `alien_llm_model` | 评测时可能用到的辅助 LLM 模型 | - ---- - -## 训练配置 - -### 后端选择 - -AgentJet 支持三种训练后端: - -| 后端 | 说明 | -|------|------| -| **trinity** | 默认选项。通用、灵活且可扩展的大模型强化微调框架 | -| **verl** | Volcano engine reinforcement learning for LLMs | -| **debug** | 允许用户设置断点并调试代码 | - -```yaml -ajet: - backbone: trinity # debug 或 trinity 或 verl -``` - -### Rollout 配置 - -`rollout` 配置控制智能体在与环境进行交互采样过程中的行为: - -```yaml title="rollout 配置" -ajet: - rollout: - user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - max_env_worker: 128 - temperature: 0.9 - top_p: 1.0 - name: vllm - n_vllm_engine: 2 - num_repeat: 4 -``` - -| 配置项 | 说明 | -|--------|------| -| `user_workflow` | 具体的交互协议实现类 | -| `temperature` / `top_p` | 采样参数 | -| `name` | 推理引擎名称(例如 `vllm`) | -| `n_vllm_engine` | vLLM 引擎数量(仅 trinity 后端有效) | - -### 通用训练参数 - -`trainer_common` 包含训练流程控制的通用参数: - -```yaml title="trainer_common 配置" -ajet: - trainer_common: - total_epochs: 50 - save_freq: 20 - test_freq: 20 - val_before_train: False - val_pass_n: 4 - nnodes: 1 - n_gpus_per_node: 8 - mini_batch_num: 1 - ulysses_sequence_parallel_size: 1 - fsdp_config: - param_offload: True - optimizer_offload: True -``` - -??? note "参数详解" - | 配置项 | 说明 | - |--------|------| - | `total_epochs` | 训练总 epoch 数 | - | `save_freq` | 保存模型 checkpoint 的频率(以 step 计) | - | `test_freq` | 执行验证/测试的频率(以 step 计) | - | `val_before_train` | 是否在训练开始前先执行一次验证 | - | `val_pass_n` | 验证阶段每个问题的采样数量(Pass@N) | - | `nnodes` / `n_gpus_per_node` | 分布式训练配置 | - | `mini_batch_num` | 梯度累积的 mini-batch 数量 | - | `fsdp_config` | FSDP 配置,控制参数和优化器 offload | - -### 优化算法 - -优化算法及其超参数主要在 `algorithm`、`optim` 中设置: - -```yaml title="优化算法配置" -ajet: - trainer_common: - algorithm: - adv_estimator: grpo - use_kl_in_reward: False - optim: - lr: 1e-6 - use_kl_loss: True - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl -``` - -| 配置项 | 说明 | -|--------|------| -| `adv_estimator` | Advantage 计算方法(例如 `grpo`) | -| `lr` | 学习率 | -| `use_kl_loss` | 是否在损失计算中加入 KL 约束 | -| `kl_loss_coef` | KL 损失系数 | - -### 调试模式 - -当 `backbone` 设置为 `debug` 时使用的配置: - -```yaml title="debug 配置" -ajet: - debug: - debug_max_parallel: 16 - debug_first_n_tasks: 2 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - debug_tensor_parallel_size: 4 -``` - -!!! tip "调试模式用途" - - **限制任务数与并发数**:在少量任务和较小并发下快速验证训练流程 - - **固定随机性**:通过 `debug_vllm_seed` 帮助复现问题 - ---- - -## 日志与训练监控 - -### 配置 Logger - -AgentJet 支持多种日志后端: - -| 后端 | 说明 | -|------|------| -| `console` | 将日志输出到标准输出 | -| `wandb` | 对接 Weights & Biases 平台 | -| `swanlab` | 使用 SwanLab 进行日志记录 | - -```yaml -ajet: - trainer_common: - logger: swanlab -``` - -### 日志结构 - -所有实验输出都会保存在 `./launcher_record/{experiment_name}` 目录下: - -| 类型 | 说明 | -|------|------| -| **Logs** | 训练过程生成的日志与错误信息 | -| **Metrics** | 具体输出位置取决于所选的 logger 后端 | -| **Checkpoint** | 训练得到的模型 checkpoint | - ---- - -## 附录:完整配置示例 - -??? example "完整配置文件" - ```yaml - ajet: - project_name: "ajet_default_project" - experiment_name: "read_yaml_name" - experiment_dir: "auto" - backbone: debug - - model: - path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct - - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 32 - - rollout: - user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - force_disable_toolcalls: False - max_env_worker: 128 - gamma: 1.0 - compute_madness_checklist: - - "nonsense" - agent_madness_termination: True - agent_madness_reward: -1.0 - max_response_length_in_one_turn: 4096 - max_model_len: 18000 - multi_turn: - max_sample_per_task: 30 - max_steps: 30 - expected_steps: 1 - tensor_model_parallel_size: 1 - n_vllm_engine: 2 - max_num_seqs: 10 - name: vllm - num_repeat: 4 - temperature: 0.9 - top_p: 1.0 - val_kwargs: - temperature: 0.0 - top_k: -1 - top_p: 1.0 - do_sample: False - num_repeat: 1 - - task_reader: - type: env_service - jsonl_dataset_file: - training: - file_path: "/path/to/training/data.jsonl" - validation: - file_path: "/path/to/validation/data.jsonl" - env_service: - env_type: "appworld" - env_url: "http://127.0.0.1:8080" - env_action_preference: code - training_split: train - validation_split: dev - huggingface_dat_repo: - dataset_path: "gsm8k" - training_split: "train" - validation_split: "validation" - - task_judge: - judge_type: customized_protocol - judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - - debug: - debug_max_parallel: 16 - debug_first_n_tasks: 2 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - debug_tensor_parallel_size: 4 - - trainer_common: - val_before_train: False - val_pass_n: 4 - save_freq: 20 - test_freq: 20 - total_epochs: 50 - nnodes: 1 - n_gpus_per_node: 8 - logger: swanlab - algorithm: - adv_estimator: grpo - use_kl_in_reward: False - mini_batch_num: 1 - fsdp_config: - param_offload: True - optimizer_offload: True - optim: - lr: 1e-6 - use_kl_loss: True - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - ulysses_sequence_parallel_size: 1 - checkpoint_base_dir: ./saved_checkpoints - - context_tracker: - context_tracker_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - ``` diff --git a/docs/zh/data_generation.md b/docs/zh/data_generation.md deleted file mode 100644 index dcb23130..00000000 --- a/docs/zh/data_generation.md +++ /dev/null @@ -1,239 +0,0 @@ -# 数据生成 - -`Data Generation Reader` 提供了一个智能化的数据生成方法,旨在简化高质量训练数据的创建过程。方法设计灵活、高效,可以基于 Few-shot 数据与文档(可选)来生成领域特定的任务(Query)。 - ---- - -## 概述 - -!!! info "核心特点" - `Data Generation Reader` 采用两阶段任务生成流程,可以从少量样本和文档中自动生成大量训练任务。 - ---- - -## 方法简介 - -### 第一阶段(可选):基于文档的数据生成 - -此阶段为可选步骤。`Document-based Data Generation` 会基于提供的文档内容,生成知识类提问任务。 - -=== "输入:文档内容" - - ```plain - According to the Anti-Money Laundering and Counter-Terrorist - Financing Ordinance and related Guideline, banks are required - to identify and take reasonable measures to verify the identity - of the beneficial owner of corporate customers so that the bank is ... - ``` - -=== "输出:生成的任务" - - ```json - [ - { - "main_query": "What are the key requirements of Customer Due Diligence in AML procedures?", - "related_doc": "Customer Due Diligence measures should include: (a) identifying the customer..." - }, - { - "main_query": "How should financial institutions handle Suspicious Transaction Reports?", - "related_doc": "When someone knows or suspects that any property represents the proceeds..." - } - ] - ``` - -!!! tip "文档生成的数据用途" - 若提供文档进行生成数据,该部分生成的数据会补充到后续的训练过程中的验证任务集合。 - -### 第二阶段:少样本数据生成 - -此阶段会生成最终的训练任务。`Few-shot Data Generation` 将少量用户提供的任务与第一阶段生成的知识类任务组合,并参考文档内容生成训练任务。 - -=== "输入:少量任务示例" - - ```json - {"main_query": "Can banks ask corporate customers to provide information of its ownership?", "answer": "According to the Anti-Money Laundering..."} - {"main_query": "Can a bank close my account?", "answer": "Either a customer or a bank may close an account at any time..."} - ``` - -=== "输出:批量生成的任务" - - ```json - [ - { - "main_query": "Are financial institutions required to verify the source of funds for corporate clients during account opening?" - }, - { - "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" - } - ] - ``` - ---- - -## 快速开始 - -`Data Generation Reader` 可以从本地路径读取用户提供的少量任务以及 PDF、Word、TXT 等多种格式的文档(可选),生成任务并读取为训练任务。 - -### 步骤 1:准备数据 - -**提供少量原始任务数据:** - -```json title="your-queries.jsonl" -{"main_query": "What is the capital of France?", "answer": "..."} -{"main_query": "How to cook pasta?", "answer": "..."} -``` - -**提供文档(可选):** - -```bash -mkdir -p dataset/document -cp your-document.pdf dataset/document/ -``` - -### 步骤 2:生成训练任务 - -=== "方式 1:接入训练流程" - - 修改配置文件,将 `ajet.task_reader.type` 设置为 `data_generation`: - - ```yaml title="config.yaml" - ajet: - task_reader: - type: data_generation - data_generation: - # 文档读取器配置 - document_reader: - document_path: - - 'dataset/document/your-document1.pdf' - - 'dataset/document/your-document2.pdf' - languages: - - eng - # 任务读取器配置 - query_reader: - type: jsonl_dataset_file - jsonl_dataset_file: - training: - file_path: 'dataset/jsonl/your-queries.jsonl' - # 生成任务的数量 - task_num: 10 - # LLM 配置 - llm_model: qwen-long - llm_response_length: 8192 - num_workers: 32 - sampling_params: - temperature: 0 - # 任务过滤配置 - deduplication_filter: - enabled: true - params: - similarity_threshold: 0.8 - db_path: ./.similarity_db - model: text-embedding-v4 - api_key: null - base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 - ``` - -=== "方式 2:单独运行脚本" - - ```python title="generate_data.py" - from ajet.data_generator.config import * - from ajet.task_reader.data_generator_reader import DataGeneratorTaskReader - - def run(): - config = TaskReaderConfig( - data_generation=DataGenerationConfig( - document_reader=DocumentReaderConfig( - document_path=['dataset/document/your-document1.pdf'], - languages=["eng"], - chunk_size=5120, - split_by="sentence", - ), - query_reader=QueryReaderConfig( - type="jsonl_dataset_file", - jsonl_dataset_file=DatasetFileConfig( - training=TrainingDatasetConfig( - file_path='dataset/jsonl/your-queries.jsonl' - ) - ), - ), - task_num=50, - llm_model="qwen-long", - num_workers=16, - sampling_params=SamplingParamsConfig(temperature=0.0), - deduplication_filter=DeduplicationFilterConfig( - enabled=True, - params=DeduplicationFilterParamsConfig( - similarity_threshold=0.8, - model="text-embedding-v4", - ), - ), - ) - ) - reader = DataGeneratorTaskReader(reader_config=config) - - run() - ``` - ---- - -## 生成任务示例 - -`Data Generation Reader` 基于用户提供的文档(可选)与少量任务示例,即可批量生成训练任务: - -```json title="生成的任务" -[ - { - "main_query": "Are financial institutions required to verify the source of funds for corporate clients during account opening?" - }, - { - "main_query": "What are the requirements for banks to verify customer identities under anti-money laundering regulations?" - } -] -``` - ---- - -## 详细配置选项 - -### 文档读取器配置 - -| 参数 | 类型 | 默认值 | 必填 | 说明 | -|------|------|--------|------|------| -| `document_path` | `list[str]` | - | 否 | 文档文件路径列表,支持 PDF、Word、TXT 等 | -| `languages` | `list[str]` | `['eng']` | 否 | 文档语言列表,如 `eng`、`chs` | - -### 任务读取器配置 - -| 参数 | 类型 | 默认值 | 必填 | 说明 | -|------|------|--------|------|------| -| `type` | `str` | `jsonl_dataset_file` | 是 | 读取器类型:`jsonl_dataset_file`、`env_service`、`huggingface_dat_repo` | -| `file_path` | `str` | - | 是 | 训练任务 JSONL 文件路径 | - -### 生成配置 - -| 参数 | 类型 | 默认值 | 必填 | 说明 | -|------|------|--------|------|------| -| `task_num` | `int` | `10` | 是 | 要生成的任务数量 | -| `llm_model` | `str` | `qwen-long` | 是 | 用于生成任务的 LLM 模型 | -| `llm_response_length` | `int` | `8192` | 否 | LLM 响应的最大 token 长度 | -| `num_workers` | `int` | `32` | 否 | 并行工作线程数 | -| `temperature` | `float` | `0` | 否 | 采样温度,0 表示贪婪解码 | - -### 去重过滤配置 - -| 参数 | 类型 | 默认值 | 必填 | 说明 | -|------|------|--------|------|------| -| `enabled` | `bool` | `true` | 否 | 是否启用去重过滤器 | -| `similarity_threshold` | `float` | `0.8` | 是 | 相似度阈值(0-1),超过此值的任务会被过滤 | -| `db_path` | `str` | `./.similarity_db` | 否 | 相似度数据库存储路径 | -| `model` | `str` | `text-embedding-v4` | 是 | 用于计算相似度的 embedding 模型 | -| `api_key` | `str` | `null` | 否 | API Key,为 `null` 时从环境变量加载 | - ---- - -## 下一步 - - diff --git a/docs/zh/data_pipeline.md b/docs/zh/data_pipeline.md deleted file mode 100644 index 6af4a24c..00000000 --- a/docs/zh/data_pipeline.md +++ /dev/null @@ -1,172 +0,0 @@ -# 任务加载器 - -AgentJet 通过 Task Reader 从多种数据源加载训练任务。本页面介绍 Task 的统一 Schema 定义,以及面向常见场景的内置 Task Reader。 - ---- - -## 概览 - -在智能体训练中,所有训练数据都必须以**任务(task)**的形式表示,并遵循统一的 Schema。 - -!!! info "Task Reader 核心特性" - - **统一 Schema**:无论数据源是什么,所有任务都统一映射为 `Task` 结构 - - **多种来源**:支持从本地文件、HuggingFace 数据集、交互式环境加载,或自动生成新任务 - - **自动路由**:框架会根据配置中的 `ajet.task_reader.type` 自动选择合适的 reader - -``` -Data Source → Task Reader → Unified Task Schema → Training Pipeline -``` - ---- - -## 任务结构 - -所有训练任务都必须按照以下结构定义: - -```python -class Task(BaseModel): - main_query: str = Field(default="") - init_messages: List[dict] = Field(default=[]) - task_id: str = Field(default="") - env_type: str = Field(default="") - metadata: dict = Field(default_factory=dict) -``` - -### 字段说明 - -| 字段 | 类型 | 说明 | -|------|------|------| -| `main_query` | `str` | 智能体需要解决的主要指令或问题 | -| `init_messages` | `List[dict]` | 初始对话消息(例如 system prompt)。每条消息必须包含 `role` 和 `content` 字段 | -| `task_id` | `str` | 任务的唯一标识 | -| `env_type` | `str` | 环境类型(例如 `"math"`、`"appworld"`) | -| `metadata` | `dict` | 额外的上下文信息(例如用于奖励计算的参考答案) | - -### Task 示例 - -```json title="task_example.json" -{ - "main_query": "What is 15 * 23?", - "init_messages": [ - { - "role": "system", - "content": "You are a helpful math assistant." - } - ], - "task_id": "math_001", - "env_type": "math", - "metadata": { - "answer": "345", - "difficulty": "easy" - } -} -``` - -!!! tip "最佳实践" - - 使用 `metadata` 存储奖励计算所需的信息(例如参考答案、评分规则) - - 保持 `main_query` 清晰且简洁 - - 使用 `init_messages` 提供 system prompt 或 few-shot 示例 - ---- - -## 内置 Task Readers - -AgentJet 提供了 6 个内置 Task Reader,覆盖不同场景。框架会根据配置中的 `ajet.task_reader.type` 自动路由到正确的 reader。 - -### 快速选择指南 - -| 场景 | Reader Type | 适用情况 | -|------|-------------|----------| -| **本地 JSONL 文件** | `jsonl_dataset_file` | 您已经准备好 JSONL 格式的任务数据 | -| **HuggingFace 数据集** | `huggingface_dat_repo` | 从 HuggingFace Hub 加载任务(例如 GSM8K) | -| **交互式环境** | `env_service` | 任务来自运行中的环境服务(例如 AppWorld、FrozenLake) | -| **从文档自动生成** | `data_generation` | 从知识文档生成任务或基于已有任务进行扩增 | - ---- - -### 1. JSONL 文件 Reader - -**适用场景:** 您在本地以 JSONL 格式准备了训练任务。 - -```yaml title="配置方式" -ajet: - task_reader: - type: jsonl_dataset_file - jsonl_dataset_file: - training: - file_path: "data/train.jsonl" - validation: - file_path: "data/val.jsonl" -``` - -**JSONL 格式要求:** 每一行都应是一个符合 Task Schema 的 JSON 对象: - -```json title="train.jsonl" -{"main_query": "Solve: x + 5 = 12", "task_id": "algebra_01", "env_type": "math", "metadata": {"answer": "7"}} -{"main_query": "What is the capital of France?", "task_id": "geo_01", "env_type": "qa", "metadata": {"answer": "Paris"}} -``` - -!!! note "工作原理" - - 按行读取指定的 JSONL 文件 - - 自动按 Task Schema 校验数据 - - 支持训练集与验证集分离 - ---- - -### 2. HuggingFace 数据集 Reader - -**适用场景:** 从 HuggingFace Hub 的数据集中加载任务(例如 GSM8K、MATH)。 - -```yaml title="配置方式" -ajet: - task_reader: - type: huggingface_dat_repo - huggingface_dat_repo: - dataset_path: "gsm8k" # HF dataset repo name - dataset_name: "main" # Optional: dataset subset name - training_split: "train" # Training split name - validation_split: "test" # Validation split name -``` - -!!! note "工作原理" - - 使用 `datasets` 库从 HuggingFace Hub 下载数据集 - - 自动将数据集字段映射到 Task Schema - - 将下载的数据缓存在本地,便于后续更快重复运行 - -**支持的数据集:** 任意可映射到 Task Schema 的 HuggingFace 数据集。 - ---- - -### 3. EnvService Reader - -**适用场景:** 任务由交互式环境服务提供(例如 AppWorld、RL gym 环境)。 - -```yaml title="配置方式" -ajet: - task_reader: - type: env_service - env_service: - env_type: "appworld" # Environment type - env_url: "http://127.0.0.1:8080" # Service URL - env_action_preference: code # Action format: code/text/box - training_split: train - validation_split: dev -``` - -!!! note "工作原理" - - 通过 HTTP 连接到正在运行的环境服务 - - 从环境中拉取任务实例 - - 支持从交互式环境中动态生成任务 - -!!! example "典型用例" - - 在模拟环境中训练智能体(例如 FrozenLake、各类游戏环境) - - 任务需要动态生成、评测依赖环境状态的复杂交互场景 - ---- - -## 下一步 - - diff --git a/docs/zh/example.md b/docs/zh/example.md deleted file mode 100644 index 39ce31c8..00000000 --- a/docs/zh/example.md +++ /dev/null @@ -1,3 +0,0 @@ -# 示例 - -本页提供了一些使用 AgentJet 的实际示例。 diff --git a/docs/zh/example_app_world.md b/docs/zh/example_app_world.md deleted file mode 100644 index fe6e3322..00000000 --- a/docs/zh/example_app_world.md +++ /dev/null @@ -1,203 +0,0 @@ -# AppWorld 智能体 - -本教程介绍如何训练一个智能体与 AppWorld 交互并解决复杂的任务。 - ---- - -## 概述 - -
    -

    -AppWorld 是一个模拟现实 APP 操作的沙盒环境,包含 9 个日常应用,可通过 457 个 API 操作,并预置了 106 个在模拟世界中生活的数字用户行为数据。我们的目标是调优一个智能体,使其能够有效地在这些应用中执行并完成复杂任务。 -

    -
    - -本文结构如下: - -1. 快速开始 -2. 理解实现:Workflow 核心流程、配置、代码位置、奖励机制 -3. 结果:训练曲线与案例对比 - ---- - -## 快速开始 - -### 准备工作 - -首先,需要准备 AppWorld 所需的环境服务: - -```bash -base_path="/tmp" -export APPWORLD_PATH="${base_path}/pack_all_in_one" -export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" - -rm -rf "${APPWORLD_PATH}" -rm -f ./appworld_pack_v2.tar.gz - -wget -q "https://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/astuner_archive/appworld_pack_v2.tar.gz" -O appworld_pack_v2.tar.gz -tar -xzf ./appworld_pack_v2.tar.gz -C "${base_path}" -``` - -!!! warning "环境变量设置" - 每次开启新的 shell 窗口都需要运行以下环境变量设置: - - ```bash - export BASE_PATH=/tmp - export APPWORLD_PATH="${BASE_PATH}/pack_all_in_one" - export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" - ``` - -### 开始训练 - -运行训练脚本: - -```bash -ajet --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray -``` - -??? tip "快速调试(可选)" - 不启用 Ray 在本地运行,便于更快迭代: - - ```bash - ajet --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview - ``` - - 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与您的代码位置一致。 - ---- - -## 理解实现 - -### 核心流程 - -AppWorld 示例所使用的 AgentScope Workflow 代码位于:`tutorial/example_appworld/appworld.py`。 - -```python title="Workflow 核心代码" -agent = ReActAgent( - name="Qwen", - sys_prompt=first_msg["content"], - model=model_tuner, - formatter=DashScopeChatFormatter(), - memory=InMemoryMemory(), - toolkit=None, - print_hint_msg=False, -) - -env = workflow_task.gym_env -for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): - # agentscope 处理交互消息 - reply_message = await agent(interaction_message) - # env_service 协议 - obs, _, terminate, _ = env.step( - action={"content": reply_message.content, "role": "assistant"} - ) - # 使用环境的输出构造新的交互消息 - interaction_message = Msg(name="env", content=obs, role="user") - # 是否终止? - if terminate: - break - if model_tuner.get_context_tracker().context_overflow: - break -``` - -| 关键点 | 说明 | -|--------|------| -| `env.step` | 模拟 gym 接口。输入一个 action,返回 `(observation, reward, terminate_flag, info)` | -| `context_overflow` | 检查当前上下文窗口是否已经超过 token 限制 | - -### 奖励机制 - -在 `ajet/task_judge/env_service_as_judge.py` 中,通过 `env.evaluate(...)` 从环境中读取奖励信号。 - -!!! tip "自定义 Judge" - 您可以参考该文件,为自己的任务实现专用的 Judge 模块。 - -### 配置说明 - -`tutorial/example_appworld/appworld.yaml` 中的关键配置参数: - -```yaml title="appworld.yaml" -ajet: - project_name: example_appworld - experiment_name: "read_yaml_name" - task_judge: - # [关键] 编写并选择评估函数 - judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge - model: - # [关键] 设置需要训练的模型 - path: YOUR_MODEL_PATH - rollout: - # [关键] 编写并选择智能体 - user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - force_disable_toolcalls: True - debug: - debug_max_parallel: 1 - debug_first_n_tasks: 1 -``` - -| 配置项 | 说明 | -|--------|------| -| `task_reader` | 读取任务 | -| `user_workflow` | 定义 Workflow | -| `judge_protocol` | 定义评分函数 | -| `model.path` | 指定模型 | - ---- - -## 结果 - -### 训练曲线 - -
    -训练曲线 -
    - -!!! info "可视化说明" - 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 - -随着训练的进展,奖励也会增加。这通常意味着智能体在**两个方面**变得更加稳定: - -- **遵循正确的 API 协议**:学会在调用前查阅 API 文档,并使用有效的 API 端点 -- **完成多步工作流**:能够正确获取 access token,并串联多个 API 调用以完成复杂任务 - -### 案例展示 - -=== "调优前" - - **问题 1:频繁调用不存在的 API** - - ![调优前 - 幻觉 API](https://img.alicdn.com/imgextra/i1/O1CN015FgjqI20Ip3AJybr0_!!6000000006827-2-tps-1259-683.png) - - 智能体在不检查 API 是否存在的情况下产生幻觉,导致重复失败。 - - **问题 2:没有学会按照说明获取 access token** - - ![调优前 - Token 问题](https://img.alicdn.com/imgextra/i1/O1CN01bGZ1s01VyjCSrTJte_!!6000000002722-2-tps-1181-954.png) - - 智能体在未先获取所需的访问令牌的情况下尝试调用受保护的 API,导致认证错误。 - -=== "调优后" - - **改进 1:会先查阅 API 文档,使用有效的 API** - - ![调优后 - 正确的 API](https://img.alicdn.com/imgextra/i4/O1CN01VRIDy922PoKD1bETl_!!6000000007113-2-tps-1180-944.png) - - 智能体现在会先检查可用的 API 再发起调用,从而避免臆造不存在的接口端点。 - - **改进 2:学会正确获取 access token** - - ![调优后 - Token 正确](https://img.alicdn.com/imgextra/i2/O1CN01xiF9UU20h62dyrZ4x_!!6000000006880-2-tps-1182-793.png) - - 智能体在访问受保护的 API 之前,会先正确完成认证步骤。 - -!!! note "Token 级可视化" - 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md)。 - ---- - -## 下一步 - - diff --git a/docs/zh/example_countdown.md b/docs/zh/example_countdown.md deleted file mode 100644 index 82b6eca2..00000000 --- a/docs/zh/example_countdown.md +++ /dev/null @@ -1,177 +0,0 @@ -# 倒计时数字游戏 - -## 1. 概述 - -Countdown 任务是一个数学益智游戏:给定一组数字和一个目标数字,玩家需要利用这组数字,通过加、减、乘、除四则运算,构造一个算式,使其计算结果等于目标数字。每个数字只能使用一次,但可以自由使用括号改变运算顺序。 - -## 2. 快速开始 - -### 2.1 准备工作 -下载 `Jiayi-Pan/Countdown-Tasks-3to4` 数据集,并划分训练、测试集: - -```bash -python tutorial/example_countdown/prepare_data.py --target=Jiayi-Pan/Countdown-Tasks-3to4 --path=/the/path/to/store/dataset -``` - -Countdown 数据集包含 `target` 和 `nums` 两个字段,需要自定义数据格式化逻辑。例如:使用 `huggingface_dat_repo` 的读取方式时,需要修改 `ajet/task_reader/hf_dataset_reader.py` 中的 `_load_dataset_split` 方法: - -```python -task = Task( - main_query=json.dumps({'target': example["target"], 'nums': example["nums"]}), - init_messages=[], - task_id=str(idx), - env_type="no_env", - metadata=example, -) -``` - -### 2.2 开始训练 - -直接运行以下命令: - -```bash -# 建议在启动前先杀掉所有 ray、vllm 和 env_service 相关进程( python launcher.py --kill="python|ray|vllm" ) -ajet --conf tutorial/example_countdown/countdown.yaml --backbone='verl' -``` - -
    -快速调试(可选) - -不启用 Ray 在本地运行,便于更快迭代: - -```bash -ajet --conf tutorial/example_countdown/countdown.yaml --backbone='debug' --with-logview -``` - -如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与你的代码位置一致。 - -
    - -## 3. 理解实现 - -本节将介绍本教程的实现细节。 - -### 3.1 核心流程 -详见 `tutorial/example_countdown/countdown.py`。你可以在项目中的任意位置编写新的 AgentScope Workflow 代码。 - -- **定义 AgentScope Workflow** - -```python -self.agent = ReActAgent( - name="countdown_react_agent", - sys_prompt=system_prompt, - model=model_tuner, - formatter=DashScopeChatFormatter(), - memory=InMemoryMemory(), - max_iters=2, -) -msg = Msg("user", query, role="user") -result = await self.agent.reply(msg) -``` - -在 AgentScope Workflow 中,你需要将评估函数所需的关键信息写入,例如: - -```python -WorkflowOutput( - reward=None, - metadata={ - "final_answer": final_answer, - "target": target, - "nums": nums, - } -) -``` - -### 3.2 配置说明 -拷贝并修改 `tutorial/example_countdown/countdown.yaml` 中的关键配置参数。yaml 中与本示例最相关的部分已经用 标出。 - -1. 读取任务(对应配置字段 `ajet.task_reader`) -2. 定义 Workflow(对应配置字段 `ajet.rollout.user_workflow`) - - 示例:如果 AgentScope Workflow 定义在 `tutorial/example_countdown/countdown.py` 的 `ExampleCountdownLearn` 类中 - - 则配置 `ajet.rollout.user_workflow` = `tutorial.example_countdown.countdown->ExampleCountdownLearn` -3. 定义评分函数(对应配置字段 `ajet.task_judge.judge_protocol`) - - 示例:如果评分逻辑定义在 `tutorial/example_countdown/countdown_answer_as_judge.py` 的 `CountdownAnswerAsJudge` 类中 - - 则配置 `tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge` -4. 指定模型(对应配置字段 `ajet.model.path`) - -```yaml -ajet: - task_reader: - type: huggingface_dat_repo # [关键] `env_service` 或 `dataset_file` 或 `huggingface_dat_repo` 或 `data_generation` - rollout: - user_workflow: tutorial.example_countdown.countdown->ExampleCountdownLearn # [关键] 编写并选择智能体 - task_judge: - # [关键] 编写并选择评估函数 - judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge - model: - # [关键] 设置需要训练的模型 - path: YOUR_MODEL_PATH -``` - -### 3.3 代码解读 - -- `tutorial/example_countdown/countdown.py`:定义 AgentScope workflow(例如 `ExampleCountdownLearn`)。 -- `tutorial/example_countdown/countdown.yaml`:将 task_reader、workflow、judge、model 等模块连接起来。 - -### 3.4 奖励/评估机制 -在 `tutorial/example_countdown/countdown_answer_as_judge.py` 中提供了一个简单的 Judge 示例。你也可以在项目任意位置实现自己的 Judge 逻辑。 - -Judge 的输入参数包括: - -``` -workflow_task: 任务信息(如果包含参考答案,可以从这里获取) -workflow_output: 任务信息输出(final_answer需要手动添加) -``` - -Judge 的返回值包括: - -- raw_reward -- is_success - -## 4. 结果 - -### 4.1 训练曲线/指标 - -> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md). - -![Tracing curve](https://img.alicdn.com/imgextra/i4/O1CN01TtaeD91rnfBF736Zu_!!6000000005676-2-tps-1328-630.png) - -奖励值的上升趋势反映了两个关键方面的改进: - -* **格式遵循**: 智能体 学会生成格式良好的 `` JSON,并使用 `\boxed{...}` 包裹答案。 -* **准确率提升**: 智能体 在解决问题上的正确率提高。 - -### 4.2 案例分析 - -在训练初期, 智能体 已经能够处理一些简单问题;但由于小模型的能力限制,仍然会产生许多无法完全满足要求的答案。在一些题目中, 智能体 没有严格遵循指令,例如输出格式不正确、重复使用数字、或缺少表达式输出。 - -``` -bad case 1: 回答格式不符合要求。 -<|im_start|>assistant - -{"name": "generate_response", "arguments": "Let's start by subtracting 28 from 76, which gives us 48. Now we need to get to 55 from 48. We can achieve this by adding 7 from the remaining numbers. However, 7 is not available. The next best number is 69. If we subtract 69 from 78, we get -11. If we subtract -11 from 48, we actually end up adding 11, which isn't one of our numbers. The correct approach would be to add 7 from the remaining numbers, but since 7 isn't available, we can use 69 and adjust our strategy. We can add 7 from the remaining numbers in another way. Let's try subtracting 69 from 78 to get -11, and then add 11 to 48. 11 can be obtained by subtracting 69 from 80, but since 80 isn't available, we'll use the next best approach. We'll subtract 69 from 78 to get -11, and then add 16 to 48 to reach 55. We can get 16 by subtracting 7 from 23, but since 23 isn't available, we need to find an alternative. The best way would be to use 78 - 69 = -11, and then 48 + 11 = 59 which is close but not 55. However, we can achieve 55 by using 78 - 69 + 7 = 55. So, the correct calculation is 78 - 69 + 7 = 55."} -<|im_end|> - -bad case 2: 没有遵循指令,重复使用数字。 -<|im_start|>assistant - NavParams = {"response": "Let's solve this step by step. We have the numbers 72, 20, and 4, and we need to reach the target number 38 using arithmetic operations.\n\nFirst, let's try using subtraction and addition since 72 is quite large and can help us get closer to our target if we subtract something. We can subtract 20 from 72 to get 52, which is close but still far from 38. Now, we can subtract 4 from 52 to get 48, and then subtract 10 to reach 38. Since we don't have a 10 directly, we can use 20 - 4 = 16, and then subtract 16 from 48 to get 32, and finally add 6 (which is 4 + 2) to reach 38.\n\nLet's try a more efficient approach: 72 - 20 = 52, and 52 - 4 = 48, now we need to reduce it by 10, which is 20 - 14, and 14 can be obtained by 20 - 4 - 2. So, 48 - (20 - 4 - 2) = 48 - 14 = 34, then we need 4 more to reach 38, which is simply 4. Thus, the solution is (72 - 20) - 4 - (20 - 4 - 2) + 4 = 38."} - -{"name": "generate_response", "arguments": {"response": "The solution is \boxed{(72 - 20) - 4 - (20 - 4 - 2) + 4}. Let's break it down: \n1. 72 - 20 = 52\n2. 52 - 4 = 48\n3. 20 - 4 - 2 = 14\n4. 48 - 14 = 34\n5. 34 + 4 = 38\nTherefore, we reach the target number 38."}} -<|im_end|> - -bad case 3: 没有正确给出表达式。 -<|im_start|>assistant - -{"name": "generate_response", "arguments": {"response": "In this case, one straightforward way to reach the target number 64 is by directly using the number 64 itself, since it matches the target exactly. No other calculations are needed."}} -boxing the answer as \boxed{{64}}.<|im_end|> -``` - -不过,经过调优后,这些问题会得到明显改善,例如下图所示: - -1. **消息 3**:将问题拆解并发出 ``,同时用 `\boxed{}` 输出关键结果。 -2. **消息 4**:对问题进行更细致的拆解,并在表达式中复用数字。 - -![After tuning](https://img.alicdn.com/imgextra/i1/O1CN011HjAxo20DKIcPAPVr_!!6000000006815-2-tps-1658-506.png) -![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01C3kUnV221zjPi30rd_!!6000000007061-2-tps-1650-730.png) - -> **Token级可视化:** 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md). diff --git a/docs/zh/example_frozenlake.md b/docs/zh/example_frozenlake.md deleted file mode 100644 index 4995b3c6..00000000 --- a/docs/zh/example_frozenlake.md +++ /dev/null @@ -1,148 +0,0 @@ -# 冰冻湖游戏 - -## 1. 概述 - -**Frozen Lake** 是一个经典的强化学习任务,来自 [Gymnasium](https://gymnasium.farama.org/environments/toy_text/frozen_lake/)。 - -在该环境中,智能体会被安排在一个随机生成的冰湖上,冰湖由安全的冰面(_),危险的冰洞(O)以及终点(G)组成,智能体的位置用 P 表示。智能体的目标是从 P 位置出发到达终点 G,并避开途中的冰洞。智能体每次行动可以选择向上、下、左、右四个方向移动,但由于冰面的光滑特性,智能体有一定概率会滑向非预期的方向。 - -本实例展示了如何创建一个可训练的智能体工作流来解决这一导航挑战。 - -## 2. 快速开始 - -### 2.1 准备工作 - -安装 Frozen Lake 任务所需的依赖: - -```bash -pip install gymnasium[toy_text] -``` - -### 2.2 开始训练 - -使用提供的配置文件快速开始训练: - -```bash -ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='trinity' --with-ray -``` - -尝试更困难的设置: - -```bash -ajet --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone='trinity' --with-ray -``` - -
    -快速调试(可选) - -不启用 Ray 在本地运行,便于更快迭代: - -```bash -ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='debug' --with-logview -``` - -如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与你的代码位置一致。 - -
    - -## 3. 理解实现 - -### 3.1 核心流程/原理 - -本示例将 Frozen Lake 环境封装为可训练的 `Workflow`: - -- Workflow 重置环境并将网格地图渲染为文本 observation,提供给智能体。 --智能体读取 observation 并输出 `Up | Down | Left | Right` 中的一个动作。 -- 环境执行动作,返回新的 observation 与 reward。 -- 成功到达目标或超过最大步数则终止。 - -### 3.2 配置说明 - -`tutorial/example_frozenlake/frozenlake_easy.yaml` / `frozenlake_hard.yaml` 中与本任务相关的关键字段包括: - -- `ajet.rollout.user_workflow`: Workflow 入口,示例中为 `tutorial.example_frozenlake.frozenlake->FrozenLakeWorkflow`。 -- `ajet.rollout.multi_turn.max_steps`:单次 episode 的最大步数(智能体与环境均使用)。 -- `frozen_lake.frozen_lake_size`:地图大小(easy 为 4,hard 为 6)。 -- `frozen_lake.is_slippery`:是否启用打滑。 - -### 3.3 代码解读 - -在 `tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeEnv` 类实现了对 Gymnasium Frozen Lake 环境的封装,主要对外提供 `step` 和 `reset` 两个方法。 - -- `step` 方法会根据智能体的动作(action)返回环境的下一个状态(observation)、奖励(reward)、是否结束(done)以及其他辅助信息。 - - observation:智能体移动后冰湖的状态信息,使用字符串表示,例如: - ``` - _ _ G - _ _ _ - P O O - ``` - - reward:智能体每次移动获得的奖励,达到终点 G 时奖励为 1,否则为 0。 - - done: 布尔值,如果智能体是否到达终点或掉入冰洞则为 True,否则为 False。 - - info: 其他辅助信息。 - -- `reset` 方法可根据用户传入的参数重新生成冰湖环境。 - -`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeAgent` 类实现了智能体的决策逻辑,主要通过 `step` 方法接收当前环境状态(observation)作为输入,返回智能体选择的动作(action),其中的核心是一个 ReActAgent。 - -```python -class FrozenLakeAgent: - - def __init__(self, model: ModelTuner, max_steps: int = 20): - self.agent = ReActAgent( - name="frozenlake_agent", - sys_prompt=SYSTEM_PROMPT, - model=model, - formatter=DashScopeChatFormatter(), - max_iters=2, - ) - # other initialization code - - async def step(self, current_observation: str) -> str: - # Step 1: 基于 current_observation 构建用户提示信息 - # Step 2: 调用 ReActAgent 获取原始响应 - # Step 3: 解析响应并返回动作 -``` - -`tutorial/example_frozenlake/frozenlake.py` 中的 `FrozenLakeWorkflow` 类实现了环境和 智能体 的集成,主要通过 `execute` 方法对外提供训练/评估时的入口。 - -其中的核心流程如下: - -```python -class FrozenLakeWorkflow(Workflow): - - async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - # init agent and env - # reset environment and get initial `observation_str` - rewards = [] - for _ in range(self.max_steps): - action = await self.agent.step(observation_str) - observation_str, reward, done, info = self.env.step(action) - rewards.append(reward) - if done: - break - return WorkflowOutput( - reward=sum(rewards), - ) -``` - -### 3.4 奖励(Reward / Evaluation)机制 - -- 单次 episode 的最终 reward 为各步 reward 的求和。 -- FrozenLake 场景中,达到目标时 reward 为 `1`,其他情况为 `0`。 -- Workflow 还会返回 `terminate_reason`(如 `success` / `agent_error` / `max_steps_reached`)以及 `step_count` 等元信息。 - -## 4. 结果 - -### 4.1 训练曲线 - -![](https://img.alicdn.com/imgextra/i3/O1CN01ZfICUr1Rs4zXrPPXQ_!!6000000002166-2-tps-858-614.png) - -> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 - -由于奖励是稀疏的(只有到达目标才得到 `1`,否则为 `0`),奖励曲线的上升直接反映了成功率的提升——智能体更频繁地到达目标 G。 - -这种提升通常来自两个方面: - -* **更好的空间推理能力**:智能体学会解析网格并判断相对位置关系。 -* **更安全的路径规划**:它能避免掉入洞中,并选择更可靠的路线朝目标前进。 - diff --git a/docs/zh/example_learning_to_ask.md b/docs/zh/example_learning_to_ask.md deleted file mode 100644 index 50383ec3..00000000 --- a/docs/zh/example_learning_to_ask.md +++ /dev/null @@ -1,163 +0,0 @@ -# 学习提问 - -训练一个智能体去**提出下一个最合适的问题**(而不是直接回答)。奖励来自一个 **LLM-as-a-judge**:它会评估“这个问题是否有帮助、是否相关”,并给出打分。 - -### 1. 概览 - -在 **Learning to Ask** 中,每条训练样本是一段简短的**医生–患者对话历史**。智能体的输出是医生接下来应该问的**一个**问题(可选地带有多项选择答案),而不是给出诊断或治疗建议。 - - -```{figure} https://img.alicdn.com/imgextra/i4/O1CN01m9WJCM1WJL1aJCSaS_!!6000000002767-2-tps-1024-559.png -图:为什么“Learning to Ask”很重要。左:LLM 在信息不足的情况下直接给出诊断。右:LLM 先提出清晰的追问,再给出结论,这会让人更安心。 -``` - -本教程分为两步: - -1. **Run it**:使用默认的 YAML 配置启动训练。 -2. **Understand & customize**:理解并自定义数据预处理、工作流(ExampleLearn2Ask)以及奖励(reward_fn + llm_reward)。 - ---- - -### 2. 快速开始 - -#### 2.1 准备工作 - -从 HuggingFace 下载 [RealMedConv](https://huggingface.co/datasets/datajuicer/RealMedConv) 数据集,并将文件放到:`data/realmedconv` - -然后进行预处理: - -```bash -export DASHSCOPE_API_KEY=your_api_key - -cd tutorial/example_learn2ask/data_preprocess -./run_process.sh data/realmedconv -``` - -预处理完成后,你应该会得到:`train.jsonl` 和 `test.jsonl`。 - -#### 2.2 启动训练 - -```bash -ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray -``` - -
    -快速调试(可选) - -不启用 Ray 在本地运行,便于更快迭代: - -```bash -ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='debug' --with-logview -``` - -如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与你的代码位置一致。 - -
    - ---- - -### 3. 理解实现 - -#### 3.1 每个训练 step - -本教程训练的目标是:基于一段简短的医生–患者对话历史,让模型学会**提出下一个最合适的问题**。具体来说,每个训练 step 会从 `train.jsonl` 中取出一条对话上下文,让智能体生成**恰好一个**追问(可选地带有答案选项),随后使用一个 LLM judge 来评估这个问题是否**有用**且**相关**。AgentJet 将该评分作为奖励信号更新策略,于是模型会逐渐学会提出更好的问题,而不是直接给出回答。 - -#### 3.2 YAML 配置说明 - -整个例子主要通过 YAML 完成配置信息,实现代码则集中在一个文件里。在 YAML 中,`task_reader` 提供数据集划分;`rollout.user_workflow` 告诉 AgentJet 对每条样本需要运行哪个 workflow;`task_judge` 提供封装了 LLM judge 的奖励入口;`model` 部分决定训练从哪个预训练 backbone 开始。 - -```yaml -ajet: - task_reader: - type: dataset_file - # train_path: data/realmedconv/train.jsonl - # test_path: data/realmedconv/test.jsonl - - rollout: - # For each sample: conversation context -> one next question - user_workflow: tutorial.example_learn2ask.learn2ask->ExampleLearn2Ask - - task_judge: - # Reward function used by the trainer (internally calls the LLM judge) - # judge_protocol: tutorial.example_learn2ask.learn2ask->reward_fn - - model: - # pretrained backbone to start from - # path: /path/to/your/model -``` - - - -#### 3.3 代码解读 - -在代码层面,所有实现都在 `tutorial/example_learn2ask/learn2ask.py` 中: - -* `ExampleLearn2Ask` 定义 workflow:如何将对话上下文转成智能体的 prompt/input,以及期望的输出格式是什么(一个追问,可选选项)。 -* `reward_fn` 定义如何把 “judge 的反馈” 转成训练可用的标量奖励。 - -#### 3.4 奖励 - -`llm_reward` 是 `reward_fn` 内部调用的 LLM-as-a-judge,用来给模型的输出打分。评估遵循以下规则: - -- **只评估医生的最后一句话**(doctor’s last message),不看更早的医生回复。 -- 输出两个分数:**Format Score** + **Content Score**(分别打分,后续由 `reward_fn` 组合成训练用 reward)。 - -**Format Score(格式分)**:根据“最后一句话里问题的数量”计分 -- 1.0:恰好 **1 个问题**,或者在判断对话结束时正确输出了 `` -- 0.5:包含 **2 个问题** -- 0.0:包含 **3 个及以上问题** - -**Content Score(内容分)**:根据问题是否命中 `Reference Information` 中“医生尚未知晓的缺失信息”计分 -- 1.0:问题**直接询问** `Reference Information` 里的某个缺失项,或者在信息足够时及时结束对话 -- 0.1:问题过于泛化(对任何症状都适用的通用问题) -- 0.0:问题与 `Reference Information` 的缺失项**无关** -- 另外:**含糊/无信息量的问题按低质量处理**(例如指代不明的提问),通常会得到 0 或接近 0 的得分 - ---- - - -### 4. 结果 - -#### 4.1 训练曲线 - -![curve](https://img.alicdn.com/imgextra/i2/O1CN01STeE8G1ricp6jySto_!!6000000005665-2-tps-866-614.png) - -> **可视化说明:** 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 - -这张训练曲线反映的是reward 变化趋势。reward包括:Format Score(是否只问一个问题)和 Content Score(是否直接追问 Reference Information 中缺失的关键信息)。 - -因此,曲线升高表示模型逐渐学会:把输出稳定成“一个清晰问题”,并且更频繁地命中缺失信息,而不是泛泛而问或提出含糊、无信息量的问题。 - -#### 4.2 案例展示 - -**Before training** - -```text -User: Bitten by a midge - -Agent: Has irritation subsided past initial acute swelling phase afterwards unnoticed scratched overly causing secondary bacterial dermatitis chance affecting skin rendering needed topical antibiotic application options among azelaic acid cream!? -``` - -智能体给出了一个“看似有点相关、但非常不合理”的回答,并且没有形成任何有效的追问。 - -**During training (~50%)** - -```text -User: Bitten by a midge - -Agent: Have these itchy bumps appeared soon after getting bitten?(A.) Occasionally immediately afterward ; B fkknore ×later throughout day )/) -``` - -智能体开始提出更合理的追问,尝试收集症状信息,并提供选项。 - -**After training** - -```text -User: Bitten by a midge - -Agent: Has itching or reddening appeared around this bite site recently without healing despite scratching frequently?(A,Yes indeed worse every evening B,No pain but small swollen spots persist day after incident/) -``` - -问题变得更具体、更有信息量,能够引导用户补充临床相关的关键细节。 - -> 想进一步了解该任务以及在更大模型上的结果,可参考论文:[Grounded in Reality: Learning and Deploying Proactive LLM from Offline Logs](https://arxiv.org/abs/2510.25441)。 diff --git a/docs/zh/example_math_agent.md b/docs/zh/example_math_agent.md deleted file mode 100644 index 1be2e7e7..00000000 --- a/docs/zh/example_math_agent.md +++ /dev/null @@ -1,230 +0,0 @@ -# 数学智能体 - -训练一个**会用工具的数学智能体**(ReAct + Python 执行器),用于解决 GSM8K 风格的小学应用题。奖励来自一个**评审器 (judge)**:它检查最终答案是否正确(并且可选地惩罚不良的工具调用行为)。 - ---- - -## 概览 - -
    -

    -在 Math 智能体 中,每条训练样本是一道数学文字题(如 GSM8K)。智能体将学习分步推理(ReAct 风格),在需要计算时调用 Python 工具,并产出与参考答案一致的最终答案。 -

    -
    - -本教程分两步组织: - -1. **先跑起来**:下载数据集,并用默认 YAML 配置启动训练 -2. **理解与自定义**:理解 workflow 代码与 judge/reward - ---- - -## 快速开始 - -### 准备数据集 - -下载 `openai/gsm8k` 数据集: - -```bash -python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/store/dataset -``` - -### 启动训练 - -```bash -# (可选)训练前建议清理残留进程 -# ajet --kill="python|ray|vllm" - -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray -``` - -??? tip "快速调试(可选)" - 如果您想在本地对 workflow / judge 打断点调试: - - ```bash - # (可选)调试前建议清理残留进程 - # ajet --kill="python|ray" - - clear && \ - ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview - ``` - - 当 `--backbone=debug` 时,Ray 会被禁用。您可以使用类似下面的 VSCode 配置: - - ```json title=".vscode/launch.json" - { - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "module": "ajet.launcher", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "./path/to/yaml.yaml" - ], - "env": {} - } - ] - } - ``` - ---- - -## 理解训练流程 - -### 每一步训练都发生了什么 - -
    -
    训练步骤流程
    - -
    -
      -
    1. 加载一道题 - -从数据集通过 `task_reader` 加载一道数学题。
    2. -
    3. 运行 AgentScope workflow - -用题目文本构造 prompt,让 ReAct 智能体调用 Python 工具,并抽取最终答案。
    4. -
    5. 注册用于评估的关键信息 - -返回 `WorkflowOutput(reward=None, metadata={"final_answer": final_answer})`。
    6. -
    7. 运行 judge - -将 `final_answer` 与参考答案对比,计算 `raw_reward` 和 `is_success`。
    8. -
    -
    -
    - -### YAML 配置说明 - -大部分"连线"都在 `tutorial/example_math_agent/math_agent.yaml` 中完成: - -```yaml title="math_agent.yaml" -ajet: - task_reader: - type: huggingface_dat_repo # 也支持: dataset_file / env_service - - rollout: - user_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn - - task_judge: - judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge - - model: - path: YOUR_MODEL_PATH -``` - -| 字段 | 说明 | -|------|------| -| `task_reader` | 任务来源 | -| `user_workflow` | 每条样本运行哪个 workflow | -| `judge_protocol` | 由哪个 judge 计算 reward | -| `model.path` | 要微调的预训练模型路径 | - -### 代码解读 - -**Workflow:** `tutorial/example_math_agent/math_agent.py` - -```python title="Workflow 代码梗概" -self.toolkit = Toolkit() -self.toolkit.register_tool_function(execute_python_code) - -self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=model_tuner, # trainer 管理的模型封装 - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), -) - -msg = Msg("user", init_messages[0]["content"], role="user") -result = await self.agent.reply(msg) -final_answer = extract_final_answer(result) - -# 重要:通过 WorkflowOutput 的 metadata 将最终答案提供给评审器 -return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) -``` - -!!! warning "重要提示" - 始终通过 `WorkflowOutput.metadata` 提供最终答案,以便 judge 进行评分。 - -### 奖励计算 - -评审器接收两个对象: - -| 对象 | 包含内容 | -|------|----------| -| `workflow_task` | 任务信息;从 `metadata` 获取参考答案 | -| `workflow_output` | Workflow 结果;从 `metadata["final_answer"]` 获取最终答案 | - -!!! tip "扩展 Judge" - 如果您观察到模型"几乎做对了,但搞错了工具调用格式",可以扩展评审器来: - - - 增加格式惩罚(无效的 ``) - - 增加行为惩罚(调用了工具但没 `print`) - - 同时保持"答案正确性"作为主要信号 - ---- - -## 结果 - -### 训练曲线 - -![训练曲线](https://img.alicdn.com/imgextra/i4/O1CN01gzwgLq1fkCnauydEu_!!6000000004044-2-tps-1422-550.png) - -!!! info "可视化说明" - 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 - -**解读:** 随着训练进行,reward 随之上升。这通常意味着智能体在两件事上变得更稳定: - -- **该用工具时会用**:能正确发起 ``,并在需要计算时调用 `execute_python_code` -- **产出更可靠的答案**:能基于工具返回的结果输出与参考答案一致的最终答案 - -### 案例展示:工具调用纪律的改进 - -训练前,智能体可能已经能解出不少题。然而,小模型经常在**工具调用规范**上翻车。 - -=== "Bad Cases" - - ```text - # bad case 1: 忘记在 Python 代码里 print 结果 - - {"name": "execute_python_code", "arguments": {"code": "... height_difference"}} - - - # bad case 2: 太心急 —— 没等工具返回结果就输出了最终答案 - {"name": "execute_python_code", ...} - {"name": "generate_response", "arguments": {"response": "... \\boxed{48} ..."}} - ``` - - 这些失败本质上不是因为模型"不会算",而是因为它**没有形成决策闭环**,未能将工具执行结果纳入考虑。 - -=== "Good Case(调优后)" - - 调优后,智能体通常会遵循规范的三段式结构: - - 1. **Message 3 (assistant)**:拆解问题 + 发起 ``,并在代码里使用 `print(...)` - 2. **Message 4 (tool_response)**:工具返回执行结果 - 3. **Message 5 (assistant)**:读取 `stdout`,然后产出最终答案 - - ![Good case](https://img.alicdn.com/imgextra/i4/O1CN01v1gGQZ1ftMiil5Cxg_!!6000000004064-2-tps-1367-684.png) - -!!! note "Token 级可视化" - 图中彩色块是 [Beast-Logger](./beast_logger.md) 生成的 token 级别序列可视化: - - - **黄色 token**:排除在损失函数(loss)计算之外的 token - - **蓝色 token**:参与损失计算的 token(从浅蓝到深蓝表示 logprob 从高到低) - ---- - -## 下一步 - - diff --git a/docs/zh/example_tracing_feedback_loop.md b/docs/zh/example_tracing_feedback_loop.md deleted file mode 100644 index 988842da..00000000 --- a/docs/zh/example_tracing_feedback_loop.md +++ /dev/null @@ -1,109 +0,0 @@ -# 数据回流训练 - -AgentJet 允许你回收 智能体 在执行过程中产生的对话日志,并通过迭代训练持续优化该 Agent,我们将这一过程称为 **数据回流训练**。它主要提供以下能力: - -+ 从 agentscope studio 数据库中加载追踪日志 -+ 将日志转换为结构化的训练数据 -+ 结合自定义过滤器筛选高质量样本 -+ 将样本打包成数据集,用于迭代训练 - - -在下面的小节中,我们将演示如何利用数据回流训练来改进一个 Agent。 - -> **AgentScope 与 Studio 版本兼容性** -> -> 推荐使用匹配的版本组合: -> -> + AgentScope (v1.0.7) -> + Studio (23eb7c0b1185486d1baca36aea0ce8b85ea9de48) -> - -## 环境准备 - -要使用追踪日志进行训练,通常需要你已经有一个基于 **agentscope** 编写的 Agent,并在 **agentscope-studio** 中运行了一段时间(通常是部署运行),也就是说你已经: - -1. 使用 [agentscope](https://github.com/agentscope-ai/agentscope) 编写好了你的 Agent; -2. 按照 [文档](https://doc.agentscope.io/tutorial/task_tracing.html) 启用了 tracing 模块; -3. 部署了 智能体 并收集到了数据库文件。 - -默认情况下,agentscope-studio 会将追踪日志存储在 -`~/AgentScope-Studio/database.sqlite` 中,其中包含了用户与 智能体 之间的全部对话记录。 - - -我们在 `tutorials/example_feedback_tracing/agent_deployed.py` 中准备了一个示例 Agent。你可以通过它模拟生成追踪日志,并得到对应的数据库文件。 - -## 开始数据回流训练 - -当我们拿到日志文件(`database.sqlite`)后,就可以基于数据回流训练出一个新的 Agent。 - -1. 在配置文件中将参数 `ajet.task_reader.type` 设置为 `tracing`,以开启数据回流模式; -2. 在 `ajet.task_reader.feedback_tracing` 字段中配置数据库路径和过滤相关选项; -3. 像普通训练流程一样配置其他训练参数以及 Reward(奖励信号)。 - -```yaml -ajet: - # ... - task_reader: - # 使用 tracing 日志作为任务来源 - type: tracing - feedback_tracing: - # 数据库路径 - base_url: ./tutorial/example_feedback_tracing/database.sqlite - # 模块写入缓存的路径 - train_output_path: ./tutorial/example_feedback_tracing/tasks.jsonl - # 过滤阶段使用的模型 - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 2048 - # 过滤器定义 - filters: - # 默认过滤器 llm_evaluate - - type: llm_evaluate - enabled: true - params: - # 编写 rubric,用于丢弃低质量任务 - custom_rubrics: | - 1. Check the answer and drop the task if it does not answer or answer is wrong. - 2. Consider a response is invalid if it does not wrap the final answer in \boxed{}. - # LLM temperature - temperature: 0.5 - # 是否打印调试日志 - print_reason: false - max_thread: 16 -``` - -当一切准备就绪后,可以通过 `launcher.py` 启动训练: - -```bash -# 启动示例训练 -ajet --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray -``` - -训练完成后,你可以将新的 智能体 部署回生产环境,并继续收集新的日志。通过这样的闭环,你可以持续进行迭代的数据回流训练,不断提升 智能体 的效果。 - -## 自定义 - -### 过滤器 - -模块提供了 Filter,用于从日志中筛选出高质量样本用于训练。用户可以根据自己的任务需求,自定义具体的筛选规则。 - -要编写规则,只需要修改配置文件中对应的字段: - -```yaml -ajet: - # ... - task_reader: - # ... - feedback_tracing: - # ... - filters: - - type: llm_evaluate - enabled: true # 启用该过滤器 - params: - # 定义你的规则 - custom_rubrics: | - 1. 检查回答内容,如果没有回答问题或回答错误,则丢弃该任务。 - 2. 如果回答没有使用 \boxed{} 包裹最终答案,则认为该回答无效。 - temperature: 0.5 - print_reason: false - max_thread: 16 -``` diff --git a/docs/zh/example_werewolves.md b/docs/zh/example_werewolves.md deleted file mode 100644 index cdbdbe5a..00000000 --- a/docs/zh/example_werewolves.md +++ /dev/null @@ -1,195 +0,0 @@ -# 狼人杀游戏 - -本教程展示了如何使用 AgentJet 来处理多智能体训练,令多个智能体在狼人杀游戏中决策、对抗和协作。 - ---- - -## 概述 - -
    -

    -狼人杀角色扮演游戏是一个典型的 POMDP(部分可观测马尔可夫决策过程)问题。我们可以在这个协作型多智能体问题中使用「参数共享」的方法来训练 Agent。 -

    -
    - -| 术语 | 说明 | -|------|------| -| **部分可观测** | Agent 只能接收局部信息。即使属于同一阵营,一个智能体也无法获得其他智能体的观测信息 | -| **马尔可夫决策过程** | 根据当前局面做决策 | -| **参数共享** | 多个智能体使用同一个模型作为策略,但不共享感知(模型输入) | -| **协作型多智能体问题** | Agent 之间目标一致(奖励一致) | - -!!! info "实验环境" - - 使用静态 **Qwen3-235B-A22B** 作为对手(不可训练 Agent) - - 使用 **Qwen2-7B** 作为可训练 Agent(即 `trainable_targets`) - -
    -狼人杀游戏 -
    - -**场景概述:** - -- **场景**:经典狼人杀游戏,包括狼人、村民、预言家、女巫、猎人等角色 -- **目标**:训练某一指定角色(本示例中为 `werewolf`),在对局中获得更高的胜率 - ---- - -## 快速开始 - -正式训练(启用 Ray): - -```bash -# ( ajet --kill="python|ray|vllm" ) -ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray -``` - -??? tip "快速调试(可选)" - 不启用 Ray 在本地运行,便于更快迭代: - - ```bash - ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview - ``` - - 如果结果不对,最快的排查点包括:数据路径是否存在、如果 judge 需要 API key 则是否已设置、以及 `user_workflow` 中的 workflow 类路径是否与您的代码位置一致。 - ---- - -## 理解实现 - -### 核心流程 - -
    -
    训练迭代流程
    - -
    -
      -
    1. 生成游戏设置 - -生成一局新的游戏设置(玩家、角色分配、初始状态)。
    2. -
    3. 模拟对局 - -调用 AgentScope Workflow 来模拟完整对局。
    4. -
    5. 智能体决策 - -智能体调用可训练模型(`model_tuner`)做决策,对手使用固定模型。
    6. -
    7. 计算奖励 - -环境产出本局的 reward / outcome。
    8. -
    9. 更新模型 - -收集对局轨迹更新可训练模型。
    10. -
    -
    -
    - -### 配置说明 - -关键配置在 `tutorial/example_werewolves/werewolves.yaml`: - -```yaml title="werewolves.yaml" -ajet: - task_reader: - type: random_dummy # random seed to shuffle players - task_judge: - judge_protocol: null # 依赖 rollout 内部返回的 reward - model: - path: YOUR_MODEL_PATH - rollout: - user_workflow: tutorial.example_werewolves.start->ExampleWerewolves -``` - -### 代码结构 - -| 文件 | 说明 | -|------|------| -| `tutorial/example_werewolves/werewolves.yaml` | 将 task reader、judge、model 与 workflow 入口串联 | -| `tutorial/example_werewolves/start.py` | AgentScope Workflow 实现(`ExampleWerewolves`) | -| `tutorial/example_werewolves/game.py` | 狼人杀游戏逻辑实现 | -| `tutorial/example_werewolves/prompt.py` | 游戏相关的提示词模板 | -| `tutorial/example_werewolves/structured_model.py` | 各个角色的输出结构化格式 | -| `tutorial/example_werewolves/utils.py` | 游戏状态管理和辅助函数 | - -### 奖励机制 - -当 `judge_protocol: null` 时,训练默认依赖 rollout / environment 内部给出的 reward 或胜负结果。 - -!!! note "奖励计算规则" - 采用**回合级别的稀疏胜负奖励**: - - | 条件 | 奖励 | 状态 | - |------|------|------| - | 好人阵营获胜 且 训练好人角色 | `raw_reward = 1` | `is_success = True` | - | 狼人阵营获胜 且 训练狼人角色 | `raw_reward = 1` | `is_success = True` | - | 训练方阵营未获胜 | `raw_reward = 0` | `is_success = False` | - | 游戏抛出异常 | `raw_reward = -0.1` | `is_success = False` | - -!!! tip "自定义 Judge" - 如果您希望更细粒度的评估(例如对关键决策给部分分),可以实现自定义 Judge,并在 `ajet.task_judge.judge_protocol` 中启用。 - ---- - -## 结果 - -### 训练曲线 - -`Qwen2-7B` 在大约 20 个 step 左右,可以达到约 60% 的胜率。 - -
    -训练曲线 -
    - -!!! info "可视化说明" - 训练曲线由 SwanLab 生成。详见 [训练可视化](./visualization.md)。 - -随着训练推进,胜率不断上升。这通常意味着智能体在以下两方面变得更稳定: - -- **角色扮演一致性**:智能体学会在压力下维持狼人伪装,即使被投票也尽量避免自曝 -- **社交欺骗技巧**:它逐渐形成误导对手、在村民间制造怀疑、并与队友进行隐性协作的策略 - -### 案例展示 - -#### 行为变化 - -在实验过程中,我们观察到明显的角色扮演能力提升: - -=== "调优前" - - 在被投票出局时,原始模型往往会直接暴露自己是 `werewolf`。 - -=== "调优后" - - 经过微调后,智能体会尝试欺骗对手并保护队友。 - - ![调优后的行为](https://img.alicdn.com/imgextra/i1/O1CN01v8VqLB1aYEMfzyTHr_!!6000000003341-2-tps-2104-1016.png) - -!!! note "Token 级可视化" - 这些详细日志由 Beast-Logger 生成。详见 [Beast-Logger 使用说明](./beast_logger.md)。 - -#### 取胜策略 - -智能体会发展出多种取胜策略: - -- **误导对手**:"重点关注预言家和女巫。他们可能是试图隐藏身份的狼人。" -- **诉诸理性**:"我们要警惕假预言家,注意叙事是否自洽;Player-Y 作为猎人需要谨慎行动。" -- **利用内斗**:利用非狼人玩家之间的相互怀疑,从而淘汰对手 - -
    -策略示例 -
    - -#### 模型扩展 - -从 Qwen2-7B 扩展到 Qwen2-14B 的效果: - -
    -模型扩展 -
    - ---- - -## 下一步 - - diff --git a/docs/zh/installation.md b/docs/zh/installation.md deleted file mode 100644 index b53cd020..00000000 --- a/docs/zh/installation.md +++ /dev/null @@ -1,135 +0,0 @@ -# 安装指南 - -本文档提供 AgentScope-Tuner 的逐步安装说明。 - -!!! tip "推荐从源码安装" - AgentJet 正处于快速开发与迭代阶段。我们建议从源码安装,以获得最新功能与 Bug 修复。 - ---- - -## 前置条件 - -| 要求 | 版本 | -|------|------| -| **Python** | 3.10 | -| **CUDA** | 12.8 或更高版本 | - ---- - -## 从源码安装 - -### Step 1:克隆仓库 - -从 GitHub 克隆 AgentJet 仓库,并进入项目目录: - -```bash -git clone https://github.com/modelscope/AgentJet.git -cd AgentJet -``` - -### Step 2:安装依赖 - -AgentJet 支持多种训练后端(backbone),目前包括 `verl` 和 `trinity`(推荐)。 - -!!! info "包管理器" - 我们推荐使用 `uv` 来管理 Python 环境,因为它速度非常快。参考 [`uv` 安装文档](https://docs.astral.sh/uv/getting-started/installation/)。 - - 如果您更希望使用 `conda`,也可以通过 conda + pip 安装(只需将 `uv pip` 替换为 `pip` 即可)。 - -=== "Verl" - - 使用 `verl` 训练后端安装: - - ```bash - uv venv --python=3.10 - source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[verl] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache - ``` - - !!! warning "flash-attn 安装说明" - `flash-attn` 必须在其他依赖安装完成后再安装。为加快编译速度,可通过 `export MAX_JOBS=${N_CPU}` 设置并行编译数,或确保 GitHub 访问畅通以直接安装预编译轮子。 - -=== "Trinity(推荐)" - - 使用 `trinity` 训练后端安装,支持全异步 RFT: - - ```bash - uv venv --python=3.10 - source .venv/bin/activate - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ -e .[trinity] - uv pip install -i https://mirrors.aliyun.com/pypi/simple/ --verbose flash-attn --no-deps --no-build-isolation --no-cache - ``` - - ---- - -## 通过 Docker 一键安装 - -如果您希望一键完成依赖安装,我们提供了镜像用于快速上手。 - -!!! warning "前置条件" - 在继续之前,请确保您的系统已安装 **nvidia docker**。我们的 Docker 容器内部需要使用 CUDA,因此必须依赖 Nvidia 的工具链来提供 GPU 支持。 - -### 设置 Nvidia Docker Runtime - -请在宿主机的 Ubuntu 系统上安装 nvidia docker runtime。详细步骤请参考: - -- [Nvidia 官方文档](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian) -- [Ubuntu 环境设置指南](../en/setup_ubuntu.md)(我们的详细安装说明) - -### 运行 Docker 容器 - -以下命令会将您当前工作目录(agentjet 的根目录)挂载到容器内的 `/workspace`,并将您的数据目录挂载到容器内的 `/data`: - -```bash -docker run -it \ - --gpus all \ - --shm-size="64g" \ - --rm \ - -v $PWD:/workspace \ - -v /path/to/your/checkpoint/and/data:/data \ - agentjet:latest -``` - ---- - -## 验证安装 - -安装完成后,验证一切是否正常工作: - -```python -import ajet -print(ajet.__version__) -``` - ---- - -## 常见问题 - -??? note "flash-attn 安装失败" - **问题**:`flash-attn` 安装失败 - - **解决方案**:确保已安装 CUDA 工具包,并设置 `MAX_JOBS` 环境变量: - ```bash - export MAX_JOBS=4 - uv pip install flash-attn --no-build-isolation - ``` - -??? note "GPU 未检测到" - **问题**:Docker 容器无法识别 GPU - - **解决方案**:确保 nvidia-docker 已正确安装: - ```bash - nvidia-smi # 应该显示 GPU 信息 - docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi - ``` - ---- - -## 下一步 - - diff --git a/docs/zh/intro.md b/docs/zh/intro.md deleted file mode 100644 index d92d61aa..00000000 --- a/docs/zh/intro.md +++ /dev/null @@ -1,130 +0,0 @@ -# 项目简介 - -**AgentJet (AgentJet)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 - -您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的智能体达到最佳性能! - ---- - -## 特性 - -我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: - -
    - --  **简单友好** — AgentJet 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 - --  **丰富的教程库** — AgentJet 提供了丰富的[示例库](#example-library)作为学习教程。 - - 数学智能体、狼人杀游戏、AppWorld 等 查看示例 - --  **高效且可扩展** — 默认使用 [Trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。 - - 支持 [verl](./installation.md) 后端作为备选方案 了解更多 - -
    - -!!! tip "多智能体支持" - AgentJet 支持 [多智能体工作流](./workflow.md),并采用上下文合并技术,当工作流涉及多轮(或多智能体)对话时,可将训练速度提升 **1.5 倍至 20 倍**。 - -!!! info "可靠性与可复现性" - 我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现。 - -### 面向进阶研究者 - -AgentJet 还提供了高分辨率的日志记录和调试方案: - -| 功能 | 说明 | -|------|------| -| **高分辨率日志** | 保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs | -| **快速调试** | 使用 `--backbone=debug` 选项,将代码修改后的等待时间从分钟级缩短至秒级 | - ---- - -## 快速上手 - -### 安装 - -我们推荐使用 `uv` 进行依赖管理。 - -=== "步骤 1:克隆仓库" - - ```bash - git clone https://github.com/modelscope/AgentJet.git - cd AgentJet - ``` - -=== "步骤 2:设置环境" - - ```bash - uv venv --python=3.10.16 && source .venv/bin/activate - uv pip install -e .[trinity] - # 注意:flash-attn 必须在其他依赖安装完成后安装 - uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir - ``` - -### 运行训练 - -您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个智能体: - -```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray -``` - -!!! example "了解更多" - 查看 [数学智能体](./example_math_agent.md) 示例获取详细说明。 - ---- - -## 示例库 {#example-library} - -探索我们丰富的示例库,开启您的探索之旅: - - - ---- - -## 核心概念 - -AgentJet 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。 - -
    -AgentJet 架构图 -
    - -### 1. 以用户为中心的接口 - -为了优化智能体,您需要提供三个核心输入: - - - -### 2. 内部系统架构 - -内部系统协调多个专门模块,以处理强化学习(RL)训练和智能体交互的复杂性。 - -| 模块 | 说明 | -|------|------| -| **启动器 (Launcher)** | 管理后台服务进程(Ray, vLLM)并路由后端 | -| **任务读取器 (Task Reader)** | 处理数据摄取、增强和过滤 | -| **任务展开 (Task Rollout)** | 连接大语言模型(LLM)引擎并管理 Gym 环境生命周期 | -| **任务运行器 (Task Runner)** | 执行 AgentScope 工作流并计算奖励 | -| **模型微调器 (Model Tuner)** | 将工作流中的推理请求转发至 LLM 引擎 | -| **上下文追踪器 (Context Tracker)** | 监控 LLM 调用,并自动合并共享历史的时间线(**3-10 倍**效率提升) | - ---- - -## 下一步 - - diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md deleted file mode 100644 index bd956672..00000000 --- a/docs/zh/introduction.md +++ /dev/null @@ -1,108 +0,0 @@ -# 项目简介 - -**AgentJet (AgentJet)** 是一款前沿且易用的训练框架,专为优化 AgentScope 中的智能体和工作流(Workflow)而设计,能够自动微调背后的语言模型权重。 - -您只需提供 AgentScope 工作流、训练数据和奖励函数,我们就能助您的智能体达到最佳性能! - ---- - -### 特性 - -我们致力于构建一个易于上手的 AgentScope 微调工具,为智能体开发者解锁更多可能性: - -* **简单友好**:AgentJet 帮助您轻松微调智能体工作流背后的模型,以极小的开发成本优化智能体性能。 -* **丰富的教程库**:AgentJet 提供了丰富的 [示例库](#example-library) 作为学习教程。 -* **高效且可扩展**:AgentJet 默认使用 [trinity](https://github.com/modelscope/Trinity-RFT/) 作为后端(`--backbone=trinity`),通过全异步 RFT 加速微调过程。如果您更倾向于 Actor 共位置部署,也可以回退到 [verl](./installation.md) 后端。 -* **灵活且快速**:AgentJet 支持 [多智能体工作流](./workflow.md),并采用了上下文合并技术。当工作流涉及多轮(或多 智能体)对话时,可将训练速度提升 1.5 倍至 20 倍。 -* **可靠性与可复现性**:我们的团队持续追踪框架在多个 [任务 + 主分支版本 + 训练后端](https://benchmark.agent-matrix.com/) 上的表现(正在建设中,数据收集后即将上线)。 - -针对进阶研究者,AgentJet 还提供了高分辨率的日志记录和调试方案: - -* **高分辨率日志**:AgentJet 允许用户保存并检查 Token 级的 Rollout 详情,记录 Token ID、Token Loss Mask,甚至是 Token Logprobs,以便于工作流开发和 智能体 诊断。 -* **快速调试**:AgentJet 提供了 `--backbone=debug` 选项,提供极致的调试体验,将代码修改后的等待时间从分钟级缩短至秒级,并支持在 IDE 中进行断点调试。 - ---- - -### 快速上手 - -#### 安装 - -我们推荐使用 `uv` 进行依赖管理。 - -1. **克隆仓库**: - -```bash -git clone https://github.com/modelscope/AgentJet.git -cd AgentJet - -``` - -2. **设置环境**: - -```bash -uv venv --python=3.10.16 && source .venv/bin/activate -uv pip install -e .[trinity] -# 注意:flash-attn 必须在其他依赖安装完成后安装 -uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir - -``` - -#### 运行训练 - -您可以使用预配置的 YAML 文件,通过单条命令开始训练您的第一个 智能体。以 [数学 智能体](./example_math_agent.md) 为例: - -```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray - -``` - - -#### 示例库 - -探索我们丰富的示例库,开启您的探索之旅: - -* **[训练一个可以编写 Python 代码的数学智能体](./example_math_agent.md)**。 -* **[使用 AgentScope 创建并训练 AppWorld 智能体](./example_app_world.md)**。 -* **[开发并训练"狼人杀"RPG智能体](./example_werewolves.md)**。 -* **[学习像医生一样进行提问](./example_learning_to_ask.md)**。 -* **[使用 AgentScope 编写并解决"倒计时"游戏](./example_countdown.md)**。 -* **[使用 AgentJet 解决"冰湖"行走谜题](./example_frozenlake.md)**。 - ---- - -### 核心概念 - -AgentJet 通过将开发者接口与内部执行逻辑分离,使智能体微调变得直观明了。 - -
    -image - -
    - -#### 1. 以用户为中心的接口 - -为了优化智能体,您需要提供三个核心输入: - -* **[可训练工作流 (Trainable Workflow)](./workflow.md)**:通过继承 `Workflow` 类来定义您的智能体逻辑,支持简单的智能体设置以及高级的多智能体协作。 -* **[任务读取器 (Task Reader)](./data_pipeline.md)**:从 JSONL 文件、HuggingFace 数据集、交互式环境加载训练任务,或从文档自动生成任务。 -* **[任务判别器 (Task Judger)](./task_judger.md)**:评估智能体输出并分配奖励(Reward)以指导训练。 - -#### 2. 内部系统架构 - -内部系统协调多个专门模块,以处理强化学习(RL)训练和智能体交互的复杂性。 - -* **启动器 (Launcher)**:管理后台服务进程(Ray, vLLM)并路由后端。 -* **任务读取器 (Task Reader)**:处理数据摄取、增强和过滤。 -* **任务展开 (Task Rollout)**:连接大语言模型(LLM)引擎并管理 Gym 环境生命周期。 -* **任务运行器 (Task Runner)**:执行 AgentScope 工作流并计算奖励。 -* **模型微调器 (Model Tuner)**:将工作流中的推理请求转发至 LLM 引擎。 -* **上下文追踪器 (Context Tracker)**:监控 LLM 调用,并自动合并共享历史的时间线,将训练效率提升 **3 到 10 倍**。 - ---- - -### 导航 - -* **教程**:从 [安装](./installation.md) 到 [微调您的第一个智能体](./tune_your_first_agent.md) —— 初学者的必经之路。 -* **核心组件**:定义您的 [可训练工作流](./workflow.md),并管理 [数据](./data_pipeline.md) 和 [奖励](./tune_your_first_agent.md)。 -* **示例**:查看上方的 [示例库](#example-library),了解 [数学](./example_math_agent.md)、[狼人杀游戏](./example_werewolves.md) 和 [学习提问](./example_learning_to_ask.md) 等真实案例。 -* **深入了解**:掌握高级 [配置方案](./configuration.md)。 diff --git a/docs/zh/quickstart.md b/docs/zh/quickstart.md deleted file mode 100644 index 7197ac7f..00000000 --- a/docs/zh/quickstart.md +++ /dev/null @@ -1,82 +0,0 @@ -# 快速开始 - -AgentJet 提供了一套完整的智能体调优功能。您可以立刻尝试启动一个智能体的训练: - -```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray -``` - ---- - -## 最小示例 - -我们从最简单的示例开始:一个带工具调用的数学智能体。 - -
    -
    快速上手流程
    - -
    -
      -
    1. 设置环境 - -查看 [安装指南](./installation.md) 来搭建训练环境。
    2. -
    3. 定义工作流 - -编写一个继承自 Workflow 基类的 Agent 类(例如 `MathToolWorkflow`)。
    4. -
    5. 配置并运行 - -使用 `AgentJetJob` API 配置并启动训练。
    6. -
    -
    -
    - -### 代码示例 - -```python title="train_math_agent.py" -from ajet import AgentJetJob -from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow - -model_path = "YOUR_MODEL_PATH" -job = AgentJetJob(n_gpu=8, algorithm='grpo', model=model_path) -job.set_workflow(MathToolWorkflow) -job.set_data(type="hf", dataset_path='openai/gsm8k') - -# [可选] 保存 yaml 文件以便手动调整 -# job.dump_job_as_yaml('saved_experiments/math.yaml') - -# [可选] 从手动调整后的 yaml 文件加载 -# job.load_job_from_yaml('saved_experiments/math.yaml') - -# 开始训练 -tuned_model = job.tune() -``` - -!!! tip "命令行替代方案" - 上述代码等价于在终端执行: - ```bash - ajet --conf ./saved_experiments/math.yaml - ``` - ---- - -## 浏览示例 - -探索我们丰富的示例库,为您的旅程快速起步: - - - ---- - -## 下一步 - - diff --git a/docs/zh/task_judger.md b/docs/zh/task_judger.md deleted file mode 100644 index c6978dbd..00000000 --- a/docs/zh/task_judger.md +++ /dev/null @@ -1,302 +0,0 @@ -# 任务评测器 - -Task Judger 用于在训练过程中评估智能体(agent)的输出,并据此分配奖励。本页面介绍了常见场景下的内置评测器,以及如何为特定评测需求实现自定义评测器。 - ---- - -## 概览 - -Task Judger 会评估智能体的执行结果,并返回两个值: - -| 返回值 | 类型 | 说明 | -|--------|------|------| -| `raw_reward` | `float` | 表示输出质量的数值分数(通常为 0.0 到 1.0) | -| `is_success` | `bool` | 任务是否成功完成 | - -!!! info "奖励的作用" - 这两个值会引导 RL 训练过程,帮助智能体学习哪些行为能带来更好的结果。 - ---- - -## 基础接口 - -所有 Task Judger 都继承自 `BaseJudge`,并实现 `compute_reward` 方法: - -```python title="base_judge.py" -from ajet.task_judge.base_judge import BaseJudge -from ajet.workflow import WorkflowOutput, WorkflowTask - -class BaseJudge: - def __init__(self, config): - self.config = config - - def compute_reward( - self, - workflow_task: WorkflowTask, - workflow_output: WorkflowOutput - ) -> tuple: - """ - Args: - workflow_task: 包含任务数据,包括 metadata 中的参考答案等信息 - workflow_output: 包含智能体输出,包括 metadata 中的生成答案等信息 - - Returns: - tuple: (raw_reward: float, is_success: bool) - """ - raise NotImplementedError -``` - ---- - -## 内置 Task Judger - -AgentJet 提供了 4 个内置评测器,用于覆盖常见的评测场景: - -
    -

    MathAnswerAsJudge

    精确字符串匹配,适用于数学答案评测。

    -

    CountdownAnswerAsJudge

    支持部分奖励的数学等式评测。

    -

    EnvServiceJudge

    委托外部环境服务进行评测。

    -

    AutoGraderJudge

    通过 LLM 自动生成评测 Rubric。

    -
    - ---- - -### 1. MathAnswerAsJudge - -通过**精确字符串匹配**来评估数学答案,适用于答案以 LaTeX `\boxed{}` 形式输出的任务。 - -!!! tip "适用场景" - - 数学解题类任务 - - 答案确定且唯一的任务 - - 答案格式为 `\boxed{result}` - -```yaml title="配置方式" -ajet: - task_judge: - judge_type: customized_protocol - judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge -``` - -**工作原理:** - -1. 从智能体输出中提取 `\boxed{...}` 内的答案 -2. 与 `workflow_task.task.metadata["answer"]` 中的参考答案进行比对 -3. 正确返回 `(1.0, True)`,否则返回 `(0.0, False)` - -| 必需的 metadata | 说明 | -|-----------------|------| -| `workflow_output.metadata["final_answer"]` | 智能体答案(包含 `\boxed{}` 格式) | -| `workflow_task.task.metadata["answer"]` | 参考答案 | - ---- - -### 2. CountdownAnswerAsJudge - -评估数学等式,并支持对"格式正确但结果错误"的输出给予**部分奖励**。 - -!!! tip "适用场景" - - 数字谜题类任务(例如 Countdown game) - - 需要部分得分的任务 - - 希望即使答案不对,也能奖励良好格式的场景 - -```yaml title="配置方式" -ajet: - task_judge: - judge_type: customized_protocol - judge_protocol: tutorial.example_countdown.countdown_answer_as_judge->CountdownAnswerAsJudge -``` - -**评分规则:** - -| 分数 | 条件 | -|------|------| -| `0.0` | 答案无效或缺失 | -| `0.1` | 等式格式正确,但结果错误 | -| `1.0` | 等式与结果都正确 | - ---- - -### 3. EnvServiceJudge - -将评测委托给外部环境服务,适用于复杂的交互式环境。 - -!!! tip "适用场景" - - 依赖外部模拟器的任务(例如 AppWorld) - - 基于状态的复杂评估 - - 环境自身带有 evaluator 的交互式任务 - -```yaml title="配置方式" -ajet: - task_judge: - judge_type: customized_protocol - judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge -``` - -**工作原理:** - -1. 调用 `workflow_task.gym_env.evaluate()` 从环境获取 score -2. 将 score 转换为归一化 reward: - - 成功(score ≥ 1):`1.0 + score * 0.5` - - 失败(score < 1):`0.0 + score * 0.5` - ---- - -### 4. AutoGraderJudge(高级) - -通过 LLM 自动从参考样本生成评测 Rubric,用于主观性较强的评测任务。 - -!!! tip "适用场景" - - 主观评测任务(例如写作质量、对话连贯性) - - 没有明确标准答案的任务 - - 有标注训练样本,但需要更灵活的评测标准 - -```yaml title="配置方式" -ajet: - task_judge: - judge_type: rubrics_auto_grader - rubrics_auto_grader: - model_name: "qwen-plus" # 用于 rubric 生成与评测的模型 - api_key: "your-api-key" # 或设置 DASHSCOPE_API_KEY 环境变量 - grader_mode: "pointwise" # 或 "listwise" 用于排序多个输出 - language: "en" # 或 "zh" - min_score: 0 # pointwise 模式配置 - max_score: 10 - input_data_type: "dataset_file" - dataset_file: - training: - file_path: "path/to/rubrics_train.jsonl" - query_field: "main_query" # query 对应字段名 - answer_field: "final_answer" # workflow output 中的字段 - reference_field: "answer" # task metadata 中的字段 -``` - -**工作原理:** - -1. **训练阶段**:基于带标注的样本,通过迭代式优化生成 rubrics -2. **评测阶段**:使用生成的 rubrics,通过 LLM 调用对新输出打分 - -=== "Pointwise 模式(单个输出打分)" - - ```json - { - "main_query": "Explain quantum entanglement", - "metadata": { - "answer": "Quantum entanglement is...", - "score": 8 - } - } - ``` - -=== "Listwise 模式(多个候选输出排序)" - - ```json - { - "main_query": "Write a poem about spring", - "metadata": { - "candidates": [ - {"answer": "Flowers bloom...", "rank": 1}, - {"answer": "Spring is here...", "rank": 2} - ] - } - } - ``` - ---- - -## 创建自定义 Task Judger - -当您有更专门的评测需求时,可以通过继承 `BaseJudge` 来实现自己的评测器。 - -### Step 1:实现评测器 - -创建一个新文件(例如 `tutorial/my_task/my_judge.py`): - -```python title="my_judge.py" -import re -from ajet.task_judge.base_judge import BaseJudge -from ajet.workflow import WorkflowOutput, WorkflowTask - -class MyCustomJudge(BaseJudge): - def __init__(self, config): - super().__init__(config) - self.threshold = 0.8 - - def compute_reward( - self, - workflow_task: WorkflowTask, - workflow_output: WorkflowOutput - ) -> tuple: - # 从 workflow_output 中读取数据 - agent_answer = workflow_output.metadata.get("final_answer", "") - - # 从 workflow_task 中读取参考答案 - reference_answer = workflow_task.task.metadata.get("answer", "") - - # 自定义评测逻辑 - similarity = self._compute_similarity(agent_answer, reference_answer) - - # 基于阈值判断是否成功 - is_success = similarity >= self.threshold - - return similarity, is_success - - def _compute_similarity(self, text1: str, text2: str) -> float: - # 自定义相似度度量(这里只是示例) - return len(set(text1.split()) & set(text2.split())) / max( - len(text1.split()), len(text2.split()), 1 - ) -``` - -### Step 2:配置评测器 - -```yaml title="config.yaml" -ajet: - task_judge: - judge_type: customized_protocol - judge_protocol: tutorial.my_task.my_judge->MyCustomJudge -``` - -### Step 3:向评测器传递数据 - -在 workflow 中,将评测器所需字段写入 `workflow_output.metadata`: - -```python title="workflow.py" -class MyWorkflow(Workflow): - async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - # 智能体逻辑 - final_answer = await self.agent.reply(msg) - - # 返回包含 metadata 的输出,供 judger 使用 - return WorkflowOutput( - reward=None, # 将由 judger 填充 - metadata={ - "final_answer": final_answer, - # 添加其他您的 judger 需要的字段 - } - ) -``` - ---- - -## 配置速查 - -=== "使用内置 Judger" - - ```yaml - ajet: - task_judge: - judge_type: customized_protocol - judge_protocol: ajet.task_judge.-> - ``` - -=== "使用 Auto Grader" - - ```yaml - ajet: - task_judge: - judge_type: rubrics_auto_grader - rubrics_auto_grader: - model_name: "qwen-plus" - grader_mode: "pointwise" - # ... 其他配置 - ``` diff --git a/docs/zh/tune_your_first_agent.md b/docs/zh/tune_your_first_agent.md deleted file mode 100644 index 933f0195..00000000 --- a/docs/zh/tune_your_first_agent.md +++ /dev/null @@ -1,382 +0,0 @@ -# 训练你的第一个智能体 - -在本文档中,我们会从零开始,带你实现并训练一个能够使用 Python 进行计算、解决复杂数学问题的智能体。 - ---- - -## 学习路径 - -
    -
    完整训练流程
    - -
    -
      -
    1. 准备目录 - -创建项目结构和配置文件。
    2. -
    3. 配置参数 - -设置项目名称和基础配置。
    4. -
    5. 准备训练数据 - -配置数据源和加载方式。
    6. -
    7. 准备 Workflow - -定义智能体行为和奖励计算。
    8. -
    9. 调试与训练 - -验证代码并启动正式训练。
    10. -
    -
    -
    - -完成整个过程后,您将得到一个可在数学任务环境中使用的 Math 智能体,理解 AgentJet 中的核心概念,并学会如何设计您自己的训练流程。 - ---- - -## 准备目录 - -首先,我们为训练准备一个目录: - -```bash -mkdir math_agent -cd math_agent -touch math_agent.yaml -touch workflow.py -``` - -执行上述命令后,当前目录应当包含以下文件: - -``` -/math_agent - /math_agent.yaml # 配置文件 - /workflow.py # 训练 workflow,包含智能体和环境交互的定义 -``` - ---- - -## 配置参数 - -我们在配置文件中为项目起一个名字: - -```yaml title="math_agent.yaml" -ajet: - project_name: math_agent - -# ------------------ 不需要修改 ------------------ -hydra: - searchpath: - - file://ajet/default_config - - file://ajet/default_config/verl # verl only - - file://ajet/default_config/trinity # trinity only - -# ------------------ 不需要修改 ------------------ -defaults: - - verl_default # verl inherit 1/1 - - trinity_default # trinity inherit 1/1 - - ajet_default - - _self_ -``` - ---- - -## 准备训练数据 - -智能体需要在指定的任务环境下,使用训练数据驱动进行训练。 - -!!! info "支持的数据源" - AgentJet 提供了多种读取数据的方式: - - - 从本地硬盘中的文件读取 - - 从 HuggingFace Repo 中读取 - - 从 EnvService 中读取 - - 所有数据在读取后,都会被转换为 AgentJet 中统一的数据格式。 - -在本示例中,我们将直接从 HuggingFace Repo 获取 `openai/gsm8k` 作为训练数据。 - -!!! tip "关于 GSM8K" - `openai/gsm8k` 是一个经典的数学问题数据集,非常适合用于训练数学推理智能体。 - -在 `math_agent.yaml` 中添加数据配置: - -```yaml title="math_agent.yaml" -ajet: - project_name: math_agent - task_reader: - type: huggingface_dat_repo - huggingface_dat_repo: - dataset_path: 'gsm8k/main' - training_split: "train" - validation_split: "test" - data: - train_batch_size: 264 - max_prompt_length: 3000 - max_response_length: 10000 -``` - -| 配置项 | 说明 | -|--------|------| -| `type` | 指定使用 `huggingface_dat_repo` 读取器 | -| `dataset_path` | HuggingFace 上的数据集路径 | -| `training_split` | 训练集划分名称 | -| `validation_split` | 验证集划分名称 | -| `train_batch_size` | 每批次的任务数量 | -| `max_prompt_length` | 输入的最大 token 长度 | -| `max_response_length` | 回复的最大 token 长度 | - -至此,我们就完成了数据相关的全部配置,剩余的工作将由 AgentJet 自动完成。 - ---- - -## 准备 Workflow - -在 AgentJet 中,workflow 是进行训练的基本单元。它定义了智能体的行为、工具、上下文等,智能体与环境交互的具体流程,以及 Reward 的计算方法。 - -我们将在 `workflow.py` 中实现我们的 workflow。 - -### 定义 Agent - -首先,引入 agentscope 的必要依赖,并设计一个 Agent: - -```python title="workflow.py" -from agentscope.agent import ReActAgent -from agentscope.formatter import DashScopeChatFormatter -from agentscope.memory import InMemoryMemory -from agentscope.tool import Toolkit, execute_python_code - -system_prompt = """ -You are an agent specialized in solving math problems with tools. -Please solve the math problem given to you. -You can write and execute Python code to perform calculation or verify your answer. -You should return your final answer within \\boxed{{}}. -""" - -toolkit = Toolkit() -toolkit.register_tool_function(execute_python_code) - -ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model= # 暂时留空, - formatter=DashScopeChatFormatter(), - toolkit=toolkit, - memory=InMemoryMemory(), - max_iters=2, -) -``` - -!!! note "ReActAgent 说明" - 通过这段代码,我们定义了一个完整的 ReAct 智能体: - - - 使用 ReAct 范式与环境/工具交互 - - 设置了 system prompt - - 注册了一个工具:执行 Python 代码 - - 实现了 in-memory 的记忆机制 - - 更多具体的配置可参考 AgentScope 官方文档。 - -### 封装为 Workflow - -接下来,将智能体封装进一个 Workflow 类中: - -```python title="workflow.py" -from ajet import AjetTuner, Workflow, WorkflowTask, WorkflowOutput -from agentscope.message import Msg -from loguru import logger - -system_prompt = """ -You are an agent specialized in solving math problems with tools. -Please solve the math problem given to you. -You can write and execute Python code to perform calculation or verify your answer. -You should return your final answer within \\boxed{{}}. -""" - -def extract_final_answer(result) -> str: - """Extract the final answer from the agent's response.""" - try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): - return result.metadata["result"] - if hasattr(result, "content"): - if isinstance(result.content, dict) and "result" in result.content: - return result.content["result"] - return str(result.content) - return str(result) - except Exception as e: - logger.warning(f"Extract final answer error: {e}. Raw: {result}") - return str(result) - -class MathAgentWorkflow(Workflow): - name: str = "math_agent_workflow" - - async def execute( - self, workflow_task: WorkflowTask, model_tuner: ModelTuner - ) -> WorkflowOutput: - from agentscope.agent import ReActAgent - from agentscope.formatter import DashScopeChatFormatter - from agentscope.memory import InMemoryMemory - from agentscope.tool import Toolkit, execute_python_code - - query = workflow_task.task.main_query - self.toolkit = Toolkit() - self.toolkit.register_tool_function(execute_python_code) - self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=model_tuner, # 使用 model_tuner 作为模型 - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), - max_iters=2, - ) - # 禁用控制台输出 - self.agent.set_console_output_enabled(False) - msg = Msg("user", query, role="user") - # 调用智能体执行任务 - result = await self.agent.reply(msg) - # 提取最终答案 - final_answer = extract_final_answer(result) - # 将答案封装为输出 - return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) -``` - -!!! warning "关键点:model_tuner" - 在构造智能体时,**必须将 model 参数设置为 model_tuner**,这是使智能体可被训练的关键! - -### 配置 Workflow 和 Reward - -在 `math_agent.yaml` 中添加 workflow 和奖励配置: - -```yaml title="math_agent.yaml" -ajet: - # ... - rollout: - user_workflow: workflow.py->MathAgentWorkflow - - task_judge: - judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge -``` - -!!! info "关于 Judge" - 这里我们使用 AgentJet 内部提供的 math judge。Judge 会读取 metadata 中的 `final_answer`,并与数据集中的 ground_truth 对比来得到评分。 - ---- - -## 设置必要的参数 - -### 预训练模型 - -在 `math_agent.yaml` 中指定智能体使用的 LLM,也就是我们将要训练的模型: - -```yaml title="math_agent.yaml" -ajet: - model: - path: Qwen/Qwen2.5-14B-Instruct -``` - -!!! tip "模型来源" - `path` 既支持 HuggingFace Repo 中的远程地址,也可以是本地目录路径。 - -### 训练参数 - -添加必要的训练参数配置: - -```yaml title="math_agent.yaml" -ajet: - # ... - rollout: - user_workflow: workflow.py->MathAgentWorkflow - temperature: 0.7 # 模型温度 - max_env_worker: 64 # 最大的 rollout 多线程数量 - num_repeat: 4 # 每个任务重复次数 - agent_madness_reward: 0.0 # 模型乱码输出时的强制 reward - tensor_model_parallel_size: 1 # vllm 的并行参数 - max_num_seqs: 40 # vllm 最大的并行 sequence 数量 - multi_turn: - max_sample_per_task: 4 - compute_madness_checklist: # 检查的模型乱码输出类型 - - "nonsense" - - "wrong_toolcall" - max_response_length_in_one_turn: 1024 # 一轮交互中的最长回复长度 - max_model_len: 13000 # 模型的最长上下文长度 - - trainer_common: - save_freq: 99999 # 保存周期(每 n 步保存一次) - test_freq: 99999 # 验证周期(每 n 步验证一次) - total_epochs: 99999 # 训练 epoch 总量 - trinity_only__n_vllm_engine: 2 # vllm engine 数量 - -trinity: - trainer: - max_token_len_per_gpu: 13000 -``` - ---- - -## 调试 - -到目前为止,我们已经完成了训练一个智能体所需的全部代码与配置。 - -!!! tip "推荐调试模式" - 接下来,我们将在 debug 模式下启动训练流程,检查代码是否有误。您也可以跳过这一步,直接开始训练。 - -使用 debug 模式启动训练: - -```bash -ajet --conf math_agent/math_agent.yaml --backbone='debug' --with-logview -``` - -!!! info "Debug 模式特点" - debug 模式不会启动 ray 集群,非常适合单机代码调试。 - -### VS Code 断点调试 - -编写 VS Code 的 `.vscode/launch.json` 进行便捷的断点调试: - -```json title=".vscode/launch.json" -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "module": "ajet.launcher", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "math_agent/math_agent.yaml" - ], - "env": {} - } - ] -} -``` - ---- - -## 训练 - -调试完成后,即可开始正式训练: - -```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray -``` - -!!! success "训练输出" - 您可以在 `./launcher_record/{exp_yaml_file_name}` 目录下找到训练日志和 checkpoint。 - ---- - -## 了解更多 - - diff --git a/docs/zh/visualization.md b/docs/zh/visualization.md deleted file mode 100644 index a6b38602..00000000 --- a/docs/zh/visualization.md +++ /dev/null @@ -1,120 +0,0 @@ -# 训练可视化 - -通过可视化指标监控训练进度,对于理解模型行为、以及更高效地调参至关重要。AgentJet 支持多种可视化后端,可用于实时跟踪训练曲线、奖励趋势以及其他关键指标。 - ---- - -## 支持的可视化工具 - -
    -

    SwanLab

    面向 AI 研究的现代化实验跟踪平台(推荐)。

    -

    WandB

    Weights & Biases 实验跟踪平台。

    -

    TensorBoard

    TensorFlow 提供的传统可视化工具。

    -

    Console

    将日志以纯文本形式输出到标准输出。

    -
    - ---- - -## SwanLab 快速开始 - -### 配置 SwanLab - -只需在 YAML 配置中将 logger 后端设置为 `swanlab`: - -```yaml -ajet: - trainer_common: - logger: swanlab -``` - -### 启动训练 - -像平时一样启动训练: - -```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray -``` - -### 查看训练曲线 - -!!! success "自动记录" - 训练启动后,SwanLab 会自动: - - 1. 记录关键指标(reward、success rate、loss 等) - 2. 生成实时训练曲线 - 3. 提供可视化的 Web Dashboard - -您可以通过训练日志中打印的 URL 打开 SwanLab 面板,或直接访问 SwanLab 的 Web 界面查看您的实验记录。 - ---- - -## 理解训练曲线 - -### 需要重点关注的指标 - -| 指标 | 说明 | -|------|------| -| **Reward** | 每个 episode 的平均奖励,反映任务表现 | -| **Success Rate** | 任务成功完成的比例 | -| **Loss** | 策略优化算法的训练损失 | -| **Response Length** | 模型回复的平均长度 | -| **KL Divergence** | 当前策略与参考策略之间的 KL 散度 | - -### 如何解读曲线 - -**Reward 曲线示例:** - -
    -Example Training Curve -
    - -!!! info "典型的 Reward 曲线阶段" - | 阶段 | 特征 | - |------|------| - | **初始阶段** | 模型仍在探索,reward 可能较低或波动较大 | - | **学习阶段** | 随着策略变好,reward 逐步上升 | - | **收敛阶段** | 当模型接近最优表现时,reward 开始趋于平稳(平台期) | - -**建议重点观察:** - -- **持续上升趋势**:通常意味着学习有效 -- **平台期**:可能表示已经收敛,或需要调整超参数以进一步提升 -- **突然下降**:可能是训练不稳定、或出现过拟合等问题信号 - ---- - -## 最佳实践 - -### 对比多次实验 - -通过多次实验对比不同超参数设置的效果,并在 SwanLab 或 WandB 中将曲线并排比较,能更高效地定位有效配置。 - -### 设置合适的日志频率 - -在日志细节与训练开销之间取得平衡: - -```yaml -ajet: - trainer_common: - log_freq: 1 # 每 N step 记录一次日志 -``` - -### 在关键位置保存 Checkpoint - -配置 checkpoint 保存策略,以保留峰值表现阶段的模型: - -```yaml -ajet: - trainer_common: - save_freq: 100 # 每 100 step 保存一次 -``` - ---- - -## 了解更多 - - diff --git a/docs/zh/workflow.md b/docs/zh/workflow.md deleted file mode 100644 index 4a98b445..00000000 --- a/docs/zh/workflow.md +++ /dev/null @@ -1,246 +0,0 @@ -# 可训练工作流 - -本教程介绍如何在 AgentScope 中定义一个可训练的工作流(Workflow)。 - -!!! info "两种封装方式" - AgentJet 为 AgentScope Workflow 提供了两种方便且**互相兼容**的封装方式: - - - **简单模式**:强调简单、易用、容易理解 - - **进阶模式**:强调灵活、可控、易扩展 - ---- - -## 简单智能体场景 - -### 1. 在 AgentJet 中转换你的 AgentScope Workflow - -**只需要在初始化 ReActAgent 时,把 `model` 参数替换为 `model_tuner` 即可。** - -=== "修改前" - - ```python - agent_instance = ReActAgent( - name=f"Friday", - sys_prompt="You are a helpful assistant", - model=DashScopeChatModel(model_name="qwen-max", stream=False), - formatter=DashScopeChatFormatter(), - ) - ``` - -=== "修改后" - - ```python - agent_instance = ReActAgent( - name=f"Friday", - sys_prompt="You are a helpful assistant", - model=model_tuner, # 关键修改点 - formatter=DashScopeChatFormatter(), - ) - ``` - -然后,将您的 Workflow 封装到一个继承自 `Workflow` 的类中: - -```python -from ajet import Workflow, WorkflowTask, WorkflowOutput, ModelTuner - -class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - - async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - # ... your ReActAgent workflow here ... - return WorkflowOutput(reward=workflow_reward) -``` - -### 2. 什么时候使用「简单模式」 - -!!! tip "适用场景" - 这种写法适合大多数用户,如果您满足下面的情况,可以优先采用: - - - 很清楚**哪些智能体需要被训练**,或者智能体的数量本身就不多 - - 已经完成了 Workflow 的基础调试,确认在使用非微调模型时工作流正常可用 - - 不需要在运行过程中**动态改变**要训练的智能体集合 - -### 3. 代码示例 - -假设您已经实现了一个 ReAct 智能体: - -```python title="原始智能体代码" -from agentscope.agent import ReActAgent -from agentscope.formatter import DashScopeChatFormatter -from agentscope.memory import InMemoryMemory -from agentscope.tool import Toolkit, execute_python_code - -self.toolkit = Toolkit() -self.toolkit.register_tool_function(execute_python_code) -self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=DashScopeChatModel(model='qwen-max'), - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), -) -msg = Msg("user", query, role="user") -result = await self.agent.reply(msg, structured_model=FinalResult) -final_answer = extract_final_answer(result) -``` - -只需将它包裹进一个 Workflow 类即可: - -```python title="封装为 Workflow" -class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - - async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - from agentscope.agent import ReActAgent - from agentscope.formatter import DashScopeChatFormatter - from agentscope.memory import InMemoryMemory - from agentscope.tool import Toolkit, execute_python_code - - self.toolkit = Toolkit() - self.toolkit.register_tool_function(execute_python_code) - self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=model_tuner, # 关键:改为使用 model_tuner - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), - ) - - query = task.task.main_query - msg = Msg("user", query, role="user") - result = await self.agent.reply(msg, structured_model=FinalResult) - final_answer = extract_final_answer(result) - return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) -``` - ---- - -## 进阶智能体场景 - -当设计的是一个**多智能体协作**的复杂 Workflow,并且每个智能体扮演不同**角色**时,如果 AgentJet 能够「知道」每个智能体的身份,那么在训练和调试时就能提供更好的能力和更高的可控性。 - -!!! success "进阶模式的优势" - 通过多智能体协作,您可以: - - - **精细地控制**哪些智能体会被微调 - - 为「当前未被训练」的智能体明确定义其使用的默认模型 - - 在**不修改 Workflow 源码**的前提下,动态切换不同的可训练目标 - -### 1. 可训练开关与模型生命周期 - -#### 模型多角色注册与使用 - -在多智能体协作中,每个智能体拥有自己的「角色」。在 Workflow 中,我们需要显式地注册待训练的智能体角色: - -| 操作 | 方法 | 说明 | -|------|------|------| -| **注册** | `model_tuner.register_model(agent_role, default_model=...)` | 向 Tuner 注册一个待训练的智能体角色,并指定该角色在未训练时的默认模型 | -| **使用** | `model_tuner.get_model(agent_role)` | 根据 `agent_role` 返回该智能体的模型对象 | - -#### 可训练模型 vs 不可训练模型 - -在 Workflow 中可以自由控制每个智能体的训练状态。一个智能体是否参与训练由 Workflow 的 **`trainable_targets`** 声明决定: - -```python -class ExampleMathLearn(Workflow): - name: str = "a_workflow" - trainable_targets: list = ["TYPE-ZERO", ...] - - # ... -``` - -| 状态 | 条件 | 行为 | -|------|------|------| -| **可训练** | 角色在 `trainable_targets` 列表中 | 使用可训练模型 | -| **不可训练** | 角色不在 `trainable_targets` 列表中 | 使用默认模型 | - -!!! info "模型共享" - 无论角色异同,所有智能体(角色)共享一个模型实例。也就是说,具有相同参数的模型将分别扮演不同的角色。 - -### 2. 升级为进阶 AgentJet Workflow - -本节通过一个简单的例子展示使用 `ModelTuner.register_model` 为不同角色注册「可训练模型」。 - -=== "步骤 1:基础智能体" - - ```python - agent_instance = ReActAgent( - name=f"Player-X", - sys_prompt="You are a helpful assistant", - model=DashScopeChatModel(model_name="qwen-max", stream=False), - formatter=DashScopeChatFormatter(), - ) - ``` - -=== "步骤 2:注册角色" - - ```python - agent_role = "TYPE-ZERO" - default_model = DashScopeChatModel(model_name="qwen-max", stream=False) - model_tuner.register_model(agent_role, default_model=default_model) - ``` - -=== "步骤 3:绑定模型" - - ```python - agent_instance = ReActAgent( - name=f"Player-X", - sys_prompt="You are a helpful assistant", - model=model_tuner.get_model(agent_role), # 使用角色绑定的模型 - formatter=DashScopeChatFormatter(), - ) - ``` - -=== "步骤 4:定义 Workflow" - - ```python - class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - trainable_targets: list = ["TYPE-ZERO", ...] - - async def execute(self, task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - # ... your agents and workflow here ... - ``` - -### 3. 多智能体示例 - -下面是一个狼人杀游戏的多智能体场景示例: - -```python title="werewolves_workflow.py" -roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] -players = [] - -for i, role in enumerate(roles): - # 好人使用 qwen-max,狼人使用 qwen-plus - default_model_for_good_guys = OpenAIChatModel(model_name="qwen-max", stream=False) - default_model_for_bad_guys = OpenAIChatModel(model_name="qwen-plus", stream=False) - chosen_model = default_model_for_good_guys if role != "werewolf" else default_model_for_bad_guys - - # 注册角色 - model_tuner.register_model(role, default_model=chosen_model) - - # 创建智能体 - players += [ReActAgent( - name=f"Player{i + 1}", - sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), - model=model_tuner.get_model(role), - formatter=OpenAIMultiAgentFormatter(), - )] -``` - -!!! note "代码说明" - - `role` 既描述了智能体在游戏中的身份(例如狼人、村民等) - - 又作为 `model_tuner.register_model` 的 key,标识一个**可训练目标** - - `chosen_model` 定义了该角色在「当前未训练」时所使用的默认底座模型 - - 通过这种方式,可以在多智能体场景下灵活地指定和切换各角色的训练与推理行为 - ---- - -## 下一步 - - diff --git a/mkdocs.yml b/mkdocs.yml index f08bbfb4..ee12fe5f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,6 +5,10 @@ site_author: "Alibaba Tongyi Lab" repo_url: https://github.com/modelscope/AgentJet repo_name: modelscope/AgentJet copyright: "Copyright © 2025 Alibaba Tongyi Lab" + +watch: + - docs/en + theme: name: shadcn show_stargazers: true @@ -13,6 +17,10 @@ theme: features: - content.code.copy - content.code.annotate + # icon: + # admonition: + # warning: material/alert + nav: - Overview: index.md @@ -40,30 +48,30 @@ nav: - Visualization: en/visualization.md - Beast Logger: en/beast_logger.md - Data Generation: en/data_generation.md - - Tracing Feedback Loop: en/example_tracing_feedback_loop.md + - Tracing Feedback: en/example_tracing_feedback_loop.md - - 中文文档: - - 简介: zh/intro.md - - 安装: zh/installation.md - - 快速开始: zh/quickstart.md - - 调优你的第一个 Agent: zh/tune_your_first_agent.md - - 示例: - - 数学 Agent: zh/example_math_agent.md - - AppWorld Agent: zh/example_app_world.md - - 狼人杀游戏: zh/example_werewolves.md - - 学会提问: zh/example_learning_to_ask.md - - 冰湖问题: zh/example_frozenlake.md - - 倒计时游戏: zh/example_countdown.md - - 组件: - - 工作流: zh/workflow.md - - 数据管道: zh/data_pipeline.md - - 任务评判器: zh/task_judger.md - - 深入探索: - - 配置: zh/configuration.md - - 可视化: zh/visualization.md - - Beast Logger: zh/beast_logger.md - - 数据生成: zh/data_generation.md - - Tracing 反馈循环: zh/example_tracing_feedback_loop.md + # - 中文文档: + # - 简介: zh/intro.md + # - 安装: zh/installation.md + # - 快速开始: zh/quickstart.md + # - 调优你的第一个 Agent: zh/tune_your_first_agent.md + # - 示例: + # - 数学 Agent: zh/example_math_agent.md + # - AppWorld Agent: zh/example_app_world.md + # - 狼人杀游戏: zh/example_werewolves.md + # - 学会提问: zh/example_learning_to_ask.md + # - 冰湖问题: zh/example_frozenlake.md + # - 倒计时游戏: zh/example_countdown.md + # - 组件: + # - 工作流: zh/workflow.md + # - 数据管道: zh/data_pipeline.md + # - 任务评判器: zh/task_judger.md + # - 深入探索: + # - 配置: zh/configuration.md + # - 可视化: zh/visualization.md + # - Beast Logger: zh/beast_logger.md + # - 数据生成: zh/data_generation.md + # - Tracing 反馈循环: zh/example_tracing_feedback_loop.md plugins: - search: @@ -109,6 +117,7 @@ markdown_extensions: extra_css: - https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap + - stylesheets/font.css - stylesheets/feature-cards.css - stylesheets/tabbed-code.css - stylesheets/readability-enhancements.css diff --git a/pyproject.toml b/pyproject.toml index 8e20c8c4..ac1bc676 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ verl = [ ] trinity = [ - "trinity-rft @ git+https://github.com/modelscope/Trinity-RFT.git" + "trinity-rft==0.4.0" ] dev = [ diff --git a/tutorial/example_math_agent/math_agent.md b/tutorial/example_math_agent/math_agent.md index 39e645f5..894f34aa 100644 --- a/tutorial/example_math_agent/math_agent.md +++ b/tutorial/example_math_agent/math_agent.md @@ -1,176 +1,4 @@ -## 运行math agent +# Training a basic math agent -### 1. 准备dataset -请下载 `openai/gsm8k` 数据集 -```bash -python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/store/dataset - -# ╭───────────────────────────────────────────────────────────────── downloaded files ─────────────────────────────────────────────────────────────────╮ -# │ ┌──────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ -# │ │ 0 │ /the/path/to/store/dataset/openai/gsm8k/main/test-00000-of-00001.parquet │ │ -# │ ├──────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ -# │ │ 1 │ /the/path/to/store/dataset/openai/gsm8k/main/train-00000-of-00001.parquet │ │ -# │ ├──────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ -# │ │ 2 │ /the/path/to/store/dataset/openai/gsm8k/socratic/test-00000-of-00001.parquet │ │ -# │ ├──────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ -# │ │ 3 │ /the/path/to/store/dataset/openai/gsm8k/socratic/train-00000-of-00001.parquet │ │ -# │ └──────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │ -# ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -# Generating train split: 100%|██████████████████████████████████████████████████████████████████████████████████| 7473/7473 [00:00<00:00, 380098.15 examples/s] -# Generating test split: 100%|███████████████████████████████████████████████████████████████████████████████████| 1319/1319 [00:00<00:00, 358866.57 examples/s] -# 2025-11-10 11:14:30.220 | INFO | best_logger.print_basic:print_listofdict:155 - -# ╭────────────────────────────────────────────────────────────────────── train ───────────────────────────────────────────────────────────────────────╮ -# │ ┏━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ -# │ ┃ ┃ question ┃ answer ┃ │ -# │ ┡━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ -# │ │ [0] │ Natalia sold clips to 48 of her friends in April, and then she │ Natalia sold 48/2 = <<48/2=24>>24 clips in May. │ │ -# │ │ │ sold half as many clips in May. How many clips did Natalia sell │ Natalia sold 48+24 = <<48+24=72>>72 clips altogether in April and │ │ -# │ │ │ altogether in April and May? │ May. │ │ -# │ │ │ │ #### 72 │ │ -# │ ├─────┼────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────┤ │ -# │ │ [1] │ Weng earns $12 an hour for babysitting. Yesterday, she just did 50 │ Weng earns 12/60 = $<<12/60=0.2>>0.2 per minute. │ │ -# │ │ │ minutes of babysitting. How much did she earn? │ Working 50 minutes, she earned 0.2 x 50 = $<<0.2*50=10>>10. │ │ -# │ │ │ │ #### 10 │ │ -``` - -### 2. 准备 AgentScope Workflow - -详细请见 `tutorial/math_agent.py`。可以在项目任意地方新建新的 AgentScope Workflow 代码 - -- 定义 AgentScope 的工作流 -```python -self.toolkit = Toolkit() -self.toolkit.register_tool_function(execute_python_code) -self.agent = ReActAgent( - name="math_react_agent", - sys_prompt=system_prompt, - model=ajet_proxy, # type: ignore - formatter=DashScopeChatFormatter(), - toolkit=self.toolkit, - memory=InMemoryMemory(), -) -msg = Msg("user", init_messages[0]['content'], role="user") -result = await self.agent.reply(msg, structured_model=FinalResult) -``` - - -- 在 AgentScope Workflow 中,注册评价函数需要的任意关键数据 -```python -ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) -``` - - -### 3. 准备Judge (奖励模块) - -在 tutorial/example_math_agent/math_answer_as_judge.py 中,提供了两个简单的Judge。可以在项目任意地方新建新的Judge代码 - -Judge的输入参数包含: - -```python -judge_input_dictionary['env']: env_service 外部环境 (如果使用了env_service) -judge_input_dictionary['workflow_task']: 任务信息(如果里面包含了参考答案,可以从中取出) -judge_input_dictionary['grouped_steps']: LLM的每一次历史对话记录(如果中间过程比较重要,可以从中取出) -judge_input_dictionary['final_answer']: 默认没有final_answer,需要在agentscope workflow中手动调用 ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) 注册 -``` - -Judge的返回值: raw_reward, is_success - - -### 4. 测试 - - -4.1 复制并修改 [tutorial/example_math_agent/math_agent.yaml](../tutorial/example_math_agent/math_agent.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 - -1. 读取task(对应配置字段 ajet.task_reader) -2. 定义 Workflow(对应配置字段 ajet.rollout.user_workflow ) - - 举例如果 agentscope workflow 定义在 `tutorial/math_agent.py` 的`ExampleMathLear` 类 - - 则填写 ajet.rollout.user_workflow=`tutorial.math_agent->ExampleMathLearn` -3. 定义评分函数(对应配置字段 ajet.task_judge.judge_protocol ) - - 举例如果 agentscope workflow 定义在 `tutorial/example_math_agent/math_answer_as_judge.py` 的`MathAnswerAndLlmAsJudge` 类 - - 则填写 ajet.task_judge.judge_protocol=`tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge` -4. 指定模型(对应配置字段 ajet.model.path ) - -```yaml -ajet - task_reader: - type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` - rollout: - user_workflow: tutorial.math_agent->ExampleMathLearn # ✨✨✨✨ 编写并选择Agent - task_judge: - # ✨✨✨✨ 编写并选择评价函数 - judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge - model: - # ✨✨✨✨ 设置待训练的模型 - path: YOUR_MODEL_PATH -``` - - -4.2 全链路调试(脱离ray快速调试:--backbone='debug') -```bash -# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( ajet --kill="python|ray" ) -clear && \ -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='debug' --with-logview -``` -备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: -```json -{ - - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "program": "ajet/cli/launcher.py", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "xxxx/xxxx/xxxx.yaml" - ], - "env": { - } - }, - ] -} -``` - - -4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') -```bash -# 建议开始前杀死所有ray、vllm、env_service进程 ( ajet --kill="python|ray|vllm" ) -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray -``` - - -### 5. 读取Rollout日志 - -
    - 日志界面 -
    - -- 找到日志文件夹,默认在 `./saved_experiments/exp_yaml_file_name/*` 下面 -- 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 -```bash -root@xxxx:/xxx/xxx/xxx# beast_logger_go -INFO: Started server process [74493] -INFO: Waiting for application startup. -INFO: Application startup complete. -INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) -``` -- 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /ajet/ajet/saved_experiments - - /ajet/ajet/saved_experiments/exp_yaml_file_name - - /ajet/ajet/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - -- 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 - -- 蓝色 Token 代表参与loss计算的 Token,黄色反之 - -- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) - - -### 6. 参考训练曲线 - -点击链接打开训练曲线: -https://swanlab.cn/@binaryhusky/public/runs/96arcunrxlezdmcvmcdob/chart +Please refer to document at [`docs/en/example_app_world.md`](docs/en/example_app_world.md) diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index fccb8430..f02189d6 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -1,24 +1,24 @@ -# ------------------ 主要配置 ------------------ +# ------------------ main configuration ------------------ ajet: project_name: example_math_agent task_reader: type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` - # 如果选择 `huggingface_dat_repo` 以下配置生效 + # effective when `type: huggingface_dat_repo` huggingface_dat_repo: dataset_path: '/mnt/data_cpfs/qingxu.fu/dataset/openai/gsm8k/main' training_split: "train" validation_split: "test" task_judge: - # ✨✨✨✨ 编写并选择评价函数 + # ✨✨✨✨ define your evaluation function judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAsJudge model: - # ✨✨✨✨ 设置待训练的模型 + # ✨✨✨✨ set the model to be trained path: Qwen/Qwen2.5-7B rollout: - user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ 编写并选择Agent + user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ write and select workflow temperature: 1.0 max_env_worker: 64 num_repeat: 6 @@ -56,16 +56,16 @@ trinity: sync_method: nccl -# ------------------ 不需要修改 ------------------ +# ------------------ do not modify ------------------ hydra: searchpath: - file://ajet/default_config - - file://ajet/default_config/verl # verl only - - file://ajet/default_config/trinity # trinity only + - file://ajet/default_config/verl + - file://ajet/default_config/trinity -# ------------------ 不需要修改 ------------------ +# ------------------ do not modify ------------------ defaults: - - verl_default # verl inherit 1/1 - - trinity_default # trinity inherit 1/1 + - verl_default + - trinity_default - ajet_default - _self_ diff --git a/tutorial/example_math_agent/math_agent_simplify.py b/tutorial/example_math_agent/math_agent_simplify.py index c1249db5..8e1250ad 100644 --- a/tutorial/example_math_agent/math_agent_simplify.py +++ b/tutorial/example_math_agent/math_agent_simplify.py @@ -1,8 +1,6 @@ import re - -from agentscope.message import Msg from loguru import logger - +from agentscope.message import Msg from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask @@ -42,6 +40,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl from agentscope.memory import InMemoryMemory from agentscope.tool import Toolkit, execute_python_code + # run agentscope query = workflow_task.task.main_query self.toolkit = Toolkit() self.toolkit.register_tool_function(execute_python_code) @@ -69,7 +68,5 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl is_success = result == reference_answer else: is_success = False - raw_reward = 1.0 if is_success else 0.0 - return WorkflowOutput(reward=raw_reward, metadata={"final_answer": final_answer}) From c45384c0080963b853f9dd4a32dae52a71df4bdd Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 01:50:24 +0800 Subject: [PATCH 411/462] update docs --- README.md | 2 +- docs/en/example_app_world.md | 12 +- docs/en/example_countdown.md | 2 +- docs/en/example_frozenlake.md | 4 +- docs/en/example_learning_to_ask.md | 2 + docs/en/example_math_agent.md | 4 +- docs/en/example_tracing_feedback_loop.md | 3 +- docs/en/example_werewolves.md | 6 +- docs/en/intro.md | 2 +- docs/en/introduction.md | 2 +- docs/en/quickstart.md | 2 +- docs/en/visualization.md | 2 +- docs/en/workflow.md | 1 - mini_test.py => docs/mini_test.py | 0 tutorial/example_appworld/appworld.md | 80 ++++++------ tutorial/example_appworld/appworld.py | 1 - tutorial/example_appworld/appworld_oai_sdk.py | 1 - tutorial/example_learn2ask/learn2ask.md | 2 +- tutorial/example_werewolves/start.py | 1 - tutorial/example_werewolves/werewolves.md | 123 +----------------- 20 files changed, 66 insertions(+), 186 deletions(-) rename mini_test.py => docs/mini_test.py (100%) diff --git a/README.md b/README.md index 9dda0620..d7d231e5 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](docs/en/example_math_agent.md) as an example: ```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml ``` #### Example Library diff --git a/docs/en/example_app_world.md b/docs/en/example_app_world.md index 687bbfbc..dc3aab80 100644 --- a/docs/en/example_app_world.md +++ b/docs/en/example_app_world.md @@ -43,7 +43,7 @@ export APPWORLD_SCRIPT="bash EnvService/env_sandbox/appworld.sh" Run the training script: ```bash -ajet --conf tutorial/example_appworld/appworld.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_appworld/appworld.yaml --with-appworld ```
    @@ -90,13 +90,13 @@ This section explains how the AppWorld example is assembled: workflow, reward, c The AgentScope workflow code for the AppWorld example is located at `tutorial/example_appworld/appworld.py`. -The code first defines the AgentScope workflow (set the agent's `model` to `model_tuner`): +The code first defines the AgentScope workflow (set the agent's `model` to `tuner.as_agentscope_model()`): ```python agent = ReActAgent( name="Qwen", sys_prompt=first_msg["content"], - model=model_tuner, + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), toolkit=None, @@ -105,7 +105,7 @@ agent = ReActAgent( env = workflow_task.gym_env -for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): +for step in range(tuner.config.ajet.rollout.multi_turn.max_steps): # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol @@ -117,14 +117,14 @@ for step in range(model_tuner.config.ajet.rollout.multi_turn.max_steps): # is terminated? if terminate: break - if model_tuner.get_context_tracker().context_overflow: + if tuner.get_context_tracker().context_overflow: break ``` In the above code: - `env.step`: simulates the gym interface. It takes an action as input and returns a four-tuple `(observation, reward, terminate_flag, info)`. -- `model_tuner.get_context_tracker().context_overflow`: checks whether the current context window has exceeded the token limit. +- `tuner.get_context_tracker().context_overflow`: checks whether the current context window has exceeded the token limit. ### 3.2 Reward diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index df7f8b4f..e214e4d5 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -84,7 +84,7 @@ See details in `tutorial/example_countdown/countdown.py`. You can create new Age self.agent = ReActAgent( name="countdown_react_agent", sys_prompt=system_prompt, - model=model_tuner, + model=tuner.as_agentscope_model(), formatter=DashScopeChatFormatter(), memory=InMemoryMemory(), max_iters=2, diff --git a/docs/en/example_frozenlake.md b/docs/en/example_frozenlake.md index bca8e0ba..972151b8 100644 --- a/docs/en/example_frozenlake.md +++ b/docs/en/example_frozenlake.md @@ -23,13 +23,13 @@ pip install gymnasium[toy_text] Use the provided configuration file to quickly start training: ```bash -ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_frozenlake/frozenlake_easy.yaml --backbone='verl' ``` To try a harder setting: ```bash -ajet --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone=trinity --with-ray +ajet --conf tutorial/example_frozenlake/frozenlake_hard.yaml --backbone='verl' ```
    diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index 3f1b9e51..d747860b 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -42,6 +42,8 @@ After preprocessing, you should have: `train.jsonl` and`test.jsonl`。 #### 2.2 Start Training ```bash +ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='verl' +# or ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray ``` diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index d4b6a152..b2721a6e 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -35,7 +35,7 @@ python scripts/download_dataset.py --target=openai/gsm8k --path=/the/path/to/sto # (optional) recommended cleanup before training # ajet --kill="python|ray|vllm" -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' ``` ??? tip "Quick Debugging (Optional)" @@ -135,7 +135,7 @@ self.toolkit.register_tool_function(execute_python_code) self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, - model=model_tuner, # trainer-managed model wrapper + model=tuner.as_agentscope_model(), # trainer-managed model wrapper formatter=DashScopeChatFormatter(), toolkit=self.toolkit, memory=InMemoryMemory(), diff --git a/docs/en/example_tracing_feedback_loop.md b/docs/en/example_tracing_feedback_loop.md index eaddc6a6..4a348402 100644 --- a/docs/en/example_tracing_feedback_loop.md +++ b/docs/en/example_tracing_feedback_loop.md @@ -75,7 +75,8 @@ ajet: When everything is ready, start the training with `launcher.py`. ```bash -# this launch the demo +ajet --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='verl' +# or ajet --conf tutorial/example_feedback_tracing/example_feedback_tracing.yaml --backbone='trinity' --with-ray ``` diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index b12eb4aa..ad976d56 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -26,7 +26,7 @@ Scenario Overview Start training with the following command: ``` # ( ajet --kill="python|ray|vllm" ) -ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='verl' ```
    @@ -72,9 +72,9 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j At a high level, each training iteration follows this flow: - The task reader generates a new game setup (players, role assignments, initial state). - The rollout runs the AgentScope workflow to simulate a full game. -- Agents in `trainable_targets` act using the trainable model (via `model_tuner`), while opponents use the fixed model. +- Agents in `trainable_targets` act by using the trainable model (via `tuner.as_agentscope_model(...)`), while opponents use the fixed model. - The environment produces rewards / outcomes for the episode. -- Trajectories are collected and passed to the backbone trainer (e.g., `trinity`) to update the trainable model. +- Trajectories are collected and passed to the backbone trainer (`verl` or `trinity`) to update the trainable model. ### 3.2 Configuration Details diff --git a/docs/en/intro.md b/docs/en/intro.md index b85c257a..168acbaa 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -51,7 +51,7 @@ We recommend using `uv` for dependency management. You can start training your first agent with a single command using a pre-configured YAML file: ```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml ``` !!! example "Learn More" diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 7ca41633..3c226955 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -51,7 +51,7 @@ uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](./example_math_agent.md) as an example: ```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml ``` #### Example Library diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index e08d7bda..74a206f3 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -3,7 +3,7 @@ AgentJet provides a complete feature set for tuning agents. You can try starting training an agent right away: ```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml ``` --- diff --git a/docs/en/visualization.md b/docs/en/visualization.md index 71e8ac5f..bc66d52d 100644 --- a/docs/en/visualization.md +++ b/docs/en/visualization.md @@ -31,7 +31,7 @@ ajet: Launch your training as usual: ```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_math_agent/math_agent.yaml ``` ### Step 3: View Training Curves diff --git a/docs/en/workflow.md b/docs/en/workflow.md index a5164dae..a366140b 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -154,7 +154,6 @@ Here's a complete example with multiple agent roles (Werewolves game): === "`tutorial/example_werewolves/start.py`" ```python class ExampleWerewolves(Workflow): - trainer: str = Field(default="ajet-trinity") trainable_targets: List[str] | None = Field(default=["werewolf"], description="List of agents to be fine-tuned.") async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: diff --git a/mini_test.py b/docs/mini_test.py similarity index 100% rename from mini_test.py rename to docs/mini_test.py diff --git a/tutorial/example_appworld/appworld.md b/tutorial/example_appworld/appworld.md index 91c66373..3a759a8a 100644 --- a/tutorial/example_appworld/appworld.md +++ b/tutorial/example_appworld/appworld.md @@ -1,15 +1,15 @@ -## 运行 Appworld AgentScope Agent +## Run Appworld AgentScope Agent -### 1. 准备 dataset +### 1. Prepare dataset -请下载 `env_service` 以及 `appworld`。具体步骤请参考 [EnvService文档](https://code.alibaba-inc.com/EconML/EnvService) +Please download `env_service` and `appworld`. For specific steps, please refer to [EnvService Documentation](https://code.alibaba-inc.com/EconML/EnvService) -### 2. 准备 AgentScope Workflow +### 2. Prepare AgentScope Workflow -详细请见 `tutorial/math_agent.py`。可以在项目任意地方新建新的 AgentScope Workflow 代码 +See `tutorial/math_agent.py` for details. You can create new AgentScope Workflow code anywhere in the project -- 定义 AgentScope 的工作流 (把agent的model修改为`ajet_proxy`) +- Define AgentScope Workflow (Change the agent's model to `ajet_proxy`) ```python @@ -36,42 +36,42 @@ for _ in range(config.ajet.rollout.multi_turn.max_steps): ``` -- 其中,使用了 ajet_proxy 与 agentscope runtime 环境交互的一些接口如下: - - `ajet_proxy.gym_step` 模拟gym接口,输入动作,输出 observation, reward, terminate_flag, info 四元组 - - `ajet_proxy.context_overflow` 查询当前的context窗口是否token溢出 +- Among them, some interfaces used by `ajet_proxy` to interact with the agentscope runtime environment are as follows: + - `ajet_proxy.gym_step`: Simulates the gym interface, inputs action, outputs (observation, reward, terminate_flag, info) tuple + - `ajet_proxy.context_overflow`: Queries whether the current context window has token overflow -### 3. 准备Judge (奖励模块) +### 3. Prepare Judge (Reward Module) -在 `ajet/task_judge/env_service_as_judge.py` 中,我们直接向 env_service 发送http请求,读取奖励。 +In `ajet/task_judge/env_service_as_judge.py`, we directly send an http request to env_service to read the reward. -Judge的返回值: raw_reward, is_success +Judge returns: raw_reward, is_success -### 4. 测试 +### 4. Testing -4.1 复制并修改 [tutorial/example_appworld/appworld.yaml](../tutorial/example_appworld/appworld.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 +4.1 Copy and modify key parameters in [tutorial/example_appworld/appworld.yaml](../tutorial/example_appworld/appworld.yaml). The parts most relevant to this document in the yaml have been marked with ✨✨✨✨ symbols -1. 读取task(对应配置字段 ajet.task_reader) -2. 定义 Workflow(对应配置字段 ajet.rollout.user_workflow ) - - 举例如果 agentscope workflow 定义在 `tutorial/appworld.py` 的`ExampleAgentScopeWorkflow` 类 - - 则填写 ajet.rollout.user_workflow=`tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow` -3. 定义评分函数(对应配置字段 ajet.task_judge.judge_protocol ) - - 填写 ajet.task_judge.judge_protocol=`ajet.task_judge.env_service_as_judge->EnvServiceJudge` -4. 指定模型(对应配置字段 ajet.model.path ) +1. Read task (corresponding configuration field `ajet.task_reader`) +2. Define Workflow (corresponding configuration field `ajet.rollout.user_workflow`) + - For example, if the agentscope workflow is defined in the `ExampleAgentScopeWorkflow` class of `tutorial/appworld.py` + - Then fill in `ajet.rollout.user_workflow=tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow` +3. Define scoring function (corresponding configuration field `ajet.task_judge.judge_protocol`) + - Fill in `ajet.task_judge.judge_protocol=ajet.task_judge.env_service_as_judge->EnvServiceJudge` +4. Specify model (corresponding configuration field `ajet.model.path`) ```yaml ajet project_name: appworld_ajet experiment_name: "read_yaml_name" task_judge: - # ✨✨✨✨ 编写并选择评价函数 + # ✨✨✨✨ Write and select evaluation function judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge model: - # ✨✨✨✨ 设置待训练的模型 + # ✨✨✨✨ Set model to be trained path: YOUR_MODEL_PATH rollout: - # ✨✨✨✨ 编写并选择Agent + # ✨✨✨✨ Write and select Agent user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow force_disable_toolcalls: True debug: @@ -80,13 +80,13 @@ ajet ``` -4.2 全链路调试(脱离ray快速调试:--backbone='debug') +4.2 Full-link debugging (Quick debugging without ray: --backbone='debug') ```bash -# (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( ajet --kill="python|ray" ) +# (Training math agent demo) It is recommended to kill all ray and env_service processes before starting ( ajet --kill="python|ray" ) clear && ajet --conf tutorial/example_appworld/appworld.yaml --backbone='debug' --with-logview ``` -备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: +Note: When --backbone=debug, the program no longer uses ray. You can write vscode's launch.json for convenient breakpoint debugging. launch.json configuration: ```json { @@ -111,21 +111,21 @@ clear && ajet --conf tutorial/example_appworld/appworld.yaml --backbone='debug' ``` -4.3 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') +4.3 When debugging is complete, start training (just switch backbone: --backbone='verl') ```bash -# 建议开始前杀死所有ray、vllm、env_service进程 ( ajet --kill="python|ray|vllm" ) -ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='trinity' +# It is recommended to kill all ray, vllm, and env_service processes before starting ( ajet --kill="python|ray|vllm" ) +ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' ``` -### 5. 读取Rollout日志 +### 5. Read Rollout Log
    - 日志界面 + Log Interface
    -- 找到日志文件夹,默认在 `./saved_experiments/exp_yaml_file_name/*` 下面 -- 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 +- Find the log folder, default is under `./saved_experiments/exp_yaml_file_name/*` +- Run `beast_logger_go` to start the log browser, vscode port mapping 8181 port ```bash root@xxxx:/xxx/xxx/xxx# beast_logger_go INFO: Started server process [74493] @@ -133,21 +133,21 @@ INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) ``` -- 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 +- Open http://127.0.0.1:8181, prompt to enter the log file path, fill in the **absolute path** of the log folder, the following forms are acceptable - /ajet/ajet/saved_experiments - /ajet/ajet/saved_experiments/exp_yaml_file_name - /ajet/ajet/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout -- 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 +- Open the log file target on the **left**, the log entry in the **middle**, and the interaction record on the **right** of the interface to display the complete trajectory -- 蓝色 Token 代表参与loss计算的 Token,黄色反之 +- Blue Token represents Token involved in loss calculation, yellow is the opposite -- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) +- Hover over the Token to view the Token's **logprob** (currently limited to trinity backbone) -### 6. 参考训练曲线 +### 6. Reference Training Curve
    - 训练曲线 + Training Curve
    diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py index 2c800829..d8b647e7 100644 --- a/tutorial/example_appworld/appworld.py +++ b/tutorial/example_appworld/appworld.py @@ -5,7 +5,6 @@ class ExampleAgentScopeWorkflow(Workflow): - trainer: str = Field(default="ajet-trinity") async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent diff --git a/tutorial/example_appworld/appworld_oai_sdk.py b/tutorial/example_appworld/appworld_oai_sdk.py index 25442d48..534ec00b 100644 --- a/tutorial/example_appworld/appworld_oai_sdk.py +++ b/tutorial/example_appworld/appworld_oai_sdk.py @@ -7,7 +7,6 @@ class ExampleAgentScopeWorkflow(Workflow): - trainer: str = Field(default="ajet-trinity") async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: diff --git a/tutorial/example_learn2ask/learn2ask.md b/tutorial/example_learn2ask/learn2ask.md index f67a01b4..d5afd08f 100644 --- a/tutorial/example_learn2ask/learn2ask.md +++ b/tutorial/example_learn2ask/learn2ask.md @@ -56,7 +56,7 @@ You can use this exisiting configuration file straigtly and fill the dataset pat Start the training with ```bash -ajet --conf tutorial/example_learn2ask/learn2ask.yaml --backbone='trinity' --with-ray +ajet --conf tutorial/example_learn2ask/learn2ask.yaml ``` ## 4. Results diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index 22f9004b..554b0977 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -80,7 +80,6 @@ def get_official_agent_prompt(name) -> str: class ExampleWerewolves(Workflow): - trainer: str = Field(default="ajet-trinity") trainable_targets: List[str] | None = Field(default=["werewolf"], description="List of agents to be fine-tuned.") async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: diff --git a/tutorial/example_werewolves/werewolves.md b/tutorial/example_werewolves/werewolves.md index 90c0a8db..e6528d2f 100644 --- a/tutorial/example_werewolves/werewolves.md +++ b/tutorial/example_werewolves/werewolves.md @@ -1,123 +1,4 @@ -## 运行 WereWolves AgentScope Agent +# Training a basic math agent -### 1. 准备 AgentScope Workflow - -详细请见 `tutorial/werewolves/start.py`。可以在项目任意地方新建新的 AgentScope Workflow 代码 - -- 定义 AgentScope 的工作流 (把agent的model修改为`ajet_proxy`) - ```python - class ExampleWerewolves(Workflow): - trainer: str = Field(default="ajet-trinity") - async def execute(self, init_messages, ajet_proxy: ModelTuner, config) -> WorkflowOutput: - - train_which_role = "witch" - roles = ["werewolf"] * 3 + ["villager"] * 3 + ["seer", "witch", "hunter"] - - # Set random seed for reproducibility - workflow_task = ajet_proxy.get_agentscope_input_dictionary()[workflow_task] - task_id = workflow_task.task.task_id - - np.random.seed(int(task_id)) - np.random.shuffle(roles) - - players = [get_official_agents(f"Player{x + 1}", roles[x], train_which_role, ajet_proxy) for x in range(9)] - - good_guy_win = await werewolves_game(players, roles) - raw_reward = 1 if (good_guy_win and train_which_role != "werewolf") or (not good_guy_win and train_which_role == "werewolf") else 0 - ajet_proxy.update_judge_input_dictionary(raw_reward = raw_reward) - ajet_proxy.update_judge_input_dictionary(is_success = (raw_reward == 1)) - return ajet_proxy - - ``` - - -### 2. 测试 - - -- 复制并修改 [tutorial/example_werewolves/werewolves.yaml](../tutorial/example_werewolves/werewolves.yaml) 中的关键参数,yaml中与本文档最相关的部分已经用✨✨✨✨符号标记 - ```yaml - ajet - task_reader: - type: random_dummy # `env_service` or `dataset_file` or `huggingface_dat_repo` or `random_dummy` - task_judge: - # 编写并选择评价函数 - judge_protocol: null - model: - # ✨✨✨✨ 设置待训练的模型 - path: YOUR_MODEL_PATH - rollout: - user_workflow: tutorial.example_werewolves.start->ExampleWerewolves # ✨✨✨✨ 编写并选择Agent - ``` - - -- 全链路调试(脱离ray快速调试:--backbone='debug') - ```bash - # (训练math agent demo)建议开始前杀死所有ray、env_service进程 ( ajet --kill="python|ray" ) - ajet --kill="python|ray|vllm|VLLM" && ray stop && clear && ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='debug' --with-logview - - ``` - 备注:当--backbone=debug时,程序不再使用ray,可以编写vscode的launch.json进行便捷的断点调试,launch.json的配置: - ```json - { - - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Launch rollout", - "type": "debugpy", - "request": "launch", - "program": "ajet/cli/launcher.py", - "console": "integratedTerminal", - "args": [ - "--backbone", "debug", - "--conf", "tutorial/example_werewolves/werewolves.yaml" - ], - "env": { - } - }, - ] - } - ``` - - -- 当调试完成后,开始训练(只需要把backbone切换一下即可:--backbone='trinity') - ```bash - # 建议开始前杀死所有ray、vllm、env_service进程 ( ajet --kill="python|ray|vllm" ) - ajet --kill="python|ray|vllm|VLLM" && ray stop && clear && \ - ajet --conf tutorial/example_werewolves/werewolves.yaml --backbone='trinity' --with-ray - ``` - - -### 3. 读取Rollout日志 - -
    - 日志界面 -
    - -- 找到日志文件夹,默认在 `./saved_experiments/exp_yaml_file_name/*` 下面 -- 运行 `beast_logger_go` 启动日志浏览器,vscode端口映射8181端口 -```bash -root@xxxx:/xxx/xxx/xxx# beast_logger_go -INFO: Started server process [74493] -INFO: Waiting for application startup. -INFO: Application startup complete. -INFO: Uvicorn running on http://127.0.0.1:8181 (Press CTRL+C to quit) -``` -- 打开 http://127.0.0.1:8181,提示输入日志文件路径,填写日志文件夹的**绝对路径**,以下形式皆可 - - /ajet/ajet/saved_experiments - - /ajet/ajet/saved_experiments/exp_yaml_file_name - - /ajet/ajet/saved_experiments/exp_yaml_file_name/2025_11_10_02_52/rollout - -- 依次打开界面 **左侧** 的日志文件目标,**中间** 的日志条目,**右侧** 的交互记录,即可显示完整的轨迹 - -- 蓝色 Token 代表参与loss计算的 Token,黄色反之 - -- 鼠标悬浮在 Token 上面可以查看 Token 的 **logprob** (暂时仅限trinity backbone) - - -#### 4. 训练参考曲线 - -
    - 日志界面 -
    +Please refer to document at [`docs/en/example_werewolves.md`](docs/en/example_werewolves.md) From 34963f70fe1594c6d8debc5149e93aac60864460 Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 02:27:32 +0800 Subject: [PATCH 412/462] update logo --- docs/agentjet.jpg | Bin 0 -> 318355 bytes docs/en/intro.md | 2 +- docs/en/introduction.md | 2 +- docs/index.md | 7 ++++++- 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 docs/agentjet.jpg diff --git a/docs/agentjet.jpg b/docs/agentjet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d51f4a98f1684c0a410684ef5571ff64a5e99a7 GIT binary patch literal 318355 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
      -|l&dvHhBz)nH@*RKuyr(bzK!8I^hSl2V;Kc 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𝔖Ft3+WRGB|CV1kvJtkK9vzBJ5 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%0ARQd~=D)u%iH4~Xr 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 ZhqI(Jf29jL$u*z3zP|2smi+I<{{a_Du%`e3 literal 0 HcmV?d00001 diff --git a/docs/en/intro.md b/docs/en/intro.md index 168acbaa..afa6feb0 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -1,6 +1,6 @@ # Introduction -**AgentJet (AgentJet)** is a cutting-edge, user-friendly agent tunning framework designed to optimize LLM models and agent workflows. +**AgentJet (AJet)** is a cutting-edge, user-friendly agent tunning framework designed to optimize LLM models and agent workflows. Simply provide your workflow (built from AgentScope, OpenAI SDK, Langchain, raw HTTP requests, or hybrid of all of them), training data, and reward function, and we will be ready to enhance your agents to their optimal performance! diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 3c226955..b62ebce1 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -1,6 +1,6 @@ # Introduction -**AgentJet (AgentJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. +**AgentJet (AJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! diff --git a/docs/index.md b/docs/index.md index 320b801f..7ced0866 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,11 @@ # AgentJet -**AgentJet (AgentJet)** is a cutting-edge, user-friendly agent tunning framework designed to optimize LLM models and agent workflows. + +
      +AgentJet +
      + +**AgentJet (AJet)** is a cutting-edge, user-friendly agent tunning framework designed to optimize LLM models and agent workflows. ## 🛩️ Key Features From cdecc4e0dd1d7b36066d94339710b7bc9b76e2fb Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 10:54:33 +0800 Subject: [PATCH 413/462] update version --- pyproject.toml | 2 +- setup.py | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 setup.py diff --git a/pyproject.toml b/pyproject.toml index ac1bc676..f16f125b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "AgentJet" -version = "0.1.0" +version = "0.0.1" readme = "README.md" classifiers = [ "Development Status :: 3 - Alpha", diff --git a/setup.py b/setup.py deleted file mode 100644 index e6351118..00000000 --- a/setup.py +++ /dev/null @@ -1,7 +0,0 @@ -from setuptools import find_packages, setup - -setup( - name="ajet", # Change this to your package name - version="0.1.0", - packages=find_packages(), -) From 0e020eb9d306c85b66a2d363f074f4c3a17f3d57 Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 11:00:35 +0800 Subject: [PATCH 414/462] add benchmark site protection --- ajet/utils/testing_utils.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ajet/utils/testing_utils.py b/ajet/utils/testing_utils.py index e64a1c60..44f71b65 100644 --- a/ajet/utils/testing_utils.py +++ b/ajet/utils/testing_utils.py @@ -99,7 +99,14 @@ def send_test_result( Post a single experiment result to the /report_test_result endpoint. Raises requests.HTTPError on non-2xx responses. """ + + access_token = os.environ.get("BENCHMARK_ACCESS_TOKEN", None) + if not access_token: + logger.error("Cannot report to benchmark site, missing administrator token (`BENCHMARK_ACCESS_TOKEN` env variable).") + return {} + payload = { + "access_token": access_token, "git_hash": git_hash, "target": target, "status": status, From 7c702439aea5f5cca48b22b19a0c1cc26131cc12 Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 11:46:27 +0800 Subject: [PATCH 415/462] fix doc problems --- README.md | 11 ++- docs/en/beast_logger.md | 20 ++--- docs/en/installation.md | 12 +++ docs/en/tune_your_first_agent.md | 138 ++++++++++++++++++++++++++++++- docs/en/workflow.md | 14 ++-- docs/index.md | 6 +- mkdocs.yml | 1 - 7 files changed, 177 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index d7d231e5..6da06344 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,14 @@ [![License](https://img.shields.io/badge/License-Apache--2.0-4c1?style=for-the-badge)](LICENSE) [![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=for-the-badge&logo=python&logoColor=white)](docs/en/installation.md#requirements) -**AgentJet (AJet)** is a cutting-edge, user-friendly training framework designed to optimize agents and workflows (built with OpenAI SDK, AgentScope, and even vllm http requests), fine-tuning language model weights behind the scenes. +
      +AgentJet +
      + + +**AgentJet (AJet)** is a cutting-edge, user-friendly training framework designed to optimize agents and workflows (built with OpenAI SDK, AgentScope, Langchain, or just HTTP requests), fine-tuning language model weights behind the scenes. -Simply provide your Agent workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! +Simply provide your agent **workflow**, training **dataset**, and **reward** function, and **AgentJet** will be ready to enhance your agents to their optimal performance! @@ -15,7 +20,7 @@ Simply provide your Agent workflow, training data, and reward function, and we w Let's begin with the simplest example: a math agent with a tool call. -- First, please check out the [installation guide](docs/en/installation.md) to set up the training environment. +- First, please check out the [installation guide](https://doc.agentjet.top/AgentJet/en/installation/) to set up the training environment. - Then, tune your first model using the minimum example. ```python ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' --with-ray diff --git a/docs/en/beast_logger.md b/docs/en/beast_logger.md index d4d6fdef..322306bd 100644 --- a/docs/en/beast_logger.md +++ b/docs/en/beast_logger.md @@ -17,9 +17,9 @@ Here is how to use beast-logger in AgentJet. 4. Run `beast_logger_go` command in the VSCode terminal (or any other software with port-forwarding ability) to start the web log-viewer. Click `http://127.0.0.1:8181` to open it (VSCode will automatically forward this port from server -> your local computer) -
      -image -
      +
      + image +
      5. Fill the **ABSOLUTE** path of the log files and click `submit`. @@ -31,17 +31,17 @@ Here is how to use beast-logger in AgentJet. > > thus, where possible, selects the innermost directory containing the fewest files to read logs faster. -
      -image -
      +
      + image +
      6. Choose entry to display -* Yellow tokens: tokens that are excluded from loss computation. -* Blue tokens: tokens that participant loss computation. -* Hovor your mouse on one of the tokens: show the logprob value of that token. + - Yellow tokens: tokens that are excluded from loss computation. + - Blue tokens: tokens that participant loss computation. + - Hovor your mouse on one of the tokens: show the logprob value of that token.
      -image +image
      diff --git a/docs/en/installation.md b/docs/en/installation.md index a5f16c52..3209a7db 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -109,6 +109,18 @@ AgentJet supports multiple backbones. Currently we have `verl` and `trinity` (re ``` +| Backbone | VeRL | Trinity-RFT | +| -------- |-------- | ------------- | +| Core design | Share-GPU actor-rollout engine (colocate) | Async actor-rollout engine | +| Speed | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | +| Scalability | ⭐⭐ | ⭐⭐⭐⭐ | +| Minimum Required GPU Resource | 1 | 2 | +| Training Stability | ⭐⭐⭐⭐ | ⭐⭐⭐ | +| vLLM Version | 0.10.0 | 0.10.0 | + + + + ## Next Steps diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 7a419296..1fba66bc 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -35,6 +35,11 @@ Launch the training process and track progress. +!!! info "" + Checkout the full code of this example by [clicking here](#full-code) + + + ## Step 1: ✨Define agent Workflow + Reward @@ -195,8 +200,7 @@ Now, we have obtained all materials required to train the agent. ``` - -## Step 6: Debug (Optional) +## Step 3: ✨Debug (Optional) Before full training, you can run some test in debug mode, using raw base model to test whether bug exists. We choose VSCode to debug because it is open-source and fast. @@ -230,7 +234,7 @@ After `.vscode/launch.json` is created, press `F5` to start debugging. (Do not f For more debugging techniques, please refer to [debugging guidelines](../debugging_guide). -## Step 7: Start Training +## Step 4: ✨Start Training After debugging, launch the full training: @@ -245,6 +249,134 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml ``` + +## Full Code {#full-code} + +=== "`math_agent.py` - AgentJet Workflow (After Convertion)" + + ```python title="math_agent.py" + import re + from loguru import logger + from agentscope.message import Msg + from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask + + + def extract_final_answer(result) -> str: + """Extract the final answer from the agent's response.""" + try: + if ( + hasattr(result, "metadata") + and isinstance(result.metadata, dict) + and "result" in result.metadata + ): + return result.metadata["result"] + if hasattr(result, "content"): + if isinstance(result.content, dict) and "result" in result.content: + return result.content["result"] + return str(result.content) + return str(result) + except Exception as e: + logger.warning(f"Extract final answer error: {e}. Raw: {result}") + return str(result) + + + system_prompt = """ + You are an agent specialized in solving math problems with tools. + Please solve the math problem given to you. + You can write and execute Python code to perform calculation or verify your answer. + You should return your final answer within \\boxed{{}}. + """ + + + class MathToolWorkflow(Workflow): # ✨✨ inherit `Workflow` class + name: str = "math_agent_workflow" + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + # run agentscope + query = workflow_task.task.main_query + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", sys_prompt=system_prompt, + model=tuner.as_agentscope_model(), # ✨✨ compared with a normal agentscope agent, here is the difference! + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), max_iters=2, + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg) + final_answer = extract_final_answer(result) + + # compute reward + reference_answer = workflow_task.task.metadata["answer"].split("####")[-1].strip() + match = re.search(r"\\boxed\{([^}]*)\}", final_answer) + if match: is_success = (match.group(1) == reference_answer) + else: is_success = False + return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) + + ``` + +=== "`math_agent.yaml` - Configuration Yaml" + + ```yaml + # ------------------ main configuration ------------------ + ajet: + project_name: example_math_agent + task_reader: + type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` + # effective when `type: huggingface_dat_repo` + huggingface_dat_repo: + dataset_path: 'openai/gsm8k' + training_split: "train" + validation_split: "test" + + task_judge: + # ✨✨✨✨ null, because in this certain case, we write reward function together with workflow + judge_protocol: null + + model: + # ✨✨✨✨ set the model to be trained + path: Qwen/Qwen2.5-7B + + rollout: + user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ write and select workflow + num_repeat: 6 # grpo `n` + tensor_model_parallel_size: 1 # vllm tp + max_response_length_in_one_turn: 1024 + max_model_len: 10000 + + data: + train_batch_size: 100 + max_prompt_length: 3000 + max_response_length: 7000 + + debug: + debug_max_parallel: 1 + debug_first_n_tasks: 1 + + trainer_common: + save_freq: 100 + test_freq: 100 + total_epochs: 100 + logger: swanlab + + # ------------------ do not modify ------------------ + hydra: + searchpath: + - file://ajet/default_config + - file://ajet/default_config/verl + - file://ajet/default_config/trinity + + # ------------------ do not modify ------------------ + defaults: + - verl_default + - trinity_default + - ajet_default + - _self_ + + ``` + ## Next Steps
      diff --git a/docs/en/workflow.md b/docs/en/workflow.md index a366140b..2724017a 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -8,7 +8,13 @@ This tutorial introduces how to define a trainable workflow. - **Simple**: Emphasizes simplicity, ease of use, and readability - **Advanced**: Emphasizes flexibility, controllability, and extensibility -In this article we use AgentScope framework for demonstration. +In this article we use **AgentScope** framework for demonstration. For other frameworks (OpenAI SDK, Langchain, HTTP Requests), please follow the same pattern. + + + +
      +AgentJet +
      ## Simple Practice @@ -92,7 +98,7 @@ Next, use the `tuner` argument, call its `tuner.as_agentscope_model()` method: ### 1. When to Use Advanced Practice -When designing a **multi-agent collaborative** workflow where each agent plays a different **role**, AgentJet provides enhanced training and debugging capabilities. +When designing a **multi-agent collaborative** workflow where each agent plays a different **target_tag**, AgentJet provides enhanced training and debugging capabilities. !!! warning "Multi-Agent Benefits" With a multi-agent setup, you can: @@ -178,11 +184,9 @@ Here's a complete example with multiple agent roles (Werewolves game): players = [] for i, role in enumerate(roles): default_model = OpenAIChatModel( - model_name="/mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen3-235B-A22B-Instruct-2507/", + model_name="Qwen/Qwen3-235B-A22B-Instruct-2507", stream=False, - client_args={"base_url": "http://22.17.52.4:2888/v1"}, api_key="no_api_key", - generate_kwargs={"temperature": 0.01}, ) model_for_this_agent = tuner.as_agentscope_model( agent_name=f"Player{i + 1}", # the name of this agent diff --git a/docs/index.md b/docs/index.md index 7ced0866..3e6acbee 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,7 +11,7 @@ ## 🛩️ Key Features
      - +

      Get Started with Ease

      @@ -52,7 +52,7 @@ accelerating training speed 1.5x ~ 10x.

      - +

      High Resolution Logging

      @@ -61,7 +61,7 @@ Log token-level rollout details, capturing token IDs, token loss masks, and token log probabilities with web UI display. This Support workflow development, agent diagnostics, and facilitate research on advanced LLM algorithm studies.

      - +

      Any Training Engine

      diff --git a/mkdocs.yml b/mkdocs.yml index ee12fe5f..ff984b09 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -117,7 +117,6 @@ markdown_extensions: extra_css: - https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap - - stylesheets/font.css - stylesheets/feature-cards.css - stylesheets/tabbed-code.css - stylesheets/readability-enhancements.css From 8af0644b6bc364baf8d17422ca853bb687881c27 Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 12:17:11 +0800 Subject: [PATCH 416/462] add logo --- README.md | 2 +- docs/en/configuration.md | 109 +------------------------------ docs/en/installation.md | 5 +- docs/en/intro.md | 2 +- docs/en/quickstart.md | 47 +++++-------- docs/en/tune_your_first_agent.md | 30 ++++++++- docs/index.md | 2 +- 7 files changed, 54 insertions(+), 143 deletions(-) diff --git a/README.md b/README.md index 6da06344..45918e1a 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Let's begin with the simplest example: a math agent with a tool call. - First, please check out the [installation guide](https://doc.agentjet.top/AgentJet/en/installation/) to set up the training environment. - Then, tune your first model using the minimum example. ```python - ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' --with-ray + ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' ``` diff --git a/docs/en/configuration.md b/docs/en/configuration.md index 1a963004..16c4db5e 100644 --- a/docs/en/configuration.md +++ b/docs/en/configuration.md @@ -2,7 +2,7 @@ This page provides a detailed description of the configuration files for AgentJet. ---- + ## Overview @@ -31,7 +31,7 @@ At a high level, a typical config contains a single root section `ajet`, which i
      ---- + ## Model Configuration @@ -58,7 +58,6 @@ export DASHSCOPE_API_KEY='sk-xxxxxx|sk-yyyyyy' export DASHSCOPE_API_KEY_BACKUP='sk-zzzzzz' ``` ---- ## Data Configuration @@ -123,7 +122,6 @@ ajet: | `customized_protocol` | Use a custom Python class for scoring | | `rubrics_auto_grader` | Use LLM-based automatic grading | ---- ## Training Configuration @@ -213,7 +211,6 @@ ajet: | `use_kl_loss` | Include KL divergence in loss | | `kl_loss_coef` | KL loss coefficient | ---- ## Debug Mode @@ -234,7 +231,6 @@ ajet: - **Fixing randomness**: `debug_vllm_seed` helps reproduce issues - **Reduced parallelism**: Easier to debug with smaller concurrency ---- ## Logging & Monitoring @@ -262,108 +258,7 @@ All experiment outputs are saved in `./launcher_record/{experiment_name}`: | **Metrics** | Training metrics (depends on logger) | | **Checkpoint** | Model checkpoints | ---- - -## Full Configuration Example - -??? example "Complete Configuration Template" - ```yaml title="config.yaml" - ajet: - project_name: "ajet_default_project" - experiment_name: "read_yaml_name" - experiment_dir: "auto" - backbone: debug - - model: - path: /path/to/model/Qwen2.5-14B-Instruct - - data: - max_prompt_length: 3000 - max_response_length: 15000 - train_batch_size: 32 - - rollout: - user_workflow: tutorial.example_appworld.appworld->ExampleAgentScopeWorkflow - force_disable_toolcalls: False - max_env_worker: 128 - gamma: 1.0 - compute_madness_checklist: - - "nonsense" - agent_madness_termination: True - agent_madness_reward: -1.0 - max_response_length_in_one_turn: 4096 - max_model_len: 18000 - multi_turn: - max_sample_per_task: 30 - max_steps: 30 - expected_steps: 1 - tensor_model_parallel_size: 1 - n_vllm_engine: 2 - max_num_seqs: 10 - name: vllm - num_repeat: 4 - temperature: 0.9 - top_p: 1.0 - val_kwargs: - temperature: 0.0 - top_k: -1 - top_p: 1.0 - do_sample: False - num_repeat: 1 - - task_reader: - type: env_service - env_service: - env_type: "appworld" - env_url: "http://127.0.0.1:8080" - env_action_preference: code - training_split: train - validation_split: dev - - task_judge: - judge_type: customized_protocol - judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - - debug: - debug_max_parallel: 16 - debug_first_n_tasks: 2 - debug_vllm_port: 18000 - debug_vllm_seed: 12345 - debug_tensor_parallel_size: 4 - - trainer_common: - val_before_train: False - val_pass_n: 4 - save_freq: 20 - test_freq: 20 - total_epochs: 50 - nnodes: 1 - n_gpus_per_node: 8 - logger: swanlab - algorithm: - adv_estimator: grpo - use_kl_in_reward: False - mini_batch_num: 1 - fsdp_config: - param_offload: True - optimizer_offload: True - optim: - lr: 1e-6 - use_kl_loss: True - kl_loss_coef: 0.002 - kl_loss_type: low_var_kl - ulysses_sequence_parallel_size: 1 - checkpoint_base_dir: ./saved_checkpoints - - context_tracker: - context_tracker_type: "linear" - alien_llm_model: qwen3-235b-a22b-instruct-2507 - alien_llm_response_length: 512 - ``` ---- ## Next Steps diff --git a/docs/en/installation.md b/docs/en/installation.md index 3209a7db..db145397 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -9,9 +9,10 @@ This document provides a step-by-step guide to installing AgentJet. ## Prerequisites -| Requirement | Version | +| Requirement | Detail | |-------------|---------| -| **Python** | 3.10 | +| **Python** | 3.10 | +| Package Management | `uv` or `conda` | ## Install from Source diff --git a/docs/en/intro.md b/docs/en/intro.md index afa6feb0..7ec3e4a6 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -12,7 +12,7 @@ AgentJet aims to build a state-of-the-art agent tuning platform for both develop - **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. -- **Flexible and Fast**. AgentJet supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index 74a206f3..5e494472 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -1,39 +1,23 @@ # Quick Start -AgentJet provides a complete feature set for tuning agents. You can try starting training an agent right away: + +## 1. Testing Pre-define Demo + +AgentJet provides a complete feature set for tuning agents. You can try starting training an agent right away by running a demo: ```bash ajet --conf tutorial/example_math_agent/math_agent.yaml ``` ---- -## Minimum Example +## 2. Minimum Example Let's begin with the simplest example: a math agent with a tool call. -
      -
      Getting Started Flow
      - -
      -
        -
      1. Set up Environment - -Check out the [installation guide](./installation.md) to set up the training environment.
      2. -
      3. Define Your Workflow - -Write an Agent class (e.g., `MathToolWorkflow`) that inherits from the base Workflow class.
      4. -
      5. Configure and Run - -Use the `AgentJetJob` API to configure and start training.
      6. -
      -
      -
      - -### Code Example - ```python title="train_math_agent.py" from ajet import AgentJetJob + +# refer to `https://doc.agentjet.top/AgentJet/en/tune_your_first_agent/` on how to write your own workflow from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "YOUR_MODEL_PATH" @@ -57,9 +41,17 @@ tuned_model = job.tune() ajet --conf ./saved_experiments/math.yaml ``` ---- -## Explore Examples +## 3. Compare with Community Training Curves + +
      + + + + +## 4. Explore Example Gallery Explore our rich library of examples to kickstart your journey: @@ -72,11 +64,8 @@ Explore our rich library of examples to kickstart your journey:

      Frozen Lake

      Solving a frozen lake walking puzzle.

      ---- - ---- -## Next Steps +## 5. Next Steps

      Tune Your First Agent

      Complete step-by-step guide to building your own agent from scratch.

      diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 1fba66bc..69022206 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -51,7 +51,7 @@ tutorial/example_math_agent └── math_agent.yaml ``` -Next, define your workflow (or convert an existing workflow). Here we use AgentScope to implement this agent. You can toggle two code before and after convertion to see the difference. If you prefer langchain or openai sdk, [please refer to this article](../agent_framework_support). +Next, define your workflow (or convert an existing workflow). Here we use AgentScope to implement this agent. You can toggle two code before and after convertion to see the difference. If you prefer langchain or openai sdk, [please refer to this article](agent_framework_support.md). === "`math_agent.py` - AgentJet Workflow (After Convertion)" @@ -199,6 +199,32 @@ Now, we have obtained all materials required to train the agent. ``` +### Configuration Parameters + +| Category | Parameter | Description | Example Value | +|----------|-----------|-------------|---------------| +| **Project** | `project_name` | Name of the training project | `example_math_agent` | +| **Task Reader** | `type` | Type of data source to read tasks from | `huggingface_dat_repo` (options: `env_service`, `dataset_file`, `huggingface_dat_repo`) | +| | `dataset_path` | Path or identifier of the dataset | `openai/gsm8k` | +| | `training_split` | Dataset split used for training | `train` | +| | `validation_split` | Dataset split used for validation/testing | `test` | +| **Model** | `path` | Path or identifier of the model to be trained | `Qwen/Qwen2.5-7B` | +| **Rollout** | `user_workflow` | Python module path to the workflow class | `tutorial.example_math_agent.math_agent->ExampleMathLearn` | +| | `num_repeat` | Number of rollout repeats per task (GRPO `n` parameter) | `6` | +| | `tensor_model_parallel_size` | vLLM tensor parallelism size | `1` | +| | `max_response_length_in_one_turn` | Maximum token length for a single agent response | `1024` | +| | `max_model_len` | Maximum total context length for the model | `10000` | +| **Data** | `train_batch_size` | Number of tasks per training batch | `100` | +| | `max_prompt_length` | Maximum token length for input prompts | `3000` | +| | `max_response_length` | Maximum token length for model responses | `7000` | +| **Debug** | `debug_max_parallel` | Maximum parallel workers in debug mode | `1` | +| | `debug_first_n_tasks` | Number of tasks to process in debug mode | `1` | +| **Trainer** | `save_freq` | Frequency (in steps) to save model checkpoints | `100` | +| | `test_freq` | Frequency (in steps) to run validation | `100` | +| | `total_epochs` | Total number of training epochs | `100` | +| | `logger` | Logging backend for experiment tracking | `swanlab` | +| **Task Judge** | `judge_protocol` | Protocol for judging task completion | `null` (reward is computed in workflow) | + ## Step 3: ✨Debug (Optional) @@ -231,7 +257,7 @@ We choose VSCode to debug because it is open-source and fast. After `.vscode/launch.json` is created, press `F5` to start debugging. (Do not forget to configure python venv path in VSCode.) -For more debugging techniques, please refer to [debugging guidelines](../debugging_guide). +For more debugging techniques, please refer to [debugging guidelines](debugging_guide.md). ## Step 4: ✨Start Training diff --git a/docs/index.md b/docs/index.md index 3e6acbee..19f4b3d1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -82,7 +82,7 @@
      -We recommend using `uv` for dependency management. [Click here](./installation/) for details and other training backbone (e.g. Trinity-RFT) options. +We recommend using `uv` for dependency management. [Click here](en/installation.md) for details and other training backbone (e.g. Trinity-RFT) options. - Clone the Repository: ```bash From 6d4849a40ef0c04808a590ca4cba7d7e41232a78 Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 13:41:42 +0800 Subject: [PATCH 417/462] update docs --- README.md | 63 ++++++++----------- docs/en/example_math_agent.md | 112 ++++++++++++++++++++-------------- docs/en/task_judger.md | 23 +++---- tutorial/README.md | 11 ++++ 4 files changed, 115 insertions(+), 94 deletions(-) create mode 100644 tutorial/README.md diff --git a/README.md b/README.md index 45918e1a..be3903f6 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # AgentJet [![Benchmarking](https://img.shields.io/badge/Benchmarking-0078D4?style=for-the-badge&logo=github)](https://benchmark.agent-matrix.com/) -[![Docs](https://img.shields.io/badge/Docs-Read%20the%20Guide-0A7ECC?style=for-the-badge&logo=readthedocs&logoColor=white)](docs/en/installation.md) +[![Docs](https://img.shields.io/badge/Docs-Read%20the%20Guide-0A7ECC?style=for-the-badge&logo=readthedocs&logoColor=white)](https://doc.agentjet.top/AgentJet) [![License](https://img.shields.io/badge/License-Apache--2.0-4c1?style=for-the-badge)](LICENSE) -[![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=for-the-badge&logo=python&logoColor=white)](docs/en/installation.md#requirements) +[![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://doc.agentjet.top/AgentJet/en/installation#requirements)
      AgentJet @@ -24,6 +24,9 @@ Let's begin with the simplest example: a math agent with a tool call. - Then, tune your first model using the minimum example. ```python ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' + + # change to --backbone='trinity' if you want to switch to trinity training engine; + # or --backbone='debug' if you want to debug with only vLLM ``` @@ -34,7 +37,7 @@ We aim to build a easy-to-learn Agent tuner that unlock more possibilities for a - **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. -- **Flexible and Fast**. AgentJet supports [multi-agent workflows](docs/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](https://doc.agentjet.top/AgentJet/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: @@ -49,42 +52,26 @@ For advanced researchers, AgentJet also provides high-resolution logging and deb #### Installation -We recommend using `uv` for dependency management. - -1. **Clone the Repository**: -```bash -git clone https://github.com/modelscope/AgentJet.git -cd AgentJet -``` - - -2. **Set up Environment**: -```bash -uv venv --python=3.10.16 && source .venv/bin/activate -uv pip install -e .[trinity] -# Note: flash-attn must be installed after other dependencies -uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir -``` - +- **Click here to read the** [**installation guide**](https://doc.agentjet.top/AgentJet/en/installation/). #### Run Training -You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](docs/en/example_math_agent.md) as an example: +- You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](https://doc.agentjet.top/AgentJet/en/example_math_agent/) as an example: -```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml -``` + ```bash + ajet --conf tutorial/example_math_agent/math_agent.yaml + ``` #### Example Library Explore our rich library of examples to kickstart your journey: -- 🔢 [**Training a math agent that can write python code**](docs/en/example_math_agent.md). -- 📱 [**Creating an AppWorld agent using AgentScope and training it**](docs/en/example_app_world.md). -- 🐺 [**Developing Werewolves RPG agents and training them**](docs/en/example_werewolves.md). -- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](docs/en/example_learning_to_ask.md). -- 🎴 [**Writing a countdown game using AgentScope and solving it**](docs/en/example_countdown.md). -- 🚶 [**Solving a frozen lake walking puzzle using AgentJet**](docs/en/example_frozenlake.md). +- 🔢 [**Training a math agent that can write python code**](https://doc.agentjet.top/AgentJet/en/example_math_agent). +- 📱 [**Creating an AppWorld agent using AgentScope and training it**](https://doc.agentjet.top/AgentJet/en/example_app_world). +- 🐺 [**Developing Werewolves RPG agents and training them**](https://doc.agentjet.top/AgentJet/en/example_werewolves). +- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](https://doc.agentjet.top/AgentJet/en/example_learning_to_ask). +- 🎴 [**Writing a countdown game using AgentScope and solving it**](https://doc.agentjet.top/AgentJet/en/example_countdown). +- 🚶 [**Solving a frozen lake walking puzzle using AgentJet**](https://doc.agentjet.top/AgentJet/en/example_frozenlake). --- @@ -102,9 +89,9 @@ AgentJet makes agent fine-tuning straightforward by separating the developer int To optimize an agent, you provide three core inputs: -* [**Trainable Workflow**](docs/en/workflow.md): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. -* [**Task Reader**](docs/en/data_pipeline.md): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. -* [**Task Judger**](docs/en/task_judger.md): Evaluates agent outputs and assigns rewards to guide training. +* [**Trainable Workflow**](https://doc.agentjet.top/AgentJet/en/workflow): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. +* [**Task Reader**](https://doc.agentjet.top/AgentJet/en/data_pipeline): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. +* [**Task Judger**](https://doc.agentjet.top/AgentJet/en/task_judger): Evaluates agent outputs and assigns rewards to guide training. #### 2. Internal System Architecture @@ -118,14 +105,14 @@ The internal system orchestrates several specialized modules to handle the compl * **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **1.5x to 10x**. ---- + ### 🚦 Navigation -* 📖 **Tutorials**: From [Installation](docs/en/installation.md) to [Tuning your first agent](docs/en/tutorial.md) — the essential path for beginners. -* 🛠️ **Core Components**: Define your [Trainable Workflow](docs/en/workflow.md) and manage [Data](docs/en/data_pipeline.md) and [Reward](docs/en/tune_your_first_agent.md). -* 💡 **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](docs/en/example_math_agent.md), [Werewolves game](docs/en/example_werewolves.md) and [Learning to ask task](docs/en/example_learning_to_ask.md). -* ⚙️ **Deep Dive**: Master advanced [Configuration](docs/en/configuration.md). +* 📖 **Tutorials**: From [Installation](https://doc.agentjet.top/AgentJet/en/installation) to [Tuning your first agent](https://doc.agentjet.top/AgentJet/en/tune_your_first_agent) — the essential path for beginners. +* 🛠️ **Core Components**: Define your [Trainable Workflow](https://doc.agentjet.top/AgentJet/en/workflow) and manage [Data](https://doc.agentjet.top/AgentJet/en/data_pipeline) and [Reward](https://doc.agentjet.top/AgentJet/en/task_judger). +* 💡 **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](https://doc.agentjet.top/AgentJet/en/example_math_agent), [Werewolves game](https://doc.agentjet.top/AgentJet/en/example_werewolves) and [Learning to ask task](https://doc.agentjet.top/AgentJet/en/example_learning_to_ask). +* ⚙️ **Deep Dive**: Master advanced [Configuration](https://doc.agentjet.top/AgentJet/en/configuration). ## 🗺️ Roadmap diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index b2721a6e..b325c45d 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -2,24 +2,28 @@ Train a **tool-using Math Agent** (ReAct + Python executor) to solve GSM8K-style math problems. Rewards come from a **judge** that checks final-answer correctness. ---- ## Overview -
      -

      In Math Agent, each training sample is a math word problem (e.g., GSM8K). The agent learns to reason step by step (ReAct-style), call a Python tool when computation is needed, and produce a final answer that matches the reference. -

      -
      -This tutorial is organized in two steps: -1. **Run it**: Download the dataset and start training with the default YAML config -2. **Understand & customize**: Read the workflow and the judge/reward logic +This tutorial is organized into the following sections: + +- [**Run this tutorial**: Download the dataset and start training with the default YAML config.](#quick-start) +- [**Understand & customize**: Read the workflow and the judge/reward logic.](#explain) +- [**Training Curve**: Compare the training curlve.](#culve) + + + + + + + ---- -## Quick Start + +## Quick Start {#quick-start} ### Prepare Dataset @@ -71,11 +75,21 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' } ``` ---- -## Understanding the Training Pipeline -### What Happens Each Step + + + + + + + + + + +## Understanding the Training Pipeline {#explain} + +### Pipeline Abstraction
      Training Step Flow
      @@ -85,12 +99,12 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl'
    1. Load one problem Load a math problem from the dataset via `task_reader`.
    2. -
    3. Run the AgentScope workflow +
    4. Run the Workflow -Build the prompt, let the ReAct agent call Python tools, and extract the final answer.
    5. -
    6. Register info for evaluation +Build the prompt, let the ReActAgent call Python tools, and extract the final answer.
    7. +
    8. Return result as `WorkflowOutput` -Return `WorkflowOutput(reward=None, metadata={"final_answer": final_answer})`.
    9. +Return `WorkflowOutput(reward=None, metadata={"final_answer": final_answer})`. (reward=None because we want to compute reward outside the workflow)
    10. Run the judge Compare `final_answer` with reference, compute `raw_reward` and `is_success`.
    11. @@ -98,31 +112,6 @@ Compare `final_answer` with reference, compute `raw_reward` and `is_success`.
      -### YAML Configuration - -Most wiring happens in `tutorial/example_math_agent/math_agent.yaml`: - -```yaml title="math_agent.yaml" -ajet: - task_reader: - type: huggingface_dat_repo # also supports: dataset_file / env_service - - rollout: - user_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn - - task_judge: - judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge - - model: - path: YOUR_MODEL_PATH -``` - -| Field | Description | -|-------|-------------| -| `task_reader` | Where tasks come from | -| `user_workflow` | Which workflow runs per sample | -| `judge_protocol` | Which judge computes rewards | -| `model.path` | Pretrained model to fine-tune | ### Code Walkthrough @@ -150,7 +139,11 @@ return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` !!! warning "Important" - Always provide the final answer via `WorkflowOutput.metadata` so the judge can score it. + - User should put all elements necessary for reward computation in `WorkflowOutput.metadata`, + so the judge can use them. + - In this specific case, `final_answer` is that key element. + + ### Reward Computation @@ -168,9 +161,38 @@ The judge receives: - Behavior penalty (tool called but no `print`) - Keep answer correctness as the primary signal ---- -## Results +### YAML Configuration + +Most wiring happens in `tutorial/example_math_agent/math_agent.yaml`: + +```yaml title="math_agent.yaml" +ajet: + task_reader: + type: huggingface_dat_repo # also supports: dataset_file / env_service + + rollout: + user_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn + + task_judge: + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge + + model: + path: YOUR_MODEL_PATH +``` + +| Field | Description | +|-------|-------------| +| `task_reader` | Where tasks come from | +| `user_workflow` | Which workflow runs per sample | +| `judge_protocol` | Which judge computes rewards | +| `model.path` | Pretrained model to fine-tune | + + + + + +## Results {#culve} ### Training Curve diff --git a/docs/en/task_judger.md b/docs/en/task_judger.md index bdca6af1..0b0df367 100644 --- a/docs/en/task_judger.md +++ b/docs/en/task_judger.md @@ -1,11 +1,19 @@ # Task Judger -!!! warning "" - Task judger will be **disabled** automatically when the user-defined workflow returned an effective `WorkflowOutput.reward` and `WorkflowOutput.reward != None` - - Task Judger evaluates agent outputs and assigns rewards during training. This page covers built-in judgers for common scenarios and how to create custom judgers for specific evaluation needs. +!!! warning "When to use the task judger" + - **Is task judger necessary for all tasks? No**: + - There are two options to generate reward: + - Compute reward **inside** the user-defined workflow (`WorkflowOutput.reward is not None`) + - Compute reward **outside** the user-defined workflow (`WorkflowOutput.reward is None`) + - **Task judger** is how AgentJet handles **out-of-workflow** reward computation. + - Task judger will be **Disabled and Ignored** when the user-defined workflow returned an effective `WorkflowOutput.reward` and `WorkflowOutput.reward != None` + - Task judger will be **Enabled** when the user-defined workflow returned `WorkflowOutput.reward = None`. + - **When to use the task judger**: + - When the user plan to **re-used** the reward function in multiple other workflows in the future. + - When the user want to **decouple** rollout and reward computation logic. + - When the user want to use our [**OpenJudge**](https://github.com/modelscope/OpenJudge) integration to generate [Auto Rubrics reward](https://modelscope.github.io/OpenJudge/building_graders/generate_rubrics_as_graders/). ## Overview @@ -117,7 +125,6 @@ Delegates evaluation to an external environment service, useful for complex inte !!! tip "When to use" - Tasks with external simulators (e.g., AppWorld) - - Complex state-based evaluation - Interactive environments with built-in evaluators ```yaml title="config.yaml" @@ -127,12 +134,6 @@ ajet: judge_protocol: ajet.task_judge.env_service_as_judge->EnvServiceJudge ``` -!!! note "How it works" - 1. Calls `workflow_task.gym_env.evaluate()` to get a score from the environment - 2. Converts the score to a normalized reward: - - Success (score ≥ 1): `1.0 + score * 0.5` - - Failure (score < 1): `0.0 + score * 0.5` - ## Creating Custom Task Judgers diff --git a/tutorial/README.md b/tutorial/README.md new file mode 100644 index 00000000..b3f3a8e6 --- /dev/null +++ b/tutorial/README.md @@ -0,0 +1,11 @@ +#### Example Library + +Explore our rich library of examples to kickstart your journey. + +- Example Documentation: + + https://doc.agentjet.top/AgentJet/#example-library + +- Example Benchmark Tracking System: + + https://benchmark.agent-matrix.com/examples \ No newline at end of file From 6722e2d1f57887149284a8192c374575cbffcde3 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 12 Jan 2026 14:18:10 +0800 Subject: [PATCH 418/462] update README --- README.md | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index be3903f6..3bc97f0d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Simply provide your agent **workflow**, training **dataset**, and **reward** fun -## 💡 Minimum Example +## 🛩️ Minimum Example Let's begin with the simplest example: a math agent with a tool call. @@ -30,7 +30,7 @@ Let's begin with the simplest example: a math agent with a tool call. ``` -## Features +## 🛩️ Features We aim to build a easy-to-learn Agent tuner that unlock more possibilities for agent developers: @@ -48,7 +48,7 @@ For advanced researchers, AgentJet also provides high-resolution logging and deb --- -### 🚀 Quick Start +### 🛩️ Quick Start #### Installation @@ -76,7 +76,7 @@ Explore our rich library of examples to kickstart your journey: --- -### 🧩 Core Concepts +### 🛩️ Core Concepts AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. @@ -107,23 +107,24 @@ The internal system orchestrates several specialized modules to handle the compl -### 🚦 Navigation +### 🛩️ Navigation -* 📖 **Tutorials**: From [Installation](https://doc.agentjet.top/AgentJet/en/installation) to [Tuning your first agent](https://doc.agentjet.top/AgentJet/en/tune_your_first_agent) — the essential path for beginners. -* 🛠️ **Core Components**: Define your [Trainable Workflow](https://doc.agentjet.top/AgentJet/en/workflow) and manage [Data](https://doc.agentjet.top/AgentJet/en/data_pipeline) and [Reward](https://doc.agentjet.top/AgentJet/en/task_judger). -* 💡 **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](https://doc.agentjet.top/AgentJet/en/example_math_agent), [Werewolves game](https://doc.agentjet.top/AgentJet/en/example_werewolves) and [Learning to ask task](https://doc.agentjet.top/AgentJet/en/example_learning_to_ask). -* ⚙️ **Deep Dive**: Master advanced [Configuration](https://doc.agentjet.top/AgentJet/en/configuration). +* **Tutorials**: From [Installation](https://doc.agentjet.top/AgentJet/en/installation) to [Tuning your first agent](https://doc.agentjet.top/AgentJet/en/tune_your_first_agent) — the essential path for beginners. +* **Core Components**: Define your [Trainable Workflow](https://doc.agentjet.top/AgentJet/en/workflow) and manage [Data](https://doc.agentjet.top/AgentJet/en/data_pipeline) and [Reward](https://doc.agentjet.top/AgentJet/en/task_judger). +* **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](https://doc.agentjet.top/AgentJet/en/example_math_agent), [Werewolves game](https://doc.agentjet.top/AgentJet/en/example_werewolves) and [Learning to ask task](https://doc.agentjet.top/AgentJet/en/example_learning_to_ask). +* **Deep Dive**: Master advanced [Configuration](https://doc.agentjet.top/AgentJet/en/configuration). -## 🗺️ Roadmap +## 🛩️ Roadmap AgentJet is a constantly evolving project. We are planning to add the following features in the near future. -- [ ] Advanced LLM-based multi-agent reinforcement learning. -- [ ] Training dataset generation from few-shot samples. -- [ ] Prompt tuning. -- [ ] Multi-modal training support. -- [ ] Cross-process Tuner wrapper to pass though process forking. -- [ ] Providing training → user feedback → data augmentation → retraining data flywheel example. -- [ ] Optimize configurations for long-context adaptation on smaller GPUs. -- [ ] Add LoRA training examples. -- [ ] Covering LangGraph and AutoGen frameworks. \ No newline at end of file +| Category | Feature | Status | +| :--- | :--- | :--- | +| **Examples** | Covering LangGraph and AutoGen frameworks | Done & Verifying | +| **Examples** | Add LoRA training examples | Todo | +| **Infra** | Cross-process Tuner wrapper to pass though process forking | Done & Verifying | +| **Infra** | Optimize configurations for long-context adaptation on smaller GPUs | In Progress | +| **Capability** | Prompt tuning | In Progress | +| **Capability** | Multi-modal training support | Todo | +| **Capability** | MARL Credit assignment | Todo | +| **Capability** | Training dataset generation from few-shot samples | Done & Verifying | From c00630d633022327d7aba65fe58a67b531c52e12 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 12 Jan 2026 15:16:24 +0800 Subject: [PATCH 419/462] fix import --- docs/en/tune_your_first_agent.md | 5 ++++- tutorial/example_math_agent/math_agent.yaml | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 69022206..9c089537 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -284,6 +284,10 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml import re from loguru import logger from agentscope.message import Msg + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask @@ -340,7 +344,6 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml if match: is_success = (match.group(1) == reference_answer) else: is_success = False return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) - ``` === "`math_agent.yaml` - Configuration Yaml" diff --git a/tutorial/example_math_agent/math_agent.yaml b/tutorial/example_math_agent/math_agent.yaml index f02189d6..59f7889a 100644 --- a/tutorial/example_math_agent/math_agent.yaml +++ b/tutorial/example_math_agent/math_agent.yaml @@ -19,6 +19,11 @@ ajet: rollout: user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ write and select workflow + # user_workflow: "tutorial.example_math_agent.math_agent_langchain->ExampleMathLearn" # ✨if you prefer langchain version + # user_workflow: "tutorial/example_math_agent/math_agent_oai_sdk.py->ExampleMathLearn_Simple_NoToolCall" # ✨if you prefer openai sdk version without toolcall + # user_workflow: "tutorial/example_math_agent/math_agent_oai_sdk.py->ExampleMathLearn" # ✨if you prefer openai sdk version with toolcall + # user_workflow: "tutorial/example_math_agent/math_agent_raw_http.py->ExampleMathLearn" # ✨if you do not want to use any agentic framwork at all + # user_workflow: "tutorial/example_math_agent/math_agent_simplify.py->MathToolWorkflow" # ✨if you prefer to compute reward inside workflow temperature: 1.0 max_env_worker: 64 num_repeat: 6 From d6e47b505a19afe863560bd4b1442684d096d472 Mon Sep 17 00:00:00 2001 From: qingxu fu Date: Mon, 12 Jan 2026 10:40:56 +0800 Subject: [PATCH 420/462] langchain doc --- docs/en/example_learning_to_ask.md | 1 - docs/en/example_math_agent.md | 88 +++++++++++++++++++++++------- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index d747860b..988057a3 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -61,7 +61,6 @@ If the results are incorrect, the quickest troubleshooting points include: wheth
    ---- ### 3. Understand diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index b325c45d..0620cd0b 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -117,26 +117,74 @@ Compare `final_answer` with reference, compute `raw_reward` and `is_success`. WorkflowOutput: # type: ignore + # tuner to api key + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key + + from langchain_openai import ChatOpenAI + llm=ChatOpenAI( + base_url=base_url, + api_key=lambda:api_key, + ) + agent=create_agent( + model=llm, + system_prompt=self.system_prompt, + ) + + # take out query + query = workflow_task.task.main_query + + response = agent.invoke({ + "messages": [ + { + "role": "user", + "content": query + } + ], + }) + + final_answer = response['messages'][-1].content + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + ``` !!! warning "Important" - User should put all elements necessary for reward computation in `WorkflowOutput.metadata`, From aa511a7be550174688539af9e8a9114daa4774fc Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 12 Jan 2026 11:27:54 +0800 Subject: [PATCH 421/462] docs: add implementation examples for AgentScope, OpenAI, raw HTTP, and langchain in math agent and learn2ask tutorials --- docs/en/example_learning_to_ask.md | 62 ++++++++ docs/en/example_math_agent.md | 247 ++++++++++++++++++++++++----- 2 files changed, 267 insertions(+), 42 deletions(-) diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index 988057a3..ea3c35ab 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -99,6 +99,68 @@ At the code level, everything is implemented in `tutorial/example_learn2ask/lear * `ExampleLearn2Ask` defines the workflow: how the dialogue context is converted into the agent’s prompt/input, and what output format is expected (one follow-up question, optionally with choices). * `reward_fn` defines how to convert the judge’s feedback into a scalar reward used for training. +We provide two implmentations of the agent based on AgentScope and langchain: + +=== "AgentScope" + + ```python + # create the agent + self.agent = ReActAgent( + name="math_react_agent", + sys_prompt=system_prompt, + model=tuner.as_agentscope_model(), + formatter=DashScopeChatFormatter(), + toolkit=None, + memory=InMemoryMemory(), + max_iters=1, + ) + self.agent.set_console_output_enabled(False) + + # convert the messages to agent scope format and send to the agent + msg = [ + # Msg("system", system_prompt, role="system"), + *[Msg(name=x["role"], content=x["content"], role=x["role"]) for x in messages] + ] + result = await self.agent.reply(msg) + if isinstance(result.content, str): + response = result.content + elif isinstance(result.content, list): + response = result.content[0]["text"] # type: ignore + else: + raise NotImplementedError(f"do not know how to handle {type(result.content)}") + reward = await reward_fn_with_semaphore(msg, response, truth_action, truth_info) + return WorkflowOutput(reward=reward) + ``` + +=== "Langchain" + + ```python + # get the trainable llm + llm_info=tuner.as_oai_baseurl_apikey() + + # create the langchain agent + llm=ChatOpenAI( + base_url=llm_info.base_url, + api_key=lambda:llm_info.api_key, + ) + agent=create_agent( + model=llm, + system_prompt=system_prompt, + ) + + # build messages and send to the agent + msg=[ + {"role": x["role"], "content": x["content"]} for x in messages + ] + result = agent.invoke({ + "messages": msg, # type: ignore + }) + + response = result["messages"][-1].content + reward = await reward_fn_with_semaphore(msg, response, truth_action, truth_info) + return WorkflowOutput(reward=reward) + ``` + #### 3.4 Reward `llm_reward` is the LLM-as-a-judge called inside `reward_fn` to score the model output. The evaluation follows these rules: diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index 0620cd0b..ba941587 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -112,6 +112,85 @@ Compare `final_answer` with reference, compute `raw_reward` and `is_success`. +### YAML Configuration + +Most wiring happens in `tutorial/example_math_agent/math_agent.yaml`: + +=== "AgentScope" + + ```yaml title="math_agent.yaml" + ajet: + task_reader: + type: huggingface_dat_repo # also supports: dataset_file / env_service + + rollout: + user_workflow: tutorial.example_math_agent.math_agent->ExampleMathLearn + + task_judge: + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge + + model: + path: YOUR_MODEL_PATH + ``` + +=== "OpenAI" + + ```yaml title="math_agent.yaml" + ajet: + task_reader: + type: huggingface_dat_repo # also supports: dataset_file / env_service + + rollout: + user_workflow: tutorial.example_math_agent.math_agent_oai_sdk->ExampleMathLearn + + task_judge: + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge + + model: + path: YOUR_MODEL_PATH + ``` + +=== "Raw HTTP" + + ```yaml title="math_agent.yaml" + ajet: + task_reader: + type: huggingface_dat_repo # also supports: dataset_file / env_service + + rollout: + user_workflow: tutorial.example_math_agent.math_agent_raw_http->ExampleMathLearn + + task_judge: + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge + + model: + path: YOUR_MODEL_PATH + ``` + +=== "langchain" + + ```yaml title="math_agent.yaml" + ajet: + task_reader: + type: huggingface_dat_repo # also supports: dataset_file / env_service + + rollout: + user_workflow: tutorial.example_math_agent.math_agent_langchain->ExampleMathLearn + + task_judge: + judge_protocol: tutorial.example_math_agent.math_answer_as_judge->MathAnswerAndLlmAsJudge + + model: + path: YOUR_MODEL_PATH + ``` + + +| Field | Description | +|-------|-------------| +| `task_reader` | Where tasks come from | +| `user_workflow` | Which workflow runs per sample | +| `judge_protocol` | Which judge computes rewards | +| `model.path` | Pretrained model to fine-tune | ### Code Walkthrough @@ -140,50 +219,134 @@ Compare `final_answer` with reference, compute `raw_reward` and `is_success`. WorkflowOutput: # type: ignore - # tuner to api key - url_and_apikey = tuner.as_oai_baseurl_apikey() - base_url = url_and_apikey.base_url - api_key = url_and_apikey.api_key - - from langchain_openai import ChatOpenAI - llm=ChatOpenAI( - base_url=base_url, - api_key=lambda:api_key, - ) - agent=create_agent( - model=llm, - system_prompt=self.system_prompt, - ) - - # take out query - query = workflow_task.task.main_query - - response = agent.invoke({ - "messages": [ - { - "role": "user", - "content": query - } - ], - }) - - final_answer = response['messages'][-1].content - return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) + ```python title="langchain" + # tuner to api key + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key + + from langchain_openai import ChatOpenAI + llm=ChatOpenAI( + base_url=base_url, + api_key=lambda:api_key, + ) + agent=create_agent( + model=llm, + system_prompt=self.system_prompt, + ) + + # take out query + query = workflow_task.task.main_query + + response = agent.invoke({ + "messages": [ + { + "role": "user", + "content": query + } + ], + }) + + final_answer = response['messages'][-1].content + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) ``` !!! warning "Important" From 7d5e623ade53ade4200ace640300a365fa0894a8 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 12 Jan 2026 15:33:22 +0800 Subject: [PATCH 422/462] change print to logger.log --- ajet/backbone/main_verl.py | 5 +- ajet/backbone/main_vllm.py | 9 +- ajet/backbone/trainer_verl.py | 8 +- ajet/context_tracker/basic_tracker.py | 6 +- ajet/default_config/ajet_default.yaml | 2 +- ajet/schema/convertion.py | 92 +------------- ajet/schema/trajectory.py | 8 +- ajet/task_reader/tracing_reader/__init__.py | 1 - ajet/task_rollout/dashscope_llm_bridge.py | 2 +- ajet/tuner.py | 1 + .../experimental/as_oai_model_client.py | 5 +- ajet/utils/config_computer.py | 117 +++++++++--------- ajet/utils/dynamic_import.py | 1 - scripts/deploy_model.py | 4 +- 14 files changed, 86 insertions(+), 175 deletions(-) diff --git a/ajet/backbone/main_verl.py b/ajet/backbone/main_verl.py index 3ac98221..5dda9167 100644 --- a/ajet/backbone/main_verl.py +++ b/ajet/backbone/main_verl.py @@ -22,6 +22,7 @@ import hydra import ray from beast_logger import print_dict +from loguru import logger from omegaconf import OmegaConf from verl.trainer.ppo.reward import load_reward_manager from verl.utils.device import is_cuda_available @@ -112,7 +113,7 @@ def run(self, config): from omegaconf import OmegaConf from verl.utils.fs import copy_to_local - print(f"TaskRunner hostname: {socket.gethostname()}, PID: {os.getpid()}") + logger.info(f"TaskRunner hostname: {socket.gethostname()}, PID: {os.getpid()}") pprint(OmegaConf.to_container(config, resolve=True)) OmegaConf.resolve(config) @@ -148,8 +149,6 @@ def run(self, config): from verl.workers.fsdp_workers import CriticWorker elif use_legacy_worker_impl == "disable": from verl.workers.roles import CriticWorker - - print("Using new worker implementation") else: raise ValueError(f"Invalid use_legacy_worker_impl: {use_legacy_worker_impl}") diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index cbd62150..2799b249 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -10,6 +10,7 @@ from ajet.utils.launch_utils import set_loguru_default_color from ajet.schema.logprob import TokenAndProb from ajet.utils.core_env_vars import get_runtime_env +from loguru import logger set_loguru_default_color() @@ -116,12 +117,11 @@ def run(config): config.ajet.task_reader, ) tasks = task_reader.get_validation_tasks() - print(tasks[:2]) + logger.info(tasks[:n_task]) ctx_tracker = parallel_env.rollout( tasks=tasks[:n_task], mode="sample", epoch="1" ) # "sample" or "validate" _ = parallel_env.to_dataproto(ctx_tracker) - print("Generated batch output") @hydra.main( @@ -133,7 +133,6 @@ def main(config): from omegaconf import OmegaConf OmegaConf.resolve(config) - print("*" * 20) runtime_env = get_runtime_env() os.environ.update(runtime_env["env_vars"]) @@ -147,12 +146,12 @@ def companion_launch(): from ajet.utils.smart_daemon import LaunchCommandWhenAbsent - print("Launching companion process for async LLM server...") + logger.info("Launching companion process for async LLM server...") model_path = config.ajet.model.path tensor_parallel_size = config.ajet.debug.debug_tensor_parallel_size n_avail_gpus = torch.cuda.device_count() if tensor_parallel_size > n_avail_gpus: - print( + logger.info( f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." ) tensor_parallel_size = n_avail_gpus diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index 4978a57d..60c9d6ed 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -293,7 +293,7 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): ) if self.config.algorithm.use_kl_in_reward and config.actor_rollout_ref.actor.use_kl_loss: - print("NOTICE: You have both enabled in-reward kl and kl loss.") + logger.warning("NOTICE: You have both enabled in-reward kl and kl loss.") # critic if self.use_critic: @@ -301,7 +301,7 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): critic_config.validate(n_gpus, config.ajet.data.train_batch_size) if config.data.get("val_batch_size", None) is not None: - print( + logger.warning( "WARNING: val_batch_size is deprecated." + " Validation datasets are sent to inference engines as a whole batch," + " which will schedule the memory themselves." @@ -313,7 +313,7 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): config.ajet.rollout.temperature > 0 ), "validation gen temperature should be greater than 0 when enabling do_sample" - print("[validate_config] All configuration checks passed successfully!") + logger.success("[validate_config] All configuration checks passed successfully!") def init_workers(self): """Initialize distributed training workers using Ray backend. @@ -787,7 +787,7 @@ def fit(self): # noqa: C901 or esi_close_to_expiration ): if esi_close_to_expiration: - print("Force saving checkpoint: ESI instance expiration approaching.") + logger.info("Force saving checkpoint: ESI instance expiration approaching.") with marked_timer("save_checkpoint", timing_raw, color="green"): self._save_checkpoint() diff --git a/ajet/context_tracker/basic_tracker.py b/ajet/context_tracker/basic_tracker.py index 9ccf2c62..100e5d2c 100644 --- a/ajet/context_tracker/basic_tracker.py +++ b/ajet/context_tracker/basic_tracker.py @@ -1,8 +1,8 @@ +import torch import copy from collections import defaultdict from typing import List, Tuple - -import torch +from loguru import logger from ajet.context_tracker.base_tracker import ( BaseTracker, @@ -231,7 +231,7 @@ def group_tokenize_multi_group(self): sample_arr += [sample] if len(sample_arr) > max_num_group: - print(f"Warning: allow {max_num_group} groups, but got {len(sample_arr)} groups") + logger.warning(f"Warning: allow {max_num_group} groups, but got {len(sample_arr)} groups") import random sample_arr = random.sample(sample_arr, max_num_group) # preserve max_num_group groups diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 6cf4c3f3..33a7ea1f 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -7,7 +7,7 @@ ajet: # the experimental reverse proxy feature that allows `tuner.as_oai_baseurl_apikey` feature - enable_experimental_reverse_proxy: True + enable_experimental_reverse_proxy: False model: # which model should be trained diff --git a/ajet/schema/convertion.py b/ajet/schema/convertion.py index 54f0d4df..e2a6a2c0 100644 --- a/ajet/schema/convertion.py +++ b/ajet/schema/convertion.py @@ -46,7 +46,9 @@ def convert_llm_proxy_response_to_oai_response(llm_proxy_response): usage=usage, ) -# copied from AgentScope's DashScopeChatModule + + +# modified from AgentScope's DashScopeChatModule def convert_llm_proxy_response_to_agentscope_response( message, structured_model: Type[BaseModel] | None = None, @@ -105,91 +107,3 @@ def convert_llm_proxy_response_to_agentscope_response( return parsed_response - - -def test_convert_llm_proxy_response_to_oai_response(): - """Test the conversion from llm_proxy_response to OpenAI ChatCompletion format.""" - - from ajet.schema.logprob import TokenAndProb - # Test case 1: Basic response with content only - llm_proxy_response_basic = { - "role": "assistant", - "request_id": "req-123456", - "content": "Hello, how can I help you today?", - "tool_calls": None, - "tokens": [ - TokenAndProb( - token_id=123, - logprob=-0.5, - decoded_string="Hello", - ), - TokenAndProb( - token_id=456, - logprob=-0.3, - decoded_string=",", - ), - ], - } - - result = convert_llm_proxy_response_to_oai_response(llm_proxy_response_basic) - - assert result.id == "req-123456" - assert result.object == "chat.completion" - assert len(result.choices) == 1 - assert result.choices[0].message.role == "assistant" - assert result.choices[0].message.content == "Hello, how can I help you today?" - assert result.choices[0].message.tool_calls is None - assert result.choices[0].finish_reason == "stop" - assert result.usage is not None - assert result.usage.completion_tokens == 2 - assert result.usage.total_tokens == 2 - - print("✓ Test case 1 passed: Basic response with content") - - # Test case 2: Response with tool calls - llm_proxy_response_with_tools = { - "role": "assistant", - "request_id": "req-789012", - "content": "", - "tool_calls": [ - { - "id": "call_abc123", - "type": "function", - "function": { - "name": "get_weather", - "arguments": '{"location": "San Francisco"}' - } - } - ], - "tokens": [], - } - - result2 = convert_llm_proxy_response_to_oai_response(llm_proxy_response_with_tools) - - assert result2.id == "req-789012" - assert result2.choices[0].message.content == "" - assert result2.choices[0].message.tool_calls is not None - assert len(result2.choices[0].message.tool_calls) == 1 - assert result2.usage is None # No tokens provided - - print("✓ Test case 2 passed: Response with tool calls") - - # Test case 3: Minimal response with defaults - llm_proxy_response_minimal = { - "content": "Test response" - } - - result3 = convert_llm_proxy_response_to_oai_response(llm_proxy_response_minimal) - - assert result3.id == "chatcmpl-default" - assert result3.choices[0].message.role == "assistant" - assert result3.choices[0].message.content == "Test response" - assert result3.model == "unknown" - - print("✓ Test case 3 passed: Minimal response with defaults") - - print("\n✅ All tests passed!") - - -if __name__ == "__main__": - test_convert_llm_proxy_response_to_oai_response() diff --git a/ajet/schema/trajectory.py b/ajet/schema/trajectory.py index 225ba3c4..468aa168 100644 --- a/ajet/schema/trajectory.py +++ b/ajet/schema/trajectory.py @@ -2,6 +2,7 @@ import numpy as np from pydantic import BaseModel, Field +from loguru import logger class Reward(BaseModel): @@ -31,7 +32,6 @@ def performance_reward(self): # this reward is NOT used in training if (self.step_reward_arr is not None) and len(self.step_reward_arr) > 0: res = np.mean(self.step_reward_arr) - # print(f"Performance reward computed as mean of step_reward_arr: {res}") return res else: return self.raw_reward @@ -146,13 +146,13 @@ def truncate_output_ids(self) -> None: if len(self.response_ids) > self.max_response_len: truncate_any = True - print( + logger.warning( "-------------------------------------------------------------------------------------------------------" ) - print( + logger.warning( f"Warning: response_ids length {len(self.response_ids)} exceeds max_response_len {self.max_response_len}, truncating." ) - print( + logger.warning( "-------------------------------------------------------------------------------------------------------" ) self.response_ids = self.response_ids[: self.max_response_len] diff --git a/ajet/task_reader/tracing_reader/__init__.py b/ajet/task_reader/tracing_reader/__init__.py index 52479e2e..79b1c44c 100644 --- a/ajet/task_reader/tracing_reader/__init__.py +++ b/ajet/task_reader/tracing_reader/__init__.py @@ -31,7 +31,6 @@ def __init__( super().__init__(reader_config) # config patch - # print("*********", config, "**********") self.reader_config = reader_config.feedback_tracing logger.info( diff --git a/ajet/task_rollout/dashscope_llm_bridge.py b/ajet/task_rollout/dashscope_llm_bridge.py index 13265ecb..810cd025 100644 --- a/ajet/task_rollout/dashscope_llm_bridge.py +++ b/ajet/task_rollout/dashscope_llm_bridge.py @@ -71,8 +71,8 @@ def external_llm_chat_fn(messages, sampling_params_override={}, request_id=""): return {"role": message["role"], "content": message["content"]} except Exception as e: logger.bind(exception=True).exception(f"Error calling alien llm: {e}") + logger.warning(f"Error calling alien llm: {e}, retrying...") time.sleep(5) - print(f"Error calling alien llm: {e}, retrying...") raise RuntimeError(f"Failed to get response from alien llm after {max_try} attempts") return external_llm_chat_fn diff --git a/ajet/tuner.py b/ajet/tuner.py index 9c228af8..92282c98 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -101,6 +101,7 @@ def as_oai_baseurl_apikey( ``` """ + assert self.config.ajet.enable_experimental_reverse_proxy, "Please enable `ajet.enable_experimental_reverse_proxy` in yaml config to use `as_oai_baseurl_apikey` feature." baseurl_apikey_model = OpenaiClientBaseUrlTuner( config=self.config, context_tracker=self.context_tracker, diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index b7d41533..12f8bf27 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -4,6 +4,7 @@ import threading import os import time +from loguru import logger from typing import Optional, List, Dict, Any, Union, TYPE_CHECKING from vllm.entrypoints.openai.protocol import ChatCompletionRequest, ChatCompletionResponse from openai.types.chat.chat_completion import ChatCompletion @@ -141,13 +142,13 @@ async def _service_loop(self): # 0.25s timeout, loop back to check should_terminate continue except websockets.exceptions.ConnectionClosed: - print("Websocket connection closed by server") + logger.warning("Websocket connection closed by server") return # Exit inner loop to reconnect or finish await websocket.send(pickle.dumps("terminate")) except (OSError, IOError) as e: - print(f"Websocket connection error: {e}") + logger.warning(f"Websocket connection error: {e}") pass diff --git a/ajet/utils/config_computer.py b/ajet/utils/config_computer.py index 56c72dac..3c8c3921 100644 --- a/ajet/utils/config_computer.py +++ b/ajet/utils/config_computer.py @@ -96,7 +96,6 @@ def split_keys_and_operators( """ # Parse the expression - # print(operation_str) try: tree = ast.parse(operation_str, mode="eval") except SyntaxError as e: @@ -160,61 +159,61 @@ def eval_func(values: Dict[str, Any]) -> Any: return keys, eval_func -# Test examples -if __name__ == "__main__": - # Example 1 - operation_str1 = "(ajet.data.train_batch_size * ajet.rollout.num_repeat * ajet.rollout.multi_turn.expected_steps)" - known_operators1 = [] - - keys1, func1 = split_keys_and_operators(operation_str1) - print("Example 1:") - print(f"Extracted keys: {keys1}") - - values1 = { - "ajet.data.train_batch_size": 32, - "ajet.rollout.num_repeat": 4, - "ajet.rollout.multi_turn.expected_steps": 10, - } - result1 = func1(values1) - print(f"Computed result: {result1}") # 32 * 4 * 10 = 1280 - print() - - # Example 2 - operation_str2 = "(ajet.rollout.max_env_worker // ajet.rollout.n_vllm_engine)" - known_operators2 = [] - - keys2, func2 = split_keys_and_operators(operation_str2) - print("Example 2:") - print(f"Extracted keys: {keys2}") - - values2 = {"ajet.rollout.max_env_worker": 100, "ajet.rollout.n_vllm_engine": 8} - result2 = func2(values2) - print(f"Computed result: {result2}") # 100 // 8 = 12 - print() - - # Example 3: Mixed operators - operation_str3 = "(a * b / c + d - e)" - known_operators3 = [] - - keys3, func3 = split_keys_and_operators(operation_str3) - print("Example 3:") - print(f"Extracted keys: {keys3}") - - values3 = {"a": 100, "b": 5, "c": 10, "d": 20, "e": 5} - result3 = func3(values3) - print(f"Computed result: {result3}") # 100 * 5 / 10 + 20 - 5 = 65.0 - - # Example 4 - operation_str4 = "(min(ajet.rollout.max_env_worker // ajet.rollout.n_vllm_engine, 64))" - known_operators4 = [] - - keys4, func4 = split_keys_and_operators(operation_str4) - print("Example 4:") - print(f"Extracted keys: {keys4}") - - values4 = { - "ajet.rollout.max_env_worker": 512, - "ajet.rollout.n_vllm_engine": 4, - } - result4 = func4(values4) - print(f"Computed result: {result4}") # 64 +# # Test examples +# if __name__ == "__main__": +# # Example 1 +# operation_str1 = "(ajet.data.train_batch_size * ajet.rollout.num_repeat * ajet.rollout.multi_turn.expected_steps)" +# known_operators1 = [] + +# keys1, func1 = split_keys_and_operators(operation_str1) +# print("Example 1:") +# print(f"Extracted keys: {keys1}") + +# values1 = { +# "ajet.data.train_batch_size": 32, +# "ajet.rollout.num_repeat": 4, +# "ajet.rollout.multi_turn.expected_steps": 10, +# } +# result1 = func1(values1) +# print(f"Computed result: {result1}") # 32 * 4 * 10 = 1280 +# print() + +# # Example 2 +# operation_str2 = "(ajet.rollout.max_env_worker // ajet.rollout.n_vllm_engine)" +# known_operators2 = [] + +# keys2, func2 = split_keys_and_operators(operation_str2) +# print("Example 2:") +# print(f"Extracted keys: {keys2}") + +# values2 = {"ajet.rollout.max_env_worker": 100, "ajet.rollout.n_vllm_engine": 8} +# result2 = func2(values2) +# print(f"Computed result: {result2}") # 100 // 8 = 12 +# print() + +# # Example 3: Mixed operators +# operation_str3 = "(a * b / c + d - e)" +# known_operators3 = [] + +# keys3, func3 = split_keys_and_operators(operation_str3) +# print("Example 3:") +# print(f"Extracted keys: {keys3}") + +# values3 = {"a": 100, "b": 5, "c": 10, "d": 20, "e": 5} +# result3 = func3(values3) +# print(f"Computed result: {result3}") # 100 * 5 / 10 + 20 - 5 = 65.0 + +# # Example 4 +# operation_str4 = "(min(ajet.rollout.max_env_worker // ajet.rollout.n_vllm_engine, 64))" +# known_operators4 = [] + +# keys4, func4 = split_keys_and_operators(operation_str4) +# print("Example 4:") +# print(f"Extracted keys: {keys4}") + +# values4 = { +# "ajet.rollout.max_env_worker": 512, +# "ajet.rollout.n_vllm_engine": 4, +# } +# result4 = func4(values4) +# print(f"Computed result: {result4}") # 64 diff --git a/ajet/utils/dynamic_import.py b/ajet/utils/dynamic_import.py index 708cb11d..9cf6fabb 100644 --- a/ajet/utils/dynamic_import.py +++ b/ajet/utils/dynamic_import.py @@ -73,7 +73,6 @@ def _dynamic_import(module_class_str: str): try: protocol_cls = getattr(module, class_name) except Exception as e: - print(module) raise ImportError(f"Cannot import class {class_name} from module {module_str}: {e}") from e return protocol_cls diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py index b288eaa3..e2b07863 100644 --- a/scripts/deploy_model.py +++ b/scripts/deploy_model.py @@ -57,12 +57,12 @@ def companion_launch(): - print("Launching companion process for async LLM server...") + logger.info("Launching companion process for async LLM server...") model_path = args.target n_avail_gpus = torch.cuda.device_count() tensor_parallel_size = n_avail_gpus if tensor_parallel_size > n_avail_gpus: - print( + logger.warning( f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." ) tensor_parallel_size = n_avail_gpus From bdc244b22b807c43a2e9d0da2bd5dae978872874 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 12 Jan 2026 15:38:19 +0800 Subject: [PATCH 423/462] fix docs/en/tune_your_first_agent.md --- .gitignore | 1 + docs/en/tune_your_first_agent.md | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 3c4ba3d1..47499aed 100644 --- a/.gitignore +++ b/.gitignore @@ -149,3 +149,4 @@ appworld_pack_v2.tar* saved_checkpoints data datasets +tutorial2 diff --git a/docs/en/tune_your_first_agent.md b/docs/en/tune_your_first_agent.md index 9c089537..2ecd9f1c 100644 --- a/docs/en/tune_your_first_agent.md +++ b/docs/en/tune_your_first_agent.md @@ -278,9 +278,9 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml ## Full Code {#full-code} -=== "`math_agent.py` - AgentJet Workflow (After Convertion)" +=== "`tutorial/example_math_agent/math_agent.py` - AgentJet Workflow (After Convertion)" - ```python title="math_agent.py" + ```python import re from loguru import logger from agentscope.message import Msg @@ -344,9 +344,10 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml if match: is_success = (match.group(1) == reference_answer) else: is_success = False return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) + ``` -=== "`math_agent.yaml` - Configuration Yaml" +=== "`tutorial/example_math_agent/math_agent.yaml` - Configuration Yaml" ```yaml # ------------------ main configuration ------------------ @@ -356,25 +357,25 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml type: huggingface_dat_repo # ✨✨✨✨ `env_service` or `dataset_file` or `huggingface_dat_repo` # effective when `type: huggingface_dat_repo` huggingface_dat_repo: - dataset_path: 'openai/gsm8k' + dataset_path: 'openai/gsm8k' # '/mnt/data_cpfs/dataset_cache/openai/gsm8k/main' training_split: "train" validation_split: "test" - task_judge: - # ✨✨✨✨ null, because in this certain case, we write reward function together with workflow - judge_protocol: null - model: # ✨✨✨✨ set the model to be trained - path: Qwen/Qwen2.5-7B + path: Qwen/Qwen2___5-7B-Instruct # /mnt/data_cpfs/model_cache/modelscope/hub/Qwen/Qwen/Qwen2___5-7B-Instruct rollout: - user_workflow: "tutorial.example_math_agent.math_agent->ExampleMathLearn" # ✨✨✨✨ write and select workflow + user_workflow: "tutorial/example_math_agent/math_agent.py->MathToolWorkflow" # ✨✨✨✨ write and select workflow num_repeat: 6 # grpo `n` tensor_model_parallel_size: 1 # vllm tp max_response_length_in_one_turn: 1024 max_model_len: 10000 + task_judge: + # ✨✨✨✨ null, because in this certain case, we write reward function together with workflow + judge_protocol: null + data: train_batch_size: 100 max_prompt_length: 3000 From dc0769ef2a72818f4e8948d2ca254b374de59aba Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 12 Jan 2026 15:34:12 +0800 Subject: [PATCH 424/462] docs: fix typos and correct relative links in docs --- docs/en/intro.md | 16 +++--- docs/en/introduction.md | 107 ---------------------------------------- docs/en/quickstart.md | 2 +- docs/en/workflow.md | 12 ++--- docs/index.md | 2 +- 5 files changed, 16 insertions(+), 123 deletions(-) delete mode 100644 docs/en/introduction.md diff --git a/docs/en/intro.md b/docs/en/intro.md index 7ec3e4a6..c4f93f11 100644 --- a/docs/en/intro.md +++ b/docs/en/intro.md @@ -1,6 +1,6 @@ # Introduction -**AgentJet (AJet)** is a cutting-edge, user-friendly agent tunning framework designed to optimize LLM models and agent workflows. +**AgentJet (AJet)** is a cutting-edge, user-friendly agent tuning framework designed to optimize LLM models and agent workflows. Simply provide your workflow (built from AgentScope, OpenAI SDK, Langchain, raw HTTP requests, or hybrid of all of them), training data, and reward function, and we will be ready to enhance your agents to their optimal performance! @@ -13,7 +13,7 @@ AgentJet aims to build a state-of-the-art agent tuning platform for both develop - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. - **Flexible and Fast**. AgentJet supports [multi-agent workflows](workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. -- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). +- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, coming soon). For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: @@ -63,12 +63,12 @@ ajet --conf tutorial/example_math_agent/math_agent.yaml Explore our rich library of examples to kickstart your journey: --- diff --git a/docs/en/introduction.md b/docs/en/introduction.md deleted file mode 100644 index b62ebce1..00000000 --- a/docs/en/introduction.md +++ /dev/null @@ -1,107 +0,0 @@ -# Introduction - -**AgentJet (AJet)** is a cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes. - -Simply provide your AgentScope workflow, training data, and reward function, and we will be ready to enhance your agents to their optimal performance! - ---- - -### Features - -We aim to build a easy-to-learn AgentJet that unlock more possibilities for agent developers: - -- **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. -- **Rich Tutorial Library**. AgentJet provides a rich library of [examples](#example-library) as tutorials. -- **Efficient and Scalable**. AgentJet uses [trinity](https://github.com/modelscope/Trinity-RFT/) as the default backbone (`--backbone=trinity`), accelerating your tuning process via fully asynchronous RFT. Nevertheless, if actor colocating is your preference, you can still fall back to the [verl](./installation.md) backbone. -- **Flexible and Fast**. AgentJet supports [multi-agent workflows](./workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. -- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). - -For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: - - -- **High-Resolution Logging**: AgentJet allows users to save and inspect token-level rollout details, recording token IDs, token loss masks, and even token logprobs to facilitate workflow development and agent diagnostics. -- **Fast Debugging**: AgentJet also provides the `--backbone=debug` option for the best debugging experience, shortening your wait period from minutes to seconds after code changes and enabling breakpoint debugging in IDEs. - ---- - -### Quick Start - -#### Installation - -We recommend using `uv` for dependency management. - -1. **Clone the Repository**: -```bash -git clone https://github.com/modelscope/AgentJet.git -cd AgentJet -``` - - -2. **Set up Environment**: -```bash -uv venv --python=3.10.16 && source .venv/bin/activate -uv pip install -e .[trinity] -# Note: flash-attn must be installed after other dependencies -uv pip install flash_attn==2.8.1 --no-build-isolation --no-cache-dir -``` - - -#### Run Training - -You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](./example_math_agent.md) as an example: - -```bash -ajet --conf tutorial/example_math_agent/math_agent.yaml -``` - -#### Example Library - -Explore our rich library of examples to kickstart your journey: - -- [**Training a math agent that can write python code**](./example_math_agent.md). -- [**Creating an AppWorld agent using AgentScope and training it**](./example_app_world.md). -- [**Developing Werewolves RPG agents and training them**](./example_werewolves.md). -- [**Learning to ask questions like a doctor**](./example_learning_to_ask.md). -- [**Writing a countdown game using AgentScope and solving it**](./example_countdown.md). -- [**Solving a frozen lake walking puzzle using AgentJet**](./example_frozenlake.md). - - ---- - -### Core Concepts - -AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. - -
    -image - -
    - -#### 1. The User-Centric Interface - -To optimize an agent, you provide three core inputs: - -* [**Trainable Workflow**](./workflow.md): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. -* [**Task Reader**](./data_pipeline.md): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. -* [**Task Judger**](./task_judger.md): Evaluates agent outputs and assigns rewards to guide training. - -#### 2. Internal System Architecture - -The internal system orchestrates several specialized modules to handle the complexities of RL training and agent interactions. - -* **Launcher**: Manages background service processes (Ray, vLLM) and routes the backbone. -* **Task Reader**: Handles data ingestion, augmentation, and filtering. -* **Task Rollout**: Bridges LLM engines and manages the Gym environment lifecycle. -* **Task Runner**: Executes the AgentScope workflow and calculates rewards. -* **Model Tuner**: Forwards inference requests from the workflow to the LLM engine. -* **Context Tracker**: Monitors LLM calls and automatically merges shared-history timelines to improve training efficiency by **1.5x to 10x**. - - ---- - -### Navigation - -* **Tutorials**: From [Installation](./installation.md) to [Tuning your first agent](./tune_your_first_agent.md) — the essential path for beginners. -* **Core Components**: Define your [Trainable Workflow](./workflow.md) and manage [Data](./data_pipeline.md) and [Reward](./tune_your_first_agent.md). -* **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](./example_math_agent.md), [Werewolves game](./example_werewolves.md) and [Learning to ask task](./example_learning_to_ask.md). -* **Deep Dive**: Master advanced [Configuration](./configuration.md). diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index 5e494472..91b7c3fc 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -45,7 +45,7 @@ tuned_model = job.tune() ## 3. Compare with Community Training Curves diff --git a/docs/en/workflow.md b/docs/en/workflow.md index 2724017a..b1d91da4 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -20,7 +20,7 @@ In this article we use **AgentScope** framework for demonstration. For other fra !!! Example "Simple Practice Abstract" - Simply set `model` argument in AgentScope ReActAgent argument to `tuner.as_agentscope_model()` when initializing your agent. - - Wrap your code with `class MyWorkflow(Workflow)` and you agent is ready to be tuned. + - Wrap your code with `class MyWorkflow(Workflow)` and your agent is ready to be tuned. ### 1. When to Use This Simple Practice @@ -93,7 +93,7 @@ Next, use the `tuner` argument, call its `tuner.as_agentscope_model()` method: ## Advanced Practice !!! Example "Advanced Practice Abstract" - - The `tuner.as_agentscope_model()` function has hidden paramters, please further complete them to tell AgentJet the identity of agents. + - The `tuner.as_agentscope_model()` function has hidden parameters, please further complete them to tell AgentJet the identity of agents. - The `ajet.Workflow` class has hidden attribute `trainable_targets`, please assign it manually to narrow down agents to be tuned. ### 1. When to Use Advanced Practice @@ -113,7 +113,7 @@ Simple, there are only two more issues that should be take care of in addition: i. **`.as_agentscope_model` has three hidden (optional) parameters, complete them for each agent.** -| parameter | explaination | +| parameter | explanation | |----------|------------| | `agent_name` | The name of this agent | | `target_tag` | A tag that mark the agent category | @@ -135,7 +135,7 @@ i. **`.as_agentscope_model` has three hidden (optional) parameters, complete the ii. **`Workflow` has a hidden (optional) attribute called `trainable_targets`, config it.** -| `trainable_targets` value | explaination | +| `trainable_targets` value | explanation | |----------|------------| | `trainable_targets = None` | All agents using `as_agentscope_model` will be trained | | `trainable_targets = ["Agent_Type_1", "Agent_Type_2"]` | Agents with `target_tag=Agent_Type_1`, `target_tag=Agent_Type_2`, ... will be trained | @@ -150,7 +150,7 @@ ii. **`Workflow` has a hidden (optional) attribute called `trainable_targets`, c !!! warning - Regardless of `target_tag` differences, all agents share a single model instance (one model weight to play different roles, the model receives different preceptions when playing different roles). + Regardless of `target_tag` differences, all agents share a single model instance (one model weight to play different roles, the model receives different perceptions when playing different roles). ### 2. Multi-Agent Example @@ -245,7 +245,7 @@ Here's a complete example with multiple agent roles (Werewolves game): Wrapping and training your agent on a machine without GPU. -Working in progress and comming soon. +Working in progress and coming soon. ## Next Steps diff --git a/docs/index.md b/docs/index.md index 19f4b3d1..69b018f7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ AgentJet -**AgentJet (AJet)** is a cutting-edge, user-friendly agent tunning framework designed to optimize LLM models and agent workflows. +**AgentJet (AJet)** is a cutting-edge, user-friendly agent tuning framework designed to optimize LLM models and agent workflows. ## 🛩️ Key Features From 614498521ebdbd34ef563e8269772a76e45c1776 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 12 Jan 2026 15:41:54 +0800 Subject: [PATCH 425/462] docs: fix typo, formatting, and relative links in docs --- README.md | 2 +- docs/en/example_learning_to_ask.md | 6 ++---- docs/en/example_werewolves.md | 5 +++++ docs/en/workflow.md | 8 ++++---- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 3bc97f0d..7c08eca9 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ We aim to build a easy-to-learn Agent tuner that unlock more possibilities for a - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. - **Flexible and Fast**. AgentJet supports [multi-agent workflows](https://doc.agentjet.top/AgentJet/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. -- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, comming soon). +- **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, coming soon). For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index ea3c35ab..c3d4bcf9 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -9,10 +9,8 @@ Train an agent to **ask the next best question** (instead of answering directly) In **Learning to Ask**, each training sample is a short **doctor–patient chat history**. The agent outputs **one next question** the doctor should ask next (optionally with multiple-choice answers), rather than giving diagnosis or treatment. -```{figure} https://img.alicdn.com/imgextra/i4/O1CN01m9WJCM1WJL1aJCSaS_!!6000000002767-2-tps-1024-559.png -Figure: Why "Learning to Ask" matters. Left: LLM gives a diagnosis with too little information. Right: LLM asks clear follow-up questions before concluding, which feels more reassuring. -``` - +![](https://img.alicdn.com/imgextra/i4/O1CN01m9WJCM1WJL1aJCSaS_!!6000000002767-2-tps-1024-559.png) +
    Why "Learning to Ask" matters. Left: LLM gives a diagnosis with too little information. Right: LLM asks clear follow-up questions before concluding, which feels more reassuring.
    This tutorial is organized in two steps: diff --git a/docs/en/example_werewolves.md b/docs/en/example_werewolves.md index ad976d56..8ff865ea 100644 --- a/docs/en/example_werewolves.md +++ b/docs/en/example_werewolves.md @@ -7,6 +7,7 @@ This tutorial demonstrates how to train **multiple agents** to play the Werewolv The Werewolves role-playing game is a typical POMDP (Partially Observable Markov Decision Process) problem. We can train agents in this cooperative multi-agent problem using shared-parameter methods. Terms explained: + - **Partially Observable**: Agents are only able to receive **local information**. One agent cannot obtain others' perception, even if they are teammates. - **Markov Decision Process**: Making decisions according to current situations. - **Shared-parameter**: Using one model as policy for multiple agents. But notice agents **share** policy (model parameters) but **do not share** perception (model input). @@ -18,6 +19,7 @@ Terms explained: This page shows how to use the Werewolves social deduction game as a multi-agent environment to prepare data and environment, write an AgentScope Workflow, configure the reward module (Judge), and complete the full process from local debugging to formal training. Scenario Overview + - Scenario: Classic Werewolves game, including roles such as werewolf, villager, seer, witch, and hunter. - Goal: Train a specific role (in this example, the `werewolf`) to achieve a higher win rate in games. @@ -70,6 +72,7 @@ When `--backbone=debug`, Ray is disabled. You can use a VSCode `.vscode/launch.j ### 3.1 Core Process At a high level, each training iteration follows this flow: + - The task reader generates a new game setup (players, role assignments, initial state). - The rollout runs the AgentScope workflow to simulate a full game. - Agents in `trainable_targets` act by using the trainable model (via `tuner.as_agentscope_model(...)`), while opponents use the fixed model. @@ -112,11 +115,13 @@ When `judge_protocol: null`, training relies on the reward (or win/loss outcome) In `ExampleWerewolves.execute()`, the workflow first runs a full game by calling `werewolves_game(players, roles)`, and obtains `good_guy_win` (whether the good-guy side wins). Then it uses a **turn-level sparse win/loss reward**: + - If `good_guy_win == True` and the training target is not `werewolf` (i.e., you are training a good-guy role), then `raw_reward = 1` and `is_success = True`. - If `good_guy_win == False` and the training target is `werewolf` (i.e., you are training a werewolf-side role), then `raw_reward = 1` and `is_success = True`. - Otherwise, the training side did not win: `raw_reward = 0` and `is_success = False`. Exception / invalid-behavior penalty: + - If an exception is thrown during the game (e.g., the game cannot proceed), all trainable targets are penalized uniformly: `raw_reward = -0.1` and `is_success = False`. If you need a more fine-grained evaluation (e.g., giving partial credit for key intermediate decisions instead of only win/loss), implement a custom Judge and enable it via `ajet.task_judge.judge_protocol`. diff --git a/docs/en/workflow.md b/docs/en/workflow.md index b1d91da4..33191059 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -80,10 +80,10 @@ Next, use the `tuner` argument, call its `tuner.as_agentscope_model()` method: ### 3. Code Example From 1f9d63e17f339c1f306895b181d42ef253b399e7 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 12 Jan 2026 18:26:50 +0800 Subject: [PATCH 426/462] lazy init url relay client --- ajet/tuner.py | 8 +- .../experimental/as_oai_model_client.py | 2 +- .../experimental/as_oai_model_server.py | 26 +- docs/en/agent_framework_support.md | 59 +++-- docs/en/debugging_guide.md | 34 ++- docs/en/support_agentscope.md | 224 ++++++++++++++++++ mkdocs.yml | 1 + 7 files changed, 328 insertions(+), 26 deletions(-) create mode 100644 docs/en/support_agentscope.md diff --git a/ajet/tuner.py b/ajet/tuner.py index 92282c98..8fa19137 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -27,7 +27,7 @@ def __init__( self.llm_inference_fn = llm_inference_fn self.target2proxy_registry: dict[str, dict[str,TunerTypeUnion]] = {} if config.ajet.enable_experimental_reverse_proxy: - self._enable_experimental_interchange_server(llm_inference_fn) + self.proxy_client_started = False def as_agentscope_model( @@ -102,6 +102,9 @@ def as_oai_baseurl_apikey( """ assert self.config.ajet.enable_experimental_reverse_proxy, "Please enable `ajet.enable_experimental_reverse_proxy` in yaml config to use `as_oai_baseurl_apikey` feature." + if self.proxy_client_started is False: + self._enable_experimental_interchange_server(self.llm_inference_fn) + self.proxy_client_started = True baseurl_apikey_model = OpenaiClientBaseUrlTuner( config=self.config, context_tracker=self.context_tracker, @@ -178,4 +181,5 @@ def _enable_experimental_interchange_server(self, llm_inference_fn): def terminate_episode(self): # experimental reverse proxy cleanup if self.config.ajet.enable_experimental_reverse_proxy: - self.interchange_client._should_terminate = True + if (self.proxy_client_started is True) and hasattr(self, "interchange_client"): + self.interchange_client._should_terminate = True diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index 12f8bf27..1e121590 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -115,7 +115,7 @@ async def _service_loop(self): assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" uri = f"ws://127.0.0.1:{port}/hook/context_tracker_client_listen" - async with websockets.connect(uri) as websocket: + async with websockets.connect(uri, ping_timeout=3600) as websocket: try: # Send initialization parameters # Sending as a list [agent_name, target_tag, episode_uuid] to match "input (a,b,c)" structure diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 474aaa0e..30a882f8 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -21,7 +21,7 @@ from pprint import pformat from loguru import logger -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict, model_validator from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Header, HTTPException, Request import uvicorn @@ -30,6 +30,14 @@ # Global variables for tracking requests and responses +# class ChatCompletionRequestDeferBuildOff(ChatCompletionRequest): +# model_config = ConfigDict( +# defer_build=False, +# validate_default=True, +# validate_assignment=True, +# ) +# ChatCompletionRequest.model_validate_json(x) + class InterchangeCompletionRequest(BaseModel): completion_request: ChatCompletionRequest agent_name: str @@ -37,7 +45,6 @@ class InterchangeCompletionRequest(BaseModel): episode_uuid: str timeline_uuid: str - ajet_remote_handler_received: Dict[str, Dict[str, InterchangeCompletionRequest]] = defaultdict(dict) ajet_remote_handler_in_progress: Dict[str, Dict[str, InterchangeCompletionRequest]] = defaultdict(dict) ajet_remote_handler_completed: Dict[str, Dict[str, ChatCompletion]] = defaultdict(dict) @@ -221,12 +228,14 @@ async def chat_completions(request: Request, authorization: str = Header(None)): # Parse request body body = await request.json() - new_req = ChatCompletionRequest(**body) + new_req = ChatCompletionRequest.model_validate(body) + # Create timeline UUID timeline_uuid = uuid.uuid4().hex + # Add to received queue # logger.warning(f"Received new chat completion request for agent: {agent_name}, target_tag: {target_tag}, episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid}") - ajet_remote_handler_received[key][timeline_uuid] = InterchangeCompletionRequest( + int_req = InterchangeCompletionRequest( completion_request = new_req, agent_name = agent_name, target_tag = target_tag, @@ -234,6 +243,15 @@ async def chat_completions(request: Request, authorization: str = Header(None)): timeline_uuid = timeline_uuid, ) + # fix Pydantic validation issue for tool_calls field + for msg in int_req.completion_request.messages: + if isinstance(msg, dict) and 'tool_calls' in msg: + tc = msg['tool_calls'] + if not isinstance(tc, list): + msg['tool_calls'] = list(tc) if tc else [] + + ajet_remote_handler_received[key][timeline_uuid] = int_req + # Wait for response (with periodic checks for client disconnect) max_wait_time = 1800 # 30 minutes timeout check_interval = 0.25 # Check every 250ms diff --git a/docs/en/agent_framework_support.md b/docs/en/agent_framework_support.md index 9d8c7465..e1f1be92 100644 --- a/docs/en/agent_framework_support.md +++ b/docs/en/agent_framework_support.md @@ -1,17 +1,42 @@ -# Supported Agent Frameworks - - - - -## - - - -## AgentScope - - - - - - - +# Agent Framework Support + + + diff --git a/docs/en/debugging_guide.md b/docs/en/debugging_guide.md index 649f744e..0a938004 100644 --- a/docs/en/debugging_guide.md +++ b/docs/en/debugging_guide.md @@ -1,6 +1,8 @@ In this tutorial, we introduce the way to debug the workflow and the training algorithms. -## Workflow Debugging + + +## Workflow Debugging (--backbone=debug) 1. Install VSCode and connect to GPU server. @@ -74,4 +76,32 @@ Then, the modified launch.json will be 7. Press `F5` to start debugging. -8. You can set breakpoint inside the workflow to observe program execution now. \ No newline at end of file +8. You can set breakpoint inside the workflow to observe program execution now. + + +## General Debugging (Ray Distributed Debugger) + +1. Install the Ray Distributed Debugger extension in VSCode. + +2. In AgentJet project: + + 2-1. In the place your want to set a conditional breakpoint, write + `from ajet import bp; bp("TAG_1")` + + 2-2. When launching the training process, add `--debug` as commandline argument + `ajet --conf your_config.yaml --debug="TAG_1"` + + 2-3. Open Tab "Ray Distributed Debugger" in VSCode, and just wait until the breakpoint is hit. + + +## Comparison + +| Feature | Workflow Debugging | General Debugging (Ray) | +| :--- | :--- | :--- | +| **Backend** | `debug`, `tinker` | `verl`, `trinity` | +| **Reboot Speed** | Very Fast | Slow | +| **Debug Target** | Workflow | Everything | +| **VSCode Extension** | Python | Python + Ray Distributed Debugger | +| **Launch Mode** | `F5` standard launch (via `launch.json`) | Command line execution with `ajet ... --debug="TAG"` | +| **Commandline** | `--backbone=debug` | `--debug="TAG1\|TAG2\|TAG3"` | + diff --git a/docs/en/support_agentscope.md b/docs/en/support_agentscope.md new file mode 100644 index 00000000..6824cd9f --- /dev/null +++ b/docs/en/support_agentscope.md @@ -0,0 +1,224 @@ +# Supported Agent Frameworks: AgentScope + +This article introduce the way to convert different types of ways to convert your existing workflows into AgentJet workflows. + + +## AgentScope + +1. use `tuner.as_agentscope_model()` to override ReActAgent's model argument + +2. use `tuner.as_oai_baseurl_apikey()` to override OpenAIChatModel's baseurl + apikey argument + +### Explain with examples + +=== "Before Convertion" + + ```python + model = DashScopeChatModel(model_name="qwen-max", stream=False) # 🛩️ change here + agent_instance = ReActAgent( + name=f"Friday", + sys_prompt="You are a helpful assistant", + model=model, + formatter=DashScopeChatFormatter(), + ) + ``` + +=== "After Convertion (`as_agentscope_model`)" + + ```python + model = tuner.as_agentscope_model() # 🛩️ change here + agent_instance = ReActAgent( + name=f"Friday", + sys_prompt="You are a helpful assistant", + model=model, + formatter=DashScopeChatFormatter(), + ) + ``` + +=== "After Convertion (`as_agentscope_model`)" + + ```python + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key # the api key contain information, do not discard it + model = OpenAIChatModel( + model_name="whatever", + client_args={"base_url": base_url}, + api_key=api_key, + ) + self.agent = ReActAgent( + name="math_react_agent", sys_prompt=system_prompt, + model=model, # ✨✨ compared with a normal agentscope agent, here is the difference! + formatter=OpenAIChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), max_iters=2, + ) + ``` + + +!!! warning "" + - when you are using the `tuner.as_oai_baseurl_apikey()` api, you must enable the following feature in the yaml configuration. + + ```yaml + + ajet: + ... + enable_experimental_reverse_proxy: True + ... + + ``` + + + + +### Explain with examples (Full Workflow Code) + + + +=== "Full Code After Convertion (`as_agentscope_model`)" + + ```python + import re + from loguru import logger + from agentscope.message import Msg + from agentscope.agent import ReActAgent + from agentscope.formatter import DashScopeChatFormatter + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask + + + def extract_final_answer(result) -> str: + """Extract the final answer from the agent's response.""" + try: + if ( + hasattr(result, "metadata") + and isinstance(result.metadata, dict) + and "result" in result.metadata + ): + return result.metadata["result"] + if hasattr(result, "content"): + if isinstance(result.content, dict) and "result" in result.content: + return result.content["result"] + return str(result.content) + return str(result) + except Exception as e: + logger.warning(f"Extract final answer error: {e}. Raw: {result}") + return str(result) + + + system_prompt = """ + You are an agent specialized in solving math problems with tools. + Please solve the math problem given to you. + You can write and execute Python code to perform calculation or verify your answer. + You should return your final answer within \\boxed{{}}. + """ + + + class MathToolWorkflow(Workflow): # ✨✨ inherit `Workflow` class + name: str = "math_agent_workflow" + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + # run agentscope + query = workflow_task.task.main_query + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + self.agent = ReActAgent( + name="math_react_agent", sys_prompt=system_prompt, + model=tuner.as_agentscope_model(), # ✨✨ compared with a normal agentscope agent, here is the difference! + formatter=DashScopeChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), max_iters=2, + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg) + final_answer = extract_final_answer(result) + + # compute reward + reference_answer = workflow_task.task.metadata["answer"].split("####")[-1].strip() + match = re.search(r"\\boxed\{([^}]*)\}", final_answer) + if match: is_success = (match.group(1) == reference_answer) + else: is_success = False + return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) + + ``` + +=== "Full Code After Convertion (`as_agentscope_model`)" + + ```python + import re + from loguru import logger + from agentscope.message import Msg + from agentscope.agent import ReActAgent + from agentscope.formatter import OpenAIChatFormatter + from agentscope.model import OpenAIChatModel + from agentscope.memory import InMemoryMemory + from agentscope.tool import Toolkit, execute_python_code + from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask + + + def extract_final_answer(result) -> str: + """Extract the final answer from the agent's response.""" + try: + if ( + hasattr(result, "metadata") + and isinstance(result.metadata, dict) + and "result" in result.metadata + ): + return result.metadata["result"] + if hasattr(result, "content"): + if isinstance(result.content, dict) and "result" in result.content: + return result.content["result"] + return str(result.content) + return str(result) + except Exception as e: + logger.warning(f"Extract final answer error: {e}. Raw: {result}") + return str(result) + + + system_prompt = """ + You are an agent specialized in solving math problems with tools. + Please solve the math problem given to you. + You can write and execute Python code to perform calculation or verify your answer. + You should return your final answer within \\boxed{{}}. + """ + + + class MathToolWorkflow(Workflow): # ✨✨ inherit `Workflow` class + name: str = "math_agent_workflow" + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + # run agentscope + query = workflow_task.task.main_query + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key # the api key contain information, do not discard it + model = OpenAIChatModel( + model_name="whatever", + client_args={"base_url": base_url}, + api_key=api_key, + ) + self.agent = ReActAgent( + name="math_react_agent", sys_prompt=system_prompt, + model=model, # ✨✨ compared with a normal agentscope agent, here is the difference! + formatter=OpenAIChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), max_iters=2, + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg) + final_answer = extract_final_answer(result) + + # compute reward + reference_answer = workflow_task.task.metadata["answer"].split("####")[-1].strip() + match = re.search(r"\\boxed\{([^}]*)\}", final_answer) + if match: is_success = (match.group(1) == reference_answer) + else: is_success = False + return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) + ``` + diff --git a/mkdocs.yml b/mkdocs.yml index ff984b09..a449367a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -29,6 +29,7 @@ nav: - Installation: en/installation.md - Quick Start: en/quickstart.md - Tune Your First Agent: en/tune_your_first_agent.md + - AgentScope Support: en/support_agentscope.md - Examples: - Math Agent: en/example_math_agent.md From 1f439185be61e6b2336c3c2d7ad4a6d1b38566b6 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 12 Jan 2026 19:02:10 +0800 Subject: [PATCH 427/462] fix openai - agentscope compat --- ajet/schema/extended_msg.py | 3 +++ .../experimental/as_oai_model_client.py | 2 ++ .../experimental/as_oai_model_server.py | 18 +++++++++++------- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ajet/schema/extended_msg.py b/ajet/schema/extended_msg.py index 7ed77bf8..f3d5a59e 100644 --- a/ajet/schema/extended_msg.py +++ b/ajet/schema/extended_msg.py @@ -88,6 +88,9 @@ def __init__( self.clip = clip self.tools = tools self.tool_calls = tool_calls + if not isinstance(self.tool_calls, list): + # agent scope sometimes gives weird type for tool_calls, which is against OpenAI schema + self.tool_calls = list(self.tool_calls) self.uuid = uuid.uuid4().hex self.build_from_uuid = build_from_uuid self.first_message = first_message diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index 1e121590..e0c7f6d2 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -128,6 +128,8 @@ async def _service_loop(self): parsed_msg: InterchangeCompletionRequest = pickle.loads( await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) ) + if isinstance(parsed_msg, str): + parsed_msg = InterchangeCompletionRequest(**json.loads(parsed_msg)) response = await self.llm_infer( req=parsed_msg.completion_request, diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 30a882f8..4a99435d 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -83,7 +83,11 @@ async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, # will be received by: # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py # await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) - await websocket.send_bytes(pickle.dumps(new_req)) + try: + await websocket.send_bytes(pickle.dumps(new_req)) + except: + # AgentScope sometimes fails the standard OAI schema compliance check for ChatCompletionRequest + await websocket.send_bytes(pickle.dumps(new_req.model_dump_json())) else: await asyncio.sleep(0.25) @@ -243,12 +247,12 @@ async def chat_completions(request: Request, authorization: str = Header(None)): timeline_uuid = timeline_uuid, ) - # fix Pydantic validation issue for tool_calls field - for msg in int_req.completion_request.messages: - if isinstance(msg, dict) and 'tool_calls' in msg: - tc = msg['tool_calls'] - if not isinstance(tc, list): - msg['tool_calls'] = list(tc) if tc else [] + # # fix Pydantic validation issue for tool_calls field + # for msg in int_req.completion_request.messages: + # if isinstance(msg, dict) and 'tool_calls' in msg: + # tc = msg['tool_calls'] + # if not isinstance(tc, list): + # msg['tool_calls'] = list(tc) if tc else [] ajet_remote_handler_received[key][timeline_uuid] = int_req From 47c1f40d5541ac461f5ebcea334b27c1f6950fbf Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Mon, 12 Jan 2026 23:44:18 +0800 Subject: [PATCH 428/462] retry when ws connection failed --- .../weight_tuner/experimental/as_oai_model_client.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index e0c7f6d2..d1b3b47b 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -98,9 +98,17 @@ def begin_service(self): """ Starts the websocket service loop. """ - t = threading.Thread(target=lambda: asyncio.run(self._service_loop())) + t = threading.Thread(target=lambda: asyncio.run(self._ensure_service_loop())) t.start() + async def _ensure_service_loop(self): + while not self.should_terminate: + try: + await self._service_loop() + except Exception as e: + logger.warning(f"InterchangeClient service loop error: {e}. Restarting...") + time.sleep(4) # brief pause before reconnecting + async def _service_loop(self): """ In fact this is not a service, @@ -115,7 +123,7 @@ async def _service_loop(self): assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" uri = f"ws://127.0.0.1:{port}/hook/context_tracker_client_listen" - async with websockets.connect(uri, ping_timeout=3600) as websocket: + async with websockets.connect(uri, ping_timeout=3600, open_timeout=16) as websocket: try: # Send initialization parameters # Sending as a list [agent_name, target_tag, episode_uuid] to match "input (a,b,c)" structure From f989472e6417cc85f614e014cd1b158e33686b4c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 00:13:16 +0800 Subject: [PATCH 429/462] extend poll second --- .../experimental/as_oai_model_client.py | 2 +- .../experimental/as_oai_model_server.py | 21 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index d1b3b47b..bec7dfc9 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -107,7 +107,7 @@ async def _ensure_service_loop(self): await self._service_loop() except Exception as e: logger.warning(f"InterchangeClient service loop error: {e}. Restarting...") - time.sleep(4) # brief pause before reconnecting + await asyncio.sleep(4) # brief pause before reconnecting async def _service_loop(self): """ diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 4a99435d..aff4330b 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -54,6 +54,7 @@ class InterchangeCompletionRequest(BaseModel): # Create FastAPI app app = FastAPI(title="AJet Interchange Endpoint") +POLL_INTERVAL_SECONDS = 0.5 @app.get("/health") async def health_check(): @@ -61,7 +62,6 @@ async def health_check(): return {"status": "ok"} - async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, stop_event: asyncio.Event): # Monitor for new requests try: @@ -89,7 +89,7 @@ async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, # AgentScope sometimes fails the standard OAI schema compliance check for ChatCompletionRequest await websocket.send_bytes(pickle.dumps(new_req.model_dump_json())) else: - await asyncio.sleep(0.25) + await asyncio.sleep(POLL_INTERVAL_SECONDS) except WebSocketDisconnect: stop_event.set() @@ -258,7 +258,6 @@ async def chat_completions(request: Request, authorization: str = Header(None)): # Wait for response (with periodic checks for client disconnect) max_wait_time = 1800 # 30 minutes timeout - check_interval = 0.25 # Check every 250ms elapsed_time = 0 try: @@ -268,8 +267,8 @@ async def chat_completions(request: Request, authorization: str = Header(None)): and timeline_uuid in ajet_remote_handler_completed[key]: openai_response = ajet_remote_handler_completed[key][timeline_uuid] return openai_response - await asyncio.sleep(check_interval) - elapsed_time += check_interval + await asyncio.sleep(POLL_INTERVAL_SECONDS) + elapsed_time += POLL_INTERVAL_SECONDS # Timeout reached raise HTTPException(status_code=504, detail="Request timeout") @@ -323,10 +322,10 @@ async def monitor_debug_state(experiment_dir): f.write(pformat(debug_info, width=120, indent=2)) f.write('\n') - await asyncio.sleep(2) + await asyncio.sleep(4) except Exception as e: logger.error(f"Error in monitor_debug_state: {e}") - await asyncio.sleep(2) + await asyncio.sleep(4) def ensure_dat_interchange_server_cache_clear(): @@ -373,14 +372,18 @@ def start(self, experiment_dir) -> int: def run_server(): async def serve_with_monitor(): # Start the monitor task - monitor_task = asyncio.create_task(monitor_debug_state(experiment_dir)) + asyncio.create_task(monitor_debug_state(experiment_dir)) # Start the server config = uvicorn.Config( app=app, host="0.0.0.0", port=self.port, - log_level="error" + log_level="error", + ws_max_queue=1024, + ws_ping_interval=60, + ws_ping_timeout=60, + ws_per_message_deflate=True, ) server = uvicorn.Server(config) await server.serve() From 78ec41d84cd4e3c95c787d422d6180480adc981c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 00:55:00 +0800 Subject: [PATCH 430/462] interchange threading -> interchange subprocess --- .../experimental/as_oai_model_client.py | 7 +- .../experimental/as_oai_model_server.py | 83 +++++++++++++++++-- 2 files changed, 79 insertions(+), 11 deletions(-) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index bec7dfc9..ec02076b 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -98,7 +98,7 @@ def begin_service(self): """ Starts the websocket service loop. """ - t = threading.Thread(target=lambda: asyncio.run(self._ensure_service_loop())) + t = threading.Thread(target=lambda: asyncio.run(self._ensure_service_loop()), daemon=True) t.start() async def _ensure_service_loop(self): @@ -133,11 +133,10 @@ async def _service_loop(self): try: # wait message from ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py - parsed_msg: InterchangeCompletionRequest = pickle.loads( + parsed_msg_str: str = pickle.loads( await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) ) - if isinstance(parsed_msg, str): - parsed_msg = InterchangeCompletionRequest(**json.loads(parsed_msg)) + parsed_msg:InterchangeCompletionRequest = InterchangeCompletionRequest(**json.loads(parsed_msg_str)) response = await self.llm_infer( req=parsed_msg.completion_request, diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index aff4330b..2a08a177 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -24,6 +24,10 @@ from pydantic import BaseModel, ConfigDict, model_validator from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Header, HTTPException, Request import uvicorn +import sys +import subprocess +import atexit +import argparse from vllm.entrypoints.openai.protocol import ChatCompletionRequest from openai.types.chat.chat_completion import ChatCompletion @@ -83,11 +87,11 @@ async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, # will be received by: # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py # await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) - try: - await websocket.send_bytes(pickle.dumps(new_req)) - except: - # AgentScope sometimes fails the standard OAI schema compliance check for ChatCompletionRequest - await websocket.send_bytes(pickle.dumps(new_req.model_dump_json())) + # try: + # await websocket.send_bytes(pickle.dumps(new_req)) + # except: + # # AgentScope sometimes fails the standard OAI schema compliance check for ChatCompletionRequest + await websocket.send_bytes(pickle.dumps(new_req.model_dump_json())) else: await asyncio.sleep(POLL_INTERVAL_SECONDS) @@ -407,11 +411,76 @@ def stop(self): def start_interchange_server(experiment_dir) -> int: """ Start the interchange endpoint server and return the port number. + This launches a subprocess to run the server. Returns: int: The port number the server is running on. """ - server = InterchangeEndpointServer() - port = server.start(experiment_dir) + # Find a free port if not specified or invalid + port = int(os.environ.get("AJET_DAT_INTERCHANGE_PORT", -1)) + if port <= 0: + import socket + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("", 0)) + port = s.getsockname()[1] + os.environ["AJET_DAT_INTERCHANGE_PORT"] = str(port) + + # Launch as subprocess + env = os.environ.copy() + + # We run this file as a script + cmd = [sys.executable, os.path.abspath(__file__), "--experiment_dir", experiment_dir, "--port", str(port)] + + process = subprocess.Popen( + cmd, + env=env, + # redirect stdout/stderr if needed, but keeping them might be useful for debug + # stdout=subprocess.DEVNULL, + # stderr=subprocess.DEVNULL + ) + + def cleanup(): + if process.poll() is None: + logger.info("Terminating interchange server subprocess") + process.terminate() + try: + process.wait(timeout=2) + except subprocess.TimeoutExpired: + process.kill() + + atexit.register(cleanup) + + logger.info(f"Interchange server subprocess started on port {port} (pid: {process.pid})") return port + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="AJet Interchange Endpoint Server") + parser.add_argument("--experiment_dir", type=str, required=True, help="Directory to store debug info") + parser.add_argument("--port", type=int, required=True, help="Port to run the server on") + + args = parser.parse_args() + + async def serve_with_monitor(): + # Start the monitor task + asyncio.create_task(monitor_debug_state(args.experiment_dir)) + + # Start the server + config = uvicorn.Config( + app=app, + host="0.0.0.0", + port=args.port, + log_level="error", + ws_max_queue=1024, + ws_ping_interval=60, + ws_ping_timeout=60, + ws_per_message_deflate=True, + ) + server = uvicorn.Server(config) + await server.serve() + + try: + asyncio.run(serve_with_monitor()) + except KeyboardInterrupt: + pass + From 01bec9050f4231e429c7145c1192edd474d691ea Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 01:46:38 +0800 Subject: [PATCH 431/462] currently stream output is not avail --- .../tuner_lib/weight_tuner/experimental/as_oai_model_server.py | 3 ++- docs/en/support_agentscope.md | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 2a08a177..5b9f3bb8 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -237,7 +237,8 @@ async def chat_completions(request: Request, authorization: str = Header(None)): # Parse request body body = await request.json() new_req = ChatCompletionRequest.model_validate(body) - + if new_req.stream: + raise HTTPException(status_code=400, detail="Streaming responses not supported in current AgentJet version, please set `stream=false` for now.") # Create timeline UUID timeline_uuid = uuid.uuid4().hex diff --git a/docs/en/support_agentscope.md b/docs/en/support_agentscope.md index 6824cd9f..6aac51a9 100644 --- a/docs/en/support_agentscope.md +++ b/docs/en/support_agentscope.md @@ -45,6 +45,7 @@ This article introduce the way to convert different types of ways to convert you model_name="whatever", client_args={"base_url": base_url}, api_key=api_key, + stream=False, ) self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, @@ -201,6 +202,7 @@ This article introduce the way to convert different types of ways to convert you model_name="whatever", client_args={"base_url": base_url}, api_key=api_key, + stream=False, ) self.agent = ReActAgent( name="math_react_agent", sys_prompt=system_prompt, From 9fba5d5af4910418e3fb467539f2cbb10604daf2 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 02:50:46 +0800 Subject: [PATCH 432/462] ws -> sse for stability --- .../experimental/as_oai_model_client.py | 102 +++++--- .../experimental/as_oai_model_server.py | 227 +++++++++--------- 2 files changed, 176 insertions(+), 153 deletions(-) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index ec02076b..babb6362 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -10,7 +10,10 @@ from openai.types.chat.chat_completion import ChatCompletion import pickle -import websockets +import httpx +import logging +logging.getLogger("httpx").setLevel(logging.WARNING) + import base64 import json @@ -96,7 +99,7 @@ def should_terminate(self) -> bool: def begin_service(self): """ - Starts the websocket service loop. + Starts the SSE service loop. """ t = threading.Thread(target=lambda: asyncio.run(self._ensure_service_loop()), daemon=True) t.start() @@ -112,7 +115,7 @@ async def _ensure_service_loop(self): async def _service_loop(self): """ In fact this is not a service, - it is a client that pretends to be a service, by interacting with a local websocket interchange server. + it is a client that pretends to be a service, by interacting with a local interchange server via SSE. This design is for efficiency """ @@ -121,43 +124,66 @@ async def _service_loop(self): port = os.getenv("AJET_DAT_INTERCHANGE_PORT") assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" - uri = f"ws://127.0.0.1:{port}/hook/context_tracker_client_listen" - async with websockets.connect(uri, ping_timeout=3600, open_timeout=16) as websocket: + base_url = f"http://127.0.0.1:{port}" + listen_url = f"{base_url}/hook/context_tracker_client_listen" + response_url = f"{base_url}/hook/context_tracker_client_response" + key = f"episode_uuid:{self.episode_uuid}" + + async with httpx.AsyncClient(timeout=None) as client: + try: + async with client.stream("GET", listen_url, params={"episode_uuid": self.episode_uuid}, timeout=None) as response: + async for line in response.aiter_lines(): + if self.should_terminate: + break + + if not line.strip(): + continue + + if line.startswith(":"): # keepalive + continue + + if line.startswith("data: "): + data = line[6:].strip() + if not data: + continue + + try: + parsed_msg = InterchangeCompletionRequest.model_validate_json(data) + + result = await self.llm_infer( + req=parsed_msg.completion_request, + timeline_uuid=parsed_msg.timeline_uuid, + agent_name=parsed_msg.agent_name, + target_tag=parsed_msg.target_tag, + episode_uuid=parsed_msg.episode_uuid, + ) + + # Send response back + await client.post( + response_url, + params={"key": key}, + content=pickle.dumps(result), + headers={"Content-Type": "application/octet-stream"} + ) + + except Exception as e: + logger.error(f"Error processing SSE event: {e}") + continue + + except httpx.RequestError as e: + logger.warning(f"SSE connection error: {e}") + raise # Let ensure_service_loop handle restart + + # Send terminate signal if we are exiting cleanly try: - # Send initialization parameters - # Sending as a list [agent_name, target_tag, episode_uuid] to match "input (a,b,c)" structure - await websocket.send(pickle.dumps(f"episode_uuid:{self.episode_uuid}")) - - while not self.should_terminate: - - try: - # wait message from ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py - parsed_msg_str: str = pickle.loads( - await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) - ) - parsed_msg:InterchangeCompletionRequest = InterchangeCompletionRequest(**json.loads(parsed_msg_str)) - - response = await self.llm_infer( - req=parsed_msg.completion_request, - timeline_uuid=parsed_msg.timeline_uuid, - agent_name=parsed_msg.agent_name, - target_tag=parsed_msg.target_tag, - episode_uuid=parsed_msg.episode_uuid, - ) - await websocket.send(pickle.dumps(response)) - - except asyncio.TimeoutError: - # 0.25s timeout, loop back to check should_terminate - continue - except websockets.exceptions.ConnectionClosed: - logger.warning("Websocket connection closed by server") - return # Exit inner loop to reconnect or finish - - await websocket.send(pickle.dumps("terminate")) - - except (OSError, IOError) as e: - logger.warning(f"Websocket connection error: {e}") + await client.post( + response_url, + params={"key": key}, + content=pickle.dumps("terminate"), + headers={"Content-Type": "application/octet-stream"} + ) + except: pass diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 5b9f3bb8..b061d9e0 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -12,6 +12,7 @@ import asyncio import threading import uuid +import time from collections import defaultdict from typing import Dict, List import base64 @@ -22,7 +23,8 @@ from loguru import logger from pydantic import BaseModel, ConfigDict, model_validator -from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Header, HTTPException, Request +from fastapi import FastAPI, Header, HTTPException, Request, Body +from fastapi.responses import StreamingResponse import uvicorn import sys import subprocess @@ -53,7 +55,7 @@ class InterchangeCompletionRequest(BaseModel): ajet_remote_handler_in_progress: Dict[str, Dict[str, InterchangeCompletionRequest]] = defaultdict(dict) ajet_remote_handler_completed: Dict[str, Dict[str, ChatCompletion]] = defaultdict(dict) ajet_remote_handler_discarded: Dict[str, Dict[str, bool]] = defaultdict(dict) -active_websockets = {} +active_websockets: Dict[str, asyncio.Event] = {} # Create FastAPI app app = FastAPI(title="AJet Interchange Endpoint") @@ -66,14 +68,22 @@ async def health_check(): return {"status": "ok"} -async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, stop_event: asyncio.Event): - # Monitor for new requests +async def sse_event_generator(key: str, stop_event: asyncio.Event, request: Request): + """ + Generator for Server-Sent Events. + Yields requests to the client. + """ try: + wait_cnt = 0 while not stop_event.is_set(): + + if await request.is_disconnected(): + logger.info(f"Client disconnected for key: {key}") + stop_event.set() + break + # Check for new requests in ajet_remote_handler_received if (key in ajet_remote_handler_received) and len(ajet_remote_handler_received[key]) > 0: - # logger.warning(f"Sending new request to client for key: {key}") - timeline_uuid = list(ajet_remote_handler_received[key].keys())[0] # Get the next request @@ -84,127 +94,105 @@ async def coro_task_1_lookup_dict_received__send_loop(key, websocket: WebSocket, # Move to in_progress ajet_remote_handler_in_progress[key][timeline_uuid] = new_req - # will be received by: - # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py - # await asyncio.wait_for(websocket.recv(decode=False), timeout=0.25) - # try: - # await websocket.send_bytes(pickle.dumps(new_req)) - # except: - # # AgentScope sometimes fails the standard OAI schema compliance check for ChatCompletionRequest - await websocket.send_bytes(pickle.dumps(new_req.model_dump_json())) + # Send via SSE + # We send the JSON representation of the request + # Client expects: parsed_msg:InterchangeCompletionRequest + + # We simply yield the json string. + # The client side will need to read this json. + json_data = new_req.model_dump_json() + yield f"data: {json_data}\n\n" else: await asyncio.sleep(POLL_INTERVAL_SECONDS) + wait_cnt += 1 + if wait_cnt * POLL_INTERVAL_SECONDS >= 5: + wait_cnt = 0 + # Send keepalive comment to prevent timeouts + yield ": keepalive\n\n" - except WebSocketDisconnect: - stop_event.set() - try: await websocket.close() - except: pass - return + await asyncio.sleep(POLL_INTERVAL_SECONDS) except Exception as e: - stop_event.set() - try: await websocket.close() - except: pass - logger.exception(f"Error in websocket handler: {e}") - return - - -async def coro_task_2_lookup_dict_received__receive_loop(key, websocket: WebSocket, stop_event: asyncio.Event): - try: - while not stop_event.is_set(): - # Wait for client response: - # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py - # await websocket.send(pickle.dumps(response)) - # logger.warning(f"Waiting for response from client for key: {key}") - response_data = pickle.loads(await websocket.receive_bytes()) - # logger.warning(f"Received response from client for key: {key}") - - if not isinstance(response_data, ChatCompletion): - stop_event.set() - assert response_data == "terminate", "Invalid terminate signal from client" - await websocket.close() - return - - # Process the response - openai_response: ChatCompletion = response_data - - # see `ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py::response.id = timeline_uuid` - timeline_uuid = openai_response.id - - # Remove from in_progress - if timeline_uuid in ajet_remote_handler_in_progress[key]: - ajet_remote_handler_in_progress[key].pop(timeline_uuid) - - # Add to completed if not discarded - if (key not in ajet_remote_handler_discarded) or (timeline_uuid not in ajet_remote_handler_discarded[key]): - # openai_response should already be a ChatCompletion object if client sent pickle - ajet_remote_handler_completed[key][timeline_uuid] = openai_response - - except WebSocketDisconnect: - stop_event.set() - try: await websocket.close() - except: pass - return + logger.exception(f"Error in SSE generator: {e}") - except Exception as e: + finally: stop_event.set() - try: await websocket.close() - except: pass - logger.exception(f"Error in websocket handler: {e}") - return + # Cleanup + if key in active_websockets: + active_websockets.pop(key) + + # Clean up any in-progress requests for this key could be here, or explicitly on reset/timeout + # Mirroring original finally block logic: + # Note: In SSE, we might not want to aggressively clear everything on disconnect if retries are expected, + # but the original code cleaned up on websocket disconnect. + if key: + for container in [ + ajet_remote_handler_received, + ajet_remote_handler_in_progress, + ajet_remote_handler_completed, + ]: + if key in container: + container.pop(key) + if key in ajet_remote_handler_discarded: + ajet_remote_handler_discarded.pop(key) -@app.websocket("/hook/context_tracker_client_listen") -async def context_tracker_client_listen(websocket: WebSocket): +@app.post("/hook/context_tracker_client_response") +async def context_tracker_client_response(key: str, response_data: bytes = Body(...)): """ - WebSocket endpoint for clients to listen for completion requests. - Clients send (agent_name, target_tag, episode_uuid) and receive requests to process. + Endpoint to receive processing results from the client. """ - await websocket.accept() - - key = "" try: - # Receive initial connection data ( - # ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py - # await websocket.send(f"episode_uuid:{self.episode_uuid}")) - episode_uuid_str = pickle.loads(await websocket.receive_bytes()) - assert episode_uuid_str.startswith("episode_uuid:") - episode_uuid = episode_uuid_str.split("episode_uuid:")[-1] + # Decode response + # The client sends pickled ChatCompletion object or "terminate" string + try: + openai_response = pickle.loads(response_data) + except Exception as e: + logger.error(f"Pickle load failed: {e}") + # Try assuming it might not be pickled if we change client, but let's stick to pickle for complex objects + raise HTTPException(status_code=400, detail="Invalid response format") + + if openai_response == "terminate": + # Handle termination signal if needed, though usually handled by disconnect + if key in active_websockets: + active_websockets[key].set() + return {"status": "terminated"} - # logger.warning(f"WebSocket client connected for episode_uuid: {episode_uuid}") + if not isinstance(openai_response, ChatCompletion): + logger.error(f"Invalid response object type: {type(openai_response)}") + raise HTTPException(status_code=400, detail="Invalid response object") - key = f"episode_uuid:{episode_uuid}" - active_websockets[key] = websocket + timeline_uuid = openai_response.id - stop_event = asyncio.Event() - asyncio.create_task(coro_task_1_lookup_dict_received__send_loop(key, websocket, stop_event)) - asyncio.create_task(coro_task_2_lookup_dict_received__receive_loop(key, websocket, stop_event)) - await stop_event.wait() + if key in ajet_remote_handler_in_progress and timeline_uuid in ajet_remote_handler_in_progress[key]: + ajet_remote_handler_in_progress[key].pop(timeline_uuid) + + # Add to completed if not discarded + if (key not in ajet_remote_handler_discarded) or (timeline_uuid not in ajet_remote_handler_discarded[key]): + ajet_remote_handler_completed[key][timeline_uuid] = openai_response + + return {"status": "accepted"} except Exception as e: - logger.exception(f"Error in websocket connection setup: {e}") + logger.exception(f"Error in response handler: {e}") + raise HTTPException(status_code=500, detail=str(e)) - finally: - # logger.warning(f"WebSocket client disconnected for key: {key}") - if key: - # Clean up any in-progress requests for this key - for container in [ - ajet_remote_handler_received, - ajet_remote_handler_in_progress, - ajet_remote_handler_completed, - ]: - if key in container: - container.pop(key) - if key in ajet_remote_handler_discarded: - ajet_remote_handler_discarded.pop(key) +@app.get("/hook/context_tracker_client_listen") +async def context_tracker_client_listen(request: Request, episode_uuid: str): + """ + SSE endpoint for clients to listen for completion requests. + """ + key = f"episode_uuid:{episode_uuid}" - if key in active_websockets: - websocket = active_websockets.pop(key) - try: await websocket.close() - except: pass + stop_event = asyncio.Event() + active_websockets[key] = stop_event # Storing stop_event instead of websocket + return StreamingResponse( + sse_event_generator(key, stop_event, request), + media_type="text/event-stream" + ) @app.post("/v1/chat/completions") async def chat_completions(request: Request, authorization: str = Header(None)): @@ -292,9 +280,9 @@ async def reset(): """ # logger.warning("Resetting interchange endpoint server state.") # Disconnect all websockets - for key, ws in list(active_websockets.items()): + for key, stop_event in list(active_websockets.items()): try: - await ws.close() + stop_event.set() except: pass @@ -385,10 +373,6 @@ async def serve_with_monitor(): host="0.0.0.0", port=self.port, log_level="error", - ws_max_queue=1024, - ws_ping_interval=60, - ws_ping_timeout=60, - ws_per_message_deflate=True, ) server = uvicorn.Server(config) await server.serve() @@ -449,6 +433,23 @@ def cleanup(): except subprocess.TimeoutExpired: process.kill() + # Wait for server to be ready + import httpx + health_url = f"http://localhost:{port}/health" + start_time = time.time() + while time.time() - start_time < 20: + if process.poll() is not None: + logger.error(f"Interchange server subprocess failed to start. Return code: {process.returncode}") + break + + try: + if httpx.get(health_url, timeout=0.5).status_code == 200: + break + except Exception: + pass + + time.sleep(0.5) + atexit.register(cleanup) logger.info(f"Interchange server subprocess started on port {port} (pid: {process.pid})") @@ -472,10 +473,6 @@ async def serve_with_monitor(): host="0.0.0.0", port=args.port, log_level="error", - ws_max_queue=1024, - ws_ping_interval=60, - ws_ping_timeout=60, - ws_per_message_deflate=True, ) server = uvicorn.Server(config) await server.serve() From 34d33bb5f919892f8c77e7d90ea4cf727e21c68b Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 04:02:58 +0800 Subject: [PATCH 433/462] update docs --- .../experimental/as_oai_model_client.py | 6 +- .../experimental/as_oai_model_server.py | 2 +- ajet/utils/lowlevel_hook.py | 47 +++++++++ docs/en/agent_framework_support.md | 22 ++++- docs/en/support_agentscope.md | 4 +- docs/en/support_http.md | 97 +++++++++++++++++++ docs/en/support_langchain.md | 88 +++++++++++++++++ docs/en/support_oaisdk.md | 93 ++++++++++++++++++ docs/stylesheets/responsive.css | 10 +- mkdocs.yml | 8 +- .../example_math_agent/math_agent_raw_http.py | 2 +- 11 files changed, 367 insertions(+), 12 deletions(-) create mode 100644 ajet/utils/lowlevel_hook.py create mode 100644 docs/en/support_http.md create mode 100644 docs/en/support_langchain.md create mode 100644 docs/en/support_oaisdk.md diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index babb6362..0121e2c4 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -149,7 +149,11 @@ async def _service_loop(self): continue try: - parsed_msg = InterchangeCompletionRequest.model_validate_json(data) + try: + parsed_msg = InterchangeCompletionRequest(**json.loads(data)) + except Exception as e: + logger.error(f"Failed to parse SSE event data: {e}" + data) + continue result = await self.llm_infer( req=parsed_msg.completion_request, diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index b061d9e0..e70997ff 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -250,7 +250,7 @@ async def chat_completions(request: Request, authorization: str = Header(None)): ajet_remote_handler_received[key][timeline_uuid] = int_req # Wait for response (with periodic checks for client disconnect) - max_wait_time = 1800 # 30 minutes timeout + max_wait_time = 600 # 10 minutes timeout elapsed_time = 0 try: diff --git a/ajet/utils/lowlevel_hook.py b/ajet/utils/lowlevel_hook.py new file mode 100644 index 00000000..bdd536d0 --- /dev/null +++ b/ajet/utils/lowlevel_hook.py @@ -0,0 +1,47 @@ +# def patch_task_creation(): +# pass + + +import inspect +import asyncio +from functools import wraps + +def patch_task_creation(): + # Hook asyncio.create_task + original_create_task = asyncio.create_task + + @wraps(original_create_task) + def debug_create_task(coro, name=None, **kwargs): + if not name: + caller = inspect.stack()[1] + coro_name = getattr(coro, '__name__', str(coro)) + name = f"DEBUG_{coro_name}_at_{caller.filename.split('/')[-1]}:{caller.lineno}" + print(f"🎯 asyncio.create_task: {name}") + return original_create_task(coro, name=name, **kwargs) + + # Hook loop.create_task + original_loop_create_task = asyncio.AbstractEventLoop.create_task + + def debug_loop_create_task(self, coro, name=None, context=None): + if not name: + caller = inspect.stack()[1] + coro_name = getattr(coro, '__name__', str(coro)) + name = f"DEBUG_{coro_name}_at_{caller.filename.split('/')[-1]}:{caller.lineno}" + print(f"🎯 loop.create_task: {name}") + return original_loop_create_task(self, coro, name=name, context=context) + + # Hook Task.__init__ + original_task_init = asyncio.Task.__init__ + + def debug_task_init(self, coro, loop=None, name=None, context=None): + if not name: + caller = inspect.stack()[2] # 需要往上找更远的调用者 + coro_name = getattr(coro, '__name__', str(coro)) + name = f"DEBUG_{coro_name}_at_{caller.filename.split('/')[-1]}:{caller.lineno}" + print(f"🎯 Task.__init__: {name}") + return original_task_init(self, coro, loop=loop, name=name, context=context) + + asyncio.create_task = debug_create_task + asyncio.AbstractEventLoop.create_task = debug_loop_create_task + +patch_task_creation() \ No newline at end of file diff --git a/docs/en/agent_framework_support.md b/docs/en/agent_framework_support.md index e1f1be92..8f9e0135 100644 --- a/docs/en/agent_framework_support.md +++ b/docs/en/agent_framework_support.md @@ -1,8 +1,9 @@ # Agent Framework Support +AgentJet currently supports (and has been tested with) the following agentic frameworks.
    - +

    AgentScope

    @@ -11,7 +12,7 @@ Agent-Oriented Programming for Building LLM Applications.

    - +

    LangChain

    @@ -20,8 +21,8 @@ LangChain provides the engineering platform and open source frameworks developers use to build, test, and deploy reliable AI agents.

    - -
    +

    OpenAI SDK

    @@ -29,7 +30,7 @@ The OpenAI Agents SDK allows you to build agentic AI applications in a lightweight and easy-to-use package with minimal abstractions. By the way, both vLLM and SGLang offer compatible services.

    - + diff --git a/docs/en/support_agentscope.md b/docs/en/support_agentscope.md index 6aac51a9..f91eedd1 100644 --- a/docs/en/support_agentscope.md +++ b/docs/en/support_agentscope.md @@ -23,7 +23,7 @@ This article introduce the way to convert different types of ways to convert you ) ``` -=== "After Convertion (`as_agentscope_model`)" +=== "After Convertion (`as_agentscope_model()`)" ```python model = tuner.as_agentscope_model() # 🛩️ change here @@ -35,7 +35,7 @@ This article introduce the way to convert different types of ways to convert you ) ``` -=== "After Convertion (`as_agentscope_model`)" +=== "After Convertion (`as_oai_baseurl_apikey()`)" ```python url_and_apikey = tuner.as_oai_baseurl_apikey() diff --git a/docs/en/support_http.md b/docs/en/support_http.md new file mode 100644 index 00000000..05023116 --- /dev/null +++ b/docs/en/support_http.md @@ -0,0 +1,97 @@ +# Without Any Agentic Framework + +Why use the Agent SDKs and all these abstractions? If you want to take control of the foundation of LLM Agents, +in this AI era, you can always start from scratch and build your own "high-scrapers". + +## Http + +- use `tuner.as_oai_baseurl_apikey()` to obtain baseurl + apikey arguments + +### Explain with examples + +=== "Before Convertion" + + ```python + # tuner to api key + base_url = "https://openrouter.ai/api/v1" + api_key = "sk-1234567" + + # take out query + query = workflow_task.task.main_query + + messages = [ + { + "role": "system", + "content": self.system_prompt + }, + { + "role": "user", + "content": query + } + ] + + # use raw http requests (non-streaming) to get response + response = requests.post( + f"{base_url}/chat/completions", + json={ + "model": "fill_whatever_model", # Of course, this `model` field will be ignored. + "messages": messages, + }, + headers={ + "Authorization": f"Bearer {api_key}" + } + ) + final_answer = response.json()['choices'][0]['message']['content'] + ``` + +=== "After Convertion (`as_oai_baseurl_apikey`)" + + ```python + # tuner to api key + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key + + # take out query + query = workflow_task.task.main_query + + messages = [ + { + "role": "system", + "content": self.system_prompt + }, + { + "role": "user", + "content": query + } + ] + + # use raw http requests (non-streaming) to get response + response = requests.post( + f"{base_url}/chat/completions", + json={ + "model": "fill_whatever_model", # Of course, this `model` field will be ignored. + "messages": messages, + }, + headers={ + "Authorization": f"Bearer {api_key}" + } + ) + final_answer = response.json()['choices'][0]['message']['content'] + ``` + + + +!!! warning "" + - when you are using the `tuner.as_oai_baseurl_apikey()` api, you must enable the following feature in the yaml configuration. + + ```yaml + + ajet: + ... + enable_experimental_reverse_proxy: True + ... + + ``` + + diff --git a/docs/en/support_langchain.md b/docs/en/support_langchain.md new file mode 100644 index 00000000..7bc99810 --- /dev/null +++ b/docs/en/support_langchain.md @@ -0,0 +1,88 @@ +# Supported Agent Frameworks: AgentScope + +This article introduce the way to convert different types of ways to convert your existing workflows into AgentJet workflows. + + +## AgentScope + +1. use `tuner.as_oai_baseurl_apikey()` to override OpenAIChatModel's baseurl + apikey argument + +### Explain with examples + +=== "Before Convertion" + + ```python + from langchain_openai import ChatOpenAI + + + + + # create openai model + llm = ChatOpenAI( + model="gpt-5", + ) + agent=create_agent( + model=llm, + system_prompt=self.system_prompt, + ) + + # take out query + query = workflow_task.task.main_query + + response = agent.invoke({ + "messages": [ + { + "role": "user", + "content": query + } + ], + }) + ``` + +=== "After Convertion (`as_oai_baseurl_apikey`)" + + ```python + from langchain_openai import ChatOpenAI + + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key + + llm = ChatOpenAI( + model="whatever", + base_url=base_url, + api_key=lambda:api_key, + ) + agent = create_agent( + model=llm, + system_prompt=self.system_prompt, + ) + + # take out query + query = workflow_task.task.main_query + + response = agent.invoke({ + "messages": [ + { + "role": "user", + "content": query + } + ], + }) + ``` + + + +!!! warning "" + - when you are using the `tuner.as_oai_baseurl_apikey()` api, you must enable the following feature in the yaml configuration. + + ```yaml + + ajet: + ... + enable_experimental_reverse_proxy: True + ... + + ``` + + diff --git a/docs/en/support_oaisdk.md b/docs/en/support_oaisdk.md new file mode 100644 index 00000000..bffb02ef --- /dev/null +++ b/docs/en/support_oaisdk.md @@ -0,0 +1,93 @@ +# Supported Agent Frameworks: AgentScope + +This article introduce the way to convert different types of ways to convert your existing workflows into AgentJet workflows. + + +## AgentScope + +1. use `tuner.as_raw_openai_sdk_client()` to create a openai SDK + +2. use `tuner.as_oai_baseurl_apikey()` to override openai SDK's baseurl + apikey argument + +### Explain with examples + +=== "Before Convertion" + + ```python + import openai + client = openai.OpenAI(api_key='sk-123456') + messages = [ + { + "role": "system", + "content": self.system_prompt + }, + { + "role": "user", + "content": query + } + ] + reply_message: ChatCompletion = await client.chat.completions.create(messages=messages) + final_answer = reply_message.choices[0].message.content + ``` + +=== "After Convertion (`as_raw_openai_sdk_client`)" + + ```python + + client = tuner.as_raw_openai_sdk_client() + messages = [ + { + "role": "system", + "content": self.system_prompt + }, + { + "role": "user", + "content": query + } + ] + reply_message: ChatCompletion = await client.chat.completions.create(messages=messages) + final_answer = reply_message.choices[0].message.content + ``` + + +=== "After Convertion (`as_oai_baseurl_apikey`)" + + ```python + import openai + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key + + client = openai.OpenAI(api_key=api_key, base_url=base_url) + + messages = [ + { + "role": "system", + "content": self.system_prompt + }, + { + "role": "user", + "content": query + } + ] + reply_message: ChatCompletion = await client.chat.completions.create(messages=messages) + final_answer = reply_message.choices[0].message.content + ``` + + + + + !!! warning "" + - when you are using the `tuner.as_oai_baseurl_apikey()` api, you must enable the following feature in the yaml configuration. + + ```yaml + + ajet: + ... + enable_experimental_reverse_proxy: True + ... + + ``` + + + diff --git a/docs/stylesheets/responsive.css b/docs/stylesheets/responsive.css index 2d4a3465..aaff98d9 100644 --- a/docs/stylesheets/responsive.css +++ b/docs/stylesheets/responsive.css @@ -55,6 +55,15 @@ article .typography h2 { margin-top: calc(var(--spacing) * 20); } +/* 如果你可以添加自定义类 */ +[data-slot="sidebar-menu-button"] { + white-space: nowrap !important; +} + + +/* :root { + --sidebar-width: 30rem; +} */ /* * Responsive Enhancements for OpenJudge Documentation @@ -1062,4 +1071,3 @@ article img, right: max(2rem, calc(env(safe-area-inset-right) + 0.5rem)); } } - diff --git a/mkdocs.yml b/mkdocs.yml index a449367a..2ecbac36 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -29,7 +29,7 @@ nav: - Installation: en/installation.md - Quick Start: en/quickstart.md - Tune Your First Agent: en/tune_your_first_agent.md - - AgentScope Support: en/support_agentscope.md + - Agentic Frameworks: en/agent_framework_support.md - Examples: - Math Agent: en/example_math_agent.md @@ -44,6 +44,12 @@ nav: - Data Pipeline: en/data_pipeline.md - Task Judger: en/task_judger.md + - Supported Frameworks: + - AgentScope: en/support_agentscope.md + - Langchain: en/support_langchain.md + - OpenAI SDK: en/support_oaisdk.md + - Raw HTTP: en/support_http.md + - Deep Dive: - Configuration: en/configuration.md - Visualization: en/visualization.md diff --git a/tutorial/example_math_agent/math_agent_raw_http.py b/tutorial/example_math_agent/math_agent_raw_http.py index e0ed999e..6608e2be 100644 --- a/tutorial/example_math_agent/math_agent_raw_http.py +++ b/tutorial/example_math_agent/math_agent_raw_http.py @@ -48,7 +48,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl response = requests.post( f"{base_url}/chat/completions", json={ - "model": "fill_whatever_model", # Of course, this `model` field will be ignored. + "model": "whatever", # Of course, this `model` field will be ignored. "messages": messages, }, headers={ From 333c94b3a4e8ae48f37fc4f8bae0bf1fae18c504 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 04:34:07 +0800 Subject: [PATCH 434/462] fix doc url --- .gitignore | 1 + README.md | 8 +++++--- mkdocs.yml | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 47499aed..70bf5ad2 100644 --- a/.gitignore +++ b/.gitignore @@ -150,3 +150,4 @@ saved_checkpoints data datasets tutorial2 +site \ No newline at end of file diff --git a/README.md b/README.md index 7c08eca9..8fc86b3c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ -# AgentJet +# AgentJet (Beta) [![Benchmarking](https://img.shields.io/badge/Benchmarking-0078D4?style=for-the-badge&logo=github)](https://benchmark.agent-matrix.com/) -[![Docs](https://img.shields.io/badge/Docs-Read%20the%20Guide-0A7ECC?style=for-the-badge&logo=readthedocs&logoColor=white)](https://doc.agentjet.top/AgentJet) +[![Docs](https://img.shields.io/badge/Docs-Read%20the%20Documents-0A7ECC?style=for-the-badge&logo=readthedocs&logoColor=white)](https://doc.agentjet.top/AgentJet) [![License](https://img.shields.io/badge/License-Apache--2.0-4c1?style=for-the-badge)](LICENSE) [![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://doc.agentjet.top/AgentJet/en/installation#requirements)
    -AgentJet + + AgentJet +
    diff --git a/mkdocs.yml b/mkdocs.yml index 2ecbac36..386421f8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ site_name: AgentJet -site_url: https://agentscope-ai.github.io/AgentJet/ +site_url: https://doc.agentjet.top/ site_description: "A cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes." site_author: "Alibaba Tongyi Lab" repo_url: https://github.com/modelscope/AgentJet From 9389d31f3877502bbc6a545fc2afd38d151fa9fa Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 04:59:01 +0800 Subject: [PATCH 435/462] minor css adjustment --- docs/stylesheets/responsive.css | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/stylesheets/responsive.css b/docs/stylesheets/responsive.css index aaff98d9..251965d7 100644 --- a/docs/stylesheets/responsive.css +++ b/docs/stylesheets/responsive.css @@ -60,10 +60,20 @@ article .typography h2 { white-space: nowrap !important; } +/* 方法3:如果上面不生效,使用更具体的选择器 */ +div[data-slot="sidebar-content"].no-scrollbar { + scrollbar-width: thin !important; +} -/* :root { - --sidebar-width: 30rem; -} */ +div[data-slot="sidebar-content"].no-scrollbar::-webkit-scrollbar { + display: block !important; + width: 1px !important; +} + +.sidebar .text-sidebar-foreground, +div.text-sidebar-foreground.sticky { + height: calc(100svh - var(--header-height) - 20px) !important; +} /* * Responsive Enhancements for OpenJudge Documentation From 836e380fbde8b45333345bb66be4b324665214e3 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 16:01:04 +0800 Subject: [PATCH 436/462] refactor: clean up unused imports and add text extraction method in MultiAgentContextTracker; add skip GPU check option in launcher --- ajet/context_tracker/multiagent_tracking.py | 128 +++++++++----------- ajet/launcher.py | 3 +- ajet/schema/extended_msg.py | 2 + 3 files changed, 59 insertions(+), 74 deletions(-) diff --git a/ajet/context_tracker/multiagent_tracking.py b/ajet/context_tracker/multiagent_tracking.py index 355a7726..73b9d49a 100644 --- a/ajet/context_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/multiagent_tracking.py @@ -20,15 +20,7 @@ from ajet.utils.color_hsl import adjust_color_hsl from ajet.utils.compute_madness import compute_string_madness from ajet.utils.tokenizer import ajet_apply_chat_template -# -from ajet.utils.msg_converter import ( - convert_grouped_steps_to_openai_format, - convert_ext_msg_to_openai_format, - agentscope_to_openai, - openai_to_agentscope, - agentscope_to_openai_grouped, - openai_to_agentscope_grouped, -) + @dataclass class TimelineMergingPolicyConfig: timeline_compare_level: str = "text" @@ -82,6 +74,40 @@ def preprocess_tools_field(self, tools: List[dict] = [], disable_toolcalls: bool tools[i]["function"]["parameters"] = tools[i]["function"].pop("parameters") return tools + def extract_text_content_from_content_dict(self, msg): + # msg = { + # "role": "assistant", + # "content": [ + # { + # "type": "text", + # "text": "some text" + # }, + # ], + # } + + str_content = "" + for item in msg["content"]: + # item = { + # "type": "text", + # "text": "some text" + # }, + + assert isinstance(item, dict), f"Unsupported non-dict item in message content: {item}. Full message: {msg}" + + if ("text" not in item): + logger.warning( + f"Non-text content in message content detected: {item}. Ignoring." + ) + should_skip_message = True + return str_content, should_skip_message + + if isinstance(item["text"], str): + str_content += str(item["text"]) + else: + str_content = "" + + should_skip_message = False + return str_content, should_skip_message def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_toolcalls: bool = False) -> List[ExtendedMessage]: """Spawn a timeline from messages. @@ -101,55 +127,32 @@ def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_to consider_roles.remove("tool") for i, msg in enumerate(messages): + if (disable_toolcalls) and (not isinstance(msg["content"], str)): continue + if msg["role"] not in consider_roles: continue + if not isinstance(msg["content"], str): author = "env" - ignore = False - str_content = "" - extracted_tool_call_id = "" - for item_idx, item in enumerate(msg["content"]): - if isinstance(item, dict) and item.get("type") == "tool_result": - is_tool_result_msg = True # 标记为 tool_result 消息 - # Extract tool_call_id from the tool_result block - if item.get("id"): - extracted_tool_call_id = item.get("id", "") - output = item.get("output", "") - if isinstance(output, str): - str_content += output - elif isinstance(output, list): - # output can be List[TextBlock | ImageBlock | AudioBlock] - for out_item in output: - if isinstance(out_item, str): - str_content += out_item - elif isinstance(out_item, dict) and "text" in out_item: - str_content += str(out_item["text"]) - else: - str_content += str(output) - elif isinstance(item, dict) and "text" in item: - if isinstance(item["text"], str): - str_content += str(item["text"]) - else: - str_content = "" - else: - logger.warning( - f"Non-text content in message content detected: {item}. Ignoring." - ) - ignore = True - break - msg["content"] = str_content - msg["tool_call_id"] = extracted_tool_call_id # Store extracted tool_call_id - - # ★ 关键修复:如果是 tool_result 消息,将 role 恢复为 "tool"(OpenAI 格式) - if is_tool_result_msg and extracted_tool_call_id: - msg["role"] = "tool" - - - if ignore: + should_skip_message = False + + # fix msg content + if msg["content"] is None: + msg["content"] = "" + + elif isinstance(msg["content"], list): + msg["content"], should_skip_message = self.extract_text_content_from_content_dict(msg) + + else: + raise ValueError(f"Unsupported non-str message content type: {type(msg['content'])}, Message:\n {msg}") + + if should_skip_message: continue - msg["content"] = str(msg["content"]) # TODO: better handling mm data + + if not isinstance(msg["content"], str): + msg["content"] = str(msg["content"]) # TODO: better handling mm data if msg["role"] == "system": author = "initialization" @@ -169,6 +172,7 @@ def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_to tool_calls=(msg["tool_calls"] if "tool_calls" in msg else []), tool_call_id=(msg["tool_call_id"] if "tool_call_id" in msg else ""), token_generator="auto", + name = (msg["name"] if "name" in msg else ""), first_message=(i == 0), ) ] @@ -605,25 +609,3 @@ def check_context_token_num_safe( else: ret = (False, token_overflow, "token_overflow") return ret - - def get_grouped_steps_openai_format(self) -> List[List[Dict[str, Any]]]: - """ - 将 grouped_steps 转换为 OpenAI 格式并返回。 - - Returns: - OpenAI 格式的轨迹数据 (List of List of dict) - 每条消息格式如: - - {"role": "assistant", "content": "...", "tool_calls": [...]} - - {"role": "tool", "content": "...", "tool_call_id": "call_xxx"} - - {"role": "user/system", "content": "..."} - """ - return convert_grouped_steps_to_openai_format(self.grouped_steps) - - def get_full_context_openai_format(self) -> List[Dict[str, Any]]: - """ - 将当前 full_context 转换为 OpenAI 格式并返回。 - - Returns: - OpenAI 格式的消息列表 (List of dict) - """ - return [convert_ext_msg_to_openai_format(msg) for msg in self.full_context] diff --git a/ajet/launcher.py b/ajet/launcher.py index 023b520f..9053e16d 100644 --- a/ajet/launcher.py +++ b/ajet/launcher.py @@ -86,6 +86,7 @@ def parse_args(): help="Launch Crafters Env Simulation", ) parser.add_argument("--reboot", action="store_true", default=False, help="reboot flag") + parser.add_argument("--skip-check-avail-gpu", action="store_true", default=False, help="Skip GPU availability check") parser.add_argument( "--kill", type=str, @@ -305,7 +306,7 @@ def main(): if args.with_finworld: pty_launch("finworld") - + if args.with_crafters: pty_launch("crafters") diff --git a/ajet/schema/extended_msg.py b/ajet/schema/extended_msg.py index 1a1198c1..dfaa7460 100644 --- a/ajet/schema/extended_msg.py +++ b/ajet/schema/extended_msg.py @@ -74,6 +74,7 @@ def __init__( tool_calls=[], tool_call_id="", token_logprob_arr=[], + name="", # preserved field, not used currently first_message=False, ): self.author = author @@ -90,6 +91,7 @@ def __init__( self.tools = tools self.tool_calls = tool_calls self.tool_call_id = tool_call_id + self.name = name # preserved field, not used currently if not isinstance(self.tool_calls, list): # agent scope sometimes gives weird type for tool_calls, which is against OpenAI schema self.tool_calls = list(self.tool_calls) From 5977031debd72f6b9fcfc05482727c7692c11e5a Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 16:50:49 +0800 Subject: [PATCH 437/462] revise commit --- ajet/backbone/trainer_verl.py | 36 +----- ajet/context_tracker/base_tracker.py | 15 ++- ajet/context_tracker/multiagent_tracking.py | 2 - ajet/default_config/ajet_default.yaml | 29 ++++- ajet/launcher.py | 1 - ajet/schema/task.py | 1 + ajet/task_rollout/resource_keeper.py | 9 +- ajet/task_runner/general_runner.py | 34 +----- ajet/utils/metric_helper/__init__.py | 17 +++ .../metric_helper/save_trajectory_as_json.py | 56 ++++++++++ .../utils/metric_helper/tool_metric_helper.py | 44 ++++---- ajet/utils/msg_converter.py | 103 ++++++++---------- ajet/utils/save_trajectory.py | 80 -------------- 13 files changed, 192 insertions(+), 235 deletions(-) create mode 100644 ajet/utils/metric_helper/__init__.py create mode 100644 ajet/utils/metric_helper/save_trajectory_as_json.py delete mode 100644 ajet/utils/save_trajectory.py diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index c4592c1f..3cbb08ad 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -17,8 +17,6 @@ from collections import defaultdict from pprint import pprint from typing import List, Optional -from ajet.utils.metric_helper.reward_metric_helper import compute_reward_metrics_from_cmts -from loguru import logger as loguru_logger import hydra import numpy as np @@ -56,14 +54,7 @@ from ajet.schema.task import Task from ajet.task_reader import dict_to_ajet_task from ajet.task_rollout.native_parallel_worker import VerlRolloutManager -from ajet.utils.save_trajectory import save_train_trajectory, save_eval_trajectory -from ajet.utils.msg_converter import ( - convert_grouped_steps_to_openai_format, - convert_ext_msg_to_openai_format, - agentscope_to_openai, - openai_to_agentscope, -) -from ajet.utils.metric_helper.tool_metric_helper import compute_tool_metrics_from_cmts +from ajet.utils.metric_helper import save_trajectory_as_json_file, update_metrics def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | torch.Tensor: """ @@ -586,9 +577,6 @@ def fit(self): # noqa: C901 tasks, mode="sample", epoch=f"train.{epoch}" ) logger.info("=" * 10 + "end fit rollout" + "=" * 10) - - if self.config.ajet.trainer_common.save_trajectory: - save_train_trajectory(context_tracker_arr, self.global_steps) logger.info("begin to convert context_tracker_arr to dataproto") gen_batch_output = self.parallel_env.to_dataproto(context_tracker_arr) logger.info("end convertion") @@ -614,14 +602,8 @@ def fit(self): # noqa: C901 ), } ) - from ajet.utils.metric_helper.tool_metric_helper import compute_tool_metrics_from_trajectories - from ajet.utils.metric_helper.reward_metric_helper import compute_reward_metrics_from_trajectories - tool_metrics = compute_tool_metrics_from_trajectories(context_tracker_arr) - reward_metrics = compute_reward_metrics_from_trajectories(context_tracker_arr) - if tool_metrics: - metrics.update(tool_metrics) - if reward_metrics: - metrics.update(reward_metrics) + save_trajectory_as_json_file(context_tracker_arr, self.global_steps, self.config, prefix="train") + update_metrics(context_tracker_arr, metrics) if self.config.ajet.execute_test: # apply a test probe from swanlab.data.run.main import get_run @@ -1049,10 +1031,6 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): for ctx_tracker in ctx_trackers: ctx_tracker.generate_log() - # save eval trajectories - if self.config.ajet.trainer_common.save_trajectory: - save_eval_trajectory(ctx_trackers, self.global_steps) - rewards = [ctx_tracker.reward_structure.raw_reward for ctx_tracker in ctx_trackers] num_tasks = len(task_results) assert num_tasks == len(ctx_trackers) // pass_n @@ -1068,12 +1046,8 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): f"TGC@{pass_n}-all-pass": num_all_success_tasks / num_tasks, "mean_reward": sum(rewards) / len(rewards) if rewards else 0, } - reward_metrics = compute_reward_metrics_from_cmts(ctx_trackers, print_debug=True) - tool_metrics = compute_tool_metrics_from_cmts(ctx_trackers) - if tool_metrics: - val_metrics.update(reward_metrics) - if reward_metrics: - val_metrics.update(tool_metrics) + save_trajectory_as_json_file(ctx_trackers, self.global_steps, self.config, prefix="eval") + update_metrics(ctx_trackers, val_metrics) print_dict( val_metrics, narrow=True, diff --git a/ajet/context_tracker/base_tracker.py b/ajet/context_tracker/base_tracker.py index 4e14f595..0ff706fa 100644 --- a/ajet/context_tracker/base_tracker.py +++ b/ajet/context_tracker/base_tracker.py @@ -1,5 +1,6 @@ from typing import List, Tuple, Union from typing import List, Union, Tuple, Dict, Optional, Any +from ajet.schema.task import WorkflowTask from ajet.schema.extended_msg import ( INVALID_LOG_PROB_VALUE, @@ -111,10 +112,14 @@ def replace_token_ids( class BaseTracker(object): - def __init__(self, config, tokenizer, **kwargs): - self.task_batch_index = kwargs.get("task_batch_index", "undefined") - self.task_tag = kwargs.get("task_tag", "undefined") - self.task_id = kwargs.get("task_id", "undefined") + def __init__(self, config, tokenizer, workflow_task: WorkflowTask, **kwargs): + + self.workflow_task = workflow_task + self.task_batch_index = self.workflow_task.task_batch_index + self.task_tag = self.workflow_task.task_tag + self.task_id = self.workflow_task.task_id + self.episode_uuid = self.workflow_task.episode_uuid + self.config = config self.tokenizer = tokenizer self.saved_timelines: List[List[ExtendedMessage]] = [] @@ -136,7 +141,7 @@ def __init__(self, config, tokenizer, **kwargs): self.already_mad_flag: bool = False self.round_cnt = 0 self.generation_prompt_token = None - self.workflow_metadata: Optional[Dict[str, Any]] = None # Initialize workflow_metadata to store tool statistics + self.log_metrics: Optional[Dict[str, Union[float, List[float]]]] = None # Initialize workflow_metadata to store tool statistics assert ( self.config.ajet.data.max_prompt_length diff --git a/ajet/context_tracker/multiagent_tracking.py b/ajet/context_tracker/multiagent_tracking.py index 73b9d49a..4dd75ee1 100644 --- a/ajet/context_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/multiagent_tracking.py @@ -50,7 +50,6 @@ def __init__( config, should_interrupt_fn, generated_token_callback_fn, - episode_uuid: str, **kwargs, ): super().__init__(config, tokenizer, **kwargs) @@ -61,7 +60,6 @@ def __init__( self.output_kwargs = {} self.input_kwargs = {} self.timeline_cache = {} - self.episode_uuid = episode_uuid def preprocess_tools_field(self, tools: List[dict] = [], disable_toolcalls: bool = False): diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 01f566a7..ad4d6d50 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -231,30 +231,57 @@ ajet: # trainer common configurations trainer_common: + + # validation before training val_before_train: False val_pass_n: 4 + + # save and test frequency (in step) save_freq: 20 test_freq: 20 - save_trajectory: False # whether to save train/eval trajectories to JSON files + + # total training epochs total_epochs: 50 + nnodes: 1 n_gpus_per_node: 8 + + # logger selection logger: swanlab + + # algorithm setting algorithm: adv_estimator: grpo use_kl_in_reward: False + + # number of optimizer.step per big batch mini_batch_num: 1 + + # verl offload configs fsdp_config: param_offload: True optimizer_offload: True + + # learning rate optim: lr: 1e-6 + + # enable KL loss regularization use_kl_loss: True + + # kl divergence loss coefficient kl_loss_coef: 0.002 kl_loss_type: low_var_kl + + # Ulysses specific configs ulysses_sequence_parallel_size: 1 + + # base directory to save checkpoints checkpoint_base_dir: ./saved_checkpoints + # whether to save train/eval trajectories to JSON files + save_trajectory_as_json_file: False + diff --git a/ajet/launcher.py b/ajet/launcher.py index 9053e16d..73a347aa 100644 --- a/ajet/launcher.py +++ b/ajet/launcher.py @@ -16,7 +16,6 @@ from ajet.utils.pty import pty_launch set_loguru_default_color() -# load_dotenv() load_dotenv(override=False) diff --git a/ajet/schema/task.py b/ajet/schema/task.py index f93cff97..6d94796c 100644 --- a/ajet/schema/task.py +++ b/ajet/schema/task.py @@ -43,3 +43,4 @@ class WorkflowOutput(BaseModel): reward: Union[float, List[float], None] = Field(default=None) is_success: Union[bool, None] = Field(default=None) metadata: Dict[str, Any] = Field(default_factory=dict) + log_metrics: Dict[str, Union[float, List[float]]] = Field(default_factory=dict) diff --git a/ajet/task_rollout/resource_keeper.py b/ajet/task_rollout/resource_keeper.py index 408e7d28..2498b415 100644 --- a/ajet/task_rollout/resource_keeper.py +++ b/ajet/task_rollout/resource_keeper.py @@ -178,22 +178,23 @@ def step(self, action: dict) -> Tuple[str, float, bool, dict]: ) obs = "" assert isinstance(env_output, dict) - # === Support list-type state passthrough === - # 1. If state is a list (new standard format), pass through directly + if isinstance(env_output["state"], list): + # 1. If state is a list (new standard format), pass through directly obs = env_output["state"] - # 2. If state is a dict (old format or error) else: + # 2. If state is a dict (old format or error) if ("content" not in env_output["state"]) and ("error" in env_output["state"]): obs = f"[Error from environment: {env_output['error']}]" elif env_output["state"].get("content", "") == "": obs = "Warning: the environment does not provide any feedback, please provide valid inpu and try again." else: obs = env_output["state"]["content"] + reward = 0 info = {} terminate = env_output["is_terminated"] - return obs, reward, terminate, info + return obs, reward, terminate, info # type: ignore def reset(self) -> str: """Reset gym environment.""" diff --git a/ajet/task_runner/general_runner.py b/ajet/task_runner/general_runner.py index 7e0998bd..94271cbd 100644 --- a/ajet/task_runner/general_runner.py +++ b/ajet/task_runner/general_runner.py @@ -17,9 +17,6 @@ class GeneralRunner(BaseAgentRunner): def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: observation_window = workflow_task.observation_window task_thread_index = workflow_task.task_thread_index - task_batch_index = workflow_task.task_batch_index - task_tag = workflow_task.task_tag - task_id = workflow_task.task_id workflow_import = self.config.ajet.rollout.user_workflow workflow_cls = dynamic_import(workflow_import) @@ -34,10 +31,7 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: llm_inference_fn=self.llm_inference_fn, tokenizer=self.tokenizer, config=self.config, - task_batch_index=task_batch_index, - task_tag=task_tag, - task_id=task_id, - episode_uuid=workflow_task.episode_uuid, + workflow_task = workflow_task, **hooks, ) tuner = AjetTuner( @@ -46,12 +40,9 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: user_workflow=user_workflow, config=self.config, ) - workflow_output: WorkflowOutput = asyncio.run( user_workflow.execute(workflow_task, tuner) ) - # set workflow metadata to context tracker metadata - context_tracker.workflow_metadata = workflow_output.metadata if workflow_output.reward is not None: raw_reward, is_success = ( workflow_output.reward, @@ -59,25 +50,7 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: ) else: raw_reward, is_success = self.get_judge().compute_reward(workflow_task, workflow_output) - - # ✅ Critical Fix: After calling `judge`, write the updated `reward_stats` back to `workflow_metadata` - # # Ensure that `native_compat_trainer` reads the actual value calculated by `judge`, not the 0 value returned by `env`. - if workflow_output.metadata and 'reward_stats' in workflow_output.metadata: - context_tracker.workflow_metadata['reward_stats'] = workflow_output.metadata['reward_stats'] - else: - # fallback: If the judge does not update reward_stats, use the default value. - logger.warning(f"[WARN] reward_stats not found in metadata after judge call, creating default values") - default_reward_stats = { - 'original_reward': raw_reward, - 'penalty': 0.0, - 'step_reward': raw_reward, - } - if workflow_output.metadata: - workflow_output.metadata['reward_stats'] = default_reward_stats - context_tracker.workflow_metadata['reward_stats'] = default_reward_stats - else: - context_tracker.workflow_metadata = {'reward_stats': default_reward_stats} - + workflow_task.gym_env = None # clear gym env client reference to avoid serialization issue assert not isinstance( @@ -95,12 +68,11 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: ) context_tracker.process_reward(reward) # generate token before merging - context_tracker.task_id = task_id - context_tracker.task_tag = task_tag context_tracker.group_merge() # after merging, process and align reward again context_tracker.process_reward(reward) # mark the thread as ended observation_window["step"][task_thread_index] = -1 tuner.terminate_episode() + context_tracker.log_metrics = workflow_output.log_metrics return context_tracker diff --git a/ajet/utils/metric_helper/__init__.py b/ajet/utils/metric_helper/__init__.py new file mode 100644 index 00000000..176a7582 --- /dev/null +++ b/ajet/utils/metric_helper/__init__.py @@ -0,0 +1,17 @@ +from ajet.utils.metric_helper.save_trajectory_as_json import save_trajectory_as_json +from ajet.utils.metric_helper.tool_metric_helper import compute_tool_metrics_from_trajectories +from ajet.utils.metric_helper.reward_metric_helper import compute_reward_metrics_from_trajectories + + +def save_trajectory_as_json_file(ctx_trackers, global_steps, config, prefix): + if config.ajet.trainer_common.save_trajectory_as_json: + save_trajectory_as_json(ctx_trackers, global_steps, prefix) + +def update_metrics(context_tracker_arr, metrics:dict): + tool_metrics = compute_tool_metrics_from_trajectories(context_tracker_arr) + reward_metrics = compute_reward_metrics_from_trajectories(context_tracker_arr) + if tool_metrics: + metrics.update(tool_metrics) + if reward_metrics: + metrics.update(reward_metrics) + return \ No newline at end of file diff --git a/ajet/utils/metric_helper/save_trajectory_as_json.py b/ajet/utils/metric_helper/save_trajectory_as_json.py new file mode 100644 index 00000000..0e380abc --- /dev/null +++ b/ajet/utils/metric_helper/save_trajectory_as_json.py @@ -0,0 +1,56 @@ +import os +import json +from ajet.utils.msg_converter import convert_grouped_steps_to_openai_format + + +def save_trajectory_as_json(ctx_trackers, global_steps, prefix="train"): + """ + Save ctx_trackers to JSON files for either training or evaluation. + + Args: + ctx_trackers (list): List of context trackers containing trajectory data. + global_steps (int): The global step count to organize saved files. + prefix (str): Directory prefix indicating the type of trajectory ("train" or "eval"). + """ + for ctx_tracker in ctx_trackers: + # Determine task tag based on reward + reward = ctx_tracker.reward_structure.raw_reward + if reward >= 1: + ctx_tracker.tag = "success" + elif reward == 0: + ctx_tracker.tag = "failure" + else: + ctx_tracker.tag = "half_success" + + formatted_traj = convert_grouped_steps_to_openai_format(ctx_tracker.timeline_cache) + + # Prepare trajectory data + traj_data = { + "task_id": ctx_tracker.task_id, + "task_tag": ctx_tracker.tag, + "reward_structure": ctx_tracker.reward_structure.model_dump(), + "traj": formatted_traj + } + + # Extract reward_stats from workflow_metadata if available + if hasattr(ctx_tracker, 'workflow_metadata') and ctx_tracker.workflow_metadata: + if 'reward_stats' in ctx_tracker.workflow_metadata: + traj_data['reward_structure']['reward_stats'] = ctx_tracker.workflow_metadata['reward_stats'] + + # Define save directory and file path + traj_save_dir = os.path.join( + os.environ.get("BEST_LOGGER_PATH", "launcher_record"), + "ctx_trackers", + prefix, + f"step_{global_steps}" + ) + os.makedirs(traj_save_dir, exist_ok=True) + traj_file_path = os.path.join(traj_save_dir, f"{ctx_tracker.task_id}.json") + + # Save trajectory data to JSON file + with open(traj_file_path, "w", encoding="utf-8") as f: + json.dump(traj_data, f, ensure_ascii=False, indent=2) + + # Print confirmation for evaluation trajectories + if prefix != "train": + print(f"Saved trajectory to {traj_file_path}") \ No newline at end of file diff --git a/ajet/utils/metric_helper/tool_metric_helper.py b/ajet/utils/metric_helper/tool_metric_helper.py index 0e75d9e3..e9c7728d 100644 --- a/ajet/utils/metric_helper/tool_metric_helper.py +++ b/ajet/utils/metric_helper/tool_metric_helper.py @@ -18,10 +18,10 @@ def extract_tool_stats_from_trajectories(trajectories: List[Any]) -> List[Dict[str, Any]]: """ Extract tool_stats from trajectories list. - + Args: trajectories: List of trajectory objects containing workflow_metadata - + Returns: List of tool_stats dictionaries """ @@ -36,53 +36,53 @@ def extract_tool_stats_from_trajectories(trajectories: List[Any]) -> List[Dict[s def extract_tool_stats_from_cmts(cmts: List[Any]) -> List[Dict[str, Any]]: """ Extract tool_stats from cmts list. - + Args: cmts: List of cmt objects containing workflow_metadata - + Returns: List of tool_stats dictionaries """ tool_stats_list = [] - for cmt in cmts: - if hasattr(cmt, 'workflow_metadata') and cmt.workflow_metadata: - if 'tool_stats' in cmt.workflow_metadata: - tool_stats_list.append(cmt.workflow_metadata['tool_stats']) + for traj in trajs: + if hasattr(traj, 'workflow_metadata') and traj.workflow_metadata: + if 'tool_stats' in traj.workflow_metadata: + tool_stats_list.append(traj.workflow_metadata['tool_stats']) return tool_stats_list def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "") -> Dict[str, float]: """ Compute SwanLab metrics from tool_stats list. - + Args: tool_stats_list: List of tool_stats dictionaries prefix: Metric name prefix (e.g., "val/" for validation phase) - + Returns: Formatted metrics dictionary ready for SwanLab reporting """ if not tool_stats_list: return {} - + metrics = {} - + # ========== 1. Overall Statistics ========== total_calls_list = [stats.get('total_calls', 0) for stats in tool_stats_list] success_calls_list = [stats.get('success_calls', 0) for stats in tool_stats_list] error_calls_list = [stats.get('total_errors', 0) for stats in tool_stats_list] cache_hits_list = [stats.get('cache_hits', 0) for stats in tool_stats_list] cache_misses_list = [stats.get('cache_misses', 0) for stats in tool_stats_list] - + # Calculate overall success rate total_calls_sum = sum(total_calls_list) success_calls_sum = sum(success_calls_list) tool_success_rate = (success_calls_sum / total_calls_sum * 100) if total_calls_sum > 0 else 0.0 - + # Calculate overall cache hit rate cache_total = sum(cache_hits_list) + sum(cache_misses_list) cache_hit_rate = (sum(cache_hits_list) / cache_total * 100) if cache_total > 0 else 0.0 - + metrics.update({ f"{prefix}tool_stats/tool_success_rate": tool_success_rate, f"{prefix}tool_stats/tool_total_calls": float(np.mean(total_calls_list)), @@ -92,7 +92,7 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" f"{prefix}tool_stats/tool_cache_hits": float(np.mean(cache_hits_list)), f"{prefix}tool_stats/tool_cache_misses": float(np.mean(cache_misses_list)), }) - + # ========== 2. Time Consumption Statistics by Tool ========== tool_time_by_name = {} for stats in tool_stats_list: @@ -102,13 +102,13 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" tool_time_by_name[tool_name] = [] if isinstance(time_list, list): tool_time_by_name[tool_name].extend(time_list) - + for tool_name, time_list in tool_time_by_name.items(): if time_list: metrics[f"{prefix}tool_time/{tool_name}/mean"] = float(np.mean(time_list)) metrics[f"{prefix}tool_time/{tool_name}/max"] = float(np.max(time_list)) metrics[f"{prefix}tool_time/{tool_name}/count"] = len(time_list) - + # ========== 3. Cache Hit Rate by Tool ========== tool_cache_by_name = {} for stats in tool_stats_list: @@ -118,7 +118,7 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" tool_cache_by_name[tool_name] = {'hits': 0, 'misses': 0} tool_cache_by_name[tool_name]['hits'] += cache_info.get('hits', 0) tool_cache_by_name[tool_name]['misses'] += cache_info.get('misses', 0) - + for tool_name, cache_info in tool_cache_by_name.items(): hits = cache_info['hits'] misses = cache_info['misses'] @@ -128,7 +128,7 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" metrics[f"{prefix}tool_cache/{tool_name}/hit_rate"] = round(hit_rate, 2) metrics[f"{prefix}tool_cache/{tool_name}/hits"] = hits metrics[f"{prefix}tool_cache/{tool_name}/misses"] = misses - + # ========== 4. Error Rate by Tool ========== tool_error_by_name = {} for stats in tool_stats_list: @@ -138,7 +138,7 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" tool_error_by_name[tool_name] = {'calls': 0, 'errors': 0} tool_error_by_name[tool_name]['calls'] += error_info.get('calls', 0) tool_error_by_name[tool_name]['errors'] += error_info.get('errors', 0) - + for tool_name, error_info in tool_error_by_name.items(): calls = error_info['calls'] errors = error_info['errors'] @@ -147,7 +147,7 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" metrics[f"{prefix}tool_error/{tool_name}/error_rate"] = round(error_rate, 2) metrics[f"{prefix}tool_error/{tool_name}/calls"] = calls metrics[f"{prefix}tool_error/{tool_name}/errors"] = errors - + return metrics diff --git a/ajet/utils/msg_converter.py b/ajet/utils/msg_converter.py index d6a03d15..3f293d3b 100644 --- a/ajet/utils/msg_converter.py +++ b/ajet/utils/msg_converter.py @@ -32,10 +32,10 @@ def openai_to_agentscope_single(msg: Dict[str, Any]) -> Dict[str, Any]: """ Convert a single OpenAI format message to AgentScope format. - + Args: msg: Message dict in OpenAI format - + Returns: Message dict in AgentScope format """ @@ -43,7 +43,7 @@ def openai_to_agentscope_single(msg: Dict[str, Any]) -> Dict[str, Any]: content = msg.get("content", "") tool_calls = msg.get("tool_calls", []) tool_call_id = msg.get("tool_call_id", "") - + if tool_calls: # Assistant message contains tool_calls -> convert to ToolUseBlock format content_blocks = [] @@ -71,7 +71,7 @@ def openai_to_agentscope_single(msg: Dict[str, Any]) -> Dict[str, Any]: "role": "assistant", "content": content_blocks } - + elif role == "tool" and tool_call_id: # Tool return result -> convert to ToolResultBlock format tool_result_block = { @@ -84,7 +84,7 @@ def openai_to_agentscope_single(msg: Dict[str, Any]) -> Dict[str, Any]: "role": "user", # tool_result in AgentScope is treated as user message "content": [tool_result_block] } - + else: # Normal message, keep original format return { @@ -97,27 +97,27 @@ def openai_to_agentscope_single(msg: Dict[str, Any]) -> Dict[str, Any]: def openai_to_agentscope(messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: """ Convert OpenAI format message list to AgentScope format. - + Args: messages: Message list in OpenAI format - + Returns: Message list in AgentScope format """ return [openai_to_agentscope_single(msg) for msg in messages] -def openai_to_agentscope_grouped(grouped_steps: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]: +def openai_to_agentscope_grouped(timelines: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]: """ - Convert grouped_steps (multi-turn conversation steps) from OpenAI format to AgentScope format. - + Convert timelines (multi-turn conversation steps) from OpenAI format to AgentScope format. + Args: - grouped_steps: List of List of dict in OpenAI format - + timelines: List of List of dict in OpenAI format + Returns: Trajectory data in AgentScope format """ - return [[openai_to_agentscope_single(msg) for msg in step] for step in grouped_steps] + return [[openai_to_agentscope_single(msg) for msg in step] for step in timelines] # ============================================================================= @@ -127,23 +127,23 @@ def openai_to_agentscope_grouped(grouped_steps: List[List[Dict[str, Any]]]) -> L def agentscope_to_openai_single(msg: Dict[str, Any]) -> Dict[str, Any]: """ Convert a single AgentScope format message to OpenAI format. - + Args: msg: Message dict in AgentScope format - + Returns: Message dict in OpenAI format """ role = msg.get("role", "user") content = msg.get("content", "") - + # If content is string, return directly if isinstance(content, str): return { "role": role, "content": content } - + # If content is list (AgentScope block format) if isinstance(content, list): text_parts = [] @@ -151,17 +151,17 @@ def agentscope_to_openai_single(msg: Dict[str, Any]) -> Dict[str, Any]: tool_call_id = "" tool_output = "" is_tool_result = False - + for item in content: if not isinstance(item, dict): continue - + item_type = item.get("type", "") - + if item_type == "text": # TextBlock text_parts.append(item.get("text", "")) - + elif item_type == "tool_use": # ToolUseBlock -> tool_calls arguments = item.get("input", {}) @@ -175,7 +175,7 @@ def agentscope_to_openai_single(msg: Dict[str, Any]) -> Dict[str, Any]: "arguments": arguments } }) - + elif item_type == "tool_result": # ToolResultBlock -> tool response is_tool_result = True @@ -185,7 +185,7 @@ def agentscope_to_openai_single(msg: Dict[str, Any]) -> Dict[str, Any]: tool_output += output else: tool_output += str(output) - + # Build OpenAI format based on parsing result if is_tool_result and tool_call_id: return { @@ -205,7 +205,7 @@ def agentscope_to_openai_single(msg: Dict[str, Any]) -> Dict[str, Any]: "role": role, "content": "".join(text_parts) if text_parts else "" } - + # Otherwise, return as is return { "role": role, @@ -216,27 +216,27 @@ def agentscope_to_openai_single(msg: Dict[str, Any]) -> Dict[str, Any]: def agentscope_to_openai(messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: """ Convert AgentScope format message list to OpenAI format. - + Args: messages: Message list in AgentScope format - + Returns: Message list in OpenAI format """ return [agentscope_to_openai_single(msg) for msg in messages] -def agentscope_to_openai_grouped(grouped_steps: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]: +def agentscope_to_openai_grouped(timelines: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]: """ - Convert grouped_steps (multi-turn conversation steps) from AgentScope format to OpenAI format. - + Convert timelines (multi-turn conversation steps) from AgentScope format to OpenAI format. + Args: - grouped_steps: List of List of dict in AgentScope format - + timelines: List of List of dict in AgentScope format + Returns: Trajectory data in OpenAI format """ - return [[agentscope_to_openai_single(msg) for msg in step] for step in grouped_steps] + return [[agentscope_to_openai_single(msg) for msg in step] for step in timelines] # ============================================================================= @@ -246,10 +246,10 @@ def agentscope_to_openai_grouped(grouped_steps: List[List[Dict[str, Any]]]) -> L def convert_ext_msg_to_openai_format(ext_msg: Any) -> Dict[str, Any]: """ Convert a single ExtendedMessage or dict to OpenAI format message. - + Args: ext_msg: ExtendedMessage object or dict - + Returns: Message dict in OpenAI format """ @@ -260,19 +260,19 @@ def get_attr(obj, attr_name, default=None): elif isinstance(obj, dict): return obj.get(attr_name, default) return default - + # Check if there are tool_calls (assistant initiates tool call) tool_calls = get_attr(ext_msg, 'tool_calls') has_tool_calls = bool(tool_calls) - + # Check if there's tool_call_id (tool return result) tool_call_id = get_attr(ext_msg, 'tool_call_id') has_tool_call_id = bool(tool_call_id) - + # Get basic attributes role = get_attr(ext_msg, 'role', 'user') content = get_attr(ext_msg, 'content', '') - + if has_tool_calls: # Assistant message contains tool_calls -> keep OpenAI format msg_dict = { @@ -293,38 +293,25 @@ def get_attr(obj, attr_name, default=None): "role": role, "content": content if content else "" } - + return msg_dict -def convert_grouped_steps_to_openai_format(grouped_steps: List[List[Any]]) -> List[List[Dict[str, Any]]]: +def convert_grouped_steps_to_openai_format(timelines: List[List[Any]]) -> List[List[Dict[str, Any]]]: """ - Convert grouped_steps (multi-turn conversation steps) to OpenAI format. - + Convert timelines (multi-turn conversation steps) to OpenAI format. + Args: - grouped_steps: List of List of ExtendedMessage or dict - + timelines: List of List of ExtendedMessage or dict + Returns: Trajectory data in OpenAI format (List of List of dict) """ formatted_traj = [] - for context in grouped_steps: + for context in timelines: step_msgs = [] for ext_msg in context: msg_dict = convert_ext_msg_to_openai_format(ext_msg) step_msgs.append(msg_dict) formatted_traj.append(step_msgs) return formatted_traj - - -def convert_flat_messages_to_openai_format(messages: List[Any]) -> List[Dict[str, Any]]: - """ - Convert flat message list to OpenAI format. - - Args: - messages: List of ExtendedMessage or dict - - Returns: - Message list in OpenAI format (List of dict) - """ - return [convert_ext_msg_to_openai_format(msg) for msg in messages] diff --git a/ajet/utils/save_trajectory.py b/ajet/utils/save_trajectory.py deleted file mode 100644 index 4dcc3172..00000000 --- a/ajet/utils/save_trajectory.py +++ /dev/null @@ -1,80 +0,0 @@ -import os -import json -from ajet.utils.msg_converter import convert_grouped_steps_to_openai_format - - -def save_train_trajectory(ctx_trackers, global_steps): - """Save training ctx_trackers to JSON files.""" - for ctx_tracker in ctx_trackers: - reward = ctx_tracker.reward_structure.raw_reward - if reward >= 1: - ctx_tracker.tag = "success" - elif reward == 0: - ctx_tracker.tag = "failure" - else: - ctx_tracker.tag = "half_success" - - # Use unified conversion function to convert grouped_steps to OpenAI format - if hasattr(ctx_tracker, 'get_grouped_steps_openai_format'): - formatted_traj = ctx_tracker.get_grouped_steps_openai_format() - else: - formatted_traj = convert_grouped_steps_to_openai_format(ctx_tracker.grouped_steps) - - traj_data = { - "task_id": ctx_tracker.task_id, - "task_tag": ctx_tracker.tag, - "reward_structure": ctx_tracker.reward_structure.model_dump(), - "traj": formatted_traj - } - # Extract reward_stats from workflow_metadata - if hasattr(ctx_tracker, 'workflow_metadata') and ctx_tracker.workflow_metadata: - if 'reward_stats' in ctx_tracker.workflow_metadata: - traj_data['reward_structure']['reward_stats'] = ctx_tracker.workflow_metadata['reward_stats'] - - traj_save_dir = os.path.join( - os.environ.get("BEST_LOGGER_PATH", "launcher_record"), - "ctx_trackers", - "train", - f"step_{global_steps}" - ) - os.makedirs(traj_save_dir, exist_ok=True) - traj_file_path = os.path.join(traj_save_dir, f"{ctx_tracker.task_id}.json") - - with open(traj_file_path, "w", encoding="utf-8") as f: - json.dump(traj_data, f, ensure_ascii=False, indent=2) - - -def save_eval_trajectory(ctx_trackers, global_steps): - """Save evaluation ctx_trackers to JSON files.""" - for ctx_tracker in ctx_trackers: - # Use unified conversion function to convert grouped_steps to OpenAI format - if hasattr(ctx_tracker, 'get_grouped_steps_openai_format'): - formatted_traj = ctx_tracker.get_grouped_steps_openai_format() - else: - formatted_traj = convert_grouped_steps_to_openai_format(ctx_tracker.grouped_steps) - - traj_data = { - "task_id": ctx_tracker.task_id, - "task_tag": ctx_tracker.tag, - "reward_structure": ctx_tracker.reward_structure.model_dump(), - "traj": formatted_traj - } - - # Extract reward_stats from workflow_metadata - if hasattr(ctx_tracker, 'workflow_metadata') and ctx_tracker.workflow_metadata: - if 'reward_stats' in ctx_tracker.workflow_metadata: - traj_data['reward_structure']['reward_stats'] = ctx_tracker.workflow_metadata['reward_stats'] - - traj_save_dir = os.path.join( - os.environ.get("BEST_LOGGER_PATH", "launcher_record"), - "ctx_trackers", - "val", - f"step_{global_steps}" - ) - os.makedirs(traj_save_dir, exist_ok=True) - traj_file_path = os.path.join(traj_save_dir, f"{ctx_tracker.task_id}.json") - - with open(traj_file_path, "w", encoding="utf-8") as f: - json.dump(traj_data, f, ensure_ascii=False, indent=2) - - print(f"Saved trajectory to {traj_file_path}") \ No newline at end of file From c10e96a8817c844c3caad4a97ce31aaeedd7427d Mon Sep 17 00:00:00 2001 From: "taoshuchang.tsc" Date: Tue, 13 Jan 2026 17:01:11 +0800 Subject: [PATCH 438/462] refactor(utils): remove meesage trasformation between OpenAI, AgentScope --- ajet/utils/msg_converter.py | 213 ------------------------------------ 1 file changed, 213 deletions(-) diff --git a/ajet/utils/msg_converter.py b/ajet/utils/msg_converter.py index 3f293d3b..0437f5ca 100644 --- a/ajet/utils/msg_converter.py +++ b/ajet/utils/msg_converter.py @@ -25,219 +25,6 @@ from typing import List, Dict, Any, Union -# ============================================================================= -# OpenAI -> AgentScope conversion -# ============================================================================= - -def openai_to_agentscope_single(msg: Dict[str, Any]) -> Dict[str, Any]: - """ - Convert a single OpenAI format message to AgentScope format. - - Args: - msg: Message dict in OpenAI format - - Returns: - Message dict in AgentScope format - """ - role = msg.get("role", "user") - content = msg.get("content", "") - tool_calls = msg.get("tool_calls", []) - tool_call_id = msg.get("tool_call_id", "") - - if tool_calls: - # Assistant message contains tool_calls -> convert to ToolUseBlock format - content_blocks = [] - # If there's text content, add TextBlock first - if content: - content_blocks.append({"type": "text", "text": content}) - # Convert each tool_call to ToolUseBlock - for tc in tool_calls: - func_info = tc.get("function", {}) if isinstance(tc.get("function"), dict) else {} - tool_use_block = { - "type": "tool_use", - "id": tc.get("id", ""), - "name": func_info.get("name", ""), - "input": func_info.get("arguments", "{}") - } - # Try to parse arguments as dict - if isinstance(tool_use_block["input"], str): - try: - tool_use_block["input"] = json.loads(tool_use_block["input"]) - except: - pass - content_blocks.append(tool_use_block) - return { - "name": "assistant", - "role": "assistant", - "content": content_blocks - } - - elif role == "tool" and tool_call_id: - # Tool return result -> convert to ToolResultBlock format - tool_result_block = { - "type": "tool_result", - "id": tool_call_id, - "output": content - } - return { - "name": "tool", - "role": "user", # tool_result in AgentScope is treated as user message - "content": [tool_result_block] - } - - else: - # Normal message, keep original format - return { - "name": role, - "role": role, - "content": content - } - - -def openai_to_agentscope(messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: - """ - Convert OpenAI format message list to AgentScope format. - - Args: - messages: Message list in OpenAI format - - Returns: - Message list in AgentScope format - """ - return [openai_to_agentscope_single(msg) for msg in messages] - - -def openai_to_agentscope_grouped(timelines: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]: - """ - Convert timelines (multi-turn conversation steps) from OpenAI format to AgentScope format. - - Args: - timelines: List of List of dict in OpenAI format - - Returns: - Trajectory data in AgentScope format - """ - return [[openai_to_agentscope_single(msg) for msg in step] for step in timelines] - - -# ============================================================================= -# AgentScope -> OpenAI conversion -# ============================================================================= - -def agentscope_to_openai_single(msg: Dict[str, Any]) -> Dict[str, Any]: - """ - Convert a single AgentScope format message to OpenAI format. - - Args: - msg: Message dict in AgentScope format - - Returns: - Message dict in OpenAI format - """ - role = msg.get("role", "user") - content = msg.get("content", "") - - # If content is string, return directly - if isinstance(content, str): - return { - "role": role, - "content": content - } - - # If content is list (AgentScope block format) - if isinstance(content, list): - text_parts = [] - tool_calls = [] - tool_call_id = "" - tool_output = "" - is_tool_result = False - - for item in content: - if not isinstance(item, dict): - continue - - item_type = item.get("type", "") - - if item_type == "text": - # TextBlock - text_parts.append(item.get("text", "")) - - elif item_type == "tool_use": - # ToolUseBlock -> tool_calls - arguments = item.get("input", {}) - if isinstance(arguments, dict): - arguments = json.dumps(arguments, ensure_ascii=False) - tool_calls.append({ - "id": item.get("id", ""), - "type": "function", - "function": { - "name": item.get("name", ""), - "arguments": arguments - } - }) - - elif item_type == "tool_result": - # ToolResultBlock -> tool response - is_tool_result = True - tool_call_id = item.get("id", "") - output = item.get("output", "") - if isinstance(output, str): - tool_output += output - else: - tool_output += str(output) - - # Build OpenAI format based on parsing result - if is_tool_result and tool_call_id: - return { - "role": "tool", - "content": tool_output, - "tool_call_id": tool_call_id - } - elif tool_calls: - result = { - "role": "assistant", - "content": "".join(text_parts) if text_parts else "", - "tool_calls": tool_calls - } - return result - else: - return { - "role": role, - "content": "".join(text_parts) if text_parts else "" - } - - # Otherwise, return as is - return { - "role": role, - "content": str(content) if content else "" - } - - -def agentscope_to_openai(messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: - """ - Convert AgentScope format message list to OpenAI format. - - Args: - messages: Message list in AgentScope format - - Returns: - Message list in OpenAI format - """ - return [agentscope_to_openai_single(msg) for msg in messages] - - -def agentscope_to_openai_grouped(timelines: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]: - """ - Convert timelines (multi-turn conversation steps) from AgentScope format to OpenAI format. - - Args: - timelines: List of List of dict in AgentScope format - - Returns: - Trajectory data in OpenAI format - """ - return [[agentscope_to_openai_single(msg) for msg in step] for step in timelines] - # ============================================================================= # ExtendedMessage -> OpenAI conversion (backward compatible functions) From a7dc96d690fb16a8c6b56189e66e9dbb313dee33 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 17:19:11 +0800 Subject: [PATCH 439/462] amend config gap --- ajet/utils/metric_helper/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ajet/utils/metric_helper/__init__.py b/ajet/utils/metric_helper/__init__.py index 176a7582..a9702d5d 100644 --- a/ajet/utils/metric_helper/__init__.py +++ b/ajet/utils/metric_helper/__init__.py @@ -4,7 +4,7 @@ def save_trajectory_as_json_file(ctx_trackers, global_steps, config, prefix): - if config.ajet.trainer_common.save_trajectory_as_json: + if config.ajet.trainer_common.save_trajectory_as_json_file: save_trajectory_as_json(ctx_trackers, global_steps, prefix) def update_metrics(context_tracker_arr, metrics:dict): From 69ca4d8b9d61d569e3ca97f05734deda58af4f56 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Tue, 13 Jan 2026 17:47:45 +0800 Subject: [PATCH 440/462] update benchmark test robot --- tests/bench/README.md | 13 +++++++------ .../execute_benchmark_appworld.py | 5 +++-- .../execute_benchmark_countdown.py | 10 ++++++++-- .../execute_benchmark_frozenlake.py | 17 ++++++++++------- .../execute_benchmark_learn2ask.py | 19 ++++++++++--------- .../benchmark_math/execute_benchmark_math.py | 16 ++++++++++------ 6 files changed, 48 insertions(+), 32 deletions(-) diff --git a/tests/bench/README.md b/tests/bench/README.md index b8f0a096..a849d3ca 100644 --- a/tests/bench/README.md +++ b/tests/bench/README.md @@ -14,13 +14,14 @@ Note: `tests/bench` source code is for test robot only, therefore `yaml` configu source .venv/bin/activate python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py +python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py +python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py python -m pytest -s tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py -python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py -python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py -python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py::TestBenchmarkCountdown::test_01_begin_verl -python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_01_begin_verl -python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py::TestBenchmarkAppworld::test_01_begin_verl -python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py::TestBenchmarkLearnToAsk::test_02_begin_verl +VERL_PYTHON="./.venv/bin/python" python -m pytest -s tests/bench/benchmark_math/execute_benchmark_math.py::TestBenchmarkMath::test_01_begin_verl +VERL_PYTHON="./.venv/bin/python" python -m pytest -s tests/bench/benchmark_appworld/execute_benchmark_appworld.py::TestBenchmarkAppworld::test_01_begin_verl +VERL_PYTHON="./.venv/bin/python" python -m pytest -s tests/bench/benchmark_countdown/execute_benchmark_countdown.py::TestBenchmarkCountdown::test_01_begin_verl +VERL_PYTHON="./.venv/bin/python" python -m pytest -s tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py::TestBenchmarkLearnToAsk::test_01_begin_verl +VERL_PYTHON="./.venv/bin/python" python -m pytest -s tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py::TestBenchmarkFrozenLake::test_01_begin_verl ``` diff --git a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py index df28a7be..eb37a189 100644 --- a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py @@ -8,6 +8,7 @@ class TestBenchmarkAppworld(BenchmarkTestCase): + def test_01_begin_verl(self): # get probe target, so as to get timeout settings BACKBONE = "verl" @@ -16,7 +17,7 @@ def test_01_begin_verl(self): # tests/bench/benchmark_appworld/benchmark_appworld.py # tests/bench/benchmark_appworld/benchmark_appworld.yaml TARGET_NAME = f"benchmark_appworld_{BACKBONE}" - PYTHON_EXECUTABLE = ".verl/bin/python" + PYTHON_EXECUTABLE = os.environ.get("VERL_PYTHON", ".verl/bin/python") multi_nodes = False self.execute_benchmark( @@ -37,7 +38,7 @@ def test_02_begin_trinity(self): TEST_TARGET = "tests/bench/benchmark_appworld/benchmark_appworld_2nodes.yaml" PROBE_TARGET = "tests/bench/benchmark_appworld/benchmark_appworld.py->TestProbe" TARGET_NAME = f"benchmark_appworld_{BACKBONE}" - PYTHON_EXECUTABLE = ".venv/bin/python" + PYTHON_EXECUTABLE = os.environ.get("TRINITY_PYTHON", ".venv/bin/python") multi_nodes = True self.execute_benchmark( diff --git a/tests/bench/benchmark_countdown/execute_benchmark_countdown.py b/tests/bench/benchmark_countdown/execute_benchmark_countdown.py index 78adbd4d..db74e25a 100644 --- a/tests/bench/benchmark_countdown/execute_benchmark_countdown.py +++ b/tests/bench/benchmark_countdown/execute_benchmark_countdown.py @@ -1,15 +1,20 @@ +import os import unittest from tests.bench.benchmark_base import BenchmarkTestCase + + class TestBenchmarkCountdown(BenchmarkTestCase, unittest.TestCase): + def test_01_begin_verl(self): BACKBONE = "verl" TEST_TARGET = "tests/bench/benchmark_countdown/benchmark_countdown.yaml" PROBE_TARGET = "tests/bench/benchmark_countdown/benchmark_countdown.py->TestProbe" TARGET_NAME = f"benchmark_countdown_{BACKBONE}" - PYTHON_EXECUTABLE = ".verl/bin/python" + PYTHON_EXECUTABLE = os.environ.get("VERL_PYTHON", ".verl/bin/python") + self.execute_benchmark( backbone=BACKBONE, test_target=TEST_TARGET, @@ -23,7 +28,8 @@ def test_02_begin_trinity(self): TEST_TARGET = "tests/bench/benchmark_countdown/benchmark_countdown.yaml" PROBE_TARGET = "tests/bench/benchmark_countdown/benchmark_countdown.py->TestProbe" TARGET_NAME = f"benchmark_countdown_{BACKBONE}" - PYTHON_EXECUTABLE = ".venv/bin/python" + PYTHON_EXECUTABLE = os.environ.get("TRINITY_PYTHON", ".venv/bin/python") + self.execute_benchmark( backbone=BACKBONE, test_target=TEST_TARGET, diff --git a/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py b/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py index fe78de4a..7de32908 100644 --- a/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py +++ b/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py @@ -1,15 +1,17 @@ -import unittest +import os from tests.bench.benchmark_base import BenchmarkTestCase class TestBenchmarkFrozenLake(BenchmarkTestCase): - def test_01_begin_trinity(self): - BACKBONE = "trinity" + + def test_01_begin_verl(self): + BACKBONE = "verl" TEST_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml" PROBE_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.py->TestProbe" TARGET_NAME = f"benchmark_frozenlake_{BACKBONE}" - PYTHON_EXECUTABLE = ".venv/bin/python" + PYTHON_EXECUTABLE = os.environ.get("VERL_PYTHON", ".verl/bin/python") + self.execute_benchmark( backbone=BACKBONE, test_target=TEST_TARGET, @@ -18,12 +20,13 @@ def test_01_begin_trinity(self): python_executable=PYTHON_EXECUTABLE, ) - def test_02_begin_verl(self): - BACKBONE = "verl" + def test_02_begin_trinity(self): + BACKBONE = "trinity" TEST_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml" PROBE_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.py->TestProbe" TARGET_NAME = f"benchmark_frozenlake_{BACKBONE}" - PYTHON_EXECUTABLE = ".verl/bin/python" + PYTHON_EXECUTABLE = os.environ.get("TRINITY_PYTHON", ".venv/bin/python") + self.execute_benchmark( backbone=BACKBONE, test_target=TEST_TARGET, diff --git a/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py b/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py index 71bc0013..e467e030 100644 --- a/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py +++ b/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py @@ -1,17 +1,18 @@ -import unittest +import os from tests.bench.benchmark_base import BenchmarkTestCase class TestBenchmarkLearnToAsk(BenchmarkTestCase): - def test_01_begin_trinity(self): + + def test_01_begin_verl(self): # get probe target, so as to get timeout settings - BACKBONE = "trinity" + BACKBONE = "verl" TEST_TARGET = "tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml" PROBE_TARGET = "tests/bench/benchmark_learn2ask/benchmark_learn2ask.py->TestProbe" TARGET_NAME = f"benchmark_learn2ask_{BACKBONE}" - # PYTHON_EXECUTABLE = "python" - PYTHON_EXECUTABLE = ".venv/bin/python" + PYTHON_EXECUTABLE = os.environ.get("VERL_PYTHON", ".verl/bin/python") + self.execute_benchmark( backbone=BACKBONE, test_target=TEST_TARGET, @@ -20,14 +21,14 @@ def test_01_begin_trinity(self): python_executable=PYTHON_EXECUTABLE, ) - def test_02_begin_verl(self): + def test_02_begin_trinity(self): # get probe target, so as to get timeout settings - BACKBONE = "verl" + BACKBONE = "trinity" TEST_TARGET = "tests/bench/benchmark_learn2ask/benchmark_learn2ask.yaml" PROBE_TARGET = "tests/bench/benchmark_learn2ask/benchmark_learn2ask.py->TestProbe" TARGET_NAME = f"benchmark_learn2ask_{BACKBONE}" - # PYTHON_EXECUTABLE = "python" - PYTHON_EXECUTABLE = ".verl/bin/python" + PYTHON_EXECUTABLE = os.environ.get("TRINITY_PYTHON", ".venv/bin/python") + self.execute_benchmark( backbone=BACKBONE, test_target=TEST_TARGET, diff --git a/tests/bench/benchmark_math/execute_benchmark_math.py b/tests/bench/benchmark_math/execute_benchmark_math.py index 1feadd04..afd5e41e 100644 --- a/tests/bench/benchmark_math/execute_benchmark_math.py +++ b/tests/bench/benchmark_math/execute_benchmark_math.py @@ -1,14 +1,17 @@ +import os from tests.bench.benchmark_base import BenchmarkTestCase class TestBenchmarkMath(BenchmarkTestCase): - def test_02_begin_trinity(self): + + def test_01_begin_verl(self): # get probe target, so as to get timeout settings - BACKBONE = "trinity" + BACKBONE = "verl" TEST_TARGET = "tests/bench/benchmark_math/benchmark_math.yaml" PROBE_TARGET = "tests/bench/benchmark_math/benchmark_math.py->TestProbe" TARGET_NAME = f"benchmark_math_{BACKBONE}" - PYTHON_EXECUTABLE = ".venv/bin/python" + PYTHON_EXECUTABLE = os.environ.get("VERL_PYTHON", ".verl/bin/python") + self.execute_benchmark( backbone=BACKBONE, test_target=TEST_TARGET, @@ -17,13 +20,14 @@ def test_02_begin_trinity(self): python_executable=PYTHON_EXECUTABLE, ) - def test_01_begin_verl(self): + def test_02_begin_trinity(self): # get probe target, so as to get timeout settings - BACKBONE = "verl" + BACKBONE = "trinity" TEST_TARGET = "tests/bench/benchmark_math/benchmark_math.yaml" PROBE_TARGET = "tests/bench/benchmark_math/benchmark_math.py->TestProbe" TARGET_NAME = f"benchmark_math_{BACKBONE}" - PYTHON_EXECUTABLE = ".verl/bin/python" + PYTHON_EXECUTABLE = os.environ.get("TRINITY_PYTHON", ".venv/bin/python") + self.execute_benchmark( backbone=BACKBONE, test_target=TEST_TARGET, From 9e62b88e7c30fda21488a5d2162dad301974b1db Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 14 Jan 2026 01:49:43 +0800 Subject: [PATCH 441/462] remove user_workflow reference and increase robustness --- ajet/default_config/ajet_default.yaml | 7 ++ ajet/task_runner/base_runner.py | 64 ++++++++++++++++++- ajet/task_runner/general_runner.py | 15 +++-- ajet/tuner.py | 20 +++--- .../weight_tuner/as_agentscope_model.py | 2 - .../weight_tuner/as_oai_baseurl_apikey.py | 1 - .../weight_tuner/as_oai_sdk_model.py | 2 +- 7 files changed, 93 insertions(+), 18 deletions(-) diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index ad4d6d50..64135667 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -9,6 +9,13 @@ ajet: # the experimental reverse proxy feature that allows `tuner.as_oai_baseurl_apikey` feature enable_experimental_reverse_proxy: False + task_runner: + wrapper_type: "asyncio-with-gc" + wrapper_multiprocessing_timeout: 3600 # in seconds + # - wrapper_type: "asyncio-with-gc": safe, with periodic garbage collection to prevent event loop leaks (recommended) + # - wrapper_type: "asyncio": fast, but may cause event loop leak in long run + # - wrapper_type: "multi-processing": safe, but resource consuming + model: # which model should be trained path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct diff --git a/ajet/task_runner/base_runner.py b/ajet/task_runner/base_runner.py index 5671bc82..7ec6cd9f 100644 --- a/ajet/task_runner/base_runner.py +++ b/ajet/task_runner/base_runner.py @@ -1,12 +1,20 @@ -from typing import Any, Callable, Union +import asyncio +import gc +from typing import Any, Callable, Union, Type +from multiprocessing import Process, Queue +from unittest import result from ajet.context_tracker.basic_tracker import BaseContextTracker +from ajet.schema.task import WorkflowOutput, WorkflowTask from ajet.task_judge.base_judge import BaseJudge +from ajet.tuner import AjetTuner from ajet.utils.async_utils import run_async_coroutine_with_timeout from ajet.utils.dynamic_import import dynamic_import +from ajet.workflow import Workflow class BaseAgentRunner(object): + def __init__(self, llm_inference_fn: Callable, tokenizer: Any, config, **kwargs): self.tokenizer = tokenizer self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") @@ -18,6 +26,12 @@ def __init__(self, llm_inference_fn: Callable, tokenizer: Any, config, **kwargs) self.max_steps: int = self.config.ajet.rollout.multi_turn.max_steps self.max_model_len: int = self.config.ajet.rollout.max_model_len + self.wrapper_type = self.config.ajet.task_runner.wrapper_type + self.wrapper_multiprocessing_timeout = self.config.ajet.task_runner.wrapper_multiprocessing_timeout + assert self.wrapper_type in ["asyncio", "asyncio-with-gc", "multi-processing"], \ + f"Unsupported wrapper type: {self.wrapper_type}, available options: ['asyncio', 'asyncio-with-gc', 'multi-processing']" + + def get_judge(self) -> BaseJudge: # type: ignore if self.config.ajet.task_judge.judge_type == "customized_protocol": judge_protocol = self.config.ajet.task_judge.judge_protocol @@ -31,6 +45,7 @@ def get_judge(self) -> BaseJudge: # type: ignore run_async_coroutine_with_timeout(judge.load_rubrics_from_cache()) return judge + def runner_hooks(self, observation_window, task_thread_index, workflow_task): def should_interrupt_fn() -> bool: if (observation_window["stop"] is not None) and observation_window["stop"][ @@ -46,3 +61,50 @@ def generated_token_callback_fn(token_array): "should_interrupt_fn": should_interrupt_fn, "generated_token_callback_fn": generated_token_callback_fn, } + + + async def wrapper_type_asyncio(self, workflow_cls: Type[Workflow], workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + user_workflow: Workflow = workflow_cls(name="ajet-workflow") + result = await user_workflow.execute(workflow_task, tuner) + del user_workflow + gc.collect() # force garbage collection + return result + + + def wrapper_type_multiprocessing(self, workflow_cls: Type[Workflow], workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + def worker(q: Queue): + user_workflow: Workflow = workflow_cls(name="ajet-workflow") + result = asyncio.run(user_workflow.execute(workflow_task, tuner)) + q.put(result) + q = Queue() + p = Process(target=worker, args=(q,)) + p.daemon = True + p.start() + p.join(timeout=self.wrapper_multiprocessing_timeout) + if p.is_alive(): + p.terminate() + p.join() + raise TimeoutError(f"Workflow execution timeout after {self.wrapper_multiprocessing_timeout} seconds") + return q.get() + + + def run_user_workflow( + self, + workflow_cls: Type[Workflow], + workflow_task: WorkflowTask, + tuner: AjetTuner, + ) -> WorkflowOutput: + + if self.wrapper_type == "asyncio": + user_workflow: Workflow = workflow_cls(name="ajet-workflow") + return asyncio.run(user_workflow.execute(workflow_task, tuner)) + + if self.wrapper_type == "asyncio-with-gc": + return asyncio.run(self.wrapper_type_asyncio(workflow_cls, workflow_task, tuner)) + + elif self.wrapper_type == "multi-processing": + return self.wrapper_type_multiprocessing(workflow_cls, workflow_task, tuner) + + else: + raise ValueError(f"Unsupported wrapper type: {self.wrapper_type}") + diff --git a/ajet/task_runner/general_runner.py b/ajet/task_runner/general_runner.py index 94271cbd..420da5ac 100644 --- a/ajet/task_runner/general_runner.py +++ b/ajet/task_runner/general_runner.py @@ -1,4 +1,5 @@ import asyncio +import weakref from venv import logger from ajet import AjetTuner @@ -14,13 +15,13 @@ class GeneralRunner(BaseAgentRunner): + def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: observation_window = workflow_task.observation_window task_thread_index = workflow_task.task_thread_index workflow_import = self.config.ajet.rollout.user_workflow workflow_cls = dynamic_import(workflow_import) - user_workflow: Workflow = workflow_cls(name="ajet-trinity") hooks = self.runner_hooks( observation_window=observation_window, @@ -37,12 +38,18 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: tuner = AjetTuner( context_tracker=context_tracker, llm_inference_fn=self.llm_inference_fn, - user_workflow=user_workflow, + workflow_cls=workflow_cls, config=self.config, ) - workflow_output: WorkflowOutput = asyncio.run( - user_workflow.execute(workflow_task, tuner) + + # run workflow + # user_workflow: Workflow = workflow_cls(name="ajet-workflow") + workflow_output: WorkflowOutput = self.run_user_workflow( + workflow_cls, + workflow_task, + tuner, ) + if workflow_output.reward is not None: raw_reward, is_success = ( workflow_output.reward, diff --git a/ajet/tuner.py b/ajet/tuner.py index 8fa19137..8f963227 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, Literal, Callable, Union +from typing import TYPE_CHECKING, Any, Literal, Callable, Union, Type from ajet.context_tracker.multiagent_tracking import ( MultiAgentContextTracker, @@ -18,11 +18,11 @@ def __init__( self, config, context_tracker: MultiAgentContextTracker, - user_workflow: "Workflow", + workflow_cls: Type["Workflow"], llm_inference_fn: Callable, ) -> None: self.config = config - self.workflow = user_workflow + self.trainable_targets = self._get_trainable_targets(workflow_cls) self.context_tracker = context_tracker self.llm_inference_fn = llm_inference_fn self.target2proxy_registry: dict[str, dict[str,TunerTypeUnion]] = {} @@ -30,6 +30,11 @@ def __init__( self.proxy_client_started = False + def _get_trainable_targets(self, workflow_cls: Type["Workflow"]): + workflow_instance = workflow_cls(name="ajet-workflow") + return workflow_instance.trainable_targets + + def as_agentscope_model( self, agent_name="default_agent_name", @@ -44,7 +49,6 @@ def as_agentscope_model( explicit_tuner_as_modelscope_model = AgentScopeModelTuner( config=self.config, context_tracker=self.context_tracker, - user_workflow=self.workflow, agent_name=agent_name, debug_model=debug_model, use_debug_model=(not self._is_target_trainable(target_tag)), @@ -68,7 +72,6 @@ def as_raw_openai_sdk_client( explicit_tuner_as_oai_client = OpenaiClientModelTuner( config=self.config, context_tracker=self.context_tracker, - workflow=self.workflow, agent_name=agent_name, debug_model=debug_model, use_debug_model=(not self._is_target_trainable(target_tag)), @@ -108,7 +111,6 @@ def as_oai_baseurl_apikey( baseurl_apikey_model = OpenaiClientBaseUrlTuner( config=self.config, context_tracker=self.context_tracker, - workflow=self.workflow, agent_name=agent_name, target_tag=target_tag, episode_uuid=self.context_tracker.episode_uuid, @@ -145,13 +147,13 @@ def _register(self, target_name: str, agent_name: str, explicit_tuner: TunerType def _is_target_trainable(self, target_name) -> bool: """Determine whether user have used `trainable_targets` to explicitly control training targets. """ - if self.workflow.trainable_targets is None: + if self.trainable_targets is None: # always assume trainable when user has never changed trainable_targets return True - if not self.workflow.trainable_targets: + if not self.trainable_targets: # always assume trainable when trainable_targets is [] return True - if target_name in self.workflow.trainable_targets: + if target_name in self.trainable_targets: return True else: return False diff --git a/ajet/tuner_lib/weight_tuner/as_agentscope_model.py b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py index 92a98457..4af1754c 100644 --- a/ajet/tuner_lib/weight_tuner/as_agentscope_model.py +++ b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py @@ -25,7 +25,6 @@ def __init__( self, config, context_tracker: MultiAgentContextTracker, - user_workflow: "Workflow", agent_name: str, debug_model: DashScopeChatModel | None, use_debug_model: bool = False, @@ -33,7 +32,6 @@ def __init__( ) -> None: self.config = config self.context_tracker = context_tracker - self.user_workflow = user_workflow self.agent_name = agent_name self.debug_model = debug_model diff --git a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py index 6da909dd..25b82766 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py @@ -40,7 +40,6 @@ def __init__( self, config, context_tracker: MultiAgentContextTracker, - workflow: "Workflow", target_tag: str, agent_name: str, episode_uuid: str, diff --git a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py index 803bb765..943d5c2c 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py @@ -34,13 +34,13 @@ def __init__( self, config, context_tracker: MultiAgentContextTracker, - workflow: "Workflow", agent_name: str, debug_model: str | None = None, use_debug_model: bool = False, llm_inference_fn: Callable | None = None, ): self.debug_model = debug_model + self.agent_name = agent_name self.use_debug_model = use_debug_model assert llm_inference_fn is not None, "llm_inference_fn must be provided" self.llm_proxy = OpenaiLlmProxyWithTracker( From c8efc5e2c089cb3a9dafcca094002e50ede2d2d2 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Wed, 14 Jan 2026 02:20:15 +0800 Subject: [PATCH 442/462] refactor(gc): use a lock for garbage collection in BaseAgentRunner --- ajet/task_runner/base_runner.py | 5 ++++- ajet/task_runner/general_runner.py | 2 -- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ajet/task_runner/base_runner.py b/ajet/task_runner/base_runner.py index 7ec6cd9f..644f954f 100644 --- a/ajet/task_runner/base_runner.py +++ b/ajet/task_runner/base_runner.py @@ -1,5 +1,6 @@ import asyncio import gc +from threading import Lock from typing import Any, Callable, Union, Type from multiprocessing import Process, Queue from unittest import result @@ -12,6 +13,7 @@ from ajet.utils.dynamic_import import dynamic_import from ajet.workflow import Workflow +gc_lock = Lock() class BaseAgentRunner(object): @@ -67,7 +69,8 @@ async def wrapper_type_asyncio(self, workflow_cls: Type[Workflow], workflow_task user_workflow: Workflow = workflow_cls(name="ajet-workflow") result = await user_workflow.execute(workflow_task, tuner) del user_workflow - gc.collect() # force garbage collection + with gc_lock: + gc.collect() # force garbage collection return result diff --git a/ajet/task_runner/general_runner.py b/ajet/task_runner/general_runner.py index 420da5ac..2904cfae 100644 --- a/ajet/task_runner/general_runner.py +++ b/ajet/task_runner/general_runner.py @@ -1,5 +1,3 @@ -import asyncio -import weakref from venv import logger from ajet import AjetTuner From 855cb2fe10b923134e1b32fa7a8162ba2b2394d7 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 15 Jan 2026 01:56:43 +0800 Subject: [PATCH 443/462] redis --- ajet/task_rollout/native_parallel_worker.py | 10 +- .../experimental/as_oai_model_client.py | 206 ++++---- .../experimental/as_oai_model_server.py | 461 +++++------------- .../weight_tuner/experimental/zmq.py | 12 + ajet/utils/smart_daemon.py | 6 +- 5 files changed, 264 insertions(+), 431 deletions(-) create mode 100644 ajet/tuner_lib/weight_tuner/experimental/zmq.py diff --git a/ajet/task_rollout/native_parallel_worker.py b/ajet/task_rollout/native_parallel_worker.py index 578f4ac6..7f35aa10 100644 --- a/ajet/task_rollout/native_parallel_worker.py +++ b/ajet/task_rollout/native_parallel_worker.py @@ -450,11 +450,11 @@ def rollout_dynamic( # noqa: C901 logger.info(print_buffer) - for tracker in tracker_array: - # average of gourp success rate - tracker.current_batch_success_rate = np.mean(task_success_rate) - # average of gourp average reward - tracker.current_batch_reward = np.mean(task_group_reward) + # for tracker in tracker_array: + # # average of gourp success rate + # tracker.current_batch_success_rate = np.mean(task_success_rate) + # # average of gourp average reward + # tracker.current_batch_reward = np.mean(task_group_reward) return tracker_array diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index 0121e2c4..fe2d0123 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -3,14 +3,19 @@ import json import threading import os +import redis import time from loguru import logger from typing import Optional, List, Dict, Any, Union, TYPE_CHECKING from vllm.entrypoints.openai.protocol import ChatCompletionRequest, ChatCompletionResponse from openai.types.chat.chat_completion import ChatCompletion +from redis.exceptions import TimeoutError + +from functools import cache import pickle import httpx +import zmq import logging logging.getLogger("httpx").setLevel(logging.WARNING) @@ -51,6 +56,24 @@ def generate_auth_token(agent_name, target_tag, episode_uuid): return auth_token +@cache +def get_redis_connection_pool(): + pool = redis.BlockingConnectionPool( + host='localhost', + port=6379, + max_connections=256, + socket_timeout=30, + socket_connect_timeout=30, + retry_on_timeout=True + ) + return pool + + +def get_redis_client(): + pool = get_redis_connection_pool() + return redis.Redis(connection_pool=pool, decode_responses=False, encoding='utf-8') + + class InterchangeClient: def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker", llm_inference_fn, config): @@ -101,94 +124,107 @@ def begin_service(self): """ Starts the SSE service loop. """ - t = threading.Thread(target=lambda: asyncio.run(self._ensure_service_loop()), daemon=True) + t = threading.Thread(target=self._begin_service_threading, daemon=True) t.start() - async def _ensure_service_loop(self): - while not self.should_terminate: - try: - await self._service_loop() - except Exception as e: - logger.warning(f"InterchangeClient service loop error: {e}. Restarting...") - await asyncio.sleep(4) # brief pause before reconnecting - - async def _service_loop(self): - """ - In fact this is not a service, - it is a client that pretends to be a service, by interacting with a local interchange server via SSE. - This design is for efficiency + def _handle_service_request(self, msg: bytes, sem: threading.Semaphore): + """handle a single service request in its own thread """ - from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import InterchangeCompletionRequest - - port = os.getenv("AJET_DAT_INTERCHANGE_PORT") - assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" - - base_url = f"http://127.0.0.1:{port}" - listen_url = f"{base_url}/hook/context_tracker_client_listen" - response_url = f"{base_url}/hook/context_tracker_client_response" - key = f"episode_uuid:{self.episode_uuid}" - - async with httpx.AsyncClient(timeout=None) as client: - try: - async with client.stream("GET", listen_url, params={"episode_uuid": self.episode_uuid}, timeout=None) as response: - async for line in response.aiter_lines(): - if self.should_terminate: - break - - if not line.strip(): - continue - - if line.startswith(":"): # keepalive - continue - - if line.startswith("data: "): - data = line[6:].strip() - if not data: - continue - - try: - try: - parsed_msg = InterchangeCompletionRequest(**json.loads(data)) - except Exception as e: - logger.error(f"Failed to parse SSE event data: {e}" + data) - continue - - result = await self.llm_infer( - req=parsed_msg.completion_request, - timeline_uuid=parsed_msg.timeline_uuid, - agent_name=parsed_msg.agent_name, - target_tag=parsed_msg.target_tag, - episode_uuid=parsed_msg.episode_uuid, - ) - - # Send response back - await client.post( - response_url, - params={"key": key}, - content=pickle.dumps(result), - headers={"Content-Type": "application/octet-stream"} - ) - - except Exception as e: - logger.error(f"Error processing SSE event: {e}") - continue - - except httpx.RequestError as e: - logger.warning(f"SSE connection error: {e}") - raise # Let ensure_service_loop handle restart - - # Send terminate signal if we are exiting cleanly - try: - await client.post( - response_url, - params={"key": key}, - content=pickle.dumps("terminate"), - headers={"Content-Type": "application/octet-stream"} - ) - except: - pass - - + logger.info(f"[client] {self.episode_uuid} | inside _handle_service_request") + redis_client = get_redis_client() + logger.info(f"[client] {self.episode_uuid} | get_redis_client") + data_as_json = "" + topic = "" + try: + data_as_json = json.loads(pickle.loads(msg)) + timeline_uuid = data_as_json["timeline_uuid"] + topic = f"timeline_uuid:{timeline_uuid}/episode_uuid:{self.episode_uuid}" + logger.info(f"[client] {self.episode_uuid} | json.loads(pickle.loads(msg))") + + + if "health_check" in data_as_json and data_as_json["health_check"]: + # logger.info(f"Received health check for timeline_uuid: {timeline_uuid}") + result = '{"health_check_ok": "True"}' + # logger.success(f"Health check OK for timeline_uuid: {timeline_uuid}") + else: + parsed_msg = InterchangeCompletionRequest(**data_as_json) + # start llm request + result = asyncio.run(self.llm_infer( + req=parsed_msg.completion_request, + timeline_uuid=parsed_msg.timeline_uuid, + agent_name=parsed_msg.agent_name, + target_tag=parsed_msg.target_tag, + episode_uuid=parsed_msg.episode_uuid, + )).model_dump_json() + # logger.success(f"LLM inference completed for timeline_uuid: {timeline_uuid}") + logger.info(f"[client] {self.episode_uuid} | result = asyncio.run(self.llm_infer") + # send result back + bytes_arr = pickle.dumps(result) + logger.info(f"[client] {self.episode_uuid} | bytes_arr = pickle.dumps(result)") + redis_client.publish(topic, bytes_arr) + logger.info(f"[client] {self.episode_uuid} | redis_client.publish(topic, pickle.dumps(result))") + + except Exception as e: + err = f"[ERR]: Error when processing data: {data_as_json} Error: {e}" + result = err + logger.error(err) + if topic: + redis_client.publish(topic, pickle.dumps(result)) + + finally: + # release semaphore when done + sem.release() + redis_client.close() + + + + + def _begin_service_threading(self): + """begin listening for service requests in a threading model + """ + # logger.success(f"InterchangeClient starting for episode_uuid:{self.episode_uuid}") + debug_logs = [] + begin_time = time.time() + logger.info(f"[client] {self.episode_uuid} | Starting InterchangeClient service loop...") + redis_client = get_redis_client() + redis_sub = redis_client.pubsub() + episode_topic = f"episode_uuid:{self.episode_uuid}" + redis_sub.subscribe(episode_topic) + sem = threading.Semaphore(8) # 4 concurrent requests max + logger.info(f"[client] {self.episode_uuid} | Subscribed to topic {episode_topic}, waiting for messages...") + is_init = True + try: + while not self.should_terminate: + # wait for a new message + logger.info(f"[client] {self.episode_uuid} | Waiting for new message on topic {episode_topic}...") + response = redis_sub.get_message(timeout=10) # type: ignore + timepassed = time.time() - begin_time + + if response is None: + if is_init and timepassed > 30: + logger.warning(f"[client] Still waiting for first message... (time passed {timepassed}) for episode_uuid:{self.episode_uuid}...") + continue + + if response['type'] not in ['message', 'pmessage']: + continue + + is_init = False + logger.info(f"[client] {self.episode_uuid} | get message...") + # got a message + msg: bytes = response['data'] # type: ignore + # are we free to spawn a new thread? + sem.acquire() + logger.info(f"[client] {self.episode_uuid} | sem acquire...") + # begin a new thread to handle this request + threading.Thread(target=self._handle_service_request, args=(msg, sem), daemon=True).start() + + + except KeyboardInterrupt: + return + + finally: + redis_sub.close() + redis_client.close() diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index e70997ff..157b6aa3 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -10,7 +10,10 @@ """ import asyncio +from functools import cache +from multiprocessing import Process import threading +from concurrent.futures import ThreadPoolExecutor import uuid import time from collections import defaultdict @@ -19,6 +22,8 @@ import json import os import pickle +import redis +from redis.exceptions import TimeoutError from pprint import pformat from loguru import logger @@ -30,20 +35,12 @@ import subprocess import atexit import argparse +import httpx from vllm.entrypoints.openai.protocol import ChatCompletionRequest from openai.types.chat.chat_completion import ChatCompletion -# Global variables for tracking requests and responses -# class ChatCompletionRequestDeferBuildOff(ChatCompletionRequest): -# model_config = ConfigDict( -# defer_build=False, -# validate_default=True, -# validate_assignment=True, -# ) -# ChatCompletionRequest.model_validate_json(x) - class InterchangeCompletionRequest(BaseModel): completion_request: ChatCompletionRequest agent_name: str @@ -51,148 +48,93 @@ class InterchangeCompletionRequest(BaseModel): episode_uuid: str timeline_uuid: str -ajet_remote_handler_received: Dict[str, Dict[str, InterchangeCompletionRequest]] = defaultdict(dict) -ajet_remote_handler_in_progress: Dict[str, Dict[str, InterchangeCompletionRequest]] = defaultdict(dict) -ajet_remote_handler_completed: Dict[str, Dict[str, ChatCompletion]] = defaultdict(dict) -ajet_remote_handler_discarded: Dict[str, Dict[str, bool]] = defaultdict(dict) -active_websockets: Dict[str, asyncio.Event] = {} - -# Create FastAPI app -app = FastAPI(title="AJet Interchange Endpoint") - -POLL_INTERVAL_SECONDS = 0.5 - -@app.get("/health") -async def health_check(): - """Health check endpoint.""" - return {"status": "ok"} - - -async def sse_event_generator(key: str, stop_event: asyncio.Event, request: Request): - """ - Generator for Server-Sent Events. - Yields requests to the client. - """ - try: - wait_cnt = 0 - while not stop_event.is_set(): - - if await request.is_disconnected(): - logger.info(f"Client disconnected for key: {key}") - stop_event.set() - break - - # Check for new requests in ajet_remote_handler_received - if (key in ajet_remote_handler_received) and len(ajet_remote_handler_received[key]) > 0: - timeline_uuid = list(ajet_remote_handler_received[key].keys())[0] - - # Get the next request - new_req: InterchangeCompletionRequest = ajet_remote_handler_received[key].pop(timeline_uuid) - - assert timeline_uuid == new_req.timeline_uuid - - # Move to in_progress - ajet_remote_handler_in_progress[key][timeline_uuid] = new_req - - # Send via SSE - # We send the JSON representation of the request - # Client expects: parsed_msg:InterchangeCompletionRequest - - # We simply yield the json string. - # The client side will need to read this json. - json_data = new_req.model_dump_json() - yield f"data: {json_data}\n\n" - else: - await asyncio.sleep(POLL_INTERVAL_SECONDS) - wait_cnt += 1 - if wait_cnt * POLL_INTERVAL_SECONDS >= 5: - wait_cnt = 0 - # Send keepalive comment to prevent timeouts - yield ": keepalive\n\n" - - await asyncio.sleep(POLL_INTERVAL_SECONDS) - - except Exception as e: - logger.exception(f"Error in SSE generator: {e}") - - finally: - stop_event.set() - # Cleanup - if key in active_websockets: - active_websockets.pop(key) - - # Clean up any in-progress requests for this key could be here, or explicitly on reset/timeout - # Mirroring original finally block logic: - # Note: In SSE, we might not want to aggressively clear everything on disconnect if retries are expected, - # but the original code cleaned up on websocket disconnect. - if key: - for container in [ - ajet_remote_handler_received, - ajet_remote_handler_in_progress, - ajet_remote_handler_completed, - ]: - if key in container: - container.pop(key) - - if key in ajet_remote_handler_discarded: - ajet_remote_handler_discarded.pop(key) - - -@app.post("/hook/context_tracker_client_response") -async def context_tracker_client_response(key: str, response_data: bytes = Body(...)): - """ - Endpoint to receive processing results from the client. - """ - try: - # Decode response - # The client sends pickled ChatCompletion object or "terminate" string - try: - openai_response = pickle.loads(response_data) - except Exception as e: - logger.error(f"Pickle load failed: {e}") - # Try assuming it might not be pickled if we change client, but let's stick to pickle for complex objects - raise HTTPException(status_code=400, detail="Invalid response format") - - if openai_response == "terminate": - # Handle termination signal if needed, though usually handled by disconnect - if key in active_websockets: - active_websockets[key].set() - return {"status": "terminated"} +class HealthCheckRequest(BaseModel): + agent_name: str + target_tag: str + episode_uuid: str + timeline_uuid: str + health_check: bool = True + +@cache +def get_redis_connection_pool(): + pool = redis.BlockingConnectionPool( + host='localhost', + port=6379, + max_connections=256, + socket_timeout=30, + socket_connect_timeout=30, + retry_on_timeout=True + ) + return pool - if not isinstance(openai_response, ChatCompletion): - logger.error(f"Invalid response object type: {type(openai_response)}") - raise HTTPException(status_code=400, detail="Invalid response object") - timeline_uuid = openai_response.id +def get_redis_client(): + pool = get_redis_connection_pool() + return redis.Redis(connection_pool=pool, decode_responses=False, encoding='utf-8') - if key in ajet_remote_handler_in_progress and timeline_uuid in ajet_remote_handler_in_progress[key]: - ajet_remote_handler_in_progress[key].pop(timeline_uuid) - # Add to completed if not discarded - if (key not in ajet_remote_handler_discarded) or (timeline_uuid not in ajet_remote_handler_discarded[key]): - ajet_remote_handler_completed[key][timeline_uuid] = openai_response +# Create FastAPI app +app = FastAPI(title="AJet Interchange Endpoint") - return {"status": "accepted"} +@app.on_event("startup") +async def startup_event(): + app.state.executor = ThreadPoolExecutor(max_workers=512) - except Exception as e: - logger.exception(f"Error in response handler: {e}") - raise HTTPException(status_code=500, detail=str(e)) +@app.on_event("shutdown") +async def shutdown_event(): + app.state.executor.shutdown() -@app.get("/hook/context_tracker_client_listen") -async def context_tracker_client_listen(request: Request, episode_uuid: str): - """ - SSE endpoint for clients to listen for completion requests. +def _begin_handle_chat_completion(int_req, episode_uuid, timeline_uuid, client_offline: asyncio.Event): + """ run this in thread to avoid blocking main event loop """ - key = f"episode_uuid:{episode_uuid}" + logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (inside thread)") - stop_event = asyncio.Event() - active_websockets[key] = stop_event # Storing stop_event instead of websocket + redis_client = get_redis_client() + episode_topic = f"episode_uuid:{episode_uuid}" + timeline_topic = f"timeline_uuid:{timeline_uuid}/episode_uuid:{episode_uuid}" + redis_sub = redis_client.pubsub() + redis_sub.subscribe(timeline_topic) + max_wait_time = 600 # 10 minutes timeout + try: + logger.info(f"episode_uuid: {episode_uuid} | redis_client.publish int_req ") + redis_client.publish(episode_topic, pickle.dumps(int_req.model_dump_json())) + logger.info(f"episode_uuid: {episode_uuid} | redis_client.publish int_req end") + + # record start + begin_time = time.time() + max_wait_time = 600 # 10 minutes timeout + # wait for result + while not client_offline.is_set(): + timepassed = time.time() - begin_time + if timepassed > max_wait_time: + return HTTPException(status_code=504, detail="Request timeout") + try: + logger.info(f"episode_uuid: {episode_uuid} | redis_sub.get_message(timeout=60)") + result = redis_sub.get_message(timeout=60) + logger.info(f"episode_uuid: {episode_uuid} | redis_sub.get_message(timeout=60) after") + if result is None: + if timepassed > 60: + logger.warning(f"episode_uuid: {episode_uuid} | LLM client infer still waiting... (time passed {timepassed}) for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") + continue + if result['type'] not in ['message', 'pmessage']: + continue + logger.info(f"episode_uuid: {episode_uuid} | successfully get message from redis_sub") + result_object_str = pickle.loads(result['data']) # type: ignore + if result_object_str.startswith('[ERR]'): + return HTTPException(status_code=500, detail="Error response, " + result_object_str) + result_object = ChatCompletion(**json.loads(result_object_str)) + return result_object + except TimeoutError: + logger.info(f"episode_uuid: {episode_uuid} | still waiting, (time passed {timepassed}) for result for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") + continue + + except: + return HTTPException(status_code=500, detail="ZMQ communication socket failed.") - return StreamingResponse( - sse_event_generator(key, stop_event, request), - media_type="text/event-stream" - ) + finally: + redis_sub.close() + redis_client.close() @app.post("/v1/chat/completions") async def chat_completions(request: Request, authorization: str = Header(None)): @@ -202,7 +144,7 @@ async def chat_completions(request: Request, authorization: str = Header(None)): """ # Parse authorization header (base64 encoded JSON) if not authorization: - raise HTTPException(status_code=401, detail="Missing authorization header") + return HTTPException(status_code=401, detail="Missing authorization header") try: # Remove "Bearer " prefix if present @@ -215,18 +157,15 @@ async def chat_completions(request: Request, authorization: str = Header(None)): episode_uuid = auth_data.get("episode_uuid") if not all([agent_name, target_tag, episode_uuid]): - raise HTTPException(status_code=401, detail="Invalid authorization data") + return HTTPException(status_code=401, detail="Invalid authorization data") except Exception as e: - raise HTTPException(status_code=401, detail=f"Invalid authorization header: {str(e)}") - - # Build key - key = f"episode_uuid:{episode_uuid}" + return HTTPException(status_code=401, detail=f"Invalid authorization header: {str(e)}") # Parse request body body = await request.json() new_req = ChatCompletionRequest.model_validate(body) if new_req.stream: - raise HTTPException(status_code=400, detail="Streaming responses not supported in current AgentJet version, please set `stream=false` for now.") + return HTTPException(status_code=400, detail="Streaming responses not supported in current AgentJet version, please set `stream=false` for now.") # Create timeline UUID timeline_uuid = uuid.uuid4().hex @@ -239,60 +178,19 @@ async def chat_completions(request: Request, authorization: str = Header(None)): episode_uuid = episode_uuid, timeline_uuid = timeline_uuid, ) + logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (outside thread)") + client_offline = asyncio.Event() + try: + loop = asyncio.get_running_loop() + return await loop.run_in_executor(request.app.state.executor, _begin_handle_chat_completion, int_req, episode_uuid, timeline_uuid, client_offline) + finally: + client_offline.set() - # # fix Pydantic validation issue for tool_calls field - # for msg in int_req.completion_request.messages: - # if isinstance(msg, dict) and 'tool_calls' in msg: - # tc = msg['tool_calls'] - # if not isinstance(tc, list): - # msg['tool_calls'] = list(tc) if tc else [] - - ajet_remote_handler_received[key][timeline_uuid] = int_req - # Wait for response (with periodic checks for client disconnect) - max_wait_time = 600 # 10 minutes timeout - elapsed_time = 0 - - try: - while elapsed_time < max_wait_time: - # Check if response is available - if (key in ajet_remote_handler_completed) \ - and timeline_uuid in ajet_remote_handler_completed[key]: - openai_response = ajet_remote_handler_completed[key][timeline_uuid] - return openai_response - await asyncio.sleep(POLL_INTERVAL_SECONDS) - elapsed_time += POLL_INTERVAL_SECONDS - - # Timeout reached - raise HTTPException(status_code=504, detail="Request timeout") - except asyncio.CancelledError: - # Client disconnected - if key not in ajet_remote_handler_discarded: - ajet_remote_handler_discarded[key] = {} - ajet_remote_handler_discarded[key][timeline_uuid] = True - raise HTTPException(status_code=499, detail="Client disconnected") @app.post("/reset") async def reset(): - """ - Reset endpoint to clear all state and disconnect all websockets. - """ - # logger.warning("Resetting interchange endpoint server state.") - # Disconnect all websockets - for key, stop_event in list(active_websockets.items()): - try: - stop_event.set() - except: - pass - - active_websockets.clear() - - # Clear all global state - ajet_remote_handler_received.clear() - ajet_remote_handler_in_progress.clear() - ajet_remote_handler_completed.clear() - ajet_remote_handler_discarded.clear() return {"status": "reset_complete"} @@ -302,105 +200,40 @@ async def monitor_debug_state(experiment_dir): Background task to write debug state to ./interchange_debug.txt every 1 second. """ while True: - try: - debug_info = { - 'ajet_remote_handler_received': dict(ajet_remote_handler_received), - 'ajet_remote_handler_in_progress': dict(ajet_remote_handler_in_progress), - 'ajet_remote_handler_completed': dict(ajet_remote_handler_completed), - 'ajet_remote_handler_discarded': dict(ajet_remote_handler_discarded), - 'active_websockets': list(active_websockets.keys()) - } - - with open(f'{experiment_dir}/interchange_debug.txt', 'w') as f: - f.write(pformat(debug_info, width=120, indent=2)) - f.write('\n') - - await asyncio.sleep(4) - except Exception as e: - logger.error(f"Error in monitor_debug_state: {e}") - await asyncio.sleep(4) + await asyncio.sleep(4) def ensure_dat_interchange_server_cache_clear(): - """ - send http request to clear the interchange server state. - """ - import httpx - - port = os.getenv("AJET_DAT_INTERCHANGE_PORT") - assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" - url = f"http://localhost:{port}/reset" - try: - response = httpx.post(url) - response.raise_for_status() - return response.json() - except httpx.RequestError as e: - pass - except httpx.HTTPStatusError as e: - pass - return -class InterchangeEndpointServer: - """ - Class to manage the FastAPI interchange endpoint server. - """ - def __init__(self): - self.server_thread = None - self.server = None - - def start(self, experiment_dir) -> int: - """ - Start the FastAPI server on a free port. - - Returns: - int: The port number the server is running on. - """ - # Find a free port - self.port = int(os.environ.get("AJET_DAT_INTERCHANGE_PORT", -1)) - - # Create server thread - def run_server(): - async def serve_with_monitor(): - # Start the monitor task - asyncio.create_task(monitor_debug_state(experiment_dir)) - - # Start the server - config = uvicorn.Config( - app=app, - host="0.0.0.0", - port=self.port, - log_level="error", - ) - server = uvicorn.Server(config) - await server.serve() - - asyncio.run(serve_with_monitor()) - - # Start server in a new thread - self.server_thread = threading.Thread(target=run_server, daemon=True) - self.server_thread.start() - return self.port - - def stop(self): - """ - Stop the server (note: due to uvicorn limitations, this may not fully stop the thread). - """ - # This is a simple implementation - in production you'd want more robust shutdown - pass +class InterchangeServer(Process): + def __init__(self, experiment_dir: str, port: int): + super().__init__() + self.experiment_dir = experiment_dir + self.port = port + + def run(self): + async def serve_with_monitor(): + # Start the monitor task + asyncio.create_task(monitor_debug_state(self.experiment_dir)) + # Start the server + config = uvicorn.Config( + app=app, + host="0.0.0.0", + port=self.port, + log_level="error", + # workers=16 + ) + server = uvicorn.Server(config) + await server.serve() + + asyncio.run(serve_with_monitor()) # Convenience function for quick server startup def start_interchange_server(experiment_dir) -> int: - """ - Start the interchange endpoint server and return the port number. - This launches a subprocess to run the server. - - Returns: - int: The port number the server is running on. - """ # Find a free port if not specified or invalid port = int(os.environ.get("AJET_DAT_INTERCHANGE_PORT", -1)) if port <= 0: @@ -410,75 +243,25 @@ def start_interchange_server(experiment_dir) -> int: port = s.getsockname()[1] os.environ["AJET_DAT_INTERCHANGE_PORT"] = str(port) - # Launch as subprocess - env = os.environ.copy() - - # We run this file as a script - cmd = [sys.executable, os.path.abspath(__file__), "--experiment_dir", experiment_dir, "--port", str(port)] - - process = subprocess.Popen( - cmd, - env=env, - # redirect stdout/stderr if needed, but keeping them might be useful for debug - # stdout=subprocess.DEVNULL, - # stderr=subprocess.DEVNULL - ) - - def cleanup(): - if process.poll() is None: - logger.info("Terminating interchange server subprocess") - process.terminate() - try: - process.wait(timeout=2) - except subprocess.TimeoutExpired: - process.kill() + interchange_server = InterchangeServer(experiment_dir, port) + interchange_server.daemon = True + interchange_server.start() # Wait for server to be ready - import httpx health_url = f"http://localhost:{port}/health" start_time = time.time() while time.time() - start_time < 20: - if process.poll() is not None: - logger.error(f"Interchange server subprocess failed to start. Return code: {process.returncode}") + if interchange_server.exitcode is not None: + logger.error(f"Interchange server subprocess failed to start. Return code: {interchange_server.exitcode}") break - try: if httpx.get(health_url, timeout=0.5).status_code == 200: break except Exception: pass - time.sleep(0.5) - atexit.register(cleanup) - - logger.info(f"Interchange server subprocess started on port {port} (pid: {process.pid})") + logger.info(f"Interchange server subprocess started on port {port} (pid: {interchange_server.pid})") return port -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="AJet Interchange Endpoint Server") - parser.add_argument("--experiment_dir", type=str, required=True, help="Directory to store debug info") - parser.add_argument("--port", type=int, required=True, help="Port to run the server on") - - args = parser.parse_args() - - async def serve_with_monitor(): - # Start the monitor task - asyncio.create_task(monitor_debug_state(args.experiment_dir)) - - # Start the server - config = uvicorn.Config( - app=app, - host="0.0.0.0", - port=args.port, - log_level="error", - ) - server = uvicorn.Server(config) - await server.serve() - - try: - asyncio.run(serve_with_monitor()) - except KeyboardInterrupt: - pass - diff --git a/ajet/tuner_lib/weight_tuner/experimental/zmq.py b/ajet/tuner_lib/weight_tuner/experimental/zmq.py new file mode 100644 index 00000000..d4bc462c --- /dev/null +++ b/ajet/tuner_lib/weight_tuner/experimental/zmq.py @@ -0,0 +1,12 @@ + +# /register_socket_address(self, name: str, socket_address: str): + +# /get_socket_address(self, name: str): + +# /remove_socket_address(self, name: str): + + + +def find_llm_provider_via_name(name: str): + pass + diff --git a/ajet/utils/smart_daemon.py b/ajet/utils/smart_daemon.py index d36ec9d8..25dac766 100644 --- a/ajet/utils/smart_daemon.py +++ b/ajet/utils/smart_daemon.py @@ -258,7 +258,8 @@ def launch( "Action": "Launching command", "Command": " ".join(self.cmd), "LogFile": str(log_file), - } + }, + header = "Smart Daemon Launch", ) f = open(log_file, "a") @@ -305,7 +306,8 @@ def launch( "Command": " ".join(self.cmd), "LogFile": str(log_file), "Converted": " ".join(converted_cmd), - } + }, + header = "Smart Daemon Launch - PTY", ) proc = subprocess.Popen( converted_cmd, From fc0a680053777e1d605f03a9d32d79385161035c Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 15 Jan 2026 02:31:17 +0800 Subject: [PATCH 444/462] maybe stable --- .gitignore | 3 +- ajet/backbone/main_vllm.py | 49 +++- ajet/task_rollout/async_llm_bridge.py | 218 +++++++++++++++++- ajet/task_rollout/single_worker.py | 2 +- .../experimental/as_oai_model_client.py | 56 +++-- .../experimental/as_oai_model_server.py | 64 +++-- 6 files changed, 345 insertions(+), 47 deletions(-) diff --git a/.gitignore b/.gitignore index 70bf5ad2..c16d08c4 100644 --- a/.gitignore +++ b/.gitignore @@ -150,4 +150,5 @@ saved_checkpoints data datasets tutorial2 -site \ No newline at end of file +site +dump.rdb diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index 2799b249..2dcf3256 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -3,7 +3,7 @@ from types import SimpleNamespace import hydra -from openai import OpenAI +from openai import AsyncOpenAI, OpenAI from ajet.backbone.warm_up import warm_up_process from ajet.task_rollout.native_parallel_worker import VerlRolloutManager @@ -88,6 +88,53 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ ) return messages + async def submit_chat_completions_async(self, messages, sampling_params, request_id, tools=[]): + client = AsyncOpenAI( + base_url=self.url, + api_key="token-abc123", + ) + sampling_params = dict( + n=1, + max_completion_tokens=self.config.ajet.rollout.max_response_length_in_one_turn, + ) + sampling_params["temperature"] = self.config.ajet.rollout.val_kwargs.temperature + sampling_params["top_k"] = self.config.ajet.rollout.val_kwargs.top_k + sampling_params["top_p"] = self.config.ajet.rollout.val_kwargs.top_p + + sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) + + if tools: + completion = await client.chat.completions.create( + model=self.config.ajet.model.path, + messages=messages, + tools=tools, + extra_body=sampling_params, + ) + else: + completion = await client.chat.completions.create( + model=self.config.ajet.model.path, + messages=messages, + extra_body=sampling_params, + ) + + message = completion.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) + + # sometimes tool use message has no content field + if "content" not in message: + message["content"] = "" + + messages.append( + { + "role": message["role"], + "request_id": completion.id, + "content": message["content"], + "tool_calls": message.get("tool_calls", None), + "tokens": [ + TokenAndProbVllmDebug(t) for t in completion.choices[0].logprobs.content # type: ignore + ], + } + ) + return messages def run(config): from ajet.task_reader import RouterTaskReader diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index 44019aa1..2f7c3ac2 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -63,7 +63,8 @@ def __init__( self.llm_mode = llm_mode self.max_llm_retries = max_llm_retries - def get_llm_inference_fn(self, sampling_params: dict = {}) -> Callable: # noqa: C901 + + def get_llm_inference_fn_sync(self, sampling_params: dict = {}) -> Callable: # noqa: C901 def llm_chat_verl( messages: List[Dict[str, str]], @@ -266,6 +267,206 @@ async def main(): + def get_llm_inference_fn_async(self, sampling_params: dict = {}) -> Callable: # noqa: C901 + + async def llm_chat_verl( + messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + tools=[], + request_id: str = "", + ) -> dict: + request_id = uuid.uuid4().hex + + updated_sampling_params = {} + if sampling_params: + updated_sampling_params.update(sampling_params) + if custom_sampling_params: + updated_sampling_params.update(custom_sampling_params) + + input_messages = copy.deepcopy(messages) + prompt_text = ajet_apply_chat_template( + tokenizer=self.tokenizer, + conversation=input_messages, + tools=tools, + add_generation_prompt=True, + tokenize=False, + ) + prompt_ids = self.tokenizer(prompt_text)["input_ids"] + + if self.config.ajet.execute_test: + _test_if_test_mode("prompt_text", prompt_text, self.config) + + final_res = await self.async_rollout_manager.generate( + request_id=request_id, + prompt_ids=prompt_ids, + sampling_params=updated_sampling_params, + ) + + if self.config.ajet.rollout.name == "vllm": + final_res: VerlVllmRequestOutput + token_array = final_res.outputs[0].token_ids + logprob_array = final_res.outputs[0].logprobs + elif self.config.ajet.rollout.name == "sglang": + token_array = final_res + + decoded_text = self.tokenizer.decode(token_array) # type: ignore + if self.config.ajet.execute_test: + decoded_text = _mock_if_test_mode("mock_decoded_text", decoded_text, self.config) + + if decoded_text.endswith("<|im_end|>"): + decoded_text = decoded_text[: -len("<|im_end|>")] + + # if tool call + tool_calls = None + if ( + ("" in decoded_text) + and ("" in decoded_text) + and (not self.config.ajet.rollout.force_disable_toolcalls) + ): + tool_parser = Hermes2ProToolParser(self.tokenizer) + parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore + parsed_tool_calls = parsed_tool_calls.model_dump() + if self.config.ajet.execute_test: + _test_if_test_mode( + "parsed_tool_calls", parsed_tool_calls["tool_calls"], self.config + ) + model_called = parsed_tool_calls["tools_called"] + if model_called: + tool_calls = parsed_tool_calls["tool_calls"] + is_bad_toolcall = False + for i in range(len(tool_calls)): + if "function" in tool_calls[i] and "arguments" in tool_calls[i]["function"]: + expect_dict = json.loads(tool_calls[i]["function"]["arguments"]) + if not isinstance(expect_dict, dict): + is_bad_toolcall = True + if is_bad_toolcall: + tool_calls = None + decoded_text = decoded_text + else: + decoded_text = parsed_tool_calls["content"] + if decoded_text is None: + decoded_text = "" + + return { + "role": "assistant", + "request_id": request_id, + "content": decoded_text, + "tool_calls": tool_calls, + "tokens": [ + TokenAndProb( + token_id=token_id, + logprob=logprob[token_id].logprob, # Warning: vllm logprob does not participant training (not reliable enough), for log only. + decoded_string=logprob[token_id].decoded_token, + ) + for token_id, logprob in zip(token_array, logprob_array) # type: ignore + ], + } + + + async def llm_chat_remote( + messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + tools=[], + request_id: str = "", + ) -> dict: + updated_sampling_params = {} + if sampling_params: + updated_sampling_params.update(sampling_params) + if custom_sampling_params: + updated_sampling_params.update(custom_sampling_params) + updated_sampling_params.update({"logprobs": 1, "return_tokens_as_token_ids": True}) + input_messages = copy.deepcopy(messages) + for i in range(self.max_llm_retries): + try: + # this function is defined in `ajet/backbone/main_vllm.py` + output_message = await self.async_rollout_manager.submit_chat_completions_async( + messages=input_messages, + sampling_params=updated_sampling_params, + tools=tools, + request_id=request_id, + ) + break + except Exception as e: + logger.bind(exception=True).exception(f"rollout_server.{i} error: {e.args}") + time.sleep(i + 1) + return output_message[-1] # type: ignore + + + async def llm_chat_trinity( + messages: List[Dict[str, str]], + custom_sampling_params: dict = {}, + tools=[], + request_id: str = "", + ) -> dict: + async def main(): + updated_sampling_params = {} + if sampling_params: + updated_sampling_params.update(sampling_params) + if custom_sampling_params: + updated_sampling_params.update(custom_sampling_params) + updated_sampling_params.pop("min_tokens") + + if tools: + response = await self.async_rollout_manager.chat.completions.create( + model=self.async_rollout_manager.model_path, + messages=messages, + logprobs=True, + tools=tools, + top_logprobs=0, + **updated_sampling_params, + ) + else: + response = await self.async_rollout_manager.chat.completions.create( + model=self.async_rollout_manager.model_path, + messages=messages, + logprobs=True, + top_logprobs=0, + **updated_sampling_params, + ) + return response + + response = await main() + prompt_text = self.tokenizer.decode(response.model_extra["prompt_token_ids"]) + prompt_token_ids = response.model_extra["prompt_token_ids"] + content = response.choices[0].message.content + message = response.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) + + if content is None: + content = "" + + if ("" in content) and (not message.get("tool_calls", None)): + # logger.bind(exception=True).exception(f"Bad toolcall discovered \n\nprompt_text:\n{prompt_text}\n\nrepsonse:\n{content}") + logger.warning(f"Bad toolcall discovered: {content}") + + return { + "role": "assistant", + "request_id": response.id, + "content": content, + "prompt_text": prompt_text, + "prompt_token_ids": prompt_token_ids, + "tool_calls": message.get("tool_calls", []), + "tokens": [ + TokenAndProb( + token_id=token, + logprob=tokenlogprob.logprob, # Warning: vllm logprob does not participant training, for log only. + decoded_string=tokenlogprob.token, + ) + for tokenlogprob, token in zip( + response.choices[0].logprobs.content, + response.choices[0].token_ids, + ) + ], + } + + if self.llm_mode == "remote": + return llm_chat_remote + if self.llm_mode == "trinity": + return llm_chat_trinity + else: + return llm_chat_verl + + + # ---------------------------------------------------------------------------------------------- # ------------------------ call async llm with context tracker (OpenAI) ------------------------ @@ -334,12 +535,15 @@ async def run_infer( # otherwise, for abnormal output, can still proceed, but we do not track output anymore # run llm inference ✨ - llm_output = await asyncio.wait_for( - asyncio.to_thread( - self.llm_inference_fn, converted_message, custom_sampling_params, tools - ), - timeout=1800, - ) + # if sync: + # llm_output = await asyncio.wait_for( + # asyncio.to_thread( + # self.llm_inference_fn, converted_message, custom_sampling_params, tools + # ), + # timeout=1800, + # ) + llm_output = await asyncio.wait_for(self.llm_inference_fn(converted_message, custom_sampling_params, tools), timeout=1800) + # begin context tracking self.context_tracker.step_track(llm_output, context_safe, converted_message, tools, timeline_uuid=timeline_uuid) diff --git a/ajet/task_rollout/single_worker.py b/ajet/task_rollout/single_worker.py index b837b60b..29b27036 100644 --- a/ajet/task_rollout/single_worker.py +++ b/ajet/task_rollout/single_worker.py @@ -84,7 +84,7 @@ def rollout_env_worker( (with validation overrides), and robust retry on transient failures. """ sampling_params = get_sample_params(mode, self.config) - llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn( + llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_async( sampling_params=sampling_params ) diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index fe2d0123..19daf6f8 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -140,7 +140,7 @@ def _handle_service_request(self, msg: bytes, sem: threading.Semaphore): try: data_as_json = json.loads(pickle.loads(msg)) timeline_uuid = data_as_json["timeline_uuid"] - topic = f"timeline_uuid:{timeline_uuid}/episode_uuid:{self.episode_uuid}" + topic = f"stream:timeline:{timeline_uuid}" logger.info(f"[client] {self.episode_uuid} | json.loads(pickle.loads(msg))") @@ -163,15 +163,17 @@ def _handle_service_request(self, msg: bytes, sem: threading.Semaphore): # send result back bytes_arr = pickle.dumps(result) logger.info(f"[client] {self.episode_uuid} | bytes_arr = pickle.dumps(result)") - redis_client.publish(topic, bytes_arr) - logger.info(f"[client] {self.episode_uuid} | redis_client.publish(topic, pickle.dumps(result))") + redis_client.xadd(topic, {'data': bytes_arr}) + redis_client.expire(topic, 600) # expire after 10 mins + logger.info(f"[client] {self.episode_uuid} | redis_client.xadd(topic, ...)") except Exception as e: err = f"[ERR]: Error when processing data: {data_as_json} Error: {e}" result = err logger.error(err) if topic: - redis_client.publish(topic, pickle.dumps(result)) + redis_client.xadd(topic, {'data': pickle.dumps(result)}) + redis_client.expire(topic, 600) finally: # release semaphore when done @@ -185,35 +187,53 @@ def _begin_service_threading(self): """begin listening for service requests in a threading model """ # logger.success(f"InterchangeClient starting for episode_uuid:{self.episode_uuid}") - debug_logs = [] + # debug_logs = [] begin_time = time.time() logger.info(f"[client] {self.episode_uuid} | Starting InterchangeClient service loop...") redis_client = get_redis_client() - redis_sub = redis_client.pubsub() - episode_topic = f"episode_uuid:{self.episode_uuid}" - redis_sub.subscribe(episode_topic) + episode_stream = f"stream:episode:{self.episode_uuid}" + sem = threading.Semaphore(8) # 4 concurrent requests max - logger.info(f"[client] {self.episode_uuid} | Subscribed to topic {episode_topic}, waiting for messages...") + logger.info(f"[client] {self.episode_uuid} | Listening to stream {episode_stream}, waiting for messages...") + + last_id = '0-0' is_init = True + try: while not self.should_terminate: # wait for a new message - logger.info(f"[client] {self.episode_uuid} | Waiting for new message on topic {episode_topic}...") - response = redis_sub.get_message(timeout=10) # type: ignore + logger.info(f"[client] {self.episode_uuid} | Waiting for new message on stream {episode_stream}...") + + # Check messages + try: + response = redis_client.xread({episode_stream: last_id}, count=1, block=30*1000) # block for 30 seconds (30000 ms) + except TimeoutError: + time.sleep(5) + continue + timepassed = time.time() - begin_time - if response is None: + if not response: if is_init and timepassed > 30: logger.warning(f"[client] Still waiting for first message... (time passed {timepassed}) for episode_uuid:{self.episode_uuid}...") continue - if response['type'] not in ['message', 'pmessage']: - continue - + # Got message is_init = False logger.info(f"[client] {self.episode_uuid} | get message...") - # got a message - msg: bytes = response['data'] # type: ignore + + stream_result = response[0] + messages = stream_result[1] + msg_id, data_dict = messages[0] + + last_id = msg_id + + if b'data' in data_dict: + msg: bytes = data_dict[b'data'] + else: + logger.error(f"Missing 'data' in stream message {msg_id}") + continue + # are we free to spawn a new thread? sem.acquire() logger.info(f"[client] {self.episode_uuid} | sem acquire...") @@ -225,6 +245,6 @@ def _begin_service_threading(self): return finally: - redis_sub.close() + redis_client.delete(episode_stream) redis_client.close() diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 157b6aa3..71f08ea9 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -91,51 +91,77 @@ def _begin_handle_chat_completion(int_req, episode_uuid, timeline_uuid, client_o logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (inside thread)") redis_client = get_redis_client() - episode_topic = f"episode_uuid:{episode_uuid}" - timeline_topic = f"timeline_uuid:{timeline_uuid}/episode_uuid:{episode_uuid}" - redis_sub = redis_client.pubsub() - redis_sub.subscribe(timeline_topic) + episode_stream = f"stream:episode:{episode_uuid}" + timeline_stream = f"stream:timeline:{timeline_uuid}" + max_wait_time = 600 # 10 minutes timeout try: - logger.info(f"episode_uuid: {episode_uuid} | redis_client.publish int_req ") - redis_client.publish(episode_topic, pickle.dumps(int_req.model_dump_json())) - logger.info(f"episode_uuid: {episode_uuid} | redis_client.publish int_req end") + logger.info(f"episode_uuid: {episode_uuid} | redis_client.xadd int_req ") + redis_client.xadd(episode_stream, {'data': pickle.dumps(int_req.model_dump_json())}) + logger.info(f"episode_uuid: {episode_uuid} | redis_client.xadd int_req end") # record start begin_time = time.time() - max_wait_time = 600 # 10 minutes timeout + # wait for result + last_id = '0-0' while not client_offline.is_set(): timepassed = time.time() - begin_time if timepassed > max_wait_time: return HTTPException(status_code=504, detail="Request timeout") try: - logger.info(f"episode_uuid: {episode_uuid} | redis_sub.get_message(timeout=60)") - result = redis_sub.get_message(timeout=60) - logger.info(f"episode_uuid: {episode_uuid} | redis_sub.get_message(timeout=60) after") - if result is None: + logger.info(f"episode_uuid: {episode_uuid} | redis_client.xread block=30000") + # Block for 30 seconds to allow loop to check client_offline + response = redis_client.xread({timeline_stream: last_id}, count=1, block=30*1000) # block for 30 seconds + logger.info(f"episode_uuid: {episode_uuid} | redis_client.xread after") + + if not response: if timepassed > 60: logger.warning(f"episode_uuid: {episode_uuid} | LLM client infer still waiting... (time passed {timepassed}) for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") continue - if result['type'] not in ['message', 'pmessage']: - continue - logger.info(f"episode_uuid: {episode_uuid} | successfully get message from redis_sub") - result_object_str = pickle.loads(result['data']) # type: ignore + + # response format: [[stream_name, [[message_id, data_dict]]]] + stream_result = response[0] + messages = stream_result[1] + message_id, data_dict = messages[0] + + logger.info(f"episode_uuid: {episode_uuid} | successfully get message from redis stream") + + # Retrieve data, decode_responses=False so keys/values are bytes + if b'data' in data_dict: + data_bytes = data_dict[b'data'] + else: + logger.error(f"Missing 'data' field in stream message: {data_dict}") + continue + + result_object_str = pickle.loads(data_bytes) + if result_object_str.startswith('[ERR]'): return HTTPException(status_code=500, detail="Error response, " + result_object_str) result_object = ChatCompletion(**json.loads(result_object_str)) + + # Cleanup stream + redis_client.delete(timeline_stream) + return result_object + except TimeoutError: logger.info(f"episode_uuid: {episode_uuid} | still waiting, (time passed {timepassed}) for result for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") continue + except Exception as e: + logger.error(f"Error reading from stream: {e}") + if timepassed > max_wait_time: + raise e + time.sleep(1) - except: - return HTTPException(status_code=500, detail="ZMQ communication socket failed.") + except Exception as e: + logger.error(f"Communication failed: {e}") + return HTTPException(status_code=500, detail=f"Communication failed: {e}") finally: - redis_sub.close() redis_client.close() + @app.post("/v1/chat/completions") async def chat_completions(request: Request, authorization: str = Header(None)): """ From 1da86e24b3dccf15cdff6828d8264be30dcd6925 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 15 Jan 2026 03:26:37 +0800 Subject: [PATCH 445/462] fix ctrl + c exit problem --- ajet/backbone/main_vllm.py | 4 +- .../experimental/as_oai_model_server.py | 306 +++++++++--------- ajet/tuner_lib/weight_tuner/middleware.py | 181 ----------- 3 files changed, 155 insertions(+), 336 deletions(-) delete mode 100644 ajet/tuner_lib/weight_tuner/middleware.py diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index 2dcf3256..e02647a5 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -1,3 +1,4 @@ +import atexit import os import sys from types import SimpleNamespace @@ -178,11 +179,10 @@ def run(config): ) def main(config): from omegaconf import OmegaConf - OmegaConf.resolve(config) - runtime_env = get_runtime_env() os.environ.update(runtime_env["env_vars"]) + # atexit.register(lambda: print("Process exiting, performing cleanup...")) if config.ajet.enable_experimental_reverse_proxy: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 71f08ea9..8ebe2f09 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -11,6 +11,7 @@ import asyncio from functools import cache +from contextlib import asynccontextmanager from multiprocessing import Process import threading from concurrent.futures import ThreadPoolExecutor @@ -72,168 +73,165 @@ def get_redis_client(): pool = get_redis_connection_pool() return redis.Redis(connection_pool=pool, decode_responses=False, encoding='utf-8') - # Create FastAPI app -app = FastAPI(title="AJet Interchange Endpoint") - -@app.on_event("startup") -async def startup_event(): - app.state.executor = ThreadPoolExecutor(max_workers=512) - -@app.on_event("shutdown") -async def shutdown_event(): - app.state.executor.shutdown() - - -def _begin_handle_chat_completion(int_req, episode_uuid, timeline_uuid, client_offline: asyncio.Event): - """ run this in thread to avoid blocking main event loop - """ - logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (inside thread)") - - redis_client = get_redis_client() - episode_stream = f"stream:episode:{episode_uuid}" - timeline_stream = f"stream:timeline:{timeline_uuid}" - - max_wait_time = 600 # 10 minutes timeout - try: - logger.info(f"episode_uuid: {episode_uuid} | redis_client.xadd int_req ") - redis_client.xadd(episode_stream, {'data': pickle.dumps(int_req.model_dump_json())}) - logger.info(f"episode_uuid: {episode_uuid} | redis_client.xadd int_req end") - - # record start - begin_time = time.time() - - # wait for result - last_id = '0-0' - while not client_offline.is_set(): - timepassed = time.time() - begin_time - if timepassed > max_wait_time: - return HTTPException(status_code=504, detail="Request timeout") - try: - logger.info(f"episode_uuid: {episode_uuid} | redis_client.xread block=30000") - # Block for 30 seconds to allow loop to check client_offline - response = redis_client.xread({timeline_stream: last_id}, count=1, block=30*1000) # block for 30 seconds - logger.info(f"episode_uuid: {episode_uuid} | redis_client.xread after") - - if not response: - if timepassed > 60: - logger.warning(f"episode_uuid: {episode_uuid} | LLM client infer still waiting... (time passed {timepassed}) for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") - continue +SERVER_SHUTDOWN_EVENT = threading.Event() - # response format: [[stream_name, [[message_id, data_dict]]]] - stream_result = response[0] - messages = stream_result[1] - message_id, data_dict = messages[0] - - logger.info(f"episode_uuid: {episode_uuid} | successfully get message from redis stream") - - # Retrieve data, decode_responses=False so keys/values are bytes - if b'data' in data_dict: - data_bytes = data_dict[b'data'] - else: - logger.error(f"Missing 'data' field in stream message: {data_dict}") - continue - - result_object_str = pickle.loads(data_bytes) - - if result_object_str.startswith('[ERR]'): - return HTTPException(status_code=500, detail="Error response, " + result_object_str) - result_object = ChatCompletion(**json.loads(result_object_str)) - - # Cleanup stream - redis_client.delete(timeline_stream) - - return result_object - - except TimeoutError: - logger.info(f"episode_uuid: {episode_uuid} | still waiting, (time passed {timepassed}) for result for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") - continue - except Exception as e: - logger.error(f"Error reading from stream: {e}") - if timepassed > max_wait_time: - raise e - time.sleep(1) - - except Exception as e: - logger.error(f"Communication failed: {e}") - return HTTPException(status_code=500, detail=f"Communication failed: {e}") - - finally: - redis_client.close() - - -@app.post("/v1/chat/completions") -async def chat_completions(request: Request, authorization: str = Header(None)): - """ - OpenAI-compatible chat completions endpoint. - Receives ChatCompletionRequest and returns ChatCompletion. - """ - # Parse authorization header (base64 encoded JSON) - if not authorization: - return HTTPException(status_code=401, detail="Missing authorization header") - - try: - # Remove "Bearer " prefix if present - auth_token = authorization.replace("Bearer ", "").replace("bearer ", "") - decoded = base64.b64decode(auth_token).decode('utf-8') - auth_data = json.loads(decoded) - - agent_name = auth_data.get("agent_name") - target_tag = auth_data.get("target_tag") - episode_uuid = auth_data.get("episode_uuid") - - if not all([agent_name, target_tag, episode_uuid]): - return HTTPException(status_code=401, detail="Invalid authorization data") - except Exception as e: - return HTTPException(status_code=401, detail=f"Invalid authorization header: {str(e)}") - - # Parse request body - body = await request.json() - new_req = ChatCompletionRequest.model_validate(body) - if new_req.stream: - return HTTPException(status_code=400, detail="Streaming responses not supported in current AgentJet version, please set `stream=false` for now.") - # Create timeline UUID - timeline_uuid = uuid.uuid4().hex - - # Add to received queue - # logger.warning(f"Received new chat completion request for agent: {agent_name}, target_tag: {target_tag}, episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid}") - int_req = InterchangeCompletionRequest( - completion_request = new_req, - agent_name = agent_name, - target_tag = target_tag, - episode_uuid = episode_uuid, - timeline_uuid = timeline_uuid, - ) - logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (outside thread)") - client_offline = asyncio.Event() - try: - loop = asyncio.get_running_loop() - return await loop.run_in_executor(request.app.state.executor, _begin_handle_chat_completion, int_req, episode_uuid, timeline_uuid, client_offline) - finally: - client_offline.set() +def get_app(): + + @asynccontextmanager + async def lifespan(app: FastAPI): + # Startup + SERVER_SHUTDOWN_EVENT.clear() + app.state.executor = ThreadPoolExecutor(max_workers=512) + yield + # Shutdown + SERVER_SHUTDOWN_EVENT.set() + app.state.executor.shutdown(wait=False, cancel_futures=True) + + + + app = FastAPI(title="AJet Interchange Endpoint", lifespan=lifespan) + def _begin_handle_chat_completion(int_req, episode_uuid, timeline_uuid, client_offline: threading.Event): + """ run this in thread to avoid blocking main event loop + """ + logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (inside thread)") + redis_client = get_redis_client() + episode_stream = f"stream:episode:{episode_uuid}" + timeline_stream = f"stream:timeline:{timeline_uuid}" -@app.post("/reset") -async def reset(): + max_wait_time = 600 # 10 minutes timeout + try: + logger.info(f"episode_uuid: {episode_uuid} | redis_client.xadd int_req ") + redis_client.xadd(episode_stream, {'data': pickle.dumps(int_req.model_dump_json())}) + logger.info(f"episode_uuid: {episode_uuid} | redis_client.xadd int_req end") + + # record start + begin_time = time.time() + + # wait for result + last_id = '0-0' + while (not client_offline.is_set()) and (not SERVER_SHUTDOWN_EVENT.is_set()): + timepassed = time.time() - begin_time + if timepassed > max_wait_time: + return HTTPException(status_code=504, detail="Request timeout") + try: + logger.info(f"episode_uuid: {episode_uuid} | redis_client.xread block=30000") + # Block for 30 seconds to allow loop to check client_offline + response = redis_client.xread({timeline_stream: last_id}, count=1, block=30*1000) # block for 30 seconds + logger.info(f"episode_uuid: {episode_uuid} | redis_client.xread after") + + + if not response: + if timepassed > 60: + logger.warning(f"episode_uuid: {episode_uuid} | LLM client infer still waiting... (time passed {timepassed}) for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") + continue + + # response format: [[stream_name, [[message_id, data_dict]]]] + stream_result = response[0] # type: ignore + messages = stream_result[1] + message_id, data_dict = messages[0] + + logger.info(f"episode_uuid: {episode_uuid} | successfully get message from redis stream") + + # Retrieve data, decode_responses=False so keys/values are bytes + if b'data' in data_dict: + data_bytes = data_dict[b'data'] + else: + logger.error(f"Missing 'data' field in stream message: {data_dict}") + continue + + result_object_str = pickle.loads(data_bytes) + + if result_object_str.startswith('[ERR]'): + return HTTPException(status_code=500, detail="Error response, " + result_object_str) + result_object = ChatCompletion(**json.loads(result_object_str)) + + # Cleanup stream + redis_client.delete(timeline_stream) + + return result_object + + except TimeoutError: + logger.info(f"episode_uuid: {episode_uuid} | still waiting, (time passed {timepassed}) for result for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") + continue + except Exception as e: + logger.error(f"Error reading from stream: {e}") + if timepassed > max_wait_time: + raise e + time.sleep(1) + + except Exception as e: + logger.error(f"Communication failed: {e}") + return HTTPException(status_code=500, detail=f"Communication failed: {e}") + + finally: + redis_client.close() + + + @app.post("/v1/chat/completions") + async def chat_completions(request: Request, authorization: str = Header(None)): + """ + OpenAI-compatible chat completions endpoint. + Receives ChatCompletionRequest and returns ChatCompletion. + """ + # Parse authorization header (base64 encoded JSON) + if not authorization: + return HTTPException(status_code=401, detail="Missing authorization header") - return {"status": "reset_complete"} + try: + # Remove "Bearer " prefix if present + auth_token = authorization.replace("Bearer ", "").replace("bearer ", "") + decoded = base64.b64decode(auth_token).decode('utf-8') + auth_data = json.loads(decoded) + + agent_name = auth_data.get("agent_name") + target_tag = auth_data.get("target_tag") + episode_uuid = auth_data.get("episode_uuid") + + if not all([agent_name, target_tag, episode_uuid]): + return HTTPException(status_code=401, detail="Invalid authorization data") + except Exception as e: + return HTTPException(status_code=401, detail=f"Invalid authorization header: {str(e)}") + + # Parse request body + body = await request.json() + new_req = ChatCompletionRequest.model_validate(body) + if new_req.stream: + return HTTPException(status_code=400, detail="Streaming responses not supported in current AgentJet version, please set `stream=false` for now.") + # Create timeline UUID + timeline_uuid = uuid.uuid4().hex + + # Add to received queue + # logger.warning(f"Received new chat completion request for agent: {agent_name}, target_tag: {target_tag}, episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid}") + int_req = InterchangeCompletionRequest( + completion_request = new_req, + agent_name = agent_name, + target_tag = target_tag, + episode_uuid = episode_uuid, + timeline_uuid = timeline_uuid, + ) + logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (outside thread)") + client_offline = threading.Event() + try: + loop = asyncio.get_running_loop() + return await loop.run_in_executor(request.app.state.executor, _begin_handle_chat_completion, int_req, episode_uuid, timeline_uuid, client_offline) + finally: + client_offline.set() -async def monitor_debug_state(experiment_dir): - """ - Background task to write debug state to ./interchange_debug.txt every 1 second. - """ - while True: - await asyncio.sleep(4) -def ensure_dat_interchange_server_cache_clear(): - return + @app.post("/reset") + async def reset(): + return {"status": "reset_complete"} + return app + class InterchangeServer(Process): def __init__(self, experiment_dir: str, port: int): super().__init__() @@ -241,9 +239,8 @@ def __init__(self, experiment_dir: str, port: int): self.port = port def run(self): + app = get_app() async def serve_with_monitor(): - # Start the monitor task - asyncio.create_task(monitor_debug_state(self.experiment_dir)) # Start the server config = uvicorn.Config( app=app, @@ -254,8 +251,11 @@ async def serve_with_monitor(): ) server = uvicorn.Server(config) await server.serve() - - asyncio.run(serve_with_monitor()) + try: + asyncio.run(serve_with_monitor()) + except KeyboardInterrupt as e: + SERVER_SHUTDOWN_EVENT.set() + raise e # Convenience function for quick server startup @@ -270,7 +270,6 @@ def start_interchange_server(experiment_dir) -> int: os.environ["AJET_DAT_INTERCHANGE_PORT"] = str(port) interchange_server = InterchangeServer(experiment_dir, port) - interchange_server.daemon = True interchange_server.start() # Wait for server to be ready @@ -288,6 +287,7 @@ def start_interchange_server(experiment_dir) -> int: time.sleep(0.5) logger.info(f"Interchange server subprocess started on port {port} (pid: {interchange_server.pid})") + atexit.register(lambda: interchange_server.terminate()) return port diff --git a/ajet/tuner_lib/weight_tuner/middleware.py b/ajet/tuner_lib/weight_tuner/middleware.py deleted file mode 100644 index f2689e0a..00000000 --- a/ajet/tuner_lib/weight_tuner/middleware.py +++ /dev/null @@ -1,181 +0,0 @@ -# EXPERIMENTAL: -# This is a global store for cross-machine tuner request proxy -# unless your workflow have to be executed across multiple machines -# you probably don't need this at all. - -global CROSS_MACHINE_TUNER_REQUEST_PROXY_STORE -CROSS_MACHINE_TUNER_REQUEST_PROXY_STORE = dict() - -import asyncio -from typing import Optional, Union, Annotated -from fastapi import APIRouter, Depends, Request, HTTPException, status -from fastapi.responses import JSONResponse, StreamingResponse -from pydantic import BaseModel, ConfigDict, Field -from collections.abc import AsyncGenerator, AsyncIterator -from collections.abc import Sequence as GenericSequence -from http import HTTPStatus -from vllm.entrypoints.openai.protocol import (CompletionLogProbs, - CompletionRequest, - CompletionResponse, - CompletionResponseChoice, - CompletionResponseStreamChoice, - CompletionStreamResponse, - ErrorResponse, - PromptTokenUsageInfo, - RequestResponseMetadata, - UsageInfo) -from transformers import (AutoTokenizer, PreTrainedTokenizer, - PreTrainedTokenizerFast) -from vllm.inputs.parse import parse_and_batch_prompt -from vllm.entrypoints.openai.serving_engine import ( - TextTokensPrompt, - EmbedsPrompt, - AnyRequest, -) - -router = APIRouter() - -async def _normalize_prompt_text_to_input( - request: AnyRequest, - tokenizer: PreTrainedTokenizer, - prompt: str, - truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]], - add_special_tokens: bool, -) -> TextTokensPrompt: - - def _get_async_tokenizer(tokenizer: PreTrainedTokenizer): - async def async_tokenizer( - prompt: str, - add_special_tokens: bool = True, - truncation: bool = False, - ): - return await asyncio.to_thread( - tokenizer.__call__, - prompt, - add_special_tokens=add_special_tokens, - truncation=truncation, - ) - return async_tokenizer - - assert truncate_prompt_tokens is None - async_tokenizer = _get_async_tokenizer(tokenizer) - encoded = await async_tokenizer(prompt, add_special_tokens=add_special_tokens) - - input_ids = encoded.input_ids - input_text = prompt - - return self._validate_input(request, input_ids, input_text) - - -async def _tokenize_prompt_input_or_inputs_async( - request: AnyRequest, - tokenizer: PreTrainedTokenizer, - input_or_inputs: Optional[Union[str, list[str], list[int], - list[list[int]]]], - truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None, - add_special_tokens: bool = True, -) -> tuple[list[TextTokensPrompt], list[EmbedsPrompt]]: - - inputs_text = list[TextTokensPrompt]() - - # Parse and batch the input prompts - batch_inputs = parse_and_batch_prompt(input_or_inputs) - - # Process each input in the batch concurrently - tasks = [] - for prompt_input in batch_inputs: - assert not prompt_input["is_tokens"] - task = _normalize_prompt_text_to_input( - request, - tokenizer, - prompt_input["content"], - truncate_prompt_tokens=truncate_prompt_tokens, - add_special_tokens=add_special_tokens) - - tasks.append(task) - - # Wait for all tokenization tasks to complete - results = await asyncio.gather(*tasks) - inputs_text.extend(results) - - return inputs_text, [] - -async def _preprocess_completion( - request, - tokenizer, - input_or_inputs: Optional[Union[str, list[str], list[int], - list[list[int]]]], - truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None, - add_special_tokens: bool = True, -): - - (request_prompts_text, request_prompts_embeds - ) = await _tokenize_prompt_input_or_inputs_async( - request, - tokenizer, - input_or_inputs, - truncate_prompt_tokens=truncate_prompt_tokens, - add_special_tokens=add_special_tokens, - ) - - request_prompts = request_prompts_text - return request_prompts, None - -async def create_completion( - request: CompletionRequest, - raw_request: Optional[Request] = None, -) -> Union[AsyncGenerator[str, None], CompletionResponse, ErrorResponse]: - - tokenizer = await self.engine_client.get_tokenizer(lora_request) - - request_prompts, engine_prompts = await _preprocess_completion( - request, - tokenizer, - request.prompt, - truncate_prompt_tokens=request.truncate_prompt_tokens, - add_special_tokens=request.add_special_tokens, - ) - return request_prompts - - - -@router.post("/v1/completions", - dependencies=[Depends(validate_json_request)], - responses={ - HTTPStatus.OK.value: { - "content": { - "text/event-stream": {} - } - }, - HTTPStatus.BAD_REQUEST.value: { - "model": ErrorResponse - }, - HTTPStatus.NOT_FOUND.value: { - "model": ErrorResponse - }, - HTTPStatus.INTERNAL_SERVER_ERROR.value: { - "model": ErrorResponse - }, - }) -async def create_completion(request: CompletionRequest, raw_request: Request): - """The idea is simple: parse request, get apply chat template and tokenize - - Args: - request (CompletionRequest): _description_ - raw_request (Request): _description_ - - Returns: - _type_: _description_ - """ - - - # from api key or url, read `agent_name`, `uuid` etc - - session_uuid = ... - CROSS_MACHINE_TUNER_REQUEST_PROXY_STORE[session_uuid] = request - - # convert to prompt - request_prompts = await create_completion(request, raw_request) - - - return StreamingResponse(content=generator, media_type="text/event-stream") From 2c05d114f98b8c802821324a5d37adc3821f906d Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 15 Jan 2026 16:21:26 +0800 Subject: [PATCH 446/462] optimize parallel performance with zmq --- ajet/backbone/trainer_verl.py | 8 +- ajet/default_config/ajet_default.yaml | 3 + ajet/task_rollout/async_llm_bridge.py | 26 +-- ajet/task_rollout/single_worker.py | 12 +- ajet/tuner.py | 2 + .../weight_tuner/as_oai_baseurl_apikey.py | 3 + .../experimental/as_oai_model_client.py | 187 +++++++----------- .../experimental/as_oai_model_server.py | 157 +++++---------- ajet/utils/core_env_vars.py | 11 +- ajet/utils/free_port.py | 9 + ajet/utils/launch_utils.py | 3 + ajet/utils/sington.py | 19 ++ 12 files changed, 190 insertions(+), 250 deletions(-) create mode 100644 ajet/utils/free_port.py create mode 100644 ajet/utils/sington.py diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index 3cbb08ad..cb722680 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -834,10 +834,10 @@ def fit(self): # noqa: C901 progress_bar.update(1) self.global_steps += 1 - # when enabled oai request interchange, we need to clear the cache from time to time - if self.config.ajet.enable_experimental_reverse_proxy: - from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import ensure_dat_interchange_server_cache_clear - ensure_dat_interchange_server_cache_clear() + # # when enabled oai request interchange, we need to clear the cache from time to time + # if self.config.ajet.enable_experimental_reverse_proxy: + # from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import ensure_dat_interchange_server_cache_clear + # ensure_dat_interchange_server_cache_clear() if is_last_step: pprint(f"Final validation metrics: {last_val_metrics}") diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 64135667..310bf6fe 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -9,6 +9,9 @@ ajet: # the experimental reverse proxy feature that allows `tuner.as_oai_baseurl_apikey` feature enable_experimental_reverse_proxy: False + # submit llm infer submit method + llm_infer_submit_method: "async" # options: "sync", "async" + task_runner: wrapper_type: "asyncio-with-gc" wrapper_multiprocessing_timeout: 3600 # in seconds diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index 2f7c3ac2..79c74d29 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -62,7 +62,7 @@ def __init__( self.tokenizer = tokenizer self.llm_mode = llm_mode self.max_llm_retries = max_llm_retries - + self.tool_parser = Hermes2ProToolParser(self.tokenizer) def get_llm_inference_fn_sync(self, sampling_params: dict = {}) -> Callable: # noqa: C901 @@ -123,8 +123,7 @@ def llm_chat_verl( and ("" in decoded_text) and (not self.config.ajet.rollout.force_disable_toolcalls) ): - tool_parser = Hermes2ProToolParser(self.tokenizer) - parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore + parsed_tool_calls = self.tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() if self.config.ajet.execute_test: _test_if_test_mode( @@ -323,8 +322,8 @@ async def llm_chat_verl( and ("" in decoded_text) and (not self.config.ajet.rollout.force_disable_toolcalls) ): - tool_parser = Hermes2ProToolParser(self.tokenizer) - parsed_tool_calls = tool_parser.extract_tool_calls(decoded_text, None) # type: ignore + + parsed_tool_calls = self.tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() if self.config.ajet.execute_test: _test_if_test_mode( @@ -535,14 +534,15 @@ async def run_infer( # otherwise, for abnormal output, can still proceed, but we do not track output anymore # run llm inference ✨ - # if sync: - # llm_output = await asyncio.wait_for( - # asyncio.to_thread( - # self.llm_inference_fn, converted_message, custom_sampling_params, tools - # ), - # timeout=1800, - # ) - llm_output = await asyncio.wait_for(self.llm_inference_fn(converted_message, custom_sampling_params, tools), timeout=1800) + if self.config.ajet.llm_infer_submit_method == "sync": + llm_output = await asyncio.wait_for( + asyncio.to_thread( + self.llm_inference_fn, converted_message, custom_sampling_params, tools + ), + timeout=1800, + ) + else: + llm_output = await asyncio.wait_for(self.llm_inference_fn(converted_message, custom_sampling_params, tools), timeout=1800) # begin context tracking diff --git a/ajet/task_rollout/single_worker.py b/ajet/task_rollout/single_worker.py index 29b27036..a9e77ac7 100644 --- a/ajet/task_rollout/single_worker.py +++ b/ajet/task_rollout/single_worker.py @@ -84,9 +84,15 @@ def rollout_env_worker( (with validation overrides), and robust retry on transient failures. """ sampling_params = get_sample_params(mode, self.config) - llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_async( - sampling_params=sampling_params - ) + + if self.config.ajet.llm_infer_submit_method == "sync": + llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_sync( + sampling_params=sampling_params + ) + else: + llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_async( + sampling_params=sampling_params + ) workflow_task = WorkflowTask( env_type=task.env_type, diff --git a/ajet/tuner.py b/ajet/tuner.py index 8f963227..46275698 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -114,6 +114,7 @@ def as_oai_baseurl_apikey( agent_name=agent_name, target_tag=target_tag, episode_uuid=self.context_tracker.episode_uuid, + episode_contect_address=self.interchange_client.episode_contect_address, ) return baseurl_apikey_model @@ -178,6 +179,7 @@ def _enable_experimental_interchange_server(self, llm_inference_fn): config=self.config, llm_inference_fn=llm_inference_fn, ) + return self.interchange_client.begin_service() def terminate_episode(self): diff --git a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py index 25b82766..06d9fe73 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py @@ -12,6 +12,7 @@ from openai.resources.chat.chat import Chat, AsyncChat from openai.resources.completions import AsyncCompletions from openai import OpenAI, AsyncOpenAI +from ajet.utils.free_port import find_free_port from .experimental.as_oai_model_client import generate_auth_token if TYPE_CHECKING: @@ -43,6 +44,7 @@ def __init__( target_tag: str, agent_name: str, episode_uuid: str, + episode_contect_address: str, **kwargs, ): port = os.getenv("AJET_DAT_INTERCHANGE_PORT") @@ -52,6 +54,7 @@ def __init__( agent_name=agent_name, target_tag=target_tag, episode_uuid=episode_uuid, + episode_address=episode_contect_address, ) model = "reserved_field" diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index 19daf6f8..e2007143 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -1,5 +1,6 @@ import asyncio +import atexit import json import threading import os @@ -9,14 +10,17 @@ from typing import Optional, List, Dict, Any, Union, TYPE_CHECKING from vllm.entrypoints.openai.protocol import ChatCompletionRequest, ChatCompletionResponse from openai.types.chat.chat_completion import ChatCompletion +from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import InterchangeCompletionRequest from redis.exceptions import TimeoutError - +from ajet.utils.free_port import find_free_port +from ajet.utils.sington import ThreadExecutorLlmInferSingleton, ThreadExecutorSingleton from functools import cache import pickle import httpx import zmq import logging + logging.getLogger("httpx").setLevel(logging.WARNING) import base64 @@ -25,7 +29,10 @@ if TYPE_CHECKING: from ajet.context_tracker.multiagent_tracking import MultiAgentContextTracker -def generate_auth_token(agent_name, target_tag, episode_uuid): +DEBUG = False +# DEBUG = True + +def generate_auth_token(agent_name, target_tag, episode_uuid, episode_address): """ Generate a Base64-encoded auth_token from the given agent_name, target_tag, and episode_uuid. @@ -41,7 +48,8 @@ def generate_auth_token(agent_name, target_tag, episode_uuid): auth_data = { "agent_name": agent_name, "target_tag": target_tag, - "episode_uuid": episode_uuid + "episode_uuid": episode_uuid, + "episode_address": episode_address, } # Step 2: Convert the dictionary to a JSON string @@ -68,12 +76,15 @@ def get_redis_connection_pool(): ) return pool - +@cache def get_redis_client(): pool = get_redis_connection_pool() return redis.Redis(connection_pool=pool, decode_responses=False, encoding='utf-8') +context = zmq.Context() +atexit.register(context.term) + class InterchangeClient: def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker", llm_inference_fn, config): @@ -82,7 +93,10 @@ def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker self.llm_inference_fn = llm_inference_fn self.config = config self._should_terminate = False - self.begin_service() + + # self.episode_contect_address = f"tcp://localhost:{find_free_port()}" + self.ipc_path = f"/tmp/ajet/{self.episode_uuid}.sock" + self.episode_contect_address = f"ipc://{self.ipc_path}" async def llm_infer( @@ -124,127 +138,78 @@ def begin_service(self): """ Starts the SSE service loop. """ - t = threading.Thread(target=self._begin_service_threading, daemon=True) - t.start() - - - def _handle_service_request(self, msg: bytes, sem: threading.Semaphore): - """handle a single service request in its own thread - """ - from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import InterchangeCompletionRequest - logger.info(f"[client] {self.episode_uuid} | inside _handle_service_request") - redis_client = get_redis_client() - logger.info(f"[client] {self.episode_uuid} | get_redis_client") - data_as_json = "" - topic = "" - try: - data_as_json = json.loads(pickle.loads(msg)) - timeline_uuid = data_as_json["timeline_uuid"] - topic = f"stream:timeline:{timeline_uuid}" - logger.info(f"[client] {self.episode_uuid} | json.loads(pickle.loads(msg))") - - - if "health_check" in data_as_json and data_as_json["health_check"]: - # logger.info(f"Received health check for timeline_uuid: {timeline_uuid}") - result = '{"health_check_ok": "True"}' - # logger.success(f"Health check OK for timeline_uuid: {timeline_uuid}") - else: - parsed_msg = InterchangeCompletionRequest(**data_as_json) - # start llm request - result = asyncio.run(self.llm_infer( - req=parsed_msg.completion_request, - timeline_uuid=parsed_msg.timeline_uuid, - agent_name=parsed_msg.agent_name, - target_tag=parsed_msg.target_tag, - episode_uuid=parsed_msg.episode_uuid, - )).model_dump_json() - # logger.success(f"LLM inference completed for timeline_uuid: {timeline_uuid}") - logger.info(f"[client] {self.episode_uuid} | result = asyncio.run(self.llm_infer") - # send result back - bytes_arr = pickle.dumps(result) - logger.info(f"[client] {self.episode_uuid} | bytes_arr = pickle.dumps(result)") - redis_client.xadd(topic, {'data': bytes_arr}) - redis_client.expire(topic, 600) # expire after 10 mins - logger.info(f"[client] {self.episode_uuid} | redis_client.xadd(topic, ...)") - - except Exception as e: - err = f"[ERR]: Error when processing data: {data_as_json} Error: {e}" - result = err - logger.error(err) - if topic: - redis_client.xadd(topic, {'data': pickle.dumps(result)}) - redis_client.expire(topic, 600) - - finally: - # release semaphore when done - sem.release() - redis_client.close() + if DEBUG: logger.info(f"[client] {self.episode_uuid} | Starting InterchangeClient service loop...") + self.socket = context.socket(zmq.REP) + self.socket.bind(f"{self.episode_contect_address}") + self.socket.setsockopt(zmq.RCVTIMEO, 2*1000) # 60 秒超时 + self.executor = ThreadExecutorSingleton().get_executor() + if DEBUG: logger.info(f"[client] {self.episode_uuid} | Submitting _begin_service_threading to executor...") + future = self.executor.submit(self._begin_service_threading) + time.sleep(1) + while future._state == 'PENDING': + time.sleep(1) + if DEBUG: logger.info(f"[client] {self.episode_uuid} | Future ready...") + # t = threading.Thread(target=self._begin_service_threading, daemon=True) + # t.start() + return self.episode_contect_address def _begin_service_threading(self): """begin listening for service requests in a threading model """ - # logger.success(f"InterchangeClient starting for episode_uuid:{self.episode_uuid}") - # debug_logs = [] - begin_time = time.time() - logger.info(f"[client] {self.episode_uuid} | Starting InterchangeClient service loop...") - redis_client = get_redis_client() - episode_stream = f"stream:episode:{self.episode_uuid}" - - sem = threading.Semaphore(8) # 4 concurrent requests max - logger.info(f"[client] {self.episode_uuid} | Listening to stream {episode_stream}, waiting for messages...") - last_id = '0-0' - is_init = True + begin_time = time.time() + if DEBUG: logger.info(f"[client] {self.episode_uuid} | Starting ZMQ socket bind complete") try: while not self.should_terminate: - # wait for a new message - logger.info(f"[client] {self.episode_uuid} | Waiting for new message on stream {episode_stream}...") - # Check messages try: - response = redis_client.xread({episode_stream: last_id}, count=1, block=30*1000) # block for 30 seconds (30000 ms) - except TimeoutError: - time.sleep(5) - continue - - timepassed = time.time() - begin_time - - if not response: - if is_init and timepassed > 30: - logger.warning(f"[client] Still waiting for first message... (time passed {timepassed}) for episode_uuid:{self.episode_uuid}...") + if DEBUG: logger.info(f"[client] {self.episode_uuid} | socket.recv_string() has begun") + message = self.socket.recv_string() + if DEBUG: logger.info(f"[client] {self.episode_uuid} | socket.recv_string() is done") + except zmq.Again as e: + if self.should_terminate: + if DEBUG: logger.info(f"[client] {self.episode_uuid} | episode over") + break + timepassed = time.time() - begin_time + if timepassed > 60: + logger.warning(f"[client] {self.episode_uuid} | Still waiting for first message... (time passed {timepassed}) for episode_uuid:{self.episode_uuid}...") continue - # Got message - is_init = False - logger.info(f"[client] {self.episode_uuid} | get message...") - - stream_result = response[0] - messages = stream_result[1] - msg_id, data_dict = messages[0] - - last_id = msg_id - - if b'data' in data_dict: - msg: bytes = data_dict[b'data'] - else: - logger.error(f"Missing 'data' in stream message {msg_id}") - continue - - # are we free to spawn a new thread? - sem.acquire() - logger.info(f"[client] {self.episode_uuid} | sem acquire...") - # begin a new thread to handle this request - threading.Thread(target=self._handle_service_request, args=(msg, sem), daemon=True).start() - + if DEBUG: logger.info(f"[client] {self.episode_uuid} | before json.loads(message)") + data_as_json = json.loads(message) + parsed_msg = InterchangeCompletionRequest(**data_as_json) - except KeyboardInterrupt: - return + if DEBUG: logger.info(f"[client] {self.episode_uuid} | before asyncio run self.llm_infer") + try: + loop = asyncio.get_running_loop() + except: + loop = asyncio.new_event_loop() + executor = ThreadExecutorLlmInferSingleton().get_executor() + future = loop.run_in_executor( + executor, # executor + asyncio.run, + self.llm_infer( + req=parsed_msg.completion_request, + timeline_uuid=parsed_msg.timeline_uuid, + agent_name=parsed_msg.agent_name, + target_tag=parsed_msg.target_tag, + episode_uuid=parsed_msg.episode_uuid, + ) + ) + result = loop.run_until_complete(future).model_dump_json() # type: ignore + + if DEBUG: logger.info(f"[client] {self.episode_uuid} | before send_string") + self.socket.send_string(result) + except: + logger.exception(f"[client] {self.episode_uuid} | Exception occurred in service loop.") finally: - redis_client.delete(episode_stream) - redis_client.close() - + self.socket.close() + if DEBUG: logger.info(f"[client] {self.episode_uuid} | ZMQ socket closed, service loop terminated.") + if os.path.exists(self.ipc_path): + os.remove(self.ipc_path) + if DEBUG: logger.info(f"[client] {self.episode_uuid} | IPC socket file {self.ipc_path} removed.") diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 8ebe2f09..e77997fb 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -10,27 +10,14 @@ """ import asyncio -from functools import cache -from contextlib import asynccontextmanager -from multiprocessing import Process import threading -from concurrent.futures import ThreadPoolExecutor import uuid import time -from collections import defaultdict -from typing import Dict, List + import base64 import json import os -import pickle -import redis -from redis.exceptions import TimeoutError -from pprint import pformat -from loguru import logger - -from pydantic import BaseModel, ConfigDict, model_validator -from fastapi import FastAPI, Header, HTTPException, Request, Body -from fastapi.responses import StreamingResponse +import zmq import uvicorn import sys import subprocess @@ -38,6 +25,16 @@ import argparse import httpx +from loguru import logger +from collections import defaultdict +from typing import Dict, List +from pydantic import BaseModel, ConfigDict, model_validator +from fastapi import FastAPI, Header, HTTPException, Request, Body +from fastapi.responses import StreamingResponse +from contextlib import asynccontextmanager +from multiprocessing import Process +from concurrent.futures import ThreadPoolExecutor + from vllm.entrypoints.openai.protocol import ChatCompletionRequest from openai.types.chat.chat_completion import ChatCompletion @@ -56,25 +53,15 @@ class HealthCheckRequest(BaseModel): timeline_uuid: str health_check: bool = True -@cache -def get_redis_connection_pool(): - pool = redis.BlockingConnectionPool( - host='localhost', - port=6379, - max_connections=256, - socket_timeout=30, - socket_connect_timeout=30, - retry_on_timeout=True - ) - return pool +# Create FastAPI app +SERVER_SHUTDOWN_EVENT = threading.Event() +DEBUG = False +# DEBUG = True -def get_redis_client(): - pool = get_redis_connection_pool() - return redis.Redis(connection_pool=pool, decode_responses=False, encoding='utf-8') +context = zmq.Context() +atexit.register(context.term) -# Create FastAPI app -SERVER_SHUTDOWN_EVENT = threading.Event() def get_app(): @@ -88,87 +75,38 @@ async def lifespan(app: FastAPI): SERVER_SHUTDOWN_EVENT.set() app.state.executor.shutdown(wait=False, cancel_futures=True) - - app = FastAPI(title="AJet Interchange Endpoint", lifespan=lifespan) - def _begin_handle_chat_completion(int_req, episode_uuid, timeline_uuid, client_offline: threading.Event): + def _begin_handle_chat_completion(episode_address, int_req: InterchangeCompletionRequest, episode_uuid, timeline_uuid, client_offline: threading.Event): """ run this in thread to avoid blocking main event loop """ - logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (inside thread)") - - redis_client = get_redis_client() - episode_stream = f"stream:episode:{episode_uuid}" - timeline_stream = f"stream:timeline:{timeline_uuid}" - - max_wait_time = 600 # 10 minutes timeout - try: - logger.info(f"episode_uuid: {episode_uuid} | redis_client.xadd int_req ") - redis_client.xadd(episode_stream, {'data': pickle.dumps(int_req.model_dump_json())}) - logger.info(f"episode_uuid: {episode_uuid} | redis_client.xadd int_req end") - - # record start - begin_time = time.time() - - # wait for result - last_id = '0-0' - while (not client_offline.is_set()) and (not SERVER_SHUTDOWN_EVENT.is_set()): - timepassed = time.time() - begin_time - if timepassed > max_wait_time: - return HTTPException(status_code=504, detail="Request timeout") - try: - logger.info(f"episode_uuid: {episode_uuid} | redis_client.xread block=30000") - # Block for 30 seconds to allow loop to check client_offline - response = redis_client.xread({timeline_stream: last_id}, count=1, block=30*1000) # block for 30 seconds - logger.info(f"episode_uuid: {episode_uuid} | redis_client.xread after") - - - if not response: - if timepassed > 60: - logger.warning(f"episode_uuid: {episode_uuid} | LLM client infer still waiting... (time passed {timepassed}) for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") - continue - - # response format: [[stream_name, [[message_id, data_dict]]]] - stream_result = response[0] # type: ignore - messages = stream_result[1] - message_id, data_dict = messages[0] - - logger.info(f"episode_uuid: {episode_uuid} | successfully get message from redis stream") - - # Retrieve data, decode_responses=False so keys/values are bytes - if b'data' in data_dict: - data_bytes = data_dict[b'data'] - else: - logger.error(f"Missing 'data' field in stream message: {data_dict}") - continue - - result_object_str = pickle.loads(data_bytes) - - if result_object_str.startswith('[ERR]'): - return HTTPException(status_code=500, detail="Error response, " + result_object_str) - result_object = ChatCompletion(**json.loads(result_object_str)) - - # Cleanup stream - redis_client.delete(timeline_stream) - - return result_object - - except TimeoutError: - logger.info(f"episode_uuid: {episode_uuid} | still waiting, (time passed {timepassed}) for result for episode_uuid:{episode_uuid}, timeline_uuid:{timeline_uuid}...") - continue - except Exception as e: - logger.error(f"Error reading from stream: {e}") - if timepassed > max_wait_time: - raise e - time.sleep(1) + if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | Received new chat completion request (inside thread)") + + socket = context.socket(zmq.REQ) + socket.setsockopt(zmq.RCVTIMEO, 60*1000) # 60秒超时,避免永久阻塞 + socket.connect(f"{episode_address}") + if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | connect done") + socket.send_string(int_req.model_dump_json()) + if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | send_string") + + result_str = "" + for _ in range(5): + try: + if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | recv_string begin.") + result_str = socket.recv_string() + break + except zmq.Again as e: + if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | recv_string timeout, retrying.") + continue - except Exception as e: - logger.error(f"Communication failed: {e}") - return HTTPException(status_code=500, detail=f"Communication failed: {e}") + if not result_str: + raise RuntimeError(f"Failed to get response from episode_address: {episode_address} after 5 attempts.") + else: + if DEBUG: logger.success(f"[server] episode_uuid: {episode_uuid} | recv_string done.") + result_object = ChatCompletion(**json.loads(result_str)) + return result_object - finally: - redis_client.close() @app.post("/v1/chat/completions") @@ -190,6 +128,7 @@ async def chat_completions(request: Request, authorization: str = Header(None)): agent_name = auth_data.get("agent_name") target_tag = auth_data.get("target_tag") episode_uuid = auth_data.get("episode_uuid") + episode_address = auth_data.get("episode_address") if not all([agent_name, target_tag, episode_uuid]): return HTTPException(status_code=401, detail="Invalid authorization data") @@ -213,11 +152,11 @@ async def chat_completions(request: Request, authorization: str = Header(None)): episode_uuid = episode_uuid, timeline_uuid = timeline_uuid, ) - logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request for episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid} (outside thread)") + if DEBUG: logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request (outside thread)") client_offline = threading.Event() try: loop = asyncio.get_running_loop() - return await loop.run_in_executor(request.app.state.executor, _begin_handle_chat_completion, int_req, episode_uuid, timeline_uuid, client_offline) + return await loop.run_in_executor(request.app.state.executor, _begin_handle_chat_completion, episode_address, int_req, episode_uuid, timeline_uuid, client_offline) finally: client_offline.set() @@ -247,7 +186,7 @@ async def serve_with_monitor(): host="0.0.0.0", port=self.port, log_level="error", - # workers=16 + # workers=4 ) server = uvicorn.Server(config) await server.serve() @@ -286,7 +225,7 @@ def start_interchange_server(experiment_dir) -> int: pass time.sleep(0.5) - logger.info(f"Interchange server subprocess started on port {port} (pid: {interchange_server.pid})") + if DEBUG: logger.info(f"Interchange server subprocess started on port {port} (pid: {interchange_server.pid})") atexit.register(lambda: interchange_server.terminate()) return port diff --git a/ajet/utils/core_env_vars.py b/ajet/utils/core_env_vars.py index d134b568..59bb60ec 100644 --- a/ajet/utils/core_env_vars.py +++ b/ajet/utils/core_env_vars.py @@ -3,16 +3,7 @@ from beast_logger import print_dict from dotenv import load_dotenv -import socket - - -def find_free_port() -> int: - """Find a free port on the system.""" - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind(('', 0)) - s.listen(1) - port = s.getsockname()[1] - return port +from ajet.utils.free_port import find_free_port def get_runtime_env(is_trinity: bool = False) -> dict: diff --git a/ajet/utils/free_port.py b/ajet/utils/free_port.py new file mode 100644 index 00000000..38df8545 --- /dev/null +++ b/ajet/utils/free_port.py @@ -0,0 +1,9 @@ +import socket + +def find_free_port() -> int: + """Find a free port on the system.""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(('', 0)) + s.listen(1) + port = s.getsockname()[1] + return port diff --git a/ajet/utils/launch_utils.py b/ajet/utils/launch_utils.py index 972324e7..978539ab 100644 --- a/ajet/utils/launch_utils.py +++ b/ajet/utils/launch_utils.py @@ -188,6 +188,9 @@ def execute_training_process( "ajet/default_config/verl/config_auto_convertion_verl.jsonc" ) + os.makedirs('/tmp/ajet', exist_ok=True) + assert os.path.exists('/tmp/ajet'), "Temporary directory /tmp/ajet cannot be create." + # let's begin the training process if args.backbone == "trinity": # replace boot yaml diff --git a/ajet/utils/sington.py b/ajet/utils/sington.py new file mode 100644 index 00000000..72105251 --- /dev/null +++ b/ajet/utils/sington.py @@ -0,0 +1,19 @@ +import concurrent.futures +from ajet.utils.testing_utils import singleton + +@singleton +class ThreadExecutorSingleton: + def __init__(self): + self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=16) + + def get_executor(self) -> concurrent.futures.ThreadPoolExecutor: + return self.executor + + +@singleton +class ThreadExecutorLlmInferSingleton: + def __init__(self): + self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=16) + + def get_executor(self) -> concurrent.futures.ThreadPoolExecutor: + return self.executor \ No newline at end of file From 8eae43c7bfd4b974c68d49b2bf70b7d093615cd6 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 15 Jan 2026 17:10:24 +0800 Subject: [PATCH 447/462] optimize further --- ajet/context_tracker/multiagent_tracking.py | 1 + ajet/task_rollout/async_llm_bridge.py | 9 +++------ ajet/task_runner/base_runner.py | 11 +++++++++-- .../experimental/as_oai_model_client.py | 17 +++++++++++------ .../experimental/as_oai_model_server.py | 2 +- ajet/utils/sington.py | 6 +++--- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ajet/context_tracker/multiagent_tracking.py b/ajet/context_tracker/multiagent_tracking.py index 4dd75ee1..e13982c5 100644 --- a/ajet/context_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/multiagent_tracking.py @@ -107,6 +107,7 @@ def extract_text_content_from_content_dict(self, msg): should_skip_message = False return str_content, should_skip_message + def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_toolcalls: bool = False) -> List[ExtendedMessage]: """Spawn a timeline from messages. diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index 79c74d29..c4bf4055 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -535,14 +535,11 @@ async def run_infer( # run llm inference ✨ if self.config.ajet.llm_infer_submit_method == "sync": - llm_output = await asyncio.wait_for( - asyncio.to_thread( - self.llm_inference_fn, converted_message, custom_sampling_params, tools - ), - timeout=1800, + llm_output = await asyncio.to_thread( + self.llm_inference_fn, converted_message, custom_sampling_params, tools ) else: - llm_output = await asyncio.wait_for(self.llm_inference_fn(converted_message, custom_sampling_params, tools), timeout=1800) + llm_output = await self.llm_inference_fn(converted_message, custom_sampling_params, tools) # begin context tracking diff --git a/ajet/task_runner/base_runner.py b/ajet/task_runner/base_runner.py index 644f954f..65aa5c13 100644 --- a/ajet/task_runner/base_runner.py +++ b/ajet/task_runner/base_runner.py @@ -68,9 +68,16 @@ def generated_token_callback_fn(token_array): async def wrapper_type_asyncio(self, workflow_cls: Type[Workflow], workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: user_workflow: Workflow = workflow_cls(name="ajet-workflow") result = await user_workflow.execute(workflow_task, tuner) + + # malloc garbage collection del user_workflow - with gc_lock: - gc.collect() # force garbage collection + + # run gc in a thread-safe way + if gc_lock.acquire(blocking=False): + try: + gc.collect() + finally: + gc_lock.release() return result diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index e2007143..7559ba25 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -13,7 +13,7 @@ from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import InterchangeCompletionRequest from redis.exceptions import TimeoutError from ajet.utils.free_port import find_free_port -from ajet.utils.sington import ThreadExecutorLlmInferSingleton, ThreadExecutorSingleton +from ajet.utils.sington import ThreadExecutorContextTrackerSingleton, ThreadExecutorSingleton from functools import cache import pickle @@ -141,14 +141,19 @@ def begin_service(self): if DEBUG: logger.info(f"[client] {self.episode_uuid} | Starting InterchangeClient service loop...") self.socket = context.socket(zmq.REP) self.socket.bind(f"{self.episode_contect_address}") - self.socket.setsockopt(zmq.RCVTIMEO, 2*1000) # 60 秒超时 + self.socket.setsockopt(zmq.RCVTIMEO, 3*1000) # 60 秒超时 self.executor = ThreadExecutorSingleton().get_executor() if DEBUG: logger.info(f"[client] {self.episode_uuid} | Submitting _begin_service_threading to executor...") future = self.executor.submit(self._begin_service_threading) - time.sleep(1) + + # wait till service begin running + time.sleep(0.5) + w_time = 1 while future._state == 'PENDING': - time.sleep(1) + time.sleep(min(w_time * 2, 10)) + w_time += 1 + if DEBUG: logger.info(f"[client] {self.episode_uuid} | Future ready...") # t = threading.Thread(target=self._begin_service_threading, daemon=True) @@ -189,9 +194,9 @@ def _begin_service_threading(self): loop = asyncio.get_running_loop() except: loop = asyncio.new_event_loop() - executor = ThreadExecutorLlmInferSingleton().get_executor() + context_tracker_executor = ThreadExecutorContextTrackerSingleton().get_executor() future = loop.run_in_executor( - executor, # executor + context_tracker_executor, asyncio.run, self.llm_infer( req=parsed_msg.completion_request, diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index e77997fb..c144e394 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -186,7 +186,7 @@ async def serve_with_monitor(): host="0.0.0.0", port=self.port, log_level="error", - # workers=4 + workers=2 ) server = uvicorn.Server(config) await server.serve() diff --git a/ajet/utils/sington.py b/ajet/utils/sington.py index 72105251..8297ccca 100644 --- a/ajet/utils/sington.py +++ b/ajet/utils/sington.py @@ -4,16 +4,16 @@ @singleton class ThreadExecutorSingleton: def __init__(self): - self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=16) + self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=64) def get_executor(self) -> concurrent.futures.ThreadPoolExecutor: return self.executor @singleton -class ThreadExecutorLlmInferSingleton: +class ThreadExecutorContextTrackerSingleton: def __init__(self): - self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=16) + self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=64) def get_executor(self) -> concurrent.futures.ThreadPoolExecutor: return self.executor \ No newline at end of file From 75a43211ed024a92121dff3b09f99cc7dd2abbff Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 15 Jan 2026 18:27:25 +0800 Subject: [PATCH 448/462] update yaml configuration --- ajet/backbone/main_trinity.py | 4 +- ajet/backbone/main_verl.py | 4 +- ajet/backbone/main_vllm.py | 4 +- ajet/backbone/trainer_trinity.py | 2 +- ajet/backbone/trainer_verl.py | 2 +- ajet/backbone/warm_up.py | 8 ++ ajet/default_config/ajet_default.yaml | 36 +++++---- ajet/task_rollout/async_llm_bridge.py | 2 +- ajet/task_rollout/single_worker.py | 2 +- ajet/tuner.py | 10 +-- .../experimental/as_oai_model_client.py | 78 +++++++------------ .../experimental/as_oai_model_server.py | 53 +++++++------ ajet/utils/sington.py | 23 ++---- ajet/utils/testing_utils.py | 12 +-- ajet/utils/thread_executors.py | 22 ++++++ docs/en/support_agentscope.md | 2 +- docs/en/support_http.md | 2 +- docs/en/support_langchain.md | 2 +- docs/en/support_oaisdk.md | 2 +- 19 files changed, 135 insertions(+), 135 deletions(-) create mode 100644 ajet/utils/thread_executors.py diff --git a/ajet/backbone/main_trinity.py b/ajet/backbone/main_trinity.py index c0b297d4..bad4b859 100644 --- a/ajet/backbone/main_trinity.py +++ b/ajet/backbone/main_trinity.py @@ -51,9 +51,9 @@ def patched_trainer_get_actor(cls, config: Config): Trainer.get_actor = classmethod(patched_trainer_get_actor) ajet_config = get_ajet_config_from_trinity_side() - if ajet_config.ajet.enable_experimental_reverse_proxy: + if ajet_config.ajet.enable_experimental_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server - start_interchange_server(ajet_config.ajet.experiment_dir) + start_interchange_server(ajet_config) if __name__ == "__main__": diff --git a/ajet/backbone/main_verl.py b/ajet/backbone/main_verl.py index 5dda9167..1dc70759 100644 --- a/ajet/backbone/main_verl.py +++ b/ajet/backbone/main_verl.py @@ -246,9 +246,9 @@ def run(self, config): from ajet.backbone.trainer_verl import AjetRayPPOTrainer - if config.ajet.enable_experimental_reverse_proxy: + if config.ajet.enable_experimental_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server - start_interchange_server(config.ajet.experiment_dir) + start_interchange_server(config) # Initialize the PPO trainer. trainer = AjetRayPPOTrainer( diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index e02647a5..77abd917 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -184,9 +184,9 @@ def main(config): os.environ.update(runtime_env["env_vars"]) # atexit.register(lambda: print("Process exiting, performing cleanup...")) - if config.ajet.enable_experimental_reverse_proxy: + if config.ajet.enable_experimental_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server - start_interchange_server(config.ajet.experiment_dir) + start_interchange_server(config) def companion_launch(): import torch diff --git a/ajet/backbone/trainer_trinity.py b/ajet/backbone/trainer_trinity.py index 9a2c7326..99e62e7e 100644 --- a/ajet/backbone/trainer_trinity.py +++ b/ajet/backbone/trainer_trinity.py @@ -116,7 +116,7 @@ def __init__( async def run_async(self): ajet_config = get_ajet_config_from_trinity_side() - if ajet_config.ajet.enable_experimental_reverse_proxy: + if ajet_config.ajet.enable_experimental_interchange_server: raise NotImplementedError( "The experimental reverse proxy is not supported in Trinity backbone yet." ) diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index cb722680..5b9d0853 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -835,7 +835,7 @@ def fit(self): # noqa: C901 self.global_steps += 1 # # when enabled oai request interchange, we need to clear the cache from time to time - # if self.config.ajet.enable_experimental_reverse_proxy: + # if self.config.ajet.enable_experimental_interchange_server: # from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import ensure_dat_interchange_server_cache_clear # ensure_dat_interchange_server_cache_clear() diff --git a/ajet/backbone/warm_up.py b/ajet/backbone/warm_up.py index cbe7f350..988f7d31 100644 --- a/ajet/backbone/warm_up.py +++ b/ajet/backbone/warm_up.py @@ -1,3 +1,8 @@ +""" +Process level warm up +""" + + import asyncio import logging import os @@ -32,6 +37,9 @@ def init_parallel_rollout_logger(experiment_name): target_logger = logging.getLogger("vllm.entrypoints.openai.tool_parsers.hermes_tool_parser") target_logger.setLevel(logging.CRITICAL) + logging.getLogger("httpx").setLevel(logging.WARNING) + + def warm_up_process(config): """ diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 310bf6fe..d9b67ab0 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -6,19 +6,6 @@ ajet: backbone: debug # `debug` or `trinity` or `verl` - # the experimental reverse proxy feature that allows `tuner.as_oai_baseurl_apikey` feature - enable_experimental_reverse_proxy: False - - # submit llm infer submit method - llm_infer_submit_method: "async" # options: "sync", "async" - - task_runner: - wrapper_type: "asyncio-with-gc" - wrapper_multiprocessing_timeout: 3600 # in seconds - # - wrapper_type: "asyncio-with-gc": safe, with periodic garbage collection to prevent event loop leaks (recommended) - # - wrapper_type: "asyncio": fast, but may cause event loop leak in long run - # - wrapper_type: "multi-processing": safe, but resource consuming - model: # which model should be trained path: /path/to/model/such/as/Qwen/Qwen2___5-14B-Instruct @@ -42,7 +29,7 @@ ajet: force_disable_toolcalls: False # maximum number of parallel environments / simulate workers - max_env_worker: 128 + max_env_worker: 64 # step reward gamma (experimental, do not change) gamma: 1.0 @@ -293,7 +280,28 @@ ajet: save_trajectory_as_json_file: False + # the experimental reverse proxy feature that allows `tuner.as_oai_baseurl_apikey` feature + enable_experimental_interchange_server: False + interchange_server: + interchange_method: 'ipc' # options: 'tcp' (multi-nodes) or 'ipc' (1 node) + interchange_server_port: 'auto' + num_fastapi_process: 2 # 1, 2 or 4 is fine + max_fastapi_threads: 128 # 64 or 128 is fine + max_inference_tracker_threads: 64 # recommend to be equal to `ajet.rollout.max_env_worker` + + + task_runner: + # submit llm infer submit method + llm_infer_submit_method: "async" # options: "sync", "async" + + # how to wrap the user-defined workflow + wrapper_type: "asyncio-with-gc" + # - wrapper_type: "asyncio-with-gc": safe, with periodic garbage collection to prevent event loop leaks (recommended) + # - wrapper_type: "asyncio": fast, but may cause event loop leak in long run + # - wrapper_type: "multi-processing": safe, but resource consuming + # when `wrapper_type` is `multi-processing`, the timeout for each task + wrapper_multiprocessing_timeout: 3600 # in seconds # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. execute_test: False # DO NOT EDIT, FOR ROBOT TESTING PURPOSE ONLY. NOT FOR HUMAN. diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index c4bf4055..f43ba1c8 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -534,7 +534,7 @@ async def run_infer( # otherwise, for abnormal output, can still proceed, but we do not track output anymore # run llm inference ✨ - if self.config.ajet.llm_infer_submit_method == "sync": + if self.config.ajet.task_runner.llm_infer_submit_method == "sync": llm_output = await asyncio.to_thread( self.llm_inference_fn, converted_message, custom_sampling_params, tools ) diff --git a/ajet/task_rollout/single_worker.py b/ajet/task_rollout/single_worker.py index a9e77ac7..d65a979a 100644 --- a/ajet/task_rollout/single_worker.py +++ b/ajet/task_rollout/single_worker.py @@ -85,7 +85,7 @@ def rollout_env_worker( """ sampling_params = get_sample_params(mode, self.config) - if self.config.ajet.llm_infer_submit_method == "sync": + if self.config.ajet.task_runner.llm_infer_submit_method == "sync": llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_sync( sampling_params=sampling_params ) diff --git a/ajet/tuner.py b/ajet/tuner.py index 46275698..a2330a79 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -26,7 +26,7 @@ def __init__( self.context_tracker = context_tracker self.llm_inference_fn = llm_inference_fn self.target2proxy_registry: dict[str, dict[str,TunerTypeUnion]] = {} - if config.ajet.enable_experimental_reverse_proxy: + if config.ajet.enable_experimental_interchange_server: self.proxy_client_started = False @@ -104,10 +104,10 @@ def as_oai_baseurl_apikey( ``` """ - assert self.config.ajet.enable_experimental_reverse_proxy, "Please enable `ajet.enable_experimental_reverse_proxy` in yaml config to use `as_oai_baseurl_apikey` feature." + assert self.config.ajet.enable_experimental_interchange_server, "Please enable `ajet.enable_experimental_interchange_server` in yaml config to use `as_oai_baseurl_apikey` feature." if self.proxy_client_started is False: - self._enable_experimental_interchange_server(self.llm_inference_fn) self.proxy_client_started = True + self._enable_experimental_interchange_server(self.llm_inference_fn) baseurl_apikey_model = OpenaiClientBaseUrlTuner( config=self.config, context_tracker=self.context_tracker, @@ -171,7 +171,7 @@ def get_context_tracker(self) -> MultiAgentContextTracker: def _enable_experimental_interchange_server(self, llm_inference_fn): # experimental reverse proxy start - if self.config.ajet.enable_experimental_reverse_proxy: + if self.config.ajet.enable_experimental_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_client import InterchangeClient self.interchange_client = InterchangeClient( episode_uuid=self.context_tracker.episode_uuid, @@ -184,6 +184,6 @@ def _enable_experimental_interchange_server(self, llm_inference_fn): def terminate_episode(self): # experimental reverse proxy cleanup - if self.config.ajet.enable_experimental_reverse_proxy: + if self.config.ajet.enable_experimental_interchange_server: if (self.proxy_client_started is True) and hasattr(self, "interchange_client"): self.interchange_client._should_terminate = True diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index 7559ba25..8717bb82 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -2,29 +2,22 @@ import asyncio import atexit import json -import threading import os -import redis import time +import zmq +import base64 +import json + from loguru import logger -from typing import Optional, List, Dict, Any, Union, TYPE_CHECKING -from vllm.entrypoints.openai.protocol import ChatCompletionRequest, ChatCompletionResponse +from typing import TYPE_CHECKING +from vllm.entrypoints.openai.protocol import ChatCompletionRequest from openai.types.chat.chat_completion import ChatCompletion from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import InterchangeCompletionRequest -from redis.exceptions import TimeoutError +from ajet.utils.thread_executors import SharedInferenceTrackerThreadExecutor, SharedInterchangeThreadExecutor from ajet.utils.free_port import find_free_port -from ajet.utils.sington import ThreadExecutorContextTrackerSingleton, ThreadExecutorSingleton -from functools import cache - -import pickle -import httpx -import zmq -import logging -logging.getLogger("httpx").setLevel(logging.WARNING) - -import base64 -import json +context = zmq.Context() +atexit.register(context.term) if TYPE_CHECKING: from ajet.context_tracker.multiagent_tracking import MultiAgentContextTracker @@ -64,28 +57,9 @@ def generate_auth_token(agent_name, target_tag, episode_uuid, episode_address): return auth_token -@cache -def get_redis_connection_pool(): - pool = redis.BlockingConnectionPool( - host='localhost', - port=6379, - max_connections=256, - socket_timeout=30, - socket_connect_timeout=30, - retry_on_timeout=True - ) - return pool - -@cache -def get_redis_client(): - pool = get_redis_connection_pool() - return redis.Redis(connection_pool=pool, decode_responses=False, encoding='utf-8') - - -context = zmq.Context() -atexit.register(context.term) - class InterchangeClient: + """ InterchangeClient is re-created in each episode + """ def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker", llm_inference_fn, config): self.episode_uuid = episode_uuid @@ -94,9 +68,13 @@ def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker self.config = config self._should_terminate = False - # self.episode_contect_address = f"tcp://localhost:{find_free_port()}" - self.ipc_path = f"/tmp/ajet/{self.episode_uuid}.sock" - self.episode_contect_address = f"ipc://{self.ipc_path}" + interchange_method = config.ajet.interchange_server.interchange_method + if interchange_method == 'tcp': + self.episode_contect_address = f"tcp://localhost:{find_free_port()}" + else: + self.ipc_path = f"/tmp/ajet/{self.episode_uuid}.sock" + self.episode_contect_address = f"ipc://{self.ipc_path}" + self.max_inference_tracker_threads = config.ajet.interchange_server.max_inference_tracker_threads async def llm_infer( @@ -110,7 +88,6 @@ async def llm_infer( from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker req_as_dict = req.model_dump() - self.llm_proxy_with_tracker = OpenaiLlmProxyWithTracker( context_tracker=self.context_tracker, config=self.config, @@ -134,16 +111,17 @@ async def llm_infer( def should_terminate(self) -> bool: return self._should_terminate + def begin_service(self): """ - Starts the SSE service loop. + Starts the zmq communication loop. """ if DEBUG: logger.info(f"[client] {self.episode_uuid} | Starting InterchangeClient service loop...") self.socket = context.socket(zmq.REP) self.socket.bind(f"{self.episode_contect_address}") - self.socket.setsockopt(zmq.RCVTIMEO, 3*1000) # 60 秒超时 + self.socket.setsockopt(zmq.RCVTIMEO, 3*1000) # 3 second timeout for REP - self.executor = ThreadExecutorSingleton().get_executor() + self.executor = SharedInterchangeThreadExecutor(self.max_inference_tracker_threads).get_shared_executor() if DEBUG: logger.info(f"[client] {self.episode_uuid} | Submitting _begin_service_threading to executor...") future = self.executor.submit(self._begin_service_threading) @@ -155,9 +133,6 @@ def begin_service(self): w_time += 1 if DEBUG: logger.info(f"[client] {self.episode_uuid} | Future ready...") - - # t = threading.Thread(target=self._begin_service_threading, daemon=True) - # t.start() return self.episode_contect_address @@ -170,7 +145,7 @@ def _begin_service_threading(self): try: while not self.should_terminate: - + # listen for next request from remote try: if DEBUG: logger.info(f"[client] {self.episode_uuid} | socket.recv_string() has begun") message = self.socket.recv_string() @@ -184,17 +159,19 @@ def _begin_service_threading(self): logger.warning(f"[client] {self.episode_uuid} | Still waiting for first message... (time passed {timepassed}) for episode_uuid:{self.episode_uuid}...") continue + # parse the incoming request if DEBUG: logger.info(f"[client] {self.episode_uuid} | before json.loads(message)") data_as_json = json.loads(message) parsed_msg = InterchangeCompletionRequest(**data_as_json) + # begin to run the llm request, monitored by context tracker + # we re-use previously created thread for best performance if DEBUG: logger.info(f"[client] {self.episode_uuid} | before asyncio run self.llm_infer") - try: loop = asyncio.get_running_loop() except: loop = asyncio.new_event_loop() - context_tracker_executor = ThreadExecutorContextTrackerSingleton().get_executor() + context_tracker_executor = SharedInferenceTrackerThreadExecutor(self.max_inference_tracker_threads).get_shared_executor() future = loop.run_in_executor( context_tracker_executor, asyncio.run, @@ -208,6 +185,7 @@ def _begin_service_threading(self): ) result = loop.run_until_complete(future).model_dump_json() # type: ignore + # great, let's send back the result if DEBUG: logger.info(f"[client] {self.episode_uuid} | before send_string") self.socket.send_string(result) except: diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index c144e394..f3306490 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -19,18 +19,12 @@ import os import zmq import uvicorn -import sys -import subprocess import atexit -import argparse import httpx from loguru import logger -from collections import defaultdict -from typing import Dict, List -from pydantic import BaseModel, ConfigDict, model_validator +from pydantic import BaseModel from fastapi import FastAPI, Header, HTTPException, Request, Body -from fastapi.responses import StreamingResponse from contextlib import asynccontextmanager from multiprocessing import Process from concurrent.futures import ThreadPoolExecutor @@ -63,13 +57,13 @@ class HealthCheckRequest(BaseModel): atexit.register(context.term) -def get_app(): +def get_app(max_fastapi_threads: int = 512) -> FastAPI: @asynccontextmanager async def lifespan(app: FastAPI): # Startup SERVER_SHUTDOWN_EVENT.clear() - app.state.executor = ThreadPoolExecutor(max_workers=512) + app.state.executor = ThreadPoolExecutor(max_workers=max_fastapi_threads) yield # Shutdown SERVER_SHUTDOWN_EVENT.set() @@ -84,14 +78,14 @@ def _begin_handle_chat_completion(episode_address, int_req: InterchangeCompletio if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | Received new chat completion request (inside thread)") socket = context.socket(zmq.REQ) - socket.setsockopt(zmq.RCVTIMEO, 60*1000) # 60秒超时,避免永久阻塞 + socket.setsockopt(zmq.RCVTIMEO, 60*1000) # 1 minute recv timeout socket.connect(f"{episode_address}") if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | connect done") socket.send_string(int_req.model_dump_json()) if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | send_string") result_str = "" - for _ in range(5): + for _ in range(5): # max 5 minutes wait try: if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | recv_string begin.") result_str = socket.recv_string() @@ -108,7 +102,6 @@ def _begin_handle_chat_completion(episode_address, int_req: InterchangeCompletio return result_object - @app.post("/v1/chat/completions") async def chat_completions(request: Request, authorization: str = Header(None)): """ @@ -144,7 +137,6 @@ async def chat_completions(request: Request, authorization: str = Header(None)): timeline_uuid = uuid.uuid4().hex # Add to received queue - # logger.warning(f"Received new chat completion request for agent: {agent_name}, target_tag: {target_tag}, episode_uuid: {episode_uuid}, timeline_uuid: {timeline_uuid}") int_req = InterchangeCompletionRequest( completion_request = new_req, agent_name = agent_name, @@ -160,25 +152,22 @@ async def chat_completions(request: Request, authorization: str = Header(None)): finally: client_offline.set() - - - @app.post("/reset") async def reset(): - return {"status": "reset_complete"} - return app class InterchangeServer(Process): - def __init__(self, experiment_dir: str, port: int): + def __init__(self, experiment_dir: str, port: int, num_fastapi_process: int = 2, max_fastapi_threads: int = 512): super().__init__() self.experiment_dir = experiment_dir self.port = port + self.num_fastapi_process = num_fastapi_process + self.max_fastapi_threads = max_fastapi_threads def run(self): - app = get_app() + app = get_app(self.max_fastapi_threads) async def serve_with_monitor(): # Start the server config = uvicorn.Config( @@ -186,7 +175,7 @@ async def serve_with_monitor(): host="0.0.0.0", port=self.port, log_level="error", - workers=2 + workers=self.num_fastapi_process ) server = uvicorn.Server(config) await server.serve() @@ -198,9 +187,16 @@ async def serve_with_monitor(): # Convenience function for quick server startup -def start_interchange_server(experiment_dir) -> int: +def start_interchange_server(config) -> int: + experiment_dir = config.ajet.experiment_dir + num_fastapi_process = config.ajet.interchange_server.num_fastapi_process + max_fastapi_threads = config.ajet.interchange_server.max_fastapi_threads # Find a free port if not specified or invalid port = int(os.environ.get("AJET_DAT_INTERCHANGE_PORT", -1)) + + if config.ajet.interchange_server.interchange_server_port != 'auto': + port = int(config.ajet.interchange_server.interchange_server_port) + if port <= 0: import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: @@ -208,25 +204,32 @@ def start_interchange_server(experiment_dir) -> int: port = s.getsockname()[1] os.environ["AJET_DAT_INTERCHANGE_PORT"] = str(port) - interchange_server = InterchangeServer(experiment_dir, port) + interchange_server = InterchangeServer(experiment_dir, port, num_fastapi_process, max_fastapi_threads) interchange_server.start() # Wait for server to be ready health_url = f"http://localhost:{port}/health" start_time = time.time() - while time.time() - start_time < 20: + while True: if interchange_server.exitcode is not None: logger.error(f"Interchange server subprocess failed to start. Return code: {interchange_server.exitcode}") - break + raise RuntimeError("Interchange server subprocess failed to start.") + if time.time() - start_time > 30: + logger.error("Interchange server subprocess failed to start within 30 seconds.") + raise RuntimeError("Interchange server subprocess failed to start within 30 seconds.") try: if httpx.get(health_url, timeout=0.5).status_code == 200: break except Exception: + # keep waiting pass time.sleep(0.5) + # register a termination handler if DEBUG: logger.info(f"Interchange server subprocess started on port {port} (pid: {interchange_server.pid})") atexit.register(lambda: interchange_server.terminate()) + + # return port return port diff --git a/ajet/utils/sington.py b/ajet/utils/sington.py index 8297ccca..3a994aa8 100644 --- a/ajet/utils/sington.py +++ b/ajet/utils/sington.py @@ -1,19 +1,10 @@ -import concurrent.futures -from ajet.utils.testing_utils import singleton -@singleton -class ThreadExecutorSingleton: - def __init__(self): - self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=64) +def singleton(cls): + instances = {} - def get_executor(self) -> concurrent.futures.ThreadPoolExecutor: - return self.executor + def get_instance(*args, **kwargs): + if cls not in instances: + instances[cls] = cls(*args, **kwargs) + return instances[cls] - -@singleton -class ThreadExecutorContextTrackerSingleton: - def __init__(self): - self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=64) - - def get_executor(self) -> concurrent.futures.ThreadPoolExecutor: - return self.executor \ No newline at end of file + return get_instance diff --git a/ajet/utils/testing_utils.py b/ajet/utils/testing_utils.py index 44f71b65..22be6092 100644 --- a/ajet/utils/testing_utils.py +++ b/ajet/utils/testing_utils.py @@ -11,6 +11,7 @@ from loguru import logger from ajet.utils.dynamic_import import dynamic_import +from ajet.utils.sington import singleton class TestSuccessException(Exception): @@ -74,17 +75,6 @@ def _mock_if_test_mode(key, value, config): return test_lambda.mock(key) -def singleton(cls): - instances = {} - - def get_instance(*args, **kwargs): - if cls not in instances: - instances[cls] = cls(*args, **kwargs) - return instances[cls] - - return get_instance - - def send_test_result( git_hash: str, target: str, diff --git a/ajet/utils/thread_executors.py b/ajet/utils/thread_executors.py new file mode 100644 index 00000000..9c8ea634 --- /dev/null +++ b/ajet/utils/thread_executors.py @@ -0,0 +1,22 @@ +from ajet.utils.sington import singleton +import concurrent.futures + + + +@singleton +class SharedInterchangeThreadExecutor: + def __init__(self, max_workers=64): + self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) + + def get_shared_executor(self) -> concurrent.futures.ThreadPoolExecutor: + return self.executor + + + +@singleton +class SharedInferenceTrackerThreadExecutor: + def __init__(self, max_workers=64): + self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) + + def get_shared_executor(self) -> concurrent.futures.ThreadPoolExecutor: + return self.executor \ No newline at end of file diff --git a/docs/en/support_agentscope.md b/docs/en/support_agentscope.md index f91eedd1..19506efe 100644 --- a/docs/en/support_agentscope.md +++ b/docs/en/support_agentscope.md @@ -64,7 +64,7 @@ This article introduce the way to convert different types of ways to convert you ajet: ... - enable_experimental_reverse_proxy: True + enable_experimental_interchange_server: True ... ``` diff --git a/docs/en/support_http.md b/docs/en/support_http.md index 05023116..32474904 100644 --- a/docs/en/support_http.md +++ b/docs/en/support_http.md @@ -89,7 +89,7 @@ in this AI era, you can always start from scratch and build your own "high-scrap ajet: ... - enable_experimental_reverse_proxy: True + enable_experimental_interchange_server: True ... ``` diff --git a/docs/en/support_langchain.md b/docs/en/support_langchain.md index 7bc99810..6e645dcc 100644 --- a/docs/en/support_langchain.md +++ b/docs/en/support_langchain.md @@ -80,7 +80,7 @@ This article introduce the way to convert different types of ways to convert you ajet: ... - enable_experimental_reverse_proxy: True + enable_experimental_interchange_server: True ... ``` diff --git a/docs/en/support_oaisdk.md b/docs/en/support_oaisdk.md index bffb02ef..5268ab42 100644 --- a/docs/en/support_oaisdk.md +++ b/docs/en/support_oaisdk.md @@ -84,7 +84,7 @@ This article introduce the way to convert different types of ways to convert you ajet: ... - enable_experimental_reverse_proxy: True + enable_experimental_interchange_server: True ... ``` From 666e8d37709ce2807a57fa2df036d550bd0335ac Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Thu, 15 Jan 2026 23:20:45 +0800 Subject: [PATCH 449/462] fix interchange server boot --- ajet/default_config/ajet_default.yaml | 4 +- .../experimental/as_oai_model_server.py | 13 +++- docs/en/installation.md | 5 +- .../math_agentscope_urlkey.py | 74 +++++++++++++++++++ 4 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 tutorial/example_math_agent/math_agentscope_urlkey.py diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index d9b67ab0..0bbfc2f7 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -192,7 +192,7 @@ ajet: fix_retokenization_drift: True # log tool format check results - log_tool_format_check: True + log_tool_format_check: False # log tool format check results log_tool_format_error_detail: False @@ -281,7 +281,7 @@ ajet: # the experimental reverse proxy feature that allows `tuner.as_oai_baseurl_apikey` feature - enable_experimental_interchange_server: False + enable_experimental_interchange_server: True interchange_server: interchange_method: 'ipc' # options: 'tcp' (multi-nodes) or 'ipc' (1 node) interchange_server_port: 'auto' diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index f3306490..5a2e9429 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -102,6 +102,11 @@ def _begin_handle_chat_completion(episode_address, int_req: InterchangeCompletio return result_object + @app.get("/health") + async def health(): + return {"status": "ok"} + + @app.post("/v1/chat/completions") async def chat_completions(request: Request, authorization: str = Header(None)): """ @@ -167,6 +172,7 @@ def __init__(self, experiment_dir: str, port: int, num_fastapi_process: int = 2, self.max_fastapi_threads = max_fastapi_threads def run(self): + logger.info(f"Starting Interchange Server on port {self.port} with {self.num_fastapi_process} processes and {self.max_fastapi_threads} threads per process.") app = get_app(self.max_fastapi_threads) async def serve_with_monitor(): # Start the server @@ -215,15 +221,16 @@ def start_interchange_server(config) -> int: logger.error(f"Interchange server subprocess failed to start. Return code: {interchange_server.exitcode}") raise RuntimeError("Interchange server subprocess failed to start.") if time.time() - start_time > 30: - logger.error("Interchange server subprocess failed to start within 30 seconds.") - raise RuntimeError("Interchange server subprocess failed to start within 30 seconds.") + msg = f"Interchange server subprocess failed to start within {time.time() - start_time} seconds." + logger.error(msg) + raise RuntimeError(msg) try: if httpx.get(health_url, timeout=0.5).status_code == 200: break except Exception: # keep waiting pass - time.sleep(0.5) + time.sleep(1) # register a termination handler if DEBUG: logger.info(f"Interchange server subprocess started on port {port} (pid: {interchange_server.pid})") diff --git a/docs/en/installation.md b/docs/en/installation.md index db145397..ebd743c1 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -83,7 +83,10 @@ AgentJet supports multiple backbones. Currently we have `verl` and `trinity` (re ``` !!! warning "flash-attn Installation" - `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. + - `flash-attn` must be installed **after** other dependencies. + - Ensure a healthy connection to GitHub to install pre-compiled wheels. + - If you find your machine spend a long time installing flash-attn, ensure a healthy connection to GitHub. + - To build faster, export `MAX_JOBS=${N_CPU}`. === "Trinity" diff --git a/tutorial/example_math_agent/math_agentscope_urlkey.py b/tutorial/example_math_agent/math_agentscope_urlkey.py new file mode 100644 index 00000000..d36dc91b --- /dev/null +++ b/tutorial/example_math_agent/math_agentscope_urlkey.py @@ -0,0 +1,74 @@ +import re +from loguru import logger +from agentscope.message import Msg +from agentscope.agent import ReActAgent +from agentscope.formatter import OpenAIChatFormatter +from agentscope.model import OpenAIChatModel +from agentscope.memory import InMemoryMemory +from agentscope.tool import Toolkit, execute_python_code +from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask + + +def extract_final_answer(result) -> str: + """Extract the final answer from the agent's response.""" + try: + if ( + hasattr(result, "metadata") + and isinstance(result.metadata, dict) + and "result" in result.metadata + ): + return result.metadata["result"] + if hasattr(result, "content"): + if isinstance(result.content, dict) and "result" in result.content: + return result.content["result"] + return str(result.content) + return str(result) + except Exception as e: + logger.warning(f"Extract final answer error: {e}. Raw: {result}") + return str(result) + + +system_prompt = """ +You are an agent specialized in solving math problems with tools. +Please solve the math problem given to you. +You can write and execute Python code to perform calculation or verify your answer. +You should return your final answer within \\boxed{{}}. +""" + + +class MathToolWorkflow(Workflow): # ✨✨ inherit `Workflow` class + name: str = "math_agent_workflow" + + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: + # run agentscope + query = workflow_task.task.main_query + self.toolkit = Toolkit() + self.toolkit.register_tool_function(execute_python_code) + + url_and_apikey = tuner.as_oai_baseurl_apikey() + base_url = url_and_apikey.base_url + api_key = url_and_apikey.api_key # the api key contain information, do not discard it + model = OpenAIChatModel( + model_name="whatever", + client_args={"base_url": base_url}, + api_key=api_key, + stream=False, + ) + self.agent = ReActAgent( + name="math_react_agent", sys_prompt=system_prompt, + model=model, # ✨✨ compared with a normal agentscope agent, here is the difference! + formatter=OpenAIChatFormatter(), + toolkit=self.toolkit, + memory=InMemoryMemory(), max_iters=2, + ) + self.agent.set_console_output_enabled(False) + msg = Msg("user", query, role="user") + result = await self.agent.reply(msg) + final_answer = extract_final_answer(result) + + # compute reward + reference_answer = workflow_task.task.metadata["answer"].split("####")[-1].strip() + match = re.search(r"\\boxed\{([^}]*)\}", final_answer) + if match: is_success = (match.group(1) == reference_answer) + else: is_success = False + return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) From d0b6cae9bbbec668c832b208ec213b22c8095ae2 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 00:56:03 +0800 Subject: [PATCH 450/462] httpx aclose patch --- ajet/backbone/warm_up.py | 2 ++ ajet/utils/async_utils.py | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/ajet/backbone/warm_up.py b/ajet/backbone/warm_up.py index 988f7d31..bdef7b47 100644 --- a/ajet/backbone/warm_up.py +++ b/ajet/backbone/warm_up.py @@ -6,6 +6,8 @@ import asyncio import logging import os +from ajet.utils.async_utils import apply_httpx_aclose_patch +apply_httpx_aclose_patch() def init_parallel_rollout_logger(experiment_name): diff --git a/ajet/utils/async_utils.py b/ajet/utils/async_utils.py index 71865b67..3bb1b67e 100644 --- a/ajet/utils/async_utils.py +++ b/ajet/utils/async_utils.py @@ -2,7 +2,6 @@ import concurrent.futures from typing import Any - def run_async_coroutine_with_timeout(coro, timeout: int = 3600) -> Any: """ Run an async coroutine with a timeout, supporting both inside and outside event loops. @@ -32,3 +31,40 @@ def run_async_coroutine_with_timeout(coro, timeout: int = 3600) -> Any: except Exception: raise return final_res + + +def apply_httpx_aclose_patch(): + try: + from openai._base_client import AsyncHttpxClientWrapper + + _original_init = AsyncHttpxClientWrapper.__init__ + + def _patched_init(self, *args, **kwargs): + try: + self._created_loop = asyncio.get_running_loop() + except RuntimeError: + self._created_loop = None + _original_init(self, *args, **kwargs) + + def _patched_del(self) -> None: + if self.is_closed: + return + + try: + current_loop = asyncio.get_running_loop() + except RuntimeError: + return + + if getattr(self, "_created_loop", None) is not None and current_loop is not self._created_loop: + return + + try: + current_loop.create_task(self.aclose()) + except Exception: + pass + + AsyncHttpxClientWrapper.__init__ = _patched_init + AsyncHttpxClientWrapper.__del__ = _patched_del + print("Applied httpx aclose patch.") + except ImportError: + pass \ No newline at end of file From 0782173b329f96b03e9652ecb0c12459312255f8 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 01:58:01 +0800 Subject: [PATCH 451/462] keyurl multinode training support --- ajet/backbone/main_trinity.py | 4 +- ajet/backbone/main_verl.py | 2 +- ajet/backbone/main_vllm.py | 2 +- ajet/backbone/warm_up.py | 46 ++++- ajet/default_config/ajet_default.yaml | 2 +- ajet/tuner.py | 9 +- ajet/tuner_deprecated.py | 194 ------------------ .../weight_tuner/as_oai_baseurl_apikey.py | 7 +- .../experimental/as_oai_model_client.py | 23 ++- .../experimental/as_oai_model_server.py | 3 +- .../weight_tuner/experimental/zmq.py | 12 -- ajet/utils/core_env_vars.py | 15 +- ajet/utils/dynamic_import.py | 27 ++- ajet/utils/free_port.py | 9 - ajet/utils/networking.py | 37 ++++ tests/test_networking.py | 56 +++++ .../math_agentscope_urlkey.py | 4 + 17 files changed, 188 insertions(+), 264 deletions(-) delete mode 100644 ajet/tuner_deprecated.py delete mode 100644 ajet/tuner_lib/weight_tuner/experimental/zmq.py delete mode 100644 ajet/utils/free_port.py create mode 100644 ajet/utils/networking.py create mode 100644 tests/test_networking.py diff --git a/ajet/backbone/main_trinity.py b/ajet/backbone/main_trinity.py index bad4b859..c9938086 100644 --- a/ajet/backbone/main_trinity.py +++ b/ajet/backbone/main_trinity.py @@ -23,7 +23,8 @@ def get_ajet_config_from_trinity_side(): def patch_runtime_env_to_get_actor(): """Patch the classmethod of Explorer and Trainer to pass in the runtime env.""" - runtime_env = get_runtime_env(is_trinity=True) + ajet_config = get_ajet_config_from_trinity_side() + runtime_env = get_runtime_env(ajet_config, is_trinity=True) def patched_explorer_get_actor(cls, config: Config): return ( @@ -50,7 +51,6 @@ def patched_trainer_get_actor(cls, config: Config): Explorer.get_actor = classmethod(patched_explorer_get_actor) Trainer.get_actor = classmethod(patched_trainer_get_actor) - ajet_config = get_ajet_config_from_trinity_side() if ajet_config.ajet.enable_experimental_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server start_interchange_server(ajet_config) diff --git a/ajet/backbone/main_verl.py b/ajet/backbone/main_verl.py index 1dc70759..dcd575f4 100644 --- a/ajet/backbone/main_verl.py +++ b/ajet/backbone/main_verl.py @@ -55,7 +55,7 @@ def run_ppo(config) -> None: # Check if Ray is not initialized if not ray.is_initialized(): # this is for local ray cluster - runtime_env = get_runtime_env() + runtime_env = get_runtime_env(config) print_dict(runtime_env["env_vars"], "runtime_env") ray.init( runtime_env=runtime_env, diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index 77abd917..3f0a724c 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -180,7 +180,7 @@ def run(config): def main(config): from omegaconf import OmegaConf OmegaConf.resolve(config) - runtime_env = get_runtime_env() + runtime_env = get_runtime_env(config) os.environ.update(runtime_env["env_vars"]) # atexit.register(lambda: print("Process exiting, performing cleanup...")) diff --git a/ajet/backbone/warm_up.py b/ajet/backbone/warm_up.py index bdef7b47..f4c2973e 100644 --- a/ajet/backbone/warm_up.py +++ b/ajet/backbone/warm_up.py @@ -43,6 +43,42 @@ def init_parallel_rollout_logger(experiment_name): +def warm_up_task_judge_when_needed(config): + if config.ajet.task_judge.judge_type == "rubrics_auto_grader": + from ajet.task_judge.rm_auto_grader_judge import AutoGraderJudge + + judge = AutoGraderJudge(config) + asyncio.run(judge.generate_rubrics_from_samples()) + asyncio.run(judge.load_rubrics_from_cache()) + + +def clean_up_tmp_ajet_dir(config): + """Clean up old IPC socket files in /tmp/ajet directory.""" + import time + if config.ajet.enable_experimental_interchange_server is False: + return + + tmp_dir = "/tmp/ajet" + if not os.path.exists(tmp_dir): + return + current_time = time.time() + ttl = 4 * 3600 + try: + for filename in os.listdir(tmp_dir): + if not filename.endswith(".sock"): + continue + + file_path = os.path.join(tmp_dir, filename) + try: + print(current_time - os.path.getmtime(file_path)) + if current_time - os.path.getmtime(file_path) > ttl: + os.remove(file_path) + except OSError: + pass + except OSError: + pass + + def warm_up_process(config): """ Process level warm up @@ -65,12 +101,4 @@ def warm_up_process(config): experiment_name = config.ajet.experiment_name init_parallel_rollout_logger(experiment_name) warm_up_task_judge_when_needed(config) - - -def warm_up_task_judge_when_needed(config): - if config.ajet.task_judge.judge_type == "rubrics_auto_grader": - from ajet.task_judge.rm_auto_grader_judge import AutoGraderJudge - - judge = AutoGraderJudge(config) - asyncio.run(judge.generate_rubrics_from_samples()) - asyncio.run(judge.load_rubrics_from_cache()) + clean_up_tmp_ajet_dir(config) \ No newline at end of file diff --git a/ajet/default_config/ajet_default.yaml b/ajet/default_config/ajet_default.yaml index 0bbfc2f7..fb4a6143 100644 --- a/ajet/default_config/ajet_default.yaml +++ b/ajet/default_config/ajet_default.yaml @@ -280,7 +280,7 @@ ajet: save_trajectory_as_json_file: False - # the experimental reverse proxy feature that allows `tuner.as_oai_baseurl_apikey` feature + # the experimental ZeroMQ interchange server feature that allows `tuner.as_oai_baseurl_apikey` feature enable_experimental_interchange_server: True interchange_server: interchange_method: 'ipc' # options: 'tcp' (multi-nodes) or 'ipc' (1 node) diff --git a/ajet/tuner.py b/ajet/tuner.py index a2330a79..93602d05 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -26,7 +26,8 @@ def __init__( self.context_tracker = context_tracker self.llm_inference_fn = llm_inference_fn self.target2proxy_registry: dict[str, dict[str,TunerTypeUnion]] = {} - if config.ajet.enable_experimental_interchange_server: + self.enable_interchange_server = config.ajet.enable_experimental_interchange_server + if self.enable_interchange_server: self.proxy_client_started = False @@ -104,7 +105,7 @@ def as_oai_baseurl_apikey( ``` """ - assert self.config.ajet.enable_experimental_interchange_server, "Please enable `ajet.enable_experimental_interchange_server` in yaml config to use `as_oai_baseurl_apikey` feature." + assert self.enable_interchange_server, "Please enable `ajet.enable_experimental_interchange_server` in yaml config to use `as_oai_baseurl_apikey` feature." if self.proxy_client_started is False: self.proxy_client_started = True self._enable_experimental_interchange_server(self.llm_inference_fn) @@ -171,7 +172,7 @@ def get_context_tracker(self) -> MultiAgentContextTracker: def _enable_experimental_interchange_server(self, llm_inference_fn): # experimental reverse proxy start - if self.config.ajet.enable_experimental_interchange_server: + if self.enable_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_client import InterchangeClient self.interchange_client = InterchangeClient( episode_uuid=self.context_tracker.episode_uuid, @@ -184,6 +185,6 @@ def _enable_experimental_interchange_server(self, llm_inference_fn): def terminate_episode(self): # experimental reverse proxy cleanup - if self.config.ajet.enable_experimental_interchange_server: + if self.enable_interchange_server: if (self.proxy_client_started is True) and hasattr(self, "interchange_client"): self.interchange_client._should_terminate = True diff --git a/ajet/tuner_deprecated.py b/ajet/tuner_deprecated.py deleted file mode 100644 index 46343088..00000000 --- a/ajet/tuner_deprecated.py +++ /dev/null @@ -1,194 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal, Type - -from agentscope._utils._common import _create_tool_from_base_model -from agentscope.model import ChatModelBase, ChatResponse, DashScopeChatModel -from loguru import logger -from pydantic import BaseModel - -from ajet.context_tracker.multiagent_tracking import ( - MultiAgentContextTracker, -) -from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker - -if TYPE_CHECKING: - from ajet import Workflow - - -class Agent2Proxy(DashScopeChatModel): - """ - Handler for **NAMED** agent trainning targets. - It stores the target name, and a reference to the ModelTuner. - When request comes, it switches between default model (dashscope or openai models) and ModelTuner - """ - - def __init__(self, name: str, tuner: "ModelTuner", default_model: ChatModelBase): - self.name = name - self.tuner = tuner - self.default_model = default_model - super().__init__( - model_name="ajet", - api_key="dummy-api-key", - stream=False, - ) - - def __call__(self, *args, **kwargs): - if not self.tuner.is_trainable(self.name): - # [DO-NOT-TRAIN] if `trainable_targets` is non-empty, - # and self.name is not in it, use default model - return self.default_model(*args, **kwargs) - else: - # [TRAIN] - return self.tuner(*args, **kwargs) - - -class ModelTuner(DashScopeChatModel): - """ - ModelTuner for Agentscope workflow. - It keeps record of all registered agent types (by their target names), - And when request comes, it calls `self.llm_proxy` to handle the request. - """ - - def __init__( - self, - config, - context_tracker: MultiAgentContextTracker, - user_workflow: "Workflow", - **kwargs, - ) -> None: - self.config = config - self.context_tracker = context_tracker - self.user_workflow = user_workflow - self.target2proxy_registry: dict[str, Agent2Proxy] = {} - self.llm_proxy = OpenaiLlmProxyWithTracker( - context_tracker=context_tracker, config=config, **kwargs - ) - super().__init__( - model_name="ajet", - api_key="dummy-api-key", - stream=False, - ) - - def register_model(self, target_name: str, default_model: ChatModelBase) -> Agent2Proxy: - """Register an agent type. - Args: - target_name (`str`): - The name to register the agent type under. - default_model (`ChatModelBase`): - The model to use when you are NOT training this agent type. - Returns: - Agent2Proxy: - The agent type instance corresponding to the provided name. - """ - if target_name in self.target2proxy_registry: - if ( - default_model.model_name - != self.target2proxy_registry[target_name].default_model.model_name - ): - raise ValueError( - f"Agent proxy `{target_name}` is already registered with a different model_name.\nWAS [{self.target2proxy_registry[target_name].default_model.model_name}]\nNOW [{default_model.model_name}]." - ) - self.target2proxy_registry[target_name] = Agent2Proxy(target_name, self, default_model) - return self.get_model(target_name) - - def get_model(self, target_name: str) -> Agent2Proxy: - """Get the proxy instance by target_name. - Args: - target_name (`str`): - The name of the agent proxy to retrieve. - Returns: - Agent2Proxy: - The agent proxy corresponding to the provided target_name. - """ - if target_name not in self.target2proxy_registry: - raise ValueError(f"Agent proxy '{target_name}' is not registered.") - else: - return self.target2proxy_registry[target_name] - - async def __call__( - self, - messages: list[dict[str, Any]], - tools: list[dict] | None = None, - tool_choice: Literal["auto", "none", "any", "required"] | str | None = None, - structured_model: Type[BaseModel] | None = None, - **kwargs: Any, - ) -> ChatResponse: - # For qvq and qwen-vl models, the content field cannot be `None` or - # `[{"text": None}]`, so we need to convert it to an empty list. - if self.model_name.startswith("qvq") or "-vl" in self.model_name: - raise NotImplementedError("Not implemented for qvq and qwen-vl models yet.") - - kwargs = { - "messages": messages, - "model": self.model_name, - "stream": self.stream, - **self.generate_kwargs, - **kwargs, - "result_format": "message", - # In agentscope, the `incremental_output` must be `True` when - # `self.stream` is True - "incremental_output": self.stream, - } - - if tools: - kwargs["tools"] = self._format_tools_json_schemas(tools) - - if tool_choice: - self._validate_tool_choice(tool_choice, tools) - kwargs["tool_choice"] = self._format_tool_choice(tool_choice) - - if self.enable_thinking is not None and "enable_thinking" not in kwargs: - kwargs["enable_thinking"] = self.enable_thinking - - if structured_model: - if tools or tool_choice: - logger.warning( - "structured_model is provided. Both 'tools' and " - "'tool_choice' parameters will be overridden and " - "ignored. The model will only perform structured output " - "generation without calling any other tools.", - ) - format_tool = _create_tool_from_base_model(structured_model) - kwargs["tools"] = self._format_tools_json_schemas( - [format_tool], - ) - kwargs["tool_choice"] = self._format_tool_choice( - format_tool["function"]["name"], - ) - - # call llm model ✨ - response_gen = await self.llm_proxy( - api_key=self.api_key, - structured_model=structured_model, - **kwargs, - ) - - # Return the AsyncGenerator directly - return response_gen - - def is_trainable(self, target_name) -> bool: - if self.user_workflow.trainable_targets is None: - # always assume trainable when user has never changed trainable_targets - return True - if not self.user_workflow.trainable_targets: - # always assume trainable when trainable_targets is [] - return True - if target_name in self.user_workflow.trainable_targets: - return True - else: - return False - - def get_llm_proxy(self) -> OpenaiLlmProxyWithTracker: - """Get the LlmProxyForAgentScope instance. - Returns: - LlmProxyForAgentScope: - The LlmProxyForAgentScope instance used by the ModelTuner. - """ - return self.llm_proxy - - def get_context_tracker(self) -> MultiAgentContextTracker: - """Get the context tracker instance. - Returns: - LlmProxyForAgentScope: - The context tracker instance used by the ModelTuner. - """ - return self.context_tracker diff --git a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py index 06d9fe73..ba3e9693 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py @@ -12,7 +12,7 @@ from openai.resources.chat.chat import Chat, AsyncChat from openai.resources.completions import AsyncCompletions from openai import OpenAI, AsyncOpenAI -from ajet.utils.free_port import find_free_port +from ajet.utils.networking import find_free_port from .experimental.as_oai_model_client import generate_auth_token if TYPE_CHECKING: @@ -47,9 +47,12 @@ def __init__( episode_contect_address: str, **kwargs, ): + port = os.getenv("AJET_DAT_INTERCHANGE_PORT") assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" - base_url = f"http://localhost:{port}/v1" + master_node_ip = os.getenv("MASTER_NODE_IP", "localhost") + + base_url = f"http://{master_node_ip}:{port}/v1" api_key = generate_auth_token( agent_name=agent_name, target_tag=target_tag, diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index 8717bb82..720c6c77 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -12,9 +12,10 @@ from typing import TYPE_CHECKING from vllm.entrypoints.openai.protocol import ChatCompletionRequest from openai.types.chat.chat_completion import ChatCompletion -from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import InterchangeCompletionRequest +from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import InterchangeCompletionRequest, API_KEY_PREFIX from ajet.utils.thread_executors import SharedInferenceTrackerThreadExecutor, SharedInterchangeThreadExecutor -from ajet.utils.free_port import find_free_port +from ajet.utils.networking import find_free_port + context = zmq.Context() atexit.register(context.term) @@ -52,7 +53,7 @@ def generate_auth_token(agent_name, target_tag, episode_uuid, episode_address): base64_encoded = base64.b64encode(json_string.encode('utf-8')).decode('utf-8') # Step 4: Prepend "Bearer " to the Base64-encoded string - auth_token = f"Bearer {base64_encoded}" + auth_token = f"{API_KEY_PREFIX}{base64_encoded}" # API_KEY_PREFIX: Literal['sk-ajet-'] return auth_token @@ -68,10 +69,11 @@ def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker self.config = config self._should_terminate = False - interchange_method = config.ajet.interchange_server.interchange_method - if interchange_method == 'tcp': - self.episode_contect_address = f"tcp://localhost:{find_free_port()}" - else: + self.interchange_method = config.ajet.interchange_server.interchange_method + if self.interchange_method == 'tcp': + master_node_ip = os.getenv("MASTER_NODE_IP", "localhost") + self.episode_contect_address = f"tcp://{master_node_ip}:{find_free_port()}" + elif self.interchange_method == 'ipc': self.ipc_path = f"/tmp/ajet/{self.episode_uuid}.sock" self.episode_contect_address = f"ipc://{self.ipc_path}" self.max_inference_tracker_threads = config.ajet.interchange_server.max_inference_tracker_threads @@ -193,6 +195,7 @@ def _begin_service_threading(self): finally: self.socket.close() if DEBUG: logger.info(f"[client] {self.episode_uuid} | ZMQ socket closed, service loop terminated.") - if os.path.exists(self.ipc_path): - os.remove(self.ipc_path) - if DEBUG: logger.info(f"[client] {self.episode_uuid} | IPC socket file {self.ipc_path} removed.") + if self.interchange_method == 'ipc': + if os.path.exists(self.ipc_path): + os.remove(self.ipc_path) + if DEBUG: logger.info(f"[client] {self.episode_uuid} | IPC socket file {self.ipc_path} removed.") diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 5a2e9429..0c652c69 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -32,6 +32,7 @@ from vllm.entrypoints.openai.protocol import ChatCompletionRequest from openai.types.chat.chat_completion import ChatCompletion +API_KEY_PREFIX = "sk-ajet-" class InterchangeCompletionRequest(BaseModel): completion_request: ChatCompletionRequest @@ -119,7 +120,7 @@ async def chat_completions(request: Request, authorization: str = Header(None)): try: # Remove "Bearer " prefix if present - auth_token = authorization.replace("Bearer ", "").replace("bearer ", "") + auth_token = authorization.replace("Bearer ", "").replace("bearer ", "").replace(API_KEY_PREFIX, "") decoded = base64.b64decode(auth_token).decode('utf-8') auth_data = json.loads(decoded) diff --git a/ajet/tuner_lib/weight_tuner/experimental/zmq.py b/ajet/tuner_lib/weight_tuner/experimental/zmq.py deleted file mode 100644 index d4bc462c..00000000 --- a/ajet/tuner_lib/weight_tuner/experimental/zmq.py +++ /dev/null @@ -1,12 +0,0 @@ - -# /register_socket_address(self, name: str, socket_address: str): - -# /get_socket_address(self, name: str): - -# /remove_socket_address(self, name: str): - - - -def find_llm_provider_via_name(name: str): - pass - diff --git a/ajet/utils/core_env_vars.py b/ajet/utils/core_env_vars.py index 59bb60ec..91fdf736 100644 --- a/ajet/utils/core_env_vars.py +++ b/ajet/utils/core_env_vars.py @@ -3,13 +3,21 @@ from beast_logger import print_dict from dotenv import load_dotenv -from ajet.utils.free_port import find_free_port +from ajet.utils.networking import find_free_port, get_host_ip -def get_runtime_env(is_trinity: bool = False) -> dict: +def get_runtime_env(config, is_trinity: bool = False) -> dict: if os.path.exists(".env"): load_dotenv(".env") + master_node_ip = get_host_ip(os.environ.get("NETWORK_INTERFACE", None)) + if config.ajet.trainer_common.nnodes == 1: + master_node_ip = "localhost" + else: + if config.ajet.enable_experimental_interchange_server: + if config.ajet.interchange_server.interchange_method == "ipc": + raise ValueError("IPC interchange method is not supported for multi-node setup. Please set `ajet.interchange_server.interchange_method: tcp` ") + runtime_env = { "env_vars": { "VLLM_USE_V1": "1", @@ -21,7 +29,8 @@ def get_runtime_env(is_trinity: bool = False) -> dict: # "VLLM_ALLOW_RUNTIME_LORA_UPDATING": "true", "SWANLAB_API_KEY": os.getenv("SWANLAB_API_KEY", ""), "AJET_CONFIG_REDIRECT": os.getenv("AJET_CONFIG_REDIRECT", ""), - "AJET_DAT_INTERCHANGE_PORT": str(find_free_port()) + "AJET_DAT_INTERCHANGE_PORT": str(find_free_port()), + "MASTER_NODE_IP": master_node_ip, } } diff --git a/ajet/utils/dynamic_import.py b/ajet/utils/dynamic_import.py index 9cf6fabb..1d36b4c6 100644 --- a/ajet/utils/dynamic_import.py +++ b/ajet/utils/dynamic_import.py @@ -31,27 +31,24 @@ def _dynamic_import(module_class_str: str): if ".py->" in module_class_str: # Handle file path format file_path = module_str - - # Convert to absolute path - if not os.path.isabs(file_path): - file_path = os.path.abspath(file_path) - if not os.path.exists(file_path): - raise ImportError(f"Module file not found: {file_path}") - # Split module name module_name = os.path.splitext(os.path.basename(file_path))[0] - # Load module from file using importlib.util - spec = importlib.util.spec_from_file_location(module_name, file_path) - if spec is None or spec.loader is None: - raise ImportError(f"Cannot create module spec for: {file_path}") - - module = importlib.util.module_from_spec(spec) - - # 检查是否已经加载过这个模块 + # check if module already loaded if module_name in sys.modules: module = sys.modules[module_name] else: + # Convert to absolute path + if not os.path.isabs(file_path): + file_path = os.path.abspath(file_path) + if not os.path.exists(file_path): + raise ImportError(f"Module file not found: {file_path}") + # Load module from file using importlib.util + spec = importlib.util.spec_from_file_location(module_name, file_path) + if spec is None or spec.loader is None: + raise ImportError(f"Cannot create module spec for: {file_path}") + + module = importlib.util.module_from_spec(spec) # Load module from file using importlib.util spec = importlib.util.spec_from_file_location(module_name, file_path) if spec is None or spec.loader is None: diff --git a/ajet/utils/free_port.py b/ajet/utils/free_port.py deleted file mode 100644 index 38df8545..00000000 --- a/ajet/utils/free_port.py +++ /dev/null @@ -1,9 +0,0 @@ -import socket - -def find_free_port() -> int: - """Find a free port on the system.""" - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind(('', 0)) - s.listen(1) - port = s.getsockname()[1] - return port diff --git a/ajet/utils/networking.py b/ajet/utils/networking.py new file mode 100644 index 00000000..9ed29c74 --- /dev/null +++ b/ajet/utils/networking.py @@ -0,0 +1,37 @@ +import socket + +def find_free_port() -> int: + """Find a free port on the system.""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(('', 0)) + s.listen(1) + port = s.getsockname()[1] + return port + + +def get_host_ip(interface=None): + """ + get the host machine's IP address. + """ + try: + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + if interface: + try: + import fcntl + import struct + ip = socket.inet_ntoa(fcntl.ioctl( + s.fileno(), + 0x8915, # SIOCGIFADDR + struct.pack('256s', interface[:15].encode()) + )[20:24]) + return ip + except (ImportError, IOError): + pass + s.connect(("8.8.8.8", 80)) + ip = s.getsockname()[0] + s.close() + return ip + + except Exception: + + return "127.0.0.1" \ No newline at end of file diff --git a/tests/test_networking.py b/tests/test_networking.py new file mode 100644 index 00000000..913fc341 --- /dev/null +++ b/tests/test_networking.py @@ -0,0 +1,56 @@ +import socket +import unittest +import sys +import os +import importlib.util + +# Load the module directly to avoid top-level package import issues +# caused by broken dependencies in other parts of the codebase. +# We are testing a standalone utility, so we don't need the whole app context. +module_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'ajet', 'utils', 'networking.py')) +spec = importlib.util.spec_from_file_location("networking", module_path) +networking = importlib.util.module_from_spec(spec) +spec.loader.exec_module(networking) + +find_free_port = networking.find_free_port +get_host_ip = networking.get_host_ip + +class TestNetworking(unittest.TestCase): + def test_find_free_port(self): + """Test that find_free_port returns a valid integer port.""" + port = find_free_port() + self.assertIsInstance(port, int) + self.assertGreater(port, 0) + self.assertLess(port, 65536) + + # Verify the port is valid to bind to (it should have been released) + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + try: + s.bind(('', port)) + except OSError: + # It's possible the port was taken immediately by another process + # but unlikely in a test environment. + pass + + def test_get_host_ip(self): + """Test that get_host_ip returns a valid IP string.""" + ip = get_host_ip() + self.assertIsInstance(ip, str) + parts = ip.split('.') + self.assertEqual(len(parts), 4) + for part in parts: + if part == 'localhost': + continue + self.assertTrue(part.isdigit(), f"Part {part} is not a digit") + self.assertTrue(0 <= int(part) <= 255) + + def test_get_host_ip_with_interface(self): + """Test get_host_ip with a non-existent interface falls back to default behavior.""" + # This will likely fail the interface specific block and fall back to the connect method + ip = get_host_ip(interface="invalid_interface_XYZ") + self.assertIsInstance(ip, str) + parts = ip.split('.') + self.assertEqual(len(parts), 4) + +if __name__ == '__main__': + unittest.main() diff --git a/tutorial/example_math_agent/math_agentscope_urlkey.py b/tutorial/example_math_agent/math_agentscope_urlkey.py index d36dc91b..89d0e2e9 100644 --- a/tutorial/example_math_agent/math_agentscope_urlkey.py +++ b/tutorial/example_math_agent/math_agentscope_urlkey.py @@ -48,6 +48,10 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl url_and_apikey = tuner.as_oai_baseurl_apikey() base_url = url_and_apikey.base_url api_key = url_and_apikey.api_key # the api key contain information, do not discard it + + # print(f"[MathToolWorkflow] Using base_url: [{base_url}], api_key: [{api_key}]") + # base_url: [http://10.56.3.98:57817/v1], api_key: [sk-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] + model = OpenAIChatModel( model_name="whatever", client_args={"base_url": base_url}, From afeb5edfe7c1fd62dd5ea0f6c5cad14795d961ee Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 02:26:49 +0800 Subject: [PATCH 452/462] fix trinity baseurl support --- ajet/backbone/main_trinity.py | 1 + ajet/backbone/trainer_trinity.py | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/ajet/backbone/main_trinity.py b/ajet/backbone/main_trinity.py index c9938086..cf1e353b 100644 --- a/ajet/backbone/main_trinity.py +++ b/ajet/backbone/main_trinity.py @@ -25,6 +25,7 @@ def patch_runtime_env_to_get_actor(): """Patch the classmethod of Explorer and Trainer to pass in the runtime env.""" ajet_config = get_ajet_config_from_trinity_side() runtime_env = get_runtime_env(ajet_config, is_trinity=True) + os.environ.update(runtime_env["env_vars"]) def patched_explorer_get_actor(cls, config: Config): return ( diff --git a/ajet/backbone/trainer_trinity.py b/ajet/backbone/trainer_trinity.py index 99e62e7e..1a75a1bc 100644 --- a/ajet/backbone/trainer_trinity.py +++ b/ajet/backbone/trainer_trinity.py @@ -116,10 +116,6 @@ def __init__( async def run_async(self): ajet_config = get_ajet_config_from_trinity_side() - if ajet_config.ajet.enable_experimental_interchange_server: - raise NotImplementedError( - "The experimental reverse proxy is not supported in Trinity backbone yet." - ) warm_up_process(ajet_config) tracker = await TrinityRolloutManager( is_eval=self.is_eval, From d02bf54bb3a704bf59fb03490d53e9917d0ebc87 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 10:48:12 +0800 Subject: [PATCH 453/462] refactor: update documentation deployment process and remove obsolete scripts --- .github/workflows/doc.yaml | 5 +- docs/build.sh | 193 ------------------------------------- docs/references.bib | 2 - pyproject.toml | 2 +- scripts/docker/dockerfile | 5 +- 5 files changed, 5 insertions(+), 202 deletions(-) delete mode 100755 docs/build.sh delete mode 100644 docs/references.bib diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml index e916a298..5b01b53e 100644 --- a/.github/workflows/doc.yaml +++ b/.github/workflows/doc.yaml @@ -33,12 +33,11 @@ jobs: - name: Build Cookbook run: | - cd docs - ./build.sh + mkdocs build - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: docs/_build/preview/_build/html - cname: tuner.agentscope.io + cname: doc.agentjet.github.io diff --git a/docs/build.sh b/docs/build.sh deleted file mode 100755 index 972aae83..00000000 --- a/docs/build.sh +++ /dev/null @@ -1,193 +0,0 @@ -#!/bin/bash - -# Multiple versions to build -VERSIONS=("preview") -# VERSIONS=("main") -OUTPUT_DIR="_build" - -# ANSI color codes for better display -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' - -# Function to display usage instructions -usage() { - echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo -e "${CYAN} JUPYTER BOOK BUILDER${NC}" - echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo -e "${YELLOW}Usage:${NC} $0 [-p]" - echo -e "${YELLOW}Options:${NC}" - echo -e " ${GREEN}-p${NC} Preview the book after building" - echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - exit 1 -} - -# Function to print step headers -print_step() { - echo -e "\n${CYAN}▶${NC} ${BLUE}$1${NC}" - echo -e "${CYAN}─────────────────────────────────────────────────────────────────────────────────${NC}" -} - -# Function to print success message -print_success() { - echo -e "${GREEN}✓${NC} $1" -} - -# Function to print error message -print_error() { - echo -e "${RED}✗${NC} $1" >&2 -} - -# Function to print info message -print_info() { - echo -e "${YELLOW}ℹ${NC} $1" -} - -# Function to print warning message -print_warning() { - echo -e "${YELLOW}⚠${NC} $1" -} - -# Check for the -p flag -PREVIEW=false -while getopts ":p" opt; do - case ${opt} in - p ) - PREVIEW=true - ;; - \? ) - print_error "Invalid option: -$OPTARG" - usage - ;; - esac -done - -# Header -echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" -echo -e "${CYAN} JUPYTER BOOK BUILDER${NC}" -echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - -# Check if we're in a Jupyter Book directory -if [ ! -f "_config.yml" ] && [ ! -f "_toc.yml" ]; then - print_warning "This doesn't appear to be a Jupyter Book directory" - print_info "Make sure you're in the root directory of your Jupyter Book project" -fi - -# Clean previous builds -print_step "Cleaning previous builds" -print_info "Running Command [jupyter-book clean .]" -if jupyter-book clean . >/dev/null 2>&1; then - print_success "Previous builds cleaned successfully" -else - print_error "Failed to clean previous builds" - exit 1 -fi - -print_info "Running Command [git rev-parse --abbrev-ref HEAD]" -INITIAL_BRANCH=$(git rev-parse --abbrev-ref HEAD) -print_step "Current branch: $INITIAL_BRANCH" - -# Build the Jupyter Book -for version in "${VERSIONS[@]}"; do - print_step "Building version: $version" - - if [ "$version" != "preview" ]; then - print_info "Running Command [git checkout $version]" - if git checkout "$version"; then - print_success "Switched to $version" - else - print_error "Failed to checkout $version" - print_info "Running Command [git checkout $INITIAL_BRANCH]" - git checkout "$INITIAL_BRANCH" 2>/dev/null - print_info "Running Command [git stash pop]" - git stash pop 2>/dev/null || true - exit 1 - fi - fi - - print_info "Running Command [jupyter-book build . --path-output $OUTPUT_DIR/$version]" - if jupyter-book build . --path-output $OUTPUT_DIR/$version; then - print_success "Jupyter Book built successfully" - if [ "$version" != "preview" ]; then - print_step "Moving $version HTML to preview directory" - - if mv $OUTPUT_DIR/$version/_build/html $OUTPUT_DIR/preview/_build/html/$version; then - print_success "Successfully moved $version to preview dir" - else - print_error "Failed to move $version to preview" - print_info "Running Command [git checkout $INITIAL_BRANCH]" - git checkout "$INITIAL_BRANCH" 2>/dev/null - print_info "Running Command [git stash pop]" - git stash pop 2>/dev/null || true - exit 1 - fi - else - print_step "Stash uncommitted changes." - print_info "Running Command [git stash]" - git stash - fi - else - print_error "Failed to build Jupyter Book" - print_info "Running Command [git checkout $INITIAL_BRANCH]" - git checkout "$INITIAL_BRANCH" 2>/dev/null - print_info "Running Command [git stash pop]" - git stash pop 2>/dev/null || true - exit 1 - fi -done - -# Switch back to initial branch -print_step "Switching back to initial branch: $INITIAL_BRANCH" -print_info "Running Command [git checkout $INITIAL_BRANCH]" -if git checkout "$INITIAL_BRANCH"; then - print_success "Successfully switched back to $INITIAL_BRANCH" - print_info "Running Command [git stash pop]" - git stash pop 2>/dev/null || true -else - print_error "Failed to switch back to $INITIAL_BRANCH" - exit 1 -fi - -# Check if preview is requested -if [ "$PREVIEW" = true ]; then - print_step "Starting preview server" - # Check if $OUTPUT_DIR/preview/_build/html directory exists - if [ ! -d "$OUTPUT_DIR/preview/_build/html" ]; then - print_error "Build directory not found. Please ensure the build completed successfully." - exit 1 - fi - - # Check if port 8000 is already in use - if command -v lsof >/dev/null 2>&1 && lsof -i :8000 >/dev/null 2>&1; then - print_warning "Port 8000 is already in use" - print_info "Trying to find an available port..." - PORT=8001 - while lsof -i :$PORT >/dev/null 2>&1 && [ $PORT -lt 9000 ]; do - PORT=$((PORT + 1)) - done - print_info "Using port $PORT instead" - else - PORT=8000 - fi - - print_success "Preview server starting..." - print_info "Open your browser and visit: ${GREEN}http://localhost:$PORT${NC}" - print_info "Press ${RED}Ctrl+C${NC} to stop the server" - echo -e "${CYAN}─────────────────────────────────────────────────────────────────────────────────${NC}\n" - # Start a simple HTTP server in the $OUTPUT_DIR/preview/_build/html directory - python -m http.server --directory $OUTPUT_DIR/preview/_build/html $PORT -else - print_step "Build Summary" - print_success "Build completed successfully!" - print_info "To build and preview the book, run: ${GREEN}$0 -p${NC}" - print_info "Build output available in: ${BLUE}$OUTPUT_DIR/preview/_build/html/${NC}" - # Show file size if possible - if command -v du >/dev/null 2>&1; then - BUILD_SIZE=$(du -sh $OUTPUT_DIR/preview/_build/html 2>/dev/null | cut -f1) - [ -n "$BUILD_SIZE" ] && print_info "Total build size: $BUILD_SIZE" - fi - echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" -fi diff --git a/docs/references.bib b/docs/references.bib deleted file mode 100644 index a845151c..00000000 --- a/docs/references.bib +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/pyproject.toml b/pyproject.toml index 55a49fb9..cc10e42e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ verl = [ ] trinity = [ - "trinity-rft==0.4.0" + "trinity-rft[vllm]==0.4.0" ] dev = [ diff --git a/scripts/docker/dockerfile b/scripts/docker/dockerfile index 6ea9678a..b9918f5e 100644 --- a/scripts/docker/dockerfile +++ b/scripts/docker/dockerfile @@ -1,6 +1,5 @@ # Build and run the docker image with the following command: # -# cd # docker build -f scripts/docker/dockerfile -t ajet:latest . # docker run -it --gpus all --shm-size="64g" --rm -v $PWD:/workspace -v :/data ajet:latest @@ -32,9 +31,9 @@ COPY . . RUN pip install uv # use uv to create a virtual environment and install dependencies -RUN uv venv /opt/venv --python=3.12 && \ +RUN uv venv /opt/venv --python=3.10 && \ . /opt/venv/bin/activate && \ - uv pip install -e .[trinity] && \ + uv pip install -e .[verl] && \ uv pip install flash_attn==2.8.1 --no-deps --no-cache-dir # set entrypoint to activate the virtual environment From 394b2782b3e0aff44dc5f8eee10fb456d8fcc97e Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 10:55:02 +0800 Subject: [PATCH 454/462] fix mkdocs auto build --- .github/workflows/doc.yaml | 8 +++++--- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml index 5b01b53e..cb90d4dd 100644 --- a/.github/workflows/doc.yaml +++ b/.github/workflows/doc.yaml @@ -29,15 +29,17 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -q -e ".[dev,doc]" + pip install -e ".[dev,docs]" - name: Build Cookbook run: | + which mkdocs + mkdocs --version mkdocs build - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs/_build/preview/_build/html - cname: doc.agentjet.github.io + publish_dir: site + cname: doc.agentjet.github.io \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index cc10e42e..aee28b2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ reward = [ ] flash_attn = [ - "flash-attn==2.8.1" + "flash-attn==2.8.3" ] docs = [ From 1ff504dbc8e174884cc1f0d7173e97e6c7cbe236 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 11:15:24 +0800 Subject: [PATCH 455/462] refactor: streamline MkDocs deployment workflow and update Python version --- .github/workflows/doc.yaml | 89 +++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 36 deletions(-) diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml index cb90d4dd..98e2fc9d 100644 --- a/.github/workflows/doc.yaml +++ b/.github/workflows/doc.yaml @@ -1,45 +1,62 @@ -name: Deploy Documentation to GitHub Pages +name: Deploy MkDocs to GitHub Pages on: push: branches: - main + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true jobs: - build-and-deploy: + build: runs-on: ubuntu-latest - steps: - - name: Free up disk space - run: | - sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/lib/android - docker system prune -af - - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - fetch-tags: true - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.10' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -e ".[dev,docs]" - - - name: Build Cookbook - run: | - which mkdocs - mkdocs --version - mkdocs build - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: site - cname: doc.agentjet.github.io \ No newline at end of file + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Cache pip dependencies + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('docs/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dependencies + run: | + pip install --upgrade pip + pip install -r docs/requirements.txt + + - name: Build documentation + run: mkdocs build --clean + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./site + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file From 6906d3a20c63d4535ad28d6c7176058015626fd5 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 11:16:42 +0800 Subject: [PATCH 456/462] fix: correct site_url in mkdocs configuration --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 386421f8..b9b38f70 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ site_name: AgentJet -site_url: https://doc.agentjet.top/ +site_url: https://doc.agentjet.top/AgentJet/ site_description: "A cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes." site_author: "Alibaba Tongyi Lab" repo_url: https://github.com/modelscope/AgentJet From c7f15dbd274672f3f6597ca88b0d4d38ee1140a8 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 11:48:25 +0800 Subject: [PATCH 457/462] fix: update documentation links to point to the new modelscope URLs --- README.md | 52 +++++++++++++++++------------------ docs/en/quickstart.md | 2 +- docs/en/support_agentscope.md | 4 +-- docs/en/workflow.md | 6 ++-- docs/index.md | 14 +++++----- mkdocs.yml | 2 +- tutorial/README.md | 2 +- 7 files changed, 41 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 8fc86b3c..f737937d 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # AgentJet (Beta) [![Benchmarking](https://img.shields.io/badge/Benchmarking-0078D4?style=for-the-badge&logo=github)](https://benchmark.agent-matrix.com/) -[![Docs](https://img.shields.io/badge/Docs-Read%20the%20Documents-0A7ECC?style=for-the-badge&logo=readthedocs&logoColor=white)](https://doc.agentjet.top/AgentJet) +[![Docs](https://img.shields.io/badge/Docs-Read%20the%20Documents-0A7ECC?style=for-the-badge&logo=readthedocs&logoColor=white)](https://modelscope.github.io/AgentJet) [![License](https://img.shields.io/badge/License-Apache--2.0-4c1?style=for-the-badge)](LICENSE) -[![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://doc.agentjet.top/AgentJet/en/installation#requirements) +[![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://modelscope.github.io/AgentJet/en/installation#requirements) @@ -18,11 +18,11 @@ Simply provide your agent **workflow**, training **dataset**, and **reward** fun -## 🛩️ Minimum Example +## ✈️ Minimum Example Let's begin with the simplest example: a math agent with a tool call. -- First, please check out the [installation guide](https://doc.agentjet.top/AgentJet/en/installation/) to set up the training environment. +- First, please check out the [installation guide](https://modelscope.github.io/AgentJet/en/installation/) to set up the training environment. - Then, tune your first model using the minimum example. ```python ajet --conf tutorial/example_math_agent/math_agent.yaml --backbone='verl' @@ -32,14 +32,14 @@ Let's begin with the simplest example: a math agent with a tool call. ``` -## 🛩️ Features +## ✈️ Features We aim to build a easy-to-learn Agent tuner that unlock more possibilities for agent developers: - **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. -- **Flexible and Fast**. AgentJet supports [multi-agent workflows](https://doc.agentjet.top/AgentJet/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](https://modelscope.github.io/AgentJet/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, coming soon). For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: @@ -50,15 +50,15 @@ For advanced researchers, AgentJet also provides high-resolution logging and deb --- -### 🛩️ Quick Start +### ✈️ Quick Start #### Installation -- **Click here to read the** [**installation guide**](https://doc.agentjet.top/AgentJet/en/installation/). +- **Click here to read the** [**installation guide**](https://modelscope.github.io/AgentJet/en/installation/). #### Run Training -- You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](https://doc.agentjet.top/AgentJet/en/example_math_agent/) as an example: +- You can start training your first agent with a single command using a pre-configured YAML file. Take the [Math agent](https://modelscope.github.io/AgentJet/en/example_math_agent/) as an example: ```bash ajet --conf tutorial/example_math_agent/math_agent.yaml @@ -68,17 +68,17 @@ For advanced researchers, AgentJet also provides high-resolution logging and deb Explore our rich library of examples to kickstart your journey: -- 🔢 [**Training a math agent that can write python code**](https://doc.agentjet.top/AgentJet/en/example_math_agent). -- 📱 [**Creating an AppWorld agent using AgentScope and training it**](https://doc.agentjet.top/AgentJet/en/example_app_world). -- 🐺 [**Developing Werewolves RPG agents and training them**](https://doc.agentjet.top/AgentJet/en/example_werewolves). -- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](https://doc.agentjet.top/AgentJet/en/example_learning_to_ask). -- 🎴 [**Writing a countdown game using AgentScope and solving it**](https://doc.agentjet.top/AgentJet/en/example_countdown). -- 🚶 [**Solving a frozen lake walking puzzle using AgentJet**](https://doc.agentjet.top/AgentJet/en/example_frozenlake). +- 🔢 [**Training a math agent that can write python code**](https://modelscope.github.io/AgentJet/en/example_math_agent). +- 📱 [**Creating an AppWorld agent using AgentScope and training it**](https://modelscope.github.io/AgentJet/en/example_app_world). +- 🐺 [**Developing Werewolves RPG agents and training them**](https://modelscope.github.io/AgentJet/en/example_werewolves). +- 👩🏻‍⚕️ [**Learning to ask questions like a doctor**](https://modelscope.github.io/AgentJet/en/example_learning_to_ask). +- 🎴 [**Writing a countdown game using AgentScope and solving it**](https://modelscope.github.io/AgentJet/en/example_countdown). +- 🚶 [**Solving a frozen lake walking puzzle using AgentJet**](https://modelscope.github.io/AgentJet/en/example_frozenlake). --- -### 🛩️ Core Concepts +### ✈️ Core Concepts AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. @@ -91,9 +91,9 @@ AgentJet makes agent fine-tuning straightforward by separating the developer int To optimize an agent, you provide three core inputs: -* [**Trainable Workflow**](https://doc.agentjet.top/AgentJet/en/workflow): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. -* [**Task Reader**](https://doc.agentjet.top/AgentJet/en/data_pipeline): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. -* [**Task Judger**](https://doc.agentjet.top/AgentJet/en/task_judger): Evaluates agent outputs and assigns rewards to guide training. +* [**Trainable Workflow**](https://modelscope.github.io/AgentJet/en/workflow): Define your agent logic by inheriting the Workflow class, supporting both simple agent setups and advanced multi-agent collaborations. +* [**Task Reader**](https://modelscope.github.io/AgentJet/en/data_pipeline): Load training tasks from JSONL files, HuggingFace datasets, interactive environments, or auto-generate them from documents. +* [**Task Judger**](https://modelscope.github.io/AgentJet/en/task_judger): Evaluates agent outputs and assigns rewards to guide training. #### 2. Internal System Architecture @@ -109,14 +109,14 @@ The internal system orchestrates several specialized modules to handle the compl -### 🛩️ Navigation +### ✈️ Navigation -* **Tutorials**: From [Installation](https://doc.agentjet.top/AgentJet/en/installation) to [Tuning your first agent](https://doc.agentjet.top/AgentJet/en/tune_your_first_agent) — the essential path for beginners. -* **Core Components**: Define your [Trainable Workflow](https://doc.agentjet.top/AgentJet/en/workflow) and manage [Data](https://doc.agentjet.top/AgentJet/en/data_pipeline) and [Reward](https://doc.agentjet.top/AgentJet/en/task_judger). -* **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](https://doc.agentjet.top/AgentJet/en/example_math_agent), [Werewolves game](https://doc.agentjet.top/AgentJet/en/example_werewolves) and [Learning to ask task](https://doc.agentjet.top/AgentJet/en/example_learning_to_ask). -* **Deep Dive**: Master advanced [Configuration](https://doc.agentjet.top/AgentJet/en/configuration). +* **Tutorials**: From [Installation](https://modelscope.github.io/AgentJet/en/installation) to [Tuning your first agent](https://modelscope.github.io/AgentJet/en/tune_your_first_agent) — the essential path for beginners. +* **Core Components**: Define your [Trainable Workflow](https://modelscope.github.io/AgentJet/en/workflow) and manage [Data](https://modelscope.github.io/AgentJet/en/data_pipeline) and [Reward](https://modelscope.github.io/AgentJet/en/task_judger). +* **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](https://modelscope.github.io/AgentJet/en/example_math_agent), [Werewolves game](https://modelscope.github.io/AgentJet/en/example_werewolves) and [Learning to ask task](https://modelscope.github.io/AgentJet/en/example_learning_to_ask). +* **Deep Dive**: Master advanced [Configuration](https://modelscope.github.io/AgentJet/en/configuration). -## 🛩️ Roadmap +## ✈️ Roadmap AgentJet is a constantly evolving project. We are planning to add the following features in the near future. diff --git a/docs/en/quickstart.md b/docs/en/quickstart.md index 91b7c3fc..fde601d2 100644 --- a/docs/en/quickstart.md +++ b/docs/en/quickstart.md @@ -17,7 +17,7 @@ Let's begin with the simplest example: a math agent with a tool call. ```python title="train_math_agent.py" from ajet import AgentJetJob -# refer to `https://doc.agentjet.top/AgentJet/en/tune_your_first_agent/` on how to write your own workflow +# refer to `https://modelscope.github.io/AgentJet/en/tune_your_first_agent/` on how to write your own workflow from tutorial.example_math_agent.math_agent_simplify import MathToolWorkflow model_path = "YOUR_MODEL_PATH" diff --git a/docs/en/support_agentscope.md b/docs/en/support_agentscope.md index 19506efe..b3129191 100644 --- a/docs/en/support_agentscope.md +++ b/docs/en/support_agentscope.md @@ -14,7 +14,7 @@ This article introduce the way to convert different types of ways to convert you === "Before Convertion" ```python - model = DashScopeChatModel(model_name="qwen-max", stream=False) # 🛩️ change here + model = DashScopeChatModel(model_name="qwen-max", stream=False) # ✈️ change here agent_instance = ReActAgent( name=f"Friday", sys_prompt="You are a helpful assistant", @@ -26,7 +26,7 @@ This article introduce the way to convert different types of ways to convert you === "After Convertion (`as_agentscope_model()`)" ```python - model = tuner.as_agentscope_model() # 🛩️ change here + model = tuner.as_agentscope_model() # ✈️ change here agent_instance = ReActAgent( name=f"Friday", sys_prompt="You are a helpful assistant", diff --git a/docs/en/workflow.md b/docs/en/workflow.md index 33191059..1137f02c 100644 --- a/docs/en/workflow.md +++ b/docs/en/workflow.md @@ -40,7 +40,7 @@ The very first step is to create a class as a container to wrap your code: from ajet import AjetTuner, Workflow, WorkflowOutput, WorkflowTask class MyWorkflow(Workflow): async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - # ... your ReActAgent workflow here 🛩️ ... + # ... your ReActAgent workflow here ✈️ ... return WorkflowOutput(reward=..., metadata={...}) ``` @@ -51,7 +51,7 @@ Next, use the `tuner` argument, call its `tuner.as_agentscope_model()` method: === "Before" ```python - model = DashScopeChatModel(model_name="qwen-max", stream=False) # 🛩️ change here + model = DashScopeChatModel(model_name="qwen-max", stream=False) # ✈️ change here agent_instance = ReActAgent( name=f"Friday", sys_prompt="You are a helpful assistant", @@ -63,7 +63,7 @@ Next, use the `tuner` argument, call its `tuner.as_agentscope_model()` method: === "After" ```python - model = tuner.as_agentscope_model() # 🛩️ change here + model = tuner.as_agentscope_model() # ✈️ change here agent_instance = ReActAgent( name=f"Friday", sys_prompt="You are a helpful assistant", diff --git a/docs/index.md b/docs/index.md index 69b018f7..ba98cd7f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,7 +8,7 @@ **AgentJet (AJet)** is a cutting-edge, user-friendly agent tuning framework designed to optimize LLM models and agent workflows. -## 🛩️ Key Features +## ✈️ Key Features
    @@ -75,7 +75,7 @@ -## 🛩️ Quick Start +## ✈️ Quick Start

    Click Here for the Full Installation Document

    @@ -109,7 +109,7 @@ We recommend using `uv` for dependency management. [Click here](en/installation. -## 🛩️ Example Library {#example-library} +## ✈️ Example Library {#example-library} Explore our rich library of examples to kickstart your journey: @@ -123,11 +123,11 @@ Explore our rich library of examples to kickstart your journey:
    -## 🛩️ Core Concepts +## ✈️ Core Concepts AgentJet makes agent fine-tuning straightforward by separating the developer interface from the internal execution logic. -**🛩️ The User-Centric Interface** +**✈️ The User-Centric Interface** To optimize an agent, you provide three core inputs: @@ -141,7 +141,7 @@ To optimize an agent, you provide three core inputs: AgentJet Architecture
    -**🛩️ Internal System Architecture** +**✈️ Internal System Architecture** The internal system orchestrates several specialized modules to handle the complexities of RL training and agent interactions. @@ -156,7 +156,7 @@ The internal system orchestrates several specialized modules to handle the compl -## 🛩️ Next Steps +## ✈️ Next Steps

    Installation

    Set up AgentJet environment and dependencies.

    diff --git a/mkdocs.yml b/mkdocs.yml index b9b38f70..ad8e51de 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ site_name: AgentJet -site_url: https://doc.agentjet.top/AgentJet/ +site_url: https://modelscope.github.io/AgentJet/ site_description: "A cutting-edge, user-friendly training framework designed to optimize AgentScope agents and workflows, fine-tuning language model weights behind the scenes." site_author: "Alibaba Tongyi Lab" repo_url: https://github.com/modelscope/AgentJet diff --git a/tutorial/README.md b/tutorial/README.md index b3f3a8e6..e5811d8d 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -4,7 +4,7 @@ Explore our rich library of examples to kickstart your journey. - Example Documentation: - https://doc.agentjet.top/AgentJet/#example-library + https://modelscope.github.io/AgentJet/#example-library - Example Benchmark Tracking System: From 0142ccf8ac41ec99bef3ba6f4992af1329a9dbfb Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 12:00:08 +0800 Subject: [PATCH 458/462] docs: add citation section to README for research reference --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index f737937d..8ddbb88b 100644 --- a/README.md +++ b/README.md @@ -130,3 +130,26 @@ AgentJet is a constantly evolving project. We are planning to add the following | **Capability** | Multi-modal training support | Todo | | **Capability** | MARL Credit assignment | Todo | | **Capability** | Training dataset generation from few-shot samples | Done & Verifying | + + +## ✈️ Citation + +If you use AgentJet in your research, please cite: + +```bibtex +@software{ + title = {AgentJet: A Cutting-Edge Multi-Agent Training Platform for Large Language Models.}, + author = {The AgentJet Team}, + url = {https://modelscope.github.io/AgentJet/}, + month = {01}, + year = {2026} +} +``` + +
    + +--- +
    + +[⭐ Star Us](https://github.com/modelscope/AgentJet) · [🐛 Report Bug](https://github.com/modelscope/AgentJet/issues) · [💡 Request Feature](https://github.com/modelscope/AgentJet/issues) +
    \ No newline at end of file From 0b13540645b3939fd3a48cbfc6b023350bfc9f1d Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 12:20:23 +0800 Subject: [PATCH 459/462] fix invalid urls --- README.md | 6 +++--- docs/en/example_math_agent.md | 8 ++++++++ docs/en/installation.md | 9 ++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8ddbb88b..f2b520f5 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ We aim to build a easy-to-learn Agent tuner that unlock more possibilities for a - **Easy and Friendly**. AgentJet helps you tune models behind your agent workflows easily, optimizing your agents for top performance with minimal effort. - **Rich Tutorial Library**. AgentJet provides a rich library of [examples](https://github.com/modelscope/AgentJet/tree/main/tutorial) as tutorials. - **Efficient and Scalable**. AgentJet uses [verl] as the default backbone (`--backbone=verl`). However, we also support [trinity](https://github.com/modelscope/Trinity-RFT/) as alternative backbone, accelerating your tuning process via fully asynchronous RFT. -- **Flexible and Fast**. AgentJet supports [multi-agent workflows](https://modelscope.github.io/AgentJet/en/workflow.md) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. +- **Flexible and Fast**. AgentJet supports [multi-agent workflows](https://modelscope.github.io/AgentJet/en/workflow/) and adopts a context merging technique, accelerating training by 1.5x to 10x when the workflow involves multi-turn (or multi-agent) conversations. - **Reliability and Reproducibility**. Our team keeps track of framework performance across multiple [tasks + major-git-version + training-backbones](https://benchmark.agent-matrix.com/) (under construction, still gathering data, coming soon). For advanced researchers, AgentJet also provides high-resolution logging and debugging solutions: @@ -113,7 +113,7 @@ The internal system orchestrates several specialized modules to handle the compl * **Tutorials**: From [Installation](https://modelscope.github.io/AgentJet/en/installation) to [Tuning your first agent](https://modelscope.github.io/AgentJet/en/tune_your_first_agent) — the essential path for beginners. * **Core Components**: Define your [Trainable Workflow](https://modelscope.github.io/AgentJet/en/workflow) and manage [Data](https://modelscope.github.io/AgentJet/en/data_pipeline) and [Reward](https://modelscope.github.io/AgentJet/en/task_judger). -* **Example**: Check the [Example Library](#example-library) above for real-world cases like [Math](https://modelscope.github.io/AgentJet/en/example_math_agent), [Werewolves game](https://modelscope.github.io/AgentJet/en/example_werewolves) and [Learning to ask task](https://modelscope.github.io/AgentJet/en/example_learning_to_ask). +* **Example**: Check the [Example Library](https://modelscope.github.io/AgentJet/#example-library) above for real-world cases like [Math](https://modelscope.github.io/AgentJet/en/example_math_agent), [Werewolves game](https://modelscope.github.io/AgentJet/en/example_werewolves) and [Learning to ask task](https://modelscope.github.io/AgentJet/en/example_learning_to_ask). * **Deep Dive**: Master advanced [Configuration](https://modelscope.github.io/AgentJet/en/configuration). ## ✈️ Roadmap @@ -151,5 +151,5 @@ If you use AgentJet in your research, please cite: ---
    -[⭐ Star Us](https://github.com/modelscope/AgentJet) · [🐛 Report Bug](https://github.com/modelscope/AgentJet/issues) · [💡 Request Feature](https://github.com/modelscope/AgentJet/issues) +[⭐ Star Us](https://github.com/modelscope/AgentJet) · [Report Bug](https://github.com/modelscope/AgentJet/issues) · [Request Feature](https://github.com/modelscope/AgentJet/issues)
    \ No newline at end of file diff --git a/docs/en/example_math_agent.md b/docs/en/example_math_agent.md index ba941587..e67c24b1 100644 --- a/docs/en/example_math_agent.md +++ b/docs/en/example_math_agent.md @@ -185,6 +185,14 @@ Most wiring happens in `tutorial/example_math_agent/math_agent.yaml`: ``` +!!! warning "user_workflow assignment" + - As you have noticed, `user_workflow: tutorial.example_math_agent.math_agent_langchain->ExampleMathLearn` means, AgentJet will try to import `ExampleMathLearn` from `${WorkingDir}/tutorial/example_math_agent/math_agent_langchain.py`. (**Dot import**) + - If you prefer absolute path, or you workflow is not in python search path, you can also use the alternative way to import your workflow `user_workflow: /path/to/ajet/tutorial/example_math_agent/math_agent_langchain.py->ExampleMathLearn`. (**Path import**) + - Both **dot import** (dot-to-module) and **path import** (path-to-source-code) is good. But **dot import** is recommended as it is more pythonic. + + + + | Field | Description | |-------|-------------| | `task_reader` | Where tasks come from | diff --git a/docs/en/installation.md b/docs/en/installation.md index ebd743c1..4baabcaf 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -28,7 +28,7 @@ cd AgentJet ### Step 2: Install Dependencies -AgentJet supports multiple backbones. Currently we have `verl` and `trinity` (recommended). +AgentJet supports multiple backbones, you can choose any of them depending on your requirements, or choose all of them to compare the performance. Currently we have `verl` and `trinity`. !!! info "Package Manager" We recommend using `uv` to manage your Python environment as it is incredibly fast. See also [`uv` installation document](https://docs.astral.sh/uv/getting-started/installation/). @@ -49,7 +49,8 @@ AgentJet supports multiple backbones. Currently we have `verl` and `trinity` (re ``` !!! warning "flash-attn Installation" - `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. + - `flash-attn` must be installed **after** other dependencies. + - If you find your machine spend a long time installing flash-attn, ensure a healthy connection to GitHub. === "VERL (conda)" @@ -64,8 +65,10 @@ AgentJet supports multiple backbones. Currently we have `verl` and `trinity` (re pip install --verbose flash-attn --no-deps --no-build-isolation --no-cache ``` + !!! warning "flash-attn Installation" - `flash-attn` must be installed after other dependencies. To build faster, export `MAX_JOBS=${N_CPU}`, or ensure a healthy connection to GitHub to install pre-compiled wheels. + - `flash-attn` must be installed **after** other dependencies. + - If you find your machine spend a long time installing flash-attn, ensure a healthy connection to GitHub. === "VERL (aliyun)" From 9d0c77eef2f322a96db833c5866a4031e83cd996 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 12:24:53 +0800 Subject: [PATCH 460/462] remove trailing-whitespace --- .github/workflows/doc.yaml | 2 +- .pre-commit-config.yaml | 78 +++++++++--------- README.md | 2 +- ajet/backbone/warm_up.py | 2 +- ajet/schema/convertion.py | 1 - ajet/schema/logprob.py | 2 +- ajet/task_reader/__init__.py | 2 +- ajet/task_runner/base_runner.py | 1 - ajet/tuner_lib/weight_tuner/__init__.py | 1 - .../weight_tuner/as_oai_sdk_model.py | 2 - .../experimental/as_oai_model_server.py | 2 - ajet/utils/async_utils.py | 2 +- ajet/utils/lowlevel_hook.py | 2 +- ajet/utils/metric_helper/__init__.py | 2 +- .../metric_helper/reward_metric_helper.py | 80 +++++++++---------- .../metric_helper/save_trajectory_as_json.py | 2 +- ajet/utils/networking.py | 2 +- ajet/utils/thread_executors.py | 2 +- docs/_toc.yml | 15 ++-- docs/en/debugging_guide.md | 1 - docs/en/example_countdown.md | 1 - docs/en/example_learning_to_ask.md | 8 +- docs/en/hardware_related_solution.md | 2 +- docs/en/support_agentscope.md | 1 - docs/en/support_http.md | 2 - docs/en/support_langchain.md | 2 - docs/en/support_oaisdk.md | 3 - docs/index.md | 1 - docs/javascripts/animations.js | 1 - docs/javascripts/code-zoom.js | 1 - docs/javascripts/responsive.js | 1 - docs/javascripts/search-fix.js | 1 - docs/javascripts/tabbed-code.js | 1 - docs/requirements.txt | 1 - docs/stylesheets/animations.css | 1 - docs/stylesheets/feature-cards.css | 1 - docs/stylesheets/flowchart.css | 1 - docs/stylesheets/jupyter-simple.css | 1 - docs/stylesheets/syntax-highlight.css | 1 - docs/stylesheets/tuner_v2.md | 2 +- install.sh | 8 +- mkdocs.yml | 1 - pyproject.toml | 2 +- tutorial/README.md | 2 +- .../data_preprocess/llm_info_extraction.py | 2 +- .../data_preprocess/message_splitter.py | 2 +- .../data_preprocess/step1.py | 34 ++++---- .../data_preprocess/step2.py | 4 +- tutorial/example_learn2ask/learn2ask.md | 2 +- .../example_learn2ask/learn2ask_langchain.py | 10 +-- .../math_agent_langchain.py | 10 +-- .../example_math_agent/math_agent_raw_http.py | 5 -- 52 files changed, 141 insertions(+), 177 deletions(-) diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml index 98e2fc9d..fba9b693 100644 --- a/.github/workflows/doc.yaml +++ b/.github/workflows/doc.yaml @@ -59,4 +59,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file + uses: actions/deploy-pages@v4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0e78eeb7..0008bd94 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,45 +11,45 @@ repos: - id: check-merge-conflict - id: detect-private-key - - repo: https://github.com/psf/black - rev: 23.7.0 - hooks: - - id: black - language_version: python3.10 - args: [--line-length=100] + # - repo: https://github.com/psf/black + # rev: 23.7.0 + # hooks: + # - id: black + # language_version: python3.10 + # args: [--line-length=100] - - repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort - args: ["--profile", "black", "--filter-files"] + # - repo: https://github.com/pycqa/isort + # rev: 5.12.0 + # hooks: + # - id: isort + # args: ["--profile", "black", "--filter-files"] - - repo: https://github.com/pycqa/flake8 - rev: 6.1.0 - hooks: - - id: flake8 - additional_dependencies: [flake8-docstrings] - args: [ - "--max-line-length=100", - "--max-complexity=20", - "--select=C,E,F,W,B,B950", - "--ignore=E203,E266,E501,W503", - ] + # - repo: https://github.com/pycqa/flake8 + # rev: 6.1.0 + # hooks: + # - id: flake8 + # additional_dependencies: [flake8-docstrings] + # args: [ + # "--max-line-length=100", + # "--max-complexity=20", + # "--select=C,E,F,W,B,B950", + # "--ignore=E203,E266,E501,W503", + # ] - - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.7.0 - hooks: - - id: mypy - args: [ - --ignore-missing-imports, - --disable-error-code=var-annotated, - --disable-error-code=union-attr, - --disable-error-code=no-redef, - --disable-error-code=assignment, - --disable-error-code=has-type, - --disable-error-code=attr-defined, - --disable-error-code=import-untyped, - --disable-error-code=truthy-function, - --follow-imports=skip, - --explicit-package-bases, - ] + # - repo: https://github.com/pre-commit/mirrors-mypy + # rev: v1.7.0 + # hooks: + # - id: mypy + # args: [ + # --ignore-missing-imports, + # --disable-error-code=var-annotated, + # --disable-error-code=union-attr, + # --disable-error-code=no-redef, + # --disable-error-code=assignment, + # --disable-error-code=has-type, + # --disable-error-code=attr-defined, + # --disable-error-code=import-untyped, + # --disable-error-code=truthy-function, + # --follow-imports=skip, + # --explicit-package-bases, + # ] diff --git a/README.md b/README.md index f2b520f5..b01cff25 100644 --- a/README.md +++ b/README.md @@ -152,4 +152,4 @@ If you use AgentJet in your research, please cite:
    [⭐ Star Us](https://github.com/modelscope/AgentJet) · [Report Bug](https://github.com/modelscope/AgentJet/issues) · [Request Feature](https://github.com/modelscope/AgentJet/issues) -
    \ No newline at end of file +
    diff --git a/ajet/backbone/warm_up.py b/ajet/backbone/warm_up.py index f4c2973e..fcae673f 100644 --- a/ajet/backbone/warm_up.py +++ b/ajet/backbone/warm_up.py @@ -101,4 +101,4 @@ def warm_up_process(config): experiment_name = config.ajet.experiment_name init_parallel_rollout_logger(experiment_name) warm_up_task_judge_when_needed(config) - clean_up_tmp_ajet_dir(config) \ No newline at end of file + clean_up_tmp_ajet_dir(config) diff --git a/ajet/schema/convertion.py b/ajet/schema/convertion.py index e2a6a2c0..190fc3c1 100644 --- a/ajet/schema/convertion.py +++ b/ajet/schema/convertion.py @@ -106,4 +106,3 @@ def convert_llm_proxy_response_to_agentscope_response( ) return parsed_response - diff --git a/ajet/schema/logprob.py b/ajet/schema/logprob.py index 42d2c572..dc736fb8 100644 --- a/ajet/schema/logprob.py +++ b/ajet/schema/logprob.py @@ -11,4 +11,4 @@ class TokenAndProb(BaseModel): token_id: int logprob: float - decoded_string: str \ No newline at end of file + decoded_string: str diff --git a/ajet/task_reader/__init__.py b/ajet/task_reader/__init__.py index 19a1a8e3..2d7d7322 100644 --- a/ajet/task_reader/__init__.py +++ b/ajet/task_reader/__init__.py @@ -123,4 +123,4 @@ def dict_to_ajet_task(task_dict: dict) -> Task: task_id=task_dict.get("task_id", ""), env_type=task_dict.get("env_type", ""), metadata=task_dict.get("metadata", {}), - ) \ No newline at end of file + ) diff --git a/ajet/task_runner/base_runner.py b/ajet/task_runner/base_runner.py index 65aa5c13..b6da703a 100644 --- a/ajet/task_runner/base_runner.py +++ b/ajet/task_runner/base_runner.py @@ -117,4 +117,3 @@ def run_user_workflow( else: raise ValueError(f"Unsupported wrapper type: {self.wrapper_type}") - diff --git a/ajet/tuner_lib/weight_tuner/__init__.py b/ajet/tuner_lib/weight_tuner/__init__.py index 317e8699..abb540c1 100644 --- a/ajet/tuner_lib/weight_tuner/__init__.py +++ b/ajet/tuner_lib/weight_tuner/__init__.py @@ -1,4 +1,3 @@ from ajet.tuner_lib.weight_tuner.as_agentscope_model import AgentScopeModelTuner from ajet.tuner_lib.weight_tuner.as_oai_sdk_model import OpenaiClientModelTuner - diff --git a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py index 943d5c2c..38619515 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py @@ -80,5 +80,3 @@ async def create( ) assert isinstance(response_gen, ChatCompletion) return response_gen - - diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 0c652c69..40558013 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -239,5 +239,3 @@ def start_interchange_server(config) -> int: # return port return port - - diff --git a/ajet/utils/async_utils.py b/ajet/utils/async_utils.py index 3bb1b67e..219aba9c 100644 --- a/ajet/utils/async_utils.py +++ b/ajet/utils/async_utils.py @@ -67,4 +67,4 @@ def _patched_del(self) -> None: AsyncHttpxClientWrapper.__del__ = _patched_del print("Applied httpx aclose patch.") except ImportError: - pass \ No newline at end of file + pass diff --git a/ajet/utils/lowlevel_hook.py b/ajet/utils/lowlevel_hook.py index bdd536d0..006f17b9 100644 --- a/ajet/utils/lowlevel_hook.py +++ b/ajet/utils/lowlevel_hook.py @@ -44,4 +44,4 @@ def debug_task_init(self, coro, loop=None, name=None, context=None): asyncio.create_task = debug_create_task asyncio.AbstractEventLoop.create_task = debug_loop_create_task -patch_task_creation() \ No newline at end of file +patch_task_creation() diff --git a/ajet/utils/metric_helper/__init__.py b/ajet/utils/metric_helper/__init__.py index a9702d5d..70ce2818 100644 --- a/ajet/utils/metric_helper/__init__.py +++ b/ajet/utils/metric_helper/__init__.py @@ -14,4 +14,4 @@ def update_metrics(context_tracker_arr, metrics:dict): metrics.update(tool_metrics) if reward_metrics: metrics.update(reward_metrics) - return \ No newline at end of file + return diff --git a/ajet/utils/metric_helper/reward_metric_helper.py b/ajet/utils/metric_helper/reward_metric_helper.py index b6cf5918..a2b69bc4 100644 --- a/ajet/utils/metric_helper/reward_metric_helper.py +++ b/ajet/utils/metric_helper/reward_metric_helper.py @@ -18,10 +18,10 @@ def extract_reward_stats_from_trajectories(trajectories: List[Any]) -> List[Dict[str, Any]]: """ Extract reward_stats from trajectories list. - + Args: trajectories: List of trajectory objects containing workflow_metadata - + Returns: List of reward_stats dictionaries """ @@ -36,10 +36,10 @@ def extract_reward_stats_from_trajectories(trajectories: List[Any]) -> List[Dict def extract_reward_stats_from_cmts(cmts: List[Any]) -> tuple[List[Dict[str, Any]], Dict[str, int]]: """ Extract reward_stats from cmts list and return debug statistics. - + Args: cmts: List of cmt objects containing workflow_metadata - + Returns: Tuple of (reward_stats_list, debug_stats) """ @@ -49,47 +49,47 @@ def extract_reward_stats_from_cmts(cmts: List[Any]) -> tuple[List[Dict[str, Any] 'has_workflow_metadata': 0, 'has_reward_stats': 0, } - + for _cmt in cmts: if hasattr(_cmt, 'workflow_metadata') and _cmt.workflow_metadata: debug_stats['has_workflow_metadata'] += 1 if 'reward_stats' in _cmt.workflow_metadata: debug_stats['has_reward_stats'] += 1 reward_stats_list.append(_cmt.workflow_metadata['reward_stats']) - + return reward_stats_list, debug_stats def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str = "") -> Dict[str, float]: """ Compute SwanLab metrics from reward_stats list. - + Supports two data sources: 1. RM Gallery RewardStats fields (rm_raw, etc.) 2. OpenJudge fields (openjudge_xxx_raw, openjudge_xxx_contribution, etc.) - + Args: reward_stats_list: List of reward_stats dictionaries prefix: Metric name prefix (e.g., "val/" for validation phase) - + Returns: Formatted metrics dictionary ready for SwanLab reporting """ if not reward_stats_list: return {} - + n = len(reward_stats_list) metrics = {} - + # ========== Top-level Scores (General) ========== final_reward_list = [rs.get('final_reward', 0.0) for rs in reward_stats_list] fused_reward_list = [rs.get('fused_reward', 0.0) for rs in reward_stats_list] penalty_list = [rs.get('penalty', 0.0) for rs in reward_stats_list] step_reward_list = [rs.get('step_reward', 0.0) for rs in reward_stats_list] - + # Penalty statistics non_zero_penalties = [p for p in penalty_list if p != 0.0] - + # Top-level metrics metrics[f"{prefix}rewards/final_reward_mean"] = float(np.mean(final_reward_list)) metrics[f"{prefix}rewards/fused_reward_mean"] = float(np.mean(fused_reward_list)) @@ -97,110 +97,110 @@ def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str metrics[f"{prefix}rewards/step_reward_mean"] = float(np.mean(step_reward_list)) metrics[f"{prefix}rewards/penalty_count"] = len(non_zero_penalties) metrics[f"{prefix}rewards/penalty_rate"] = len(non_zero_penalties) / n * 100 if n > 0 else 0.0 - + # ========== Detect OpenJudge Usage ========== openjudge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('openjudge_enabled', False)) - + if openjudge_enabled_count > 0: # ========== OpenJudge Metrics ========== metrics[f"{prefix}rewards/openjudge_enabled_rate"] = openjudge_enabled_count / n * 100 - + # Dynamically extract OpenJudge grader fields - # Currently supported graders: report_resolution, trajectory_faithfulness, + # Currently supported graders: report_resolution, trajectory_faithfulness, # rubrics_performance, trajectory_comprehensive, information_gain, action_loop openjudge_graders = [ "report_resolution", - "trajectory_faithfulness", + "trajectory_faithfulness", "rubrics_performance", "trajectory_comprehensive", "information_gain", "action_loop", ] - + for grader_name in openjudge_graders: raw_key = f"openjudge_{grader_name}_raw" contrib_key = f"openjudge_{grader_name}_contribution" - + raw_list = [rs.get(raw_key, 0.0) for rs in reward_stats_list] contrib_list = [rs.get(contrib_key, 0.0) for rs in reward_stats_list] - + # Only report when non-zero values exist if any(v != 0.0 for v in raw_list): metrics[f"{prefix}rewards/openjudge/{grader_name}_raw_mean"] = float(np.mean(raw_list)) if any(v != 0.0 for v in contrib_list): metrics[f"{prefix}rewards/openjudge/{grader_name}_contribution_mean"] = float(np.mean(contrib_list)) - + # OpenJudge time consumption statistics grading_time_list = [rs.get('grading_time', 0.0) for rs in reward_stats_list] if any(v != 0.0 for v in grading_time_list): metrics[f"{prefix}judge_time/openjudge_grading_time_mean"] = float(np.mean(grading_time_list)) metrics[f"{prefix}judge_time/openjudge_grading_time_max"] = float(np.max(grading_time_list)) - + # ========== RM Gallery Metrics ========== # RM Gallery rm_raw_list = [rs.get('rm_raw', 0.0) for rs in reward_stats_list] rm_contribution_list = [rs.get('rm_contribution', 0.0) for rs in reward_stats_list] - + # RefJudge ref_final_raw_list = [rs.get('ref_final_raw', 0.0) for rs in reward_stats_list] ref_citation_raw_list = [rs.get('ref_citation_raw', 0.0) for rs in reward_stats_list] ref_grounding_raw_list = [rs.get('ref_grounding_raw', 0.0) for rs in reward_stats_list] ref_contribution_list = [rs.get('ref_contribution', 0.0) for rs in reward_stats_list] - + # StructureJudge structure_raw_list = [rs.get('structure_raw', 0.0) for rs in reward_stats_list] structure_contribution_list = [rs.get('structure_contribution', 0.0) for rs in reward_stats_list] - + # dimensions/ raw scores metrics[f"{prefix}rewards/dimensions/rm_raw_mean"] = float(np.mean(rm_raw_list)) metrics[f"{prefix}rewards/dimensions/ref_final_raw_mean"] = float(np.mean(ref_final_raw_list)) metrics[f"{prefix}rewards/dimensions/ref_citation_raw_mean"] = float(np.mean(ref_citation_raw_list)) metrics[f"{prefix}rewards/dimensions/ref_grounding_raw_mean"] = float(np.mean(ref_grounding_raw_list)) metrics[f"{prefix}rewards/dimensions/structure_raw_mean"] = float(np.mean(structure_raw_list)) - + # contribution/ weighted contributions metrics[f"{prefix}rewards/contribution/rm_contribution_mean"] = float(np.mean(rm_contribution_list)) metrics[f"{prefix}rewards/contribution/ref_contribution_mean"] = float(np.mean(ref_contribution_list)) metrics[f"{prefix}rewards/contribution/structure_contribution_mean"] = float(np.mean(structure_contribution_list)) - + # Enabled state statistics ref_judge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('ref_judge_enabled', False)) if ref_judge_enabled_count > 0: metrics[f"{prefix}rewards/ref_judge_enabled_rate"] = ref_judge_enabled_count / n * 100 - + structure_judge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('structure_judge_enabled', False)) if structure_judge_enabled_count > 0: metrics[f"{prefix}rewards/structure_judge_enabled_rate"] = structure_judge_enabled_count / n * 100 - + # Time consumption statistics rm_time_list = [rs.get('rm_time', 0.0) for rs in reward_stats_list] refstruc_time_list = [rs.get('refstruc_time', 0.0) for rs in reward_stats_list] - + metrics[f"{prefix}judge_time/rm_time_mean"] = float(np.mean(rm_time_list)) metrics[f"{prefix}judge_time/refstruc_time_mean"] = float(np.mean(refstruc_time_list)) - + if rm_time_list: metrics[f"{prefix}judge_time/rm_time_max"] = float(np.max(rm_time_list)) if refstruc_time_list: metrics[f"{prefix}judge_time/refstruc_time_max"] = float(np.max(refstruc_time_list)) - + # ========== General Time Consumption Statistics ========== judge_total_time_list = [rs.get('judge_total_time', 0.0) for rs in reward_stats_list] if any(v != 0.0 for v in judge_total_time_list): metrics[f"{prefix}judge_time/judge_total_time_mean"] = float(np.mean(judge_total_time_list)) metrics[f"{prefix}judge_time/judge_total_time_max"] = float(np.max(judge_total_time_list)) - + return metrics def compute_reward_metrics_from_trajectories(trajectories: List[Any]) -> Dict[str, float]: """ Training phase: Extract reward_stats from trajectories and compute metrics. - + Args: trajectories: List of trajectory objects - + Returns: Formatted metrics dictionary """ @@ -211,21 +211,21 @@ def compute_reward_metrics_from_trajectories(trajectories: List[Any]) -> Dict[st def compute_reward_metrics_from_cmts(cmts: List[Any], print_debug: bool = True) -> Dict[str, float]: """ Validation phase: Extract reward_stats from cmts and compute metrics. - + Args: cmts: List of cmt objects print_debug: Whether to print debug information - + Returns: Formatted metrics dictionary (with "val_reward/" prefix) """ reward_stats_list, debug_stats = extract_reward_stats_from_cmts(cmts) - + if print_debug: print(f"\n[DEBUG eval_dataset()] reward_stats statistics:") print(f" - Total cmts count: {debug_stats['total_cmts']}") print(f" - Has workflow_metadata: {debug_stats['has_workflow_metadata']}") print(f" - Has reward_stats: {debug_stats['has_reward_stats']}") print(f" - Extracted samples count: {len(reward_stats_list)}") - + return compute_reward_metrics(reward_stats_list, prefix="val_") diff --git a/ajet/utils/metric_helper/save_trajectory_as_json.py b/ajet/utils/metric_helper/save_trajectory_as_json.py index 0e380abc..344a6ab4 100644 --- a/ajet/utils/metric_helper/save_trajectory_as_json.py +++ b/ajet/utils/metric_helper/save_trajectory_as_json.py @@ -53,4 +53,4 @@ def save_trajectory_as_json(ctx_trackers, global_steps, prefix="train"): # Print confirmation for evaluation trajectories if prefix != "train": - print(f"Saved trajectory to {traj_file_path}") \ No newline at end of file + print(f"Saved trajectory to {traj_file_path}") diff --git a/ajet/utils/networking.py b/ajet/utils/networking.py index 9ed29c74..f2fed5ac 100644 --- a/ajet/utils/networking.py +++ b/ajet/utils/networking.py @@ -34,4 +34,4 @@ def get_host_ip(interface=None): except Exception: - return "127.0.0.1" \ No newline at end of file + return "127.0.0.1" diff --git a/ajet/utils/thread_executors.py b/ajet/utils/thread_executors.py index 9c8ea634..1ab02baf 100644 --- a/ajet/utils/thread_executors.py +++ b/ajet/utils/thread_executors.py @@ -19,4 +19,4 @@ def __init__(self, max_workers=64): self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) def get_shared_executor(self) -> concurrent.futures.ThreadPoolExecutor: - return self.executor \ No newline at end of file + return self.executor diff --git a/docs/_toc.yml b/docs/_toc.yml index ffa745f4..7eb76610 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -8,7 +8,7 @@ parts: - file: en/installation.md - file: en/quickstart.md - file: en/tune_your_first_agent.md - + - caption: Example chapters: - file: en/example_math_agent.md @@ -17,13 +17,13 @@ parts: - file: en/example_learning_to_ask.md - file: en/example_frozenlake.md - file: en/example_countdown.md - + - caption: Component chapters: - file: en/workflow.md - file: en/data_pipeline.md - file: en/task_judger.md - + - caption: Deep Dive chapters: - file: en/configuration.md @@ -31,7 +31,7 @@ parts: - file: en/beast_logger.md - file: en/data_generation.md - file: en/example_tracing_feedback_loop.md - + # --- 中文部分 --- - caption: 教程 @@ -40,7 +40,7 @@ parts: - file: zh/installation.md - file: zh/quickstart.md - file: zh/tune_your_first_agent.md - + - caption: 示例 chapters: - file: zh/example_math_agent.md @@ -49,13 +49,13 @@ parts: - file: zh/example_learning_to_ask.md - file: zh/example_frozenlake.md - file: zh/example_countdown.md - + - caption: 组件 chapters: - file: zh/workflow.md - file: zh/data_pipeline.md - file: zh/task_judger.md - + - caption: 深入探索 chapters: - file: zh/configuration.md @@ -63,4 +63,3 @@ parts: - file: zh/beast_logger.md - file: zh/data_generation.md - file: zh/example_tracing_feedback_loop.md - diff --git a/docs/en/debugging_guide.md b/docs/en/debugging_guide.md index 0a938004..ff7563a2 100644 --- a/docs/en/debugging_guide.md +++ b/docs/en/debugging_guide.md @@ -104,4 +104,3 @@ Then, the modified launch.json will be | **VSCode Extension** | Python | Python + Ray Distributed Debugger | | **Launch Mode** | `F5` standard launch (via `launch.json`) | Command line execution with `ajet ... --debug="TAG"` | | **Commandline** | `--backbone=debug` | `--debug="TAG1\|TAG2\|TAG3"` | - diff --git a/docs/en/example_countdown.md b/docs/en/example_countdown.md index e214e4d5..ff8ec4e3 100644 --- a/docs/en/example_countdown.md +++ b/docs/en/example_countdown.md @@ -201,4 +201,3 @@ However, tuning resolves these issues, as shown in the example below: ![After tuning](https://img.alicdn.com/imgextra/i4/O1CN01C3kUnV221zjPi30rd_!!6000000007061-2-tps-1650-730.png) > **Token-level Visualization:** These detailed logs are generated by Beast-Logger. See [Beast-Logger Usage](./beast_logger.md) for more details. - diff --git a/docs/en/example_learning_to_ask.md b/docs/en/example_learning_to_ask.md index c3d4bcf9..d5a17abe 100644 --- a/docs/en/example_learning_to_ask.md +++ b/docs/en/example_learning_to_ask.md @@ -135,7 +135,7 @@ We provide two implmentations of the agent based on AgentScope and langchain: ```python # get the trainable llm llm_info=tuner.as_oai_baseurl_apikey() - + # create the langchain agent llm=ChatOpenAI( base_url=llm_info.base_url, @@ -145,7 +145,7 @@ We provide two implmentations of the agent based on AgentScope and langchain: model=llm, system_prompt=system_prompt, ) - + # build messages and send to the agent msg=[ {"role": x["role"], "content": x["content"]} for x in messages @@ -153,7 +153,7 @@ We provide two implmentations of the agent based on AgentScope and langchain: result = agent.invoke({ "messages": msg, # type: ignore }) - + response = result["messages"][-1].content reward = await reward_fn_with_semaphore(msg, response, truth_action, truth_info) return WorkflowOutput(reward=reward) @@ -221,4 +221,4 @@ Agent: Has itching or reddening appeared around this bite site recently without The question becomes more precise and informative, guiding the user to provide clinically relevant details. -> To learn more about the task and results on larger models, refer to [Grounded in Reality: Learning and Deploying Proactive LLM from Offline Logs](https://arxiv.org/abs/2510.25441). \ No newline at end of file +> To learn more about the task and results on larger models, refer to [Grounded in Reality: Learning and Deploying Proactive LLM from Offline Logs](https://arxiv.org/abs/2510.25441). diff --git a/docs/en/hardware_related_solution.md b/docs/en/hardware_related_solution.md index c2cad4a3..9743d384 100644 --- a/docs/en/hardware_related_solution.md +++ b/docs/en/hardware_related_solution.md @@ -17,4 +17,4 @@ This document records a list of **Hardware Related** issues for future reference ```bash export NCCL_NVLS_ENABLE=0 - ``` \ No newline at end of file + ``` diff --git a/docs/en/support_agentscope.md b/docs/en/support_agentscope.md index b3129191..e551e4d9 100644 --- a/docs/en/support_agentscope.md +++ b/docs/en/support_agentscope.md @@ -223,4 +223,3 @@ This article introduce the way to convert different types of ways to convert you else: is_success = False return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) ``` - diff --git a/docs/en/support_http.md b/docs/en/support_http.md index 32474904..0bf3ab3d 100644 --- a/docs/en/support_http.md +++ b/docs/en/support_http.md @@ -93,5 +93,3 @@ in this AI era, you can always start from scratch and build your own "high-scrap ... ``` - - diff --git a/docs/en/support_langchain.md b/docs/en/support_langchain.md index 6e645dcc..d1e12890 100644 --- a/docs/en/support_langchain.md +++ b/docs/en/support_langchain.md @@ -84,5 +84,3 @@ This article introduce the way to convert different types of ways to convert you ... ``` - - diff --git a/docs/en/support_oaisdk.md b/docs/en/support_oaisdk.md index 5268ab42..b60b03e3 100644 --- a/docs/en/support_oaisdk.md +++ b/docs/en/support_oaisdk.md @@ -88,6 +88,3 @@ This article introduce the way to convert different types of ways to convert you ... ``` - - - diff --git a/docs/index.md b/docs/index.md index ba98cd7f..5583fa69 100644 --- a/docs/index.md +++ b/docs/index.md @@ -170,4 +170,3 @@ The internal system orchestrates several specialized modules to handle the compl --> - diff --git a/docs/javascripts/animations.js b/docs/javascripts/animations.js index 00e3603b..a5dc584a 100644 --- a/docs/javascripts/animations.js +++ b/docs/javascripts/animations.js @@ -399,4 +399,3 @@ }; })(); - diff --git a/docs/javascripts/code-zoom.js b/docs/javascripts/code-zoom.js index e2a08f6d..22d3d624 100644 --- a/docs/javascripts/code-zoom.js +++ b/docs/javascripts/code-zoom.js @@ -1,2 +1 @@ /* Code zoom - placeholder */ - diff --git a/docs/javascripts/responsive.js b/docs/javascripts/responsive.js index 663e371f..d57c4db2 100644 --- a/docs/javascripts/responsive.js +++ b/docs/javascripts/responsive.js @@ -353,4 +353,3 @@ }; })(); - diff --git a/docs/javascripts/search-fix.js b/docs/javascripts/search-fix.js index e8436240..444f2af9 100644 --- a/docs/javascripts/search-fix.js +++ b/docs/javascripts/search-fix.js @@ -1,2 +1 @@ /* Search fix - placeholder */ - diff --git a/docs/javascripts/tabbed-code.js b/docs/javascripts/tabbed-code.js index 880ba944..cfd19559 100644 --- a/docs/javascripts/tabbed-code.js +++ b/docs/javascripts/tabbed-code.js @@ -174,4 +174,3 @@ // Export for manual re-initialization if needed window.initTabbedSets = initTabbedSets; })(); - diff --git a/docs/requirements.txt b/docs/requirements.txt index 968bb898..db4f637c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -11,4 +11,3 @@ pymdown-extensions==10.16.1 # Syntax highlighting Pygments>=2.18.0 - diff --git a/docs/stylesheets/animations.css b/docs/stylesheets/animations.css index 2129b6d8..9d390ff7 100644 --- a/docs/stylesheets/animations.css +++ b/docs/stylesheets/animations.css @@ -875,4 +875,3 @@ img { .duration-fast { animation-duration: var(--rm-transition-fast); } .duration-normal { animation-duration: var(--rm-transition-normal); } .duration-slow { animation-duration: var(--rm-transition-slow); } - diff --git a/docs/stylesheets/feature-cards.css b/docs/stylesheets/feature-cards.css index 03fe0464..5865ca73 100644 --- a/docs/stylesheets/feature-cards.css +++ b/docs/stylesheets/feature-cards.css @@ -540,4 +540,3 @@ .dark { --inline-icon-filter: invert(1) hue-rotate(180deg); } - diff --git a/docs/stylesheets/flowchart.css b/docs/stylesheets/flowchart.css index 175dc123..345b94f1 100644 --- a/docs/stylesheets/flowchart.css +++ b/docs/stylesheets/flowchart.css @@ -400,4 +400,3 @@ font-size: 0.875rem; margin-bottom: 0.5rem; } - diff --git a/docs/stylesheets/jupyter-simple.css b/docs/stylesheets/jupyter-simple.css index 401abf67..864c59bd 100644 --- a/docs/stylesheets/jupyter-simple.css +++ b/docs/stylesheets/jupyter-simple.css @@ -256,4 +256,3 @@ article .cell.markdown ol:last-child { top: 0.75rem; } } - diff --git a/docs/stylesheets/syntax-highlight.css b/docs/stylesheets/syntax-highlight.css index 3c651185..7cfcf6ba 100644 --- a/docs/stylesheets/syntax-highlight.css +++ b/docs/stylesheets/syntax-highlight.css @@ -303,4 +303,3 @@ .dark .codehilite .language-json .nd { color: #79c0ff; } - diff --git a/docs/stylesheets/tuner_v2.md b/docs/stylesheets/tuner_v2.md index c8766e31..c19509cd 100644 --- a/docs/stylesheets/tuner_v2.md +++ b/docs/stylesheets/tuner_v2.md @@ -78,4 +78,4 @@ response = client.chat.completions.create( ) -``` \ No newline at end of file +``` diff --git a/install.sh b/install.sh index bf0400b6..2306bad0 100755 --- a/install.sh +++ b/install.sh @@ -203,7 +203,7 @@ download_binary_and_run_installer() { local _checksum_value # destructure selected archive info into locals - case "$_artifact_name" in + case "$_artifact_name" in "uv-aarch64-apple-darwin.tar.gz") _arch="aarch64-apple-darwin" _zip_ext=".tar.gz" @@ -529,7 +529,7 @@ replace_home() { json_binary_aliases() { local _arch="$1" - case "$_arch" in + case "$_arch" in "aarch64-apple-darwin") echo '{}' ;; @@ -612,7 +612,7 @@ aliases_for_binary() { local _bin="$1" local _arch="$2" - case "$_arch" in + case "$_arch" in "aarch64-apple-darwin") case "$_bin" in *) @@ -793,7 +793,7 @@ select_archive_for_arch() { # try each archive, checking runtime conditions like libc versions # accepting the first one that matches, as it's the best match - case "$_true_arch" in + case "$_true_arch" in "aarch64-apple-darwin") _archive="uv-aarch64-apple-darwin.tar.gz" if [ -n "$_archive" ]; then diff --git a/mkdocs.yml b/mkdocs.yml index ad8e51de..ac4bb4a3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -146,4 +146,3 @@ extra_javascript: - javascripts/nav-scroll-fix.js - javascripts/animations.js - javascripts/responsive.js - diff --git a/pyproject.toml b/pyproject.toml index aee28b2b..856cddca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,4 +113,4 @@ known_third_party = ["wandb"] [project.urls] -"Homepage" = "https://github.com/modelscope/AgentJet" \ No newline at end of file +"Homepage" = "https://github.com/modelscope/AgentJet" diff --git a/tutorial/README.md b/tutorial/README.md index e5811d8d..8e5288a9 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -8,4 +8,4 @@ Explore our rich library of examples to kickstart your journey. - Example Benchmark Tracking System: - https://benchmark.agent-matrix.com/examples \ No newline at end of file + https://benchmark.agent-matrix.com/examples diff --git a/tutorial/example_learn2ask/data_preprocess/llm_info_extraction.py b/tutorial/example_learn2ask/data_preprocess/llm_info_extraction.py index 75e76c87..070b1612 100644 --- a/tutorial/example_learn2ask/data_preprocess/llm_info_extraction.py +++ b/tutorial/example_learn2ask/data_preprocess/llm_info_extraction.py @@ -145,4 +145,4 @@ def parse_llm_output(output_str): return result except Exception as e: - return f"Error parsing output: [{repr(output_str)}] error = {str(e)}" \ No newline at end of file + return f"Error parsing output: [{repr(output_str)}] error = {str(e)}" diff --git a/tutorial/example_learn2ask/data_preprocess/message_splitter.py b/tutorial/example_learn2ask/data_preprocess/message_splitter.py index a82506a4..06362b05 100644 --- a/tutorial/example_learn2ask/data_preprocess/message_splitter.py +++ b/tutorial/example_learn2ask/data_preprocess/message_splitter.py @@ -97,4 +97,4 @@ def split_session_to_json_lines(session): json_lines = split_session_to_json_lines(example_session) print("JSON lines output:") for i, line in enumerate(json_lines): - print(f"Line {i + 1}: {line}") \ No newline at end of file + print(f"Line {i + 1}: {line}") diff --git a/tutorial/example_learn2ask/data_preprocess/step1.py b/tutorial/example_learn2ask/data_preprocess/step1.py index d2ba27c6..d4533ffa 100644 --- a/tutorial/example_learn2ask/data_preprocess/step1.py +++ b/tutorial/example_learn2ask/data_preprocess/step1.py @@ -28,14 +28,14 @@ def process_jsonl_file( str: Success message or error information """ progress_file = output_file + ".progress" - + def load_progress(): """Load progress from progress file. Returns set of completed line numbers.""" if os.path.exists(progress_file): with open(progress_file, "r", encoding="utf-8") as f: return set(int(line.strip()) for line in f if line.strip()) return set() - + def process_single_session(args): """Worker function to process a single session.""" line_num, line = args @@ -54,41 +54,41 @@ def process_single_session(args): return line_num, None, f"Warning: Skipping invalid JSON at line {line_num}: {e}" except Exception as e: return line_num, None, f"Warning: Error processing session at line {line_num}: {e}" - + try: # Load previous progress completed_lines = load_progress() if completed_lines: print(f"Resuming from previous progress. {len(completed_lines)} lines already completed.") - + # Read all lines first with open(input_file, "r", encoding="utf-8") as infile: all_lines = list(enumerate(infile, 1)) - + total_lines = len(all_lines) # Filter out already completed lines lines_to_process = [(num, line) for num, line in all_lines if num not in completed_lines] - + if not lines_to_process: print("All lines already processed.") # Clean up progress file if os.path.exists(progress_file): os.remove(progress_file) return f"All lines already processed. Results in {output_file}" - + print(f"Processing {len(lines_to_process)} remaining lines out of {total_lines} total.") - + # State for ordered writing results_buffer = {} # line_num -> processed_lines next_line_to_write = min(num for num, _ in lines_to_process) write_lock = threading.Lock() progress_lock = threading.Lock() - + # Open output file in append mode if resuming, otherwise write mode file_mode = "a" if completed_lines else "w" outfile = open(output_file, file_mode, encoding="utf-8") progress_out = open(progress_file, "a", encoding="utf-8") - + def flush_buffer(): """Write all consecutive completed results from buffer to file.""" nonlocal next_line_to_write @@ -106,28 +106,28 @@ def flush_buffer(): # Skip lines that were already completed or empty while next_line_to_write <= total_lines and next_line_to_write not in dict(lines_to_process): next_line_to_write += 1 - + try: # Process sessions in parallel using ThreadPoolExecutor with ThreadPoolExecutor(max_workers=max_workers) as executor: futures = {executor.submit(process_single_session, item): item[0] for item in lines_to_process} - + for future in as_completed(futures): line_num, processed_lines, error = future.result() if error: print(error) - + with write_lock: results_buffer[line_num] = processed_lines flush_buffer() finally: outfile.close() progress_out.close() - + # Clean up progress file on successful completion if os.path.exists(progress_file): os.remove(progress_file) - + return f"Successfully processed. Results saved to {output_file}" except Exception as e: @@ -177,7 +177,7 @@ def process_session(session, model_call_mode="online_api", max_retries=3, **kwar print(f"Attempt {attempt + 1} failed with exception: {str(e)}") if attempt < max_retries - 1: time.sleep(24) # Shorter wait for testing - + if info_set is None: raise Exception(f"failed to generate {session}") data["info_set"] = info_set @@ -206,4 +206,4 @@ def process_session(session, model_call_mode="online_api", max_retries=3, **kwar model_call_mode=args.model_call_mode, # Additional parameters for API calls ) - ) \ No newline at end of file + ) diff --git a/tutorial/example_learn2ask/data_preprocess/step2.py b/tutorial/example_learn2ask/data_preprocess/step2.py index 849aa510..9d546b0c 100644 --- a/tutorial/example_learn2ask/data_preprocess/step2.py +++ b/tutorial/example_learn2ask/data_preprocess/step2.py @@ -26,7 +26,7 @@ def main(input_file_path, output_file_path): if_keep, info_set, decision = process_message(data) if not if_keep: continue - + new_item = { 'main_query':'[no query]', 'init_messages': data['messages'], @@ -56,4 +56,4 @@ def main(input_file_path, output_file_path): args = parser.parse_args() - main(args.input_file, args.output_file) \ No newline at end of file + main(args.input_file, args.output_file) diff --git a/tutorial/example_learn2ask/learn2ask.md b/tutorial/example_learn2ask/learn2ask.md index d5afd08f..811d37f9 100644 --- a/tutorial/example_learn2ask/learn2ask.md +++ b/tutorial/example_learn2ask/learn2ask.md @@ -99,4 +99,4 @@ The agent's question is more precise and informative, providing two specific and ## Next -To learn more about the task and results on larger models, refer to [Grounded in Reality: Learning and Deploying Proactive LLM from Offline Logs](https://arxiv.org/abs/2510.25441). \ No newline at end of file +To learn more about the task and results on larger models, refer to [Grounded in Reality: Learning and Deploying Proactive LLM from Offline Logs](https://arxiv.org/abs/2510.25441). diff --git a/tutorial/example_learn2ask/learn2ask_langchain.py b/tutorial/example_learn2ask/learn2ask_langchain.py index d728ac64..568717d8 100644 --- a/tutorial/example_learn2ask/learn2ask_langchain.py +++ b/tutorial/example_learn2ask/learn2ask_langchain.py @@ -174,26 +174,26 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl assert isinstance(messages, list) truth_action = workflow_task.task.metadata["decision_truth"] or "continue" truth_info = workflow_task.task.metadata["info_truth"] - + llm_info=tuner.as_oai_baseurl_apikey() - + llm=ChatOpenAI( base_url=llm_info.base_url, api_key=lambda:llm_info.api_key, ) - + agent=create_agent( model=llm, system_prompt=system_prompt, ) - + msg=[ {"role": x["role"], "content": x["content"]} for x in messages ] result = agent.invoke({ "messages": msg, # type: ignore }) - + response = result["messages"][-1].content reward = await reward_fn_with_semaphore(msg, response, truth_action, truth_info) return WorkflowOutput(reward=reward) diff --git a/tutorial/example_math_agent/math_agent_langchain.py b/tutorial/example_math_agent/math_agent_langchain.py index c47fc355..6ba1bc0a 100644 --- a/tutorial/example_math_agent/math_agent_langchain.py +++ b/tutorial/example_math_agent/math_agent_langchain.py @@ -30,7 +30,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl url_and_apikey = tuner.as_oai_baseurl_apikey() base_url = url_and_apikey.base_url api_key = url_and_apikey.api_key - + from langchain_openai import ChatOpenAI llm=ChatOpenAI( base_url=base_url, @@ -40,10 +40,10 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl model=llm, system_prompt=self.system_prompt, ) - + # take out query query = workflow_task.task.main_query - + response = agent.invoke({ "messages": [ { @@ -52,6 +52,6 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl } ], }) - + final_answer = response['messages'][-1].content - return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) \ No newline at end of file + return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) diff --git a/tutorial/example_math_agent/math_agent_raw_http.py b/tutorial/example_math_agent/math_agent_raw_http.py index 6608e2be..216fbd71 100644 --- a/tutorial/example_math_agent/math_agent_raw_http.py +++ b/tutorial/example_math_agent/math_agent_raw_http.py @@ -57,8 +57,3 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl ) final_answer = response.json()['choices'][0]['message']['content'] return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) - - - - - From 0dfbc5851fed2e20c29820951ee1cf5091730aca Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 17:29:11 +0800 Subject: [PATCH 461/462] update doc: platform compare --- docs/en/platform_comparison.md | 32 ++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 33 insertions(+) create mode 100644 docs/en/platform_comparison.md diff --git a/docs/en/platform_comparison.md b/docs/en/platform_comparison.md new file mode 100644 index 00000000..58a12f04 --- /dev/null +++ b/docs/en/platform_comparison.md @@ -0,0 +1,32 @@ + +# Compare AgentJet with Other Platforms with Agentic RL + + +- Multi OSS Training Backbone: Support switching between multiple open-source training backbones quickly. +- Multi OSS Infer Backbone: Support both vLLM and SGLang. +- Low Code Change: Do not require too many edits to convert a user‑defined (multi) agent workflow into trainable workflows. +- Without-GPU (Cloud-Computing): Rollout and power RL training in a laptop without GPU, using Tinker (AgentLightning) or without Tinker (AgentJet-TinkerScript, comming soon) +- Timeline Optimization: Automatically merge shared-history context generated by the same agents to promote training speed. +- Open Bench Platform: Trace baseline environment's performance across git history in different training backbones. +- Multi-Agent Optimization: Deal with sophisticated multi-agent interaction efficiently, automatically clustering and merging samples generated by the same agents. +- High-res Rollout Logging: Integrated with token level rollout trajectory, highlighting token logprob and loss mask for deep‑level research. +- Agentic Framework Compatible: Easy to convert AgentScope and Langchain workflows into trainable workflows. + + +| Feature | AgentJet | AgentJet-TinkerScript | AgentLightning | rLLM | VeRL 0.7.0 | +|--------- |----------|----------------------|---------------- |------|------------ | +| Multi OSS Training Backbone | ✅ | ❌ | ❌ | ❌ | ➖ | +| Multi OSS Infer Backbone | ✅ | ✅ | ✅ | ✅ | ✅ | +| Low Code Change | ✅ | ✅ | ✅ | ✅ | ➖ | +| Without-GPU (Cloud-Computing) | ❌ | ✅ | ✅ | ❌ | ➖ | +| Timeline Optimization | ✅ | ✅ | ❌ | ❌ | ➖ | +| Open Bench Platform | ✅ | ✅ | ❌ | ❌ | ✅ | +| Multiagent Optimization | ✅ | ✅ | ❌ | ❌ | ✅ | +| High-res Rollout Logging | ✅ | ✅ | ❌ | ❌ | ❌ | +| AgentScope Compatible | ✅ | ✅ | ✅ | ✅ | ➖ | +| Langchain Compatible | ✅ | ✅ | ✅ | ✅ | ➖ | + + +!!! Note "" + - ✅ = "supported"; ❌ = "not supported"; ➖ = "not applicable" or "not investigated" + - All projects are quickly evolving. We expect features not supported today will catch up sooner or later. diff --git a/mkdocs.yml b/mkdocs.yml index ac4bb4a3..a6fa0585 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -56,6 +56,7 @@ nav: - Beast Logger: en/beast_logger.md - Data Generation: en/data_generation.md - Tracing Feedback: en/example_tracing_feedback_loop.md + - Platform Comparison: en/platform_comparison.md # - 中文文档: # - 简介: zh/intro.md From 576bc48e0c353f5589650ae3576298b67bb81ff9 Mon Sep 17 00:00:00 2001 From: "qingxu.fu" Date: Fri, 16 Jan 2026 17:30:05 +0800 Subject: [PATCH 462/462] stage --- .pre-commit-config.yaml | 12 +- ajet/__init__.py | 9 +- ajet/backbone/main_trinity.py | 1 + ajet/backbone/main_verl.py | 15 +- ajet/backbone/main_vllm.py | 24 +-- ajet/backbone/trainer_trinity.py | 49 ++--- ajet/backbone/trainer_verl.py | 199 +++++------------- ajet/backbone/warm_up.py | 3 +- ajet/context_tracker/base_tracker.py | 33 +-- ajet/context_tracker/basic_tracker.py | 68 ++---- ajet/context_tracker/multiagent_tracking.py | 131 +++--------- .../timeline_merging/timeline_merging.py | 12 +- ajet/copilot/job.py | 18 +- ajet/data_generator/base_data_generator.py | 4 +- ajet/data_generator/config.py | 24 +-- ajet/data_generator/knowledge_augmentation.py | 33 +-- ajet/data_generator/task_augmentation.py | 51 +---- ajet/default_config/ajet_default.py | 4 +- ajet/launcher.py | 41 +--- ajet/schema/convertion.py | 5 +- ajet/schema/extended_msg.py | 34 +-- ajet/schema/trajectory.py | 49 +---- ajet/task_judge/rm_auto_grader_judge.py | 60 ++---- ajet/task_reader/data_generator_reader.py | 57 ++--- .../task_reader/document_reader/doc_reader.py | 8 +- ajet/task_reader/env_service_reader.py | 4 +- ajet/task_reader/hf_dataset_reader.py | 4 +- ajet/task_reader/tracing_reader/__init__.py | 19 +- ajet/task_reader/tracing_reader/connector.py | 12 +- .../filters/llm_evaluate_filter.py | 12 +- ajet/task_reader/tracing_reader/llm_client.py | 48 ++--- ajet/task_rollout/async_llm_bridge.py | 64 ++---- ajet/task_rollout/dashscope_llm_bridge.py | 9 +- ajet/task_rollout/native_parallel_worker.py | 169 ++++----------- ajet/task_rollout/resource_keeper.py | 18 +- ajet/task_rollout/single_worker.py | 20 +- ajet/task_runner/base_runner.py | 16 +- ajet/task_runner/general_runner.py | 7 +- ajet/tuner.py | 26 +-- ajet/tuner_lib/weight_tuner/__init__.py | 1 - .../weight_tuner/as_agentscope_model.py | 12 +- .../weight_tuner/as_oai_baseurl_apikey.py | 14 +- .../weight_tuner/as_oai_sdk_model.py | 39 ++-- .../experimental/as_oai_model_client.py | 78 +++---- .../experimental/as_oai_model_server.py | 62 +++--- ajet/utils/async_utils.py | 1 + ajet/utils/cleaner.py | 10 +- ajet/utils/compute_madness.py | 29 +-- ajet/utils/config_computer.py | 4 +- ajet/utils/config_utils.py | 33 +-- ajet/utils/embedding_client.py | 40 +--- .../utils/env_service_client/env_client_ng.py | 20 +- ajet/utils/launch_utils.py | 33 +-- ajet/utils/lowlevel_hook.py | 8 +- ajet/utils/magic_mock.py | 9 +- ajet/utils/metric_helper/__init__.py | 3 +- .../metric_helper/reward_metric_helper.py | 60 +++--- .../metric_helper/save_trajectory_as_json.py | 20 +- .../utils/metric_helper/tool_metric_helper.py | 68 +++--- ajet/utils/msg_converter.py | 28 +-- ajet/utils/networking.py | 11 +- ajet/utils/process_dataset.py | 10 +- ajet/utils/pty.py | 6 +- ajet/utils/retry.py | 8 +- ajet/utils/robust_dashscope.py | 10 +- ajet/utils/sample.py | 4 +- ajet/utils/sington.py | 1 - ajet/utils/smart_daemon.py | 36 +--- ajet/utils/testing_utils.py | 20 +- ajet/utils/thread_executors.py | 2 - ajet/utils/vsdb.py | 58 ++--- docs/index.md | 5 +- scripts/converter_hf_to_mcore.py | 40 +--- scripts/deploy_model.py | 4 +- scripts/diagnose.py | 14 +- scripts/display_dataset.py | 1 + scripts/test_dashscope_api.py | 7 +- .../execute_benchmark_appworld.py | 5 +- .../execute_benchmark_countdown.py | 3 - .../execute_benchmark_frozenlake.py | 1 - .../benchmark_learn2ask.py | 1 + .../execute_benchmark_learn2ask.py | 1 - .../benchmark_math/execute_benchmark_math.py | 1 - tests/config_test.py | 24 +-- tests/test_dynamic_import.py | 4 +- tests/test_networking.py | 22 +- tests/test_tracing_reader.py | 4 +- tutorial/example_appworld/appworld.py | 5 +- tutorial/example_appworld/appworld_oai_sdk.py | 6 +- tutorial/example_countdown/countdown.py | 6 +- tutorial/example_countdown/prepare_data.py | 8 +- tutorial/example_feedback_tracing/train.py | 10 +- tutorial/example_frozenlake/frozenlake.py | 32 +-- .../data_preprocess/llm_info_extraction.py | 4 +- .../data_preprocess/step1.py | 24 +-- .../data_preprocess/step2.py | 20 +- tutorial/example_learn2ask/learn2ask.py | 3 +- .../example_learn2ask/learn2ask_langchain.py | 23 +- tutorial/example_math_agent/math_agent.py | 6 +- .../math_agent_langchain.py | 31 ++- .../example_math_agent/math_agent_oai_sdk.py | 85 ++------ .../example_math_agent/math_agent_raw_http.py | 36 ++-- .../example_math_agent/math_agent_simplify.py | 6 +- .../math_agentscope_urlkey.py | 22 +- .../math_answer_as_judge.py | 8 +- .../auto_grader_example.py | 4 +- tutorial/example_rubrics_judge/math_agent.py | 10 +- tutorial/example_werewolves/game.py | 4 +- tutorial/example_werewolves/prompt.py | 116 ++-------- tutorial/example_werewolves/start.py | 24 +-- .../example_werewolves/structured_model.py | 6 +- tutorial/example_werewolves/utils.py | 8 +- 112 files changed, 792 insertions(+), 1962 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0008bd94..33bde514 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,12 +11,12 @@ repos: - id: check-merge-conflict - id: detect-private-key - # - repo: https://github.com/psf/black - # rev: 23.7.0 - # hooks: - # - id: black - # language_version: python3.10 - # args: [--line-length=100] + - repo: https://github.com/psf/black + rev: 23.7.0 + hooks: + - id: black + language_version: python3.10 + args: [--line-length=999999] # - repo: https://github.com/pycqa/isort # rev: 5.12.0 diff --git a/ajet/__init__.py b/ajet/__init__.py index b0731e74..12a07cc1 100644 --- a/ajet/__init__.py +++ b/ajet/__init__.py @@ -4,13 +4,6 @@ from ajet.workflow import Workflow from ajet.utils.vsdb import vscode_conditional_breakpoint as bp -__all__ = [ - "Workflow", - "WorkflowTask", - "WorkflowOutput", - "AjetTuner", - "AgentJetJob", - "bp" -] +__all__ = ["Workflow", "WorkflowTask", "WorkflowOutput", "AjetTuner", "AgentJetJob", "bp"] __version__ = "0.1.0" diff --git a/ajet/backbone/main_trinity.py b/ajet/backbone/main_trinity.py index cf1e353b..06dd844f 100644 --- a/ajet/backbone/main_trinity.py +++ b/ajet/backbone/main_trinity.py @@ -54,6 +54,7 @@ def patched_trainer_get_actor(cls, config: Config): if ajet_config.ajet.enable_experimental_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server + start_interchange_server(ajet_config) diff --git a/ajet/backbone/main_verl.py b/ajet/backbone/main_verl.py index dcd575f4..8b2fc57a 100644 --- a/ajet/backbone/main_verl.py +++ b/ajet/backbone/main_verl.py @@ -66,16 +66,10 @@ def run_ppo(config) -> None: # Create a remote instance of the TaskRunner class, and # Execute the `run` method of the TaskRunner instance remotely and wait for it to complete - if ( - is_cuda_available - and config.trainer.get("profile_steps") is not None - and len(config.trainer.get("profile_steps", [])) > 0 - ): + if is_cuda_available and config.trainer.get("profile_steps") is not None and len(config.trainer.get("profile_steps", [])) > 0: from verl.utils.import_utils import is_nvtx_available - assert ( - is_nvtx_available() - ), "nvtx is not available in CUDA platform. Please 'pip3 install nvtx'" + assert is_nvtx_available(), "nvtx is not available in CUDA platform. Please 'pip3 install nvtx'" nsight_options = OmegaConf.to_container(config.trainer.controller_nsight_options) runner = TaskRunner.options(runtime_env={"nsight": nsight_options}).remote() else: @@ -223,9 +217,7 @@ def run(self, config): num_examine=1, **config.reward_model.get("reward_kwargs", {}), ) - resource_pool_manager = ResourcePoolManager( - resource_pool_spec=resource_pool_spec, mapping=mapping - ) + resource_pool_manager = ResourcePoolManager(resource_pool_spec=resource_pool_spec, mapping=mapping) from verl.utils.dataset.rl_dataset import collate_fn @@ -248,6 +240,7 @@ def run(self, config): if config.ajet.enable_experimental_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server + start_interchange_server(config) # Initialize the PPO trainer. diff --git a/ajet/backbone/main_vllm.py b/ajet/backbone/main_vllm.py index 3f0a724c..b7ea7cf9 100644 --- a/ajet/backbone/main_vllm.py +++ b/ajet/backbone/main_vllm.py @@ -82,9 +82,7 @@ def submit_chat_completions(self, messages, sampling_params, request_id, tools=[ "request_id": completion.id, "content": message["content"], "tool_calls": message.get("tool_calls", None), - "tokens": [ - TokenAndProbVllmDebug(t) for t in completion.choices[0].logprobs.content # type: ignore - ], + "tokens": [TokenAndProbVllmDebug(t) for t in completion.choices[0].logprobs.content], # type: ignore } ) return messages @@ -130,13 +128,12 @@ async def submit_chat_completions_async(self, messages, sampling_params, request "request_id": completion.id, "content": message["content"], "tool_calls": message.get("tool_calls", None), - "tokens": [ - TokenAndProbVllmDebug(t) for t in completion.choices[0].logprobs.content # type: ignore - ], + "tokens": [TokenAndProbVllmDebug(t) for t in completion.choices[0].logprobs.content], # type: ignore } ) return messages + def run(config): from ajet.task_reader import RouterTaskReader @@ -147,9 +144,7 @@ def run(config): vllm_port = config.ajet.debug.debug_vllm_port # --------- init --------- - async_rollout_manager = ChatCompletionScheduler( - config=config, url=f"http://localhost:{vllm_port}/v1" - ) + async_rollout_manager = ChatCompletionScheduler(config=config, url=f"http://localhost:{vllm_port}/v1") parallel_env = VerlRolloutManager( config=config, async_rollout_manager=async_rollout_manager, @@ -159,16 +154,13 @@ def run(config): tokenizer=async_rollout_manager.tokenizer, ) - task_reader = RouterTaskReader( config.ajet.task_reader.type, config.ajet.task_reader, ) tasks = task_reader.get_validation_tasks() logger.info(tasks[:n_task]) - ctx_tracker = parallel_env.rollout( - tasks=tasks[:n_task], mode="sample", epoch="1" - ) # "sample" or "validate" + ctx_tracker = parallel_env.rollout(tasks=tasks[:n_task], mode="sample", epoch="1") # "sample" or "validate" _ = parallel_env.to_dataproto(ctx_tracker) @@ -179,6 +171,7 @@ def run(config): ) def main(config): from omegaconf import OmegaConf + OmegaConf.resolve(config) runtime_env = get_runtime_env(config) os.environ.update(runtime_env["env_vars"]) @@ -186,6 +179,7 @@ def main(config): if config.ajet.enable_experimental_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_server import start_interchange_server + start_interchange_server(config) def companion_launch(): @@ -198,9 +192,7 @@ def companion_launch(): tensor_parallel_size = config.ajet.debug.debug_tensor_parallel_size n_avail_gpus = torch.cuda.device_count() if tensor_parallel_size > n_avail_gpus: - logger.info( - f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." - ) + logger.info(f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}.") tensor_parallel_size = n_avail_gpus gpu_memory_utilization = config.actor_rollout_ref.rollout.gpu_memory_utilization max_num_seqs = config.actor_rollout_ref.rollout.max_num_seqs diff --git a/ajet/backbone/trainer_trinity.py b/ajet/backbone/trainer_trinity.py index 1a75a1bc..fdbc6d9c 100644 --- a/ajet/backbone/trainer_trinity.py +++ b/ajet/backbone/trainer_trinity.py @@ -66,6 +66,7 @@ def __init__( def convert_task(self, task: TrinityTask): from ajet.schema.task import Task + assert isinstance(task.raw_task, dict) return dict_to_ajet_task(task.raw_task) @@ -150,16 +151,10 @@ async def run_async(self): "madness": tracker.reward_structure.madness, } - if ( - len(response_ids) + len(prompt_ids) == len(input_ids) - and len(logprobs) == len(response_ids) - and len(logprobs) > 0 - ): + if len(response_ids) + len(prompt_ids) == len(input_ids) and len(logprobs) == len(response_ids) and len(logprobs) > 0: exp = Experience( tokens=input_ids, # [seq_length] prompt + response - prompt_length=len( - prompt_ids - ), # Length of the prompt in tokens, used for generating attention masks + prompt_length=len(prompt_ids), # Length of the prompt in tokens, used for generating attention masks logprobs=logprobs, # [resp_length] reward=reward, # # advantages=None, @@ -211,19 +206,11 @@ def __init__(self, config): if "train" in self.split: dataset_segments.append(task_to_standard_dataset(task_reader.get_training_tasks())) if "val" in self.split: - dataset_segments.append( - task_to_standard_dataset(task_reader.get_validation_tasks()) - ) + dataset_segments.append(task_to_standard_dataset(task_reader.get_validation_tasks())) if not dataset_segments: - raise ValueError( - f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'." - ) + raise ValueError(f"Unsupported split '{self.split}'. Expected to contain 'train' or 'val'.") - concatenated_dataset = ( - dataset_segments[0] - if len(dataset_segments) == 1 - else datasets.concatenate_datasets(dataset_segments) - ) + concatenated_dataset = dataset_segments[0] if len(dataset_segments) == 1 else datasets.concatenate_datasets(dataset_segments) self.dataset = _HFBatchReader( concatenated_dataset, @@ -271,15 +258,9 @@ class SwanlabMonitor(Monitor): """ def __init__(self, project: str, group: str, name: str, role: str, config) -> None: - assert ( - swanlab is not None - ), "swanlab is not installed. Please install it to use SwanlabMonitor." - - monitor_args = ( - (config.monitor.monitor_args or {}) - if config and getattr(config, "monitor", None) - else {} - ) + assert swanlab is not None, "swanlab is not installed. Please install it to use SwanlabMonitor." + + monitor_args = (config.monitor.monitor_args or {}) if config and getattr(config, "monitor", None) else {} # Optional API login via code if provided; otherwise try environment, then rely on prior `swanlab login`. api_key = os.environ.get("SWANLAB_API_KEY") @@ -331,9 +312,7 @@ def __init__(self, project: str, group: str, name: str, role: str, config) -> No self.data_dashboard_url = run_info["cloud"]["experiment_url"] def log_table(self, table_name: str, experiences_table, step: int): - assert ( - swanlab is not None - ), "swanlab is not installed. Please install it to use SwanlabMonitor." + assert swanlab is not None, "swanlab is not installed. Please install it to use SwanlabMonitor." # Convert pandas DataFrame to SwanLab ECharts Table headers: List[str] = list(experiences_table.columns) @@ -351,9 +330,7 @@ def log_table(self, table_name: str, experiences_table, step: int): def log(self, data: dict, step: int, commit: bool = False) -> None: """Log metrics.""" # SwanLab doesn't use commit flag; keep signature for compatibility - assert ( - swanlab is not None - ), "swanlab is not installed. Please install it to use SwanlabMonitor." + assert swanlab is not None, "swanlab is not installed. Please install it to use SwanlabMonitor." swanlab.log(data, step=step) self.console_logger.info(f"Step {step}: {data}") @@ -372,9 +349,7 @@ def log(self, data: dict, step: int, commit: bool = False) -> None: test_robot_data = {} test_robot_data["step"] = step test_robot_data["data_dashboard_url"] = self.data_dashboard_url - test_robot_data["reward_for_test_robot"] = data[ - "experience_pipeline/group_advantages/reward_mean/mean" - ] + test_robot_data["reward_for_test_robot"] = data["experience_pipeline/group_advantages/reward_mean/mean"] _test_if_test_mode(key="reward_probe", value=test_robot_data, config=ajet_config) def close(self) -> None: diff --git a/ajet/backbone/trainer_verl.py b/ajet/backbone/trainer_verl.py index 5b9d0853..7c23f58d 100644 --- a/ajet/backbone/trainer_verl.py +++ b/ajet/backbone/trainer_verl.py @@ -56,6 +56,7 @@ from ajet.task_rollout.native_parallel_worker import VerlRolloutManager from ajet.utils.metric_helper import save_trajectory_as_json_file, update_metrics + def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | torch.Tensor: """ Compute reward for a batch of data. @@ -83,9 +84,7 @@ def parse_reward_from_dataproto(data: DataProto, return_dict=False) -> dict | to # Get reward scores reward_scores_list = [item for item in data.non_tensor_batch["reward_scores"]] - reward_scores = torch.tensor( - reward_scores_list, device=reward_tensor.device, dtype=torch.float32 - ) # (bs, ) + reward_scores = torch.tensor(reward_scores_list, device=reward_tensor.device, dtype=torch.float32) # (bs, ) # Use advanced indexing to assign rewards (placing reward at the last token position) reward_tensor[torch.arange(len(data)), response_lengths - 1] = reward_scores @@ -211,13 +210,8 @@ def _validate_config(self): minimal_bsz = n_gpus # 1. Check total batch size for data correctness - real_train_batch_size = ( - config.ajet.data.train_batch_size * config.ajet.rollout.num_repeat - ) - assert real_train_batch_size % minimal_bsz == 0, ( - f"real_train_batch_size ({real_train_batch_size}) must be divisible by minimal possible batch size " - f"({minimal_bsz})" - ) + real_train_batch_size = config.ajet.data.train_batch_size * config.ajet.rollout.num_repeat + assert real_train_batch_size % minimal_bsz == 0, f"real_train_batch_size ({real_train_batch_size}) must be divisible by minimal possible batch size " f"({minimal_bsz})" # A helper function to check "micro_batch_size" vs "micro_batch_size_per_gpu" # We throw an error if the user sets both. The new convention is "..._micro_batch_size_per_gpu". @@ -246,15 +240,10 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): param_per_gpu = f"{param}_per_gpu" if mbs is None and mbs_per_gpu is None: - raise ValueError( - f"[{name}] Please set at least one of '{name}.{param}' or '{name}.{param_per_gpu}'." - ) + raise ValueError(f"[{name}] Please set at least one of '{name}.{param}' or '{name}.{param_per_gpu}'.") if mbs is not None and mbs_per_gpu is not None: - raise ValueError( - f"[{name}] You have set both '{name}.{param}' AND '{name}.{param_per_gpu}'. Please remove " - f"'{name}.{param}' because only '*_{param_per_gpu}' is supported (the former is deprecated)." - ) + raise ValueError(f"[{name}] You have set both '{name}.{param}' AND '{name}.{param_per_gpu}'. Please remove " f"'{name}.{param}' because only '*_{param_per_gpu}' is supported (the former is deprecated).") # Actor validation done in ActorConfig.__post_init__ and validate() try: @@ -265,9 +254,7 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): config.actor_rollout_ref.model, ) except hydra.errors.InstantiationException: - raise ValueError( - "You are using an unsupported VERL version. Please read `documents/backbones.md`" - ) + raise ValueError("You are using an unsupported VERL version. Please read `documents/backbones.md`") if not config.actor_rollout_ref.actor.use_dynamic_bsz: if self.use_reference_policy: # reference: log_prob_micro_batch_size vs. log_prob_micro_batch_size_per_gpu @@ -301,17 +288,11 @@ def check_mutually_exclusive(mbs, mbs_per_gpu, name: str): critic_config.validate(n_gpus, config.ajet.data.train_batch_size) if config.data.get("val_batch_size", None) is not None: - logger.warning( - "WARNING: val_batch_size is deprecated." - + " Validation datasets are sent to inference engines as a whole batch," - + " which will schedule the memory themselves." - ) + logger.warning("WARNING: val_batch_size is deprecated." + " Validation datasets are sent to inference engines as a whole batch," + " which will schedule the memory themselves.") # check eval config if config.ajet.rollout.val_kwargs.do_sample: - assert ( - config.ajet.rollout.temperature > 0 - ), "validation gen temperature should be greater than 0 when enabling do_sample" + assert config.ajet.rollout.temperature > 0, "validation gen temperature should be greater than 0 when enabling do_sample" logger.success("[validate_config] All configuration checks passed successfully!") @@ -324,9 +305,7 @@ def init_workers(self): """ self.resource_pool_manager.create_resource_pool() - self.resource_pool_to_cls = { - pool: {} for pool in self.resource_pool_manager.resource_pool_dict.values() - } + self.resource_pool_to_cls = {pool: {} for pool in self.resource_pool_manager.resource_pool_dict.values()} # create actor and rollout if self.hybrid_engine: @@ -345,9 +324,7 @@ def init_workers(self): if self.use_critic: resource_pool = self.resource_pool_manager.get_resource_pool(Role.Critic) critic_cfg = omega_conf_to_dataclass(self.config.critic) - critic_cls = RayClassWithInitArgs( - cls=self.role_worker_mapping[Role.Critic], config=critic_cfg - ) + critic_cls = RayClassWithInitArgs(cls=self.role_worker_mapping[Role.Critic], config=critic_cfg) self.resource_pool_to_cls[resource_pool]["critic"] = critic_cls # create reference policy if needed @@ -379,17 +356,11 @@ def init_workers(self): all_wg = {} wg_kwargs = {} # Setting up kwargs for RayWorkerGroup if OmegaConf.select(self.config.trainer, "ray_wait_register_center_timeout") is not None: - wg_kwargs[ - "ray_wait_register_center_timeout" - ] = self.config.trainer.ray_wait_register_center_timeout + wg_kwargs["ray_wait_register_center_timeout"] = self.config.trainer.ray_wait_register_center_timeout if OmegaConf.select(self.config.trainer, "profile_steps") is not None: wg_kwargs["profile_steps"] = OmegaConf.select(self.config.trainer, "profile_steps") - assert ( - OmegaConf.select(self.config.trainer, "worker_nsight_options") is not None - ), "worker_nsight_options must be set when profile_steps is set" - wg_kwargs["worker_nsight_options"] = OmegaConf.to_container( - OmegaConf.select(self.config.trainer, "worker_nsight_options") - ) + assert OmegaConf.select(self.config.trainer, "worker_nsight_options") is not None, "worker_nsight_options must be set when profile_steps is set" + wg_kwargs["worker_nsight_options"] = OmegaConf.to_container(OmegaConf.select(self.config.trainer, "worker_nsight_options")) wg_kwargs["device_name"] = self.device_name for resource_pool, class_dict in self.resource_pool_to_cls.items(): @@ -495,11 +466,7 @@ def fit(self): # noqa: C901 self.max_steps_duration = 0 prev_step_profile = False - curr_step_profile = ( - self.global_steps in self.config.trainer.profile_steps - if self.config.trainer.profile_steps is not None - else False - ) + curr_step_profile = self.global_steps in self.config.trainer.profile_steps if self.config.trainer.profile_steps is not None else False next_step_profile = False for epoch in range(self.config.trainer.total_epochs): @@ -508,11 +475,7 @@ def fit(self): # noqa: C901 timing_raw = {} with marked_timer("start_profile", timing_raw): - self._start_profiling( - not prev_step_profile and curr_step_profile - if self.config.trainer.profile_continuous_steps - else curr_step_profile - ) + self._start_profiling(not prev_step_profile and curr_step_profile if self.config.trainer.profile_continuous_steps else curr_step_profile) batch_dict["index"] = torch.tensor( [i for i in range(len(batch_dict["task_id"]))], @@ -554,39 +517,28 @@ def fit(self): # noqa: C901 self.async_rollout_manager.wake_up() logger.info("=== wake up end ===") tasks: List[Task] = [ - dict_to_ajet_task(dict( - task_id=gen_batch.non_tensor_batch["task_id"][i], - main_query=gen_batch.non_tensor_batch["main_query"][i], - env_type=gen_batch.non_tensor_batch["env_type"][i], - metadata=gen_batch.non_tensor_batch["metadata"][i], - init_messages=gen_batch.non_tensor_batch["init_messages"][i], - )) + dict_to_ajet_task( + dict( + task_id=gen_batch.non_tensor_batch["task_id"][i], + main_query=gen_batch.non_tensor_batch["main_query"][i], + env_type=gen_batch.non_tensor_batch["env_type"][i], + metadata=gen_batch.non_tensor_batch["metadata"][i], + init_messages=gen_batch.non_tensor_batch["init_messages"][i], + ) + ) for i in range(len(gen_batch)) ] - logger.info( - str( - [ - gen_batch.non_tensor_batch["task_id"][i] - for i in range(len(gen_batch)) - ] - ) - ) + logger.info(str([gen_batch.non_tensor_batch["task_id"][i] for i in range(len(gen_batch))])) logger.info("=" * 10 + "start fit rollout" + "=" * 10) self.parallel_env.current_global_steps = self.global_steps - context_tracker_arr: List[BaseContextTracker] = self.parallel_env.rollout( - tasks, mode="sample", epoch=f"train.{epoch}" - ) + context_tracker_arr: List[BaseContextTracker] = self.parallel_env.rollout(tasks, mode="sample", epoch=f"train.{epoch}") logger.info("=" * 10 + "end fit rollout" + "=" * 10) logger.info("begin to convert context_tracker_arr to dataproto") gen_batch_output = self.parallel_env.to_dataproto(context_tracker_arr) logger.info("end convertion") - success_rate = [ - traj.reward_structure.success_rate for traj in context_tracker_arr - ] - madness_rate = [ - traj.reward_structure.madness for traj in context_tracker_arr - ] + success_rate = [traj.reward_structure.success_rate for traj in context_tracker_arr] + madness_rate = [traj.reward_structure.madness for traj in context_tracker_arr] # reward = [traj.reward_structure.raw_reward for traj in context_tracker_arr] round_cnt = [traj.round_cnt for traj in context_tracker_arr] metrics.update( @@ -594,12 +546,8 @@ def fit(self): # noqa: C901 "critic/round_cnt": np.mean(round_cnt), "critic/madness_rate": np.mean(madness_rate), "critic/success_rate": np.mean(success_rate), - "critic/real_success_rate": np.mean( - context_tracker_arr[0].current_batch_success_rate - ), - "critic/real_reward": np.mean( - context_tracker_arr[0].current_batch_reward - ), + "critic/real_success_rate": np.mean(context_tracker_arr[0].current_batch_success_rate), + "critic/real_reward": np.mean(context_tracker_arr[0].current_batch_reward), } ) save_trajectory_as_json_file(context_tracker_arr, self.global_steps, self.config, prefix="train") @@ -619,9 +567,7 @@ def fit(self): # noqa: C901 } _test_if_test_mode(key="reward_probe", value=data, config=self.config) - logger.info( - f"gen_batch_output.info batch.keys={gen_batch_output.batch.keys()}" - ) + logger.info(f"gen_batch_output.info batch.keys={gen_batch_output.batch.keys()}") self.async_rollout_manager.sleep() logger.info("=== - rollout step end ===") @@ -646,9 +592,7 @@ def fit(self): # noqa: C901 self._balance_batch(batch, metrics=metrics) # compute global_valid tokens - batch.meta_info["global_token_num"] = torch.sum( - batch.batch["attention_mask"], dim=-1 - ).tolist() + batch.meta_info["global_token_num"] = torch.sum(batch.batch["attention_mask"], dim=-1).tolist() with marked_timer("reward", timing_raw, color="yellow"): # compute reward model score @@ -657,13 +601,9 @@ def fit(self): # noqa: C901 batch = batch.union(reward_tensor) if self.config.reward_model.launch_reward_fn_async: - raise NotImplementedError( - "launch_reward_fn_async is not supported in GRPO yet." - ) + raise NotImplementedError("launch_reward_fn_async is not supported in GRPO yet.") else: - reward_tensor, reward_extra_infos_dict = compute_reward( - batch, self.reward_fn - ) + reward_tensor, reward_extra_infos_dict = compute_reward(batch, self.reward_fn) # recompute old_log_probs logger.info("=== + compute log_probs begin ===") @@ -677,9 +617,7 @@ def fit(self): # noqa: C901 loss_mask=response_masks, loss_agg_mode=loss_agg_mode, ) - assert not torch.isnan( - entropy_loss - ).item(), "Entropy loss should not be NaN, something must have gone terribly wrong." + assert not torch.isnan(entropy_loss).item(), "Entropy loss should not be NaN, something must have gone terribly wrong." old_log_prob_metrics = {"actor/entropy": entropy_loss.detach().item()} metrics.update(old_log_prob_metrics) old_log_prob.batch.pop("entropys") @@ -712,9 +650,7 @@ def fit(self): # noqa: C901 batch.batch["token_level_scores"] = reward_tensor if reward_extra_infos_dict: - batch.non_tensor_batch.update( - {k: np.array(v) for k, v in reward_extra_infos_dict.items()} - ) + batch.non_tensor_batch.update({k: np.array(v) for k, v in reward_extra_infos_dict.items()}) # compute rewards. apply_kl_penalty if available if self.config.algorithm.use_kl_in_reward: @@ -729,9 +665,7 @@ def fit(self): # noqa: C901 # compute advantages, executed on the driver process - norm_adv_by_std_in_grpo = self.config.algorithm.get( - "norm_adv_by_std_in_grpo", True - ) # GRPO adv normalization factor + norm_adv_by_std_in_grpo = self.config.algorithm.get("norm_adv_by_std_in_grpo", True) # GRPO adv normalization factor batch = compute_advantage( batch, @@ -760,11 +694,7 @@ def fit(self): # noqa: C901 metrics.update(actor_output_metrics) # validate - if ( - self.val_reward_fn is not None - and self.config.trainer.test_freq > 0 - and (is_last_step or self.global_steps % self.config.trainer.test_freq == 0) - ): + if self.val_reward_fn is not None and self.config.trainer.test_freq > 0 and (is_last_step or self.global_steps % self.config.trainer.test_freq == 0): with marked_timer("testing", timing_raw, color="green"): val_metrics: dict = self._validate() if is_last_step: @@ -783,27 +713,15 @@ def fit(self): # noqa: C901 # 2. It's the last training step. # 3. The current step number is a multiple of the save frequency. # 4. The ESI(Elastic Server Instance)/training plan is close to expiration. - if self.config.trainer.save_freq > 0 and ( - is_last_step - or self.global_steps % self.config.trainer.save_freq == 0 - or esi_close_to_expiration - ): + if self.config.trainer.save_freq > 0 and (is_last_step or self.global_steps % self.config.trainer.save_freq == 0 or esi_close_to_expiration): if esi_close_to_expiration: logger.info("Force saving checkpoint: ESI instance expiration approaching.") with marked_timer("save_checkpoint", timing_raw, color="green"): self._save_checkpoint() with marked_timer("stop_profile", timing_raw): - next_step_profile = ( - self.global_steps + 1 in self.config.trainer.profile_steps - if self.config.trainer.profile_steps is not None - else False - ) - self._stop_profiling( - curr_step_profile and not next_step_profile - if self.config.trainer.profile_continuous_steps - else curr_step_profile - ) + next_step_profile = self.global_steps + 1 in self.config.trainer.profile_steps if self.config.trainer.profile_steps is not None else False + self._stop_profiling(curr_step_profile and not next_step_profile if self.config.trainer.profile_continuous_steps else curr_step_profile) prev_step_profile = curr_step_profile curr_step_profile = next_step_profile @@ -822,9 +740,7 @@ def fit(self): # noqa: C901 metrics.update(compute_timing_metrics(batch=batch, timing_raw=timing_raw)) # TODO: implement actual tflpo and theoretical tflpo n_gpus = self.resource_pool_manager.get_n_gpus() - metrics.update( - compute_throughout_metrics(batch=batch, timing_raw=timing_raw, n_gpus=n_gpus) - ) + metrics.update(compute_throughout_metrics(batch=batch, timing_raw=timing_raw, n_gpus=n_gpus)) # this is experimental and may be changed/removed in the future in favor of a general-purpose one if isinstance(self.train_dataloader.sampler, AbstractCurriculumSampler): @@ -857,9 +773,7 @@ def _validate(self): sample_turns = [] for test_data in self.val_dataloader: - test_data["index"] = torch.tensor( - [i for i in range(len(test_data["task_id"]))], dtype=torch.long - ) + test_data["index"] = torch.tensor([i for i in range(len(test_data["task_id"]))], dtype=torch.long) test_batch = DataProto.from_single_dict(test_data) # repeat test batch @@ -869,10 +783,7 @@ def _validate(self): ) # we only do validation on rule-based rm - if ( - self.config.reward_model.enable - and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model" - ): + if self.config.reward_model.enable and test_batch[0].non_tensor_batch["reward_model"]["style"] == "model": return {} batch_keys_to_pop = ["index"] @@ -928,9 +839,7 @@ def _validate(self): # Store generated outputs output_ids = test_output_gen_batch.batch["responses"] - output_texts = [ - self.tokenizer.decode(ids, skip_special_tokens=True) for ids in output_ids - ] + output_texts = [self.tokenizer.decode(ids, skip_special_tokens=True) for ids in output_ids] sample_outputs.extend(output_texts) test_batch.non_tensor_batch["uid"] = np.array( @@ -951,23 +860,17 @@ def _validate(self): sample_scores.extend(scores) reward_extra_infos_dict["reward"].extend(scores) - logger.info( - f"len reward_extra_infos_dict['reward']: {len(reward_extra_infos_dict['reward'])}" - ) + logger.info(f"len reward_extra_infos_dict['reward']: {len(reward_extra_infos_dict['reward'])}") if "reward_extra_info" in result: for key, lst in result["reward_extra_info"].items(): reward_extra_infos_dict[key].extend(lst) - logger.info( - f"len reward_extra_infos_dict['{key}']: {len(reward_extra_infos_dict[key])}" - ) + logger.info(f"len reward_extra_infos_dict['{key}']: {len(reward_extra_infos_dict[key])}") # collect num_turns of each prompt if "__num_turns__" in test_batch.non_tensor_batch: sample_turns.append(test_batch.non_tensor_batch["__num_turns__"]) - data_source_lst.append( - test_batch.non_tensor_batch.get("data_source", ["unknown"] * reward_tensor.shape[0]) - ) + data_source_lst.append(test_batch.non_tensor_batch.get("data_source", ["unknown"] * reward_tensor.shape[0])) break # hack to escape the loop after one batch metric_dict = val_metrics @@ -993,9 +896,7 @@ def eval_dataset(self, target_dataset, target_dataset_name, mode, epoch): for _ in range(pass_n): tasks += [task for task in target_dataset] - ctx_trackers = self.parallel_env.rollout( - tasks=tasks, mode=mode, epoch=epoch - ) # "sample" or "validate" + ctx_trackers = self.parallel_env.rollout(tasks=tasks, mode=mode, epoch=epoch) # "sample" or "validate" task_results = {} for ctx_tracker in ctx_trackers: reward = ctx_tracker.reward_structure.raw_reward diff --git a/ajet/backbone/warm_up.py b/ajet/backbone/warm_up.py index fcae673f..e7db56c1 100644 --- a/ajet/backbone/warm_up.py +++ b/ajet/backbone/warm_up.py @@ -7,6 +7,7 @@ import logging import os from ajet.utils.async_utils import apply_httpx_aclose_patch + apply_httpx_aclose_patch() @@ -42,7 +43,6 @@ def init_parallel_rollout_logger(experiment_name): logging.getLogger("httpx").setLevel(logging.WARNING) - def warm_up_task_judge_when_needed(config): if config.ajet.task_judge.judge_type == "rubrics_auto_grader": from ajet.task_judge.rm_auto_grader_judge import AutoGraderJudge @@ -55,6 +55,7 @@ def warm_up_task_judge_when_needed(config): def clean_up_tmp_ajet_dir(config): """Clean up old IPC socket files in /tmp/ajet directory.""" import time + if config.ajet.enable_experimental_interchange_server is False: return diff --git a/ajet/context_tracker/base_tracker.py b/ajet/context_tracker/base_tracker.py index 0ff706fa..7bd50dc5 100644 --- a/ajet/context_tracker/base_tracker.py +++ b/ajet/context_tracker/base_tracker.py @@ -89,31 +89,16 @@ def replace_token_ids( if precise_token[: len(begin_ids)] == begin_ids: # remove begin_ids token # precise_token = precise_token[len(begin_ids) :] # precise_logprob_center = precise_logprob[len(begin_ids) :] - raise ValueError( - "Unexpected situation, wrong llm output (unexpected BOS): please post an github issue." - ) + raise ValueError("Unexpected situation, wrong llm output (unexpected BOS): please post an github issue.") - final_token_ids = ( - token_container[:_begin_index] + precise_token_center + token_container[_end_index:] - ) - final_logprob = ( - [INVALID_LOG_PROB_VALUE] * _begin_index - + precise_logprob_center - + logprob_eos_tail - + [INVALID_LOG_PROB_VALUE] * (len(token_container) - _end_index - len(logprob_eos_tail)) - ) - loss_mask = ( - [0] * _begin_index - + [1] * len(precise_logprob_center) - + [1] * len(logprob_eos_tail) - + [0] * (len(token_container) - _end_index - len(logprob_eos_tail)) - ) + final_token_ids = token_container[:_begin_index] + precise_token_center + token_container[_end_index:] + final_logprob = [INVALID_LOG_PROB_VALUE] * _begin_index + precise_logprob_center + logprob_eos_tail + [INVALID_LOG_PROB_VALUE] * (len(token_container) - _end_index - len(logprob_eos_tail)) + loss_mask = [0] * _begin_index + [1] * len(precise_logprob_center) + [1] * len(logprob_eos_tail) + [0] * (len(token_container) - _end_index - len(logprob_eos_tail)) return final_token_ids, final_logprob, loss_mask, lack_normal_eos class BaseTracker(object): def __init__(self, config, tokenizer, workflow_task: WorkflowTask, **kwargs): - self.workflow_task = workflow_task self.task_batch_index = self.workflow_task.task_batch_index self.task_tag = self.workflow_task.task_tag @@ -143,11 +128,7 @@ def __init__(self, config, tokenizer, workflow_task: WorkflowTask, **kwargs): self.generation_prompt_token = None self.log_metrics: Optional[Dict[str, Union[float, List[float]]]] = None # Initialize workflow_metadata to store tool statistics - assert ( - self.config.ajet.data.max_prompt_length - + self.config.ajet.data.max_response_length - <= max_model_len - ) + assert self.config.ajet.data.max_prompt_length + self.config.ajet.data.max_response_length <= max_model_len def group_tokenize(self): raise NotImplementedError @@ -158,7 +139,5 @@ def group_tokenize_multi_group(self): def group_tokenize_single_group(self, timeline): raise NotImplementedError - def tokenize_steps( - self, ext_steps: List[ExtendedMessage], index: int, total_steps: int - ) -> dict: + def tokenize_steps(self, ext_steps: List[ExtendedMessage], index: int, total_steps: int) -> dict: raise NotImplementedError diff --git a/ajet/context_tracker/basic_tracker.py b/ajet/context_tracker/basic_tracker.py index 44d81cb7..8a759c92 100644 --- a/ajet/context_tracker/basic_tracker.py +++ b/ajet/context_tracker/basic_tracker.py @@ -47,9 +47,7 @@ def get_inc(self, text_frag_from, text_frag_to): tokenizer_output = self.tokenizer(text_frag_to, return_tensors="pt", padding=False) input_ids = tokenizer_output["input_ids"][0].tolist() # type: ignore - input_id_increment = input_ids[ - len(token_ids_acc) : - ] # get the new tokens added in this step + input_id_increment = input_ids[len(token_ids_acc) :] # get the new tokens added in this step overlap_length = 0 for i in range(len(token_ids_acc)): if i < len(token_ids_acc) and input_ids[i] == token_ids_acc[i]: @@ -60,9 +58,7 @@ def get_inc(self, text_frag_from, text_frag_to): return input_id_increment, msg # generate token - def get_token_inc_from_llm_response( - self, input_msg_ref, llm_output, tools: List[dict] = [] - ) -> Tuple[List[int], List[int], List[int], bool]: + def get_token_inc_from_llm_response(self, input_msg_ref, llm_output, tools: List[dict] = []) -> Tuple[List[int], List[int], List[int], bool]: llm_output_role_content = { "role": llm_output["role"], "content": llm_output["content"], @@ -107,9 +103,7 @@ def filter_context_via_author(self, timeline, author: str) -> List[ExtendedMessa def filter_context_via_authors(self, timeline, authors: List[str]) -> List[ExtendedMessage]: return copy.deepcopy([c for c in timeline if c.author in authors]) - def filter_context_via_authors_with_limit( - self, timeline, authors: List[str], limit: dict - ) -> List[ExtendedMessage]: + def filter_context_via_authors_with_limit(self, timeline, authors: List[str], limit: dict) -> List[ExtendedMessage]: """ limit = { "llm": "keep_last@2" @@ -122,10 +116,7 @@ def filter_context_via_authors_with_limit( if limit_item_command == "keep_last": limit_item_value = int(limit_item_value) # remove all message whose author is `llm_author` except the last `limit_item_value` messages - num_need_rm = ( - len([c for c in filtered_via_authors if c.author == limit_author]) - - limit_item_value - ) + num_need_rm = len([c for c in filtered_via_authors if c.author == limit_author]) - limit_item_value if num_need_rm > 0: num_already_rm = 0 filtered_via_authors_new = [] @@ -140,10 +131,7 @@ def filter_context_via_authors_with_limit( elif limit_item_command == "keep_first": limit_item_value = int(limit_item_value) # remove all message whose author is `llm_author` except the first `limit_item_value` messages - num_need_keep = ( - len([c for c in filtered_via_authors if c.author == limit_author]) - - limit_item_value - ) + num_need_keep = len([c for c in filtered_via_authors if c.author == limit_author]) - limit_item_value if num_need_keep > 0: num_already_keep = 0 filtered_via_authors_new = [] @@ -156,14 +144,10 @@ def filter_context_via_authors_with_limit( filtered_via_authors = filtered_via_authors_new else: - raise ValueError( - f"Unknown limit_item_command {limit_item_command} in filter_context_via_authors_with_limit" - ) + raise ValueError(f"Unknown limit_item_command {limit_item_command} in filter_context_via_authors_with_limit") return filtered_via_authors - def compute_step_level_reward( - self, index: int, total_steps: int - ) -> float: + def compute_step_level_reward(self, index: int, total_steps: int) -> float: # TODO: support multi-step reward assert self.reward_structure is not None @@ -171,9 +155,7 @@ def compute_step_level_reward( global_reward = self.reward_structure.raw_reward gamma = self.config.ajet.rollout.gamma step_reward_base = global_reward * (gamma ** (total_steps - index - 1)) - assert ( - gamma == 1.0 - ), "Currently only support gamma == 1.0, we'll support multi-step reward in the future" + assert gamma == 1.0, "Currently only support gamma == 1.0, we'll support multi-step reward in the future" # --------------- compute step level reward --------------- step_reward = step_reward_base # reward scalar @@ -240,9 +222,7 @@ def group_tokenize_multi_group(self): return sample_arr - def tokenize_steps( - self, ext_steps: List[ExtendedMessage], index: int, total_steps: int - ) -> dict: + def tokenize_steps(self, ext_steps: List[ExtendedMessage], index: int, total_steps: int) -> dict: """ Create an Experience object from the current conversation context. @@ -262,9 +242,7 @@ def tokenize_steps( # check reward structure self.reward_structure: Reward # type: ignore - assert ( - self.reward_structure.step_reward_arr is not None - ), "must call `process_reward` before tokenize_steps" + assert self.reward_structure.step_reward_arr is not None, "must call `process_reward` before tokenize_steps" assert len(self.reward_structure.step_reward_arr) == total_steps # mapping @@ -282,13 +260,9 @@ def tokenize_steps( if (split_prompt_reponse_index == -1) and (ext_msg.need_training): split_prompt_reponse_index = len(input_ids) split_point_message_left_index = i - 1 - assert ( - split_point_message_left_index >= 0 - ), "There should be at least one message before the first training message" + assert split_point_message_left_index >= 0, "There should be at least one message before the first training message" assert split_prompt_reponse_index == input_ids_len[split_point_message_left_index] - assert ( - ext_msg.author == "llm" - ), "The first message after initialization should be from LLM, not from env or user" + assert ext_msg.author == "llm", "The first message after initialization should be from LLM, not from env or user" # cat all tokens input_ids += ext_msg.token_arr @@ -315,12 +289,8 @@ def tokenize_steps( split_prompt_reponse_index = self.config.ajet.data.max_prompt_length # check - assert len(ext_steps) == len( - input_ids_len - ), "length of ext_steps and input_ids_len should be equal" - assert ( - split_prompt_reponse_index != -1 - ), "split_prompt_reponse_index should not be -1, at least one message should be in the context" + assert len(ext_steps) == len(input_ids_len), "length of ext_steps and input_ids_len should be equal" + assert split_prompt_reponse_index != -1, "split_prompt_reponse_index should not be -1, at least one message should be in the context" position_ids = compute_position_id_with_mask(torch.tensor(attention_mask)).tolist() # sperate prompt and response @@ -391,10 +361,7 @@ def compute_reference_advantage(tracker_array: List): for tracker in tracker_list: tracker.reward_structure.step_advantage = [] for i in range(len(tracker.reward_structure.step_reward_arr)): - tracker.reward_structure.step_advantage += [ - (tracker.reward_structure.step_reward_arr[i] - reward_mean) - / (reward_std + 1e-6) - ] + tracker.reward_structure.step_advantage += [(tracker.reward_structure.step_reward_arr[i] - reward_mean) / (reward_std + 1e-6)] # compute simple advantage (uneven rollout sample count) (just for logging purpose) for task_id, tracker_list in task2tracker.items(): @@ -410,10 +377,7 @@ def compute_reference_advantage(tracker_array: List): for tracker in tracker_list: tracker.reward_structure.step_advantage_simple = [] for i in range(len(tracker.reward_structure.step_reward_arr)): - tracker.reward_structure.step_advantage_simple += [ - (tracker.reward_structure.step_reward_arr[i] - reward_mean) - / (reward_std + 1e-6) - ] + tracker.reward_structure.step_advantage_simple += [(tracker.reward_structure.step_reward_arr[i] - reward_mean) / (reward_std + 1e-6)] return def get_generation_prompt_token(self): diff --git a/ajet/context_tracker/multiagent_tracking.py b/ajet/context_tracker/multiagent_tracking.py index e13982c5..ee9138b9 100644 --- a/ajet/context_tracker/multiagent_tracking.py +++ b/ajet/context_tracker/multiagent_tracking.py @@ -8,9 +8,7 @@ from loguru import logger from transformers.tokenization_utils import PreTrainedTokenizer -from ajet.context_tracker.timeline_merging.timeline_merging import ( - merge_tracker_timelines, is_timeline_mergeable -) +from ajet.context_tracker.timeline_merging.timeline_merging import merge_tracker_timelines, is_timeline_mergeable from ajet.context_tracker.basic_tracker import ( BaseContextTracker, ExtendedMessage, @@ -21,6 +19,7 @@ from ajet.utils.compute_madness import compute_string_madness from ajet.utils.tokenizer import ajet_apply_chat_template + @dataclass class TimelineMergingPolicyConfig: timeline_compare_level: str = "text" @@ -29,15 +28,11 @@ class TimelineMergingPolicyConfig: @dataclass class ContextTrackerConfig: - timeline_merging_policy: TimelineMergingPolicyConfig = field( - default_factory=TimelineMergingPolicyConfig - ) + timeline_merging_policy: TimelineMergingPolicyConfig = field(default_factory=TimelineMergingPolicyConfig) fix_retokenization_drift: bool = True detect_timeline_snap: bool = False - - class MultiAgentContextTracker(BaseContextTracker): """ Context tracker is responsible to monitor and process LLM IO. @@ -61,7 +56,6 @@ def __init__( self.input_kwargs = {} self.timeline_cache = {} - def preprocess_tools_field(self, tools: List[dict] = [], disable_toolcalls: bool = False): if disable_toolcalls: tools = [] @@ -92,10 +86,8 @@ def extract_text_content_from_content_dict(self, msg): assert isinstance(item, dict), f"Unsupported non-dict item in message content: {item}. Full message: {msg}" - if ("text" not in item): - logger.warning( - f"Non-text content in message content detected: {item}. Ignoring." - ) + if "text" not in item: + logger.warning(f"Non-text content in message content detected: {item}. Ignoring.") should_skip_message = True return str_content, should_skip_message @@ -107,7 +99,6 @@ def extract_text_content_from_content_dict(self, msg): should_skip_message = False return str_content, should_skip_message - def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_toolcalls: bool = False) -> List[ExtendedMessage]: """Spawn a timeline from messages. @@ -126,7 +117,6 @@ def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_to consider_roles.remove("tool") for i, msg in enumerate(messages): - if (disable_toolcalls) and (not isinstance(msg["content"], str)): continue @@ -171,14 +161,13 @@ def step_spawn_timeline(self, messages: List[dict], tools: List = [], disable_to tool_calls=(msg["tool_calls"] if "tool_calls" in msg else []), tool_call_id=(msg["tool_call_id"] if "tool_call_id" in msg else ""), token_generator="auto", - name = (msg["name"] if "name" in msg else ""), + name=(msg["name"] if "name" in msg else ""), first_message=(i == 0), ) ] return timeline - def step_prepare(self, messages: List[dict], tools: List = [], timeline_uuid: str = ""): disable_toolcalls = self.config.ajet.rollout.force_disable_toolcalls tools = self.preprocess_tools_field(tools, disable_toolcalls=disable_toolcalls) @@ -186,12 +175,8 @@ def step_prepare(self, messages: List[dict], tools: List = [], timeline_uuid: st # check token overflow converted_message = self.to_role_content(timeline) - timeline = ExtendedMessage.check_and_merge_chained_tool_response( - timeline, self.tokenizer - ) - context_safe, token_overflow, info = self.check_context_token_num_safe( - converted_message, tools - ) + timeline = ExtendedMessage.check_and_merge_chained_tool_response(timeline, self.tokenizer) + context_safe, token_overflow, info = self.check_context_token_num_safe(converted_message, tools) custom_sampling_params = {} if not context_safe: self.context_overflow = True @@ -199,8 +184,6 @@ def step_prepare(self, messages: List[dict], tools: List = [], timeline_uuid: st self.timeline_cache[timeline_uuid] = timeline return context_safe, token_overflow, info, converted_message, custom_sampling_params, tools - - def step_track( self, llm_output, @@ -243,19 +226,14 @@ def step_track( llm_ext_msg.lack_normal_eos = lack_normal_eos llm_ext_msg.manual_loss_mask_override = loss_mask - assert ( - len(precise_manual_token) - <= self.config.ajet.rollout.max_response_length_in_one_turn - ), f"Generated token length {len(precise_manual_token)} exceeds max_response_length_in_one_turn {self.config.ajet.rollout.max_response_length_in_one_turn}" + assert len(precise_manual_token) <= self.config.ajet.rollout.max_response_length_in_one_turn, f"Generated token length {len(precise_manual_token)} exceeds max_response_length_in_one_turn {self.config.ajet.rollout.max_response_length_in_one_turn}" # run generated token callback, usually to monitor token output rate ( e.g. 164 tokens/sec ) self.generated_token_callback_fn(llm_ext_msg.token_arr) # take snapshot of current timeline if context_safe: - if ( - "prompt_text" in llm_output and "prompt_token_ids" in llm_output - ): + if "prompt_text" in llm_output and "prompt_token_ids" in llm_output: # currently we make this patch to better compat with Trinity training backend # fix Retokenization Drift timeline = self.patch_prompt_tokens( @@ -267,17 +245,12 @@ def step_track( self.save_llm_interaction_timeline(tools, llm_ext_msg, timeline) return None - - def save_llm_interaction_timeline(self, tools, llm_ext_msg, timeline): - """Save the LLM interaction timeline by adding the LLM response to `self.saved_timelines` - """ + """Save the LLM interaction timeline by adding the LLM response to `self.saved_timelines`""" timeline += [llm_ext_msg] _, length = self.get_context_token_num_and_safety(timeline, tools) if length > self.config.ajet.rollout.max_model_len: - raise RuntimeError( - f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}" - ) + raise RuntimeError(f"Unexpected token overflow after adding LLM response. Full context length {length}, generated token length {len(llm_ext_msg.token_arr)}") assert timeline[0].first_message, "First message should be marked as first_message" @@ -290,24 +263,12 @@ def save_llm_interaction_timeline(self, tools, llm_ext_msg, timeline): # DEBUG = True # warn when merge fails timeline_merging_policy: TimelineMergingPolicyConfig = self.config.ajet.context_tracker.timeline_merging_policy - if ( - self.config.ajet.context_tracker.detect_timeline_snap - and len(self.saved_timelines) >= 2 - and ( - not is_timeline_mergeable( - self.saved_timelines[-1], - self.saved_timelines[-2], - timeline_merging_policy - ) - ) - ): + if self.config.ajet.context_tracker.detect_timeline_snap and len(self.saved_timelines) >= 2 and (not is_timeline_mergeable(self.saved_timelines[-1], self.saved_timelines[-2], timeline_merging_policy)): logger.bind(exception=True).info(f"General Warning: merge failure discovered.\n") return - def detect_tool_call_madness(self, llm_output): - """Detect whether the tool call format from LLM output is correct or not. - """ + """Detect whether the tool call format from LLM output is correct or not.""" log_tool = self.config.ajet.context_tracker.log_tool_format_check detailed_log = self.config.ajet.context_tracker.log_tool_format_error_detail @@ -319,9 +280,7 @@ def detect_tool_call_madness(self, llm_output): copy_tool_calls = copy.deepcopy(tool_calls) wrong_toolcall = False for i in range(len(copy_tool_calls)): - if ("function" in copy_tool_calls[i]) and ( - "arguments" in copy_tool_calls[i]["function"] - ): + if ("function" in copy_tool_calls[i]) and ("arguments" in copy_tool_calls[i]["function"]): try: expect_dict = json.loads(copy_tool_calls[i]["function"]["arguments"]) if not isinstance(expect_dict, dict): @@ -335,13 +294,9 @@ def detect_tool_call_madness(self, llm_output): err_type = "no function or no arguments" if wrong_toolcall: if detailed_log: - logger.bind(exception=True).warning( - f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n" - ) + logger.bind(exception=True).warning(f"Detected wrong toolcall format from LLM output: \n---*({err_type})*---\n{llm_output['tool_calls']}\n---*-*---\n") if log_tool: - logger.bind(exception=True).warning( - f"Detected wrong toolcall format from LLM content" - ) + logger.bind(exception=True).warning(f"Detected wrong toolcall format from LLM content") self.already_mad_flag = True else: if log_tool: @@ -349,29 +304,22 @@ def detect_tool_call_madness(self, llm_output): elif "" in llm_output["content"]: if detailed_log: - logger.bind(exception=True).warning( - f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n" - ) + logger.bind(exception=True).warning(f"Detected wrong toolcall format from LLM content: \n---*-*---\n{llm_output['content']}\n---*-*---\n") if "wrong_toolcall" in self.config.ajet.rollout.compute_madness_checklist: if log_tool: - logger.bind(exception=True).warning( - f"Detected wrong toolcall format from LLM content" - ) + logger.bind(exception=True).warning(f"Detected wrong toolcall format from LLM content") self.already_mad_flag = True tool_calls = [] else: tool_calls = [] return tool_calls - - def patch_prompt_tokens( self, prompt_text: str, prompt_token_ids: List[int], previous_ext_context: List[ExtendedMessage], ) -> List[ExtendedMessage]: - # remove tailing if prompt_text.endswith(self.generation_prompt): prompt_text = prompt_text[: -len(self.generation_prompt)] @@ -402,9 +350,7 @@ def patch_prompt_tokens( current_prompt_text += [self.tokenizer.decode(previous_ext_context[j].token_arr)] if len(previous_ext_context) != len(prompt_text_split): - logger.bind(exception=True).error( - f"Length mismatch when patching prompt tokens. Previous ext context length: {len(previous_ext_context)}, prompt text split length: {len(prompt_text_split)}. Replacing all tokens." - ) + logger.bind(exception=True).error(f"Length mismatch when patching prompt tokens. Previous ext context length: {len(previous_ext_context)}, prompt text split length: {len(prompt_text_split)}. Replacing all tokens.") # try to recover tokens if self.config.ajet.context_tracker.fix_retokenization_drift: @@ -416,7 +362,6 @@ def patch_prompt_tokens( return previous_ext_context - def ensure_retokenization_perfect_match(self, previous_ext_context, split_prompt_token_ids, prompt_text_split, current_prompt_text): for j in range(len(previous_ext_context)): if prompt_text_split[j] != current_prompt_text[j]: @@ -429,9 +374,7 @@ def ensure_retokenization_perfect_match(self, previous_ext_context, split_prompt mod="exception", header="Prompt text mismatch, Please report a github issue", ) - previous_ext_context[j].token_arr = self.tokenizer( - prompt_text_split[j], return_tensors="pt", padding=False - ) + previous_ext_context[j].token_arr = self.tokenizer(prompt_text_split[j], return_tensors="pt", padding=False) else: # if prompt text match # we further check whether all token ids matches @@ -451,7 +394,6 @@ def ensure_retokenization_perfect_match(self, previous_ext_context, split_prompt header="Prompt token ids mismatch, Please report a github issue", ) - def process_reward(self, reward_structure: Reward): self.reward_structure = reward_structure # TODO: support multi-step reward @@ -465,7 +407,6 @@ def process_reward(self, reward_structure: Reward): for i in range(len(self.saved_timelines)) ] - def generate_log(self, task_id=None, global_step="NA"): task_id = self.task_id nested_items_print_buffer = {} @@ -480,22 +421,10 @@ def generate_log(self, task_id=None, global_step="NA"): text_arr = [self.tokenizer.decode(t) for t in tracker_tokenized["input_ids"]] input_id_arr = [str(t) for t in tracker_tokenized["input_ids"]] # loss_mask_color_arr = ["#09ABCF" if mask==1 else "#D98510" for mask in tracker_tokenized["loss_mask"]] - logprobs = [INVALID_LOG_PROB_VALUE] * len( - tracker_tokenized["prompt_ids"] - ) + tracker_tokenized["response_logprobs"] + logprobs = [INVALID_LOG_PROB_VALUE] * len(tracker_tokenized["prompt_ids"]) + tracker_tokenized["response_logprobs"] # Create adjusted color array - loss_mask_color_abl_arr = [ - ( - adjust_color_hsl("#09ABCF", logprob) - if mask == 1 - else adjust_color_hsl("#D98510", logprob) - ) - for mask, logprob in zip(tracker_tokenized["loss_mask"], logprobs) - ] - logprob_text_arr = [ - (f"{logprob:.4f}" if logprob != INVALID_LOG_PROB_VALUE else "N/A") - for logprob in logprobs - ] + loss_mask_color_abl_arr = [(adjust_color_hsl("#09ABCF", logprob) if mask == 1 else adjust_color_hsl("#D98510", logprob)) for mask, logprob in zip(tracker_tokenized["loss_mask"], logprobs)] + logprob_text_arr = [(f"{logprob:.4f}" if logprob != INVALID_LOG_PROB_VALUE else "N/A") for logprob in logprobs] buffer = { "text_arr": text_arr, @@ -516,9 +445,7 @@ def generate_log(self, task_id=None, global_step="NA"): len_prompt_ids = len(tracker_tokenized["prompt_ids"]) len_response_ids = len(tracker_tokenized["response_ids"]) len_input_ids = len(tracker_tokenized["input_ids"]) - assert ( - len_prompt_ids + len_response_ids == len_input_ids - ), "len_prompt_ids + len_response_ids should equal to len_input_ids" + assert len_prompt_ids + len_response_ids == len_input_ids, "len_prompt_ids + len_response_ids should equal to len_input_ids" nested_items_print_buffer[".".join(selectors)] = NestedJsonItem( item_id="item", # type: ignore outcome=task_outcome, # type: ignore @@ -546,17 +473,14 @@ def generate_log(self, task_id=None, global_step="NA"): attach="copy this", # type: ignore ) - def group_merge(self) -> List[List[ExtendedMessage]]: timeline_merging_policy: TimelineMergingPolicyConfig = self.config.ajet.context_tracker.timeline_merging_policy self.saved_timelines = merge_tracker_timelines(self.saved_timelines, timeline_merging_policy) return self.saved_timelines - def group_tokenize(self): return self.group_tokenize_multi_group() - def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], tools: List = []) -> Tuple[bool, int]: # type: ignore dict_messages = self.to_role_content(ext_messages) prompt_text = ajet_apply_chat_template( @@ -576,10 +500,7 @@ def get_context_token_num_and_safety(self, ext_messages: List[ExtendedMessage], else: return False, length - - def check_context_token_num_safe( - self, messages: List, tools: List = [] - ) -> Tuple[bool, bool, str]: + def check_context_token_num_safe(self, messages: List, tools: List = []) -> Tuple[bool, bool, str]: prompt_text = ajet_apply_chat_template( tokenizer=self.tokenizer, conversation=messages, diff --git a/ajet/context_tracker/timeline_merging/timeline_merging.py b/ajet/context_tracker/timeline_merging/timeline_merging.py index e81475dd..3f5ce8ad 100644 --- a/ajet/context_tracker/timeline_merging/timeline_merging.py +++ b/ajet/context_tracker/timeline_merging/timeline_merging.py @@ -21,10 +21,7 @@ def is_timeline_mergeable( all_msg_match = True for i in range(len(target_timeline)): if timeline_compare_level == "text": - same = ( - source_timeline[i].content_for_future - == target_timeline[i].content_for_future - ) + same = source_timeline[i].content_for_future == target_timeline[i].content_for_future elif timeline_compare_level == "token": same = source_timeline[i].token_arr == target_timeline[i].token_arr else: @@ -44,8 +41,6 @@ def is_timeline_mergeable( if all_msg_match: can_merge = True - - # # developer only: code below is only for debugging (print a nice comparison table) # if debug: # debug_listofdict = [] @@ -91,10 +86,7 @@ def toggle_author_and_mask( return source_timeline -def merge_tracker_timelines( - timelines: List[List[ExtendedMessage]], - timeline_merging_policy -) -> List[List[ExtendedMessage]]: +def merge_tracker_timelines(timelines: List[List[ExtendedMessage]], timeline_merging_policy) -> List[List[ExtendedMessage]]: """Merge multiple timelines by absorbing those that can be merged. > Input: a list of timelines. (a timeline means: List[ExtendedMessage]) > Output: a shorter list of timelines after merging diff --git a/ajet/copilot/job.py b/ajet/copilot/job.py index 373af631..37ba2c52 100644 --- a/ajet/copilot/job.py +++ b/ajet/copilot/job.py @@ -41,7 +41,7 @@ def __init__( model: str = "Qwen/Qwen2___5-7B-Instruct", n_gpu: int = 8, algorithm: str = "grpo", - n_gpu_for_infer: int | None = None, # only for trinity backbone + n_gpu_for_infer: int | None = None, # only for trinity backbone *kwargs, ) -> None: self.backbone = backbone @@ -84,9 +84,7 @@ def dump_job_as_yaml(self, yaml_path: str) -> str: logger.info(f"Saved training config to {yaml_path}") return yaml_path - def set_workflow( - self, workflow: Union[str, Callable[..., Any]], ensure_reward_in_workflow: bool = False - ) -> "AgentJetJob": + def set_workflow(self, workflow: Union[str, Callable[..., Any]], ensure_reward_in_workflow: bool = False) -> "AgentJetJob": self.config.ajet.rollout.user_workflow = cls_to_path(workflow) # TODO: validate workflow outputs contain reward # ensure_reward_in_workflow @@ -112,9 +110,7 @@ def set_data( elif type in {"random_dummy", "dummy"}: self.config.ajet.task_reader.type = "random_dummy" else: - raise NotImplementedError( - f"Please edit yaml to directly set up task reader of type {type}." - ) + raise NotImplementedError(f"Please edit yaml to directly set up task reader of type {type}.") return self @@ -144,9 +140,7 @@ def tune(self, *args, **kwargs) -> "AgentJetJob": check_avail_gpu(min_free_ratio=0.95) # finalize experiment config - main_yaml_fp, exe_exp_base, exp_name, exp_config = prepare_experiment_config( - yaml_path, exp_dir, backbone - ) + main_yaml_fp, exe_exp_base, exp_name, exp_config = prepare_experiment_config(yaml_path, exp_dir, backbone) # setup environment variables for ray env = setup_environment_vars(args, exp_config, main_yaml_fp) @@ -157,9 +151,7 @@ def tune(self, *args, **kwargs) -> "AgentJetJob": start_ray_service(args, env) else: - raise RuntimeError( - "Ray is already initialized. Please shutdown existing Ray instance before starting a new tuning job." - ) + raise RuntimeError("Ray is already initialized. Please shutdown existing Ray instance before starting a new tuning job.") # start training process if args.conf and main_yaml_fp and exe_exp_base and exp_config: diff --git a/ajet/data_generator/base_data_generator.py b/ajet/data_generator/base_data_generator.py index 4f117d23..0ee47d8e 100644 --- a/ajet/data_generator/base_data_generator.py +++ b/ajet/data_generator/base_data_generator.py @@ -50,9 +50,7 @@ def generate_task( response = self.llm_client(messages=messages, sampling_params_override=self.sampling_params) # Extract content from response raw_response = response.get("content", "") - new_task = self._parse_llm_output_to_task( - raw_response, source_task, document, extra_metadata - ) + new_task = self._parse_llm_output_to_task(raw_response, source_task, document, extra_metadata) return new_task def _build_system_prompt( diff --git a/ajet/data_generator/config.py b/ajet/data_generator/config.py index 7df60cb4..64bbadc1 100644 --- a/ajet/data_generator/config.py +++ b/ajet/data_generator/config.py @@ -6,24 +6,16 @@ class SamplingParamsConfig(BaseModel): """Sampling parameters configuration""" - temperature: float = Field( - default=0.0, description="Sampling temperature, 0 means greedy decoding" - ) + temperature: float = Field(default=0.0, description="Sampling temperature, 0 means greedy decoding") class DeduplicationFilterParamsConfig(BaseModel): """Deduplication filter parameters configuration""" - similarity_threshold: float = Field( - default=0.8, description="Similarity threshold. Tasks above this value will be filtered." - ) - db_path: str = Field( - default="./.similarity_db", description="Storage path for the similarity database" - ) + similarity_threshold: float = Field(default=0.8, description="Similarity threshold. Tasks above this value will be filtered.") + db_path: str = Field(default="./.similarity_db", description="Storage path for the similarity database") model: str = Field(default="text-embedding-v4", description="Embedding model name") - api_key: Optional[str] = Field( - default=None, description="API Key. If None, it is loaded from environment variables." - ) + api_key: Optional[str] = Field(default=None, description="API Key. If None, it is loaded from environment variables.") base_url: str = Field( default="https://dashscope.aliyuncs.com/compatible-mode/v1", description="Embedding API base URL", @@ -49,9 +41,7 @@ class DocumentReaderConfig(BaseModel): document_path: List[str] = Field(default=[], description="List of document file paths") languages: List[str] = Field(default=["eng"], description="List of document languages") chunk_size: int = Field(default=5120, description="Chunk size") - split_by: str = Field( - default="sentence", description="Split method: sentence, paragraph, character" - ) + split_by: str = Field(default="sentence", description="Split method: sentence, paragraph, character") cache_enabled: bool = Field(default=True, description="Whether to enable caching") @field_validator("split_by") @@ -94,9 +84,7 @@ class DataGenerationConfig(BaseModel): llm_response_length: int = Field(default=8192, description="LLM maximum response length") num_workers: int = Field(default=32, description="Number of parallel worker threads") sampling_params: SamplingParamsConfig = Field(default_factory=SamplingParamsConfig) - deduplication_filter: DeduplicationFilterConfig = Field( - default_factory=DeduplicationFilterConfig - ) + deduplication_filter: DeduplicationFilterConfig = Field(default_factory=DeduplicationFilterConfig) class TaskReaderConfig(BaseModel): diff --git a/ajet/data_generator/knowledge_augmentation.py b/ajet/data_generator/knowledge_augmentation.py index 4febac03..0663fdd9 100644 --- a/ajet/data_generator/knowledge_augmentation.py +++ b/ajet/data_generator/knowledge_augmentation.py @@ -19,22 +19,7 @@ def _build_system_prompt( document: Optional[Document] = None, ) -> str: # The template can be read from self.config, but here we hardcode an example for now - return ( - "You are an Expert Question Generation Assistant.\n" - "Your task is to read long, complex documents and generate a large set of high-quality, non-repetitive questions that thoroughly cover all aspects of the provided content.\n" - "**Global Rules:**\n" - "1. Coverage: Cover all sections, topics, major themes, nuanced details, facts, arguments, examples.\n" - "2. Diversity: Include factual, conceptual, comparative, analytical, application, and critical thinking questions. Avoid overly trivial or repetitive questions.\n" - "3. Quality: Questions must be clear, specific, unique, and relevant to the document. Avoid vague or generic questions.\n" - "4. Depth: Include multi-step reasoning, chronological, cause-effect, data-driven, and abstract-contextual questions.\n" - "5. Formatting: Output must be in a JSON list of dictionaries, each dictionary containing `query` and `related_doc` keys.\n" - " - `query` = the generated question (one sentence, ending with a question mark)\n" - " - `related_doc` = the exact excerpt or closely matching text from the document that related_docs or relates to the question\n" - "6. Boundaries: The `related_doc` field must be taken directly from the provided document; do not fabricate or introduce information from outside sources.\n" - "7. Few-shot: If given sample questions, match style and complexity but ensure diversity.\n" - "8. Non-repetition: Ensure no two questions are duplicates or paraphrases of the same idea. If content overlaps, merge rather than replicate.\n" - "Always strictly follow these rules in every output." - ) + return "You are an Expert Question Generation Assistant.\n" "Your task is to read long, complex documents and generate a large set of high-quality, non-repetitive questions that thoroughly cover all aspects of the provided content.\n" "**Global Rules:**\n" "1. Coverage: Cover all sections, topics, major themes, nuanced details, facts, arguments, examples.\n" "2. Diversity: Include factual, conceptual, comparative, analytical, application, and critical thinking questions. Avoid overly trivial or repetitive questions.\n" "3. Quality: Questions must be clear, specific, unique, and relevant to the document. Avoid vague or generic questions.\n" "4. Depth: Include multi-step reasoning, chronological, cause-effect, data-driven, and abstract-contextual questions.\n" "5. Formatting: Output must be in a JSON list of dictionaries, each dictionary containing `query` and `related_doc` keys.\n" " - `query` = the generated question (one sentence, ending with a question mark)\n" " - `related_doc` = the exact excerpt or closely matching text from the document that related_docs or relates to the question\n" "6. Boundaries: The `related_doc` field must be taken directly from the provided document; do not fabricate or introduce information from outside sources.\n" "7. Few-shot: If given sample questions, match style and complexity but ensure diversity.\n" "8. Non-repetition: Ensure no two questions are duplicates or paraphrases of the same idea. If content overlaps, merge rather than replicate.\n" "Always strictly follow these rules in every output." def _build_user_prompt( self, @@ -48,24 +33,16 @@ def _build_user_prompt( user_part = [] N = 10 # 10 is the hyperparameter we found that produces relatively stable outputs - user_part.append( - f"Generate exactly {N} unique, high-quality questions from the following document according to the rules in the system prompt above." - ) - user_part.append( - "For each question, provide the corresponding reference excerpt from the document in the `related_doc` field." - ) + user_part.append(f"Generate exactly {N} unique, high-quality questions from the following document according to the rules in the system prompt above.") + user_part.append("For each question, provide the corresponding reference excerpt from the document in the `related_doc` field.") user_part.append("[DOCUMENT START]") user_part.append(ref_doc) user_part.append("[DOCUMENT END]") user_part.append("Now generate queries that is suitable for the JSON format.") user_part.append("Return your output strictly in JSON format as follows:") user_part.append("[") - user_part.append( - ' {"query": "Question text here?", "related_doc": "Direct excerpt from the document here."},' - ) - user_part.append( - ' {"query": "Question text here?", "related_doc": "Direct excerpt from the document here."},' - ) + user_part.append(' {"query": "Question text here?", "related_doc": "Direct excerpt from the document here."},') + user_part.append(' {"query": "Question text here?", "related_doc": "Direct excerpt from the document here."},') user_part.append("]") return "\n".join(user_part) diff --git a/ajet/data_generator/task_augmentation.py b/ajet/data_generator/task_augmentation.py index 1db723e7..5a4a2de5 100644 --- a/ajet/data_generator/task_augmentation.py +++ b/ajet/data_generator/task_augmentation.py @@ -21,38 +21,15 @@ def _build_system_prompt( Build system prompt for task augmentation. The prompt adapts based on whether a document is provided. """ - base_prompt = ( - "You are a professional expert in query generation.\n" - "Your goal is to generate ONE new user query that:\n" - "- Is semantically related to the reference query (similar topic/domain/intent),\n" - "- Preserves the original query's style, language, task type, and approximate length,\n" - "- Is natural, diverse, and fluent,\n" - "- Is NOT a direct copy or minor edit of the original query.\n" - ) + base_prompt = "You are a professional expert in query generation.\n" "Your goal is to generate ONE new user query that:\n" "- Is semantically related to the reference query (similar topic/domain/intent),\n" "- Preserves the original query's style, language, task type, and approximate length,\n" "- Is natural, diverse, and fluent,\n" "- Is NOT a direct copy or minor edit of the original query.\n" # Conditional instructions based on document availability document_instructions = "" if document is not None and document.content: - document_instructions = ( - "\n" - "Document context is provided for reference:\n" - "- Infer the document's overall topic or domain (do NOT assume the query is tied to a specific paragraph),\n" - "- Ensure the new query is compatible with that overall topic/domain,\n" - "- The new query should feel naturally related to the document's theme.\n" - "\n" - ) + document_instructions = "\n" "Document context is provided for reference:\n" "- Infer the document's overall topic or domain (do NOT assume the query is tied to a specific paragraph),\n" "- Ensure the new query is compatible with that overall topic/domain,\n" "- The new query should feel naturally related to the document's theme.\n" "\n" # Output format requirements to ensure structured response - output_requirements = ( - "You MUST:\n" - "- Avoid copying the original text verbatim,\n" - "- Avoid minimal edits such as just changing a few words or reordering phrases,\n" - "- Avoid adding explanations or commentary,\n" - "- Output ONLY a valid JSON object with a single field 'query'.\n" - "\n" - "Example output format:\n" - '{"query": ""}\n' - ) + output_requirements = "You MUST:\n" "- Avoid copying the original text verbatim,\n" "- Avoid minimal edits such as just changing a few words or reordering phrases,\n" "- Avoid adding explanations or commentary,\n" "- Output ONLY a valid JSON object with a single field 'query'.\n" "\n" "Example output format:\n" '{"query": ""}\n' return base_prompt + document_instructions + output_requirements @@ -78,25 +55,9 @@ def _build_user_prompt( if document is not None and document.content: # Only add document-related content if a document is actually provided reference_info += "[Document]:\n" - doc_part = ( - "Here is the reference document content:\n" - f"{document.content}\n" - "\n" - "Use this document as background knowledge while generating a new query.\n" - ) - - user_prompt = ( - f"{reference_info}" - f"{doc_part}" - "\n" - "Now, generate ONE new user query that is suitable for the same context.\n" - "\n" - "Important rules:\n" - "- Do NOT directly copy or minimally edit the original query.\n" - "- Do NOT output explanations, comments, or any extra text.\n" - "- Output ONLY a JSON object with the following structure:\n" - '{"query": ""}\n' - ) + doc_part = "Here is the reference document content:\n" f"{document.content}\n" "\n" "Use this document as background knowledge while generating a new query.\n" + + user_prompt = f"{reference_info}" f"{doc_part}" "\n" "Now, generate ONE new user query that is suitable for the same context.\n" "\n" "Important rules:\n" "- Do NOT directly copy or minimally edit the original query.\n" "- Do NOT output explanations, comments, or any extra text.\n" "- Output ONLY a JSON object with the following structure:\n" '{"query": ""}\n' return user_prompt diff --git a/ajet/default_config/ajet_default.py b/ajet/default_config/ajet_default.py index 9d0732e9..9f011335 100644 --- a/ajet/default_config/ajet_default.py +++ b/ajet/default_config/ajet_default.py @@ -92,9 +92,7 @@ def update_from_dict_recursive(config_as_dataclass, config_as_dict: Dict[str, An setattr( config_as_dataclass, key, - Config.update_from_dict_recursive( - getattr(config_as_dataclass, key), target_value - ), + Config.update_from_dict_recursive(getattr(config_as_dataclass, key), target_value), ) else: setattr(config_as_dataclass, key, target_value) diff --git a/ajet/launcher.py b/ajet/launcher.py index 73a347aa..963e1338 100644 --- a/ajet/launcher.py +++ b/ajet/launcher.py @@ -106,20 +106,12 @@ def check_debugpy_version(): try: import debugpy except ImportError: - raise RuntimeError( - "Module 'debugpy>=1.8.0' cannot be loaded. " - "Ray Debugpy Debugger will not work without 'debugpy>=1.8.0' installed. " - "Install this module using 'pip install debugpy>=1.8.0'" - ) + raise RuntimeError("Module 'debugpy>=1.8.0' cannot be loaded. " "Ray Debugpy Debugger will not work without 'debugpy>=1.8.0' installed. " "Install this module using 'pip install debugpy>=1.8.0'") version = getattr(debugpy, "__version__", "0.0.0") from packaging import version as packaging_version if packaging_version.parse(version) < packaging_version.parse("1.8.0"): - raise RuntimeError( - f"debugpy version {version} is too old. " - "Ray Debugpy Debugger requires 'debugpy>=1.8.0'. " - "Upgrade using 'pip install debugpy>=1.8.0'" - ) + raise RuntimeError(f"debugpy version {version} is too old. " "Ray Debugpy Debugger requires 'debugpy>=1.8.0'. " "Upgrade using 'pip install debugpy>=1.8.0'") logger.info(f"✓ debugpy version {version} meets requirement (>=1.8.0)") @@ -169,21 +161,14 @@ def check_avail_gpu(min_free_ratio: float = 0.95): continue free = max(total - used, 0.0) free_ratio = free / total if total > 0 else 0.0 - logger.info( - f"GPU {idx} ({name}): total={total:.0f} MiB, used={used:.0f} MiB, free_ratio={free_ratio:.3f}" - ) + logger.info(f"GPU {idx} ({name}): total={total:.0f} MiB, used={used:.0f} MiB, free_ratio={free_ratio:.3f}") if free_ratio < min_free_ratio: violations.append((idx, name, f"free_ratio={free_ratio:.3f} < {min_free_ratio:.3f}")) if violations: details = "; ".join([f"GPU {i} ({n}): {msg}" for i, n, msg in violations]) - raise RuntimeError( - "GPU memory check failed: all GPUs must have >= " - f"{int(min_free_ratio*100)}% free. Violations: {details}" - ) - logger.info( - f"✓ GPU check passed: {len(lines)} GPUs, all >= {int(min_free_ratio*100)}% free memory" - ) + raise RuntimeError("GPU memory check failed: all GPUs must have >= " f"{int(min_free_ratio*100)}% free. Violations: {details}") + logger.info(f"✓ GPU check passed: {len(lines)} GPUs, all >= {int(min_free_ratio*100)}% free memory") def get_backbone_target(backbone): @@ -226,9 +211,7 @@ def setup_environment_vars(args, exp_config, main_yaml_fp): # assert exp_config["ajet"]["rollout"]["max_env_worker"] <= 4, "parallel worker too many for debugging mode" # type: ignore if exp_config["ajet"]["rollout"]["max_env_worker"] > 1: # type: ignore exp_config["ajet"]["rollout"]["max_env_worker"] = 1 - logger.warning( - "For debugging mode, max_env_worker is set to 1 to facilitate debugging." - ) + logger.warning("For debugging mode, max_env_worker is set to 1 to facilitate debugging.") logger.warning("Debug mode is ON") else: logger.warning("Debug mode is OFF") @@ -245,9 +228,7 @@ def check_model_file_exists(exp_config): model_path = exp_config["ajet"]["model"]["path"] # if model_path has more than 2 '/', we consider it as a dir path if model_path.count("/") > 2: - assert os.path.exists( - model_path - ), f"Model path {model_path} does not exist. Please check your configuration." + assert os.path.exists(model_path), f"Model path {model_path} does not exist. Please check your configuration." def main(): @@ -295,9 +276,7 @@ def main(): env, exp_config = setup_environment_vars(args, exp_config, main_yaml_fp) if args.with_ray: - assert ( - not args.with_ray_cluster - ), "Cannot use both --with-ray and --with-ray-cluster simultaneously." + assert not args.with_ray_cluster, "Cannot use both --with-ray and --with-ray-cluster simultaneously." start_ray_service(args, env) if args.with_appworld: @@ -319,9 +298,7 @@ def main(): launch_logview(exp_name) if args.with_ray_cluster: - assert ( - not args.with_ray - ), "Cannot use both --with-ray and --with-ray-cluster simultaneously." + assert not args.with_ray, "Cannot use both --with-ray and --with-ray-cluster simultaneously." start_ray_service(args, env, cluster=True) if args.conf and main_yaml_fp and exe_exp_base and exp_config: diff --git a/ajet/schema/convertion.py b/ajet/schema/convertion.py index 190fc3c1..076f629f 100644 --- a/ajet/schema/convertion.py +++ b/ajet/schema/convertion.py @@ -1,4 +1,3 @@ - import time from openai.types.chat.chat_completion import ChatCompletion, Choice from openai.types.chat.chat_completion_message import ChatCompletionMessage @@ -12,7 +11,6 @@ def convert_llm_proxy_response_to_oai_response(llm_proxy_response): - # Create the chat completion message message = ChatCompletionMessage( role=llm_proxy_response.get("role", "assistant"), @@ -47,12 +45,11 @@ def convert_llm_proxy_response_to_oai_response(llm_proxy_response): ) - # modified from AgentScope's DashScopeChatModule def convert_llm_proxy_response_to_agentscope_response( message, structured_model: Type[BaseModel] | None = None, -) -> AgentScopeChatResponse: # type: ignore +) -> AgentScopeChatResponse: # type: ignore content_blocks: List[TextBlock | ToolUseBlock] = [] content = message.get("content") metadata: dict | None = None diff --git a/ajet/schema/extended_msg.py b/ajet/schema/extended_msg.py index dfaa7460..86f51d23 100644 --- a/ajet/schema/extended_msg.py +++ b/ajet/schema/extended_msg.py @@ -74,7 +74,7 @@ def __init__( tool_calls=[], tool_call_id="", token_logprob_arr=[], - name="", # preserved field, not used currently + name="", # preserved field, not used currently first_message=False, ): self.author = author @@ -91,7 +91,7 @@ def __init__( self.tools = tools self.tool_calls = tool_calls self.tool_call_id = tool_call_id - self.name = name # preserved field, not used currently + self.name = name # preserved field, not used currently if not isinstance(self.tool_calls, list): # agent scope sometimes gives weird type for tool_calls, which is against OpenAI schema self.tool_calls = list(self.tool_calls) @@ -121,9 +121,7 @@ def auto_tokenize(self, tokenizer, tools): if (not self.first_message) and (self.role == "system"): raise ValueError("The system message is usually the first message, check program bugs.") elif (self.first_message) and (self.role != "system"): - raise ValueError( - "The first message is supposed to be the system message, check program bugs, or remove this warning." - ) + raise ValueError("The first message is supposed to be the system message, check program bugs, or remove this warning.") if not self.first_message: self.token_arr = self.auto_tokenize_non_first_message(tokenizer=tokenizer, tools=tools) else: @@ -159,9 +157,7 @@ def auto_tokenize_non_first_message(self, tokenizer, tools): tools=tools, ) except Exception as e: - raise ValueError( - f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}" - ) + raise ValueError(f"Cannot tokenize {self.role} --- {self.content_for_future}, \n\n Error: {e}") self.token_arr, _ = self.get_inc_simple( text_frag_from=ajet_apply_chat_template( tokenizer=tokenizer, @@ -184,11 +180,7 @@ def content_for_future(self): @property def need_training(self): - assert ( - (self.author in NEED_TRAIN_AUTHORS) - or (self.author in NON_TRAIN_AUTHORS) - or (self.author.endswith("(discard)")) - ), f"author {self.author} is not identified" + assert (self.author in NEED_TRAIN_AUTHORS) or (self.author in NON_TRAIN_AUTHORS) or (self.author.endswith("(discard)")), f"author {self.author} is not identified" return self.author in NEED_TRAIN_AUTHORS def generate_content_for_future(self, tokenizer, clip, clip_token_limit=-1): @@ -209,9 +201,7 @@ def get_loss_mask(self, blackout_token_combo): if self.need_training: # keep eos, but blackout everything after eos msg_token_mask = [1] * len(self.token_arr) - msg_token_mask = blackout_specific_token_ids_first_encounter( - msg_token_mask, self.token_arr, blackout_token_combo - ) + msg_token_mask = blackout_specific_token_ids_first_encounter(msg_token_mask, self.token_arr, blackout_token_combo) # in normal case, we will blackout everything after the EOS token # but EOS still participates in the loss calculation msg_token_mask = blackout_everything_after_eos_but_keep_eos( @@ -263,9 +253,7 @@ def get_inc_simple(self, text_frag_from, text_frag_to, tokenizer): return input_id_increment, msg @staticmethod - def check_and_merge_chained_tool_response( - ext_msg_array: List["ExtendedMessage"], tokenizer: PreTrainedTokenizer - ) -> List["ExtendedMessage"]: + def check_and_merge_chained_tool_response(ext_msg_array: List["ExtendedMessage"], tokenizer: PreTrainedTokenizer) -> List["ExtendedMessage"]: """ Inside a list of ExtendedMessage, Find consecutive ext msg with role=="tool", then merge them into one ExtendedMessage @@ -294,9 +282,7 @@ def merge_tool_group(group, tokenizer): return group[0] msg0 = group[0] - merged_content = "".join( - f"\n{msg.content}\n\n" for msg in group - ) + merged_content = "".join(f"\n{msg.content}\n\n" for msg in group) merged_content = merged_content[len("\n") :] merged_content = merged_content[: -len("\n")] merged = ExtendedMessage( @@ -312,9 +298,7 @@ def merge_tool_group(group, tokenizer): first_message=msg0.first_message, ) # re-compute token_arr - auto_tokenize_targets = [ - {"role": msg.role, "content": msg.content_for_future} for msg in group - ] + auto_tokenize_targets = [{"role": msg.role, "content": msg.content_for_future} for msg in group] merged.token_arr, _ = merged.get_inc_simple( text_frag_from=ajet_apply_chat_template( tokenizer=tokenizer, diff --git a/ajet/schema/trajectory.py b/ajet/schema/trajectory.py index 468aa168..b8fddd11 100644 --- a/ajet/schema/trajectory.py +++ b/ajet/schema/trajectory.py @@ -78,9 +78,7 @@ def __init__(self, tracker_tokenized: dict, messages, config, **kwargs): self.max_prompt_len = config.ajet.data.max_prompt_length self.max_response_len = config.ajet.data.max_response_length - self.max_model_len = ( - config.ajet.data.max_response_length + config.ajet.data.max_prompt_length - ) + self.max_model_len = config.ajet.data.max_response_length + config.ajet.data.max_prompt_length self.input_ids = tracker_tokenized["input_ids"] self.attention_mask = tracker_tokenized["attention_mask"] @@ -110,51 +108,22 @@ def __init__(self, tracker_tokenized: dict, messages, config, **kwargs): assert len(self.response_ids) != 0, "response_ids should not be empty" def truncate_output_ids(self) -> None: - assert ( - len(self.input_ids) - == len(self.attention_mask) - == len(self.position_ids) - == len(self.loss_mask) - ) - assert ( - len(self.prompt_ids) - == len(self.prompt_attention_mask) - == len(self.prompt_position_ids) - == len(self.prompt_loss_mask) - == len(self.prompt_logprobs) - ) - assert ( - len(self.response_ids) - == len(self.response_attention_mask) - == len(self.response_position_ids) - == len(self.response_loss_mask) - == len(self.response_logprobs) - ) - assert ( - isinstance(self.input_ids, list) - and isinstance(self.prompt_ids, list) - and isinstance(self.response_ids, list) - ) + assert len(self.input_ids) == len(self.attention_mask) == len(self.position_ids) == len(self.loss_mask) + assert len(self.prompt_ids) == len(self.prompt_attention_mask) == len(self.prompt_position_ids) == len(self.prompt_loss_mask) == len(self.prompt_logprobs) + assert len(self.response_ids) == len(self.response_attention_mask) == len(self.response_position_ids) == len(self.response_loss_mask) == len(self.response_logprobs) + assert isinstance(self.input_ids, list) and isinstance(self.prompt_ids, list) and isinstance(self.response_ids, list) truncate_any = False if len(self.prompt_ids) > self.max_prompt_len: truncate_any = True - raise RuntimeError( - f"Warning: prompt_ids length {len(self.prompt_ids)} exceeds max_prompt_len {self.max_prompt_len}, truncating." - ) + raise RuntimeError(f"Warning: prompt_ids length {len(self.prompt_ids)} exceeds max_prompt_len {self.max_prompt_len}, truncating.") if len(self.response_ids) > self.max_response_len: truncate_any = True - logger.warning( - "-------------------------------------------------------------------------------------------------------" - ) - logger.warning( - f"Warning: response_ids length {len(self.response_ids)} exceeds max_response_len {self.max_response_len}, truncating." - ) - logger.warning( - "-------------------------------------------------------------------------------------------------------" - ) + logger.warning("-------------------------------------------------------------------------------------------------------") + logger.warning(f"Warning: response_ids length {len(self.response_ids)} exceeds max_response_len {self.max_response_len}, truncating.") + logger.warning("-------------------------------------------------------------------------------------------------------") self.response_ids = self.response_ids[: self.max_response_len] self.response_attention_mask = self.response_attention_mask[: self.max_response_len] self.response_position_ids = self.response_position_ids[: self.max_response_len] diff --git a/ajet/task_judge/rm_auto_grader_judge.py b/ajet/task_judge/rm_auto_grader_judge.py index d5734cde..d3f2074d 100644 --- a/ajet/task_judge/rm_auto_grader_judge.py +++ b/ajet/task_judge/rm_auto_grader_judge.py @@ -94,9 +94,7 @@ def __init__(self, config): # Get API key from config or environment import os - api_key = getattr( - config.ajet.task_judge.rubrics_auto_grader, "api_key", None - ) or os.getenv("DASHSCOPE_API_KEY") + api_key = getattr(config.ajet.task_judge.rubrics_auto_grader, "api_key", None) or os.getenv("DASHSCOPE_API_KEY") self.model = DashScopeChatModel( model=config.ajet.task_judge.rubrics_auto_grader.model_name, @@ -113,20 +111,11 @@ def __init__(self, config): self.rubrics_generated = False # Field mappings for data extraction - self.query_field = getattr( - config.ajet.task_judge.rubrics_auto_grader, "query_field", "main_query" - ) - self.answer_field = getattr( - config.ajet.task_judge.rubrics_auto_grader, "answer_field", "final_answer" - ) - self.reference_field = getattr( - config.ajet.task_judge.rubrics_auto_grader, "reference_field", "answer" - ) + self.query_field = getattr(config.ajet.task_judge.rubrics_auto_grader, "query_field", "main_query") + self.answer_field = getattr(config.ajet.task_judge.rubrics_auto_grader, "answer_field", "final_answer") + self.reference_field = getattr(config.ajet.task_judge.rubrics_auto_grader, "reference_field", "answer") - logger.info( - f"AutoGraderJudge initialized with mode={self.generator_config.grader_mode.value}, " - f"language={self.generator_config.language.value}" - ) + logger.info(f"AutoGraderJudge initialized with mode={self.generator_config.grader_mode.value}, " f"language={self.generator_config.language.value}") def _parse_config( self, @@ -136,9 +125,7 @@ def _parse_config( # Parse grader mode grader_mode_str = getattr(judge_config, "grader_mode", "pointwise").lower() - grader_mode = ( - GraderMode.POINTWISE if grader_mode_str == "pointwise" else GraderMode.LISTWISE - ) + grader_mode = GraderMode.POINTWISE if grader_mode_str == "pointwise" else GraderMode.LISTWISE # Parse language language_str = getattr(judge_config, "language", "en").upper() @@ -150,9 +137,7 @@ def _parse_config( "grader_name": getattr(judge_config, "grader_name", "RM Iterative Rubric Grader"), "language": language, "enable_categorization": getattr(judge_config, "enable_categorization", False), - "query_specific_generate_number": getattr( - judge_config, "query_specific_generate_number", 1 - ), + "query_specific_generate_number": getattr(judge_config, "query_specific_generate_number", 1), "categories_number": getattr(judge_config, "categories_number", 5), "max_retries": getattr(judge_config, "max_retries", 5), "max_epochs": getattr(judge_config, "max_epochs", 3), @@ -290,9 +275,7 @@ def _task_to_training_data(self, task: Task) -> Optional[dict]: "label_score": metadata["score"], } else: - raise ValueError( - f"Metadata must contain 'answer' and 'score' for pointwise training data in task {task.task_id}" - ) + raise ValueError(f"Metadata must contain 'answer' and 'score' for pointwise training data in task {task.task_id}") else: # LISTWISE # Listwise: expect metadata with "candidates" containing list of {answer, rank} @@ -309,17 +292,13 @@ def _task_to_training_data(self, task: Task) -> Optional[dict]: "label_rank": label_ranks, } else: - raise ValueError( - f"Metadata must contain 'candidates' list for listwise training data in task {task.task_id}" - ) + raise ValueError(f"Metadata must contain 'candidates' list for listwise training data in task {task.task_id}") except Exception as e: logger.warning(f"Failed to convert task to training data: {e}") return None - async def _async_compute_reward( - self, task: Task, workflow_output: WorkflowOutput | List[WorkflowOutput] - ): + async def _async_compute_reward(self, task: Task, workflow_output: WorkflowOutput | List[WorkflowOutput]): """ Asynchronously compute reward using the generated rubrics. @@ -332,10 +311,7 @@ async def _async_compute_reward( For listwise: List of ranking results """ if not self.rubrics_generated or self.llm_grader is None: - raise RuntimeError( - "Rubrics have not been generated yet. " - "Call generate_rubrics_from_samples() first." - ) + raise RuntimeError("Rubrics have not been generated yet. " "Call generate_rubrics_from_samples() first.") # Extract query query = getattr(task, self.query_field, "") @@ -367,13 +343,9 @@ async def _async_compute_reward( responses.append(output.metadata.get(self.answer_field, "")) # Format answer as required by listwise grader - answer = "\n\n".join( - [f"Response {i+1}:\n{resp}" for i, resp in enumerate(responses)] - ) + answer = "\n\n".join([f"Response {i+1}:\n{resp}" for i, resp in enumerate(responses)]) - result = await self.llm_grader.aevaluate( - query=query, answer=answer, num_responses=len(responses) - ) + result = await self.llm_grader.aevaluate(query=query, answer=answer, num_responses=len(responses)) return result except Exception as e: @@ -404,11 +376,7 @@ def compute_reward(self, task: Task, workflow_output: WorkflowOutput) -> tuple: nest_asyncio.apply() return loop.run_until_complete(self._async_compute_reward(task, workflow_output)) except ImportError: - raise RuntimeError( - "compute_reward() was called from an async context. " - "Please use 'await judge._async_compute_reward(task, output)' instead, " - "or install nest_asyncio: pip install nest_asyncio" - ) + raise RuntimeError("compute_reward() was called from an async context. " "Please use 'await judge._async_compute_reward(task, output)' instead, " "or install nest_asyncio: pip install nest_asyncio") except RuntimeError: # No event loop running, create a new one loop = asyncio.new_event_loop() diff --git a/ajet/task_reader/data_generator_reader.py b/ajet/task_reader/data_generator_reader.py index 5110a98f..119da9b2 100644 --- a/ajet/task_reader/data_generator_reader.py +++ b/ajet/task_reader/data_generator_reader.py @@ -37,9 +37,7 @@ def __init__(self, reader_config): os.makedirs(dataset_dir, exist_ok=True) # Build a cache key based on generation-related config to avoid rigid filenames - document_path = getattr( - reader_config.data_generation.document_reader, "document_path", None - ) + document_path = getattr(reader_config.data_generation.document_reader, "document_path", None) # Convert document_path to a hashable string representation if isinstance(document_path, (list, tuple)): document_path_str = ",".join(sorted(str(p) for p in document_path)) @@ -59,23 +57,15 @@ def __init__(self, reader_config): "similarity_threshold", None, ), - "db_path": getattr( - reader_config.data_generation.deduplication_filter.params, "db_path", None - ), - "model": getattr( - reader_config.data_generation.deduplication_filter.params, "model", None - ), + "db_path": getattr(reader_config.data_generation.deduplication_filter.params, "db_path", None), + "model": getattr(reader_config.data_generation.deduplication_filter.params, "model", None), }, } cache_key_str = json.dumps(cache_config, sort_keys=True, ensure_ascii=False) cache_key = hashlib.md5(cache_key_str.encode("utf-8")).hexdigest()[:8] - self.generated_train_file = os.path.join( - dataset_dir, f"generated_train_tasks_{cache_key}.jsonl" - ) - self.generated_valid_file = os.path.join( - dataset_dir, f"generated_valid_tasks_{cache_key}.jsonl" - ) + self.generated_train_file = os.path.join(dataset_dir, f"generated_train_tasks_{cache_key}.jsonl") + self.generated_valid_file = os.path.join(dataset_dir, f"generated_valid_tasks_{cache_key}.jsonl") # Get number of workers from config, default to 32 self.num_workers = getattr(reader_config.data_generation, "num_workers", 32) @@ -190,9 +180,7 @@ def _generate_and_save_tasks(self): # Calculate batches using ceiling division N = 10 # 10 is the hyperparameter we found that produces relatively stable outputs, same with knowledge_augmentation doc_task_rounds = math.ceil(task_num / N) - logger.info( - f"Generating {doc_task_rounds} document-based task batches (ceil({task_num}/10))" - ) + logger.info(f"Generating {doc_task_rounds} document-based task batches (ceil({task_num}/10))") self.doc_tasks = [] @@ -205,10 +193,7 @@ def _generate_and_save_tasks(self): # Execute document task generation with progress bar with ThreadPoolExecutor(max_workers=self.num_workers) as executor: # Submit all tasks - future_to_batch = { - executor.submit(self._generate_document_tasks_worker, args): args[0] - for args in doc_worker_args - } + future_to_batch = {executor.submit(self._generate_document_tasks_worker, args): args[0] for args in doc_worker_args} # Process results with progress bar with tqdm(total=doc_task_rounds, desc="Document tasks", unit="batch") as pbar: @@ -228,14 +213,10 @@ def _generate_and_save_tasks(self): # Save doc_tasks as validation tasks cache if self.doc_tasks: - logger.info( - f"Saving {len(self.doc_tasks)} validation tasks to cache: {self.generated_valid_file}" - ) + logger.info(f"Saving {len(self.doc_tasks)} validation tasks to cache: {self.generated_valid_file}") self._save_tasks_to_jsonl(self.doc_tasks, self.generated_valid_file) else: - logger.info( - "Phase 1: Skipping document task generation (using cached validation tasks)" - ) + logger.info("Phase 1: Skipping document task generation (using cached validation tasks)") # Phase 2: Generate augmented tasks only if not cached if self.new_tasks is None: @@ -251,9 +232,7 @@ def _generate_and_save_tasks(self): if not self.doc_tasks: self.doc_tasks = [] combined_source_tasks = self.original_tasks + self.doc_tasks - logger.info( - f"Using {len(combined_source_tasks)} source tasks ({len(self.original_tasks)} original + {len(self.doc_tasks)} document-based)" - ) + logger.info(f"Using {len(combined_source_tasks)} source tasks ({len(self.original_tasks)} original + {len(self.doc_tasks)} document-based)") # Prepare arguments for workers aug_worker_args = [] @@ -266,10 +245,7 @@ def _generate_and_save_tasks(self): # Execute augmented task generation with progress bar with ThreadPoolExecutor(max_workers=self.num_workers) as executor: # Submit all tasks - future_to_task = { - executor.submit(self._generate_augmented_tasks_worker, args): args[0] - for args in aug_worker_args - } + future_to_task = {executor.submit(self._generate_augmented_tasks_worker, args): args[0] for args in aug_worker_args} # Process results with progress bar with tqdm(total=task_num, desc="Augmented tasks", unit="task") as pbar: @@ -289,18 +265,14 @@ def _generate_and_save_tasks(self): # Save training tasks if self.new_tasks: - logger.info( - f"Saving {len(self.new_tasks)} training tasks to cache: {self.generated_train_file}" - ) + logger.info(f"Saving {len(self.new_tasks)} training tasks to cache: {self.generated_train_file}") self._save_tasks_to_jsonl(self.new_tasks, self.generated_train_file) else: logger.warning("No training tasks generated successfully") else: logger.info("Phase 2: Skipping training task generation (using cached training tasks)") - logger.info( - f"Task generation complete: {len(self.new_tasks)} training tasks, {len(self.doc_tasks)} validation tasks" - ) + logger.info(f"Task generation complete: {len(self.new_tasks)} training tasks, {len(self.doc_tasks)} validation tasks") def _read_jsonl_file(self, file_path): """ @@ -404,6 +376,5 @@ def get_generation_stats(self) -> dict: "augmented_tasks_generated": len(getattr(self, "new_tasks", [])), "original_tasks_count": len(self.original_tasks), "validation_tasks_count": len(getattr(self, "doc_tasks", [])), - "combined_source_tasks_count": len(self.original_tasks) - + len(getattr(self, "doc_tasks", [])), + "combined_source_tasks_count": len(self.original_tasks) + len(getattr(self, "doc_tasks", [])), } diff --git a/ajet/task_reader/document_reader/doc_reader.py b/ajet/task_reader/document_reader/doc_reader.py index e73c3bdf..bf25b5bb 100644 --- a/ajet/task_reader/document_reader/doc_reader.py +++ b/ajet/task_reader/document_reader/doc_reader.py @@ -89,9 +89,7 @@ def _get_cache_path(self, source_path: str, file_hash: str, languages: List[str] if self.chunk_size: chunk_suffix = f"_chunk{self.chunk_size}_{self.split_by}" - cache_filename = ( - f"{source_path.stem}.{file_hash[:16]}{lang_suffix}{chunk_suffix}.cache.json" - ) + cache_filename = f"{source_path.stem}.{file_hash[:16]}{lang_suffix}{chunk_suffix}.cache.json" return str(source_path.parent / cache_filename) def _load_from_cache(self, cache_path: str) -> Union[str, None]: @@ -252,9 +250,7 @@ def get_document(self) -> Union[List[Document], None]: all_documents = [] for file_path in file_paths: - raw_doc = self.load_document( - file_path, languages=list(self.config.data_generation.document_reader.languages) - ) + raw_doc = self.load_document(file_path, languages=list(self.config.data_generation.document_reader.languages)) # _parser_document now returns a list of documents (chunks) with group_id documents = self._parser_document(raw_doc, source_path=file_path) all_documents.extend(documents) diff --git a/ajet/task_reader/env_service_reader.py b/ajet/task_reader/env_service_reader.py index 00aa26bf..9abfde0b 100644 --- a/ajet/task_reader/env_service_reader.py +++ b/ajet/task_reader/env_service_reader.py @@ -14,9 +14,7 @@ def get_tasks(self, split): env_service_client = EnvClient(base_url=env_url) task_id_array = env_service_client.get_env_profile(env_type, split=split) if len(task_id_array) == 0: - raise ValueError( - f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}" - ) + raise ValueError(f"No task_id found for env_type: {env_type}, split: {split}, Please check connection to {env_url}") tasks = [ Task( main_query="[not defined]", diff --git a/ajet/task_reader/hf_dataset_reader.py b/ajet/task_reader/hf_dataset_reader.py index 381e48e2..41136d81 100644 --- a/ajet/task_reader/hf_dataset_reader.py +++ b/ajet/task_reader/hf_dataset_reader.py @@ -32,9 +32,7 @@ def _load_dataset_split(self, dataset_name: str, split: str) -> List[Task]: try: dataset = datasets.load_dataset(dataset_name, split=split) except Exception as e: - raise ValueError( - f"Failed to load dataset '{dataset_name}' with split '{split}': {str(e)}" - ) + raise ValueError(f"Failed to load dataset '{dataset_name}' with split '{split}': {str(e)}") # if len(dataset) == 0: # raise ValueError(f"No examples found in dataset '{dataset_name}' with split '{split}'") diff --git a/ajet/task_reader/tracing_reader/__init__.py b/ajet/task_reader/tracing_reader/__init__.py index 79b1c44c..2a98a556 100644 --- a/ajet/task_reader/tracing_reader/__init__.py +++ b/ajet/task_reader/tracing_reader/__init__.py @@ -33,9 +33,7 @@ def __init__( # config patch self.reader_config = reader_config.feedback_tracing - logger.info( - f"reading tasks from {self.reader_config.get('base_url')}, #filter {len(self.reader_config.get('filters', []))}" - ) + logger.info(f"reading tasks from {self.reader_config.get('base_url')}, #filter {len(self.reader_config.get('filters', []))}") self._connector = LocalSqliteConnectorV1(self.reader_config.get("base_url")) filters_config = self.reader_config.get("filters") built_filters = build_filters(filters_config) @@ -84,18 +82,9 @@ def _init_tasks(self) -> None: logger.info(f"Loaded {len(tasks)} tasks from conversation") existing_tasks = self._load_existing_tasks(output_path) - existing_hashes = { - t.metadata.get("qa_hash") - for t in existing_tasks - if t.metadata.get("qa_hash") is not None - } - - new_tasks = [ - t - for t in tasks - if t.metadata.get("qa_hash") is not None - and t.metadata["qa_hash"] not in existing_hashes - ] + existing_hashes = {t.metadata.get("qa_hash") for t in existing_tasks if t.metadata.get("qa_hash") is not None} + + new_tasks = [t for t in tasks if t.metadata.get("qa_hash") is not None and t.metadata["qa_hash"] not in existing_hashes] new_tasks_filtered = self._apply_filters(new_tasks) diff --git a/ajet/task_reader/tracing_reader/connector.py b/ajet/task_reader/tracing_reader/connector.py index d45256a3..6dc1f17c 100644 --- a/ajet/task_reader/tracing_reader/connector.py +++ b/ajet/task_reader/tracing_reader/connector.py @@ -66,9 +66,7 @@ def load_spans(self, projects_limit: int = 100, spans_limit: int = 100) -> list: return all_spans def load_tasks_from_conversation(self) -> List[Task]: - all_spans = self.load_spans( - projects_limit=self._projects_limit, spans_limit=self._spans_limit - ) + all_spans = self.load_spans(projects_limit=self._projects_limit, spans_limit=self._spans_limit) all_spans.sort(key=lambda x: datetime.fromisoformat(x["end_time"])) all_spans = list(filter(lambda x: x["name"].startswith("invoke_agent"), all_spans)) @@ -150,9 +148,7 @@ def __init__(self, db_path: str) -> None: def load_tasks_from_conversation(self) -> List[Task]: conn = sqlite3.connect(self._db_path) cursor = conn.cursor() - rows = cursor.execute( - "SELECT attributes FROM span_table where name='ReActAgent.reply'" - ).fetchall() + rows = cursor.execute("SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() logger.debug(f"Loaded {len(rows)} rows from {self._db_path}") qa = [] @@ -222,9 +218,7 @@ def __init__(self, db_path: str) -> None: def load_tasks_from_conversation(self) -> List[Task]: conn = sqlite3.connect(self._db_path) cursor = conn.cursor() - rows = cursor.execute( - "SELECT attributes FROM span_table where name='ReActAgent.reply'" - ).fetchall() + rows = cursor.execute("SELECT attributes FROM span_table where name='ReActAgent.reply'").fetchall() qa = [] for row in rows: diff --git a/ajet/task_reader/tracing_reader/filters/llm_evaluate_filter.py b/ajet/task_reader/tracing_reader/filters/llm_evaluate_filter.py index b49c480a..6cab2bd9 100644 --- a/ajet/task_reader/tracing_reader/filters/llm_evaluate_filter.py +++ b/ajet/task_reader/tracing_reader/filters/llm_evaluate_filter.py @@ -70,9 +70,7 @@ def __init__( self._fn = ReActAgent( name="agent", sys_prompt=EVALUATE_PROMPT.format(custom_rubrics=custom_rubrics), - model=DashScopeChatModel( - "qwen3-235b-a22b-instruct-2507", os.environ["DASHSCOPE_API_KEY"] - ), + model=DashScopeChatModel("qwen3-235b-a22b-instruct-2507", os.environ["DASHSCOPE_API_KEY"]), formatter=DashScopeMultiAgentFormatter(), max_iters=1, ) @@ -80,13 +78,9 @@ def __init__( async def filter(self, tasks: Iterable[Task]) -> List[Task]: kept: List[Task] = [] for task in tasks: - payload = "query: " + task.main_query + "\n" "answer: " + task.metadata.get( - "answer", "" - ) + payload = "query: " + task.main_query + "\n" "answer: " + task.metadata.get("answer", "") - res = await self._fn( - Msg("user", content=payload, role="user"), structured_model=EvalResModel - ) + res = await self._fn(Msg("user", content=payload, role="user"), structured_model=EvalResModel) assert isinstance(res, EvalResModel) if self._print_reason: print(res.reason) diff --git a/ajet/task_reader/tracing_reader/llm_client.py b/ajet/task_reader/tracing_reader/llm_client.py index a17c1b60..e414dcdd 100644 --- a/ajet/task_reader/tracing_reader/llm_client.py +++ b/ajet/task_reader/tracing_reader/llm_client.py @@ -28,9 +28,7 @@ def __init__( ): self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY") if not self.api_key: - raise ValueError( - "API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly." - ) + raise ValueError("API key is required. Please set DASHSCOPE_API_KEY environment variable or pass it directly.") self.model_name = model_name self.temperature = temperature @@ -63,15 +61,11 @@ def chat(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) str: The complete response from the LLM as a single string. """ res = "" - for x in self.chat_stream( - messages, sampling_params - ): # ⭐ Aggregates the streaming responses into a single string + for x in self.chat_stream(messages, sampling_params): # ⭐ Aggregates the streaming responses into a single string res += x return res - def chat_stream( - self, messages: list[dict[str, str]], sampling_params: dict[str, Any] - ) -> Generator[str, None, None]: + def chat_stream(self, messages: list[dict[str, str]], sampling_params: dict[str, Any]) -> Generator[str, None, None]: """ Initiates a streaming chat session and returns a generator that yields the response as it is being generated. @@ -82,13 +76,9 @@ def chat_stream( Returns: Generator[str, None, None]: A generator that yields the response text as it is being generated. """ - return self.chat_stream_with_retry( - messages, **sampling_params - ) # ⭐ Calls the retry mechanism for streaming chat + return self.chat_stream_with_retry(messages, **sampling_params) # ⭐ Calls the retry mechanism for streaming chat - def chat_completion( - self, messages: list[dict[str, str]], stream: bool = False, **kwargs - ) -> str | Generator[str, None, None]: + def chat_completion(self, messages: list[dict[str, str]], stream: bool = False, **kwargs) -> str | Generator[str, None, None]: """ Sends a request to the chat completion API, supporting both non-streaming and streaming modes, and handles various exceptions. @@ -116,9 +106,7 @@ def chat_completion( if stream: return self._handle_stream_response(url, params) # ⭐ Handles the streaming response else: - return self._handle_normal_response( - url, params - ) # ⭐ Handles the non-streaming response + return self._handle_normal_response(url, params) # ⭐ Handles the non-streaming response except requests.exceptions.RequestException as e: logger.error(f"API request failed: {e}") @@ -141,9 +129,7 @@ def _handle_normal_response(self, url: str, params: dict) -> str: Returns: str: The content of the first choice's message in the response, or an empty string if the response format is unexpected. """ - response = requests.post( - url, headers=self.headers, json=params, timeout=600 - ) # ⭐ Sends the POST request to the API + response = requests.post(url, headers=self.headers, json=params, timeout=600) # ⭐ Sends the POST request to the API if not response.ok: # check inappropriate content try: @@ -160,9 +146,7 @@ def _handle_normal_response(self, url: str, params: dict) -> str: result = response.json() if "choices" in result and len(result["choices"]) > 0: - return result["choices"][0]["message"][ - "content" - ].strip() # ⭐ Extracts and returns the content of the first choice's message + return result["choices"][0]["message"]["content"].strip() # ⭐ Extracts and returns the content of the first choice's message else: logger.error(f"Unexpected response format: {result}") return "" @@ -178,9 +162,7 @@ def _handle_stream_response(self, url: str, params: dict) -> Generator[str, None Yields: str: The content of the response, if it meets the specified conditions. """ - response = requests.post( - url, headers=self.headers, json=params, stream=True, timeout=600 - ) # ⭐ Send the POST request and get the streaming response + response = requests.post(url, headers=self.headers, json=params, stream=True, timeout=600) # ⭐ Send the POST request and get the streaming response if not response.ok: # check inappropriate content try: @@ -235,17 +217,13 @@ def chat_with_retry( """ for attempt in range(max_retries): try: - result = cast( - str, self.chat_completion(messages, stream=False, **kwargs) - ) # ⭐ Attempt to get a chat completion + result = cast(str, self.chat_completion(messages, stream=False, **kwargs)) # ⭐ Attempt to get a chat completion if result: # If a valid response is obtained return result except LlmException as e: if e.typ == "inappropriate content": - logger.warning( - "llm return inappropriate content, which is blocked by the remote" - ) + logger.warning("llm return inappropriate content, which is blocked by the remote") return "[inappropriate content]" except Exception as e: logger.warning(f"Attempt {attempt + 1} failed: {e}") @@ -291,9 +269,7 @@ def chat_stream_with_retry( return # success except LlmException as e: if e.typ == "inappropriate content": - logger.warning( - "llm return inappropriate content, which is blocked by the remote" - ) + logger.warning("llm return inappropriate content, which is blocked by the remote") yield "[inappropriate content]" return except Exception as e: diff --git a/ajet/task_rollout/async_llm_bridge.py b/ajet/task_rollout/async_llm_bridge.py index f43ba1c8..cafdffc2 100644 --- a/ajet/task_rollout/async_llm_bridge.py +++ b/ajet/task_rollout/async_llm_bridge.py @@ -6,7 +6,6 @@ from typing import Any, Callable, Dict, List, Literal, Type, Union - from loguru import logger from omegaconf import DictConfig from pydantic import BaseModel @@ -36,6 +35,7 @@ class AjetStandardLlmBridgeRequest(BaseModel): tools: List = [] request_id: str = "" + class AjetStandardLlmBridgeResponse(BaseModel): role: str = "assistant" request_id: str = "" @@ -48,6 +48,7 @@ class AjetStandardLlmBridgeResponse(BaseModel): # ------------------------ Unify LLM for Verl + Trinity + Vllm ------------------------ # ------------------------------------------------------------------------------------- + class AsyncLlmBridge(object): def __init__( self, @@ -65,7 +66,6 @@ def __init__( self.tool_parser = Hermes2ProToolParser(self.tokenizer) def get_llm_inference_fn_sync(self, sampling_params: dict = {}) -> Callable: # noqa: C901 - def llm_chat_verl( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -118,17 +118,11 @@ def llm_chat_verl( # if tool call tool_calls = None - if ( - ("" in decoded_text) - and ("" in decoded_text) - and (not self.config.ajet.rollout.force_disable_toolcalls) - ): + if ("" in decoded_text) and ("" in decoded_text) and (not self.config.ajet.rollout.force_disable_toolcalls): parsed_tool_calls = self.tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() if self.config.ajet.execute_test: - _test_if_test_mode( - "parsed_tool_calls", parsed_tool_calls["tool_calls"], self.config - ) + _test_if_test_mode("parsed_tool_calls", parsed_tool_calls["tool_calls"], self.config) model_called = parsed_tool_calls["tools_called"] if model_called: tool_calls = parsed_tool_calls["tool_calls"] @@ -154,14 +148,13 @@ def llm_chat_verl( "tokens": [ TokenAndProb( token_id=token_id, - logprob=logprob[token_id].logprob, # Warning: vllm logprob does not participant training (not reliable enough), for log only. + logprob=logprob[token_id].logprob, # Warning: vllm logprob does not participant training (not reliable enough), for log only. decoded_string=logprob[token_id].decoded_token, ) for token_id, logprob in zip(token_array, logprob_array) # type: ignore ], } - def llm_chat_remote( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -190,7 +183,6 @@ def llm_chat_remote( time.sleep(i + 1) return output_message[-1] # type: ignore - def llm_chat_trinity( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -247,7 +239,7 @@ async def main(): "tokens": [ TokenAndProb( token_id=token, - logprob=tokenlogprob.logprob, # Warning: vllm logprob does not participant training, for log only. + logprob=tokenlogprob.logprob, # Warning: vllm logprob does not participant training, for log only. decoded_string=tokenlogprob.token, ) for tokenlogprob, token in zip( @@ -264,10 +256,7 @@ async def main(): else: return llm_chat_verl - - def get_llm_inference_fn_async(self, sampling_params: dict = {}) -> Callable: # noqa: C901 - async def llm_chat_verl( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -317,18 +306,11 @@ async def llm_chat_verl( # if tool call tool_calls = None - if ( - ("" in decoded_text) - and ("" in decoded_text) - and (not self.config.ajet.rollout.force_disable_toolcalls) - ): - + if ("" in decoded_text) and ("" in decoded_text) and (not self.config.ajet.rollout.force_disable_toolcalls): parsed_tool_calls = self.tool_parser.extract_tool_calls(decoded_text, None) # type: ignore parsed_tool_calls = parsed_tool_calls.model_dump() if self.config.ajet.execute_test: - _test_if_test_mode( - "parsed_tool_calls", parsed_tool_calls["tool_calls"], self.config - ) + _test_if_test_mode("parsed_tool_calls", parsed_tool_calls["tool_calls"], self.config) model_called = parsed_tool_calls["tools_called"] if model_called: tool_calls = parsed_tool_calls["tool_calls"] @@ -354,14 +336,13 @@ async def llm_chat_verl( "tokens": [ TokenAndProb( token_id=token_id, - logprob=logprob[token_id].logprob, # Warning: vllm logprob does not participant training (not reliable enough), for log only. + logprob=logprob[token_id].logprob, # Warning: vllm logprob does not participant training (not reliable enough), for log only. decoded_string=logprob[token_id].decoded_token, ) for token_id, logprob in zip(token_array, logprob_array) # type: ignore ], } - async def llm_chat_remote( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -390,7 +371,6 @@ async def llm_chat_remote( time.sleep(i + 1) return output_message[-1] # type: ignore - async def llm_chat_trinity( messages: List[Dict[str, str]], custom_sampling_params: dict = {}, @@ -447,7 +427,7 @@ async def main(): "tokens": [ TokenAndProb( token_id=token, - logprob=tokenlogprob.logprob, # Warning: vllm logprob does not participant training, for log only. + logprob=tokenlogprob.logprob, # Warning: vllm logprob does not participant training, for log only. decoded_string=tokenlogprob.token, ) for tokenlogprob, token in zip( @@ -465,12 +445,11 @@ async def main(): return llm_chat_verl - - # ---------------------------------------------------------------------------------------------- # ------------------------ call async llm with context tracker (OpenAI) ------------------------ # ---------------------------------------------------------------------------------------------- + class OpenaiLlmProxyWithTracker(object): """ An essential wrapper to connect AsyncLlmBridge with AgentScope @@ -480,7 +459,7 @@ class OpenaiLlmProxyWithTracker(object): def __init__( self, - llm_inference_fn: Callable, # Callable[AjetStandardLlmBridgeRequest, AjetStandardLlmBridgeResponse] + llm_inference_fn: Callable, # Callable[AjetStandardLlmBridgeRequest, AjetStandardLlmBridgeResponse] context_tracker: MultiAgentContextTracker, config, ) -> None: @@ -488,7 +467,6 @@ def __init__( self.llm_inference_fn = llm_inference_fn self.config = config - async def __call__( self, messages: List[dict], @@ -500,13 +478,12 @@ async def __call__( llm_output = await self.run_infer(messages, tools, tool_choice, structured_model, **kwargs) return convert_llm_proxy_response_to_oai_response(llm_output) - async def run_infer( self, messages: List[dict], tools: List = [], - tool_choice: str = "auto", # always auto - structured_model=None, # this is for AgentScope only + tool_choice: str = "auto", # always auto + structured_model=None, # this is for AgentScope only **kwargs, ): # generate timeline uuid @@ -535,18 +512,14 @@ async def run_infer( # run llm inference ✨ if self.config.ajet.task_runner.llm_infer_submit_method == "sync": - llm_output = await asyncio.to_thread( - self.llm_inference_fn, converted_message, custom_sampling_params, tools - ) + llm_output = await asyncio.to_thread(self.llm_inference_fn, converted_message, custom_sampling_params, tools) else: llm_output = await self.llm_inference_fn(converted_message, custom_sampling_params, tools) - # begin context tracking self.context_tracker.step_track(llm_output, context_safe, converted_message, tools, timeline_uuid=timeline_uuid) return llm_output - def construct_overflow_response(self): return { "role": "assistant", @@ -557,16 +530,12 @@ def construct_overflow_response(self): } - - - - # ---------------------------------------------------------------------------------------------- # ------------------------ call async llm with context tracker (AgentScope) -------------------- # ---------------------------------------------------------------------------------------------- -class AgentScopeLlmProxyWithTracker(OpenaiLlmProxyWithTracker): +class AgentScopeLlmProxyWithTracker(OpenaiLlmProxyWithTracker): async def __call__( self, messages: List[dict], @@ -575,7 +544,6 @@ async def __call__( structured_model=None, **kwargs, ) -> AgentScopeChatResponse: - llm_output = await self.run_infer(messages, tools, tool_choice, structured_model) response = convert_llm_proxy_response_to_agentscope_response(llm_output, structured_model=structured_model) return response diff --git a/ajet/task_rollout/dashscope_llm_bridge.py b/ajet/task_rollout/dashscope_llm_bridge.py index 810cd025..321dd572 100644 --- a/ajet/task_rollout/dashscope_llm_bridge.py +++ b/ajet/task_rollout/dashscope_llm_bridge.py @@ -13,10 +13,7 @@ def external_llm_chat_fn(messages, sampling_params_override={}, request_id=""): alien_model_name = alien_llm_model alien_model_response_length = alien_llm_response_length - if ( - os.environ.get("DASHSCOPE_API_KEY") is None - or os.environ.get("DASHSCOPE_API_KEY_BACKUP") is None - ): + if os.environ.get("DASHSCOPE_API_KEY") is None or os.environ.get("DASHSCOPE_API_KEY_BACKUP") is None: raise RuntimeError( dedent( """ @@ -63,9 +60,7 @@ def external_llm_chat_fn(messages, sampling_params_override={}, request_id=""): messages=messages, extra_body=sampling_params, ) - message = completion.choices[0].message.model_dump( - exclude_unset=True, exclude_none=True - ) + message = completion.choices[0].message.model_dump(exclude_unset=True, exclude_none=True) if "content" not in message: message["content"] = "" return {"role": message["role"], "content": message["content"]} diff --git a/ajet/task_rollout/native_parallel_worker.py b/ajet/task_rollout/native_parallel_worker.py index 7f35aa10..b8aae915 100644 --- a/ajet/task_rollout/native_parallel_worker.py +++ b/ajet/task_rollout/native_parallel_worker.py @@ -36,9 +36,7 @@ def step_status_printer(self, observation_window): delta_time = current_time - self.current_token_count_time self.current_token = current_token self.current_token_count_time = current_time - token_gen_per_sec_str = ( - f"{delta_token/delta_time:.2f} tokens/s" if delta_time > 0 else "N/A" - ) + token_gen_per_sec_str = f"{delta_token/delta_time:.2f} tokens/s" if delta_time > 0 else "N/A" for step in observation_window["step"]: if step == -1: @@ -107,9 +105,7 @@ def rollout_static( for f in failed_futures: logger.error(f"Thread failed with exception: {f.exception()}") - raise RuntimeError( - f"One of the rollout threads has encountered an exception. {len(failed_futures)} threads failed." - ) + raise RuntimeError(f"One of the rollout threads has encountered an exception. {len(failed_futures)} threads failed.") self.step_status_printer(observation_window) time.sleep(10) @@ -119,12 +115,8 @@ def rollout_static( tracker_array.append(result) # TODO: support multi-step reward - task_success_rate = np.mean( - [tracker.reward_structure.success_rate for tracker in tracker_array] - ) - task_scalar_reward = np.mean( - [tracker.reward_structure.final_scalar_reward for tracker in tracker_array] - ) + task_success_rate = np.mean([tracker.reward_structure.success_rate for tracker in tracker_array]) + task_scalar_reward = np.mean([tracker.reward_structure.final_scalar_reward for tracker in tracker_array]) for tracker in tracker_array: tracker.current_batch_success_rate = float(task_success_rate) @@ -139,11 +131,7 @@ def rollout( epoch: str, ) -> List[BaseContextTracker]: """Delegate to dynamic rollout when oversampling is enabled.""" - if ( - mode == "sample" - and (self.rollout_n != 1) - and self.config.ajet.rollout.enable_oversample - ): + if mode == "sample" and (self.rollout_n != 1) and self.config.ajet.rollout.enable_oversample: return self.rollout_dynamic(tasks, mode, epoch) else: return self.rollout_static(tasks, mode, epoch) @@ -210,9 +198,7 @@ def rollout_dynamic( # noqa: C901 submit_oversample_multiplier = self.config.ajet.rollout.submit_oversample_multiplier rollout_n_oversample = int(rollout_n * submit_oversample_multiplier) rollout_n_confirm = int(rollout_n * (1 + submit_oversample_multiplier) / 2) - assert ( - rollout_n < rollout_n_confirm < rollout_n_oversample - ), f"submit_oversample_multiplier is too small, rollout_n={rollout_n}, rollout_n_confirm={rollout_n_confirm}, rollout_n_oversample={rollout_n_oversample}" + assert rollout_n < rollout_n_confirm < rollout_n_oversample, f"submit_oversample_multiplier is too small, rollout_n={rollout_n}, rollout_n_confirm={rollout_n_confirm}, rollout_n_oversample={rollout_n_oversample}" observation_window: Dict[str, List[int | bool]] = { "step": [0 for _ in range(len(tasks) * rollout_n_oversample)], @@ -247,36 +233,26 @@ def rollout_dynamic( # noqa: C901 for j, task_future_array in enumerate(futures): completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] - completed_results = [ - tracker for tracker in completed_results if not tracker.discarded - ] - reward = [ - tracker.reward_structure.performance_reward for tracker in completed_results - ] + completed_results = [tracker for tracker in completed_results if not tracker.discarded] + reward = [tracker.reward_structure.performance_reward for tracker in completed_results] reward_std = np.std(reward) if reward else 0.0 all_finished = len(completed_task_futures) == len(task_future_array) if all_finished: can_terminate[j] = True terminate_status[j] = f"all_fin({len(completed_results)}/{reward_std:.2f})" num_finished = len(completed_task_futures) - task_cmd_reward_array = [ - tracker.reward_structure.performance_reward for tracker in completed_results - ] + task_cmd_reward_array = [tracker.reward_structure.performance_reward for tracker in completed_results] all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) if not all_equal: if num_finished >= rollout_n: can_terminate[j] = True - terminate_status[ - j - ] = f"early_end({len(completed_results)}/{reward_std:.2f})" + terminate_status[j] = f"early_end({len(completed_results)}/{reward_std:.2f})" else: pass else: if num_finished >= rollout_n_confirm: can_terminate[j] = True - terminate_status[ - j - ] = f"confirm_dummy({len(completed_results)}/{reward_std:.2f})" + terminate_status[j] = f"confirm_dummy({len(completed_results)}/{reward_std:.2f})" if allow_force_stop: for k in range( j * rollout_n_oversample, @@ -294,9 +270,7 @@ def rollout_dynamic( # noqa: C901 else: if tic % 10 == 0: self.step_status_printer(observation_window) - logger.info( - f"task complete {sum(can_terminate)}/{len(can_terminate)} tasks: {terminate_status}" - ) + logger.info(f"task complete {sum(can_terminate)}/{len(can_terminate)} tasks: {terminate_status}") time.sleep(5) # We have enough number of samples, but we need to wait for all threads to finish, including discarded threads @@ -310,19 +284,13 @@ def rollout_dynamic( # noqa: C901 # find sample group that has identical reward, mark them as need_amend task_ineffective_thread_cnt = [] task_completed_thread_cnt = [] # how many effective threads are obtained per group - task_extra_thread_cnt = ( - [] - ) # using rollout_n as baseline, how many extra threads are obtained per group + task_extra_thread_cnt = [] # using rollout_n as baseline, how many extra threads are obtained per group task_need_amend = 0 # how many groups need amendment due to identical rewards for j, task_future_array in enumerate(futures): completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] - completed_results = [ - tracker for tracker in completed_results if not tracker.discarded - ] - task_cmd_reward_array = [ - tracker.reward_structure.performance_reward for tracker in completed_results - ] + completed_results = [tracker for tracker in completed_results if not tracker.discarded] + task_cmd_reward_array = [tracker.reward_structure.performance_reward for tracker in completed_results] all_equal = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) completed_task_cnt = len(completed_results) if all_equal: @@ -349,14 +317,10 @@ def rollout_dynamic( # noqa: C901 # - num_task_to_amend: how many groups can be amended according to removal plan if allow_sample_num_change and (total_sample > world_size * 2): # When changing the number of samples is ALLOWED - num_task_to_amend = len( - futures - ) # this means infinate budget to amend, indicating that we throw away all ineffective samples + num_task_to_amend = len(futures) # this means infinate budget to amend, indicating that we throw away all ineffective samples task_extra_thread_cnt = task_extra_thread_cnt # do not change extra thread cnt, we simply take all diverse samples # log - logger.info( - f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}" - ) + logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") else: # When changing the number of samples is NOT ALLOWED (or the number of samples are too small) @@ -370,25 +334,18 @@ def rollout_dynamic( # noqa: C901 extra_num_thread_required = num_task_to_amend * rollout_n # after CONSUME, how many extra samples are really EXTRA and should be REMOVED remove_count = sum(task_extra_thread_cnt) - extra_num_thread_required - logger.info( - f"forbid_sample_num_change policy: num_task_max_to_amend: {num_task_max_to_amend}, " - f"num_task_to_amend: {num_task_to_amend}, remove_count: {remove_count}, " - ) + logger.info(f"forbid_sample_num_change policy: num_task_max_to_amend: {num_task_max_to_amend}, " f"num_task_to_amend: {num_task_to_amend}, remove_count: {remove_count}, ") # remove extra samples according to `remove_count` while remove_count != 0: # if we should remove some extra samples, we always remove from the group that has the MOST extra samples max_extra_index = task_extra_thread_cnt.index(max(task_extra_thread_cnt)) - assert ( - task_extra_thread_cnt[max_extra_index] > 0 - ), "task_extra_thread_cnt should be greater than 0" + assert task_extra_thread_cnt[max_extra_index] > 0, "task_extra_thread_cnt should be greater than 0" task_extra_thread_cnt[max_extra_index] -= 1 task_completed_thread_cnt[max_extra_index] -= 1 remove_count -= 1 # now, we have computed the final `task_extra_thread_cnt` and `num_task_to_amend`, which the removal plan deps - logger.info( - f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}" - ) + logger.info(f"task_completed_thread_cnt (after remove): {task_completed_thread_cnt}") logger.info(f"task_extra_thread_cnt (after remove): {task_extra_thread_cnt}") # collect results and get the final tracker_array according to removal plan (`task_extra_thread_cnt` and `num_task_to_amend`) @@ -396,29 +353,14 @@ def rollout_dynamic( # noqa: C901 print_buffer = "" task_success_rate = [] task_group_reward = [] - for j, task_future_array, avail_extra_cnt in zip( - range(len(futures)), futures, task_extra_thread_cnt - ): + for j, task_future_array, avail_extra_cnt in zip(range(len(futures)), futures, task_extra_thread_cnt): completed_task_futures = [f for f in task_future_array if f.done()] completed_results = [f.result() for f in completed_task_futures] - completed_results = [ - tracker for tracker in completed_results if not tracker.discarded - ] + completed_results = [tracker for tracker in completed_results if not tracker.discarded] # in-group success rate and reward - task_cmd_reward_array = [ - tracker.reward_structure.performance_reward for tracker in completed_results - ] - success_rate_array = [ - tracker.reward_structure.success_rate for tracker in completed_results - ] - task_group_reward += [ - np.mean( - [ - tracker.reward_structure.final_scalar_reward - for tracker in completed_results - ] - ) - ] + task_cmd_reward_array = [tracker.reward_structure.performance_reward for tracker in completed_results] + success_rate_array = [tracker.reward_structure.success_rate for tracker in completed_results] + task_group_reward += [np.mean([tracker.reward_structure.final_scalar_reward for tracker in completed_results])] task_success_rate += [np.mean(success_rate_array)] # whether this group need amendment need_amend = all(x == task_cmd_reward_array[0] for x in task_cmd_reward_array) @@ -438,9 +380,7 @@ def rollout_dynamic( # noqa: C901 # this group is good and healthy, if it has extra samples, we accept them num_to_be_selected = rollout_n + avail_extra_cnt # if num_to_be_selected > the number of resulting samples, we choose them to maximum reward diversity - selected_tracker_array = self.greedy_max_std_selection( - completed_results, num_to_be_selected - ) + selected_tracker_array = self.greedy_max_std_selection(completed_results, num_to_be_selected) # good, we have collected selected samples from this group tracker_array += selected_tracker_array # print info @@ -479,12 +419,8 @@ def trajectories_to_samples(self, tracker_array: List[BaseContextTracker]) -> Li raise e finally: tracker.generate_log(global_step=self.current_global_steps) - if os.environ.get("BEST_LOGGER_PATH", None) and os.environ.get( - "AJET_DEBUG", None - ): - logger.success( - f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]" - ) + if os.environ.get("BEST_LOGGER_PATH", None) and os.environ.get("AJET_DEBUG", None): + logger.success(f"View rollout details at [http://localhost:8181/?path={quote(os.path.abspath(os.environ['BEST_LOGGER_PATH']))}]") sample_arr_final += sample_arr if self.config.ajet.backbone in ["verl"]: @@ -518,12 +454,7 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: reference_advantage = [] for sample in samples: - assert ( - len(sample.input_ids) - == len(sample.attention_mask) - == len(sample.position_ids) - == len(sample.loss_mask) - ), f"Sample has mismatched lengths: {len(sample.input_ids)=}, {len(sample.attention_mask)=}, {len(sample.position_ids)=}, {len(sample.loss_mask)=}" + assert len(sample.input_ids) == len(sample.attention_mask) == len(sample.position_ids) == len(sample.loss_mask), f"Sample has mismatched lengths: {len(sample.input_ids)=}, {len(sample.attention_mask)=}, {len(sample.position_ids)=}, {len(sample.loss_mask)=}" task_ids.append(sample.task_id) rollout_ids.append(sample.task_tag) @@ -538,17 +469,11 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: prompt_ids.append(torch.tensor(sample.prompt_ids, dtype=torch.int)) response_ids.append(torch.tensor(sample.response_ids, dtype=torch.int)) - prompt_attention_mask.append( - torch.tensor(sample.prompt_attention_mask, dtype=torch.int) - ) - response_attention_mask.append( - torch.tensor(sample.response_attention_mask, dtype=torch.int) - ) + prompt_attention_mask.append(torch.tensor(sample.prompt_attention_mask, dtype=torch.int)) + response_attention_mask.append(torch.tensor(sample.response_attention_mask, dtype=torch.int)) prompt_position_ids.append(torch.tensor(sample.prompt_position_ids, dtype=torch.int)) - response_position_ids.append( - torch.tensor(sample.response_position_ids, dtype=torch.int) - ) + response_position_ids.append(torch.tensor(sample.response_position_ids, dtype=torch.int)) prompt_loss_mask.append(torch.tensor(sample.prompt_loss_mask, dtype=torch.int)) response_loss_mask.append(torch.tensor(sample.response_loss_mask, dtype=torch.int)) @@ -600,34 +525,18 @@ def samples_to_dataproto(self, samples: list[Sample]) -> DataProto: 0, left_pad=True, ) - prompt_position_ids = pad_sequence_to_length( - prompt_position_ids, max_prompt_length_this_batch, 0, left_pad=True - ) - prompt_loss_mask = pad_sequence_to_length( - prompt_loss_mask, max_prompt_length_this_batch, 0, left_pad=True - ) + prompt_position_ids = pad_sequence_to_length(prompt_position_ids, max_prompt_length_this_batch, 0, left_pad=True) + prompt_loss_mask = pad_sequence_to_length(prompt_loss_mask, max_prompt_length_this_batch, 0, left_pad=True) response_ids = pad_sequence(response_ids, batch_first=True, padding_value=self.pad_token_id) - response_attention_mask = pad_sequence( - response_attention_mask, batch_first=True, padding_value=0 - ) + response_attention_mask = pad_sequence(response_attention_mask, batch_first=True, padding_value=0) response_loss_mask = pad_sequence(response_loss_mask, batch_first=True, padding_value=0) - response_ids = pad_sequence_to_length( - response_ids, max_response_length_this_batch, self.pad_token_id - ) - response_attention_mask = pad_sequence_to_length( - response_attention_mask, max_response_length_this_batch, 0 - ) - response_loss_mask = pad_sequence_to_length( - response_loss_mask, max_response_length_this_batch, 0 - ) + response_ids = pad_sequence_to_length(response_ids, max_response_length_this_batch, self.pad_token_id) + response_attention_mask = pad_sequence_to_length(response_attention_mask, max_response_length_this_batch, 0) + response_loss_mask = pad_sequence_to_length(response_loss_mask, max_response_length_this_batch, 0) - delta_position_id = ( - torch.arange(1, response_ids.size(1) + 1, device=response_ids.device) - .unsqueeze(0) - .repeat(len(samples), 1) - ) + delta_position_id = torch.arange(1, response_ids.size(1) + 1, device=response_ids.device).unsqueeze(0).repeat(len(samples), 1) response_position_ids = prompt_position_ids[:, -1:] + delta_position_id input_ids = torch.cat((prompt_ids, response_ids), dim=-1) diff --git a/ajet/task_rollout/resource_keeper.py b/ajet/task_rollout/resource_keeper.py index 2498b415..47a7412f 100644 --- a/ajet/task_rollout/resource_keeper.py +++ b/ajet/task_rollout/resource_keeper.py @@ -40,9 +40,7 @@ def __exit__(self, exc_type, exc_value, traceback): if self.env: self.env.release_instance(self.workflow_task.episode_uuid) except Exception as e: - logger.bind(exception=True).exception( - f"encounter exception in env_worker.release_instance~ error={e.args}" - ) + logger.bind(exception=True).exception(f"encounter exception in env_worker.release_instance~ error={e.args}") raise e def prepare(self): @@ -89,9 +87,7 @@ def _initialize_environment_and_messages(self) -> List[dict]: # Update main_query with actual query from environment self.workflow_task.task.main_query = query except Exception as e: - logger.bind(exception=True).exception( - f"encounter exception in env_worker.create_instance~ error={e.args}" - ) + logger.bind(exception=True).exception(f"encounter exception in env_worker.create_instance~ error={e.args}") if self.env is not None: self.env.release_instance(self.workflow_task.episode_uuid) raise e @@ -130,9 +126,7 @@ def _get_init_messages(self, state_message) -> tuple: return query, init_messages - def generate_gym_env( - self, env_client: Any, episode_uuid: str, task_thread_index: int, observation_window: Dict - ) -> "BaseGymEnv": + def generate_gym_env(self, env_client: Any, episode_uuid: str, task_thread_index: int, observation_window: Dict) -> "BaseGymEnv": return BaseGymEnv(env_client, episode_uuid, task_thread_index, observation_window) @@ -166,9 +160,7 @@ def step(self, action: dict) -> Tuple[str, float, bool, dict]: try: action["content"] = action["content"][0]["text"] except Exception: - logger.exception( - f"Failed to parse action content from agentscope output. {action['content']}" - ) + logger.exception(f"Failed to parse action content from agentscope output. {action['content']}") action["content"] = str(action["content"]) self.observation_window["step"][self.task_thread_index] += 1 @@ -194,7 +186,7 @@ def step(self, action: dict) -> Tuple[str, float, bool, dict]: reward = 0 info = {} terminate = env_output["is_terminated"] - return obs, reward, terminate, info # type: ignore + return obs, reward, terminate, info # type: ignore def reset(self) -> str: """Reset gym environment.""" diff --git a/ajet/task_rollout/single_worker.py b/ajet/task_rollout/single_worker.py index d65a979a..e8865ea9 100644 --- a/ajet/task_rollout/single_worker.py +++ b/ajet/task_rollout/single_worker.py @@ -86,13 +86,9 @@ def rollout_env_worker( sampling_params = get_sample_params(mode, self.config) if self.config.ajet.task_runner.llm_infer_submit_method == "sync": - llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_sync( - sampling_params=sampling_params - ) + llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_sync(sampling_params=sampling_params) else: - llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_async( - sampling_params=sampling_params - ) + llm_inference_fn = self.async_llm_bridge.get_llm_inference_fn_async(sampling_params=sampling_params) workflow_task = WorkflowTask( env_type=task.env_type, @@ -110,24 +106,18 @@ def rollout_env_worker( with ResourceKeeper(workflow_task, config=self.config) as resource_keeper: try: workflow_task = resource_keeper.prepare() - agent_runner = GeneralRunner( - llm_inference_fn=llm_inference_fn, tokenizer=self.tokenizer, config=self.config - ) + agent_runner = GeneralRunner(llm_inference_fn=llm_inference_fn, tokenizer=self.tokenizer, config=self.config) tracker = agent_runner.execute( workflow_task=workflow_task, ) except TestSuccessException as e: - logger.success( - f"env_worker.agent_flow completed with TestSuccessException: {e.args}" - ) + logger.success(f"env_worker.agent_flow completed with TestSuccessException: {e.args}") raise e except TestFailException as e: logger.error(f"env_worker.agent_flow failed with TestFailException: {e.args}") raise e except Exception as e: - logger.bind(exception=True).exception( - f"encounter exception in env_worker.agent_flow error={e.args}" - ) + logger.bind(exception=True).exception(f"encounter exception in env_worker.agent_flow error={e.args}") raise e return tracker diff --git a/ajet/task_runner/base_runner.py b/ajet/task_runner/base_runner.py index b6da703a..3028a829 100644 --- a/ajet/task_runner/base_runner.py +++ b/ajet/task_runner/base_runner.py @@ -15,8 +15,8 @@ gc_lock = Lock() -class BaseAgentRunner(object): +class BaseAgentRunner(object): def __init__(self, llm_inference_fn: Callable, tokenizer: Any, config, **kwargs): self.tokenizer = tokenizer self.instruction_template_ids = self.tokenizer.encode("<|im_start|>user\n") @@ -30,9 +30,7 @@ def __init__(self, llm_inference_fn: Callable, tokenizer: Any, config, **kwargs) self.wrapper_type = self.config.ajet.task_runner.wrapper_type self.wrapper_multiprocessing_timeout = self.config.ajet.task_runner.wrapper_multiprocessing_timeout - assert self.wrapper_type in ["asyncio", "asyncio-with-gc", "multi-processing"], \ - f"Unsupported wrapper type: {self.wrapper_type}, available options: ['asyncio', 'asyncio-with-gc', 'multi-processing']" - + assert self.wrapper_type in ["asyncio", "asyncio-with-gc", "multi-processing"], f"Unsupported wrapper type: {self.wrapper_type}, available options: ['asyncio', 'asyncio-with-gc', 'multi-processing']" def get_judge(self) -> BaseJudge: # type: ignore if self.config.ajet.task_judge.judge_type == "customized_protocol": @@ -47,12 +45,9 @@ def get_judge(self) -> BaseJudge: # type: ignore run_async_coroutine_with_timeout(judge.load_rubrics_from_cache()) return judge - def runner_hooks(self, observation_window, task_thread_index, workflow_task): def should_interrupt_fn() -> bool: - if (observation_window["stop"] is not None) and observation_window["stop"][ - task_thread_index - ]: # Check if the thread should stop (because other threads have completed, making this thread useless) + if (observation_window["stop"] is not None) and observation_window["stop"][task_thread_index]: # Check if the thread should stop (because other threads have completed, making this thread useless) return True return False @@ -64,7 +59,6 @@ def generated_token_callback_fn(token_array): "generated_token_callback_fn": generated_token_callback_fn, } - async def wrapper_type_asyncio(self, workflow_cls: Type[Workflow], workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: user_workflow: Workflow = workflow_cls(name="ajet-workflow") result = await user_workflow.execute(workflow_task, tuner) @@ -80,12 +74,12 @@ async def wrapper_type_asyncio(self, workflow_cls: Type[Workflow], workflow_task gc_lock.release() return result - def wrapper_type_multiprocessing(self, workflow_cls: Type[Workflow], workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: def worker(q: Queue): user_workflow: Workflow = workflow_cls(name="ajet-workflow") result = asyncio.run(user_workflow.execute(workflow_task, tuner)) q.put(result) + q = Queue() p = Process(target=worker, args=(q,)) p.daemon = True @@ -97,14 +91,12 @@ def worker(q: Queue): raise TimeoutError(f"Workflow execution timeout after {self.wrapper_multiprocessing_timeout} seconds") return q.get() - def run_user_workflow( self, workflow_cls: Type[Workflow], workflow_task: WorkflowTask, tuner: AjetTuner, ) -> WorkflowOutput: - if self.wrapper_type == "asyncio": user_workflow: Workflow = workflow_cls(name="ajet-workflow") return asyncio.run(user_workflow.execute(workflow_task, tuner)) diff --git a/ajet/task_runner/general_runner.py b/ajet/task_runner/general_runner.py index 2904cfae..7d527340 100644 --- a/ajet/task_runner/general_runner.py +++ b/ajet/task_runner/general_runner.py @@ -13,7 +13,6 @@ class GeneralRunner(BaseAgentRunner): - def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: observation_window = workflow_task.observation_window task_thread_index = workflow_task.task_thread_index @@ -30,7 +29,7 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: llm_inference_fn=self.llm_inference_fn, tokenizer=self.tokenizer, config=self.config, - workflow_task = workflow_task, + workflow_task=workflow_task, **hooks, ) tuner = AjetTuner( @@ -58,9 +57,7 @@ def execute(self, workflow_task: WorkflowTask) -> BaseContextTracker: workflow_task.gym_env = None # clear gym env client reference to avoid serialization issue - assert not isinstance( - raw_reward, list - ), "AgentJet will support step reward in future versions." + assert not isinstance(raw_reward, list), "AgentJet will support step reward in future versions." # register reward # TODO: support multi-step reward diff --git a/ajet/tuner.py b/ajet/tuner.py index 93602d05..aefff119 100644 --- a/ajet/tuner.py +++ b/ajet/tuner.py @@ -7,13 +7,14 @@ from ajet.tuner_lib.weight_tuner import AgentScopeModelTuner from ajet.tuner_lib.weight_tuner import OpenaiClientModelTuner from ajet.tuner_lib.weight_tuner.as_oai_baseurl_apikey import OpenaiClientBaseUrlTuner + if TYPE_CHECKING: from ajet import Workflow TunerTypeUnion = Union[AgentScopeModelTuner, OpenaiClientModelTuner] -class AjetTuner(object): +class AjetTuner(object): def __init__( self, config, @@ -25,23 +26,16 @@ def __init__( self.trainable_targets = self._get_trainable_targets(workflow_cls) self.context_tracker = context_tracker self.llm_inference_fn = llm_inference_fn - self.target2proxy_registry: dict[str, dict[str,TunerTypeUnion]] = {} + self.target2proxy_registry: dict[str, dict[str, TunerTypeUnion]] = {} self.enable_interchange_server = config.ajet.enable_experimental_interchange_server if self.enable_interchange_server: self.proxy_client_started = False - def _get_trainable_targets(self, workflow_cls: Type["Workflow"]): workflow_instance = workflow_cls(name="ajet-workflow") return workflow_instance.trainable_targets - - def as_agentscope_model( - self, - agent_name="default_agent_name", - target_tag="default_target_tag", - debug_model=None - ) -> "AgentScopeModelTuner": + def as_agentscope_model(self, agent_name="default_agent_name", target_tag="default_target_tag", debug_model=None) -> "AgentScopeModelTuner": """Convert to ModelTuner instance for Agentscope workflow. Returns: ModelTuner: @@ -58,12 +52,11 @@ def as_agentscope_model( self._register(target_tag, agent_name, explicit_tuner_as_modelscope_model) return explicit_tuner_as_modelscope_model - def as_raw_openai_sdk_client( self, agent_name="default_agent_name", target_tag="default_target_tag", - debug_model='gpt-4o', + debug_model="gpt-4o", ) -> OpenaiClientModelTuner: """Convert to raw OpenAI SDK client for advanced usage. Returns: @@ -81,7 +74,6 @@ def as_raw_openai_sdk_client( self._register(target_tag, agent_name, explicit_tuner_as_oai_client) return explicit_tuner_as_oai_client - def as_oai_baseurl_apikey( self, agent_name="default_agent_name", @@ -125,7 +117,6 @@ def __call__(self, **kwargs): """ raise RuntimeError("This method is deprecated. Please use `as_agentscope_model` / `as_raw_openai_sdk_client` first.") - # ------------------------------------------------------------------------ # other helper methods # ------------------------------------------------------------------------ @@ -147,8 +138,7 @@ def _register(self, target_name: str, agent_name: str, explicit_tuner: TunerType return explicit_tuner def _is_target_trainable(self, target_name) -> bool: - """Determine whether user have used `trainable_targets` to explicitly control training targets. - """ + """Determine whether user have used `trainable_targets` to explicitly control training targets.""" if self.trainable_targets is None: # always assume trainable when user has never changed trainable_targets return True @@ -160,7 +150,6 @@ def _is_target_trainable(self, target_name) -> bool: else: return False - def get_context_tracker(self) -> MultiAgentContextTracker: """Get the context tracker instance. Returns: @@ -169,11 +158,11 @@ def get_context_tracker(self) -> MultiAgentContextTracker: """ return self.context_tracker - def _enable_experimental_interchange_server(self, llm_inference_fn): # experimental reverse proxy start if self.enable_interchange_server: from ajet.tuner_lib.weight_tuner.experimental.as_oai_model_client import InterchangeClient + self.interchange_client = InterchangeClient( episode_uuid=self.context_tracker.episode_uuid, context_tracker=self.context_tracker, @@ -182,7 +171,6 @@ def _enable_experimental_interchange_server(self, llm_inference_fn): ) return self.interchange_client.begin_service() - def terminate_episode(self): # experimental reverse proxy cleanup if self.enable_interchange_server: diff --git a/ajet/tuner_lib/weight_tuner/__init__.py b/ajet/tuner_lib/weight_tuner/__init__.py index abb540c1..c50d6787 100644 --- a/ajet/tuner_lib/weight_tuner/__init__.py +++ b/ajet/tuner_lib/weight_tuner/__init__.py @@ -1,3 +1,2 @@ - from ajet.tuner_lib.weight_tuner.as_agentscope_model import AgentScopeModelTuner from ajet.tuner_lib.weight_tuner.as_oai_sdk_model import OpenaiClientModelTuner diff --git a/ajet/tuner_lib/weight_tuner/as_agentscope_model.py b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py index 4af1754c..d125101a 100644 --- a/ajet/tuner_lib/weight_tuner/as_agentscope_model.py +++ b/ajet/tuner_lib/weight_tuner/as_agentscope_model.py @@ -36,16 +36,13 @@ def __init__( self.agent_name = agent_name self.debug_model = debug_model self.use_debug_model = use_debug_model - self.llm_proxy = AgentScopeLlmProxyWithTracker( - context_tracker=context_tracker, config=config, llm_inference_fn=llm_inference_fn - ) + self.llm_proxy = AgentScopeLlmProxyWithTracker(context_tracker=context_tracker, config=config, llm_inference_fn=llm_inference_fn) super().__init__( model_name="ajet", api_key="dummy-api-key", stream=False, ) - async def __call__( self, messages: list[dict[str, Any]], @@ -54,14 +51,12 @@ async def __call__( structured_model: Type[BaseModel] | None = None, **kwargs: Any, ) -> ChatResponse: - # route first if self.use_debug_model and self.debug_model is not None: chatresponse = await self.debug_model(messages, tools, tool_choice, structured_model, **kwargs) assert isinstance(chatresponse, ChatResponse) return chatresponse - # For qvq and qwen-vl models, the content field cannot be `None` or # `[{"text": None}]`, so we need to convert it to an empty list. if self.model_name.startswith("qvq") or "-vl" in self.model_name: @@ -92,10 +87,7 @@ async def __call__( if structured_model: if tools or tool_choice: logger.warning( - "structured_model is provided. Both 'tools' and " - "'tool_choice' parameters will be overridden and " - "ignored. The model will only perform structured output " - "generation without calling any other tools.", + "structured_model is provided. Both 'tools' and " "'tool_choice' parameters will be overridden and " "ignored. The model will only perform structured output " "generation without calling any other tools.", ) format_tool = _create_tool_from_base_model(structured_model) kwargs["tools"] = self._format_tools_json_schemas( diff --git a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py index ba3e9693..7464cfe4 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_baseurl_apikey.py @@ -18,19 +18,22 @@ if TYPE_CHECKING: from ajet import Workflow + class MockAsyncCompletions(AsyncCompletions): - async def create(self, *args, **kwargs) -> Any: # type: ignore - return await self._client.create(*args, **kwargs) # type: ignore + async def create(self, *args, **kwargs) -> Any: # type: ignore + return await self._client.create(*args, **kwargs) # type: ignore + class MockAsyncChat(AsyncChat): @property def completions(self) -> MockAsyncCompletions: # type: ignore return MockAsyncCompletions(self._client) + class OpenaiClientBaseUrlTuner(BaseModel): - """ At this layer, we will determine which model to use: - - training model - - debug model assigned by user, used when this target is not being trained + """At this layer, we will determine which model to use: + - training model + - debug model assigned by user, used when this target is not being trained """ base_url: str = Field(default="http://localhost:27788/v1", description="The base URL for the Ajet's fake OpenAI API") @@ -47,7 +50,6 @@ def __init__( episode_contect_address: str, **kwargs, ): - port = os.getenv("AJET_DAT_INTERCHANGE_PORT") assert port is not None, "AJET_DAT_INTERCHANGE_PORT env var must be set" master_node_ip = os.getenv("MASTER_NODE_IP", "localhost") diff --git a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py index 38619515..8c00e651 100644 --- a/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py +++ b/ajet/tuner_lib/weight_tuner/as_oai_sdk_model.py @@ -17,19 +17,22 @@ class MockAsyncCompletions(AsyncCompletions): - async def create(self, *args, **kwargs) -> Any: # type: ignore - return await self._client.create(*args, **kwargs) # type: ignore + async def create(self, *args, **kwargs) -> Any: # type: ignore + return await self._client.create(*args, **kwargs) # type: ignore + class MockAsyncChat(AsyncChat): @property def completions(self) -> MockAsyncCompletions: # type: ignore return MockAsyncCompletions(self._client) + class OpenaiClientModelTuner(AsyncOpenAI): - """ At this layer, we will determine which model to use: - - training model - - debug model assigned by user, used when this target is not being trained + """At this layer, we will determine which model to use: + - training model + - debug model assigned by user, used when this target is not being trained """ + def __init__( self, config, @@ -50,33 +53,25 @@ def __init__( ) @property - def chat(self) -> MockAsyncChat: # type: ignore + def chat(self) -> MockAsyncChat: # type: ignore return MockAsyncChat(self) - async def create( - self, - messages: List[dict], - tools: List = [], - tool_choice: str = "auto", - *args, - **kwargs - ) -> ChatCompletion: - + async def create(self, messages: List[dict], tools: List = [], tool_choice: str = "auto", *args, **kwargs) -> ChatCompletion: # route first if self.use_debug_model and (self.debug_model is not None): client = AsyncOpenAI() return await client.chat.completions.create( - model = self.debug_model, - messages = messages, # type: ignore - tools = tools, - tool_choice = tool_choice, # type: ignore + model=self.debug_model, + messages=messages, # type: ignore + tools=tools, + tool_choice=tool_choice, # type: ignore ) # call llm model ✨ response_gen = await self.llm_proxy( - messages = messages, - tools = tools, - tool_choice = tool_choice, + messages=messages, + tools=tools, + tool_choice=tool_choice, ) assert isinstance(response_gen, ChatCompletion) return response_gen diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py index 720c6c77..4daa6be3 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_client.py @@ -1,4 +1,3 @@ - import asyncio import atexit import json @@ -26,6 +25,7 @@ DEBUG = False # DEBUG = True + def generate_auth_token(agent_name, target_tag, episode_uuid, episode_address): """ Generate a Base64-encoded auth_token from the given agent_name, target_tag, and episode_uuid. @@ -50,17 +50,16 @@ def generate_auth_token(agent_name, target_tag, episode_uuid, episode_address): json_string = json.dumps(auth_data) # Step 3: Encode the JSON string into Base64 - base64_encoded = base64.b64encode(json_string.encode('utf-8')).decode('utf-8') + base64_encoded = base64.b64encode(json_string.encode("utf-8")).decode("utf-8") # Step 4: Prepend "Bearer " to the Base64-encoded string - auth_token = f"{API_KEY_PREFIX}{base64_encoded}" # API_KEY_PREFIX: Literal['sk-ajet-'] + auth_token = f"{API_KEY_PREFIX}{base64_encoded}" # API_KEY_PREFIX: Literal['sk-ajet-'] return auth_token class InterchangeClient: - """ InterchangeClient is re-created in each episode - """ + """InterchangeClient is re-created in each episode""" def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker", llm_inference_fn, config): self.episode_uuid = episode_uuid @@ -70,23 +69,22 @@ def __init__(self, episode_uuid: str, context_tracker: "MultiAgentContextTracker self._should_terminate = False self.interchange_method = config.ajet.interchange_server.interchange_method - if self.interchange_method == 'tcp': + if self.interchange_method == "tcp": master_node_ip = os.getenv("MASTER_NODE_IP", "localhost") self.episode_contect_address = f"tcp://{master_node_ip}:{find_free_port()}" - elif self.interchange_method == 'ipc': + elif self.interchange_method == "ipc": self.ipc_path = f"/tmp/ajet/{self.episode_uuid}.sock" self.episode_contect_address = f"ipc://{self.ipc_path}" self.max_inference_tracker_threads = config.ajet.interchange_server.max_inference_tracker_threads - async def llm_infer( - self, - req: ChatCompletionRequest, - timeline_uuid: str, - agent_name: str, - target_tag: str, - episode_uuid: str, - ) -> ChatCompletion: + self, + req: ChatCompletionRequest, + timeline_uuid: str, + agent_name: str, + target_tag: str, + episode_uuid: str, + ) -> ChatCompletion: from ajet.task_rollout.async_llm_bridge import OpenaiLlmProxyWithTracker req_as_dict = req.model_dump() @@ -108,53 +106,56 @@ async def llm_infer( assert isinstance(response, ChatCompletion) return response - @property def should_terminate(self) -> bool: return self._should_terminate - def begin_service(self): """ Starts the zmq communication loop. """ - if DEBUG: logger.info(f"[client] {self.episode_uuid} | Starting InterchangeClient service loop...") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | Starting InterchangeClient service loop...") self.socket = context.socket(zmq.REP) self.socket.bind(f"{self.episode_contect_address}") - self.socket.setsockopt(zmq.RCVTIMEO, 3*1000) # 3 second timeout for REP + self.socket.setsockopt(zmq.RCVTIMEO, 3 * 1000) # 3 second timeout for REP self.executor = SharedInterchangeThreadExecutor(self.max_inference_tracker_threads).get_shared_executor() - if DEBUG: logger.info(f"[client] {self.episode_uuid} | Submitting _begin_service_threading to executor...") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | Submitting _begin_service_threading to executor...") future = self.executor.submit(self._begin_service_threading) # wait till service begin running time.sleep(0.5) w_time = 1 - while future._state == 'PENDING': + while future._state == "PENDING": time.sleep(min(w_time * 2, 10)) w_time += 1 - if DEBUG: logger.info(f"[client] {self.episode_uuid} | Future ready...") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | Future ready...") return self.episode_contect_address - def _begin_service_threading(self): - """begin listening for service requests in a threading model - """ + """begin listening for service requests in a threading model""" begin_time = time.time() - if DEBUG: logger.info(f"[client] {self.episode_uuid} | Starting ZMQ socket bind complete") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | Starting ZMQ socket bind complete") try: while not self.should_terminate: # listen for next request from remote try: - if DEBUG: logger.info(f"[client] {self.episode_uuid} | socket.recv_string() has begun") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | socket.recv_string() has begun") message = self.socket.recv_string() - if DEBUG: logger.info(f"[client] {self.episode_uuid} | socket.recv_string() is done") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | socket.recv_string() is done") except zmq.Again as e: if self.should_terminate: - if DEBUG: logger.info(f"[client] {self.episode_uuid} | episode over") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | episode over") break timepassed = time.time() - begin_time if timepassed > 60: @@ -162,13 +163,15 @@ def _begin_service_threading(self): continue # parse the incoming request - if DEBUG: logger.info(f"[client] {self.episode_uuid} | before json.loads(message)") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | before json.loads(message)") data_as_json = json.loads(message) parsed_msg = InterchangeCompletionRequest(**data_as_json) # begin to run the llm request, monitored by context tracker # we re-use previously created thread for best performance - if DEBUG: logger.info(f"[client] {self.episode_uuid} | before asyncio run self.llm_infer") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | before asyncio run self.llm_infer") try: loop = asyncio.get_running_loop() except: @@ -183,19 +186,22 @@ def _begin_service_threading(self): agent_name=parsed_msg.agent_name, target_tag=parsed_msg.target_tag, episode_uuid=parsed_msg.episode_uuid, - ) + ), ) result = loop.run_until_complete(future).model_dump_json() # type: ignore # great, let's send back the result - if DEBUG: logger.info(f"[client] {self.episode_uuid} | before send_string") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | before send_string") self.socket.send_string(result) except: logger.exception(f"[client] {self.episode_uuid} | Exception occurred in service loop.") finally: self.socket.close() - if DEBUG: logger.info(f"[client] {self.episode_uuid} | ZMQ socket closed, service loop terminated.") - if self.interchange_method == 'ipc': + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | ZMQ socket closed, service loop terminated.") + if self.interchange_method == "ipc": if os.path.exists(self.ipc_path): os.remove(self.ipc_path) - if DEBUG: logger.info(f"[client] {self.episode_uuid} | IPC socket file {self.ipc_path} removed.") + if DEBUG: + logger.info(f"[client] {self.episode_uuid} | IPC socket file {self.ipc_path} removed.") diff --git a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py index 40558013..cb5054ee 100644 --- a/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py +++ b/ajet/tuner_lib/weight_tuner/experimental/as_oai_model_server.py @@ -34,6 +34,7 @@ API_KEY_PREFIX = "sk-ajet-" + class InterchangeCompletionRequest(BaseModel): completion_request: ChatCompletionRequest agent_name: str @@ -41,6 +42,7 @@ class InterchangeCompletionRequest(BaseModel): episode_uuid: str timeline_uuid: str + class HealthCheckRequest(BaseModel): agent_name: str target_tag: str @@ -48,6 +50,7 @@ class HealthCheckRequest(BaseModel): timeline_uuid: str health_check: bool = True + # Create FastAPI app SERVER_SHUTDOWN_EVENT = threading.Event() DEBUG = False @@ -59,7 +62,6 @@ class HealthCheckRequest(BaseModel): def get_app(max_fastapi_threads: int = 512) -> FastAPI: - @asynccontextmanager async def lifespan(app: FastAPI): # Startup @@ -72,42 +74,44 @@ async def lifespan(app: FastAPI): app = FastAPI(title="AJet Interchange Endpoint", lifespan=lifespan) - def _begin_handle_chat_completion(episode_address, int_req: InterchangeCompletionRequest, episode_uuid, timeline_uuid, client_offline: threading.Event): - """ run this in thread to avoid blocking main event loop - """ - if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | Received new chat completion request (inside thread)") + """run this in thread to avoid blocking main event loop""" + if DEBUG: + logger.info(f"[server] episode_uuid: {episode_uuid} | Received new chat completion request (inside thread)") socket = context.socket(zmq.REQ) - socket.setsockopt(zmq.RCVTIMEO, 60*1000) # 1 minute recv timeout + socket.setsockopt(zmq.RCVTIMEO, 60 * 1000) # 1 minute recv timeout socket.connect(f"{episode_address}") - if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | connect done") + if DEBUG: + logger.info(f"[server] episode_uuid: {episode_uuid} | connect done") socket.send_string(int_req.model_dump_json()) - if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | send_string") + if DEBUG: + logger.info(f"[server] episode_uuid: {episode_uuid} | send_string") result_str = "" for _ in range(5): # max 5 minutes wait try: - if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | recv_string begin.") + if DEBUG: + logger.info(f"[server] episode_uuid: {episode_uuid} | recv_string begin.") result_str = socket.recv_string() break except zmq.Again as e: - if DEBUG: logger.info(f"[server] episode_uuid: {episode_uuid} | recv_string timeout, retrying.") + if DEBUG: + logger.info(f"[server] episode_uuid: {episode_uuid} | recv_string timeout, retrying.") continue if not result_str: raise RuntimeError(f"Failed to get response from episode_address: {episode_address} after 5 attempts.") else: - if DEBUG: logger.success(f"[server] episode_uuid: {episode_uuid} | recv_string done.") + if DEBUG: + logger.success(f"[server] episode_uuid: {episode_uuid} | recv_string done.") result_object = ChatCompletion(**json.loads(result_str)) return result_object - @app.get("/health") async def health(): return {"status": "ok"} - @app.post("/v1/chat/completions") async def chat_completions(request: Request, authorization: str = Header(None)): """ @@ -121,7 +125,7 @@ async def chat_completions(request: Request, authorization: str = Header(None)): try: # Remove "Bearer " prefix if present auth_token = authorization.replace("Bearer ", "").replace("bearer ", "").replace(API_KEY_PREFIX, "") - decoded = base64.b64decode(auth_token).decode('utf-8') + decoded = base64.b64decode(auth_token).decode("utf-8") auth_data = json.loads(decoded) agent_name = auth_data.get("agent_name") @@ -144,13 +148,14 @@ async def chat_completions(request: Request, authorization: str = Header(None)): # Add to received queue int_req = InterchangeCompletionRequest( - completion_request = new_req, - agent_name = agent_name, - target_tag = target_tag, - episode_uuid = episode_uuid, - timeline_uuid = timeline_uuid, + completion_request=new_req, + agent_name=agent_name, + target_tag=target_tag, + episode_uuid=episode_uuid, + timeline_uuid=timeline_uuid, ) - if DEBUG: logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request (outside thread)") + if DEBUG: + logger.info(f"episode_uuid: {episode_uuid} | Received new chat completion request (outside thread)") client_offline = threading.Event() try: loop = asyncio.get_running_loop() @@ -164,6 +169,7 @@ async def reset(): return app + class InterchangeServer(Process): def __init__(self, experiment_dir: str, port: int, num_fastapi_process: int = 2, max_fastapi_threads: int = 512): super().__init__() @@ -175,17 +181,13 @@ def __init__(self, experiment_dir: str, port: int, num_fastapi_process: int = 2, def run(self): logger.info(f"Starting Interchange Server on port {self.port} with {self.num_fastapi_process} processes and {self.max_fastapi_threads} threads per process.") app = get_app(self.max_fastapi_threads) + async def serve_with_monitor(): # Start the server - config = uvicorn.Config( - app=app, - host="0.0.0.0", - port=self.port, - log_level="error", - workers=self.num_fastapi_process - ) + config = uvicorn.Config(app=app, host="0.0.0.0", port=self.port, log_level="error", workers=self.num_fastapi_process) server = uvicorn.Server(config) await server.serve() + try: asyncio.run(serve_with_monitor()) except KeyboardInterrupt as e: @@ -201,11 +203,12 @@ def start_interchange_server(config) -> int: # Find a free port if not specified or invalid port = int(os.environ.get("AJET_DAT_INTERCHANGE_PORT", -1)) - if config.ajet.interchange_server.interchange_server_port != 'auto': + if config.ajet.interchange_server.interchange_server_port != "auto": port = int(config.ajet.interchange_server.interchange_server_port) if port <= 0: import socket + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(("", 0)) port = s.getsockname()[1] @@ -234,7 +237,8 @@ def start_interchange_server(config) -> int: time.sleep(1) # register a termination handler - if DEBUG: logger.info(f"Interchange server subprocess started on port {port} (pid: {interchange_server.pid})") + if DEBUG: + logger.info(f"Interchange server subprocess started on port {port} (pid: {interchange_server.pid})") atexit.register(lambda: interchange_server.terminate()) # return port diff --git a/ajet/utils/async_utils.py b/ajet/utils/async_utils.py index 219aba9c..f6bed79c 100644 --- a/ajet/utils/async_utils.py +++ b/ajet/utils/async_utils.py @@ -2,6 +2,7 @@ import concurrent.futures from typing import Any + def run_async_coroutine_with_timeout(coro, timeout: int = 3600) -> Any: """ Run an async coroutine with a timeout, supporting both inside and outside event loops. diff --git a/ajet/utils/cleaner.py b/ajet/utils/cleaner.py index 3260b084..2ed26de9 100644 --- a/ajet/utils/cleaner.py +++ b/ajet/utils/cleaner.py @@ -38,10 +38,7 @@ def fast_kill_by_keyword_bash( # Build a fast PID collector using pgrep if available; fallback to ps/grep # We prefer pgrep -af to filter by full command and then extract PID (column 1) exclude_filters = " ".join([f"| grep -v -F {shlex.quote(s)}" for s in exclude_substrings]) - pid_list_cmd = ( - f"(pgrep -af -- {shlex.quote(keyword)} 2>/dev/null || true) " - f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" - ) + pid_list_cmd = f"(pgrep -af -- {shlex.quote(keyword)} 2>/dev/null || true) " f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" try: res = subprocess.run( @@ -57,10 +54,7 @@ def fast_kill_by_keyword_bash( # Fallback to ps/grep if pgrep path produced nothing (e.g., no pgrep installed) if not pids: - ps_pid_cmd = ( - f"ps -eo pid,command -ww | grep -F -- {shlex.quote(keyword)} | grep -v grep " - f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" - ) + ps_pid_cmd = f"ps -eo pid,command -ww | grep -F -- {shlex.quote(keyword)} | grep -v grep " f"{exclude_filters} | awk '{{print $1}}' | grep -v -x {self_pid} || true" try: res2 = subprocess.run( ["bash", "-lc", ps_pid_cmd], diff --git a/ajet/utils/compute_madness.py b/ajet/utils/compute_madness.py index 1ed05892..a028dc57 100644 --- a/ajet/utils/compute_madness.py +++ b/ajet/utils/compute_madness.py @@ -9,30 +9,9 @@ # Chinese punctuation "chinese_punct": ",。!?、;:“”‘’()【】《》()——……「」『』", # Emoji ranges - "emoji": ( - "\U0001F300-\U0001F5FF" - "\U0001F600-\U0001F64F" - "\U0001F680-\U0001F6FF" - "\U0001F700-\U0001F77F" - "\U0001F780-\U0001F7FF" - "\U0001F800-\U0001F8FF" - "\U0001F900-\U0001F9FF" - "\U0001FA00-\U0001FA6F" - "\U0001FA70-\U0001FAFF" - "\u2702-\u27B0" - "\u24C2-\U0001F251" - ), + "emoji": ("\U0001F300-\U0001F5FF" "\U0001F600-\U0001F64F" "\U0001F680-\U0001F6FF" "\U0001F700-\U0001F77F" "\U0001F780-\U0001F7FF" "\U0001F800-\U0001F8FF" "\U0001F900-\U0001F9FF" "\U0001FA00-\U0001FA6F" "\U0001FA70-\U0001FAFF" "\u2702-\u27B0" "\u24C2-\U0001F251"), # Chinese characters - "chinese": ( - "\u4E00-\u9FFF" - "\u3400-\u4DBF" - "\U00020000-\U0002A6DF" - "\U0002A700-\U0002B73F" - "\U0002B740-\U0002B81F" - "\U0002B820-\U0002CEAF" - "\uF900-\uFAFF" - "\U0002F800-\U0002FA1F" - ), + "chinese": ("\u4E00-\u9FFF" "\u3400-\u4DBF" "\U00020000-\U0002A6DF" "\U0002A700-\U0002B73F" "\U0002B740-\U0002B81F" "\U0002B820-\U0002CEAF" "\uF900-\uFAFF" "\U0002F800-\U0002FA1F"), } @@ -104,9 +83,7 @@ def compute_string_madness_format(completion, detail, format_type) -> float: # print("think tag order wrong") return -1.0 # remove think part - think_part = completion[ - completion.index(r"") : completion.index(r"") + len(r"") - ] + think_part = completion[completion.index(r"") : completion.index(r"") + len(r"")] rest_part = completion.replace(think_part, "") # Check that ```python and ``` appear exactly once and in order if not rest_part.strip().startswith(r"```python"): diff --git a/ajet/utils/config_computer.py b/ajet/utils/config_computer.py index 3c8c3921..c3a71d7e 100644 --- a/ajet/utils/config_computer.py +++ b/ajet/utils/config_computer.py @@ -85,9 +85,7 @@ def _is_builtin_attribute(self, attr_name): return len(parts) > 1 and parts[0] in builtin_modules -def split_keys_and_operators( - operation_str: str, preserved_field: List[str] = [] -) -> Tuple[List[str], Callable[[Dict[str, Any]], Any]]: +def split_keys_and_operators(operation_str: str, preserved_field: List[str] = []) -> Tuple[List[str], Callable[[Dict[str, Any]], Any]]: """ Parse expression string using AST and extract keys and operators diff --git a/ajet/utils/config_utils.py b/ajet/utils/config_utils.py index e9dd5d3b..8983f733 100644 --- a/ajet/utils/config_utils.py +++ b/ajet/utils/config_utils.py @@ -14,9 +14,7 @@ def read_ajet_config(yaml_fp): """Load a Hydra configuration relative to this module.""" - yaml_fp = os.path.relpath( - yaml_fp, os.path.dirname(__file__) - ) # do not try to understand this line, hydra is too weird + yaml_fp = os.path.relpath(yaml_fp, os.path.dirname(__file__)) # do not try to understand this line, hydra is too weird def load_hydra_config(config_path: str, config_name: str) -> DictConfig: with initialize(config_path=config_path, version_base=None): @@ -124,9 +122,7 @@ def recursive_copy(src_dict, dst_dict, parent_key=""): # set and override config value for to_key in to_keys: _dive_to_set_value(to_config, to_key, value) - logger.success( - f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]" - ) + logger.success(f"[Note]: Aligned parameter from [{from_key}] to [{to_key}] with value: [{value}]") # backbone specific safe guard to_config = config_safe_guard(to_config, backbone) @@ -148,10 +144,7 @@ def config_safe_guard(config: dict, backbone: str) -> dict: if backbone == "trinity": train_batch_size = config["buffer"]["train_batch_size"] world_size = config["cluster"]["gpu_per_node"] * config["cluster"]["node_num"] - vllm_world_size = ( - config["explorer"]["rollout_model"]["tensor_parallel_size"] - * config["explorer"]["rollout_model"]["engine_num"] - ) + vllm_world_size = config["explorer"]["rollout_model"]["tensor_parallel_size"] * config["explorer"]["rollout_model"]["engine_num"] fsdp_world_size = world_size - vllm_world_size # if train_batch_size % fsdp_world_size != 0, train_batch_size + until divisible @@ -159,17 +152,13 @@ def config_safe_guard(config: dict, backbone: str) -> dict: new_train_batch_size = train_batch_size while new_train_batch_size % fsdp_world_size != 0: new_train_batch_size += 1 - logger.warning( - f"[Warning]: trinity backbone detected, but train_batch_size {train_batch_size} is not divisible by fsdp_world_size {fsdp_world_size}. Automatically adjust train_batch_size to {new_train_batch_size}." - ) + logger.warning(f"[Warning]: trinity backbone detected, but train_batch_size {train_batch_size} is not divisible by fsdp_world_size {fsdp_world_size}. Automatically adjust train_batch_size to {new_train_batch_size}.") config["buffer"]["train_batch_size"] = new_train_batch_size return config -def read_ajet_hierarchical_config( - yaml_fp, exp_name, backbone, write_to=None, exp_dir="saved_experiments" -): +def read_ajet_hierarchical_config(yaml_fp, exp_name, backbone, write_to=None, exp_dir="saved_experiments"): if yaml_fp is None: config = { "ajet": {}, @@ -292,9 +281,7 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): else: total_seconds = 5 for i in range(total_seconds): - logger.warning( - f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds..." - ) + logger.warning(f"Warning: backup directory already exists, we will automatically ignore this after {total_seconds - i} seconds...") time.sleep(1) ## 2. copy files to backup @@ -302,9 +289,7 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): BACK_TARGETS = [p for p in BACK_TARGETS if os.path.exists(p)] for backup_target in BACK_TARGETS: - logger.info( - f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}" - ) + logger.info(f"Copying {backup_target} to {os.path.join(backup_dir, os.path.basename(backup_target))}") shutil.copytree( backup_target, os.path.join(backup_dir, os.path.basename(backup_target)), @@ -316,9 +301,7 @@ def prepare_experiment_config(yaml_path, exp_dir, backbone): shutil.copyfile(yaml_backup_src, yaml_backup_dst) ## 4. edit new yaml - config = read_ajet_hierarchical_config( - yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst, exp_dir=exp_dir - ) + config = read_ajet_hierarchical_config(yaml_backup_dst, exp_name, backbone, write_to=yaml_backup_dst, exp_dir=exp_dir) config_final = expand_ajet_hierarchical_config(config, write_to=yaml_backup_dst) return yaml_backup_dst, exe_exp_base, exp_name, config_final diff --git a/ajet/utils/embedding_client.py b/ajet/utils/embedding_client.py index 087c3524..1fa89426 100644 --- a/ajet/utils/embedding_client.py +++ b/ajet/utils/embedding_client.py @@ -32,9 +32,7 @@ def __init__( rate_limit_window (int): The time window in seconds for the rate limit, defaulting to 60 seconds. """ self.api_key = api_key - self.base_url = base_url.rstrip( - "/" - ) # ⭐ Ensures the base URL does not end with a trailing slash + self.base_url = base_url.rstrip("/") # ⭐ Ensures the base URL does not end with a trailing slash self.model_name = model_name # Set up the request headers self.headers = { @@ -42,9 +40,7 @@ def __init__( "Authorization": f"Bearer {self.api_key}", # ⭐ Constructs the authorization header using the provided API key } - logger.info( - f"init OpenAI Embedding client, quota: {rate_limit_calls} times/{rate_limit_window}s" - ) + logger.info(f"init OpenAI Embedding client, quota: {rate_limit_calls} times/{rate_limit_window}s") @retry(stop=stop_after_attempt(4), wait=wait_exponential(multiplier=1, min=4, max=60)) def get_embeddings( @@ -103,9 +99,7 @@ def get_embeddings( json=payload, ) if not response.is_success: - logger.error( - f"failed to request embedding: {response.status_code} {response.reason_phrase}" - ) + logger.error(f"failed to request embedding: {response.status_code} {response.reason_phrase}") try: logger.error(f"err json: {response.json()}") except Exception: @@ -128,9 +122,7 @@ def get_single_embedding(self, text: str, **kwargs) -> List[float]: Returns: List[float]: The embedding vector for the provided text. """ - result = self.get_embeddings( - text, **kwargs - ) # ⭐ Calls the get_embeddings method with the given text and additional arguments + result = self.get_embeddings(text, **kwargs) # ⭐ Calls the get_embeddings method with the given text and additional arguments return result["data"][0]["embedding"] def get_multiple_embeddings(self, texts: Sequence[str], **kwargs) -> List[List[float]]: @@ -144,12 +136,8 @@ def get_multiple_embeddings(self, texts: Sequence[str], **kwargs) -> List[List[f Returns: List[List[float]]: A list of embedding vectors. """ - result = self.get_embeddings( - texts, **kwargs - ) # ⭐ Calls the `get_embeddings` method with provided texts and additional arguments - return [ - item["embedding"] for item in result["data"] - ] # ⭐ Extracts the 'embedding' field from each item in the returned data + result = self.get_embeddings(texts, **kwargs) # ⭐ Calls the `get_embeddings` method with provided texts and additional arguments + return [item["embedding"] for item in result["data"]] # ⭐ Extracts the 'embedding' field from each item in the returned data def set_model(self, model_name: str): """ @@ -177,9 +165,7 @@ def set_api_key(self, api_key: str): api_key (str): The API key for authentication. """ self.api_key = api_key - self.headers[ - "Authorization" - ] = f"Bearer {self.api_key}" # ⭐ Update the authorization header + self.headers["Authorization"] = f"Bearer {self.api_key}" # ⭐ Update the authorization header class EmbeddingClient: @@ -200,13 +186,9 @@ def __init__( self._client = OpenAIEmbeddingClient(api_key=api_key, base_url=base_url, model_name=model) self.similarity_threshold = similarity_threshold - self._chroma_client = chromadb.PersistentClient( - path=chroma_db_path, settings=Settings(anonymized_telemetry=False) - ) + self._chroma_client = chromadb.PersistentClient(path=chroma_db_path, settings=Settings(anonymized_telemetry=False)) - self._collection = self._chroma_client.get_or_create_collection( - name=collection_name, metadata={"hnsw:space": "cosine"} - ) + self._collection = self._chroma_client.get_or_create_collection(name=collection_name, metadata={"hnsw:space": "cosine"}) def add(self, text: str, id: int): """ @@ -339,9 +321,7 @@ def clear(self): """clear all stored texts and embeddings""" try: self._chroma_client.delete_collection(self._collection.name) - self._collection = self._chroma_client.get_or_create_collection( - name=self._collection.name, metadata={"hnsw:space": "cosine"} - ) + self._collection = self._chroma_client.get_or_create_collection(name=self._collection.name, metadata={"hnsw:space": "cosine"}) except Exception as e: print(f"failed to clear stores: {e}") diff --git a/ajet/utils/env_service_client/env_client_ng.py b/ajet/utils/env_service_client/env_client_ng.py index bee86619..93af5d76 100644 --- a/ajet/utils/env_service_client/env_client_ng.py +++ b/ajet/utils/env_service_client/env_client_ng.py @@ -9,9 +9,7 @@ import requests from loguru import logger -LOG_PATH = os.environ.get( - "CLIENT_LOG_PATH", os.path.join(tempfile.gettempdir(), "app_logs", "error.out") -) +LOG_PATH = os.environ.get("CLIENT_LOG_PATH", os.path.join(tempfile.gettempdir(), "app_logs", "error.out")) def retry_call( @@ -28,18 +26,12 @@ def retry_call( try: res = fn() if i > 0: - logger.info( - f"{err_prefix} {action_name} [instance={instance_id}] succeed at try {i+1}/{max_retry}" - ) + logger.info(f"{err_prefix} {action_name} [instance={instance_id}] succeed at try {i+1}/{max_retry}") return res except Exception as e: - logger.info( - f"{err_prefix} {action_name} [instance={instance_id}] retry {i+1}/{max_retry} failed: {e}" - ) + logger.info(f"{err_prefix} {action_name} [instance={instance_id}] retry {i+1}/{max_retry} failed: {e}") if i + 1 == max_retry: - logger.exception( - f"{err_prefix} {action_name} [instance={instance_id}] max retries exceeded, fallback used." - ) + logger.exception(f"{err_prefix} {action_name} [instance={instance_id}] max retries exceeded, fallback used.") raise RuntimeError("Env Service Timeout") wait = random.uniform(min_backoff, max_backoff) time.sleep(wait) @@ -75,9 +67,7 @@ def _make_request( response.raise_for_status() return response.json() except Exception as e: - logger.exception( - f"[{endpoint}] _make_request failed (instance={instance_id}): {e}, data: {data}" - ) + logger.exception(f"[{endpoint}] _make_request failed (instance={instance_id}): {e}, data: {data}") raise Exception(f"Request failed: {str(e)}, data: {data}") def get_env_profile( diff --git a/ajet/utils/launch_utils.py b/ajet/utils/launch_utils.py index 978539ab..c5d9b30b 100644 --- a/ajet/utils/launch_utils.py +++ b/ajet/utils/launch_utils.py @@ -19,9 +19,7 @@ def set_loguru_default_color(): if not colorize: os.environ["RAY_COLOR_PREFIX"] = "0" - logging.getLogger("vllm.entrypoints.openai.tool_parsers.hermes_tool_parser").setLevel( - logging.CRITICAL - ) + logging.getLogger("vllm.entrypoints.openai.tool_parsers.hermes_tool_parser").setLevel(logging.CRITICAL) return @@ -80,9 +78,7 @@ def start_ray_service(args, env, cluster=False): MASTER_PORT = os.getenv("MASTER_PORT") if HOSTNAME == MASTER_ADDR: companion = LaunchCommandWhenAbsent( - full_argument_list=[ - f"{ray_path} start --head --node-ip-address={MASTER_ADDR} --port={MASTER_PORT} --disable-usage-stats --block" - ], + full_argument_list=[f"{ray_path} start --head --node-ip-address={MASTER_ADDR} --port={MASTER_PORT} --disable-usage-stats --block"], dir="./", tag="ray_service_head", use_pty=True, @@ -91,9 +87,7 @@ def start_ray_service(args, env, cluster=False): success_std_string = "Ray runtime started" else: companion = LaunchCommandWhenAbsent( - full_argument_list=[ - f"{ray_path} start --address={MASTER_ADDR}:{MASTER_PORT} --disable-usage-stats --block" - ], + full_argument_list=[f"{ray_path} start --address={MASTER_ADDR}:{MASTER_PORT} --disable-usage-stats --block"], dir="./", tag="ray_service_worker", use_pty=True, @@ -130,6 +124,7 @@ def verify_python_env(args, exp_config): raise ImportError(cause + " " + solution) import verl + if args.backbone == "trinity": if any([v in verl.__version__ for v in ["0.5.0.post", "0.7.0.post"]]): cause = "Python environment does not match current backbone 'trinity'." @@ -181,15 +176,11 @@ def execute_training_process( # Fixed config asset locations TRINITY_BOOT_YAML = "ajet/default_config/trinity/trinity_launch.yaml" # THIS FILE IS READ ONLY, and ALWAYS FIXED - TRINITY_CONFIG_AUTO_CONVERSION = ( - "ajet/default_config/trinity/config_auto_convertion_trinity.jsonc" - ) - VERL_CONFIG_AUTO_CONVERSION = ( - "ajet/default_config/verl/config_auto_convertion_verl.jsonc" - ) + TRINITY_CONFIG_AUTO_CONVERSION = "ajet/default_config/trinity/config_auto_convertion_trinity.jsonc" + VERL_CONFIG_AUTO_CONVERSION = "ajet/default_config/verl/config_auto_convertion_verl.jsonc" - os.makedirs('/tmp/ajet', exist_ok=True) - assert os.path.exists('/tmp/ajet'), "Temporary directory /tmp/ajet cannot be create." + os.makedirs("/tmp/ajet", exist_ok=True) + assert os.path.exists("/tmp/ajet"), "Temporary directory /tmp/ajet cannot be create." # let's begin the training process if args.backbone == "trinity": @@ -228,13 +219,7 @@ def execute_training_process( ] if args.with_logview: - env.update( - { - "BEST_LOGGER_WEB_SERVICE_URL": os.environ.get( - "BEST_LOGGER_WEB_SERVICE_URL", "http://127.0.0.1:8181/" - ) - } - ) + env.update({"BEST_LOGGER_WEB_SERVICE_URL": os.environ.get("BEST_LOGGER_WEB_SERVICE_URL", "http://127.0.0.1:8181/")}) try: logger.info(f"Running command: {' '.join(cmd)}") diff --git a/ajet/utils/lowlevel_hook.py b/ajet/utils/lowlevel_hook.py index 006f17b9..7fa2e4b9 100644 --- a/ajet/utils/lowlevel_hook.py +++ b/ajet/utils/lowlevel_hook.py @@ -6,6 +6,7 @@ import asyncio from functools import wraps + def patch_task_creation(): # Hook asyncio.create_task original_create_task = asyncio.create_task @@ -14,7 +15,7 @@ def patch_task_creation(): def debug_create_task(coro, name=None, **kwargs): if not name: caller = inspect.stack()[1] - coro_name = getattr(coro, '__name__', str(coro)) + coro_name = getattr(coro, "__name__", str(coro)) name = f"DEBUG_{coro_name}_at_{caller.filename.split('/')[-1]}:{caller.lineno}" print(f"🎯 asyncio.create_task: {name}") return original_create_task(coro, name=name, **kwargs) @@ -25,7 +26,7 @@ def debug_create_task(coro, name=None, **kwargs): def debug_loop_create_task(self, coro, name=None, context=None): if not name: caller = inspect.stack()[1] - coro_name = getattr(coro, '__name__', str(coro)) + coro_name = getattr(coro, "__name__", str(coro)) name = f"DEBUG_{coro_name}_at_{caller.filename.split('/')[-1]}:{caller.lineno}" print(f"🎯 loop.create_task: {name}") return original_loop_create_task(self, coro, name=name, context=context) @@ -36,7 +37,7 @@ def debug_loop_create_task(self, coro, name=None, context=None): def debug_task_init(self, coro, loop=None, name=None, context=None): if not name: caller = inspect.stack()[2] # 需要往上找更远的调用者 - coro_name = getattr(coro, '__name__', str(coro)) + coro_name = getattr(coro, "__name__", str(coro)) name = f"DEBUG_{coro_name}_at_{caller.filename.split('/')[-1]}:{caller.lineno}" print(f"🎯 Task.__init__: {name}") return original_task_init(self, coro, loop=loop, name=name, context=context) @@ -44,4 +45,5 @@ def debug_task_init(self, coro, loop=None, name=None, context=None): asyncio.create_task = debug_create_task asyncio.AbstractEventLoop.create_task = debug_loop_create_task + patch_task_creation() diff --git a/ajet/utils/magic_mock.py b/ajet/utils/magic_mock.py index 5a9b1448..baeb6bca 100644 --- a/ajet/utils/magic_mock.py +++ b/ajet/utils/magic_mock.py @@ -1,9 +1,8 @@ class SpecialMagicMock(object): - def __init__(self, allowed_attributes=[]): # Use __dict__ to avoid triggering __setattr__ - self.__dict__['allowed_attributes'] = allowed_attributes - self.__dict__['attr_store'] = {} + self.__dict__["allowed_attributes"] = allowed_attributes + self.__dict__["attr_store"] = {} def __getattr__(self, name): if name in self.allowed_attributes: @@ -14,8 +13,8 @@ def __getattr__(self, name): def __setattr__(self, name, value): if name in self.allowed_attributes: # Use __dict__ to avoid recursion - self.__dict__['attr_store'][name] = value - elif name in ('allowed_attributes', 'attr_store'): + self.__dict__["attr_store"][name] = value + elif name in ("allowed_attributes", "attr_store"): # Allow setting internal attributes directly self.__dict__[name] = value else: diff --git a/ajet/utils/metric_helper/__init__.py b/ajet/utils/metric_helper/__init__.py index 70ce2818..dc518016 100644 --- a/ajet/utils/metric_helper/__init__.py +++ b/ajet/utils/metric_helper/__init__.py @@ -7,7 +7,8 @@ def save_trajectory_as_json_file(ctx_trackers, global_steps, config, prefix): if config.ajet.trainer_common.save_trajectory_as_json_file: save_trajectory_as_json(ctx_trackers, global_steps, prefix) -def update_metrics(context_tracker_arr, metrics:dict): + +def update_metrics(context_tracker_arr, metrics: dict): tool_metrics = compute_tool_metrics_from_trajectories(context_tracker_arr) reward_metrics = compute_reward_metrics_from_trajectories(context_tracker_arr) if tool_metrics: diff --git a/ajet/utils/metric_helper/reward_metric_helper.py b/ajet/utils/metric_helper/reward_metric_helper.py index a2b69bc4..5a5b2303 100644 --- a/ajet/utils/metric_helper/reward_metric_helper.py +++ b/ajet/utils/metric_helper/reward_metric_helper.py @@ -27,9 +27,9 @@ def extract_reward_stats_from_trajectories(trajectories: List[Any]) -> List[Dict """ reward_stats_list = [] for traj in trajectories: - if hasattr(traj, 'workflow_metadata') and traj.workflow_metadata: - if 'reward_stats' in traj.workflow_metadata: - reward_stats_list.append(traj.workflow_metadata['reward_stats']) + if hasattr(traj, "workflow_metadata") and traj.workflow_metadata: + if "reward_stats" in traj.workflow_metadata: + reward_stats_list.append(traj.workflow_metadata["reward_stats"]) return reward_stats_list @@ -45,17 +45,17 @@ def extract_reward_stats_from_cmts(cmts: List[Any]) -> tuple[List[Dict[str, Any] """ reward_stats_list = [] debug_stats = { - 'total_cmts': len(cmts), - 'has_workflow_metadata': 0, - 'has_reward_stats': 0, + "total_cmts": len(cmts), + "has_workflow_metadata": 0, + "has_reward_stats": 0, } for _cmt in cmts: - if hasattr(_cmt, 'workflow_metadata') and _cmt.workflow_metadata: - debug_stats['has_workflow_metadata'] += 1 - if 'reward_stats' in _cmt.workflow_metadata: - debug_stats['has_reward_stats'] += 1 - reward_stats_list.append(_cmt.workflow_metadata['reward_stats']) + if hasattr(_cmt, "workflow_metadata") and _cmt.workflow_metadata: + debug_stats["has_workflow_metadata"] += 1 + if "reward_stats" in _cmt.workflow_metadata: + debug_stats["has_reward_stats"] += 1 + reward_stats_list.append(_cmt.workflow_metadata["reward_stats"]) return reward_stats_list, debug_stats @@ -82,10 +82,10 @@ def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str metrics = {} # ========== Top-level Scores (General) ========== - final_reward_list = [rs.get('final_reward', 0.0) for rs in reward_stats_list] - fused_reward_list = [rs.get('fused_reward', 0.0) for rs in reward_stats_list] - penalty_list = [rs.get('penalty', 0.0) for rs in reward_stats_list] - step_reward_list = [rs.get('step_reward', 0.0) for rs in reward_stats_list] + final_reward_list = [rs.get("final_reward", 0.0) for rs in reward_stats_list] + fused_reward_list = [rs.get("fused_reward", 0.0) for rs in reward_stats_list] + penalty_list = [rs.get("penalty", 0.0) for rs in reward_stats_list] + step_reward_list = [rs.get("step_reward", 0.0) for rs in reward_stats_list] # Penalty statistics non_zero_penalties = [p for p in penalty_list if p != 0.0] @@ -99,7 +99,7 @@ def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str metrics[f"{prefix}rewards/penalty_rate"] = len(non_zero_penalties) / n * 100 if n > 0 else 0.0 # ========== Detect OpenJudge Usage ========== - openjudge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('openjudge_enabled', False)) + openjudge_enabled_count = sum(1 for rs in reward_stats_list if rs.get("openjudge_enabled", False)) if openjudge_enabled_count > 0: # ========== OpenJudge Metrics ========== @@ -131,7 +131,7 @@ def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str metrics[f"{prefix}rewards/openjudge/{grader_name}_contribution_mean"] = float(np.mean(contrib_list)) # OpenJudge time consumption statistics - grading_time_list = [rs.get('grading_time', 0.0) for rs in reward_stats_list] + grading_time_list = [rs.get("grading_time", 0.0) for rs in reward_stats_list] if any(v != 0.0 for v in grading_time_list): metrics[f"{prefix}judge_time/openjudge_grading_time_mean"] = float(np.mean(grading_time_list)) metrics[f"{prefix}judge_time/openjudge_grading_time_max"] = float(np.max(grading_time_list)) @@ -139,18 +139,18 @@ def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str # ========== RM Gallery Metrics ========== # RM Gallery - rm_raw_list = [rs.get('rm_raw', 0.0) for rs in reward_stats_list] - rm_contribution_list = [rs.get('rm_contribution', 0.0) for rs in reward_stats_list] + rm_raw_list = [rs.get("rm_raw", 0.0) for rs in reward_stats_list] + rm_contribution_list = [rs.get("rm_contribution", 0.0) for rs in reward_stats_list] # RefJudge - ref_final_raw_list = [rs.get('ref_final_raw', 0.0) for rs in reward_stats_list] - ref_citation_raw_list = [rs.get('ref_citation_raw', 0.0) for rs in reward_stats_list] - ref_grounding_raw_list = [rs.get('ref_grounding_raw', 0.0) for rs in reward_stats_list] - ref_contribution_list = [rs.get('ref_contribution', 0.0) for rs in reward_stats_list] + ref_final_raw_list = [rs.get("ref_final_raw", 0.0) for rs in reward_stats_list] + ref_citation_raw_list = [rs.get("ref_citation_raw", 0.0) for rs in reward_stats_list] + ref_grounding_raw_list = [rs.get("ref_grounding_raw", 0.0) for rs in reward_stats_list] + ref_contribution_list = [rs.get("ref_contribution", 0.0) for rs in reward_stats_list] # StructureJudge - structure_raw_list = [rs.get('structure_raw', 0.0) for rs in reward_stats_list] - structure_contribution_list = [rs.get('structure_contribution', 0.0) for rs in reward_stats_list] + structure_raw_list = [rs.get("structure_raw", 0.0) for rs in reward_stats_list] + structure_contribution_list = [rs.get("structure_contribution", 0.0) for rs in reward_stats_list] # dimensions/ raw scores metrics[f"{prefix}rewards/dimensions/rm_raw_mean"] = float(np.mean(rm_raw_list)) @@ -165,17 +165,17 @@ def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str metrics[f"{prefix}rewards/contribution/structure_contribution_mean"] = float(np.mean(structure_contribution_list)) # Enabled state statistics - ref_judge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('ref_judge_enabled', False)) + ref_judge_enabled_count = sum(1 for rs in reward_stats_list if rs.get("ref_judge_enabled", False)) if ref_judge_enabled_count > 0: metrics[f"{prefix}rewards/ref_judge_enabled_rate"] = ref_judge_enabled_count / n * 100 - structure_judge_enabled_count = sum(1 for rs in reward_stats_list if rs.get('structure_judge_enabled', False)) + structure_judge_enabled_count = sum(1 for rs in reward_stats_list if rs.get("structure_judge_enabled", False)) if structure_judge_enabled_count > 0: metrics[f"{prefix}rewards/structure_judge_enabled_rate"] = structure_judge_enabled_count / n * 100 # Time consumption statistics - rm_time_list = [rs.get('rm_time', 0.0) for rs in reward_stats_list] - refstruc_time_list = [rs.get('refstruc_time', 0.0) for rs in reward_stats_list] + rm_time_list = [rs.get("rm_time", 0.0) for rs in reward_stats_list] + refstruc_time_list = [rs.get("refstruc_time", 0.0) for rs in reward_stats_list] metrics[f"{prefix}judge_time/rm_time_mean"] = float(np.mean(rm_time_list)) metrics[f"{prefix}judge_time/refstruc_time_mean"] = float(np.mean(refstruc_time_list)) @@ -186,7 +186,7 @@ def compute_reward_metrics(reward_stats_list: List[Dict[str, Any]], prefix: str metrics[f"{prefix}judge_time/refstruc_time_max"] = float(np.max(refstruc_time_list)) # ========== General Time Consumption Statistics ========== - judge_total_time_list = [rs.get('judge_total_time', 0.0) for rs in reward_stats_list] + judge_total_time_list = [rs.get("judge_total_time", 0.0) for rs in reward_stats_list] if any(v != 0.0 for v in judge_total_time_list): metrics[f"{prefix}judge_time/judge_total_time_mean"] = float(np.mean(judge_total_time_list)) metrics[f"{prefix}judge_time/judge_total_time_max"] = float(np.max(judge_total_time_list)) diff --git a/ajet/utils/metric_helper/save_trajectory_as_json.py b/ajet/utils/metric_helper/save_trajectory_as_json.py index 344a6ab4..c9bb16b0 100644 --- a/ajet/utils/metric_helper/save_trajectory_as_json.py +++ b/ajet/utils/metric_helper/save_trajectory_as_json.py @@ -25,25 +25,15 @@ def save_trajectory_as_json(ctx_trackers, global_steps, prefix="train"): formatted_traj = convert_grouped_steps_to_openai_format(ctx_tracker.timeline_cache) # Prepare trajectory data - traj_data = { - "task_id": ctx_tracker.task_id, - "task_tag": ctx_tracker.tag, - "reward_structure": ctx_tracker.reward_structure.model_dump(), - "traj": formatted_traj - } + traj_data = {"task_id": ctx_tracker.task_id, "task_tag": ctx_tracker.tag, "reward_structure": ctx_tracker.reward_structure.model_dump(), "traj": formatted_traj} # Extract reward_stats from workflow_metadata if available - if hasattr(ctx_tracker, 'workflow_metadata') and ctx_tracker.workflow_metadata: - if 'reward_stats' in ctx_tracker.workflow_metadata: - traj_data['reward_structure']['reward_stats'] = ctx_tracker.workflow_metadata['reward_stats'] + if hasattr(ctx_tracker, "workflow_metadata") and ctx_tracker.workflow_metadata: + if "reward_stats" in ctx_tracker.workflow_metadata: + traj_data["reward_structure"]["reward_stats"] = ctx_tracker.workflow_metadata["reward_stats"] # Define save directory and file path - traj_save_dir = os.path.join( - os.environ.get("BEST_LOGGER_PATH", "launcher_record"), - "ctx_trackers", - prefix, - f"step_{global_steps}" - ) + traj_save_dir = os.path.join(os.environ.get("BEST_LOGGER_PATH", "launcher_record"), "ctx_trackers", prefix, f"step_{global_steps}") os.makedirs(traj_save_dir, exist_ok=True) traj_file_path = os.path.join(traj_save_dir, f"{ctx_tracker.task_id}.json") diff --git a/ajet/utils/metric_helper/tool_metric_helper.py b/ajet/utils/metric_helper/tool_metric_helper.py index e9c7728d..b58aad03 100644 --- a/ajet/utils/metric_helper/tool_metric_helper.py +++ b/ajet/utils/metric_helper/tool_metric_helper.py @@ -27,9 +27,9 @@ def extract_tool_stats_from_trajectories(trajectories: List[Any]) -> List[Dict[s """ tool_stats_list = [] for traj in trajectories: - if hasattr(traj, 'workflow_metadata') and traj.workflow_metadata: - if 'tool_stats' in traj.workflow_metadata: - tool_stats_list.append(traj.workflow_metadata['tool_stats']) + if hasattr(traj, "workflow_metadata") and traj.workflow_metadata: + if "tool_stats" in traj.workflow_metadata: + tool_stats_list.append(traj.workflow_metadata["tool_stats"]) return tool_stats_list @@ -45,9 +45,9 @@ def extract_tool_stats_from_cmts(cmts: List[Any]) -> List[Dict[str, Any]]: """ tool_stats_list = [] for traj in trajs: - if hasattr(traj, 'workflow_metadata') and traj.workflow_metadata: - if 'tool_stats' in traj.workflow_metadata: - tool_stats_list.append(traj.workflow_metadata['tool_stats']) + if hasattr(traj, "workflow_metadata") and traj.workflow_metadata: + if "tool_stats" in traj.workflow_metadata: + tool_stats_list.append(traj.workflow_metadata["tool_stats"]) return tool_stats_list @@ -68,11 +68,11 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" metrics = {} # ========== 1. Overall Statistics ========== - total_calls_list = [stats.get('total_calls', 0) for stats in tool_stats_list] - success_calls_list = [stats.get('success_calls', 0) for stats in tool_stats_list] - error_calls_list = [stats.get('total_errors', 0) for stats in tool_stats_list] - cache_hits_list = [stats.get('cache_hits', 0) for stats in tool_stats_list] - cache_misses_list = [stats.get('cache_misses', 0) for stats in tool_stats_list] + total_calls_list = [stats.get("total_calls", 0) for stats in tool_stats_list] + success_calls_list = [stats.get("success_calls", 0) for stats in tool_stats_list] + error_calls_list = [stats.get("total_errors", 0) for stats in tool_stats_list] + cache_hits_list = [stats.get("cache_hits", 0) for stats in tool_stats_list] + cache_misses_list = [stats.get("cache_misses", 0) for stats in tool_stats_list] # Calculate overall success rate total_calls_sum = sum(total_calls_list) @@ -83,20 +83,22 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" cache_total = sum(cache_hits_list) + sum(cache_misses_list) cache_hit_rate = (sum(cache_hits_list) / cache_total * 100) if cache_total > 0 else 0.0 - metrics.update({ - f"{prefix}tool_stats/tool_success_rate": tool_success_rate, - f"{prefix}tool_stats/tool_total_calls": float(np.mean(total_calls_list)), - f"{prefix}tool_stats/tool_success_calls": float(np.mean(success_calls_list)), - f"{prefix}tool_stats/tool_error_calls": float(np.mean(error_calls_list)), - f"{prefix}tool_stats/tool_cache_hit_rate": cache_hit_rate, - f"{prefix}tool_stats/tool_cache_hits": float(np.mean(cache_hits_list)), - f"{prefix}tool_stats/tool_cache_misses": float(np.mean(cache_misses_list)), - }) + metrics.update( + { + f"{prefix}tool_stats/tool_success_rate": tool_success_rate, + f"{prefix}tool_stats/tool_total_calls": float(np.mean(total_calls_list)), + f"{prefix}tool_stats/tool_success_calls": float(np.mean(success_calls_list)), + f"{prefix}tool_stats/tool_error_calls": float(np.mean(error_calls_list)), + f"{prefix}tool_stats/tool_cache_hit_rate": cache_hit_rate, + f"{prefix}tool_stats/tool_cache_hits": float(np.mean(cache_hits_list)), + f"{prefix}tool_stats/tool_cache_misses": float(np.mean(cache_misses_list)), + } + ) # ========== 2. Time Consumption Statistics by Tool ========== tool_time_by_name = {} for stats in tool_stats_list: - tool_time_dict = stats.get('tool_time', {}) + tool_time_dict = stats.get("tool_time", {}) for tool_name, time_list in tool_time_dict.items(): if tool_name not in tool_time_by_name: tool_time_by_name[tool_name] = [] @@ -112,16 +114,16 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" # ========== 3. Cache Hit Rate by Tool ========== tool_cache_by_name = {} for stats in tool_stats_list: - tool_cache_stats = stats.get('tool_cache_stats', {}) + tool_cache_stats = stats.get("tool_cache_stats", {}) for tool_name, cache_info in tool_cache_stats.items(): if tool_name not in tool_cache_by_name: - tool_cache_by_name[tool_name] = {'hits': 0, 'misses': 0} - tool_cache_by_name[tool_name]['hits'] += cache_info.get('hits', 0) - tool_cache_by_name[tool_name]['misses'] += cache_info.get('misses', 0) + tool_cache_by_name[tool_name] = {"hits": 0, "misses": 0} + tool_cache_by_name[tool_name]["hits"] += cache_info.get("hits", 0) + tool_cache_by_name[tool_name]["misses"] += cache_info.get("misses", 0) for tool_name, cache_info in tool_cache_by_name.items(): - hits = cache_info['hits'] - misses = cache_info['misses'] + hits = cache_info["hits"] + misses = cache_info["misses"] total = hits + misses if total > 0: hit_rate = hits / total * 100 @@ -132,16 +134,16 @@ def compute_tool_metrics(tool_stats_list: List[Dict[str, Any]], prefix: str = "" # ========== 4. Error Rate by Tool ========== tool_error_by_name = {} for stats in tool_stats_list: - tool_error_stats = stats.get('tool_error_stats', {}) + tool_error_stats = stats.get("tool_error_stats", {}) for tool_name, error_info in tool_error_stats.items(): if tool_name not in tool_error_by_name: - tool_error_by_name[tool_name] = {'calls': 0, 'errors': 0} - tool_error_by_name[tool_name]['calls'] += error_info.get('calls', 0) - tool_error_by_name[tool_name]['errors'] += error_info.get('errors', 0) + tool_error_by_name[tool_name] = {"calls": 0, "errors": 0} + tool_error_by_name[tool_name]["calls"] += error_info.get("calls", 0) + tool_error_by_name[tool_name]["errors"] += error_info.get("errors", 0) for tool_name, error_info in tool_error_by_name.items(): - calls = error_info['calls'] - errors = error_info['errors'] + calls = error_info["calls"] + errors = error_info["errors"] if calls > 0: error_rate = errors / calls * 100 metrics[f"{prefix}tool_error/{tool_name}/error_rate"] = round(error_rate, 2) diff --git a/ajet/utils/msg_converter.py b/ajet/utils/msg_converter.py index 0437f5ca..de50d5fc 100644 --- a/ajet/utils/msg_converter.py +++ b/ajet/utils/msg_converter.py @@ -25,11 +25,11 @@ from typing import List, Dict, Any, Union - # ============================================================================= # ExtendedMessage -> OpenAI conversion (backward compatible functions) # ============================================================================= + def convert_ext_msg_to_openai_format(ext_msg: Any) -> Dict[str, Any]: """ Convert a single ExtendedMessage or dict to OpenAI format message. @@ -40,6 +40,7 @@ def convert_ext_msg_to_openai_format(ext_msg: Any) -> Dict[str, Any]: Returns: Message dict in OpenAI format """ + # Helper function: get attribute value def get_attr(obj, attr_name, default=None): if hasattr(obj, attr_name): @@ -49,37 +50,26 @@ def get_attr(obj, attr_name, default=None): return default # Check if there are tool_calls (assistant initiates tool call) - tool_calls = get_attr(ext_msg, 'tool_calls') + tool_calls = get_attr(ext_msg, "tool_calls") has_tool_calls = bool(tool_calls) # Check if there's tool_call_id (tool return result) - tool_call_id = get_attr(ext_msg, 'tool_call_id') + tool_call_id = get_attr(ext_msg, "tool_call_id") has_tool_call_id = bool(tool_call_id) # Get basic attributes - role = get_attr(ext_msg, 'role', 'user') - content = get_attr(ext_msg, 'content', '') + role = get_attr(ext_msg, "role", "user") + content = get_attr(ext_msg, "content", "") if has_tool_calls: # Assistant message contains tool_calls -> keep OpenAI format - msg_dict = { - "role": "assistant", - "content": content if content else "", - "tool_calls": tool_calls - } + msg_dict = {"role": "assistant", "content": content if content else "", "tool_calls": tool_calls} elif has_tool_call_id: # Tool return result -> use OpenAI format (role: "tool") - msg_dict = { - "role": "tool", - "content": content if content else "", - "tool_call_id": tool_call_id - } + msg_dict = {"role": "tool", "content": content if content else "", "tool_call_id": tool_call_id} else: # Normal message, keep original format - msg_dict = { - "role": role, - "content": content if content else "" - } + msg_dict = {"role": role, "content": content if content else ""} return msg_dict diff --git a/ajet/utils/networking.py b/ajet/utils/networking.py index f2fed5ac..38bac512 100644 --- a/ajet/utils/networking.py +++ b/ajet/utils/networking.py @@ -1,9 +1,10 @@ import socket + def find_free_port() -> int: """Find a free port on the system.""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind(('', 0)) + s.bind(("", 0)) s.listen(1) port = s.getsockname()[1] return port @@ -19,11 +20,8 @@ def get_host_ip(interface=None): try: import fcntl import struct - ip = socket.inet_ntoa(fcntl.ioctl( - s.fileno(), - 0x8915, # SIOCGIFADDR - struct.pack('256s', interface[:15].encode()) - )[20:24]) + + ip = socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack("256s", interface[:15].encode()))[20:24]) # SIOCGIFADDR return ip except (ImportError, IOError): pass @@ -33,5 +31,4 @@ def get_host_ip(interface=None): return ip except Exception: - return "127.0.0.1" diff --git a/ajet/utils/process_dataset.py b/ajet/utils/process_dataset.py index 44f23698..917b5053 100644 --- a/ajet/utils/process_dataset.py +++ b/ajet/utils/process_dataset.py @@ -23,9 +23,7 @@ from verl.utils.import_utils import load_extern_type -def create_rl_sampler( - data_config: DictConfig, dataset: TorchDataset -) -> Union[RandomSampler, SequentialSampler, AbstractSampler]: +def create_rl_sampler(data_config: DictConfig, dataset: TorchDataset) -> Union[RandomSampler, SequentialSampler, AbstractSampler]: """Create a sampler for the dataset. Arguments: @@ -45,11 +43,7 @@ def create_rl_sampler( data_config=data_config, ) assert isinstance(sampler, AbstractSampler) - assert data_config.get("dataloader_num_workers", 8) == 0, ( - "If using curriculum, num_workers must be 0 to prevent data caching. " - "If the dataloader caches data before the batch is done the " - "curriculum sampler won't have the opportunity to reorder it. " - ) + assert data_config.get("dataloader_num_workers", 8) == 0, "If using curriculum, num_workers must be 0 to prevent data caching. " "If the dataloader caches data before the batch is done the " "curriculum sampler won't have the opportunity to reorder it. " # Use a sampler to facilitate checkpoint resumption. # If shuffling is enabled in the data configuration, create a random sampler. diff --git a/ajet/utils/pty.py b/ajet/utils/pty.py index 6d859ae1..2affd1fc 100644 --- a/ajet/utils/pty.py +++ b/ajet/utils/pty.py @@ -41,7 +41,7 @@ def master_read(fd): # log_f.flush() # Also print to stdout (optional) # Use errors='replace' to handle incomplete UTF-8 sequences - print(data.decode(errors='replace'), end="") + print(data.decode(errors="replace"), end="") return data # Define stdin read callback @@ -119,9 +119,7 @@ def pty_launch(service_name: str, success_std_string="Starting server on"): import argparse import json - parser = argparse.ArgumentParser( - description="Run a shell command in a PTY with logging and custom env." - ) + parser = argparse.ArgumentParser(description="Run a shell command in a PTY with logging and custom env.") parser.add_argument("--human-cmd", type=str, help="Shell command to run (as a string)") parser.add_argument("--dir", type=str, default=".", help="Working directory") parser.add_argument( diff --git a/ajet/utils/retry.py b/ajet/utils/retry.py index 339eb7bb..4fd84e0c 100644 --- a/ajet/utils/retry.py +++ b/ajet/utils/retry.py @@ -36,15 +36,11 @@ def wrapper(*args: Any, **kwargs: Any) -> T: raise exc except Exception as exc: # noqa: BLE001 if attempt < target_max_retry - 1: - logger.bind(exception=True).exception( - f"{func.__name__} error: {exc.args}, retrying {attempt + 1}/{target_max_retry}" - ) + logger.bind(exception=True).exception(f"{func.__name__} error: {exc.args}, retrying {attempt + 1}/{target_max_retry}") sleep_seconds = backoff_fn(attempt) if backoff_fn else 2**attempt time.sleep(sleep_seconds) else: - logger.bind(exception=True).exception( - f"{func.__name__} failed after {target_max_retry} retries: {exc.args}" - ) + logger.bind(exception=True).exception(f"{func.__name__} failed after {target_max_retry} retries: {exc.args}") raise raise RuntimeError("retry_with_backoff exhausted attempts") diff --git a/ajet/utils/robust_dashscope.py b/ajet/utils/robust_dashscope.py index ab8f2b93..3cfc90f6 100644 --- a/ajet/utils/robust_dashscope.py +++ b/ajet/utils/robust_dashscope.py @@ -22,11 +22,7 @@ def __init__(self, model_name="qwen3-max", stream=False, max_try=4, **kwargs): # Parse API keys from environment variables self.regular_key_list = os.environ.get("DASHSCOPE_API_KEY", "").split("|") - self.backup_key_list = ( - os.environ.get("DASHSCOPE_API_KEY_BACKUP", "").split("|") - if os.environ.get("DASHSCOPE_API_KEY_BACKUP") - else [] - ) + self.backup_key_list = os.environ.get("DASHSCOPE_API_KEY_BACKUP", "").split("|") if os.environ.get("DASHSCOPE_API_KEY_BACKUP") else [] api_key = random.choice(self.regular_key_list) @@ -104,6 +100,4 @@ async def __call__( print(f"Error calling DashScope API: {e}, retrying ({n_try + 1}/{self.max_try})...") # If all attempts fail - raise RuntimeError( - f"Failed to get response from DashScope API after {self.max_try} attempts" - ) + raise RuntimeError(f"Failed to get response from DashScope API after {self.max_try} attempts") diff --git a/ajet/utils/sample.py b/ajet/utils/sample.py index d82f6b22..0e2bbcb9 100644 --- a/ajet/utils/sample.py +++ b/ajet/utils/sample.py @@ -7,9 +7,7 @@ def get_sample_params(mode, config): Returns: dict: Sampling parameters for the model. """ - response_length_eps = ( - 16 # Reserve a few tokens for later handling of special tokens like lm_start. - ) + response_length_eps = 16 # Reserve a few tokens for later handling of special tokens like lm_start. if config.ajet.rollout.name == "vllm": # VLLM uses max_tokens instead of max_new_tokens sampling_params = dict( diff --git a/ajet/utils/sington.py b/ajet/utils/sington.py index 3a994aa8..b46095c5 100644 --- a/ajet/utils/sington.py +++ b/ajet/utils/sington.py @@ -1,4 +1,3 @@ - def singleton(cls): instances = {} diff --git a/ajet/utils/smart_daemon.py b/ajet/utils/smart_daemon.py index 25dac766..b3702f34 100644 --- a/ajet/utils/smart_daemon.py +++ b/ajet/utils/smart_daemon.py @@ -226,9 +226,7 @@ def launch( logger.warning("Force restarting") self._kill_existing_process_group(pgid) else: - logger.success( - f"Script is already running, skipping launch. pgid: {pgid}. Command [{' '.join(self.cmd)}]" - ) + logger.success(f"Script is already running, skipping launch. pgid: {pgid}. Command [{' '.join(self.cmd)}]") return "" try: # Set up process creation flags and environment @@ -241,9 +239,7 @@ def launch( if os.name == "nt": # Windows # DETACHED_PROCESS flag - raise NotImplementedError( - "Windows support is not implemented yet. Please open a feature request." - ) + raise NotImplementedError("Windows support is not implemented yet. Please open a feature request.") else: # Unix-like systems @@ -259,7 +255,7 @@ def launch( "Command": " ".join(self.cmd), "LogFile": str(log_file), }, - header = "Smart Daemon Launch", + header="Smart Daemon Launch", ) f = open(log_file, "a") @@ -307,7 +303,7 @@ def launch( "LogFile": str(log_file), "Converted": " ".join(converted_cmd), }, - header = "Smart Daemon Launch - PTY", + header="Smart Daemon Launch - PTY", ) proc = subprocess.Popen( converted_cmd, @@ -342,16 +338,12 @@ def launch( if success_std_string in f_read: hit_success_string = True hit_success_string_content = success_std_string - print( - f"Found success string '{hit_success_string_content}' in output" - ) + print(f"Found success string '{hit_success_string_content}' in output") break # if we have reached finish line, then break if hit_success_string: f_read_trim = inc_read # .replace("\n", " ") - print( - f"Waiting for process launch [PGID {pgid}, PID {proc.pid}] ({f_read_trim})" - ) + print(f"Waiting for process launch [PGID {pgid}, PID {proc.pid}] ({f_read_trim})") break # let hold for one second @@ -363,9 +355,7 @@ def launch( if f_read_trim: if previous_r_print: print("") - print( - f"Waiting for process launch [PGID {pgid}, PID {proc.pid}]... {remaining}s remaining ({f_read_trim})" - ) + print(f"Waiting for process launch [PGID {pgid}, PID {proc.pid}]... {remaining}s remaining ({f_read_trim})") previous_r_print = False else: print( @@ -378,19 +368,13 @@ def launch( if remaining % 10 == 0: is_running, proc = self.is_pgid_running(pgid) if not is_running: - raise RuntimeError( - f"Process with PGID {pgid} is not running, cannot confirm launch" - ) + raise RuntimeError(f"Process with PGID {pgid} is not running, cannot confirm launch") else: if success_std_string: - raise TimeoutError( - f"Process did not output success string '{success_std_string}' within {launch_wait_time} seconds" - ) + raise TimeoutError(f"Process did not output success string '{success_std_string}' within {launch_wait_time} seconds") - logger.success( - f"Successfully launched {self.cmd} with PID {proc.pid} (Discovered {hit_success_string_content})" - ) + logger.success(f"Successfully launched {self.cmd} with PID {proc.pid} (Discovered {hit_success_string_content})") print_dict( { "Result": "Successfully launched", diff --git a/ajet/utils/testing_utils.py b/ajet/utils/testing_utils.py index 22be6092..faf1e672 100644 --- a/ajet/utils/testing_utils.py +++ b/ajet/utils/testing_utils.py @@ -118,21 +118,13 @@ def populate_test_env_metadata(workspace_dir: str) -> tuple[str, str]: """Capture git hash and pip freeze output, store them in env, return both.""" git_hash = "unknown" try: - git_hash = ( - subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=workspace_dir) - .decode() - .strip() - ) + git_hash = subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=workspace_dir).decode().strip() except (subprocess.CalledProcessError, FileNotFoundError): pass req_txt = "" try: - req_txt = ( - subprocess.check_output([sys.executable, "-m", "pip", "freeze"], cwd=workspace_dir) - .decode() - .strip() - ) + req_txt = subprocess.check_output([sys.executable, "-m", "pip", "freeze"], cwd=workspace_dir).decode().strip() except (subprocess.CalledProcessError, FileNotFoundError): pass @@ -197,9 +189,7 @@ def __call__(self, key, log_dict): step = log_dict["step"] if time.time() - self.begin_time > self.expected_train_time: - msg = ( - f"Training time exceeded expected limit of {self.expected_train_time} seconds." - ) + msg = f"Training time exceeded expected limit of {self.expected_train_time} seconds." update_benchmark_status( status="fail", status_detail=msg, @@ -233,9 +223,7 @@ def __call__(self, key, log_dict): ) raise TestFailException(err) # compute local average reward over last self.reward_expectation_avg_window steps - local_avg_reward = sum( - self.reward_array[-self.reward_expectation_avg_window :] - ) / min(self.reward_expectation_avg_window, len(self.reward_array)) + local_avg_reward = sum(self.reward_array[-self.reward_expectation_avg_window :]) / min(self.reward_expectation_avg_window, len(self.reward_array)) # get expected range low, high = self.reward_expectation[step] # log diff --git a/ajet/utils/thread_executors.py b/ajet/utils/thread_executors.py index 1ab02baf..6981408c 100644 --- a/ajet/utils/thread_executors.py +++ b/ajet/utils/thread_executors.py @@ -2,7 +2,6 @@ import concurrent.futures - @singleton class SharedInterchangeThreadExecutor: def __init__(self, max_workers=64): @@ -12,7 +11,6 @@ def get_shared_executor(self) -> concurrent.futures.ThreadPoolExecutor: return self.executor - @singleton class SharedInferenceTrackerThreadExecutor: def __init__(self, max_workers=64): diff --git a/ajet/utils/vsdb.py b/ajet/utils/vsdb.py index eb54b4a7..21d0369b 100644 --- a/ajet/utils/vsdb.py +++ b/ajet/utils/vsdb.py @@ -21,41 +21,43 @@ """ -def vscode_conditional_breakpoint(tag=None, once=True): - env_tag = f'HIT_BREAKPOINT_REC_{tag}' - if not os.getenv('RAY_DEBUG_POST_MORTEM'): return - if tag is None: - if once: - if os.getenv(env_tag, "") != "1": - os.environ[env_tag] = "1" - breakpoint() - return - else: - breakpoint() - return - else: - debug_tags = os.getenv('DEBUG_TAGS', '').split('|') - if tag in debug_tags: - if once: +def vscode_conditional_breakpoint(tag=None, once=True): + env_tag = f"HIT_BREAKPOINT_REC_{tag}" + if not os.getenv("RAY_DEBUG_POST_MORTEM"): + return + if tag is None: + if once: if os.getenv(env_tag, "") != "1": - os.environ[env_tag] = "1" - breakpoint() - return - else: + os.environ[env_tag] = "1" + breakpoint() + return + else: breakpoint() return + else: + debug_tags = os.getenv("DEBUG_TAGS", "").split("|") + if tag in debug_tags: + if once: + if os.getenv(env_tag, "") != "1": + os.environ[env_tag] = "1" + breakpoint() + return + else: + breakpoint() + return def objdump(obj, file="objdump.tmp"): - with open(file, "wb+") as f: - pickle.dump(obj, f) - return + with open(file, "wb+") as f: + pickle.dump(obj, f) + return def objload(file="objdump.tmp"): - import os - if not os.path.exists(file): - return - with open(file, "rb") as f: - return pickle.load(f) + import os + + if not os.path.exists(file): + return + with open(file, "rb") as f: + return pickle.load(f) diff --git a/docs/index.md b/docs/index.md index 5583fa69..60963908 100644 --- a/docs/index.md +++ b/docs/index.md @@ -77,11 +77,10 @@ ## ✈️ Quick Start -
    -

    Click Here for the Full Installation Document

    + - We recommend using `uv` for dependency management. [Click here](en/installation.md) for details and other training backbone (e.g. Trinity-RFT) options. - Clone the Repository: diff --git a/scripts/converter_hf_to_mcore.py b/scripts/converter_hf_to_mcore.py index 7f315f62..ea479bdb 100644 --- a/scripts/converter_hf_to_mcore.py +++ b/scripts/converter_hf_to_mcore.py @@ -92,9 +92,7 @@ def test_conversion(megatron_model_provider, tfconfig, output_path, model): dut_data = dut_state_dict[name].data if name in ref_state_dict: ref_data = ref_state_dict[name].data - assert ( - dut_data.shape == ref_state_dict.shape - ), f"{name=} {dut_data.shape=} {ref_data.shape=}" + assert dut_data.shape == ref_state_dict.shape, f"{name=} {dut_data.shape=} {ref_data.shape=}" assert (dut_data == ref_data).all(), f"{name} is not equal" print(f"{name} is equal") else: @@ -121,9 +119,7 @@ def convert_checkpoint_from_transformers_to_megatron(hf_model, model, hf_config) head_dim = getattr(hf_config, "head_dim", hidden_dim // num_attention_heads) if num_attention_heads != num_key_value_heads: print("[WARNING] Converting GQA model") - has_qkv_bias = getattr(hf_config, "qkv_bias", False) or getattr( - hf_config, "attention_bias", False - ) + has_qkv_bias = getattr(hf_config, "qkv_bias", False) or getattr(hf_config, "attention_bias", False) has_share_expert = getattr(hf_config, "shared_expert_intermediate_size", None) with torch.no_grad(): model.embedding.word_embeddings.weight.copy_(hf_model.model.embed_tokens.weight) @@ -161,9 +157,7 @@ def convert_checkpoint_from_transformers_to_megatron(hf_model, model, hf_config) for idx, hf_expert in enumerate(hf_layer.mlp.experts): fc1_weight = torch.cat([hf_expert.gate_proj.weight, hf_expert.up_proj.weight]) layer.mlp.experts.linear_fc1._parameters[f"weight{idx}"].copy_(fc1_weight) - layer.mlp.experts.linear_fc2._parameters[f"weight{idx}"].copy_( - hf_expert.down_proj.weight - ) + layer.mlp.experts.linear_fc2._parameters[f"weight{idx}"].copy_(hf_expert.down_proj.weight) if has_share_expert: layer.mlp.shared_experts.gate_weight.copy_(hf_layer.mlp.shared_expert_gate.weight) @@ -174,9 +168,7 @@ def convert_checkpoint_from_transformers_to_megatron(hf_model, model, hf_config) ] ) layer.mlp.shared_experts.linear_fc1.weight.copy_(shared_fc1_weight) - layer.mlp.shared_experts.linear_fc2.weight.copy_( - hf_layer.mlp.shared_expert.down_proj.weight - ) + layer.mlp.shared_experts.linear_fc2.weight.copy_(hf_layer.mlp.shared_expert.down_proj.weight) model.decoder.final_layernorm.weight.copy_(hf_model.model.norm.weight) model.output_layer.weight.copy_(hf_model.lm_head.weight) @@ -193,9 +185,7 @@ def safe_copy( ): if not skip_dtype_assert: if src_tensor.dtype != dst_tensor.dtype: - raise ValueError( - f"Get source dtype {src_tensor.dtype}, but target dtype {dst_tensor.dtype}" - ) + raise ValueError(f"Get source dtype {src_tensor.dtype}, but target dtype {dst_tensor.dtype}") assert src_tensor.shape == dst_tensor.shape dst_tensor.data.copy_(src_tensor.data) return src_tensor.numel() @@ -210,17 +200,11 @@ def safe_copy( else: layer.self_attention.linear_q_down_proj.weight.copy_(hf_layer.self_attn.q_a_proj.weight) layer.self_attention.linear_q_up_proj.weight.copy_(hf_layer.self_attn.q_b_proj.weight) - layer.self_attention.linear_q_up_proj.layer_norm_weight.copy_( - hf_layer.self_attn.q_a_layernorm.weight - ) + layer.self_attention.linear_q_up_proj.layer_norm_weight.copy_(hf_layer.self_attn.q_a_layernorm.weight) - layer.self_attention.linear_kv_down_proj.weight.copy_( - hf_layer.self_attn.kv_a_proj_with_mqa.weight - ) + layer.self_attention.linear_kv_down_proj.weight.copy_(hf_layer.self_attn.kv_a_proj_with_mqa.weight) layer.self_attention.linear_kv_up_proj.weight.copy_(hf_layer.self_attn.kv_b_proj.weight) - layer.self_attention.linear_kv_up_proj.layer_norm_weight.copy_( - hf_layer.self_attn.kv_a_layernorm.weight - ) + layer.self_attention.linear_kv_up_proj.layer_norm_weight.copy_(hf_layer.self_attn.kv_a_layernorm.weight) layer.self_attention.linear_proj.weight.copy_(hf_layer.self_attn.o_proj.weight) if not hasattr(layer.mlp, "router"): @@ -264,9 +248,7 @@ def safe_copy( ] ) layer.mlp.shared_experts.linear_fc1.weight.copy_(shared_fc1_weight) - layer.mlp.shared_experts.linear_fc2.weight.copy_( - hf_layer.mlp.shared_experts.down_proj.weight - ) + layer.mlp.shared_experts.linear_fc2.weight.copy_(hf_layer.mlp.shared_experts.down_proj.weight) model.decoder.final_layernorm.weight.copy_(hf_model.model.norm.weight) if not hf_config.tie_word_embeddings: @@ -345,9 +327,7 @@ def megatron_model_provider(pre_process, post_process): if "Qwen2MoeForCausalLM" in hf_config.architectures: convert_checkpoint_from_transformers_to_megatron(hf_model, model[0].module, hf_config) elif "DeepseekV3ForCausalLM" in hf_config.architectures: - convert_checkpoint_from_transformers_to_megatron_dpskv3( - hf_model, model[0].module, hf_config, tfconfig=tfconfig - ) + convert_checkpoint_from_transformers_to_megatron_dpskv3(hf_model, model[0].module, hf_config, tfconfig=tfconfig) elif "Qwen3MoeForCausalLM" in hf_config.architectures: convert_checkpoint_from_transformers_to_megatron(hf_model, model[0].module, hf_config) else: diff --git a/scripts/deploy_model.py b/scripts/deploy_model.py index e2b07863..360142e8 100644 --- a/scripts/deploy_model.py +++ b/scripts/deploy_model.py @@ -62,9 +62,7 @@ def companion_launch(): n_avail_gpus = torch.cuda.device_count() tensor_parallel_size = n_avail_gpus if tensor_parallel_size > n_avail_gpus: - logger.warning( - f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}." - ) + logger.warning(f"Warning: tensor_parallel_size {tensor_parallel_size} is greater than available GPUs {n_avail_gpus}. Setting tensor_parallel_size to {n_avail_gpus}.") tensor_parallel_size = n_avail_gpus # gpu_memory_utilization = 0.95 diff --git a/scripts/diagnose.py b/scripts/diagnose.py index b9fe2343..01dc0f5e 100644 --- a/scripts/diagnose.py +++ b/scripts/diagnose.py @@ -64,11 +64,7 @@ def test_connection(name, url, timeout=10): print("Error open {}: {}, {}, DNS finished in {} sec.".format(name, url, e, dns_elapsed)) return load_elapsed = time.time() - start - print( - "Timing for {}: {}, DNS: {:.4f} sec, LOAD: {:.4f} sec.".format( - name, url, dns_elapsed, load_elapsed - ) - ) + print("Timing for {}: {}, DNS: {:.4f} sec, LOAD: {:.4f} sec.".format(name, url, dns_elapsed, load_elapsed)) def check_python(): @@ -182,13 +178,7 @@ def check_network(args): def check_environment(): print("----------Environment----------") for k, v in os.environ.items(): - if ( - k.startswith("VERL_") - or k.startswith("OMP_") - or k.startswith("KMP_") - or k == "CC" - or k == "CXX" - ): + if k.startswith("VERL_") or k.startswith("OMP_") or k.startswith("KMP_") or k == "CC" or k == "CXX": print('{}="{}"'.format(k, v)) diff --git a/scripts/display_dataset.py b/scripts/display_dataset.py index e3132bc4..f290e0a2 100644 --- a/scripts/display_dataset.py +++ b/scripts/display_dataset.py @@ -10,6 +10,7 @@ parser.add_argument("--target", default="openai/gsm8k", type=str, help="HuggingFace dataset name") args = parser.parse_args() + def display_dataset(dataset_name, dataset_iter, header): from beast_logger import print_listofdict diff --git a/scripts/test_dashscope_api.py b/scripts/test_dashscope_api.py index 7c1e776d..dcf26c2b 100644 --- a/scripts/test_dashscope_api.py +++ b/scripts/test_dashscope_api.py @@ -1,5 +1,3 @@ - - import asyncio from ajet.utils.robust_dashscope import RobustDashScopeChatModel @@ -10,9 +8,7 @@ async def test_dashscope_api(): llm = RobustDashScopeChatModel("qwen-plus", stream=False) # Sample messages for a basic conversation - messages = [ - {"role": "user", "content": "Hello! Can you tell me a short joke?"} - ] + messages = [{"role": "user", "content": "Hello! Can you tell me a short joke?"}] # Call the model response = await llm(messages) @@ -20,7 +16,6 @@ async def test_dashscope_api(): # Print and verify the response print(response) - except Exception as e: print(f"Test failed with error: {e}") raise diff --git a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py index eb37a189..77b3dc8b 100644 --- a/tests/bench/benchmark_appworld/execute_benchmark_appworld.py +++ b/tests/bench/benchmark_appworld/execute_benchmark_appworld.py @@ -8,7 +8,6 @@ class TestBenchmarkAppworld(BenchmarkTestCase): - def test_01_begin_verl(self): # get probe target, so as to get timeout settings BACKBONE = "verl" @@ -59,9 +58,7 @@ def clear_system_processes(self): total_seconds = 15 for i in range(total_seconds): - logger.warning( - f"Warning: To install Appworld, we have kill all `python / VLLM / vllm / ray` processes in your system. IF this is NOT acceptable, TERMINATE NOW! Execute in {total_seconds - i} seconds..." - ) + logger.warning(f"Warning: To install Appworld, we have kill all `python / VLLM / vllm / ray` processes in your system. IF this is NOT acceptable, TERMINATE NOW! Execute in {total_seconds - i} seconds...") time.sleep(1) kill = "ray|vllm|VLLM|python" diff --git a/tests/bench/benchmark_countdown/execute_benchmark_countdown.py b/tests/bench/benchmark_countdown/execute_benchmark_countdown.py index db74e25a..59511216 100644 --- a/tests/bench/benchmark_countdown/execute_benchmark_countdown.py +++ b/tests/bench/benchmark_countdown/execute_benchmark_countdown.py @@ -4,10 +4,7 @@ from tests.bench.benchmark_base import BenchmarkTestCase - - class TestBenchmarkCountdown(BenchmarkTestCase, unittest.TestCase): - def test_01_begin_verl(self): BACKBONE = "verl" TEST_TARGET = "tests/bench/benchmark_countdown/benchmark_countdown.yaml" diff --git a/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py b/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py index 7de32908..bed5032e 100644 --- a/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py +++ b/tests/bench/benchmark_frozenlake/execute_benchmark_frozenlake.py @@ -4,7 +4,6 @@ class TestBenchmarkFrozenLake(BenchmarkTestCase): - def test_01_begin_verl(self): BACKBONE = "verl" TEST_TARGET = "tests/bench/benchmark_frozenlake/benchmark_frozenlake.yaml" diff --git a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py index fc26b776..d3d18e4c 100644 --- a/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py +++ b/tests/bench/benchmark_learn2ask/benchmark_learn2ask.py @@ -13,6 +13,7 @@ # [TestProbe] Step 100: local average reward over last self.reward_expectation_avg_window steps: 3.4732, expected range: [0.0, 99999.0] # [TestProbe] Step 200: local average reward over last self.reward_expectation_avg_window steps: 3.5645, expected range: [0.0, 99999.0] + @singleton class TestProbe(BenchmarkProbe): def __init__(self): diff --git a/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py b/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py index e467e030..39059b1d 100644 --- a/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py +++ b/tests/bench/benchmark_learn2ask/execute_benchmark_learn2ask.py @@ -4,7 +4,6 @@ class TestBenchmarkLearnToAsk(BenchmarkTestCase): - def test_01_begin_verl(self): # get probe target, so as to get timeout settings BACKBONE = "verl" diff --git a/tests/bench/benchmark_math/execute_benchmark_math.py b/tests/bench/benchmark_math/execute_benchmark_math.py index afd5e41e..6c9fe9c5 100644 --- a/tests/bench/benchmark_math/execute_benchmark_math.py +++ b/tests/bench/benchmark_math/execute_benchmark_math.py @@ -3,7 +3,6 @@ class TestBenchmarkMath(BenchmarkTestCase): - def test_01_begin_verl(self): # get probe target, so as to get timeout settings BACKBONE = "verl" diff --git a/tests/config_test.py b/tests/config_test.py index 7fe2e4b7..f1fbca8e 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -14,9 +14,7 @@ class TestConfigUtils(unittest.TestCase): def test_load_config(self): """A simple test to check if the configuration file is loaded without errors.""" - yaml_backup_dst, exp_base, exp_name, config = prepare_experiment_config( - "tests/data/config.yaml", "tests/temp", backbone="debug" - ) + yaml_backup_dst, exp_base, exp_name, config = prepare_experiment_config("tests/data/config.yaml", "tests/temp", backbone="debug") self.assertEqual(exp_name, "sample") self.assertEqual(exp_base, "tests/temp/sample") self.assertEqual(yaml_backup_dst, "tests/temp/sample/yaml_backup.yaml") @@ -31,9 +29,7 @@ def test_config_alignment_trinity(self): """Test configuration alignment based on conversion JSON.""" from_config_fp = "tests/data/config.yaml" # Fixed config asset locations - TRINITY_CONFIG_AUTO_CONVERSION = ( - "ajet/default_config/trinity/config_auto_convertion_trinity.jsonc" - ) + TRINITY_CONFIG_AUTO_CONVERSION = "ajet/default_config/trinity/config_auto_convertion_trinity.jsonc" with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: config = read_ajet_hierarchical_config( @@ -44,9 +40,7 @@ def test_config_alignment_trinity(self): exp_dir="tests/temp", ) expand_ajet_hierarchical_config(config, write_to=temp_yaml1.name) - align_parameters( - temp_yaml1.name, temp_yaml1.name, TRINITY_CONFIG_AUTO_CONVERSION, "trinity" - ) + align_parameters(temp_yaml1.name, temp_yaml1.name, TRINITY_CONFIG_AUTO_CONVERSION, "trinity") with open(temp_yaml1.name, "r") as file: to_config = yaml.safe_load(file) self.assertEqual(to_config["checkpoint_root_dir"], "/wow/ajet_checkpoints") @@ -73,9 +67,7 @@ def test_config_alignment_verl(self): """Test configuration alignment based on conversion JSON.""" from_config_fp = "tests/data/config.yaml" # Fixed config asset locations - TRINITY_CONFIG_AUTO_CONVERSION = ( - "ajet/default_config/verl/config_auto_convertion_verl.jsonc" - ) + TRINITY_CONFIG_AUTO_CONVERSION = "ajet/default_config/verl/config_auto_convertion_verl.jsonc" with tempfile.NamedTemporaryFile(mode="r", suffix=".yaml") as temp_yaml1: config = read_ajet_hierarchical_config( @@ -86,14 +78,10 @@ def test_config_alignment_verl(self): exp_dir="tests/temp", ) expand_ajet_hierarchical_config(config, write_to=temp_yaml1.name) - align_parameters( - temp_yaml1.name, temp_yaml1.name, TRINITY_CONFIG_AUTO_CONVERSION, "trinity" - ) + align_parameters(temp_yaml1.name, temp_yaml1.name, TRINITY_CONFIG_AUTO_CONVERSION, "trinity") with open(temp_yaml1.name, "r") as file: to_config = yaml.safe_load(file) - self.assertEqual( - to_config["trainer"]["checkpoint_base_dir"], "/wow/ajet_checkpoints" - ) + self.assertEqual(to_config["trainer"]["checkpoint_base_dir"], "/wow/ajet_checkpoints") self.assertEqual( to_config["trainer"]["default_local_dir"], r"${checkpoint_base_dir}/${trainer.project_name}/${trainer.experiment_name}", diff --git a/tests/test_dynamic_import.py b/tests/test_dynamic_import.py index 42de2144..c4e96bbf 100644 --- a/tests/test_dynamic_import.py +++ b/tests/test_dynamic_import.py @@ -11,9 +11,7 @@ def test_successful_import(self): def test_successful_import2(self): cls = dynamic_import("tutorial.example_math_agent.math_agent->ExampleMathLearn") - self.assertEqual( - str(cls), "" - ) + self.assertEqual(str(cls), "") def test_successful_import3(self): cls = dynamic_import("tutorial/example_math_agent/math_agent.py->ExampleMathLearn") diff --git a/tests/test_networking.py b/tests/test_networking.py index 913fc341..7998c283 100644 --- a/tests/test_networking.py +++ b/tests/test_networking.py @@ -7,7 +7,7 @@ # Load the module directly to avoid top-level package import issues # caused by broken dependencies in other parts of the codebase. # We are testing a standalone utility, so we don't need the whole app context. -module_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'ajet', 'utils', 'networking.py')) +module_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "ajet", "utils", "networking.py")) spec = importlib.util.spec_from_file_location("networking", module_path) networking = importlib.util.module_from_spec(spec) spec.loader.exec_module(networking) @@ -15,6 +15,7 @@ find_free_port = networking.find_free_port get_host_ip = networking.get_host_ip + class TestNetworking(unittest.TestCase): def test_find_free_port(self): """Test that find_free_port returns a valid integer port.""" @@ -26,21 +27,21 @@ def test_find_free_port(self): # Verify the port is valid to bind to (it should have been released) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: try: - s.bind(('', port)) + s.bind(("", port)) except OSError: - # It's possible the port was taken immediately by another process - # but unlikely in a test environment. - pass + # It's possible the port was taken immediately by another process + # but unlikely in a test environment. + pass def test_get_host_ip(self): """Test that get_host_ip returns a valid IP string.""" ip = get_host_ip() self.assertIsInstance(ip, str) - parts = ip.split('.') + parts = ip.split(".") self.assertEqual(len(parts), 4) for part in parts: - if part == 'localhost': - continue + if part == "localhost": + continue self.assertTrue(part.isdigit(), f"Part {part} is not a digit") self.assertTrue(0 <= int(part) <= 255) @@ -49,8 +50,9 @@ def test_get_host_ip_with_interface(self): # This will likely fail the interface specific block and fall back to the connect method ip = get_host_ip(interface="invalid_interface_XYZ") self.assertIsInstance(ip, str) - parts = ip.split('.') + parts = ip.split(".") self.assertEqual(len(parts), 4) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/tests/test_tracing_reader.py b/tests/test_tracing_reader.py index db03591e..0f29c719 100644 --- a/tests/test_tracing_reader.py +++ b/tests/test_tracing_reader.py @@ -14,9 +14,7 @@ def __init__(self, tasks: List[Task]): self._tasks = tasks self.called = 0 - def load_tasks_from_conversation( - self, projects_limit: int = 100, spans_limit: int = 100 - ) -> List[Task]: + def load_tasks_from_conversation(self, projects_limit: int = 100, spans_limit: int = 100) -> List[Task]: self.called += 1 return self._tasks diff --git a/tutorial/example_appworld/appworld.py b/tutorial/example_appworld/appworld.py index d8b647e7..ecfac5c7 100644 --- a/tutorial/example_appworld/appworld.py +++ b/tutorial/example_appworld/appworld.py @@ -5,7 +5,6 @@ class ExampleAgentScopeWorkflow(Workflow): - async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeChatFormatter @@ -42,9 +41,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl # agentscope deal with interaction message reply_message = await agent(interaction_message) # env service protocol - obs, _, terminate, _ = env.step( - action={"content": reply_message.content, "role": "assistant"} - ) + obs, _, terminate, _ = env.step(action={"content": reply_message.content, "role": "assistant"}) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? diff --git a/tutorial/example_appworld/appworld_oai_sdk.py b/tutorial/example_appworld/appworld_oai_sdk.py index 534ec00b..1c3ac522 100644 --- a/tutorial/example_appworld/appworld_oai_sdk.py +++ b/tutorial/example_appworld/appworld_oai_sdk.py @@ -7,9 +7,7 @@ class ExampleAgentScopeWorkflow(Workflow): - async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - init_messages = workflow_task.task.init_messages if len(init_messages) >= 2: first_msg, init_messages = init_messages[0], init_messages[1:] @@ -32,9 +30,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl # agentscope deal with interaction message reply_message: ChatCompletion = await client.chat.completions.create(interaction_message) # env service protocol - obs, _, terminate, _ = env.step( - action={"content": reply_message.choices[0].message.content, "role": "assistant"} - ) + obs, _, terminate, _ = env.step(action={"content": reply_message.choices[0].message.content, "role": "assistant"}) # generate new message from env output interaction_message = Msg(name="env", content=obs, role="user") # is terminated? diff --git a/tutorial/example_countdown/countdown.py b/tutorial/example_countdown/countdown.py index 0b846a43..5f86a430 100644 --- a/tutorial/example_countdown/countdown.py +++ b/tutorial/example_countdown/countdown.py @@ -7,11 +7,7 @@ def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): + if hasattr(result, "metadata") and isinstance(result.metadata, dict) and "result" in result.metadata: return result.metadata["result"] if hasattr(result, "content"): if isinstance(result.content, dict) and "result" in result.content: diff --git a/tutorial/example_countdown/prepare_data.py b/tutorial/example_countdown/prepare_data.py index 39bf167e..4dba5d76 100644 --- a/tutorial/example_countdown/prepare_data.py +++ b/tutorial/example_countdown/prepare_data.py @@ -6,9 +6,7 @@ from datasets import DatasetDict, load_dataset parser = argparse.ArgumentParser(description="download Hugging Face dataset") -parser.add_argument( - "--target", default="Jiayi-Pan/Countdown-Tasks-3to4", type=str, help="HuggingFace dataset name" -) +parser.add_argument("--target", default="Jiayi-Pan/Countdown-Tasks-3to4", type=str, help="HuggingFace dataset name") parser.add_argument( "--path", default="./dataset", @@ -68,9 +66,7 @@ def display_dataset(dataset_name, dataset_iter, header): # Ensure we have enough data if total_size < test_size + train_size: - print( - f"\nWarning: Dataset size ({total_size}) is smaller than required ({test_size + train_size})" - ) + print(f"\nWarning: Dataset size ({total_size}) is smaller than required ({test_size + train_size})") print("Adjusting sizes proportionally...") test_size = min(test_size, total_size // 11) train_size = test_size * 10 diff --git a/tutorial/example_feedback_tracing/train.py b/tutorial/example_feedback_tracing/train.py index 62f92903..858bae6b 100644 --- a/tutorial/example_feedback_tracing/train.py +++ b/tutorial/example_feedback_tracing/train.py @@ -19,11 +19,7 @@ def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): + if hasattr(result, "metadata") and isinstance(result.metadata, dict) and "result" in result.metadata: return result.metadata["result"] if hasattr(result, "content"): if isinstance(result.content, dict) and "result" in result.content: @@ -36,9 +32,7 @@ def extract_final_answer(result) -> str: class FinalResult(BaseModel): - result: str = Field( - description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" - ) + result: str = Field(description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}") class ExampleTracingFeedbackTrain(Workflow): diff --git a/tutorial/example_frozenlake/frozenlake.py b/tutorial/example_frozenlake/frozenlake.py index c2d9f4ce..2bdd3bde 100644 --- a/tutorial/example_frozenlake/frozenlake.py +++ b/tutorial/example_frozenlake/frozenlake.py @@ -94,9 +94,7 @@ async def run_frozenlake(self): try: action = await self.agent.step(current_observation=observation_str) except Exception: - logger.error( - f"Agent failed to produce action due to error:\n{traceback.format_exc()}" - ) + logger.error(f"Agent failed to produce action due to error:\n{traceback.format_exc()}") terminate_reason = "agent_error" break observation, reward, done, _ = self.env.step(action) @@ -137,20 +135,13 @@ def __init__(self, model: DashScopeChatModel, max_steps: int = 20): self.max_steps = max_steps def get_prompt(self, observation: str) -> str: - prompt = ( - f"Current Observation ({self.current_step}): \n" - + observation - + "\n" - + "You have not achieved the goal, P has not reached G yet. Please give the next action." - ) + prompt = f"Current Observation ({self.current_step}): \n" + observation + "\n" + "You have not achieved the goal, P has not reached G yet. Please give the next action." if self.current_step > 0 and self.last_action is not None: if self.last_observation == observation: prompt += "\nYour last response is invalid. Your position didn't change at all. You may need to recheck your thinking process, action outputted, and the format of response. Remember, you should only output the NEXT ACTION at each interation in the ``` ```. For example, if you want to move up, you should output ```Up```." if self.max_steps is not None and self.max_steps - self.current_step > 0: - prompt += ( - f"\nThe maximum number of steps remaining is {self.max_steps - self.current_step}." - ) + prompt += f"\nThe maximum number of steps remaining is {self.max_steps - self.current_step}." return prompt @@ -228,16 +219,11 @@ def __init__( FrozenLakeEnv as GymFrozenLakeEnv, ) except ImportError as e: - error_message = ( - f"Gymnasium is not installed. Please install gymnasium first before " - f"running the frozen_lake workflow. Error: {str(e)}" - ) + error_message = f"Gymnasium is not installed. Please install gymnasium first before " f"running the frozen_lake workflow. Error: {str(e)}" logger.error(error_message) raise ImportError(error_message) - random_map, goal_position = generate_random_map( - size=self.size, p=self.p, seed=self.seed, max_steps=self.max_steps - ) + random_map, goal_position = generate_random_map(size=self.size, p=self.p, seed=self.seed, max_steps=self.max_steps) self.goal_position = goal_position @@ -406,9 +392,7 @@ def is_valid(board: list[list[str]], max_size: int, max_steps: int) -> bool: return False -def generate_random_map( - size: int = 8, p: float = 0.8, seed: int = 0, max_steps: int = 5 -) -> Tuple[list[str], Tuple[int, int]]: +def generate_random_map(size: int = 8, p: float = 0.8, seed: int = 0, max_steps: int = 5) -> Tuple[list[str], Tuple[int, int]]: """Generates a random valid map (one that has a path from start to goal). Args: @@ -428,9 +412,7 @@ def generate_random_map( np_random, _ = seeding.np_random(seed) except ImportError: - raise ImportError( - "Gymnasium is not installed. Please install gymnasium first before running the frozen_lake workflow." - ) + raise ImportError("Gymnasium is not installed. Please install gymnasium first before running the frozen_lake workflow.") # generate random start and end points while not valid: diff --git a/tutorial/example_learn2ask/data_preprocess/llm_info_extraction.py b/tutorial/example_learn2ask/data_preprocess/llm_info_extraction.py index 070b1612..7c36f416 100644 --- a/tutorial/example_learn2ask/data_preprocess/llm_info_extraction.py +++ b/tutorial/example_learn2ask/data_preprocess/llm_info_extraction.py @@ -64,9 +64,7 @@ def _call_online_api(messages, **kwargs): max_tokens = kwargs.get("max_tokens", 500) client = openai.OpenAI(api_key=api_key, base_url=api_base) - response = client.chat.completions.create( - model=model, messages=messages, temperature=temperature, max_tokens=max_tokens - ) + response = client.chat.completions.create(model=model, messages=messages, temperature=temperature, max_tokens=max_tokens) return response.choices[0].message.content diff --git a/tutorial/example_learn2ask/data_preprocess/step1.py b/tutorial/example_learn2ask/data_preprocess/step1.py index d4533ffa..610324fa 100644 --- a/tutorial/example_learn2ask/data_preprocess/step1.py +++ b/tutorial/example_learn2ask/data_preprocess/step1.py @@ -9,9 +9,7 @@ from message_splitter import split_session_to_json_lines -def process_jsonl_file( - input_file, output_file, model_call_mode="online_api", max_retries=3, max_workers=16, **kwargs -): +def process_jsonl_file(input_file, output_file, model_call_mode="online_api", max_retries=3, max_workers=16, **kwargs): """ Process all sessions in a JSONL file and save results to output file using multi-threading. Supports resuming from previous progress if interrupted. @@ -43,12 +41,8 @@ def process_single_session(args): return line_num, None, None try: session = json.loads(line) - print( - f"Processing session {session.get('session_id', 'unknown')} (line {line_num})..." - ) - processed_lines = process_session( - session, model_call_mode, max_retries, **kwargs - ) + print(f"Processing session {session.get('session_id', 'unknown')} (line {line_num})...") + processed_lines = process_session(session, model_call_mode, max_retries, **kwargs) return line_num, processed_lines, None except json.JSONDecodeError as e: return line_num, None, f"Warning: Skipping invalid JSON at line {line_num}: {e}" @@ -189,15 +183,9 @@ def process_session(session, model_call_mode="online_api", max_retries=3, **kwar # Example usage: if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument( - "--input_file", type=str, default="examples/learn_to_ask/data_raw/train_origin.jsonl" - ) - parser.add_argument( - "--output_file", type=str, default="examples/learn_to_ask/data_raw/train_processed.jsonl" - ) - parser.add_argument( - "--model_call_mode", type=str, choices=["online_api", "local_vllm"], default="online_api" - ) + parser.add_argument("--input_file", type=str, default="examples/learn_to_ask/data_raw/train_origin.jsonl") + parser.add_argument("--output_file", type=str, default="examples/learn_to_ask/data_raw/train_processed.jsonl") + parser.add_argument("--model_call_mode", type=str, choices=["online_api", "local_vllm"], default="online_api") args = parser.parse_args() print( process_jsonl_file( diff --git a/tutorial/example_learn2ask/data_preprocess/step2.py b/tutorial/example_learn2ask/data_preprocess/step2.py index 9d546b0c..45cda5c2 100644 --- a/tutorial/example_learn2ask/data_preprocess/step2.py +++ b/tutorial/example_learn2ask/data_preprocess/step2.py @@ -17,9 +17,7 @@ def process_message(json_obj): def main(input_file_path, output_file_path): - with open(input_file_path, "r", encoding="utf-8") as infile, open( - output_file_path, "w", encoding="utf-8" - ) as outfile: + with open(input_file_path, "r", encoding="utf-8") as infile, open(output_file_path, "w", encoding="utf-8") as outfile: print("data processing started...") for line in infile: data = json.loads(line.strip()) @@ -28,16 +26,16 @@ def main(input_file_path, output_file_path): continue new_item = { - 'main_query':'[no query]', - 'init_messages': data['messages'], - 'task_id':data['cid'], - 'env_type':'[no env]', - 'metadata':{ + "main_query": "[no query]", + "init_messages": data["messages"], + "task_id": data["cid"], + "env_type": "[no env]", + "metadata": { "session_id": data["session_id"], "diagn": data["diagn"], "decision_truth": decision, "info_truth": info_set, - } + }, } outfile.write(json.dumps(new_item, ensure_ascii=False) + "\n") print("job done!") @@ -47,9 +45,7 @@ def main(input_file_path, output_file_path): parser = argparse.ArgumentParser() # The file generated by 1_info_extract_pipeline.py - parser.add_argument( - "--input_file", type=str, default="examples/learn_to_ask/data_raw/train_processed.jsonl" - ) + parser.add_argument("--input_file", type=str, default="examples/learn_to_ask/data_raw/train_processed.jsonl") # The final file for training or testing parser.add_argument("--output_file", type=str, default="examples/learn_to_ask/data/train.jsonl") diff --git a/tutorial/example_learn2ask/learn2ask.py b/tutorial/example_learn2ask/learn2ask.py index e8e66bd1..a88fdc4e 100644 --- a/tutorial/example_learn2ask/learn2ask.py +++ b/tutorial/example_learn2ask/learn2ask.py @@ -1,4 +1,3 @@ - import re import time import asyncio @@ -147,8 +146,8 @@ async def reward_fn(init_messages: list[Msg], response: str, truth_action: str, _reward_semaphore = threading.Semaphore(16) -async def reward_fn_with_semaphore(*args, **kwargs): +async def reward_fn_with_semaphore(*args, **kwargs): get_sem_ok = False while not get_sem_ok: get_sem_ok = _reward_semaphore.acquire(blocking=False) diff --git a/tutorial/example_learn2ask/learn2ask_langchain.py b/tutorial/example_learn2ask/learn2ask_langchain.py index 568717d8..96b2cca1 100644 --- a/tutorial/example_learn2ask/learn2ask_langchain.py +++ b/tutorial/example_learn2ask/learn2ask_langchain.py @@ -1,4 +1,3 @@ - import re import time import asyncio @@ -147,8 +146,8 @@ async def reward_fn(init_messages: list[dict], response: str, truth_action: str, _reward_semaphore = threading.Semaphore(16) -async def reward_fn_with_semaphore(*args, **kwargs): +async def reward_fn_with_semaphore(*args, **kwargs): get_sem_ok = False while not get_sem_ok: get_sem_ok = _reward_semaphore.acquire(blocking=False) @@ -175,24 +174,24 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl truth_action = workflow_task.task.metadata["decision_truth"] or "continue" truth_info = workflow_task.task.metadata["info_truth"] - llm_info=tuner.as_oai_baseurl_apikey() + llm_info = tuner.as_oai_baseurl_apikey() - llm=ChatOpenAI( + llm = ChatOpenAI( base_url=llm_info.base_url, - api_key=lambda:llm_info.api_key, + api_key=lambda: llm_info.api_key, ) - agent=create_agent( + agent = create_agent( model=llm, system_prompt=system_prompt, ) - msg=[ - {"role": x["role"], "content": x["content"]} for x in messages - ] - result = agent.invoke({ - "messages": msg, # type: ignore - }) + msg = [{"role": x["role"], "content": x["content"]} for x in messages] + result = agent.invoke( + { + "messages": msg, # type: ignore + } + ) response = result["messages"][-1].content reward = await reward_fn_with_semaphore(msg, response, truth_action, truth_info) diff --git a/tutorial/example_math_agent/math_agent.py b/tutorial/example_math_agent/math_agent.py index b26b7aa0..3c5d61df 100644 --- a/tutorial/example_math_agent/math_agent.py +++ b/tutorial/example_math_agent/math_agent.py @@ -7,11 +7,7 @@ def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): + if hasattr(result, "metadata") and isinstance(result.metadata, dict) and "result" in result.metadata: return result.metadata["result"] if hasattr(result, "content"): if isinstance(result.content, dict) and "result" in result.content: diff --git a/tutorial/example_math_agent/math_agent_langchain.py b/tutorial/example_math_agent/math_agent_langchain.py index 6ba1bc0a..c11f53cc 100644 --- a/tutorial/example_math_agent/math_agent_langchain.py +++ b/tutorial/example_math_agent/math_agent_langchain.py @@ -16,27 +16,29 @@ class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - system_prompt: str = dedent(""" + system_prompt: str = dedent( + """ You are an agent specialized in solving math problems. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. You should return your final answer within \\boxed{{}}. - """) + """ + ) - async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore # tuner to api key url_and_apikey = tuner.as_oai_baseurl_apikey() base_url = url_and_apikey.base_url api_key = url_and_apikey.api_key from langchain_openai import ChatOpenAI - llm=ChatOpenAI( + + llm = ChatOpenAI( base_url=base_url, - api_key=lambda:api_key, + api_key=lambda: api_key, ) - agent=create_agent( + agent = create_agent( model=llm, system_prompt=self.system_prompt, ) @@ -44,14 +46,11 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl # take out query query = workflow_task.task.main_query - response = agent.invoke({ - "messages": [ - { - "role": "user", - "content": query - } - ], - }) + response = agent.invoke( + { + "messages": [{"role": "user", "content": query}], + } + ) - final_answer = response['messages'][-1].content + final_answer = response["messages"][-1].content return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) diff --git a/tutorial/example_math_agent/math_agent_oai_sdk.py b/tutorial/example_math_agent/math_agent_oai_sdk.py index 8304f14d..efd6e03d 100644 --- a/tutorial/example_math_agent/math_agent_oai_sdk.py +++ b/tutorial/example_math_agent/math_agent_oai_sdk.py @@ -15,89 +15,53 @@ class ExampleMathLearn_Simple_NoToolCall(Workflow): name: str = "math_agent_workflow" - system_prompt: str = dedent(""" + system_prompt: str = dedent( + """ You are an agent specialized in solving math problems. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. You should return your final answer within \\boxed{{}}. - """) + """ + ) - async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore query = workflow_task.task.main_query client = tuner.as_raw_openai_sdk_client() - messages = [ - { - "role": "system", - "content": self.system_prompt - }, - { - "role": "user", - "content": query - } - ] + messages = [{"role": "system", "content": self.system_prompt}, {"role": "user", "content": query}] reply_message: ChatCompletion = await client.chat.completions.create(messages=messages) final_answer = reply_message.choices[0].message.content return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) - - # ------------------------------------------------------ # Tool use version # ------------------------------------------------------ -class ExampleMathLearn(Workflow): +class ExampleMathLearn(Workflow): name: str = "math_agent_workflow" - system_prompt: str = dedent(""" + system_prompt: str = dedent( + """ You are an agent specialized in solving math problems with tools. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. You should return your final answer within \\boxed{{}}. - """) + """ + ) available_functions: list = [ - { - "type": "function", - "function": { - "name": "execute_python_code", - "description": "Execute the given Python code in a temp file and capture the return code, standard output, and error. Note that you should print something or you will get empty return.", - "parameters": { - "type": "object", - "properties": { - "code": { - "type": "string", - "description": "The Python code to be executed." - }, - "timeout": { - "type": "number", - "description": "The maximum time (in seconds) allowed for the code to run.", - "default": 300 - } - }, - "required": ["code"] - } - } - }, + {"type": "function", "function": {"name": "execute_python_code", "description": "Execute the given Python code in a temp file and capture the return code, standard output, and error. Note that you should print something or you will get empty return.", "parameters": {"type": "object", "properties": {"code": {"type": "string", "description": "The Python code to be executed."}, "timeout": {"type": "number", "description": "The maximum time (in seconds) allowed for the code to run.", "default": 300}}, "required": ["code"]}}}, ] - async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore - - + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore query = workflow_task.task.main_query client = tuner.as_raw_openai_sdk_client() # call 1: get response with tool call - messages = [ - { "role": "system", "content": self.system_prompt }, - { "role": "user", "content": query } - ] + messages = [{"role": "system", "content": self.system_prompt}, {"role": "user", "content": query}] reply_message: ChatCompletion = await client.chat.completions.create(messages=messages, tools=self.available_functions) - if (reply_message.choices[0].message.content): - messages.append({ - "role": "assistant", - "content": reply_message.choices[0].message.content - }) + if reply_message.choices[0].message.content: + messages.append({"role": "assistant", "content": reply_message.choices[0].message.content}) # If the model called a tool if (reply_message.choices[0].message) and (reply_message.choices[0].message.tool_calls): @@ -109,12 +73,8 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl def sync_wrapper(): import subprocess import sys - process = subprocess.run( - [sys.executable, "-c", arguments["code"]], - timeout=arguments.get("timeout", 300), - capture_output=True, - text=True - ) + + process = subprocess.run([sys.executable, "-c", arguments["code"]], timeout=arguments.get("timeout", 300), capture_output=True, text=True) return process.stdout result = await asyncio.to_thread(sync_wrapper) @@ -122,9 +82,11 @@ def sync_wrapper(): "role": "tool", "tool_call_id": tool_call.id, "name": tool_call.function.name, - "content": json.dumps({ - "return_code": str(result), - }) + "content": json.dumps( + { + "return_code": str(result), + } + ), } messages.append(tool_result_message) @@ -136,5 +98,4 @@ def sync_wrapper(): else: final_stage_response = reply_message.choices[0].message.content - return WorkflowOutput(reward=None, metadata={"final_answer": final_stage_response}) diff --git a/tutorial/example_math_agent/math_agent_raw_http.py b/tutorial/example_math_agent/math_agent_raw_http.py index 216fbd71..af7ed484 100644 --- a/tutorial/example_math_agent/math_agent_raw_http.py +++ b/tutorial/example_math_agent/math_agent_raw_http.py @@ -15,16 +15,17 @@ class ExampleMathLearn(Workflow): - name: str = "math_agent_workflow" - system_prompt: str = dedent(""" + system_prompt: str = dedent( + """ You are an agent specialized in solving math problems. Please solve the math problem given to you. You can write and execute Python code to perform calculation or verify your answer. You should return your final answer within \\boxed{{}}. - """) + """ + ) - async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore + async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: # type: ignore # tuner to api key url_and_apikey = tuner.as_oai_baseurl_apikey() base_url = url_and_apikey.base_url @@ -33,27 +34,16 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl # take out query query = workflow_task.task.main_query - messages = [ - { - "role": "system", - "content": self.system_prompt - }, - { - "role": "user", - "content": query - } - ] + messages = [{"role": "system", "content": self.system_prompt}, {"role": "user", "content": query}] # use raw http requests (non-streaming) to get response response = requests.post( - f"{base_url}/chat/completions", - json={ - "model": "whatever", # Of course, this `model` field will be ignored. - "messages": messages, - }, - headers={ - "Authorization": f"Bearer {api_key}" - } + f"{base_url}/chat/completions", + json={ + "model": "whatever", # Of course, this `model` field will be ignored. + "messages": messages, + }, + headers={"Authorization": f"Bearer {api_key}"}, ) - final_answer = response.json()['choices'][0]['message']['content'] + final_answer = response.json()["choices"][0]["message"]["content"] return WorkflowOutput(reward=None, metadata={"final_answer": final_answer}) diff --git a/tutorial/example_math_agent/math_agent_simplify.py b/tutorial/example_math_agent/math_agent_simplify.py index 8e1250ad..4b1b8b79 100644 --- a/tutorial/example_math_agent/math_agent_simplify.py +++ b/tutorial/example_math_agent/math_agent_simplify.py @@ -7,11 +7,7 @@ def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): + if hasattr(result, "metadata") and isinstance(result.metadata, dict) and "result" in result.metadata: return result.metadata["result"] if hasattr(result, "content"): if isinstance(result.content, dict) and "result" in result.content: diff --git a/tutorial/example_math_agent/math_agentscope_urlkey.py b/tutorial/example_math_agent/math_agentscope_urlkey.py index 89d0e2e9..874fd91e 100644 --- a/tutorial/example_math_agent/math_agentscope_urlkey.py +++ b/tutorial/example_math_agent/math_agentscope_urlkey.py @@ -12,11 +12,7 @@ def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): + if hasattr(result, "metadata") and isinstance(result.metadata, dict) and "result" in result.metadata: return result.metadata["result"] if hasattr(result, "content"): if isinstance(result.content, dict) and "result" in result.content: @@ -36,7 +32,7 @@ def extract_final_answer(result) -> str: """ -class MathToolWorkflow(Workflow): # ✨✨ inherit `Workflow` class +class MathToolWorkflow(Workflow): # ✨✨ inherit `Workflow` class name: str = "math_agent_workflow" async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: @@ -47,7 +43,7 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl url_and_apikey = tuner.as_oai_baseurl_apikey() base_url = url_and_apikey.base_url - api_key = url_and_apikey.api_key # the api key contain information, do not discard it + api_key = url_and_apikey.api_key # the api key contain information, do not discard it # print(f"[MathToolWorkflow] Using base_url: [{base_url}], api_key: [{api_key}]") # base_url: [http://10.56.3.98:57817/v1], api_key: [sk-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] @@ -59,11 +55,13 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl stream=False, ) self.agent = ReActAgent( - name="math_react_agent", sys_prompt=system_prompt, + name="math_react_agent", + sys_prompt=system_prompt, model=model, # ✨✨ compared with a normal agentscope agent, here is the difference! formatter=OpenAIChatFormatter(), toolkit=self.toolkit, - memory=InMemoryMemory(), max_iters=2, + memory=InMemoryMemory(), + max_iters=2, ) self.agent.set_console_output_enabled(False) msg = Msg("user", query, role="user") @@ -73,6 +71,8 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl # compute reward reference_answer = workflow_task.task.metadata["answer"].split("####")[-1].strip() match = re.search(r"\\boxed\{([^}]*)\}", final_answer) - if match: is_success = (match.group(1) == reference_answer) - else: is_success = False + if match: + is_success = match.group(1) == reference_answer + else: + is_success = False return WorkflowOutput(reward=(1.0 if is_success else 0.0), metadata={"final_answer": final_answer}) diff --git a/tutorial/example_math_agent/math_answer_as_judge.py b/tutorial/example_math_agent/math_answer_as_judge.py index a9dbc6da..d2b7a81f 100644 --- a/tutorial/example_math_agent/math_answer_as_judge.py +++ b/tutorial/example_math_agent/math_answer_as_judge.py @@ -11,9 +11,7 @@ def __init__(self, config): def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raw_reward = 0 - final_answer = workflow_output.metadata[ - "final_answer" - ] # By default there's no final_answer; register it by calling ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + final_answer = workflow_output.metadata["final_answer"] # By default there's no final_answer; register it by calling ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow reference_answer = workflow_task.task.metadata["answer"] reference_answer = reference_answer.split("####")[-1].strip() @@ -35,9 +33,7 @@ def __init__(self, config): def compute_reward(self, workflow_task: WorkflowTask, workflow_output: WorkflowOutput) -> tuple: raw_reward = 0 - final_answer = workflow_output.metadata[ - "final_answer" - ] # By default there's no final_answer; register it by calling ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow + final_answer = workflow_output.metadata["final_answer"] # By default there's no final_answer; register it by calling ajet_proxy.update_judge_input_dictionary(final_answer=final_answer) in the workflow reference_answer = workflow_task.task.metadata["answer"] reference_answer = reference_answer.split("####")[-1].strip() diff --git a/tutorial/example_rm_auto_grader/auto_grader_example.py b/tutorial/example_rm_auto_grader/auto_grader_example.py index c89ef1ed..cfd08afc 100644 --- a/tutorial/example_rm_auto_grader/auto_grader_example.py +++ b/tutorial/example_rm_auto_grader/auto_grader_example.py @@ -176,9 +176,7 @@ class RubricsAutoGrader: print(f"Evaluating {len(candidate_outputs)} candidates...") # Evaluate all candidates together (pass list for listwise mode) - grader_rank_result = await judge._async_compute_reward( - workflow_task.task, candidate_outputs - ) + grader_rank_result = await judge._async_compute_reward(workflow_task.task, candidate_outputs) if grader_rank_result and hasattr(grader_rank_result, "rank"): ranks = grader_rank_result.rank diff --git a/tutorial/example_rubrics_judge/math_agent.py b/tutorial/example_rubrics_judge/math_agent.py index 7b2a4aa8..f035ac57 100644 --- a/tutorial/example_rubrics_judge/math_agent.py +++ b/tutorial/example_rubrics_judge/math_agent.py @@ -8,11 +8,7 @@ def extract_final_answer(result) -> str: """Extract the final answer from the agent's response.""" try: - if ( - hasattr(result, "metadata") - and isinstance(result.metadata, dict) - and "result" in result.metadata - ): + if hasattr(result, "metadata") and isinstance(result.metadata, dict) and "result" in result.metadata: return result.metadata["result"] if hasattr(result, "content"): if isinstance(result.content, dict) and "result" in result.content: @@ -25,9 +21,7 @@ def extract_final_answer(result) -> str: class FinalResult(BaseModel): - result: str = Field( - description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}" - ) + result: str = Field(description="Your solution of the given math problem. Put your final answer in boxed format, e.g., \\boxed{42}") system_prompt = """ diff --git a/tutorial/example_werewolves/game.py b/tutorial/example_werewolves/game.py index 10246c32..7f72f9f9 100644 --- a/tutorial/example_werewolves/game.py +++ b/tutorial/example_werewolves/game.py @@ -177,9 +177,7 @@ async def werewolves_game(agents: list[ReActAgent], roles) -> bool: # noqa: C90 healing = False # Has poison potion and hasn't used the healing potion - if poison and not ( - msg_witch_resurrect and msg_witch_resurrect.metadata["resurrect"] - ): + if poison and not (msg_witch_resurrect and msg_witch_resurrect.metadata["resurrect"]): msg_witch_poison = await agent( await moderator( Prompts.to_witch_poison.format( diff --git a/tutorial/example_werewolves/prompt.py b/tutorial/example_werewolves/prompt.py index 52d0f650..d04306f0 100644 --- a/tutorial/example_werewolves/prompt.py +++ b/tutorial/example_werewolves/prompt.py @@ -5,115 +5,53 @@ class EnglishPrompts: """English prompts used to guide the werewolf game.""" - to_dead_player = ( - "{}, you're eliminated now. Now you can make a final statement to " - "all alive players before you leave the game." - ) - - to_all_new_game = ( - "A new game is starting, the players are: {}. Now we randomly " - "reassign the roles to each player and inform them of their roles " - "privately." - ) - - to_all_night = ( - "Night has fallen, everyone close your eyes. Werewolves open your " - "eyes and choose a player to eliminate tonight." - ) - - to_wolves_discussion = ( - "[WEREWOLVES ONLY] {}, you should discuss and " - "decide on a player to eliminate tonight. Current alive players " - "are {}. Remember to set `reach_agreement` to True if you reach an " - "agreement during the discussion." - ) + to_dead_player = "{}, you're eliminated now. Now you can make a final statement to " "all alive players before you leave the game." + + to_all_new_game = "A new game is starting, the players are: {}. Now we randomly " "reassign the roles to each player and inform them of their roles " "privately." + + to_all_night = "Night has fallen, everyone close your eyes. Werewolves open your " "eyes and choose a player to eliminate tonight." + + to_wolves_discussion = "[WEREWOLVES ONLY] {}, you should discuss and " "decide on a player to eliminate tonight. Current alive players " "are {}. Remember to set `reach_agreement` to True if you reach an " "agreement during the discussion." to_wolves_vote = "[WEREWOLVES ONLY] Which player do you vote to kill?" - to_wolves_res = ( - "[WEREWOLVES ONLY] The voting result is {}. So you have chosen to " "eliminate {}." - ) + to_wolves_res = "[WEREWOLVES ONLY] The voting result is {}. So you have chosen to " "eliminate {}." to_all_witch_turn = "Witch's turn, witch open your eyes and decide your action tonight..." - to_witch_resurrect = ( - "[WITCH ONLY] {witch_name}, you're the witch, and tonight {dead_name} " - "is eliminated. You can resurrect him/her by using your healing " - "potion, " - "and note you can only use it once in the whole game. Do you want to " - "resurrect {dead_name}? Give me your reason and decision." - ) + to_witch_resurrect = "[WITCH ONLY] {witch_name}, you're the witch, and tonight {dead_name} " "is eliminated. You can resurrect him/her by using your healing " "potion, " "and note you can only use it once in the whole game. Do you want to " "resurrect {dead_name}? Give me your reason and decision." to_witch_resurrect_no = "[WITCH ONLY] The witch has chosen not to resurrect the player." to_witch_resurrect_yes = "[WITCH ONLY] The witch has chosen to resurrect the player." - to_witch_poison = ( - "[WITCH ONLY] {witch_name}, as a witch, you have a one-time-use " - "poison potion, do you want to use it tonight? Give me your reason " - "and decision." - ) + to_witch_poison = "[WITCH ONLY] {witch_name}, as a witch, you have a one-time-use " "poison potion, do you want to use it tonight? Give me your reason " "and decision." - to_all_seer_turn = ( - "Seer's turn, seer open your eyes and check one player's identity " "tonight..." - ) + to_all_seer_turn = "Seer's turn, seer open your eyes and check one player's identity " "tonight..." - to_seer = ( - "[SEER ONLY] {}, as the seer you can check one player's identity " - "tonight. Who do you want to check? Give me your reason and decision." - ) + to_seer = "[SEER ONLY] {}, as the seer you can check one player's identity " "tonight. Who do you want to check? Give me your reason and decision." to_seer_result = "[SEER ONLY] You've checked {agent_name}, and the result is: {role}." - to_hunter = ( - "[HUNTER ONLY] {name}, as the hunter you're eliminated tonight. You " - "can choose one player to take down with you. Also, you can choose " - "not to use this ability. Give me your reason and decision." - ) + to_hunter = "[HUNTER ONLY] {name}, as the hunter you're eliminated tonight. You " "can choose one player to take down with you. Also, you can choose " "not to use this ability. Give me your reason and decision." to_all_hunter_shoot = "The hunter has chosen to shoot {} down with him/herself." - to_all_day = ( - "The day is coming, all players open your eyes. Last night, " - "the following player(s) has been eliminated: {}." - ) + to_all_day = "The day is coming, all players open your eyes. Last night, " "the following player(s) has been eliminated: {}." - to_all_peace = ( - "The day is coming, all the players open your eyes. Last night is " - "peaceful, no player is eliminated." - ) + to_all_peace = "The day is coming, all the players open your eyes. Last night is " "peaceful, no player is eliminated." - to_all_discuss = ( - "Now the alive players are {names}. The game goes on, it's time to " - "discuss and vote a player to be eliminated. Now you each take turns " - "to speak once in the order of {names}." - ) + to_all_discuss = "Now the alive players are {names}. The game goes on, it's time to " "discuss and vote a player to be eliminated. Now you each take turns " "to speak once in the order of {names}." - to_all_vote = ( - "Now the discussion is over. Everyone, please vote to eliminate one " - "player from the alive players: {}." - ) + to_all_vote = "Now the discussion is over. Everyone, please vote to eliminate one " "player from the alive players: {}." to_all_res = "The voting result is {}. So {} has been voted out." - to_all_wolf_win = ( - "There are {n_alive} players alive, and {n_werewolves} of them are " - "werewolves. " - "The game is over and werewolves win🐺🎉!" - "In this game, the true roles of all players are: {true_roles}" - ) + to_all_wolf_win = "There are {n_alive} players alive, and {n_werewolves} of them are " "werewolves. " "The game is over and werewolves win🐺🎉!" "In this game, the true roles of all players are: {true_roles}" - to_all_village_win = ( - "All the werewolves have been eliminated." - "The game is over and villagers win🏘️🎉!" - "In this game, the true roles of all players are: {true_roles}" - ) + to_all_village_win = "All the werewolves have been eliminated." "The game is over and villagers win🏘️🎉!" "In this game, the true roles of all players are: {true_roles}" to_all_continue = "The game goes on." - to_all_reflect = ( - "The game is over. Now each player can reflect on their performance. " - "Note each player only has one chance to speak and the reflection is " - "only visible to themselves." - ) + to_all_reflect = "The game is over. Now each player can reflect on their performance. " "Note each player only has one chance to speak and the reflection is " "only visible to themselves." class ChinesePrompts: @@ -125,20 +63,14 @@ class ChinesePrompts: to_all_night = "天黑了,请所有人闭眼。狼人请睁眼,选择今晚要淘汰的一名玩家..." - to_wolves_discussion = ( - "[仅狼人可见] {}, 你们可以讨论并决定今晚要淘汰的玩家。当前存活玩家有:{}。" "如果达成一致,请将 `reach_agreement` 设为 True。" - ) + to_wolves_discussion = "[仅狼人可见] {}, 你们可以讨论并决定今晚要淘汰的玩家。当前存活玩家有:{}。" "如果达成一致,请将 `reach_agreement` 设为 True。" to_wolves_vote = "[仅狼人可见] 你投票要杀死哪位玩家?" to_wolves_res = "[仅狼人可见] 投票结果为 {},你们选择淘汰 {}。" to_all_witch_turn = "轮到女巫行动,女巫请睁眼并决定今晚的操作..." - to_witch_resurrect = ( - "[仅女巫可见] {witch_name},你是女巫,今晚{dead_name}被淘汰。" - "你可以用解药救他/她,注意解药全局只能用一次。你要救{dead_name}吗?" - "请给出理由和决定。" - ) + to_witch_resurrect = "[仅女巫可见] {witch_name},你是女巫,今晚{dead_name}被淘汰。" "你可以用解药救他/她,注意解药全局只能用一次。你要救{dead_name}吗?" "请给出理由和决定。" to_witch_resurrect_no = "[仅女巫可见] 女巫选择不救该玩家。" to_witch_resurrect_yes = "[仅女巫可见] 女巫选择救活该玩家。" @@ -165,9 +97,7 @@ class ChinesePrompts: to_all_res = "投票结果为 {},{} 被淘汰。" - to_all_wolf_win = ( - "当前存活玩家共{n_alive}人,其中{n_werewolves}人为狼人。" "游戏结束,狼人获胜🐺🎉!" "本局所有玩家真实身份为:{true_roles}" - ) + to_all_wolf_win = "当前存活玩家共{n_alive}人,其中{n_werewolves}人为狼人。" "游戏结束,狼人获胜🐺🎉!" "本局所有玩家真实身份为:{true_roles}" to_all_village_win = "所有狼人已被淘汰。游戏结束,村民获胜🏘️🎉!本局所有玩家真实身份为:{true_roles}" diff --git a/tutorial/example_werewolves/start.py b/tutorial/example_werewolves/start.py index 554b0977..f9d27a53 100644 --- a/tutorial/example_werewolves/start.py +++ b/tutorial/example_werewolves/start.py @@ -6,6 +6,7 @@ from typing import List import numpy as np import dotenv + dotenv.load_dotenv() from textwrap import dedent @@ -83,7 +84,6 @@ class ExampleWerewolves(Workflow): trainable_targets: List[str] | None = Field(default=["werewolf"], description="List of agents to be fine-tuned.") async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> WorkflowOutput: - # ensure trainable targets is legal assert self.trainable_targets is not None, "trainable_targets cannot be None in ExampleWerewolves (because we want to demonstrate a explicit multi-agent case)." @@ -111,17 +111,15 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl generate_kwargs={"temperature": 0.01}, ) model_for_this_agent = tuner.as_agentscope_model( - agent_name=f"Player{i + 1}", # the name of this agent - target_tag=role, # `target_tag in self.trainable_targets` means we train this agent, otherwise we do not train this agent. - debug_model=default_model, # the model used when this agent is not in `self.trainable_targets` + agent_name=f"Player{i + 1}", # the name of this agent + target_tag=role, # `target_tag in self.trainable_targets` means we train this agent, otherwise we do not train this agent. + debug_model=default_model, # the model used when this agent is not in `self.trainable_targets` ) agent = ReActAgent( name=f"Player{i + 1}", sys_prompt=get_official_agent_prompt(f"Player{i + 1}"), model=model_for_this_agent, - formatter=DashScopeMultiAgentFormatter() - if role in self.trainable_targets - else OpenAIMultiAgentFormatter(), + formatter=DashScopeMultiAgentFormatter() if role in self.trainable_targets else OpenAIMultiAgentFormatter(), max_iters=3 if role in self.trainable_targets else 5, ) # agent.set_console_output_enabled(False) @@ -132,23 +130,17 @@ async def execute(self, workflow_task: WorkflowTask, tuner: AjetTuner) -> Workfl good_guy_win = await werewolves_game(players, roles) raw_reward = 0 is_success = False - if (good_guy_win and self.trainable_targets[0] != "werewolf") or ( - not good_guy_win and self.trainable_targets[0] == "werewolf" - ): + if (good_guy_win and self.trainable_targets[0] != "werewolf") or (not good_guy_win and self.trainable_targets[0] == "werewolf"): raw_reward = 1 is_success = True logger.warning(f"Raw reward: {raw_reward}") logger.warning(f"Is success: {is_success}") except BadGuyException as e: - logger.bind(exception=True).exception( - f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent)." - ) + logger.bind(exception=True).exception(f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent).") raw_reward = -0.1 is_success = False except Exception as e: - logger.bind(exception=True).exception( - f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent)." - ) + logger.bind(exception=True).exception(f"Error during game execution. Game cannot continue, whatever the cause, let's punish trainable agents (Although they maybe innocent).") raw_reward = -0.1 is_success = False diff --git a/tutorial/example_werewolves/structured_model.py b/tutorial/example_werewolves/structured_model.py index 46390589..8e2ddb20 100644 --- a/tutorial/example_werewolves/structured_model.py +++ b/tutorial/example_werewolves/structured_model.py @@ -46,8 +46,7 @@ class WitchPoisonModel(BaseModel): ) name: Literal[tuple(_.name for _ in agents)] | None = ( # type: ignore Field( - description="The name of the player you want to poison, if you " - "don't want to poison anyone, just leave it empty", + description="The name of the player you want to poison, if you " "don't want to poison anyone, just leave it empty", default=None, ) ) @@ -79,8 +78,7 @@ class HunterModel(BaseModel): ) name: Literal[tuple(_.name for _ in agents)] | None = ( # type: ignore Field( - description="The name of the player you want to shoot, if you " - "don't want to the ability, just leave it empty", + description="The name of the player you want to shoot, if you " "don't want to the ability, just leave it empty", default=None, ) ) diff --git a/tutorial/example_werewolves/utils.py b/tutorial/example_werewolves/utils.py index c9dd0039..7261424e 100644 --- a/tutorial/example_werewolves/utils.py +++ b/tutorial/example_werewolves/utils.py @@ -140,13 +140,7 @@ def check_winning(self) -> str | None: """Check if the game is over and return the winning message.""" # Prepare true roles string - true_roles = ( - f'{names_to_str(self.role_to_names["werewolf"])} are werewolves, ' - f'{names_to_str(self.role_to_names["villager"])} are villagers, ' - f'{names_to_str(self.role_to_names["seer"])} is the seer, ' - f'{names_to_str(self.role_to_names["hunter"])} is the hunter, ' - f'and {names_to_str(self.role_to_names["witch"])} is the witch.' - ) + true_roles = f'{names_to_str(self.role_to_names["werewolf"])} are werewolves, ' f'{names_to_str(self.role_to_names["villager"])} are villagers, ' f'{names_to_str(self.role_to_names["seer"])} is the seer, ' f'{names_to_str(self.role_to_names["hunter"])} is the hunter, ' f'and {names_to_str(self.role_to_names["witch"])} is the witch.' if len(self.werewolves) * 2 >= len(self.current_alive): return Prompts.to_all_wolf_win.format(