11import os
2- from typing import Any , cast
2+ from typing import cast
33
44from mp_actors import move_to_child_process
55
6- from .. import dev
76from ..local .backend import LocalBackend
87from ..local .service import ModelService
98from ..model import TrainableModel
109from ..utils .output_dirs import get_model_dir
10+ from .renderers import get_renderer_name
1111
1212
1313class TinkerBackend (LocalBackend ):
@@ -26,38 +26,6 @@ def __init__(
2626 os .environ ["TINKER_API_KEY" ] = tinker_api_key
2727 super ().__init__ (in_process = in_process , path = path )
2828
29- async def _prepare_backend_for_training (
30- self ,
31- model : TrainableModel ,
32- config : dev .OpenAIServerConfig | None = None ,
33- ) -> tuple [str , str ]:
34- """Start the local OpenAI server and return its base URL + API key."""
35- service = await self ._get_service (model )
36- raw_config : dict [str , Any ] = cast (dict [str , Any ], config ) if config else {}
37-
38- server_args = cast (dict [str , Any ], raw_config .get ("server_args" , {}))
39- host = server_args .get ("host" , raw_config .get ("host" , "0.0.0.0" ))
40- port = server_args .get ("port" , raw_config .get ("port" ))
41- if port is None :
42- from .service import get_free_port
43-
44- port = get_free_port ()
45- api_key = server_args .get ("api_key" , raw_config .get ("api_key" )) or "default"
46-
47- # Ensure the Tinker server binds to the same host/port we return.
48- tinker_config = cast (
49- dev .OpenAIServerConfig ,
50- {
51- ** raw_config ,
52- "host" : host ,
53- "port" : port ,
54- },
55- )
56- await service .start_openai_server (config = tinker_config )
57-
58- base_url = f"http://{ host } :{ port } /v1"
59- return base_url , api_key
60-
6129 async def _get_service (self , model : TrainableModel ) -> ModelService :
6230 from ..dev .get_model_config import get_model_config
6331 from ..dev .model import TinkerArgs , TinkerTrainingClientArgs
@@ -88,52 +56,3 @@ async def _get_service(self, model: TrainableModel) -> ModelService:
8856 process_name = "tinker-service" ,
8957 )
9058 return self ._services [model .name ]
91-
92-
93- renderer_name_message = """
94- To manually specify a renderer (and silence this message), you can set the "renderer_name" field like so:
95-
96- model = art.TrainableModel(
97- name="my-model",
98- project="my-project",
99- base_model="Qwen/Qwen3-8B",
100- _internal_config=art.dev.InternalModelConfig(
101- tinker_args=art.dev.TinkerArgs(renderer_name="qwen3_disable_thinking"),
102- ),
103- )
104-
105- Valid renderer names are:
106-
107- - llama3
108- - qwen3
109- - qwen3_disable_thinking
110- - qwen3_instruct
111- - deepseekv3
112- - deepseekv3_disable_thinking
113- - gpt_oss_no_sysprompt
114- - gpt_oss_low_reasoning
115- - gpt_oss_medium_reasoning
116- - gpt_oss_high_reasoning
117- """ .strip ()
118-
119-
120- def get_renderer_name (base_model : str ) -> str :
121- if base_model .startswith ("meta-llama/" ):
122- return "llama3"
123- elif base_model .startswith ("Qwen/Qwen3-" ):
124- if "Instruct" in base_model :
125- return "qwen3_instruct"
126- else :
127- print ("Defaulting to Qwen3 renderer without thinking for" , base_model )
128- print (renderer_name_message )
129- return "qwen3_disable_thinking"
130- elif base_model .startswith ("deepseek-ai/DeepSeek-V3" ):
131- print ("Defaulting to DeepSeekV3 renderer without thinking for" , base_model )
132- print (renderer_name_message )
133- return "deepseekv3_disable_thinking"
134- elif base_model .startswith ("openai/gpt-oss" ):
135- print ("Defaulting to GPT-OSS renderer without system prompt for" , base_model )
136- print (renderer_name_message )
137- return "gpt_oss_no_sysprompt"
138- else :
139- raise ValueError (f"Unknown base model: { base_model } " )
0 commit comments